程序員用Python分析中國(guó)演員排名,票房最高的是意料之中的他

項(xiàng)目背景

專(zhuān)注于為中小企業(yè)提供成都網(wǎng)站制作、成都做網(wǎng)站、外貿(mào)營(yíng)銷(xiāo)網(wǎng)站建設(shè)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)湘西土家族免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了上千余家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。

一個(gè)同學(xué)開(kāi)了間影視投資公司,出于對(duì)創(chuàng)業(yè)人員的仰慕和影視投資行業(yè)的好奇,我就跟他寒暄了幾句,聊天當(dāng)中他提及到國(guó)慶節(jié)有部《攀登者》即將上映,預(yù)計(jì)票房會(huì)大好,因?yàn)閰蔷┦沁@部片的主演。然后我就想,目前吳京在國(guó)內(nèi)演員中位列幾何呢?正好之前爬了貓眼電影數(shù)據(jù),基于Python數(shù)據(jù)分析的方式,分析中國(guó)演員排名情況。

數(shù)據(jù)導(dǎo)入

導(dǎo)入之前爬取到的貓眼數(shù)據(jù),由于爬取過(guò)程不是本文的主要內(nèi)容,所以簡(jiǎn)單描述下數(shù)據(jù)情況:20110101至20191019年在中國(guó)上映,并且有用戶評(píng)分和票房的影片,總共是2923部。

import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
pd.set_option('display.max_columns', None)
pd.set_option('display.max_rows', None)
# 加載數(shù)據(jù)
def load_data():
 # 加載電影票房
 open_filepath = 'D:\pythondata\\3、貓眼電影\\box_result.csv'
 movie_box = pd.read_csv(open_filepath)
 movie_box = movie_box[['電影id', '電影名稱(chēng)','首映日期','總票房']].drop_duplicates()
 # 加載電影信息
 open_filepath = 'D:\pythondata\\3、貓眼電影\\maoyan_movie.xlsx'
 movie_message = pd.read_excel(open_filepath,sheet_name='maoyan_movie')
 movie_message.columns = ['電影url','電影名稱(chēng)','電影題材','國(guó)家','上映時(shí)間','用戶評(píng)分','電影簡(jiǎn)介','導(dǎo)演/演員/編劇']
 movie_message = movie_message[['電影url','電影題材','國(guó)家','用戶評(píng)分','導(dǎo)演/演員/編劇']].copy()
 movie_message.drop_duplicates(inplace=True)
 movie_message['電影id'] = movie_message.apply(lambda x:x['電影url'].replace('https://maoyan.com/films/',''),axis=1)
 movie_message[['電影id']] = movie_message[['電影id']].apply(pd.to_numeric)
 # 合并電影信息和票房
 data = pd.merge(movie_box,movie_message,how='inner',on=['電影id'])
 return data
程序員用 Python 分析中國(guó)演員排名,票房最高的是意料之中的他


數(shù)據(jù)處理

由于此次只分析中國(guó)演員,所以需要剔除國(guó)外影片,并將每部影片的演員列表從字段“導(dǎo)演/演員/編劇”中分割出來(lái)。

# 只篩選中國(guó)的電影
data = data[data['國(guó)家'].str.contains('中國(guó)')]
# 剔除空值
data = data.dropna(subset=["導(dǎo)演/演員/編劇"])
# 將演員列表從字段“導(dǎo)演/演員/編劇”中分割出來(lái)
data['演員'] = data.apply(lambda x:x['導(dǎo)演/演員/編劇'] if '演員' in x['導(dǎo)演/演員/編劇'] else None,axis=1)
data['演員list'] = data.apply(lambda x: ','.join(x['演員'].split('yyyyy')[1].split('xxxxx')[2:]) if pd.notnull(x['演員']) else None,axis=1)
# 剔除無(wú)演員列表的行
data = data.dropna(subset=["演員list"])
# 剔除無(wú)用字段
data.drop(['導(dǎo)演/演員/編劇'],axis=1,inplace=True)
data.drop(['演員'],axis=1,inplace=True)
程序員用 Python 分析中國(guó)演員排名,票房最高的是意料之中的他

因?yàn)榭紤]到配音類(lèi)型的影片是看不到演員本人的,所以需要剔除配音類(lèi)型影片。再將演員列表從行轉(zhuǎn)置列,使得每行電影名稱(chēng)和演員是一一對(duì)應(yīng)的。由于貓眼電影已經(jīng)按照演員的出場(chǎng)頻率進(jìn)行排序,所以每部影片取前四名演員,作為影片主演,其中多明星合拍的影片,如《我和我的祖國(guó)》就改為取前十名。

# 拆分演員列表,并轉(zhuǎn)置成一列
data = data.drop("演員list", axis=1).join(data["演員list"].str.split(",", expand=True).stack().reset_index(level=1, drop=True).rename("演員"))
# 剔除配音演員
data = data[~data['演員'].str.contains('配音')]
data['演員'] = data.apply(lambda x: x['演員'].split('飾:')[0] if '飾:' in x['演員'] else x['演員'], axis=1)
# 剔除分割演員名稱(chēng)錯(cuò)誤的行
data = data[~data['演員'].str.contains('uncredited')]
data = data[~data['演員'].str.contains('voice')]
data = data[~data['演員'].str.contains('Protester')]
# 取每部電影的前四名演員,部分影片特殊
data_actor = data[['電影id','電影名稱(chēng)','演員']].drop_duplicates()
data_actor_top4 = data_actor[data_actor['電影名稱(chēng)']!='我和我的祖國(guó)'].groupby(['電影id','電影名稱(chēng)']).head(4)
data_actor_top10 = data_actor[data_actor['電影名稱(chēng)']=='我和我的祖國(guó)'].groupby(['電影id','電影名稱(chēng)']).head(10)
data_actor_top4 = pd.concat([data_actor_top4,data_actor_top10])
# 剔除外國(guó)演員
data_actor_top4['演員名字長(zhǎng)度'] = data_actor_top4.apply(lambda x: len(x['演員']),axis=1)
data_actor_top4 = data_actor_top4[(data_actor_top4['演員名字長(zhǎng)度']<=3)].copy()
data_actor_top4.drop("演員名字長(zhǎng)度",axis = 1,inplace=True)
# 匹配
data = pd.merge(data,data_actor_top4,how='inner',on=['電影id','電影名稱(chēng)','演員'])
程序員用 Python 分析中國(guó)演員排名,票房最高的是意料之中的他

然后,拆分每部電影的電影題材類(lèi)型并進(jìn)行轉(zhuǎn)置,再匯總每個(gè)演員出演過(guò)的電影題材,排序后取前三個(gè)類(lèi)型,作為演員的拿手題材。

# 拆分電影題材
data = data.join(data["電影題材"].str.split(",",expand = True).stack().reset_index(level = 1,drop = True).rename("題材"))
# 取每位演員最擅長(zhǎng)的電影題材TOP3
data_type_actor = data[['電影id','電影名稱(chēng)','演員','題材']].drop_duplicates().groupby(['演員', '題材']).agg({'電影id': 'count'}).reset_index().sort_values(['演員','電影id'],ascending=False)
data_type_actor = data_type_actor.groupby(['演員']).head(3)
data_type_actor = data_type_actor.groupby(['演員'])['題材'].apply(list).reset_index()
data_type_actor['題材'] = data_type_actor['題材'].apply(lambda x: ','.join(str(i) for i in list(set(x)) if str(i) != 'nan'))
data_type_actor.rename(columns={'題材': '演員_拿手題材'}, inplace=True)
data = pd.merge(data,data_type_actor,how='left',on=['演員'])
程序員用 Python 分析中國(guó)演員排名,票房最高的是意料之中的他

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

目前只有“演員總票房”和“影片平均評(píng)分”兩個(gè)字段,可用作描述一個(gè)演員綜合能力,所以需要衍生一些字段:

電影數(shù)量:統(tǒng)計(jì)演員主演過(guò)的影片數(shù)量;

大于10億票房影片數(shù)量:匯總單部影片票房大于10億的數(shù)量;

大于10億票房影片計(jì)分:按照不同票房區(qū)間賦予分值,再匯總;

由于部分演員只出演過(guò)一部影片,屬于單樣本,若不剔除,會(huì)影響各項(xiàng)指標(biāo)的數(shù)值分布。

actor = result[['演員','總票房','用戶評(píng)分']].drop_duplicates()
# 衍生字段:平均票房、大于10億票房影片、大于10億票房影片計(jì)分
actor['用戶評(píng)分'] = actor.apply(lambda x:0 if x['用戶評(píng)分']=='暫無(wú)評(píng)分' else x['用戶評(píng)分'],axis=1)
actor['大于10億票房影片數(shù)量'] = actor.apply(lambda x:1 if x['總票房']>100000 else 0,axis=1)
# 按照票房賦予分值
def goal(x):
 if x['總票房']<=100000:
 division_goal = 0
 elif x['總票房']<=200000:
 division_goal = 1
 elif x['總票房'] <= 300000:
 division_goal = 2
 elif x['總票房'] <= 400000:
 division_goal = 3
 elif x['總票房'] <= 500000:
 division_goal = 4
 else:
 division_goal = 5
 return division_goal
actor['大于10億票房影片計(jì)分'] = actor.apply(goal,axis=1)
actor['電影數(shù)量'] = 1
actor['用戶評(píng)分'] = pd.to_numeric(actor['用戶評(píng)分'])
actor['大于10億票房影片數(shù)量'] = pd.to_numeric(actor['大于10億票房影片數(shù)量'])
actor['大于10億票房影片計(jì)分'] = pd.to_numeric(actor['大于10億票房影片計(jì)分'])
# 匯總
actor2 = actor.groupby(['演員']).agg({'總票房': 'sum',
 '大于10億票房影片數(shù)量': 'sum',
 '大于10億票房影片計(jì)分': 'sum',
 '電影數(shù)量': 'count',
 '用戶評(píng)分':'mean',}).reset_index()
# 篩選影片數(shù)量大于1的行——只有一部影片的演員設(shè)為單樣本,會(huì)影響標(biāo)準(zhǔn)化的結(jié)果
actor2 = actor2[actor2['電影數(shù)量']>1].reset_index(drop=True)
程序員用 Python 分析中國(guó)演員排名,票房最高的是意料之中的他

最后,由于數(shù)值字段之間的量綱不同,需要進(jìn)行標(biāo)準(zhǔn)化處理后才可以進(jìn)行比較?!把輪T總票房”的高低是衡量一個(gè)演員能力的重要因素,這里筆者將“大于10億票房影片數(shù)量”和“大于10億票房影片計(jì)分”也作為兩點(diǎn)重要因素,而“影片平均評(píng)分”和“電影數(shù)量”作為次要因素,最終標(biāo)準(zhǔn)化處理后的計(jì)算公式:

總分=演員總票房+大于10億票房影片數(shù)量+大于10億票房影片計(jì)分+0.5*影片平均評(píng)分+0.5*電影數(shù)量

這里筆者曾用K-means聚類(lèi)算法將演員劃分為四個(gè)集群,通過(guò)查看集群的分布情況后發(fā)現(xiàn),劃分結(jié)果與上述公式計(jì)算后的總分排名情況十分相似(比如,總分1-20名劃分成集群1,21-50名劃分成集群2),所以取消了用聚類(lèi)算法的方式劃分演員檔次。

# 復(fù)制一份副本
actor_copy = actor2.copy()
# 標(biāo)準(zhǔn)化處理
scaler = StandardScaler()
numeric_features = actor2.dtypes[actor2.dtypes != 'object'].index
scaler.fit(actor2[numeric_features])
scaled = scaler.transform(actor2[numeric_features])
for i, col in enumerate(numeric_features):
 actor2[col] = scaled[:, i]
# 劃分演員檔次:權(quán)重求和,根據(jù)分值排序
result = actor2.apply(lambda x: x['總票房']+x['大于10億票房影片數(shù)量']+x['大于10億票房影片計(jì)分']+0.5*x['電影數(shù)量']+0.5*x['用戶評(píng)分'],axis=1)
# # 劃分演員檔次——方法2:采用聚類(lèi)算法,自動(dòng)分成4個(gè)組
# actor_model = actor2[['總票房', '大于10億票房影片數(shù)量', '大于10億票房影片計(jì)分','電影數(shù)量','用戶評(píng)分']].values
# y_pred = KMeans(n_clusters=4, random_state=9).fit_predict(actor_model)
# result2 = pd.Series(y_pred)
# 合并兩種結(jié)果
model_actor_reuslt = pd.concat([actor_copy, result], axis=1)
model_actor_reuslt.rename(columns={0: '總分'},inplace=True)
model_actor_reuslt = model_actor_reuslt.sort_values('總分',ascending=False).reset_index(drop=True)
程序員用 Python 分析中國(guó)演員排名,票房最高的是意料之中的他

數(shù)據(jù)描述

由于工作上經(jīng)常使用BI工具tableau進(jìn)行圖表制作,因此下列的圖表均用tableau繪制。其實(shí)pyecharts生成的圖表也十分美觀,為了方便這里就不用這個(gè)庫(kù)畫(huà)圖了,有興趣的小伙伴也可以了解下這個(gè)庫(kù)。

先從整體上對(duì)電影的概況進(jìn)行描述分析,才能更好地理解演員各項(xiàng)指標(biāo)高低的優(yōu)劣程度。首先,2011年至今,國(guó)內(nèi)上映的影片總共是2129部,其中10億票房以上的影片只有39部,占了總體的0.02%。

程序員用 Python 分析中國(guó)演員排名,票房最高的是意料之中的他

圖1-1 電影總數(shù)

目前國(guó)內(nèi)影片最高票房已經(jīng)到50-60億之間,只有一部。40-50億只有兩部,大部分10億以上的票房都集中在10-20億之間。

程序員用 Python 分析中國(guó)演員排名,票房最高的是意料之中的他

圖1-2 電影票房區(qū)間

整體上,劇情、喜劇和愛(ài)情類(lèi)型的電影題材拍得最多,而災(zāi)難類(lèi)型的電影最少。從熱門(mén)和冷門(mén)的電影題材中,很好地詮釋了“報(bào)喜不報(bào)憂”這句成語(yǔ),畢竟每個(gè)走進(jìn)電影院的人都希望能輕松愉快地度過(guò)這兩個(gè)小時(shí)。所以10億以上票房的影片中,喜劇類(lèi)型的電影題材反而排在了第一位。

程序員用 Python 分析中國(guó)演員排名,票房最高的是意料之中的他

圖1-3 電影題材

從電影上映時(shí)間軸中可以看出,整體上,17年之前上映的影片逐年增加,但在17年之后有所下降。而10億以上票房的影片每年都在增加,側(cè)面說(shuō)明近幾年國(guó)內(nèi)電影影片質(zhì)量有所上升。

程序員用 Python 分析中國(guó)演員排名,票房最高的是意料之中的他

圖1-4 電影上映時(shí)間軸

最后,將全部圖表放到同一個(gè)儀表板中,可以很方便地看到10億以上票房的影片分布情況,以及具體的影片名稱(chēng)。其中,2012年的《人在囧途之泰囧》是國(guó)內(nèi)第一部10億+票房影片,2015年的《捉妖記》是首部20億+票房影片,2016年的《美人魚(yú)》是首部30億+票影片,2017年的《戰(zhàn)狼2》是首部50億+票房影片,而2019年的《流浪地球》和《哪吒之魔童降世》是唯一兩部40億+票房影片。從這個(gè)時(shí)間軸可以看出,自2015年起,每年最高票房都比前年多出10億以上。

程序員用 Python 分析中國(guó)演員排名,票房最高的是意料之中的他

圖1-5 電影概況

根據(jù)上述的計(jì)算公式得到總分TOP10的名單,前三名分別是黃渤、吳京和沈騰。這也難怪筆者的同學(xué)會(huì)對(duì)吳京出演的影片信心那么高。

程序員用 Python 分析中國(guó)演員排名,票房最高的是意料之中的他

圖2-1 演員總分排名

匯總每個(gè)演員主演的電影票房后,得到總票房TOP10的名單,目前國(guó)內(nèi)百億票房均是男演員,分別是吳京、黃渤、杜江和沈騰。其中吳京已經(jīng)是150億票房冠軍,而讓筆者比較意想不到的是杜江也上了百億榜,雖然他參演的幾部熱門(mén)影片,如《紅海行動(dòng)》、《我和我的祖國(guó)》和《中國(guó)機(jī)長(zhǎng)》都不是第一主演,但這幾部都是10億+票房影片,是不是能說(shuō)明他存在某些旺票房特質(zhì)呢?

程序員用 Python 分析中國(guó)演員排名,票房最高的是意料之中的他

圖2-2 演員總票房

再來(lái)看看演員電影數(shù)量TOP10的分布情況,可以看到前幾名都是香港演員,其中古天樂(lè)在7年內(nèi)主演了36部影片,位列榜首。除了影片數(shù)量位列榜首外,其實(shí)平平無(wú)奇的古仔已經(jīng)默默地捐贈(zèng)了100多所學(xué)校,這也許就是他當(dāng)上電影“勞?!钡脑虬?。

程序員用 Python 分析中國(guó)演員排名,票房最高的是意料之中的他

圖2-3 演員電影數(shù)量

最后,將上述三張圖表和詳細(xì)列表放到同個(gè)儀表板中,就可以清楚地知道,能夠位列前茅的演員都是主演過(guò)多部影片,并且擁有多部10億+票房影片。其中有一個(gè)比較有趣的地方是王寶強(qiáng)的影片平均評(píng)分是6.3,但他仍然能夠排到第七名,原因是他主演過(guò)幾部評(píng)分在5分以下的影片,才導(dǎo)致他平均評(píng)分會(huì)這么低。

程序員用 Python 分析中國(guó)演員排名,票房最高的是意料之中的他

圖2-4 演員概況

結(jié)語(yǔ)

本文旨在讓大家了解一下國(guó)內(nèi)電影的整體概況和演員概況,所以只是簡(jiǎn)單地對(duì)數(shù)據(jù)進(jìn)行描述性分析,并沒(méi)有運(yùn)用到機(jī)器學(xué)習(xí)這方面的知識(shí)。一般地,描述性分析是做數(shù)據(jù)分析必不可少的一步,通過(guò)簡(jiǎn)單的幾個(gè)圖表就能直觀地對(duì)數(shù)據(jù)有整體上的認(rèn)知。

名稱(chēng)欄目:程序員用Python分析中國(guó)演員排名,票房最高的是意料之中的他
文章位置:http://www.muchs.cn/article36/gjgipg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、小程序開(kāi)發(fā)、網(wǎng)站策劃、域名注冊(cè)、、網(wǎng)站設(shè)計(jì)公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁(yè)設(shè)計(jì)公司