項(xiàng)目簡(jiǎn)介:
這是一個(gè)音樂(lè)服務(wù)數(shù)據(jù)集,項(xiàng)目里有個(gè)小型的數(shù)據(jù)集。該數(shù)據(jù)集記錄藝術(shù)家,歌曲,時(shí)長(zhǎng),包括一些人口統(tǒng)計(jì)和地理數(shù)據(jù),時(shí)間戳,性別,用戶等級(jí),用戶操作記錄信息(即具體操作如主頁(yè)、升級(jí)、降級(jí)、播放歌曲、添加歌單,添加好友等);這些數(shù)據(jù)很重要,可以數(shù)據(jù)中發(fā)現(xiàn)用戶的喜好;本次項(xiàng)目的目的是預(yù)測(cè)用戶的流失;本次項(xiàng)目通過(guò)一系列的數(shù)據(jù)分析,觀察留存用戶和流失用戶的行為,尋找他們的共同特征,然后通過(guò)機(jī)器學(xué)習(xí)預(yù)測(cè)客戶的流失;
運(yùn)行環(huán)境
Python3.7
PySpark 2.4.5
Jupyter notebook
pandas
numpy
pyspark
matplotlib
seaborn
參考文獻(xiàn)
分析流程
一:加載和清洗數(shù)據(jù)
首先我們要加載數(shù)據(jù),觀察數(shù)據(jù)集,目測(cè)評(píng)估數(shù)據(jù);

查看數(shù)據(jù)集結(jié)構(gòu):

我們通過(guò)查詢,發(fā)現(xiàn)userId數(shù)據(jù)有缺失值,需要對(duì)數(shù)據(jù)進(jìn)行清理;得到一份比較整潔對(duì)數(shù)據(jù);

二:探索性數(shù)據(jù)分析
1.定義用戶流失
完成數(shù)據(jù)清理后,我們?cè)賮?lái)對(duì)項(xiàng)目目的進(jìn)行針對(duì)性的分析;首先我們要明確什么是客戶流失,因?yàn)槲覀冺?xiàng)目的目的是要預(yù)測(cè)客戶的流失情況,我們這里表結(jié)構(gòu)里面的page特征(用戶操作事件字段)下面有個(gè)Cancellation Confirmation(取消事件)類型,我們可以通過(guò)這個(gè)來(lái)區(qū)分用戶是流失用戶還是留存用戶;下面我們通過(guò)代碼來(lái)創(chuàng)建一列?Churn,0為留存用戶,1為流失用戶;


2.分析跟用戶流失相關(guān)的重要特征
通過(guò)上面分析我們知道用戶流失churn是在page字段里面提取出來(lái),那page字段里面其他類型是否也跟用戶流失churn有很大關(guān)聯(lián),我們通過(guò)可視化分析圖表展示;
下面我們來(lái)看churn狀態(tài)和非churn狀態(tài)的用戶操作page事件次數(shù)多少;


可以看出不管在那個(gè)狀態(tài)下,用戶都是操作nextsong較多,所以聽歌newsong這個(gè)特征也比較重要;由于nextsong的數(shù)量太多,其他page事件無(wú)法看清楚,下面我們查詢不是newsong的其他page事件的數(shù)據(jù);

現(xiàn)在看起來(lái)比較好,下面我們來(lái)整合排序一下,查看churn狀態(tài)和非churn狀態(tài)的用戶操作page事件次數(shù)比例如何:


countrate的值越小,證明churn/nochurn的反差越大,about這個(gè)感覺(jué)沒(méi)什么用, 我認(rèn)為可以考慮error,Submit Downgrade,Thumbs Up,Add Friend, Add to Playlist,NextSong,Downgrade等字段次數(shù)特征;
下面我們來(lái)分析其他字段特征,從上面我們知道用戶nextsong比較多,就是說(shuō),在音樂(lè)平臺(tái)上,用戶都是聽歌的比較多,所以我們可以統(tǒng)計(jì)一下churn狀態(tài)和非churn狀態(tài)的用戶聽歌的時(shí)長(zhǎng),用戶聽歌的時(shí)長(zhǎng)也是一個(gè)重要特征;
首先我們要新建幾列,查看用戶在hour,weekday,month等時(shí)間段聽歌的差異;




從時(shí)間段來(lái)看用戶在白天聽歌比較小,在晚上聽歌較多,還有用戶在周二到周五聽歌多點(diǎn),聽歌時(shí)長(zhǎng)也可以作為一個(gè)特征分析;
下面我們來(lái)分析一下其他字段的,從表結(jié)構(gòu)來(lái)看,gender(性別),level(等級(jí))跟用戶流失也有關(guān)聯(lián),下面通過(guò)圖表來(lái)分析一下;


從圖表可以看出性別為男的流失較多,還有等級(jí)為free流失較多;可以作為關(guān)聯(lián)特征;
3. 從上面分析來(lái),我認(rèn)為比較重要的特征有以下幾個(gè):
- gender:性別
- level:等級(jí)
- song_time:聽歌時(shí)長(zhǎng)
- error_count:error數(shù)量
- Submit Downgrade_count:Submit Downgrade數(shù)量
- ThumbsUp_count:Thumbs Up數(shù)量
- AddFriend_count:Add Friend數(shù)量
- AddPlaylist_count:Add to Playlist數(shù)量
- Song_count:NextSong數(shù)量
- Downgrade_count:Downgrade數(shù)量
三:建模
對(duì)于數(shù)據(jù)建模方面,我通過(guò)以下幾個(gè)模型進(jìn)行訓(xùn)練
-Logistic Regression
-Gradient Boosted Trees
-Support Vector Machine
-Random Forest
訓(xùn)練模式使用了CrossValidator進(jìn)行了模型參數(shù)調(diào)優(yōu);模型參數(shù)如下:

調(diào)參后,我整合了四個(gè)模型的訓(xùn)練方法,下面我定義了一個(gè)getAccuracyAndF1Scores函數(shù),返回獲取準(zhǔn)確率Accuracy跟F1Scores,我們把模型名稱,調(diào)參CrossValidator的參數(shù)傳進(jìn)去,運(yùn)行該函數(shù)就可以得到相應(yīng)模型的準(zhǔn)確率Accuracy跟F1Scores;函數(shù)方法如下:

這里我們使用F-1評(píng)分作為指標(biāo);具體代碼可以在文章下面git鏈接查看,通過(guò)訓(xùn)練我們得出4個(gè)模型的訓(xùn)練分?jǐn)?shù);

從結(jié)果來(lái)看四個(gè)模型的訓(xùn)練結(jié)果都差別不大;LogisticRegression跟SupportVectorMachine(SVM)的分?jǐn)?shù)較高,在訓(xùn)練過(guò)程中SupportVectorMachine(SVM)的用時(shí)較少,個(gè)人認(rèn)為在四個(gè)模型中SupportVectorMachine(SVM)最好,
數(shù)據(jù)建模方面,可能對(duì)建模這方面還不是很熟練,特別調(diào)參方面,可能導(dǎo)致預(yù)測(cè)不是很準(zhǔn)確;后面需要加強(qiáng)建模及調(diào)參數(shù)的的訓(xùn)練, 這次項(xiàng)目模型運(yùn)行的時(shí)間較長(zhǎng)這里沒(méi)辦法實(shí)踐太多次;
最后,謝謝大家查閱,如果大家有什么好的建議及有哪些可以改進(jìn)的地方,可以留下評(píng)論;謝謝!