用Python对游戏《野蛮时代》的7日数据进行分析

数据集来自:游戏玩家付费金额预测大赛

1. 了解数据

import numpy as np
import pandas as pd
# 读取数据
train = pd.read_csv('tap_fun_train.csv', parse_dates = True)
test = pd.read_csv('tap_fun_test.csv', parse_dates = True)
print('train size:{}'.format(train.shape))  # (2288007, 109), 含因变量
print('test  size:{}'.format(test.shape)) # (828934, 108), 不含因变量, 需要预测

train size:(2288007, 109)
test size:(828934, 108)

# 了解数据集字段含义
feature_explain = pd.read_excel('tap4fun 数据字段解释.xlsx')
feature_explain  

共109个变量,prediction_pay_price为因变量,除因变量外,其余字段均为前7日数据

# 需要提取日期信息
train['register_time'] = train['register_time'].str[:10]
test['register_time'] = test['register_time'].str[:10]
train_by_day = pd.DataFrame(train['register_time'].value_counts().sort_index())  # 查看时间分布,并保存

from pyecharts import Line
line = Line('玩家注册数量趋势', title_pos = '45%')
line.add('人数', train_by_day.index, train_by_day.values, mark_line = ['average'], mark_point = ['max', 'min'],
        mark_point_symbol="diamond", mark_point_textcolor='#40ff27', xaxis_rotate=45, legend_pos='80%'
        )
# 时间维度为1.26-3.6

玩家注册数量趋势

从图中我们可以发现,在1.26-3.6期间,平均每日的注册玩家数量为57200人,在2.19-2.21出现过一次峰值,峰值为平均值的两倍,这段时间可能游戏公司有进行拉新的活动,活动前每天玩家注册的数量在均值上下浮动,活动后每天玩家的注册数量在均值以下,出现了明显的下降

print('1.26-3.6总注册玩家数量: {:.0f}人'.format(train.shape[0]))
print('1.26-3.6日均注册玩家数量: {:.0f}人'.format(train.shape[0] / len(train['register_time'].unique())))

1.26-3.6总注册玩家数量: 2288007人
1.26-3.6日均注册玩家数量: 57200人

from pyecharts import Boxplot
boxplot = Boxplot('1.26-3.22每日注册玩家数量箱线图')
x_axis = ['注册玩家数量']
y_axis = [train_by_day.values]
_yaxis = boxplot.prepare_data(y_axis)
boxplot.add('注册玩家数量', x_axis, _yaxis, )

注册玩家数量箱线图

有50%的时间,注册人数稳定在42000-60000之间

2. 付费分析

# 1.26-3.6前7日付费玩家总数量
print('前7日付费玩家数量:{}人'.format(train[train['pay_price'] > 0].shape[0]))
# 1.26-3.6前7日付费玩家日均数量
print('前7日付费玩家数量:{:.0f}人'.format(train[train['pay_price'] > 0].shape[0] / 
                                 len(train[train['pay_price'] > 0].loc[:,'register_time'].unique())))
# 1.26-3.6前7日付费比率
print('前7日付费玩家比率 :{:.2f} %'.format((train[train['pay_price'] > 0].shape[0] / train.shape[0]) * 100))
# 1.26-3.6前7日付费玩家总收入
print('前7日付费玩家总收入:{:.2f}元'.format(np.sum(train['pay_price'])))
# 1.26-3.6前7日ARPU
print('前7日ARPU:{:.2f}元'.format(np.mean(train['pay_price'])))
# 1.26-3.6前7日ARPPU
print('前7日ARPPU:{:.2f}元'.format(np.mean(train[train['pay_price'] > 0].loc[:, 'pay_price'])))

前7日付费玩家数量:41439人
前7日付费玩家数量:1036人
前7日付费玩家比率 :1.81 %
前7日付费玩家总收入:1223326.66元
前7日ARPU:0.53元
前7日ARPPU:29.52元

# 计算按照注册时间分组,求得前7日的付费金额,以及按照注册时间分的每日付费人数
train_pay_7 = train[train['pay_price'] > 0].pivot_table(values='pay_price', index='register_time', aggfunc=['sum', 'count'])
# 重命名列
train_pay_7.rename(columns={'sum':'pay_price_sum', 'count':'pay_peice_count'}, inplace=True)
# 删除地1级index
train_pay_7.columns = train_pay_7.columns.droplevel(1)
# 按照付费金额之和大小排序
train_pay_7.sort_values('pay_price_sum', ascending=False, inplace=True)
# 前7日付费玩家帕累托分析
from pyecharts import Bar, Scatter, Overlap
bar = Bar('前7日付费玩家帕累托分析', title_pos = '45%')
bar.add('付费金额', train_pay_7.index, train_pay_7.pay_price_sum, xaxis_rotate=45, legend_pos='80%')

p = 1.0 * np.cumsum(train_pay_7.pay_price_sum) / np.sum(train_pay_7.pay_price_sum)

line2 = Line()
line2.add('累计占比', train_pay_7.index, p, is_smooth=True, legend_pos='80%')

# scatter = Scatter()
# scatter.add('帕累托', p[p > 0.8].index[0], p[p > 0.8].values[0])

overlap = Overlap()
overlap.add(bar)
overlap.add(line2, is_add_yaxis=True, yaxis_index=1)
# overlap.add(scatter)

overlap
前7日付费玩家帕累托分析
# 1.26-3.22前45日付费玩家总数量
print('前45日付费玩家总数量:{}人'.format(train[train['prediction_pay_price'] > 0].shape[0]))
# 1.26-3.22前45日日均付费玩家数量
print('前45日付费玩家日均数量:{:.0f}人'.format(np.round(train[train['prediction_pay_price'] > 0].shape[0] / 
                               len(train[train['prediction_pay_price'] > 0].loc[:,'register_time'].unique()))))
# 1.26-3.6前45日付费玩家占比
print('前45日付费玩家占比:{:.2f}%'.format((train[train['prediction_pay_price'] > 0].shape[0] / train.shape[0]) * 100))
# 1.26-3.6前45日付费玩家总收入
print('前45日付费玩家总收入:{:.2f}元'.format(np.sum(train['prediction_pay_price'])))
# 1.26-3.6前45日ARPU
print('前45日ARPU:{:.2f}元'.format(np.mean(train['prediction_pay_price'])))
# 1.26-3.6前45日ARPPU
print('前45日ARPPU:{:.2f}元'.format(np.mean(train[train['prediction_pay_price'] > 0].loc[:, 'prediction_pay_price'])))

前45日付费玩家总数量:45988人
前45日付费玩家日均数量:1150人
前45日付费玩家占比:2.01%
前45日付费玩家总收入:4102730.11元
前45日ARPU:1.79元
前45日ARPPU:89.21元

# 计算按照注册时间分组,求得前45日的付费金额,以及按照注册时间分的每日付费人数
train_pay_45 = train[train['prediction_pay_price'] > 0].pivot_table(values='prediction_pay_price', 
                                                                    index='register_time', aggfunc=['sum', 'count'])
# 重命名列
train_pay_45.rename(columns={'sum':'prediction_pay_price_sum', 'count':'prediction_pay_price_count'}, inplace=True)
# 删除地1级index
train_pay_45.columns = train_pay_45.columns.droplevel(1)
# 按照付费金额之和大小排序
train_pay_45.sort_values('prediction_pay_price_sum', ascending=False, inplace=True)

# 前45日付费玩家帕累托分析
bar2 = Bar('前45日付费玩家帕累托分析', title_pos = '45%')
bar2.add('付费金额', train_pay_45.index, train_pay_45.prediction_pay_price_sum, xaxis_rotate=45, legend_pos='80%')

p = 1.0 * np.cumsum(train_pay_45.prediction_pay_price_sum) / np.sum(train_pay_45.prediction_pay_price_sum)

line3 = Line()
line3.add('累计占比', train_pay_45.index, p, is_smooth=True, legend_pos='80%')

# scatter = Scatter()
# scatter.add('帕累托', p[p > 0.8].index[0], p[p > 0.8].values[0])

overlap2 = Overlap()
overlap2.add(bar2)
overlap2.add(line3, is_add_yaxis=True, yaxis_index=1)
# overlap.add(scatter)

overlap2
前45日付费玩家帕累托分析
# 前7日付费玩家中,支付金额在top20%的玩家付费金额占比
train_7 = train[train['pay_price'] > 0].sort_values('pay_price', ascending = False)
train_7_top_20 = train_7.iloc[:np.int(train_7.shape[0] * 0.2), :]
print('前7日付费玩家中,支付金额在top20%的玩家付费金额占比:{:.2f}%'.format((np.sum(train_7_top_20['pay_price']) / np.sum(train_7['pay_price'])) * 100))
# 前45日付费玩家中,支付金额在top20%的玩家付费金额占比
train_45 = train[train['prediction_pay_price'] > 0].sort_values('prediction_pay_price', ascending = False)
train_45_top_20 = train_45.iloc[:np.int(train_45.shape[0] * 0.2), :]
print('前45日付费玩家中,支付金额在top20%的玩家付费金额占比:{:.2f}%'.format((np.sum(train_45_top_20['prediction_pay_price']) / np.sum(train_45['prediction_pay_price'])) * 100))

二八定律
前7日付费玩家中,支付金额在top20%的玩家付费金额占比:89.73%
前45日付费玩家中,支付金额在top20%的玩家付费金额占比:94.83%

# 前7日付费以及前45日付费玩家注册时间分布
bar3 = Bar('前7日付费以及前45日付费玩家注册时间分布')
bar3.add('注册人数', train_7_45['register_time'].value_counts().sort_index().index, 
         train_7_45['register_time'].value_counts().sort_index().values,
        xaxis_rotate=45)
前7日付费以及前45日付费玩家注册时间分布
train_7_no_45 = train_7[train_7['prediction_pay_price'] == 0]
# 前7日付费,前45日日未付费玩家数量
print('前7日付费,前45日日未付费玩家数量:{}人'.format(train_7_no_45.shape[0]))
# 前7日付费,前45日未付费玩家占比
print('前7日付费,前45日未付费玩家占比:{:.2f}%'.format((train_7_no_45.shape[0] / train.shape[0])*100))
# 前7日付费,前45日未付费玩家支付金额
print('前7日付费,前45日未付费玩家支付金额:{:.2f}元'.format(np.sum(train_7_no_45['pay_price'])))

前7日付费,前45日日未付费玩家数量:0人
前7日付费,前45日未付费玩家占比:0.00%
前7日付费,前45日未付费玩家支付金额:0.00

train_no_7_45 = train_45[train_45['pay_price'] == 0]
# 前7日未付费,前45日付费玩家数量
print('前7日未付费,前45日付费玩家数量:{}人'.format(train_no_7_45.shape[0]))
# 前7日未付费,前45日付费玩家占比
print('前7日未付费,前45日付费玩家占比:{:.2f}%'.format((train_no_7_45.shape[0] / train.shape[0])*100))
# 前7日未付费,前45日付费玩家支付金额
print('前7日未付费,前45日付费玩家支付金额:{:.2f}元'.format(np.sum(train_no_7_45['prediction_pay_price'])))

前7日未付费,前45日付费玩家数量:4549人
前7日未付费,前45日付费玩家占比:0.20%
前7日未付费,前45日付费玩家支付金额:185794.00元

# 前7日未付费,前45日付费玩家注册时间分布
bar4 = Bar('前7日未付费,前45日付费玩家注册时间分布')
bar4.add('注册人数', train_no_7_45['register_time'].value_counts().sort_index().index, 
         train_no_7_45['register_time'].value_counts().sort_index().values,
        xaxis_rotate=45)
前7日未付费,前45日付费玩家注册时间分布

3. 在线时长分析

# 所有玩家平均在线时长
print('前7日玩家平均在线时长:{:.2f}分钟'.format(np.mean(train['avg_online_minutes'])))
# 前7日付费玩家平均在线时长
print('前7日付费玩家平均在线时长:{:.2f}分钟'.format(np.mean(train[train['pay_price'] > 0]['avg_online_minutes'])))
# 前45日付费玩家平均在线时长
print('前45日付费玩家平均在线时长:{:.2f}分钟'.format(np.mean(train[train['prediction_pay_price'] > 0]['avg_online_minutes'])))

前7日玩家平均在线时长:10.21分钟
前7日付费玩家平均在线时长:140.19分钟
前45日付费玩家平均在线时长:137.74分钟

boxplot2 = Boxplot('玩家在线时长')
x_axis = ['前7日玩家在线时长']
y_axis = [train['avg_online_minutes']]
_yaxis = boxplot.prepare_data(y_axis)
boxplot2.add('前7日玩家在线时长', x_axis, _yaxis, )

boxplot3 = Boxplot()
x_axis = ['前7日付费玩家在线时长']
y_axis = [train[train['pay_price'] > 0]['avg_online_minutes']]
_yaxis = boxplot.prepare_data(y_axis)
boxplot3.add('前7日付费玩家在线时长', x_axis, _yaxis, )

boxplot4 = Boxplot()
x_axis = ['前45日付费玩家在线时长']
y_axis = [train[train['prediction_pay_price'] > 0]['avg_online_minutes']]
_yaxis = boxplot.prepare_data(y_axis)
boxplot4.add('前45日付费玩家在线时长', x_axis, _yaxis, )

overlap3 = Overlap()
overlap3.add(boxplot2)
overlap3.add(boxplot3)
overlap3.add(boxplot4)

overlap3

玩家在线时长

前7日玩家平均在线时长:10.21分钟
前7日付费玩家平均在线时长:140.19分钟
前45日付费玩家平均在线时长:137.74分钟
前7日付费玩家中有75%在线时长超过:33分钟
前45日付费玩家中有75%在线时长超过:32分钟

总结

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

推荐阅读更多精彩内容

  • 活跃用户指的是什么?ARPU怎么算?如何计算LTV? 这个付费渗透率是个啥玩意怎么算?那个3日留存里的3日指的是第...
    大熊818阅读 25,386评论 2 40
  • 5月16日,刚和你分别的第一天里,我就开始想你。 人就是这样复杂的生物,前几天,和你吵架打架到不可开交,直至分手再...
    蕙然阅读 1,238评论 0 0
  • 书有味道吗?有。至今还忘不了第一次翻开课本的那股悠悠草香与墨香,伴随着新鲜与刺激。现在,一到冰雪融化,檐水滴答,残...
    骏马悲嘶阅读 768评论 12 50
  • 情人 被人们歌颂了几千年 鞭策了数万遍 过去的时代 至高权利下 有无数情人 名叫—— 妃子 达官贵人 富豪巨贾 有...
    梧桐雨wty阅读 1,686评论 20 43
  • (一)故园无此声 “风一更,雪一更,聒碎乡心梦不成,故园无此声。 ” 农人将小雪分为三候:“一候虹藏不见;二候天气...
    陈末_wz阅读 227评论 0 0