酒卷隆治、里洋平的《数据分析实战》一书介绍了几个通过数据分析解决商业问题的案例,条理清晰,很适合数据分析新人入门阅读。
不过该书使用的是R语言,作为还在学习阶段的Python新手,斗胆使用Python代码复现一下分析过程,如有错误,敬请指点。
现状和预期
现状:一款叫做《黑猫拼图》的社交游戏本月的销售额相较于上月有所下滑
预期:能够保持和上个月一样的销售额水平
发现问题
通过咨询市场部和游戏开发部可得到以下信息:
1.预算不足,本月开展的商业宣传活动比上月少
2.每月开展的不同主题的活动,本月和上月相比几乎没有变动
结合现状,可由此提出假设:
商业宣传活动减少(事实)→新用户数量减少(假设)→新用户带来的销售额减少了(假设)→本月游戏销售额下滑(事实)
数据的收集和加工
基于假设,我们可以开始有针对性地收集数据,具体收集数据如下:
1.DAU
2.DPU
3.Install
首先导入数据
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
#导入数据
DAU=pd.read_csv("C:\\Users\\yzf\\Downloads\\DL76333\\R\\section3-dau.csv",engine='python')
DPU=pd.read_csv("C:\\Users\\yzf\\Downloads\\DL76333\\R\\section3-dpu.csv",engine='python')
INSTALL=pd.read_csv("C:\\Users\\yzf\\Downloads\\DL76333\\R\\section3-install.csv",engine='python')
数据概览,以DAU为例,DPU、INSTALL同理
DAU.info()
DAU.head()
合并数据
#合并数据
data_total=pd.merge(DAU,INSTALL,on='user_id')
data_total=pd.merge(data_total,DPU,how='outer',on=['user_id', 'log_date'])
合并后数据如下
data_total.head()
对数据进行加工处理
#替换缺失值
data_total.fillna(value=0,inplace=True)
#删除多余列
data_total.drop(columns=['app_name_y','app_name'],inplace=True)
#日期数据转换为月份
data_total['log_date']=data_total.log_date.map(lambda x: pd.to_datetime(x).strftime('%Y-%m'))
data_total['install_date']=data_total.install_date.map(lambda x: pd.to_datetime(x).strftime('%Y-%m'))
#按月聚合统计每位用户的月消费总额
data_mon_total=data_total.groupby(['log_date','user_id','install_date'])['payment'].agg('sum')
data_mon_total=data_mon_total.reset_index()
data_mon_total.head()
#新增一列表示是否为新用户,0表示老用户,1表示新用户
data_mon_total['user_type']=data_mon_total.apply(lambda x:'1' if x.log_date == x.install_date else '0', axis=1)
data_mon_total.head()
#按月统计新用户和老用户的消费总额
data_mon_payment=data_mon_total.groupby(['log_date','user_type'])['payment'].agg('sum')
data_mon_payment=data_mon_payment.reset_index()
result=pd.pivot_table(data_mon_payment,values='payment',index='user_type',columns='log_date',aggfunc='sum')
result.index=('老用户','新用户')
处理后的数据集如下
result
数据分析
已经完成了数据加工,并将数据整理成适合数据分析的状态。接下来,通过将数据可视化,能更好地观察、分析数据。
#数据可视化
x=list(result.columns)
y1=list(result.loc['老用户',:])
y2=list(result.loc['新用户',:])
plt.figure(dpi=100, facecolor='0.8')
plt.bar(x,y1,width=0.5,color='green')
plt.bar(x,y2,width=0.5,color='grey',bottom=y1)
plt.ylim(0, 280000)
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.title('《黑猫拼图》游戏销售额比较(上月/本月)',fontsize=18)
plt.legend(['老用户','新用户'],loc='upper right',fontsize=10)
plt.xlabel('月份', fontsize=11)
plt.ylabel('销售额(日元)', fontsize=13)
plt.grid(True)
plt.show()
由图可知,老用户带来的销售额,前后两个月几乎没有变化,新用户带来的销售额却下降了,从而导致本月销售额整体下降。
接下来看具体是哪个层次的消费额减少了
#筛选新用户的消费额数据
mau_payment_new=data_mon_total[data_mon_total.user_type=='1']
#数据分组
payment_min = mau_payment_new.payment.min()
payment_max = mau_payment_new.payment.max()
mau_payment_new['payment_group'] = pd.cut(mau_payment_new.payment,
bins=[payment_min-1, 1000, 2000, 3000, 4000, 5000, 6000, 7000, payment_max+1],
labels=['1000日元以下', '1000-2000日元', '2000-3000日元', '3000-4000日元', '4000-5000日元', '5000-6000日元', '6000-7000日元', '7000日元以上'])
new_payment_group =pd.pivot_table(mau_payment_new,values='user_id',index='payment_group',columns='log_date',aggfunc='count')
new_payment_group
new_payment_group.fillna(value=0,inplace=True)
最后生成直方图
#数据可视化
width = new_payment_group.columns.size
index = np.arange(0, new_payment_group.index.size)
color = ['green', 'blue']
labels = ['2013年6月', '2013年7月']
plt.figure(figsize=(12, 5))
plt.gca().set_facecolor('whitesmoke')
for i in range(0, width):
sub = new_payment_group.iloc[:, i]
plt.bar(index*width+i, sub, color=color[i], label=labels[i], width=0.8)
plt.title('《黑猫拼图》游戏新用户消费额度比较(上月/本月)', fontsize=18)
plt.xticks(index*width+0.5, new_payment_group.index)
plt.ylabel('消费人数(人)')
plt.legend(fontsize=13)
plt.grid(linestyle='--', linewidth=1, alpha=0.3)
plt.show()
由图可知,与上月相较,本月消费额在2000日元以下的用户数量减少了
解决对策
回顾数据分析之前的假设:
商业宣传活动减少(事实)→新用户数量减少(假设)→新用户带来的销售额减少了(假设)→本月游戏销售额下滑(事实)
针对已证实的假设,我们可以提出建议:恢复商业宣传活动到之前的水平。
当然,实际工作中,我们还需要判断ROI,即比较新用户的顾客终身价值(LTV)和商业宣传活动投入的成本,再进行决策。