基于漫威系列電影好看程度排序

引申問題

在選擇電影時,如果熱門電影A有 10000 人觀眾打分,冷門電影B有 100 個人打分,他們的豆瓣評分都是 8.0 分,怎么比較兩部電影的好壞?平時我們都有一種感覺,很多人去評價,這個東西就更可信,只有一兩個人說好,可能是托,那么感覺上是電影A更好。

再例如《漫威》系列電影中,距離《復仇者聯(lián)盟4》上映一周,豆瓣分都是 8.1 分的《鋼鐵俠》和《復仇者聯(lián)盟3》,《鋼鐵俠》有 353695 人評價打分,《復仇者聯(lián)盟3》有 557491 人評價打分,這兩部電影是否一樣好看?

image

image

貝葉斯平均

截止至 2019/4/27 ,漫威系列 21 部電影按照豆瓣評分如下排序:

image

排名第一的是預售票房破7億《復仇者聯(lián)盟4》,準確來說這還不是 很嚴謹 的對比。一個合理的思路是,如果要比較兩部電影的好壞,至少應該請同樣多的觀眾觀看和評分。既然《鋼鐵俠》的觀眾人數(shù)偏少,那么應該設(shè)法為它 “增加” 一些觀眾。

貝葉斯平均(Bayesian Model Averaging) 是動態(tài)建模中融合集合預報信息的統(tǒng)計后處理方法。通俗來講就是:

能夠在不知道結(jié)果的情況下,會自己先估計一個值,然后不斷用新的信息修正,使得它越來越接近自身正確的值。

貝葉斯平均值公式如下:

WR = \frac{v}{v+m}R+\frac{m}{v+m}C=\frac{vR+mC}{v+m}

- WR, 加權(quán)得分(weighted rating)
- R, 對象現(xiàn)有平均得分。
- v, 參與為這個對象打分的人數(shù)。
- m, 全局平均每個對象的評分人數(shù)。
- C, 全局平均每個對象的平均得分。

排序邏輯

合理驗證《漫威》系列電影的好評排序,按照《漫威》電影時間線獲取每一步電影的:電影名、打分的人數(shù)、每個星級的占比:

image

根據(jù)公式獲取每個電影的平均得分 R、m、 C,計算公式為:

R = average\_stars = \frac{rating\_people*start5*5+rating\_people*start4*4+rating\_people*start3*3+rating\_people*start2*2+rating\_people*start1*1}{rating\_people}

m = average(rating\_people) , C = average(average\_stars)

得到最新的 貝葉斯平均排序(rank_bayes) 結(jié)果如下所示,和原有的 豆瓣評分排序(rank_stars) 對比如下:

image
豆瓣分都是 8.1 分的《鋼鐵俠》和《復仇者聯(lián)盟3》,《復仇者聯(lián)盟3》的 貝葉斯平均得分 比 《鋼鐵俠》好,《復仇者聯(lián)盟3》比《鋼鐵俠》好看!

最終的排序是:

《復仇者聯(lián)盟4》>《復仇者聯(lián)盟3》>《復仇者聯(lián)盟》>《鋼鐵俠》>《銀河護衛(wèi)隊》>《銀河護衛(wèi)隊2》>《美國隊長2》>《美國隊長3》>《鋼鐵俠3》>《蟻人》>《鋼鐵俠2》>《雷神2》>《雷神3》>《蜘蛛俠:英雄歸來》>《復仇者聯(lián)盟2》>《蟻人2》>《無敵浩克》>《雷神》>《驚奇隊長》>《美國隊長》>《奇異博士》>《黑豹》

*彩蛋:豆瓣分除以2就是每個電影的平均得分 R *

貝葉斯平均代碼

# 計算對象現(xiàn)有平均分
def average_stars_apply(rating_people,start5,start4,start3,start2,start1):
    average_stars = (rating_people*start5*5+rating_people*start4*4+rating_people*start3*3+rating_people*start2*2+rating_people*start1*1)/rating_people
    return round(average_stars,2)

# 計算貝葉斯平均
def bayes_score_apply(R,v,m,C):
    return (v*R+m*C)/(v+m)

# 主函數(shù)
def bayes_score(dataFrame):
    df = dataFrame.copy()
    df["average_stars"] = dataFrame.apply(lambda row: average_stars_apply(row['rating_people'], row['start5'],row['start4'], row['start3'],row['start2'],row['start1']), axis=1)
    m = df.mean().rating_people
    C = df.mean().average_stars
    df["bayes_score"] = df.apply(lambda row: bayes_score_apply(row['average_stars'], row['rating_people'], m, C), axis=1)
    return df

計算結(jié)果:

image

拓展場景

淘寶天貓 的商品評價下,有對某家店鋪的評價等級,在用戶購買量不對等,但是評分卻一樣的情況下,計算競品 商品店鋪 在用戶眼里的排序:

image

隨意找到兩家賣男裝的店鋪A店鋪B,他們的評分如下所示:

image

他們的店鋪評分一樣都是 4.8 分,店鋪A的評價人數(shù)是 450787,店鋪B的評價人數(shù)是 198491 ,感覺店鋪A評價人多一點感覺可信一些 ,那么有如下條件:

R_A=\frac{450787*0.8984*5+450787*0.0536*4+450787*0.0248*3+450787*0.0058*2+450787*0.0174*1}{450787}=4.8098 , v_A=450787

R_B=\frac{198491*0.9240*5+198491*0.0366*4+198491*0.0172*3+198491*0.0051*2+198491*0.0171*1}{198491}=4.8453 , v_B=198491

m=\frac{450787 +198491}{2}=324639 , C=\frac{4.8098+4.8453}{2}=4.82755

將上述數(shù)值帶入公式計算得到:

WR =\frac{vR+mC}{v+m}

WR_A = \frac{v_A*R_A+m*C}{v_A+m} = \frac{450787 *4.8098 +324639 *4.82755}{450787 +324639 }=4.81723119556218

WR_B = \frac{v_B*R_B+m*C}{v_B+m} = \frac{198491 *4.8453 +324639 *4.82755}{198491 +324639 }=4.83428487517443

實時證明:店鋪B優(yōu)于店鋪A ,店鋪B雖然評價的人數(shù)少,但是好評上還是比店鋪A多,整體比店鋪A好

缺陷

假設(shè):電影A有10個觀眾評分,5個為五星,5個為一星;電影B也有10個觀眾評分,都給了三星,這兩部電影在貝葉斯分數(shù)是一樣的,即:

R_A=\frac{5*5+5*1}{10}=3 , R_B=\frac{10*3}{10}=3 , m=\frac{10+10}{2}=10, C=\frac{3+3}{2}=3

WR_A = \frac{v_A*R_A+m*C}{v_A+m} = \frac{10*3+10*3}{10+10}=3

WR_B = \frac{v_B*R_B+m*C}{v_B+m} = \frac{10*3+10*3}{10+10}=3

計算結(jié)果完全一樣!

結(jié)論

豆瓣評分主要是依據(jù)平均分所得,當在評價人數(shù)不同但是豆瓣分一樣的情況下,就可以使用貝葉斯評分繼續(xù)判別電影的好壞

下載

關(guān)注公眾號【機器學習和大數(shù)據(jù)挖掘】,回復【漫威】即可下載原始數(shù)據(jù)和代碼

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

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

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