python对⽐数据_Python数据分析之对⽐
现状
某社交游戏公司有⼀款游戏本⽉的销售额相⽐上⽉有所下滑,需要我们分析下滑的原因,并提升销售额。这个游戏的销售额之前⼀直保持增长,⽽这个⽉却下降了。从市场环境和游戏本⾝的状态来看,不太可能由于游戏本⾝内容导致,于是我们需要出哪些⽤户产⽣差异导致销售额下降。
近两个⽉销售额数据
发现问题
⾸先,我们需要知道本⽉和上⽉相⽐有哪些点不同。我们尝试进⾏下述假设。销售额减少的原因可能有以下两点:
1. 在营销宣传上存在问题
2. 每⽉开展的游戏活动存在问题
提出假设后我们需要检验假设是否正确,最简单的⽅式是询问相关部门。通过咨询是市场部和游戏开发部,得到以下信息:
1. 由于营销预算有限,本⽉相⽐上⽉并没有开展那么多宣传活动
2. 游戏活动主题和内容相⽐上⽉⼏乎没有变动
从上⾯信息可以发现销售额减少可能由于宣传活动减少,导致公司产品在⽤户纳新⽅⾯不⾜,现在我们需要通过数据确认新⽤户数量减少和销售额下降是否存在关系。
数据收集和处理
通过跟技术部沟通分析需求的数据⽀持,收集到如下数据:
1. DAU(Daily Active User,每天⾄少来访 1 次的⽤户数据)
2. DPU(Daily Payment User,每天⾄少消费 1 元的⽤户数据)
3. Install(记录每个⽤户⾸次玩这个游戏的时间的数据)
DAU
数据字段
数据类型
数据名称
log_date
string
访问时间
python怎么读csv数据app_name
string
应⽤名称
user_id
int
⽤户ID
DPU
数据字段
数据类型
数据名称
log_date
string
消费⽇期
app_name
string
应⽤名称
user_id
int
⽤户ID
payment
int
消费⾦额
Install
数据字段
数据类型
数据名称
install_date
string
⾸次使⽤时间
app_name
string
应⽤名称
user_id
int
⽤户ID
读取数据⽂件
本例的数据都是以csv⽂件存储,使⽤Pandas库可以将csv⽂件读取成DataFrame数据,⽅便后续进⾏数据处理。具体代码如下:# 导⼊相关库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
# 读取csv数据
dau = pd.read_csv('data/dau.csv')
dpu = pd.read_csv('data/dpu.csv')
install = pd.read_csv('data/install.csv')
注:%matplotlib inline是我因为使⽤jupyter notebook进⾏编辑,为了显⽰图表需要添加此⾏。
查看读取的数据
head⽅法可以显⽰数据头五⾏。
dau.head()
dau
dpu.head()
dpu
install.head()
install
数据合并
merge函数可以将两份数据进⾏合并,类似SQL⾥⾯的join,但功能要更加强⼤。⾸先将DAU和install的数据进⾏合并,合并的数据能计算当⽉新⽤户和已有⽤户。再将得到的数据与⽤户消费信息数据DPU合并,这样可以计算⽤户当⽉的消费⾦额情况。
# 合并DAU和install数据
dau_install = pd.merge(dau, install, on=['user_id', 'app_name'])
# 合并上述数据和DPU数据
dau_install_payment = pd.merge(dau_install, dpu, how='left', on=['log_date', 'app_name', 'user_id'])
dau_install.head()
dau_install
dau_install_payment.head()
dau_install_payment
查看最终合并后的数据发现消费⾦额payment显⽰NaN即该值为空,这是因为只有产品消费⾏为的⽤户才有消费⾦额,否则就没有数据,缺失的数据在合并后会显⽰NaN。
实际上有消费⾦额的数据和NaN混合在⼀起,这⾥只查看了前五⾏数据全显⽰为NaN,所以我们还⽆法确定消费⾦额数据是否与之前的数据正确合并。为了查看消费⾦额⾮空的数据,需要进⾏⼀下操作:
# 查看payment不为空数据
dau_install_payment[dau_install_payment['payment'].notnull()].head()
看到不为NaN数据有实际的值,即payment正确合并在⼀起。
数据处理
前⾯我们合并⽤户的消费数据,但未消费⽤户的消费⾦额为NaN值,因为payment需要参与到后续计算,NaN值则不是最好的标识,所以需要将这些值设置为零。
# 将未消费⽤户的消费⾦额设置为零
dau_install_payment['payment'] = dau_install_payment['payment'].fillna(0)
dau_install_payment
数据探索分析
按⽉统计
现在得到的分析数据⽇期都是年⽉⽇类型,如要要按⽉统计则需重新⽣成⽉份的列来表⽰。利⽤lambda函数从⽇期中提取第1到7个字符,使⽤⽇期log_date和⾸次使⽤⽇期install_date都需要进⾏处理。为了观察上⽉与本⽉的差别,数据将按照⽉份进⾏统计⽤户信息。
# 增加两列表⽰⽉份
dau_install_payment['log_month'] = dau_install_payment['log_date'].map(lambda x: x[0: 7])
dau_install_payment['install_month'] = dau_install_payment['install_date'].map(lambda x: x[0: 7])
# 按使⽤⽉份、⽤户ID和⾸次使⽤⽉份分组汇总消费⾦额合计
mau_payment = dau_upby(['log_month', 'user_id', 'install_month'])
['payment'].sum().to_frame().reset_index()
mau_payment.head()
mau_payment
区分新⽤户和已有⽤户
如果⽤户的使⽤⽉份和⾸次使⽤⽉份⼀致,则该⽤户为新⽤户,否则为已有的⽤户,下⾯我们将对⽤户类型进⾏区分。
# 增加识别新⽤户和已有⽤户
mau_payment['user_type'] = np.where(mau_payment['log_month'] == mau_payment['install_month'], 'install', 'existing')
mau_payment.head()
mau_payment
为了确认新⽤户是否减少了,按⽉统计不同⽤户类型的消费额,对⽐发现7⽉相⽐6⽉新⽤户⼤幅减少。
# 按⽉份和⽤户类型分组求消费⾦额合计
mau_paymnet_summary = upby(['log_month', 'user_type'])['payment'].sum().to_frame().reset_index()
Paste_Image.png
数据可视化
通过前⾯的汇总数据可以发现本⽉与上⽉之间的差异,但不是特别直观,所以我们⽤可视化图表来表⽰两者的差异情况。如下图,本⽉相⽐上⽉消费额减少,但已有⽤户的消费⾦额并没有明显变化,新⽤户消费⾦额减少明显。
# 按使⽤⽉份和⽤户类型分组汇总消费⾦额绘制叠加柱状图
upby(['log_month', 'user_type'])['payment'].sum().unstack().plot(kind='bar', stacked=True, alpha=0.8,
rot=True)
plt.ylabel('total_payment')
plt.legend()
plt.show()
两个⽉的消费额分布⽐较
从上⾯的初步分析结果可以验证我们之前的假设,即新⽤户数减少导致销售额下降。那么具体是哪个消费层级的消费额减少?
先抽取新⽤户的消费数据,将两个⽉份的数据分别绘制直⽅图并重叠对⽐。横坐标表⽰该⽉的消费⾦额总计,纵坐标表⽰相应的⽤户数。通过可视化图表可以看出消费额2000以下的⽤户减少了。在社交游戏中,⽤户可以⽤⾦钱来购买劳动。由于⼤部分⽤户消费得很少,所以你只需要花不多的钱就可以让⾃⼰的排名⼤幅上升。然⽽,如果你想占据排⾏榜的顶端,那么所要花费的⾦额马上就会上涨。这也是⼈们的竞争⼼理结构在数据分布上的表现。
# 对⽐不同⽉份消费⾦额分布
install_payment = mau_payment[(mau_payment['payment'] > 0) & (mau_payment['user_type'] == 'install')]
data1 = install_payment[install_payment['log_month'] == '2013-06']['payment']
data2 = install_payment[install_payment['log_month'] == '2013-07']['payment']
bins = np.arange(0, 13000, 1000)
data1.hist(bins=bins, alpha=0.7, label='2013-06')
data2.hist(bins=bins, alpha=0.8, label='2013-07')
plt.ylabel('payment')
plt.legend()
plt.show()
解决⽅案
基于前⾯的分析结果,我们可以采取以下解决⽅案来提⾼销售额。
1. 公司恢复之前营销宣传的活动⽔平,提⾼潜在⽤户对公司产品的认知度
2. 打包⼩额游戏促销包,提⾼⼩额消费新⽤户数量
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论