2021-09-14指标计算

本文介绍了数据指标的重要性,包括活跃用户、新增用户、留存率等常见业务指标的定义和作用,并通过实例讲解如何使用Pandas计算月交易额(GMV)、月销售额环比、月均活跃用户、月客单价、新用户占比、激活率和月留存率。文章强调了选择合适数据指标对业务评估和决策的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

指标计算

学习目标
  • 掌握数据指标的概念
  • 知道常见的业务指标含义
  • 掌握常用数据指标计算方法

​ 在之前的课程中,我们学习了Excel, Tableau, SQL, Python, 机器学习,它们都属于数据分析要用到的工具,接下来我们就要结合业务场景,综合运用这些工具,来完成一些具体任务。

​ 数据分析/大数据分析的目的是为了用数据驱动运营,用数据驱动业务增长(数据驱动设计,数据驱动决策,数据驱动XXX……),我们之前也提到过数据分析的几个层次,描述性分析→诊断性分析→预测分析→规范分析。

要做到数据驱动,最基本的层次就是描述性分析,也就是用数据来记录企业的业务状况,用数据记录每天实际发生的事实。在这个阶段,我们需要建立一套数据指标来描述我们的业务,并使用这一套指标建立相关的报表(日报,周报,月报),有了这一套指标,我们就可以监控每天业务运行的情况,方便及时发现问题

一 数据指标简介

1、什么是数据指标
  • 数据指标概念:可将某个事件量化,且可形成数字,来衡量目标。
  • 数据指标的作用:当我们确定下来一套指标,就可以用指标来衡量业务,判断业务好坏
    • 最近的业务不错,昨天注册了一万多人 XX月XX日 新注册用户9820人,超过目标820人
    • 最近用户很多对我们的产品不满意 XX月XX日 某产品日退货85件 ,累计30天退货率10%
2、常用的业务指标
  • 活跃用户指标:一个产品是否成功,如果只看一个指标,那么这个指标一定是活跃用户数

    • 日活(DAU):一天内日均活跃设备数(去重,有的公司启动过APP就算活跃,有的必须登录账户才算活跃)
    • 月活(MAU):一个月内的活跃设备数(去重,一般用月活来衡量APP用户规模)。
    • 周活跃数(WAU):一周内活跃设备数(去重)
    • 活跃度(DAU/MAU):体现用户的总体粘度,衡量期间内每日活跃用户的交叉重合情况
  • 新增用户指标:主要是衡量营销推广渠道效果的最基础指标

    • 日新增注册用户量:统计一天内,即指安装应用后,注册APP的用户数。
    • 周新增注册用户量:统计一周内,即指安装应用后,注册APP的用户数。
    • 月新增注册用户量:统计一月内,即指安装应用后,注册APP的用户数。
    • 注册转化率:从点击广告/下载应用到注册用户的转化。
    • DNU占比:新增用户占活跃用户的比例,可以用来衡量产品健康度
      • 新用户占比活跃用户过高,那说明该APP的活跃是靠推广得来
  • 留存指标:是验证APP对用户吸引力的重要指标。通常可以利用用户留存率与竞品进行对比,衡量APP对用户的吸引力

    • 次日留存率:某一统计时段新增用户在第二天再次启动应用的比例
    • 7日留存率:某一统计时段新增用户数在第7天再次启动该应用的比例,14日和30日留存率以此类推
  • 行为指标

    • PV(访问次数,Page View):一定时间内某个页面的浏览次数,用户每打开一个网页可以看作一个PV。
      • 某一个网页1天中被打开10次,那么PV为10。
    • UV(访问人数,Unique Visitor):一定时间内访问某个页面的人数。
      • 某一个网页1天中被1个人打开过10次,那么UV是1。
      • 通过比较PV或者UV的大小,可以看到用户喜欢产品的哪个功能,不喜欢哪个功能,从而根据用户行为来优化产品
    • 转化率:计算方法与具体业务场景有关
      • 淘宝店铺,转化率=购买产品的人数/所有到达店铺的人数
        • “双11”当天,有100个用户看到了你店铺的推广信息,被吸引进入店铺,最后有10个人购买了店铺里的东西,那么转化率=10(购买产品的人数)/100(到店铺的人数)=10%。
      • 在广告业务中,广告转化率=点击广告进入推广网站的人数/看到广告的人数。
        • 例如经常使用百度,搜索结果里会有广告,如果有100个人看到了广告,其中有10个人点击广告进入推广网站,那么转化率=10(点击广告进入推广网站的人数)/100(看到广告的人数)=10%
    • 转发率:转发率=转发某功能的用户数/看到该功能的用户数
      • 现在很多产品为了实现“病毒式”推广都有转发功能
      • 公众号推送一篇文章给10万用户,转发这篇文章的用户数是1万,那么转发率=1万(转发这篇文章的用户数)/10万(看到这篇文章的用户数)=10%
  • 产品数据指标

    • GMV (Gross Merchandise Volume):指成交总额,也就是零售业说的“流水”
      • 需要注意的是,成交总额包括销售额、取消订单金额、拒收订单金额和退货订单金额。
      • 成交数量对于电商产品就是下单的产品数量,下单就算
    • 人均付费=总收入/总用户数
      • 人均付费在游戏行业叫ARPU(Average Revenue Per User)
      • 电商行业叫客单价
    • 付费用户人均付费(ARPPU,Average Revenue Per Paying User)=总收入/付费人数,这个指标用于统计付费用户的平均收入
    • 付费率=付费人数/总用户数。付费率能反映产品的变现能力和用户质量
      • 例如,某App产品有100万注册用户,其中10万用户有过消费,那么该产品的付费率=付费人数(10万)/总用户数(100万)=10%。
    • 复购率是指重复购买频率,用于反映用户的付费频率。
      • 复购率指一定时间内,消费两次以上的用户数/付费人数
  • 推广付费指标

    • CPM(Cost Per Mille) :展现成本,或者叫千人展现成本

      • 广告每展现给一千个人所需花费的成本。按CPM计费模式的广告,只看展现量,按展现量收费,不管点击、下载、注册。一般情况下,APP启动开屏,视频贴片、门户banner等非常优质的广告位通常采用CPM收费模式。

      img

    • CPC(Cost Per Click) 点击成本,即每产生一次点击所花费的成本

      • 典型的按点击收费的模式就是搜索引擎的竞价排名,如谷歌、百度、360、搜狗的竞价排名。在CPC的收费模式下,不管广告展现了多少次,只要不产生点击,广告主是不用付费的。只有产生了点击,广告主才按点击数量进行付费

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5eWvFlgv-1631597510767)(img\cpc.png)]

    • 按投放的实际效果付费(CPA,Cost Per Action)包括:

      • CPD(Cost Per Download):按App的下载数付费;
      • CPI(Cost Per Install):按安装App的数量付费,也就是下载后有多少人安装了App;
      • CPS(Cost Per Sales):按完成购买的用户数或者销售额来付费。
  • 不同的业务可能关心的指标不尽相同

3、 如何选择指标
  • 好的数据指标应该是比例
    • 公众号打开次日文章用户数(活跃用户数)是1万,让你分析公众号是否有问题。这其实是看不出什么的
    • 总粉丝量是10万,那么可以计算出次日活跃率=1万(活跃用户数)/10万(总用户数)=10%
    • 和行业平均活跃率(公众号的平均活跃率是5%)比较,会发现这个公众号活跃率很高。
  • 根据目前的业务重点,找到北极星指标
    • 在实际业务中,北极星指标一旦确定,可以像天空中的北极星一样,指引着全公司向着同一个方向努力
    • 根据目前的业务重点寻找北极星指标:
      • 北极星指标没有唯一标准。不同的公司关注的业务重点不一样
      • 同一家公司在不同的发展阶段,业务重点也不一样
      • airbnb爱彼迎

二 Pandas指标计算

接下来我们将使用在线零售的流水数据计算相关指标, 首先我们来了解一下要用到的数据:

  • 数据中包含了某电商网站从2009年12月到2011年12月两年间的销售流水, 每条记录代表了一条交易记录, 包含如下字段

    Invoice: 发票号码

    StockCode: 商品编码

    Description: 商品简介

    InvoiceDate: 发票日期

    Price: 商品单价

    Customer ID: 用户ID

    Country: 用户所在国家

我们将要计算如下指标:

  • 月销售金额(月GMV) : 对流水数据按月分组, 将每个月的每笔交易汇总, 对销售金额求和

    • 对于零售业务而言, 总销售金额是最重要的指标, 我们称之为北极星指标
    • GMV(全称Gross Merchandise Volume),即商品交易总额,多用于电商行业,一般包含拍下未支付订单金额。
  • 月销售额环比:当前月销售金额/上一个月的销售金额 * 100%

    月销售额环比发生波动剧烈时,为了找到具体原因我们进一步将核心的月销量指标拆解:

    月销量 = 月均活跃用户数 * 月均用户消费金额

为了衡量当前业务的健康程度, 我们还会计算如下指标

  • 新用户占比: 新老用户
  • 激活率
  • 月留存率

北极星指标是最能体现您的产品为客户提供的核心价值的单一指标。该指标取决于我们产品、定位、目标等。

  • Airbnb 的 North Star Metric 是预订夜数,而对于 Facebook,它是每日活跃用户。
  • 接下来我们使用在线零售的示例数据集。 对于在线零售,我们选择每月收入**(月GMV)** 作为北极星指标
1、 导入模块&加载数据
from datetime import datetime, timedelta
import pandas as pd
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns

data_1 = pd.read_excel('data/online_retail_II.xlsx',sheet_name='Year 2009-2010')
data_2 = pd.read_excel('data/online_retail_II.xlsx',sheet_name='Year 2010-2011')

数据在Excel文件中, 分别保存在两个不同的Sheet中, 分别记录了2009-2010年和2010-2011的销售记录, 接下来我们将它们合并到一个DataFrame中

data = pd.concat([data_1,data_2],ignore_index=True)
data.head()
data.info()
  • 从数据中看出 ,一共有1067371 条数据,记录了交易的相关信息,与后续指标计算相关的字段

    • CustomerID 用户ID
    • UnitPrice 商品单价
    • Quantity 商品购买数量
    • InvoiceDate 购买日期

    利用上面的字段我们先计算我们的北极星指标,月收入

2、 数据清洗

整理数据,将后续用不到的字段Country去掉, 为了方便大家对代码的理解把列名换为中文

retail_data = data[['Invoice', 'StockCode', 'Description', 'Quantity', 'InvoiceDate','Price', 'Customer ID']]
retail_data.columns = ['订单编号','商品编号','商品描述','购买数量','购买时间','商品单价','用户ID']
retail_data.head()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nfkv5tmC-1631597510769)(img\metrics3.png)]

retail_data['购买时间'].describe()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tRxhq1Er-1631597510770)(img\metrics30.png)]

可以看出,我们的数据从2009年12月到2011年12月

# 查看数据分布情况
retail_data.describe()
  • 发现购买数量和商品单价最小值均小于零, 我们在计算GMV之类的指标时都不统计退货,所以需要处理这部分数据

    retail_data.query('购买数量<0')
    

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sQK2IaTm-1631597510772)(img\metrics5.png)]

  • 通过dataframe 的query API查询 购买数量<0 和 商品单价<0的订单
  • 购买数量< 0 订单的发票号码都是以C开头, 属于有退货的订单
retail_data.query('商品单价<0')

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZasPsWkk-1631597510773)(img\metrics6.png)]

  • price小于零的是坏账调整,我们把购买数量<0和商品单价<0的订单删除
retail_data_clean = retail_data.query('购买数量>0 & 商品单价 >0'
<think>嗯,用户现在想优化他们的Python代码,让每个标量数据分开绘制图像。原来的代码把所有标量都画在一个图上,这样可能会显得很乱,尤其是不同指标的量纲不同的时候,比如损失和准确率在一起,图就会很难看。用户的需求应该是希望每个指标单独显示,方便查看和分析。 首先,我需要看看用户原来的代码结构。他们用了TensorBoard的事件累积器来加载日志文件,然后获取所有的标量标签,遍历每个标签,把数据取出来,然后在一个图上绘制所有曲线。问题在于所有的曲线都叠加在一起,导致可读性差。 接下来,我需要考虑如何修改代码,让每个标签生成单独的图表。可能的解决方案是为每个标签创建一个新的figure,或者在一个figure里使用子图。如果用户想要每个图单独显示,可能需要用plt.figure()每次生成新窗口,或者用子图的方式排列在一起。 另外,用户可能希望保持代码的结构清晰,所以可能需要将绘图部分封装成一个循环,每个标签循环时生成新图。同时,可能需要注意图表的布局、标题、标签等信息的设置,确保每个图都有正确的标注。 还要考虑图像的大小,如果每个图都单独显示,可能需要调整每个figure的尺寸,或者使用子图来合理布局。比如使用plt.subplots来创建多个子图,每个子图对应一个标签。不过如果标签数量较多,子图可能会太多,导致每个图变小,这时候分开保存为多个文件可能更合适。 另外,用户可能没有提到是否需要保存图像到文件,但考虑到实际使用中可能需要保存,可以建议将每个图保存为单独的图片文件,比如PNG格式,方便后续查看或报告中使用。 还要检查代码中是否有冗余部分,比如多次调用ea.Scalars(tag),是否需要缓存数据。不过从原代码来看,每次循环都重新获取events,这在数据量不大时问题不大,但如果有性能问题,可能需要优化。 最后,需要确保代码的可读性,添加必要的注释,解释每一步的操作,这样用户更容易理解修改后的代码结构。</think>### 优化方案:分开展示每个标量的折线图 #### 原始问题分析 原代码将所有标量(如loss、accuracy等)绘制在同一张图中,当不同标量量纲差异大时(如损失值0-1 vs 学习率1e-5),会导致可视化效果混乱。优化后为每个标量单独生成图像。 --- ### 优化后代码(逐步说明) #### 1. 基础配置 ```python import matplotlib.pyplot as plt from tensorboard.backend.event_processing import event_accumulator # 指定事件文件路径(注意Windows路径需双反斜杠) log_dir = r"E:\python_project\RFNNest_2021\runs\train_03-09_19-31\logs_Gray_epoch=4\events.out.tfevents.1741519909.PC-20211126ZXQD" ``` #### 2. 加载数据 ```python # 初始化事件解析器 ea = event_accumulator.EventAccumulator(log_dir) ea.Reload() # 强制加载所有数据 # 获取所有标量标签(例如:'train_loss', 'val_accuracy'等) tags = ea.Tags()['scalars'] ``` #### 3. 分图绘制核心逻辑 ```python # 方法一:逐个显示图像(适合交互式查看) for tag in tags: # 创建独立画布(figsize可自定义) plt.figure(figsize=(10, 5)) # 提取数据 events = ea.Scalars(tag) steps = [e.step for e in events] values = [e.value for e in events] # 绘制当前标量 plt.plot(steps, values, 'b-', linewidth=2, marker='o', markersize=5) # 定制化标题和标签(使用$$包裹可显示LaTeX公式) plt.title(f"{tag} Curve", fontsize=14) plt.xlabel("Training Steps", fontsize=12) plt.ylabel(tag.capitalize(), fontsize=12) # 自动大写首字母 # 添加网格和布局优化 plt.grid(True, linestyle='--', alpha=0.7) plt.tight_layout() # 自动调整子图间距 # 统一显示所有图像 plt.show() ``` --- ### 进阶优化(推荐) #### 方法二:子图矩阵布局(适合对比分析) ```python # 计算子图行列数(例如:4个标量可排列为2x2) import math num_tags = len(tags) rows = math.ceil(math.sqrt(num_tags)) cols = math.ceil(num_tags / rows) # 创建子图画布 fig, axes = plt.subplots(rows, cols, figsize=(cols*6, rows*4)) # 扁平化处理以便遍历 axes = axes.flatten() if num_tags > 1 else [axes] # 遍历绘制每个子图 for idx, (ax, tag) in enumerate(zip(axes, tags)): events = ea.Scalars(tag) steps = [e.step for e in events] values = [e.value for e in events] ax.plot(steps, values, color='#FF6F61', linewidth=1.5, marker='s') ax.set_title(tag, fontsize=12) ax.set_xlabel("Steps", fontsize=10) ax.grid(True, linestyle=':') # 隐藏多余子图 for ax in axes[len(tags):]: ax.axis('off') plt.tight_layout() plt.show() ``` --- ### 方法三:自动保存为图片文件 ```python output_dir = "./visualization/" # 自定义输出路径 import os os.makedirs(output_dir, exist_ok=True) for tag in tags: plt.figure(figsize=(10, 5)) # ...(绘制代码同上)... plt.savefig(f"{output_dir}/{tag}.png", dpi=300, bbox_inches='tight') plt.close() # 显式关闭图像释放内存 ``` --- ### 关键优化点总结 | 优化方向 | 实现方式 | 优势说明 | |--------------------|-----------------------------------|------------------------------| | **图像独立性** | 每个标量使用独立`plt.figure()` | 避免曲线叠加,提升可读性 | | **布局自动化** | `plt.tight_layout()`自动调整间距 | 防止标签重叠 | | **样式统一化** | 统一设置字体/线宽/颜色/标记 | 提升图像专业度 | | **资源管理** | 绘制后调用`plt.close()` | 减少内存占用 | | **错误处理增强** | 添加`try-except`块(可根据需要补充)| 防止单个标量解析失败导致中断 | --- ### 扩展建议 1. **动态Y轴范围**:对于波动剧烈的标量(如梯度值),可添加以下代码自动适配范围: ```python y_min = min(values) * 0.9 y_max = max(values) * 1.1 plt.ylim(y_min, y_max) ``` 2. **添加移动平均线**(平滑曲线): ```python window_size = 5 moving_avg = np.convolve(values, np.ones(window_size)/window_size, mode='valid') plt.plot(steps[window_size-1:], moving_avg, 'r--', label='MA') ``` 3. **多文件对比**:如果需要比较不同训练日志,可使用字典存储多个`EventAccumulator`对象,在循环中叠加绘制不同颜色的曲线。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值