商业数据分析实战(酒卷隆志/里洋平)
第四章 案例2——交叉列表统计:什么样的顾客会选择离开
社交游戏的用户流失分析
和上个月相比,本月《黑猫拼图》游戏的用户数减少了很多。和上月相比,本月的商业宣传和月度活动并未大的变化。因此我们需要调查清楚用户数大量减少的原因并改善这种状况,那么我们该怎么办呢
4.1 现状和预期
现状:和上月相比,本月的用户数减少了。在本例中,我们的目标是查清用户数减少的原因,并确保和上月相同的用户数。那么下一步要做的就是通过数据分析查清元婴,并明确所需解决的问题。

4.2 发现问题
同样,在第4章中,为了明确现状和预期之间差距的结构,我们需要首先思考上月和半月有哪些不同的地方。在发现问题的阶段,重要的是从大而广的视角出发来考虑各种可能性。例如,我们可以尝试做出如下假设。
1)、商业推广上存在的问题,流失的用户数超过了新增的用户数
2)、每月不同主题的游戏活动开始变得很无聊,用户都不爱玩了
3)、按用户的性别或者年龄段等属性来划分用户群,可能是其中某个用户群出现了问题。
做出上述假设后,应尽可能地在短时间内大致验证一下。我们通过咨询市场部和游戏开发部,得到了下述信息。
1)、和上月相比,商业推广的粒度大体没变,新增用户数也大致保持在相同的水平
2)、开展的各种有次活动通上月相比几乎没有变化
因此,只剩下第3条假设“可能是其中某个用户群出现了问题”没有得到验证了。也就是说,并没有发现现有是由第1条或第2条假设造成。再进一步深挖假设的内容,可以知道用户群通常是按照性别、年龄端等来划分的。于是,首先我们可以考虑是否有某个属性的用户群数量减少了,然后通过和上月的数据加以比较,确认用户减少了的用户属性,并思考如何恢复用户数量。
4.3 数据的收集和加工
探讨分析所需的数据
在确定了分析的主题后,就需要探讨一下分析所需的数据了
这次的用户群到底需要哪些数据呢,本案例中我们提出的假设如下所示。
问题
和上月相比,用户数量减少了 (事实)
某个用户群出现了问题 (假设)
解决方案
针对用户数量减少了的用户群采取相应的措施,使用用户数量回到和上月相同的水平
基于这个假设,让我们整理一下分析的过程。
1、《黑猫拼图》游戏的用户数量相比上月减少了 (事实)
2、某些用户群的用户数量减少了 (假设)
3、针对该用户群指定相应的措施,使用户数量回到和上月相同水平 (解决方案)
4.4 数据分析
1)、读入csv文件
os.getcwd()
filepath = 'E:\\Download\\data_analysis\\data'
os.chdir(filepath) #将工作路径设置至filepath
dau = pd.read_csv("section4-dau.csv", parse_dates=['log_date'])
user_info = pd.read_csv("section4-user_info.csv")2)、合并DAU和user.info的数据
user_dau = pd.merge(dau, user_info, on=['user_id', 'app_name'], how='left')3)、用户群分析(按性别统计)
#按月统计不同性别的登录用户数
user_dau.groupby(by=[pd.Grouper(key='log_date', freq='M'),'gender']).count()['user_id']log_date gender
2013-08-31 F 47343
M 46842
2013-09-30 F 38027
M 38148
Name: user_id, dtype: int64
4)、用户群分析(按年龄段统计)
#按月统计不同年龄段的登录用户数
user_dau.groupby(by=[pd.Grouper(key='log_date', freq='M'),'generation']).count()['user_id'].reset_index().pivot(index='log_date', columns='generation', values='user_id')log_date generation gender
2013-08-31 10 F 9091
M 9694
20 F 17181
M 16490
30 F 14217
M 13855
40 F 4597
M 4231
50 F 2257
M 2572
2013-09-30 10 F 7316
M 8075
20 F 13616
M 13613
30 F 11458
M 10768
40 F 3856
M 3638
50 F 1781
M 2054
Name: user_id, dtype: int64
5)、用户群分析(按性别X年龄段统计)
#按月统计不同年龄段不同性别的用户数
df_g = user_dau.groupby(by=[pd.Grouper(key='log_date', freq='M'),'generation','gender']).count()['user_id']
df_glog_date generation gender
2013-08-31 10 F 9091
M 9694
20 F 17181
M 16490
30 F 14217
M 13855
40 F 4597
M 4231
50 F 2257
M 2572
2013-09-30 10 F 7316
M 8075
20 F 13616
M 13613
30 F 11458
M 10768
40 F 3856
M 3638
50 F 1781
M 2054
Name: user_id, dtype: int64格式转换(pivot_table,pivot)
df_g = user_dau.groupby(by=[pd.Grouper(key='log_date', freq='M'),'generation','gender']).count()['user_id']
df_g.reset_index().pivot_table(index='log_date', columns=['generation', 'gender'], values='user_id')generation 10 20 30 40 50
gender F M F M F M F M F M
log_date
2013-08-31 9091 9694 17181 16490 14217 13855 4597 4231 2257 2572
2013-09-30 7316 8075 13616 13613 11458 10768 3856 3638 1781 20546)、用户群分析(按设备统计)
user_dau.groupby(by=[pd.Grouper(key='log_date', freq='M'),'device_type']).count()['user_id'].reset_index().pivot(index='log_date', columns='device_type', values='user_id')device_type Android iOS
log_date
2013-08-31 46974 47211
2013-09-30 29647 46528结果发现,9月iOS用户数相比8月下降幅度很小,然而Android用户数却极大地减少了,因此问题很可能出自这个用户群
7)、用户群分析结果的可视化
待补充。。。