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

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

作者: henrywongo | 来源:发表于2018-11-13 16:56 被阅读0次

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

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分钟

总结

相关文章

网友评论

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

      本文链接:https://www.haomeiwen.com/subject/mpahfqtx.html