游戲玩家付費金額預測大賽-預處理

image.png

比賽網(wǎng)站


備注:
分析工具:anaconda上寫python,畫圖用到pyecharts,所以后續(xù)的內(nèi)容都是先一塊代碼,再一塊圖或者文字描述。

一、熟悉數(shù)據(jù)

不急著上模型,調(diào)參數(shù),先熟悉下數(shù)據(jù)。

  • 這是一個手機游戲的客戶數(shù)據(jù),注冊個賬號玩了一下。
  • 有什么類型的feature:user_id、注冊時間、游戲資源(木頭、石頭、象牙、肉、魔法等)、兵種(勇士、馴獸師、薩滿)、加速券(通用、建筑、科研、訓練、治療)、建筑、科研、PVP(玩家對戰(zhàn))、PVE(人機對戰(zhàn))、在線時長、付費金額、付費次數(shù)。這些都是注冊前7天的信息
  • label:前45天的付費金額。

問幾個問題先:

  1. user_id在train和test中有沒重復?
  2. 數(shù)據(jù)在時間上的分布?
  3. 有多少付費玩家,會給多少錢,分布如何?比例隨時間的變化?
  4. 在線時長如何?
  5. 單次付費有什么額度的?

1、user_id在train和test中有沒重復?

# 讀取數(shù)據(jù)
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]

# 統(tǒng)計并保存為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("玩家數(shù)量統(tǒng)計-月")
line1.add("玩家數(shù)量", data_month_df.index, data_month_df['register_time_month'], mark_line=["average"], mark_point=["max", "min"])

line2 = Line("玩家數(shù)量統(tǒng)計-日",title_top="50%")
line2.add("玩家數(shù)量", 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
  • 月數(shù)據(jù):不完整的,1月是從26號開始的數(shù)據(jù),3月只有到6號的數(shù)據(jù)。
  • 日數(shù)據(jù):平均每天注冊人數(shù)有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

七天內(nèi)付費的玩家有41439個,占比大概是1.811%。

2. 付費玩家比例隨時間的變化

# ----------------------------- 統(tǒng)計,改列明(避免沖突),合并,計算比例
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("注冊玩家數(shù)量", data_day_count.index, data_day_count['register_time_day'], mark_line=["average"], mark_point=["max", "min"])

line4 = Line()
line4.add("7天內(nèi)付費玩家數(shù)量", 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 軸的數(shù)量為 2,第二個 y 軸的索引為 1(索引從 0 開始),所以設(shè)置 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("注冊玩家數(shù)量", data_day_count.index, data_day_count['register_time_day'], mark_line=["average"], mark_point=["max", "min"])

bar = Bar()
bar.add("7天內(nèi)付費玩家比例", 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 軸的數(shù)量為 2,第二個 y 軸的索引為 1(索引從 0 開始),所以設(shè)置 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號等)的注冊用戶越多,成功轉(zhuǎn)化付費的好像不會“水漲船高”,也就是付費的還是那么多,促銷回來的客戶還是不付費?

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天內(nèi)不再付款的有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天繼續(xù)給錢的:',data_pay_7_pay_45.shape[0])
image.png
  • (上圖)前7天付款,后面繼續(xù)付款的,有1.13萬,占4.6萬的25%,付款占410萬的87.1%,而且在7天內(nèi)比較快的付款第二次了。

還是來個總結(jié)性的圖吧。
小結(jié):紅色字體才是核心人群啊。


image.png

4、 在線時長如何?

data['avg_online_minutes'].describe()
image.png
  • (上圖)整體來說,在線時長75%在5分鐘內(nèi),看來都是下載看一下就不玩了。
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
  • 付費次數(shù)只有一次的客戶,可以看出有幾種單詞付費的額度,都是0.99結(jié)尾。

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數(shù)據(jù)集

3月10號有類似2月19號的推廣活動?


image.png

消費分布跟train值非常類似。


image.png

20180806更新...

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 為了生存,你得學會張牙舞爪。 01 我討厭極了,社會上的江湖規(guī)矩,不懂的都會栽跟頭,不是恐嚇你的哦,因為我就栽過。...
    瑜呀閱讀 393評論 0 2
  • 我的悲傷從哪里來 我可否向天問 問問它的來處 問問它的去向 我有點厭倦它在我的世界來往 它會把是非帶到心上 悲傷流...
    翔于閱讀 410評論 0 0
  • 吳晗怎么也想不到,車來車往的馬路中間竟會突然塌陷出一個大坑,馬路張開了大嘴,吞掉了上面所有來往的車和人,其中也包括...
    張蒸發(fā)閱讀 748評論 2 8

友情鏈接更多精彩內(nèi)容