一、好的指标应该有哪些特征?
有一个核心指标,和公司的战略目标保持一致;
好的指标应该是比率;
好的指标应该能带来显著效果;
好的指标不应该是虚荣指标(指表面看起来不错但实际上无法落地)
好的指标不应该复杂
二、常见的指标
1.市场营销指标
- 客户/用户生命周期:潜在客户、兴趣客户、新客户、老客户、流失客户及回流客户
- 用户价值:用户为企业贡献的价值,通过指数或四则运算对指标进行组合2.产品运营指标AARRR模型(用户获取Acquisition、用户活跃Activation、用户留存Retention、用户营收Revenue、用户传播Refer)
- 用户获取:a. 渠道达到量(曝光量)b. 渠道转化率:用多少用户因为曝光而心动,包含CPM(按千次计费)、CPC(按点击)、CPS(按销售)、CPD(按下载)、CPT(按时间)c. ROI(投资回报率):利润/成本d. 用户下载数:app的下载量(比较难获取,如使用APP Store我们很难获取下载量,只能获取通过微信点开下载页面的人数)e. 日新增用户数:以提交注册为基准;f. 获客成本:为获取一名顾客所需要支付的费用g.一次会话用户数占比:(可能是机器人刷粉)指新用户下载完APP,仅打开过一次,且使用时长在2分钟内
- 用户活跃a. 活跃用户占比:衡量产品健康程度b. 用户会话session次数:用户打开产品操作和使用直至退出产品的整个周期(5分钟内没有操作,默认会话操作结束)c.用户访问时长:一次会话的持续时间d.用户访问次数:一段时间内的用户平均产生会话次数;
- 用户留存:一周留存率/次日留存率。根据实际业务设置时间段。
- 用户营收a. 付费用户数b. 付费用户数占比c. APPU:某时间段内每位用户的平均收入d. ARPPU:某时间段内每位付费用户平均收入,排除了未付费的用户e. 客单价:每一位用户平均购买商品的金额(销售总额 / 顾客总数),和ARPPU的区别在于没有时间段的限制f. LTV:用户生命周期价值,适用于用户生命周期短频快的业务,如游戏。经验计算公式:LTV=APPU*1/流失率。
- 传播a. k因子,指一个用户能够带来几个新用户b. 用户分享率,分享分数占总浏览人数的比例3.用户行为指标
- 功能使用:功能使用率,使用某些功能的用户数占总用户数的比例;
- 用户会话:用户打开产品操作和使用直至退出产品的一次操作,一般在网页端超过30分钟啥也不干视作一次新的会话。4.电子商务指标
- 笔单价:营业额/订单数
- 件单价:平均每件商品的价格
三、数据分析Python实战
1.数据源购买CD的用户id、日期、数量和金额。
2.数据预处理
df['order_dt'] = pd.to_datetime(df.order_dt, format='%Y%m%d')df['month'] = df.order_dt.astype('datetime64[M]')
3.整体数据特征分析
- 按月进行分组查询每月的销售量。与sql中的group by相似,df数据类型也有groupby函数。同样按照先分组再聚合的思路来分析。
grouped_month = df.groupby(by = ['month'])order_month_amount = grouped_month.order_amount.sum()# 使用可视化import matplotlib.pyplot as plt# 可视化在网页上,而不用使用plt.show()%matplotlib inline# 更改作图风格plt.style.use('ggplot')order_month_amount.plot()
- 同理查看每月的订单数和销售总数量,以及每月份不同的购买人数
# 求每个月的订单数grouped_month.user_id.count().plot()# 求每个月的订单数grouped_month.user_id.count().plot()# 求每月份的不同购买人数(要对分组后的序列进行去重)grouped_month.user_id.apply(lambda x: len(x.drop_duplicates())).plot()
重点学会apply函数的使用,以及去重函数
# 练习使用数据透视表完成上述操作df.pivot_table(index='month',values=['order_products','order_amount','user_id'], aggfunc = {'order_products':'sum', 'order_amount':'sum', 'user_id':'count'}).head()
数据透视表的index和column可以理解为groupby的字段,按照两个字段进行分组,values表示聚合的值
- 求每个用户的平均消费次数思路:总订单数/不同的消费人数
distinct_user = grouped_month.user_id.apply(lambda x: len(x.drop_duplicates()))avg_order_quantity = grouped_month.user_id.count()/distinct_useravg_order_quantity.plot()
3.用户个体消费分析
grouped_user = df.groupby('user_id')grouped_user.sum().describe()
grouped_user.sum().plot.scatter(x='order_amount',y = 'order_products')
将一些比较离群点进行剔除,使用query函数(相当于sql中的where)
grouped_user.sum().query('order_amount < 4000').plot.scatter(x='order_amount',y = 'order_products')
# 使用切比雪夫定理:95%的数据分布在平均数5个标准差内,求出上界。如order_products: 92grouped_user.sum().query('order_products < 92').order_products.hist(bins=40)
grouped_user.sum().sort_values('order_amount').apply(lambda x: x.cumsum()/ x.sum())
4.用户行为分析
# 查看用户第一次购买的日期grouped_user.min().order_dt.value_counts().plot()
grouped_user.max().order_dt.value_counts().plot()
第一次购买和最后一次购买都集中在前三个月,说明很多用户都是一次性消费
user_life = grouped_user.order_dt.agg(['min','max'])user_life.head()(user_life['min']==user_life['max']).value_counts()
返回结果:True 12054False 11516dtype: int64
rfm = df.pivot_table(index='user_id', values=['order_products','order_amount','order_dt'], aggfunc={'order_products':'sum', 'order_amount':'sum', 'order_dt':'max'})# 将order_dt转换为距最后一天的天数# 将order_amount和order_products重命名, 并除以一个时间单位转换为数字rfm['R'] = (rfm.order_dt.max() - rfm.order_dt) / np.timedelta64(1,'D')#重命名另外两列rfm.rename(columns={'order_amount':'F', 'order_products': 'M'}, inplace=True)rfm.head()# 根据是否大于平均值将数据分为八个维度user = rfm[['R','F','M']].apply(lambda x : x-x.mean())# 为每个维度贴上标签,即增加'label'列def rfm_func(x): level = x.apply(lambda x: '1' if x>0 else '0') label =level.R + level.M + level.F d ={ '111':'重要价值顾客', '011':'重要保持顾客', '101':'一般价值顾客', '001':'一般保持顾客', '110':'重要挽留顾客', '010':'重要发展顾客', '100':'一般挽留顾客', '000':'一般发展顾客' } return d[label]rfm['label']=rfm[['R','F','M']].apply(lambda x : x-x.mean()).apply(rfm_func,axis=1)
返回结果:
rfm.groupby('label').count() #查看各种类型的人数
- 按照活跃度进行分层新用户:从来没有注册过活跃用户:上个月活跃,这个月依旧活跃回流用户:上个月不活跃,这个月重新消费不活跃用户:上个月不活跃、这个月依旧不消费
pivoted_counts = df.pivot_table(index='user_id', columns='month', values='order_dt', aggfunc='count').fillna(0)pivoted_counts = df.pivot_table(index='user_id', columns='month', values='order_dt', aggfunc='count').fillna(0)# 根据新老用户的定义划分用户等级def active_status(data): status = [] for i in range(18): # 若本月没有消费 if data[i] == 0: if len(status)>0: if status[i-1] == 'unreg': status.append( 'unreg') else: status.append('unactive') else: status.append('unreg') #若本月消费 if data[i] == 1: if len(status) > 0: if status[i-1] == 'unreg': status.append('new') if status[i-1] == 'unactive': status.append('return') else: status.append('avtive') else: status.append('new') data = data.astype(object) for i in range(18): data[i] = status[i]# print(data.index)# new_data = pd.Series(status, index=list(data.index)) return data# 对每一行应用上述的函数,注意axis=1表示对行处理purchase_status = df_purchase.apply(active_status, axis=1)purchase_status.head()
结果
# 查看每个月各个状态的人数purchase_status_ct = purchase_status.replace('unreg', np.NaN).apply(lambda x : x.value_counts())purchase_status_ct
# 对每一个用户,查看其两次购买日期的差值order_diff = grouped_user.apply(lambda x: x.order_dt - x.order_dt.shift())order_diff.head(10)
# 作出直方图(order_diff / np.timedelta64(1,'D')).hist(bins=20)
# 查看用户的生命周期(user_life['max'] - user_life['min'])# 上述结果得到的是timedelta类型,有单位,将其转换为数字((user_life['max'] - user_life['min'])/ np.timedelta64(1,'D')).hist(bins=40)
u_l = (user_life['max'] - user_life['min'])/ np.timedelta64(1,'D')u_l[u_l>0].hist(bins=40)
- 复购率与回购率复购率:自然月内购买多次的用户占比回购率:曾经购买过的用户在某一时期内再次购买的占比
pivoted_counts.head()
# 复购率,即消费次数大于1的,将这部分筛选出来,其余设置为0.# 注意,如果没有消费过,则不能将其加入复购率分母的求和# 注意apply和applymap函数的区别 applymap函数对所有的数据操作,apply依次对某一行或者某一列数据操作。purchase_r = pivoted_counts.applymap(lambda x : 1 if x >1 else np.NaN if x==0 else 0)# 作图(purchase_r.sum()/purchase_r.count()).plot()
def status_fun(data): status = [] for i in range(17): if data[i] > 0: if data[i+1]>0: status.append(1) else: status.append(0) else: status.append(np.NaN) data.astype(object) for i in range(17): data[i]=status[i] return datapurchase_b = pivoted_counts.apply(status_fun, axis=1)(purchase_b.sum()/purchase_b.count()).plot()
链接:https://www.jianshu.com/p/433685202250