游戏玩家付费金额预测大赛-预处理

image.png

比赛网站


备注:
分析工具:anaconda上写python,画图用到pyecharts,所以后续的内容都是先一块代码,再一块图或者文字描述。

一、熟悉数据

不急着上模型,调参数,先熟悉下数据。

  • 这是一个手机游戏的客户数据,注册个账号玩了一下。
  • 有什么类型的feature:user_id、注册时间、游戏资源(木头、石头、象牙、肉、魔法等)、兵种(勇士、驯兽师、萨满)、加速券(通用、建筑、科研、训练、治疗)、建筑、科研、PVP(玩家对战)、PVE(人机对战)、在线时长、付费金额、付费次数。这些都是注册前7天的信息
  • label:前45天的付费金额。

问几个问题先:

  1. user_id在train和test中有没重复?
  2. 数据在时间上的分布?
  3. 有多少付费玩家,会给多少钱,分布如何?比例随时间的变化?
  4. 在线时长如何?
  5. 单次付费有什么额度的?

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更新...

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354

推荐阅读更多精彩内容

  • 为了生存,你得学会张牙舞爪。 01 我讨厌极了,社会上的江湖规矩,不懂的都会栽跟头,不是恐吓你的哦,因为我就栽过。...
    瑜呀阅读 347评论 0 2
  • 我的悲伤从哪里来 我可否向天问 问问它的来处 问问它的去向 我有点厌倦它在我的世界来往 它会把是非带到心上 悲伤流...
    翔于阅读 382评论 0 0
  • 吴晗怎么也想不到,车来车往的马路中间竟会突然塌陷出一个大坑,马路张开了大嘴,吞掉了上面所有来往的车和人,其中也包括...
    张蒸发阅读 588评论 2 8