场景描述
某公司经营的一款 APP 小游戏,每月销售额稳定上涨,但是在 7 月却突然下降,无论从市场环境或是游戏本身的环境来看,这个游戏的销售额都还有继续增长的空间 ,影响该游戏销售额的主要影响因素可能有两点:
- 游戏活动上新
- 商业宣传力度更改
经了解发现
- 游戏活动与上月活动并无较大改变
- 由于预算紧缺,宣传力度有所下降
接下来我们会根据数据分析来证实上述结论,并提出恢复销售额的方法。
数据描述
DAU(Daily Active User)
每天至少来访 1 次的用户数据,139112
行。
字段 | 类型 | 含义 |
log_date | str | 访问时间 |
app_name | str | 应用名 |
user_id | numpy.int64 | 用户 ID |
DPU(Daily Payment User)
每天至少消费 1 日元的用户数据(0.056 元),884
行。
字段 | 类型 | 含义 |
log_date | str | 访问时间 |
app_name | str | 应用名 |
user_id | numpy.int64 | 用户 ID |
payment | numpy.int64 | 消费金额 |
Install
记录每个用户首次登录游戏的时间,29329
行。
字段 | 类型 | 含义 |
install_date | str | 首次登录时间 |
app_name | str | 应用名 |
user_id | numpy.int64 | 用户 ID |
数据分析
数据读取
读取三个数据集。
import pandas as pd DAU_data = pd.read_csv('DAU.csv') DPU_data = pd.read_csv('DPU.csv') install_data = pd.read_csv('install.csv') 复制代码
显示 DAU
数据集前五行。
DAU_data.head() 复制代码
显示 DPU
数据集前五行。
DPU_data.head() 复制代码
显示 Install
数据集前五行。
install_data.head() 复制代码
数据合并
将每日活跃用户数据 DAU
与用户首次登录数据 Install
进行合并,将 user_id
与app_name
作为参照 key
。这样就可以得到用户的首次登录时间。
all_data = pd.merge(DAU_data, install_data, on=['user_id', 'app_name']) all_data.head() 复制代码
得到用户首次登录时间后,再与每日消费用户数据 DPU
进行合并,使用左连接的方式,保留 all_data
中的所有数据,缺失值默认为 NaN
。
all_data = pd.merge(all_data, DPU_data, on=['log_date', 'app_name', 'user_id'], how='left') all_data.head() 复制代码
数据处理
将 payment
列中的空值填充为 0。
all_data['payment'] = all_data['payment'].fillna('0') all_data 复制代码
将 payment
列的单位转换为元,log_date
与 install_date
都只保留月份即可。
all_data['payment'] = all_data['payment'].astype(float) all_data['payment'] = all_data['payment'] * 0.056 all_data['log_date'] = pd.to_datetime(all_data['log_date']).map(lambda x : x.strftime("%m")[1] + '月') all_data['install_date'] = pd.to_datetime(all_data['install_date']).map(lambda x : x.strftime("%m")[1] + '月') all_data.head() 复制代码
新老用户划分
将 登录月份 > 首次登录月份
的用户定义为老用户,其他则定义为新用户。
all_data['user'] = all_data['log_date'] > all_data['install_date'] all_data['user'] = all_data['user'].map({False: '新用户', True: '老用户'}) all_data.head() 复制代码
按照 log_date
, user
分组对 payment
求和,统计各月新老用户的带来的销售额。
user_category = all_data.groupby(['log_date', 'user'])['payment'].sum().reset_index() user_category.head() 复制代码
可以看到 6 月和 7 月的老用户带来的销售额基本相同,但 7 月新用户带来的销售额明显少于 6 月。
将销售额划分区域,看看哪个层次的用户消费在减少。
import numpy as np sale_df = all_data.loc[all_data['payment'] > 0, ['log_date', 'payment']].copy() bins = list(range(0, 101, 30)) + [np.inf] labels = [str(n) + '-' + str(n + 30) for n in bins[:-2]] + ['>90'] sale_df['payment_cut'] = sale_df['payment'].apply(lambda x : pd.cut([x], bins=bins, labels=labels)[0]) sale_df.head() 复制代码
根据上面柱状图可以看出,和 6 月相比,7 月消费额在 60 元以下的用户数量减少了一部分。
到此我们就可以得到一些结论。
结论
新用户中的产生消费的用户发生了减少,特别是消费金额较少的小额消费用户。因此,公司需要再次开展商业宣传活动并恢复到之前的水平,这样才有可能提升潜在用户对公司产品的认知度,增加新的用户。