您當前的位置:首頁 > 書法

實戰|資料分析篇之豆瓣電影 TOP250

作者:由 豆豆的雜貨鋪 發表于 書法時間:2021-10-11

上次我們對豆瓣 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 np

import pandas as pd

import matplotlib。pyplot as plt

import matplotlib

from wordcloud import WordCloud

content = []

with open(file) as f:

line = f。readline()

while line:

line = eval(line)

content。append(line)

line = f。readline()

d = pd。DataFrame(content)

下面來看看資料的基本資訊。

print(d。info)

print(len(d。title。unique()))

# 結果如下

RangeIndex: 250 entries, 0 to 249

Data columns (total 14 columns):

actor 250 non-null object

average 250 non-null object

comments 250 non-null object

country 250 non-null object

director 250 non-null object

index 250 non-null int64

rating_per 250 non-null object

runtime 250 non-null object

tags 250 non-null object

title 250 non-null object

type 250 non-null object

url 250 non-null object

votes 250 non-null object

year 250 non-null object

dtypes: int64(1), object(13)

memory usage: 27。4+ KB

None

250

共計 250 行,14 列,除 index 為 int 型別之外,其餘全是 object 型別,沒有缺失值,且沒有重複名字的電影,說明資料是完整的。

咱們先來看康什麼型別的電影上榜數量最多。

因為一個電影往往有較多的型別標籤,所以我們需要對資料做一下分割。

types = d[‘type’]。str。split(‘#’, expand=True)

print(types)

# 輸出結果

0 1 2 3 4

0 劇情 犯罪 None None None

1 劇情 愛情 同性 None None

……

248 劇情 None None None None

249 動作 科幻 驚悚 犯罪 None

進過分割操作之後我們發現,有的電影多達五個標籤,對於這麼多的 None 值,可以先按列計數,然後將空值 None 替換為 0,最後再按行彙總,統計出每個型別的總數即可。

types。columns = [‘zero’, ‘one’, ‘two’, ‘three’, ‘four’]

# 按列計數,並填充 0

types = 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)

# 行列轉換,並重置 index

directors = directors。unstack()。dropna()。reset_index()

directors。columns。values[2] = ‘name’

# 統計導演作品數量

directors = directors。name。value_counts()

print(directors。head(10))

# 輸出結果

宮崎駿 7

史蒂文·斯皮爾伯格 7

克里斯托弗·諾蘭 7

王家衛 5

李安 5

大衛·芬奇 4

是枝裕和 4

彼得·傑克遜 3

朱塞佩·託納多雷 3

弗朗西斯·福特·科波拉 3

Name: name, dtype: int64

其中宮崎駿,斯皮爾伯格以及諾蘭以 7 部作品並列第一,王家衛和李安以 5 部作品並列第二。

最後我們看看演員的上榜資料如何。

actor = d[‘actor’]。str。split(‘#’)。apply(pd。Series)

實戰|資料分析篇之豆瓣電影 TOP250

由於演員數量巨大,所以我們只分析前三列。

actor = d[‘actor’]。str。split(‘#’)。apply(pd。Series)[[0, 1, 2]]

actor = actor。unstack()。dropna()。reset_index()

actor。columns。values[2] = ‘name’

actor = actor。name。value_counts()

print(actor。head(10))

# 輸出結果

張國榮 8

梁朝偉 7

湯姆·漢克斯 6

萊昂納多·迪卡普里奧 6

布拉德·皮特 5

周星馳 5

張曼玉 5

伊桑·霍克 5

林青霞 4

馬特·達蒙 4

Name: 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_index()

print(top10_votes_movie)

index title votes

0 0 肖申克的救贖 The Shawshank Redemption 1885235

1 3 這個殺手不太冷 Léon 1632140

2 6 千與千尋 千と千尋の神隠し 1473296

3 2 阿甘正傳 Forrest Gump 1436946

4 53 我不是藥神 1400397

5 8 盜夢空間 Inception 1387516

6 1 霸王別姬 1384303

7 5 泰坦尼克號 Titanic 1380073

8 12 三傻大鬧寶萊塢 3 Idiots 1273250

9 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_index()

print(top10_comments_movie)

# 輸出結果

index title comments

0 53 我不是藥神 388654

1 0 肖申克的救贖 The Shawshank Redemption 340688

2 1 霸王別姬 274490

3 3 這個殺手不太冷 Léon 268591

4 23 怦然心動 Flipped 263614

5 85 綠皮書 Green Book 257610

6 8 盜夢空間 Inception 257305

7 32 尋夢環遊記 Coco 253292

8 6 千與千尋 千と千尋の神隠し 251809

9 166 頭號玩家 Ready Player One 248538

可以看出,在評分人數和評論人數方面「肖申克的救贖」都很穩,榜單排名第二的「霸王別姬」在評分人數和評論人數的排名上分別是第八和第三,有點驚訝。

比較驚訝的是榜單排名第 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’])

實戰|資料分析篇之豆瓣電影 TOP250

從上圖可以看出,評分人數大都集中在 250000 左右,二者呈現強相關性,相關係數為 -0。655。

型別

最招人喜歡的型別是劇情,其次是愛情,看來愛情是人類永恆的需求啊。

# 設定字型,不然中文會亂碼

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’])

實戰|資料分析篇之豆瓣電影 TOP250

國家和地區

美國數量最多,有壓倒性優勢,中國香港第四,中國大陸第五。

plt。figure(figsize=(20,6))

plt。title(“國家&電影數量”, fontproperties=my_font)

plt。xticks(fontproperties=my_font,rotation=45)

plt。bar(country。index。values, country[‘counts’])

實戰|資料分析篇之豆瓣電影 TOP250

標籤

最後,因為標籤數量太大,所以我們可用 WordCloud 將標籤製作一個詞雲圖。

tags = d[‘tags’]。str。split(‘#’)。apply(pd。Series)

text = tags。to_string(header=False,index=False)

wc = WordCloud(font_path = ‘/System/Library/Fonts/PingFang。ttc’,background_color=“white”,scale=2。5,contour_color=“lightblue”,)。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()

實戰|資料分析篇之豆瓣電影 TOP250

總結

今天我們用

pandas

matplotlib

以及

wordcloud

三個庫對豆瓣 TOP250 電影資料進行了一波分析,難點主要就是資料的清洗了,把格式錯誤的資料轉化成我們需要的格式,其次就是 DataFrame 和 Series 的操作。

由以上分析我們可以得出,豆瓣電影 TOP250 排行榜和電影評分及評論人數有較強的相關性,美國的電影上榜數量最多。

上榜次數最多的主演是張國榮,上榜次數最多的導演是宮崎駿,斯皮爾伯格以及諾蘭。

劇情、愛情類的電影最受歡迎。

程式碼地址

示例程式碼:

https://

github。com/JustDoPython

/python-100-day/tree/master/douban-movie-top250

標簽: plt  250  Country  Non  null