image.png
比赛网站
备注:
分析工具:anaconda上写python,画图用到pyecharts,所以后续的内容都是先一块代码,再一块图或者文字描述。
一、熟悉数据
不急着上模型,调参数,先熟悉下数据。
- 这是一个手机游戏的客户数据,注册个账号玩了一下。
- 有什么类型的feature:user_id、注册时间、游戏资源(木头、石头、象牙、肉、魔法等)、兵种(勇士、驯兽师、萨满)、加速券(通用、建筑、科研、训练、治疗)、建筑、科研、PVP(玩家对战)、PVE(人机对战)、在线时长、付费金额、付费次数。这些都是注册前7天的信息
- label:前45天的付费金额。
问几个问题先:
- user_id在train和test中有没重复?
- 数据在时间上的分布?
- 有多少付费玩家,会给多少钱,分布如何?比例随时间的变化?
- 在线时长如何?
- 单次付费有什么额度的?
1、user_id在train和test中有没重复?
# 读取数据
data = pd.read_csv("tap_fun_train.csv", parse_dates=True)
data_test = pd.read_csv("tap_fun_test.csv", parse_dates=True)
# 提取user_id列,并做合并处理
data_id = pd.DataFrame(data['user_id'],columns=['user_id'])
data_test_id = pd.DataFrame(data_test['user_id'],columns=['user_id'])
pd.merge(data_id, data_test_id, on = 'user_id')
image.png
没有重复的user_id,就是检查下,不要多想,哈哈!
2、 玩家注册时间分布
# 增加两列
data['register_time_month'] = data.register_time.str[:7]
data['register_time_day'] = data.register_time.str[6:10]
# 统计并保存为dataframe
data_month_df = pd.DataFrame(data['register_time_month'].value_counts()).sort_index()
# print(data_month_df)
data_day_df = pd.DataFrame(data['register_time_day'].value_counts()).sort_index()
# print(data_day_df)
# 画图 用了echarts的python版,挺好用的,也美观
from pyecharts import Line, Grid
line1 = Line("玩家数量统计-月")
line1.add("玩家数量", data_month_df.index, data_month_df['register_time_month'], mark_line=["average"], mark_point=["max", "min"])
line2 = Line("玩家数量统计-日",title_top="50%")
line2.add("玩家数量", data_day_df.index, data_day_df['register_time_day'], mark_line=["average"], mark_point=["max", "min"])
grid = Grid(width = 1000, height = 1000)
grid.add(line1, grid_bottom="60%")
grid.add(line2, grid_top="60%")
grid.render()
grid
image.png
- 月数据:不完整的,1月是从26号开始的数据,3月只有到6号的数据。
- 日数据:平均每天注册人数有5.7万人,挺多的啊。其中2月19号有11.7万人注册,是平时的两倍,20号还有9.3万人注册,有推广活动吗?但是整体趋势上,注册用户是下降的。
3、 有多少付费玩家,比例随时间的变化,会给多少钱,分布如何?
1. 有多少付费玩家?
data_pay_7 = copy.copy(data[data['pay_price']>0])
print(data_pay_7.shape) # (41439, 111)
print(data_pay_7.shape[0]/data.shape[0]) # 0.018111395638212645
七天内付费的玩家有41439个,占比大概是1.811%。
2. 付费玩家比例随时间的变化
# ----------------------------- 统计,改列明(避免冲突),合并,计算比例
data_pay_7_day_df = pd.DataFrame(data_pay_7['register_time_day'].value_counts()).sort_index()
# print(data_pay_7_day_df)
data_pay_7_day_df.rename(columns={'register_time_day':'pay_register_time_day'}, inplace = True)
data_day_count = pd.concat([data_pay_7_day_df, data_day_df], axis=1)
# print(data_day_count)
data_day_count['pay_percent'] = data_day_count['pay_register_time_day']/data_day_count['register_time_day']
# print(data_day_count)
# ----------------------------- 画图
from pyecharts import Overlap
line3 = Line()
line3.add("注册玩家数量", data_day_count.index, data_day_count['register_time_day'], mark_line=["average"], mark_point=["max", "min"])
line4 = Line()
line4.add("7天内付费玩家数量", data_day_count.index, data_day_count['pay_register_time_day'], mark_line=["average"],
mark_point=["max", "min"], yaxis_max=3000)
overlap = Overlap()
# 默认不新增 x y 轴,并且 x y 轴的索引都为 0
overlap.add(line3)
# 新增一个 y 轴,此时 y 轴的数量为 2,第二个 y 轴的索引为 1(索引从 0 开始),所以设置 yaxis_index = 1
# 由于使用的是同一个 x 轴,所以 x 轴部分不用做出改变
overlap.add(line4, yaxis_index=1, is_add_yaxis=True)
overlap.render()
overlap
image.png
from pyecharts import Bar, Overlap
line3 = Line()
line3.add("注册玩家数量", data_day_count.index, data_day_count['register_time_day'], mark_line=["average"], mark_point=["max", "min"])
bar = Bar()
bar.add("7天内付费玩家比例", data_day_count.index, data_day_count['pay_percent'], yaxis_max=0.1)
overlap = Overlap()
# 默认不新增 x y 轴,并且 x y 轴的索引都为 0
overlap.add(line3)
# 新增一个 y 轴,此时 y 轴的数量为 2,第二个 y 轴的索引为 1(索引从 0 开始),所以设置 yaxis_index = 1
# 由于使用的是同一个 x 轴,所以 x 轴部分不用做出改变
overlap.add(bar, yaxis_index=1, is_add_yaxis=True)
overlap.render()
overlap
image.png
- 注册用户的7天付费占比平均值是1.811%,分拆到每天的注册用户中,有起伏,但是波动不算大。
- 反而是某天(2月1、7、8、15、19、20号等)的注册用户越多,成功转化付费的好像不会“水涨船高”,也就是付费的还是那么多,促销回来的客户还是不付费?
3. 会给多少钱
data_pay_45 = copy.copy(data[data['prediction_pay_price']!=0])
print(data_pay_45['prediction_pay_price'].describe())
print('前45天合共付费:',data_pay_45['prediction_pay_price'].sum())
image.png
- (上图)有4.6万客户前45天付款了,合计给了410万,最土豪的花了3.3万,土豪你不懂。
data_pay_7 = copy.copy(data[data['pay_price']!=0])
print(data_pay_7['pay_price'].describe())
print('前7天合共付费:',data_pay_7['pay_price'].sum())
print('前45天合共付费:',data_pay_7['prediction_pay_price'].sum())
image.png
- (上图)有4.14万客户前7天就有付款行为了,占了4.6万的90.1%(有9.9%前七天没给钱,后来给了);
- 前七天合计花了122万,前45天花了391.7万,占4.6万客户前45天总付款410万的95.5%。
data_nopay_7_pay_45 = copy.copy(data_pay_45[data_pay_45['pay_price']==0])
print(data_nopay_7_pay_45['prediction_pay_price'].describe())
print('前七天没有,后45天有付款的合共付费:',data_nopay_7_pay_45['prediction_pay_price'].sum())
image.png
- (上图)有4549个客户前7天没付款,但是前45天付款的,占了9.9%,金额18.6万,占比4.53%。
data_pay_7_nopay_45 = copy.copy(data_pay_7[data_pay_7['pay_price']==data_pay_7['prediction_pay_price']])
print(data_pay_7_nopay_45['pay_price'].describe())
print(data_pay_7_nopay_45['pay_count'].describe())
print('前7天合共付费:',data_pay_7_nopay_45['pay_price'].sum())
print('前7天给钱了,但是后面45天不再给钱的:',data_pay_7_nopay_45.shape[0])
image.png
- (上图)前7天付款后,45天内不再付款的有3万,占4.6万的65.5%。前7天付费34.4万,占前七天的28.1%,占前45天410万的8.4%。---(放弃不玩了?)
data_pay_7_pay_45 = copy.copy(data_pay_7[data_pay_7['pay_price']<data_pay_7['prediction_pay_price']])
print(data_pay_7_pay_45['pay_price'].describe())
print(data_pay_7_pay_45['pay_count'].describe())
print('前7天合共付费:',data_pay_7_pay_45['pay_price'].sum())
print('前45天合共付费:',data_pay_7_pay_45['prediction_pay_price'].sum())
print('前7天给钱了,后面45天继续给钱的:',data_pay_7_pay_45.shape[0])
image.png
- (上图)前7天付款,后面继续付款的,有1.13万,占4.6万的25%,付款占410万的87.1%,而且在7天内比较快的付款第二次了。
还是来个总结性的图吧。
小结:红色字体才是核心人群啊。
image.png
4、 在线时长如何?
data['avg_online_minutes'].describe()
image.png
- (上图)整体来说,在线时长75%在5分钟内,看来都是下载看一下就不玩了。
data_pay = copy.copy(data[data['pay_price']!=0])
# data_pay.shape
data_pay['avg_online_minutes'].describe()
image.png
- (上图)付费用户平均在线140分钟,除以7天,每天在线20分钟。
5、 单次付费有什么额度的?
data_once = copy.copy(data[data['pay_count']==1])
# data_once.shape
data_once.groupby("pay_price")["pay_count"].sum()
image.png
- 付费次数只有一次的客户,可以看出有几种单词付费的额度,都是0.99结尾。
6、 研究评估标准。
评分标准是RMSE,均方根误差
- 如果有一个土豪客户是付费15000,但是模型只猜测是付费1000,那么(15000-1000)^2/828934=236,开根号得到15.38,一个土豪客户的误判,就可以令评分标准飙升。
- 如果客户是给0.99的,但是预判了1.99,那么(1.99-0.99)^2=1,开根号也是1,如果每个客户都误判1元,RMSE也就+1。
成败看土豪???
image.png
7、 test数据集
3月10号有类似2月19号的推广活动?
image.png
消费分布跟train值非常类似。
image.png
20180806更新...