Python數(shù)據(jù)分析之對比

現(xiàn)狀

某社交游戲公司有一款游戲本月的銷售額相比上月有所下滑,需要我們分析下滑的原因,并提升銷售額。這個游戲的銷售額之前一直保持增長,而這個月卻下降了。從市場環(huán)境和游戲本身的狀態(tài)來看,不太可能由于游戲本身內(nèi)容導致,于是我們需要找出哪些用戶產(chǎn)生差異導致銷售額下降。

近兩個月銷售額數(shù)據(jù)

發(fā)現(xiàn)問題

首先,我們需要知道本月和上月相比有哪些點不同。我們嘗試進行下述假設(shè)。銷售額減少的原因可能有以下兩點:
1. 在營銷宣傳上存在問題
2. 每月開展的游戲活動存在問題

提出假設(shè)后我們需要檢驗假設(shè)是否正確,最簡單的方式是詢問相關(guān)部門。通過咨詢是市場部和游戲開發(fā)部,得到以下信息:
1. 由于營銷預(yù)算有限,本月相比上月并沒有開展那么多宣傳活動
2. 游戲活動主題和內(nèi)容相比上月幾乎沒有變動

從上面信息可以發(fā)現(xiàn)銷售額減少可能由于宣傳活動減少,導致公司產(chǎn)品在用戶納新方面不足,現(xiàn)在我們需要通過數(shù)據(jù)確認新用戶數(shù)量減少和銷售額下降是否存在關(guān)系。

數(shù)據(jù)收集和處理

通過跟技術(shù)部溝通分析需求的數(shù)據(jù)支持,收集到如下數(shù)據(jù):
1. DAU(Daily Active User,每天至少來訪 1 次的用戶數(shù)據(jù))
2. DPU(Daily Payment User,每天至少消費 1 元的用戶數(shù)據(jù))
3. Install(記錄每個用戶首次玩這個游戲的時間的數(shù)據(jù))

  • DAU
數(shù)據(jù)字段 數(shù)據(jù)類型 數(shù)據(jù)名稱
log_date string 訪問時間
app_name string 應(yīng)用名稱
user_id int 用戶ID
  • DPU
數(shù)據(jù)字段 數(shù)據(jù)類型 數(shù)據(jù)名稱
log_date string 消費日期
app_name string 應(yīng)用名稱
user_id int 用戶ID
payment int 消費金額
  • Install
數(shù)據(jù)字段 數(shù)據(jù)類型 數(shù)據(jù)名稱
install_date string 首次使用時間
app_name string 應(yīng)用名稱
user_id int 用戶ID

讀取數(shù)據(jù)文件
本例的數(shù)據(jù)都是以csv文件存儲,使用Pandas庫可以將csv文件讀取成DataFrame數(shù)據(jù),方便后續(xù)進行數(shù)據(jù)處理。具體代碼如下:

# 導入相關(guān)庫
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

%matplotlib inline

# 讀取csv數(shù)據(jù)
dau = pd.read_csv('data/dau.csv')
dpu = pd.read_csv('data/dpu.csv')
install = pd.read_csv('data/install.csv')

注:%matplotlib inline是我因為使用jupyter notebook進行編輯,為了顯示圖表需要添加此行。

查看讀取的數(shù)據(jù)
head方法可以顯示數(shù)據(jù)頭五行。

dau.head()
dau
dpu.head()
dpu
install.head()
install

數(shù)據(jù)合并
merge函數(shù)可以將兩份數(shù)據(jù)進行合并,類似SQL里面的join,但功能要更加強大。首先將DAU和install的數(shù)據(jù)進行合并,合并的數(shù)據(jù)能計算當月新用戶和已有用戶。再將得到的數(shù)據(jù)與用戶消費信息數(shù)據(jù)DPU合并,這樣可以計算用戶當月的消費金額情況。

# 合并DAU和install數(shù)據(jù)
dau_install = pd.merge(dau, install, on=['user_id', 'app_name'])

# 合并上述數(shù)據(jù)和DPU數(shù)據(jù)
dau_install_payment = pd.merge(dau_install, dpu, how='left', on=['log_date', 'app_name', 'user_id'])
dau_install.head()
dau_install
dau_install_payment.head()
dau_install_payment

查看最終合并后的數(shù)據(jù)發(fā)現(xiàn)消費金額payment顯示NaN即該值為空,這是因為只有產(chǎn)品消費行為的用戶才有消費金額,否則就沒有數(shù)據(jù),缺失的數(shù)據(jù)在合并后會顯示NaN。

實際上有消費金額的數(shù)據(jù)和NaN混合在一起,這里只查看了前五行數(shù)據(jù)全顯示為NaN,所以我們還無法確定消費金額數(shù)據(jù)是否與之前的數(shù)據(jù)正確合并。為了查看消費金額非空的數(shù)據(jù),需要進行一下操作:

# 查看payment不為空數(shù)據(jù)
dau_install_payment[dau_install_payment['payment'].notnull()].head()

看到不為NaN數(shù)據(jù)有實際的值,即payment正確合并在一起。

數(shù)據(jù)處理
前面我們合并用戶的消費數(shù)據(jù),但未消費用戶的消費金額為NaN值,因為payment需要參與到后續(xù)計算,NaN值則不是最好的標識,所以需要將這些值設(shè)置為零。

# 將未消費用戶的消費金額設(shè)置為零
dau_install_payment['payment'] = dau_install_payment['payment'].fillna(0)
dau_install_payment

數(shù)據(jù)探索分析

按月統(tǒng)計
現(xiàn)在得到的分析數(shù)據(jù)日期都是年月日類型,如要要按月統(tǒng)計則需重新生成月份的列來表示。利用lambda函數(shù)從日期中提取第1到7個字符,使用日期log_date和首次使用日期install_date都需要進行處理。為了觀察上月與本月的差別,數(shù)據(jù)將按照月份進行統(tǒng)計用戶信息。

# 增加兩列表示月份
dau_install_payment['log_month'] = dau_install_payment['log_date'].map(lambda x: x[0: 7])
dau_install_payment['install_month'] = dau_install_payment['install_date'].map(lambda x: x[0: 7])

# 按使用月份、用戶ID和首次使用月份分組匯總消費金額合計
mau_payment = dau_install_payment.groupby(['log_month', 'user_id', 'install_month'])['payment'].sum().to_frame().reset_index()
mau_payment.head()
mau_payment

區(qū)分新用戶和已有用戶
如果用戶的使用月份和首次使用月份一致,則該用戶為新用戶,否則為已有的用戶,下面我們將對用戶類型進行區(qū)分。

# 增加識別新用戶和已有用戶
mau_payment['user_type'] = np.where(mau_payment['log_month'] == mau_payment['install_month'], 'install', 'existing')
mau_payment.head()
mau_payment

為了確認新用戶是否減少了,按月統(tǒng)計不同用戶類型的消費額,對比發(fā)現(xiàn)7月相比6月新用戶大幅減少。

# 按月份和用戶類型分組求消費金額合計
mau_paymnet_summary = mau_payment.groupby(['log_month', 'user_type'])['payment'].sum().to_frame().reset_index()
Paste_Image.png

數(shù)據(jù)可視化

通過前面的匯總數(shù)據(jù)可以發(fā)現(xiàn)本月與上月之間的差異,但不是特別直觀,所以我們用可視化圖表來表示兩者的差異情況。如下圖,本月相比上月消費額減少,但已有用戶的消費金額并沒有明顯變化,新用戶消費金額減少明顯。

# 按使用月份和用戶類型分組匯總消費金額繪制疊加柱狀圖
mau_payment.groupby(['log_month', 'user_type'])['payment'].sum().unstack().plot(kind='bar', stacked=True, alpha=0.8, rot=True)
plt.ylabel('total_payment')
plt.legend()
plt.show()

兩個月的消費額分布比較

從上面的初步分析結(jié)果可以驗證我們之前的假設(shè),即新用戶數(shù)減少導致銷售額下降。那么具體是哪個消費層級的消費額減少?

先抽取新用戶的消費數(shù)據(jù),將兩個月份的數(shù)據(jù)分別繪制直方圖并重疊對比。橫坐標表示該月的消費金額總計,縱坐標表示相應(yīng)的用戶數(shù)。通過可視化圖表可以看出消費額2000以下的用戶減少了。在社交游戲中,用戶可以用金錢來購買勞動。由于大部分用戶消費得很少,所以你只需要花不多的錢就可以讓自己的排名大幅上升。然而,如果你想占據(jù)排行榜的頂端,那么所要花費的金額馬上就會上漲。這也是人們的競爭心理結(jié)構(gòu)在數(shù)據(jù)分布上的表現(xiàn)。

# 對比不同月份消費金額分布
install_payment = mau_payment[(mau_payment['payment'] > 0) & (mau_payment['user_type'] == 'install')]
data1 = install_payment[install_payment['log_month'] == '2013-06']['payment']
data2 = install_payment[install_payment['log_month'] == '2013-07']['payment']

bins = np.arange(0, 13000, 1000)

data1.hist(bins=bins, alpha=0.7, label='2013-06')
data2.hist(bins=bins, alpha=0.8, label='2013-07')
plt.ylabel('payment')
plt.legend()
plt.show()

解決方案

基于前面的分析結(jié)果,我們可以采取以下解決方案來提高銷售額。
1. 公司恢復(fù)之前營銷宣傳的活動水平,提高潛在用戶對公司產(chǎn)品的認知度
2. 打包小額游戲促銷包,提高小額消費新用戶數(shù)量

最后編輯于
?著作權(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)容

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