實(shí)戰(zhàn) | Python模型分析B站優(yōu)質(zhì)up主
作者 | 遠(yuǎn)辰
來源 | 數(shù)據(jù)不吹牛
不管前浪還是后浪,能夠浪起來的才算是好浪。
相信大家最近都被號(hào)稱“浪里白條”的b站刷了不止一次屏。這次咱們先不談價(jià)值觀,主要從數(shù)據(jù)的角度,扒一扒讓b站能夠在浪里穿梭的資本——優(yōu)質(zhì)UP主。
本文在RFM模型基礎(chǔ)上做了調(diào)整,嘗試用更符合b站特性的IFL模型,找到各分區(qū)優(yōu)質(zhì)up主。整個(gè)過程以分析項(xiàng)目的形式展開,最終附上了完整源數(shù)據(jù)和代碼,方便感興趣的同學(xué)練手。

項(xiàng)目概覽
??分析目的
對(duì)2019年1月~2020年3月發(fā)布的視頻進(jìn)行分析,挑選出視頻質(zhì)量高,值得關(guān)注的up主。
??數(shù)據(jù)來源
分析數(shù)據(jù)基于 bilibili 網(wǎng)站上的公開信息,主要爬取了以下數(shù)據(jù)維度:
2019年1月~2020年3月,科技區(qū)播放量過5w視頻的分區(qū)名稱、作者名稱、作者id、發(fā)布時(shí)間、播放數(shù)、硬幣數(shù)、彈幕數(shù)、收藏?cái)?shù)、點(diǎn)贊數(shù)、分享數(shù)、評(píng)論數(shù),共計(jì)50130行。
? 源數(shù)據(jù)下載鏈接
完整數(shù)據(jù)源和代碼鏈接:https://pan.baidu.com/s/1RIxOxh-TFMey9sGvZLVuJg 提取碼:bhh2

數(shù)據(jù)概覽
視頻信息表:

coins:投硬幣數(shù)
danmu:彈幕數(shù)
favorite:收藏?cái)?shù)
likes:點(diǎn)贊數(shù)
replay:評(píng)論數(shù)
share:分享數(shù)
view:播放量
各字段數(shù)量:

缺失值數(shù)量:


數(shù)據(jù)清洗
??刪除空值
df = df.dropna()
df.info()共刪除了19行數(shù)據(jù),剩余50111行數(shù)據(jù)

df = df.drop_duplicates()
df.info()刪除了1312行重復(fù)的數(shù)據(jù),剩余數(shù)據(jù)量48799行

? 提取所需關(guān)鍵詞
df = df[['分區(qū)', 'author','date','coins','danmu','favorite','likes','replay','share','view']]
df.head()

構(gòu)建模型
RFM模型是衡量客戶價(jià)值和創(chuàng)利能力的重要工具和手段。通過一個(gè)客戶近期購(gòu)買行為、購(gòu)買的總體頻率以及消費(fèi)金額三項(xiàng)指標(biāo)來描述客戶的價(jià)值狀況。
R:最近一次消費(fèi)時(shí)間(最近一次消費(fèi)到參考時(shí)間的間隔)
F:消費(fèi)的頻率(消費(fèi)了多少次)
M:消費(fèi)的金額 (總消費(fèi)金額)
但RFM模型并不能評(píng)價(jià)視頻的質(zhì)量,所以在這里針對(duì)up主的視頻信息構(gòu)建了IFL模型,以評(píng)估視頻的質(zhì)量。
I(Interaction_rate):
I值反映的是平均每個(gè)視頻的互動(dòng)率,互動(dòng)率越高,表明其視頻更能產(chǎn)生用戶的共鳴,使其有話題感。

F值表示的是每個(gè)視頻的平均發(fā)布周期,每個(gè)視頻之間的發(fā)布周期越短,說明內(nèi)容生產(chǎn)者創(chuàng)作視頻的時(shí)間也就越短,創(chuàng)作時(shí)間太長(zhǎng),不是忠實(shí)粉絲的用戶可能將其遺忘。

L(Like_rate):
L值表示的是統(tǒng)計(jì)時(shí)間內(nèi)發(fā)布視頻的平均點(diǎn)贊率,越大表示視頻質(zhì)量越穩(wěn)定,用戶對(duì)up主的認(rèn)可度也就越高。

? 提取需要的信息
根據(jù)不同的分區(qū)進(jìn)行IFL打分,這里以科普區(qū)為例
sc = df.loc[df['分區(qū)']=='科學(xué)科普']
so = df.loc[df['分區(qū)']=='社科人文']
ma = df.loc[df['分區(qū)']=='機(jī)械']
tec = df.loc[df['分區(qū)']=='野生技術(shù)協(xié)會(huì)']
mi = df.loc[df['分區(qū)']=='星海'] # 一般發(fā)布軍事內(nèi)容
car = df.loc[df['分區(qū)']=='汽車']
sc.info()
??關(guān)鍵詞構(gòu)造
F值:首先,先篩選出發(fā)布視頻大于5的up主,視頻播放量在5W以上的視頻數(shù)少于5,說明可能是有些視頻標(biāo)題取得好播放量才高,而不是視頻質(zhì)量穩(wěn)定的up主。
# 計(jì)算發(fā)布視頻的次數(shù)
count = sc.groupby('author')['date'].count().reset_index()
count.columns =['author','times']
# 剔除掉發(fā)布視頻少于5的up主
com_m = count[count['times']>5]
#com_m = pd.merge(count,I,on='author',how='inner')
com_m.info()

篩選完只剩下208個(gè)up主的視頻數(shù)在5個(gè)以上:
last = sc.groupby('author')['date'].max()
late = sc.groupby('author')['date'].min()
# 最晚發(fā)布日期與最早之間的天數(shù)/發(fā)布次數(shù),保留整數(shù),用date重新命名列F =round((last-late).dt.days/sc.groupby('author')['date'].count()).reset_index()
F.columns =['author', 'F']
F = pd.merge(com_m, F,on='author', how='inner')
F.describe()
通過describe()方法發(fā)現(xiàn),最晚發(fā)布日期與最早發(fā)布日期為0的現(xiàn)象,猜測(cè)是在同一天內(nèi)發(fā)布了大量的視頻。
# 查找的一天內(nèi)發(fā)布視頻數(shù)大于5的人F.loc[F['F'].idxmin()]


其視頻皆為轉(zhuǎn)載,將其剔除統(tǒng)計(jì)范圍內(nèi)。
F = F.loc[F['F']>0]
F.describe()
I值
# 構(gòu)建I值danmu = sc.groupby('author')['danmu'].sum()
replay = sc.groupby('author')['replay'].sum()
view = sc.groupby('author')['view'].sum()
count = sc.groupby('author')['date'].count()
I =round((danmu+replay)/view/count*100,2).reset_index() #
I.columns=['author','I']
F_I = pd.merge(F,I,on='author',how='inner')
F_I.head()
L值
# 計(jì)算出點(diǎn)贊率計(jì)算出所有視頻的點(diǎn)贊率sc['L'] =(sc['likes']+sc['coins']*2+sc['favorite']*3)/sc['view']*100
sc.head()
# 構(gòu)建L值L =(sc.groupby('author')['L'].sum()/sc.groupby('author')['date'].count()).reset_index()
L.columns =['author', 'L']
IFL = pd.merge(F_I, L, on='author',how='inner')
IFL = IFL[['author', 'I','F','L']]
IFL.head()
??維度打分
維度確認(rèn)的核心是分值確定,按照設(shè)定的標(biāo)準(zhǔn),我們給每個(gè)消費(fèi)者的I/F/L值打分,分值的大小取決于我們的偏好,即我們?cè)较矚g的行為,打的分?jǐn)?shù)就越高:
I值,I代表了up主視頻的平均評(píng)論率,這個(gè)值越大,就說明其視頻越能使用戶有話題,當(dāng)I值越大時(shí),分值越大。
F值表示視頻的平均發(fā)布周期,我們當(dāng)然想要經(jīng)??吹?,所以這個(gè)值越大時(shí),分值越小。
L值表示發(fā)布視頻的平均點(diǎn)贊率,S值越大時(shí),質(zhì)量越穩(wěn)定,分值也就越大。I/S值根據(jù)四分位數(shù)打分,F(xiàn)值根據(jù)更新周期打分。
IFL.describe()

I值打分:

L值打分:

F值根據(jù)發(fā)布周期打分:

??分值計(jì)算
# bins參數(shù)代表我們按照什么區(qū)間進(jìn)行分組# labels和bins切分的數(shù)組前后呼應(yīng),給每個(gè)分組打標(biāo)簽# right表示了右側(cè)區(qū)間是開還是閉,即包不包括右邊的數(shù)值,如果設(shè)置成False,就代表[0,30)IFL['I_SCORE'] = pd.cut(IFL['I'], bins=[0,0.03,0.06,0.11,1000],
labels=[1,2,3,4], right=False).astype(float)
IFL['F_SCORE'] = pd.cut(IFL['F'], bins=[0,7,15,30,90,1000],
labels=[5,4,3,2,1], right=False).astype(float)
IFL['L_SCORE'] = pd.cut(IFL['L'], bins=[0,5.39,9.07,15.58,1000],
labels=[1,2,3,4], right=False).astype(float)
IFL.head()
判斷用戶的分值是否大于平均值:
# 1為大于均值 0為小于均值IFL['I是否大于平均值'] =(IFL['I_SCORE'] > IFL['I_SCORE'].mean()) *1
IFL['F是否大于平均值'] =(IFL['F_SCORE'] > IFL['F_SCORE'].mean()) *1
IFL['L是否大于平均值'] =(IFL['L_SCORE'] > IFL['L_SCORE'].mean()) *1
IFL.head()
??客戶分層
RFM經(jīng)典的分層會(huì)按照R/F/M每一項(xiàng)指標(biāo)是否高于平均值,把用戶劃分為8類,我們根據(jù)根據(jù)案例中的情況進(jìn)行劃分,具體像下面表格這樣:

引入人群數(shù)值的輔助列,把之前判斷的I\F\S是否大于均值的三個(gè)值串聯(lián)起來:
IFL['人群數(shù)值'] =(IFL['I是否大于平均值'] *100) +(IFL['F是否大于平均值'] *10) +(IFL['L是否大于平均值'] *1)
IFL.head()
構(gòu)建判斷函數(shù),通過判斷人群數(shù)值的值,來返回對(duì)應(yīng)標(biāo)簽:

將標(biāo)簽分類函數(shù)應(yīng)用到人群數(shù)值列:
IFL['人群類型'] = IFL['人群數(shù)值'].apply(transform_label)?
IFL.head()

??各類用戶占比
cat = IFL['人群類型'].value_counts().reset_index()
cat['人數(shù)占比'] = cat['人群類型'] / cat['人群類型'].sum()
cat


各分區(qū)up主排行top15
? 科學(xué)科普分區(qū)
high = IFL.loc[IFL['人群類型']=='高價(jià)值up主']
rank = high[['author','L','I','F']].sort_values('L',ascending=False)
rank.to_excel('rank.xlsx', sheet_name='科學(xué)科普',encoding='utf-8')

??社科人文分區(qū)

??機(jī)械分區(qū)

機(jī)械分區(qū)高價(jià)值up主只有5位,因?yàn)闄C(jī)械分區(qū)在科技區(qū)是個(gè)小分區(qū),發(fā)布視頻的up主僅有54位。

??野生技術(shù)協(xié)會(huì)分區(qū)

??星海

??汽車

參考文章:
1.數(shù)據(jù)不吹牛:《不到70行Python代碼,輕松玩轉(zhuǎn)RFM用戶分析模型》
2.Crossin:《B站用戶行為分析非官方報(bào)告》
3.https://github.com/Vespa314/bilibili-api/blob/master/api.md
今天為大家提供了一種數(shù)據(jù)分析的模型,用于發(fā)掘優(yōu)質(zhì)up主,大家完全可以參照這種方式去發(fā)掘其他事物。
完整數(shù)據(jù)源和代碼鏈接:https://pan.baidu.com/s/1RIxOxh-TFMey9sGvZLVuJg?提取碼:bhh2
End
