
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天的付費金額。
問幾個問題先:
- user_id在train和test中有沒重復?
- 數(shù)據(jù)在時間上的分布?
- 有多少付費玩家,會給多少錢,分布如何?比例隨時間的變化?
- 在線時長如何?
- 單次付費有什么額度的?
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更新...