多场景项目之指标计算

1、数据指标

  • 数据指标概念:可将某个事件量化,且可形成数字,来衡量目标。

  • 数据指标的作用:当我们确定下来一套指标,就可以用指标来衡量业务,判断业务好坏

1.1 常用业务指标

活跃用户指标:一个产品是否成功,如果只看一个指标,那么这个指标一定是活跃用户数

  • 日活(DAU):一天内日均活跃设备数

  • 月活(MAU):一个月内的活跃设备数

  • 周活跃数(WAU):一周内活跃设备数

  • 活跃度(DAU/MAU):体现用户的总体粘度,衡量期间内每日活跃用户的交叉重合情况

新增用户指标:主要是衡量营销推广渠道效果的最基础指标

  • 日新增注册用户量:统计一天内,即指安装应用后,注册APP的用户数。

  • 周新增注册用户量:统计一周内,即指安装应用后,注册APP的用户数。

  • 月新增注册用户量:统计一月内,即指安装应用后,注册APP的用户数。

  • 注册转化率:从点击广告/下载应用到注册用户的转化。

  • DNU占比:新增用户占活跃用户的比例,可以用来衡量产品健康度

    • 新用户占比活跃用户过高,那说明该APP的活跃是靠推广得来

留存指标:是验证APP对用户吸引力的重要指标。通常可以利用用户留存率与竞品进行对比,衡量APP对用户的吸引力

  • 次日留存率:某一统计时段新增用户在第二天再次启动应用的比例

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

行为指标

  • PV(访问次数,Page View):一定时间内某个页面的浏览次数,用户每打开一个网页可以看作一个PV。

  • UV(访问人数,Unique Visitor):一定时间内访问某个页面的人数。

  • 转化率:计算方法与具体业务场景有关

    • 淘宝店铺,转化率=购买产品的人数/所有到达店铺的人数

    • 在广告业务中,广告转化率=点击广告进入推广网站的人数/看到广告的人数。

  • 转发率:转发率=转发某功能的用户数/看到该功能的用户数

产品数据指标

  • GMV (Gross Merchandise Volume):指成交总额,也就是零售业说的“流水”

  • 人均付费=总收入/总用户数

    • 人均付费在游戏行业叫ARPU(Average Revenue Per User)

    • 电商行业叫客单价

  • 付费用户人均付费(ARPPU,Average Revenue Per Paying User)=总收入/付费人数,这个指标用于统计付费用户的平均收入

  • 付费率=付费人数/总用户数。付费率能反映产品的变现能力和用户质量

  • 复购率是指重复购买频率,用于反映用户的付费频率。

  • 推广付费指标

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

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

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

      • CPD(Cost Per Download):按App的下载数付费;

      • CPI(Cost Per Install):按安装App的数量付费,也就是下载后有多少人安装了App;

      • CPS(Cost Per Sales):按完成购买的用户数或者销售额来付费。

  • 不同的业务可能关心的指标不尽相同

1.2 选择指标

  • 好的数据指标应该是比例

  • 根据目前的业务重点,找到北极星指标

    • 在实际业务中,北极星指标一旦确定,可以像天空中的北极星一样,指引着全公司向着同一个方向努力

2、指标计算案例

数据包含如下字段

Invoice: 发票号码

StockCode: 商品编码

Description: 商品简介

InvoiceDate: 发票日期

Price: 商品单价

Customer ID: 用户ID

Country: 用户所在国家

计算的指标

  • 月销售金额(月GMV)

  • 月销售额环比

  • 月销量

  • 新用户占比: 新老用户

  • 激活率

  • 月留存率

2.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')

2.2 数据清洗

# 数据清洗
retail_data['购买时间'].describe()
retail_data.describe()

# 整理数据,将后续用不到的字段Country去掉, 
retail_data = data[['Invoice', 'StockCode', 'Description', 'Quantity', 'InvoiceDate','Price', 'Customer ID']]
retail_data.columns = ['订单编号','商品编号','商品描述','购买数量','购买时间','商品单价','用户ID']


# 把购买数量<0和商品单价<0的订单删除
retail_data_clean = retail_data.query('购买数量>0 & 商品单价 >0')

2.3 计算月销量指标

# # 计算月交易额(月GMV)
# 添加一个字段,用来表示交易的月份:  
retail_data_clean['购买年月']=retail_data_clean['购买时间'].astype('datetime64[M]')

# 用单价*数量计算每条交易记录的交易金额,然后按照月份分组,计算每月的总收入
retail_data_clean['金额']=retail_data_clean['商品单价']*retail_data_clean['购买数量']

# 将每笔交易按照购买年月进行分组, 计算每月的总交易金额(月GMV) 
gmv_m=retail_data_clean.groupby(['购买年月'])['金额'].sum().reset_index()

# 使用pandas, 对结果做可视化
plt.rcParams['font.sans-serif'] = ['SimHei']# 解决中文显示问题
x_label = gmv_m.购买年月.astype(str).to_list() # 使用购买年月的数据作为X轴显示的标签 
plt.figure(figsize=(16,6))# 设置画布大小
gmv_m['金额'].plot() # 对金额列绘制折线图
plt.xticks(range(0,25),x_label,rotation=45) # 设置X轴标签, 参数1 当前的标签(从0开始的数字) 参数2 要替换的标签, 参数3 rotation 标签字体旋转45度
plt.grid(True) # 显示网格线

# 计算月销售额环比
#pct_change 计算环比
gmv_m['月销售额环比']=gmv_m['金额'].pct_change()

# 绘制图形,可视化月销售额环比数据
plt.figure(figsize=(16,6))
gmv_m['月销售额环比'].plot()
plt.xticks(range(0,25),x_label,rotation=45)
plt.grid(True)

2.4 月均活跃用户分析

数据中只有购买记录,没有其它记录,所以我们用购买行为来定义活跃

# 月均活跃用户分析
# 购买行为来定义活跃
retail_data_clean.dropna(subset=['用户ID'],inplace=True)
mau=retail_data_clean.groupby('购买年月')['用户ID'].nunique().reset_index()

mau.columns=['购买年月','用户数']

# Pandas绘图展示月活变化情况
plt.figure(figsize=(16,6))
mau['用户数'].plot(kind='bar')
plt.xticks(range(0,25),x_label,rotation=45)
plt.grid(True)

2.5 月客单价(活跃用户平均消费金额)

客单价 = 月GMV/月活跃用户数

# 月课单价(活跃用户平均消费金额)
# 客单价 = 月GMV/月活跃用户数
final=mau.merge(gmv_m,on='购买年月')
final['客单价']=final['金额']/final['用户数']

# 可视化
plt.figure(figsize=(16,6))
final['客单价'].plot()
plt.xticks(range(0,25),x_label,rotation=45)
plt.grid(True)

2.6 新用户占比

根据用户最近一次购买和第一次购买时间的差异,如果相同,则认为是新用户,否则老用户

# 新用户占比
# 找到每个用户第一次购买的日期,区分新老用户
#按照用户ID分组,找到每个用户购买时间的最小值
retail=retail_data_clean.groupby('用户ID').购买时间.min().reset_index()

#重命名列名
retail.columns=['用户ID','首次购买时间']
# 创建新的字段,首次购买年月
retail['首次购买年月']=retail['首次购买时间'].astype('datetime64[M]')
retail

# 将首次购买日期的数据与原始数据合并
retail_data_clean=pd.merge(retail_data_clean,retail,on='用户ID')
retail_data_clean

# 创建`用户类型`字段来区分新老用户
retail_data_clean['用户类型']='新用户'
# 把满足条件的行, 对应的用户类型列 改成  老用户
retail_data_clean.loc[retail_data_clean['购买年月']>retail_data_clean['首次购买年月'],'用户类型']='老用户'

retail_data_clean.用户类型.value_counts()

# 接下来我们统计新用户和老用户的销售额
revenue=retail_data_clean.groupby(['购买年月','用户类型'])['金额'].sum().reset_index()

# 由于2009年12月和2011年12月的数据不全,我们不处理这两部分数据
revenue=revenue.query("购买年月 !='2009-12-01' and 购买年月 !='2011-12-01'")

# 可视化, 这里我们需要把新老用户的购买情况都绘制到一张图表中
plt.figure(figsize=(16,6))
revenue[revenue['用户类型']=='新用户']['金额'].plot()
revenue[revenue['用户类型']=='老用户']['金额'].plot()
plt.xticks(range(0,25),x_label,rotation=45)
plt.grid(True)

# 新用户占比= 每月新用户/每月有购买的总用户数
# 按月统计新用户数量
user_ratio=retail_data_clean.query("用户类型=='新用户'").groupby(['购买年月'])['用户ID'].nunique().reset_index()

user_ratio.columns=['购买年月','新用户数']
# 按月统计有购买的用户数量
user_ratio['总用户数']=retail_data_clean.groupby(['购买年月'])['用户ID'].nunique().values
# 计算新用户占比
user_ratio['新用户占比']=user_ratio['新用户数']/user_ratio['总用户数']
 # 数据切片, 截取2011-01 以后的数据
user_ratio[13:-1]


# 数据可视化
# 截取2011-01-01以后的数据
plot_data=user_ratio[13:-1]
# 将购买年月转换成字符串之后作为行索引
plot_data.index=plot_data['购买年月'].astype(str).to_list()
plt.figure(figsize=(16,6))
plot_data['新用户占比'].plot(kind='bar')
plt.grid(True)

 2.7 激活率计算

  • 用户激活的概念:用户激活不等同于用户注册了账号/登录了APP,不同类型产品的用户激活定义各有差别

  • 总体来说,用户激活是指用户一定时间内在产品中完成一定次数的关键行为

# 激活率计算
retail=pd.read_csv('data/retail_user_data.csv')

# 首次购买年月, 注册年月,安装年月字段包含了具体时刻信息, 我们把时刻数据去掉
retail['首次购买年月']=retail['首次购买年月'].astype('datetime64[M]')
retail['注册年月']=retail['注册年月'].astype('datetime64[M]')
retail['安装年月']=retail['安装年月'].astype('datetime64[M]')


# 统计注册时间和首次购买时间都在同一个月份的用户数量,我们把这类用户作为激活用户
# 统计每月激活用户数量
activation_count=retail[retail['首次购买年月']==retail['注册年月']].groupby('注册年月')['用户ID'].count()
# 统计每月注册的用户数
regist_count = retail.groupby('注册年月')['用户ID'].count()

# 计算激活率 = 每月激活用户/每月注册用户数
retail_activation=activation_count/regist_count
retail_activation=retail_activation.reset_index()


# 可视化
plot_data=retail_activation[1:-1].reset_index()
plt.figure(figsize=(16,6))
plot_data['用户ID'].plot(kind='bar')
x_label=plot_data['注册年月'].astype(str).to_list()
plt.xticks(plot_data.index,x_label,rotation=45)
plt.grid(True)

#按渠道统计每月不同渠道的激活用户数
activation_count=retail[retail['首次购买年月']==retail['注册年月']].groupby(['注册年月','渠道'])['用户ID'].count()

#按渠道统计每月注册用户数
regist_count=retail.groupby(['注册年月','渠道'])['用户ID'].count()

#计算不同渠道激活率
activation_ratio = activation_count/regist_count
activation_ratio = activation_ratio.reset_index()
activation_ratio

# 提取各渠道2010年的激活数据用于可视化
data_wechat=activation_ratio.query("注册年月>20091201 and 注册年月<20110101 and 渠道=='微信'").reset_index()
data_baidu=activation_ratio.query("注册年月>20191201 and 注册年月<20110101 and 渠道=='百度'").reset_index()
data_tiktok=activation_ratio.query("注册年月>20191201 and 注册年月<20110101 and 渠道=='抖音'").reset_index()

# 渠道激活率可视化
plt.figure(figsize=(16,6))
data_wechat['用户ID'].plot() #微信渠道
data_baidu['用户ID'].plot() #百度渠道
data_tiktok['用户ID'].plot() #抖音渠道
#获取年月信息作为行标签
x_label=data_tiktok['注册年月'].astype(str).to_list()
plt.xticks(data_wechat.index,x_label,rotation=45) # 设置x轴标签
plt.grid(True)

2.8 月留存率

月留存率 = 当月与上月都有购买的用户数/上月购买的用户数

# 月留存率 = 当月与上月都有购买的用户数/上月购买的用户数
# 统计每月用户购买情况
user_purchase=retail_data_clean.groupby(['用户ID','购买年月'])['购买数量'].sum().reset_index()

#创建透视表,有购买的月份对购买数量求和, 没有购买的月份补0
user_retention=user_purchase.pivot_table(index='用户ID',columns='购买年月',values='购买数量').fillna(0)

# 2011年12月的数据不全所以2011年11月的数据无法准确计算
months=user_retention.columns[1:-1]

# 计算每个月的月留存率
retention_list=[]
for i in range(len(months)-1):
    retention_={}
    # 当前月份
    selected_mon=months[i]
    # 下一个月份
    next_mon=months[i+1]
    # 创建一列,用来记录当前的月份
    retention_['购买年月']=selected_mon
    # 前一个月有购买的用户数量
    retention_['总用户数']=sum(user_retention[selected_mon]>0)
    # 当前月和前一个月都有购买的用户数量
    retention_['留存用户数']=user_retention[(user_retention[selected_mon]>0)&(user_retention[next_mon]>0)][selected_mon].count()
    #把数据保存到list当中
    retention_list.append(retention_)


#把list中的数据转变成 dataframe 并计算留存率
monthly_retention=pd.DataFrame(retention_list)
monthly_retention['留存率']=monthly_retention['留存用户数']/monthly_retention['总用户数']

# 可视化
plt.figure(figsize=(16,6))
monthly_retention['留存率'].plot()
x_label = monthly_retention['购买年月'].astype(str).to_list()
plt.xticks(monthly_retention.index, x_label,rotation=45)
plt.grid(True)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值