数据集来自:游戏玩家付费金额预测大赛
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
![](https://img.haomeiwen.com/i11113273/523d6b283d7eacac.png)
从图中我们可以发现,在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, )
![](https://img.haomeiwen.com/i11113273/de48435630ed07ab.png)
有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
![](https://img.haomeiwen.com/i11113273/ccb6556eb877f2c9.png)
# 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
![](https://img.haomeiwen.com/i11113273/b06974e608557d3b.png)
# 前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)
![](https://img.haomeiwen.com/i11113273/d99f111450ac5479.png)
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)
![](https://img.haomeiwen.com/i11113273/48af9c6066ce5a17.png)
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
![](https://img.haomeiwen.com/i11113273/23cf4a0dc53cd591.png)
前7日玩家平均在线时长:10.21分钟
前7日付费玩家平均在线时长:140.19分钟
前45日付费玩家平均在线时长:137.74分钟
前7日付费玩家中有75%在线时长超过:33分钟
前45日付费玩家中有75%在线时长超过:32分钟
总结
![](https://img.haomeiwen.com/i11113273/2fb5cbe9db5c431b.jpeg)
![](https://img.haomeiwen.com/i11113273/0b231c0e3639eb7f.jpeg)
![](https://img.haomeiwen.com/i11113273/d32fc22da7486e7a.jpeg)
![](https://img.haomeiwen.com/i11113273/dd96971a251d2489.jpeg)
![](https://img.haomeiwen.com/i11113273/8ed92c45608cad92.jpeg)
![](https://img.haomeiwen.com/i11113273/c276afaf8ff5bbea.jpeg)
网友评论