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)