豆瓣電影的核心數據(對豆瓣電影TOP250進行數據分析之後)
2023-07-05 03:43:49 2
上次我們對豆瓣 TOP250 電影進行了抓取,今天我們就對這批數據分析一波,看看可以找到什麼結論。
今天主要分析以下幾個點。
什麼類型的電影上榜數量最多。
上榜數量最多的國家和地區是哪裡。
上榜次數最多的導演和演員都有誰。
電影的排名和評論人數以及評分人數有沒有關係。
上榜電影中人們更喜歡用哪些標籤給電影做標註。
數據清洗一般來說我們得到的數據都不是可以直接拿來現用的,因為裡面可能存在著空值,重複值,異常值等各種情況。這些統稱為髒數據,所以我們第一步就要對髒數據做清洗,將其轉化為合格數據。
我們獲取到的數據都是以 json 串的格式存放在一個 txt 文件中。先將這些數據讀取出來,放入到 DataFrame 中去。
數據格式如下
{'index': 1, 'title': '肖申克的救贖 The Shawshank Redemption', 'url': 'https://movie.douban.com/subject/1292052/', 'director': '弗蘭克·德拉邦特', 'actor': '蒂姆·羅賓斯#摩根·弗裡曼#鮑勃·岡頓#威廉姆·賽德勒#克蘭西·布朗#吉爾·貝羅斯#馬克·羅斯頓#詹姆斯·惠特摩#傑弗裡·德曼#拉裡·布蘭登伯格#尼爾·吉恩託利#布賴恩·利比#大衛·普羅瓦爾#約瑟夫·勞格諾#祖德·塞克利拉#保羅·麥克蘭尼#芮妮·布萊恩#阿方索·弗裡曼#V·J·福斯特#弗蘭克·梅德拉諾#馬克·邁爾斯#尼爾·薩默斯#耐德·巴拉米#布賴恩·戴拉特#唐·麥克馬納斯', 'country': '美國', 'year': '1994', 'type': '劇情#犯罪', 'comments': '全部 340688 條', 'runtime': '142分鐘', 'average': '9.7', 'votes': '1885235', 'rating_per': '85.0%#13.4%', 'tags': '經典#勵志#信念#自由#人性#人生#美國#希望'}
首先導入我們今天需要用到的包。
import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport matplotlibfrom wordcloud import WordCloud
content = []with open(file) as f: line = f.readline while line: line = eval(line) content.append(line) line = f.readlined = pd.DataFrame(content)
下面來看看數據的基本信息。
print(d.info)print(len(d.title.unique))# 結果如下RangeIndex: 250 entries, 0 to 249Data columns (total 14 columns):actor 250 non-null objectaverage 250 non-null objectcomments 250 non-null objectcountry 250 non-null objectdirector 250 non-null objectindex 250 non-null int64rating_per 250 non-null objectruntime 250 non-null objecttags 250 non-null objecttitle 250 non-null objecttype 250 non-null objecturl 250 non-null objectvotes 250 non-null objectyear 250 non-null objectdtypes: int64(1), object(13)memory usage: 27.4 KBNone250
共計 250 行,14 列,除 index 為 int 類型之外,其餘全是 object 類型,沒有缺失值,且沒有重複名字的電影,說明數據是完整的。
咱們先來看康什麼類型的電影上榜數量最多。
因為一個電影往往有較多的類型標籤,所以我們需要對數據做一下分割。
types = d['type'].str.split('#', expand=True)print(types)# 輸出結果 0 1 2 3 40 劇情 犯罪 None None None1 劇情 愛情 同性 None None......248 劇情 None None None None249 動作 科幻 驚悚 犯罪 None
進過分割操作之後我們發現,有的電影多達五個標籤,對於這麼多的 None 值,可以先按列計數,然後將空值 None 替換為 0,最後再按行匯總,統計出每個類型的總數即可。
types.columns = ['zero', 'one', 'two', 'three', 'four']# 按列計數,並填充 0types = types.apply(pd.value_counts).fillna(0)# 按行計數,統計匯總types['counts'] = types.apply(lambda x: x.sum, axis=1)# 排序types = types.sort_values('counts', ascending=False)print(types.head(10))# 輸出結果 zero one two three four counts劇情 186.0 0.0 0.0 0.0 0.0 186.0愛情 1.0 42.0 12.0 0.0 0.0 55.0喜劇 21.0 30.0 0.0 0.0 0.0 51.0犯罪 0.0 17.0 19.0 8.0 2.0 46.0冒險 0.0 2.0 30.0 10.0 2.0 44.0奇幻 2.0 16.0 16.0 5.0 0.0 39.0驚悚 0.0 11.0 18.0 6.0 0.0 35.0動畫 13.0 14.0 5.0 2.0 0.0 34.0動作 14.0 15.0 3.0 0.0 0.0 32.0懸疑 3.0 24.0 4.0 0.0 0.0 31.0
劇情,愛情,喜劇佔據榜首。大多數男孩子喜歡的動作電影上榜數量並不多。
同樣的操作,我們對國家地區分析下,看看哪個國家上榜數量最多。
d['country'] = d['country'].str.replace(' ', '')country = d['country'].str.split('/', expand=True)country.columns = ['zero', 'one', 'two', 'three', 'four', 'five']country = country.apply(pd.value_counts).fillna(0)country['counts'] = country.apply(lambda x: x.sum, axis=1)country = country.sort_values('counts', ascending=False)print(country.head(10))# 輸出結果 zero one two three four five counts美國 118.0 13.0 3.0 4.0 0.0 0.0 138.0日本 32.0 2.0 0.0 0.0 0.0 0.0 34.0英國 14.0 15.0 4.0 0.0 0.0 0.0 33.0中國香港 18.0 8.0 0.0 1.0 0.0 0.0 27.0中國大陸 16.0 5.0 1.0 0.0 0.0 0.0 22.0法國 8.0 10.0 1.0 1.0 0.0 0.0 20.0德國 5.0 10.0 3.0 0.0 0.0 1.0 19.0韓國 10.0 0.0 1.0 0.0 0.0 0.0 11.0義大利 6.0 2.0 1.0 0.0 0.0 0.0 9.0中國臺灣 6.0 2.0 0.0 0.0 0.0 0.0 8.0
美國以 138 個高居榜首,不錯的是中國大陸,中國香港和中國臺灣都在 TOP10。其中中國大陸排第五。
下面我們看下是哪位天才導演的作品上榜數量最多。
雖說導演數據也是需要分割的,完全可以按照上面兩個例子照葫蘆畫瓢,但這次我們換個方式來。
# 分割數據directors = d['director'].str.split('#').apply(pd.Series)# 行列轉換,並重置 indexdirectors = directors.unstack.dropna.reset_indexdirectors.columns.values[2] = 'name'# 統計導演作品數量directors = directors.name.value_countsprint(directors.head(10))# 輸出結果宮崎駿 7史蒂文·史匹柏 7克里斯多福·諾蘭 7王家衛 5李安 5大衛·芬奇 4是枝裕和 4彼得·傑克遜 3朱塞佩·託納多雷 3弗朗西斯·福特·科波拉 3Name: name, dtype: int64
其中宮崎駿,史匹柏以及諾蘭以 7 部作品並列第一,王家衛和李安以 5 部作品並列第二。
最後我們看看演員的上榜數據如何。
actor = d['actor'].str.split('#').apply(pd.Series)
由於演員數量巨大,所以我們只分析前三列。
actor = d['actor'].str.split('#').apply(pd.Series)[[0, 1, 2]]actor = actor.unstack.dropna.reset_indexactor.columns.values[2] = 'name'actor = actor.name.value_countsprint(actor.head(10))# 輸出結果張國榮 8梁朝偉 7湯姆·漢克斯 6萊昂納多·迪卡普裡奧 6布拉德·皮特 5周星馳 5張曼玉 5伊桑·霍克 5林青霞 4馬特·達蒙 4Name: name, dtype: int64
上榜次數最多的是張國榮哥哥,高達 8 次,一個人演繹了這麼多經典作品,不愧是我們永遠的哥哥。第二是梁朝偉。第一第二都是咱中國的演員,驕傲了。
數據分析分別按照評分人數和評論人數取 TOP10 的電影數據來看看。
按照評分人數排序d['votes'] = d['votes'].astype(int)top10_votes_movie = d[['title', 'votes']].sort_values('votes', ascending=False).head(10).reset_indexprint(top10_votes_movie) index title votes0 0 肖申克的救贖 The Shawshank Redemption 18852351 3 這個殺手不太冷 Léon 16321402 6 千與千尋 千と千尋の神隠し 14732963 2 阿甘正傳 Forrest Gump 14369464 53 我不是藥神 14003975 8 盜夢空間 Inception 13875166 1 霸王別姬 13843037 5 鐵達尼號 Titanic 13800738 12 三傻大鬧寶萊塢 3 Idiots 12732509 18 瘋狂動物城 Zootopia 1182866
按照評論人數排序d['comments'] = d['comments'].str.split(' ').apply(pd.Series)[1]d['comments'] = d['comments'].astype(int)top10_comments_movie = d[['title', 'comments']].sort_values('comments', ascending=False).head(10).reset_indexprint(top10_comments_movie)# 輸出結果 index title comments0 53 我不是藥神 3886541 0 肖申克的救贖 The Shawshank Redemption 3406882 1 霸王別姬 2744903 3 這個殺手不太冷 Léon 2685914 23 怦然心動 Flipped 2636145 85 綠皮書 Green Book 2576106 8 盜夢空間 Inception 2573057 32 尋夢環遊記 Coco 2532928 6 千與千尋 千と千尋の神隠し 2518099 166 頭號玩家 Ready Player One 248538
可以看出,在評分人數和評論人數方面「肖申克的救贖」都很穩,排名第二的「霸王別姬」在評分人數和評論人數的排名上分別是第八和第三,有點驚訝。
比較驚訝的是在 TOP250 榜單排名第 54 位的「我不是藥神」,其評論人數和評分人數確相當多,尤其是評論人數,已經超過了很久之前上映的「肖申克的救贖」,而「我不是藥神」則是在 2018 年剛上映的。
排名與評分人數的關係plt.figure(figsize=(20,5))plt.subplot(1,2,1)plt.scatter(d['votes'],d['index'])plt.xlabel('votes')plt.ylabel('rank')plt.gca.invert_yaxis# 繪製直方圖plt.subplot(1,2,2)plt.hist(d['votes'])
從上圖可以看出,評分人數大都集中在 250000 左右,二者呈現強相關性,相關係數為 -0.655。
排名與評論人數的關係plt.figure(figsize=(20,5))plt.subplot(1,2,1)plt.scatter(d['comments'],d['index'])plt.xlabel('comments')plt.ylabel('rank')plt.gca.invert_yaxis# 繪製直方圖plt.subplot(1,2,2)plt.hist(d['comments'])
從上圖可以看出,評論人數大都集中在 40000~120000 左右,二者相關係數為 -0.539。
類型最招人喜歡的類型是劇情,其次是愛情,看來愛情是人類永恆的需求啊。
# 設置字體,不然中文會亂碼my_font = font_manager.FontProperties(fname='/System/Library/Fonts/PingFang.ttc')plt.figure(figsize=(20,6))plt.title("類型&電影數量", fontproperties=my_font)plt.xticks(fontproperties=my_font,rotation=45)plt.bar(types.index.values, types['counts'])
美國數量最多,有壓倒性優勢,中國香港第四,中國大陸第五。
plt.figure(figsize=(20,6))plt.title("國家&電影數量", fontproperties=my_font)plt.xticks(fontproperties=my_font,rotation=45)plt.bar(country.index.values, country['counts'])
最後,因為標籤數量太大,所以我們可用 WordCloud 將標籤製作一個詞雲圖。
tags = d['tags'].str.split('#').apply(pd.Series)text = tags.to_string(header=False,index=False)wc = WordCloud(font_path =,).generate(text)wordcloud = WordCloud(background_color='white',scale=1.5).generate(text)plt.figure(figsize=(16,9))plt.imshow(wc)plt.axis('off')plt.show
今天我們用 pandas ,matplotlib 以及 wordcloud 三個庫對豆瓣 TOP250 電影數據進行了一波分析,難點主要就是數據的清洗了,把格式錯誤的數據轉化成我們需要的格式,其次就是 DataFrame 和 Series 的操作。
由以上分析我們可以得出,豆瓣電影 TOP250 排行榜和電影評分及評論人數有較強的相關性,美國的電影上榜數量最多。
上榜次數最多的主演是張國榮,上榜次數最多的導演是宮崎駿,史匹柏以及諾蘭。
劇情、愛情類的電影最受歡迎。
,