TMDB電影項目分析

簡介: 本數據集中包含 1 萬條電影信息,信息來源為“kaggle電影數據庫”(TMDb,The Movie Database),包括用戶評分和票房。 主要為美國地區(1960-2015)的電影作品。

一. 提出問題

本次數據分析的核心任務是:

  • 通過對歷史電影數據的統計分析,運用集中趨勢測量,離散程度測量等等,對數據進行描述性統計,為電影公司投資和拍片思路提供一些方向還有角度。
    細化為下述幾個小問題:
  • 問題1:什么對于票房的影響最大
  • 問題2:電影的投入對于電影票房的影響
  • 問題3:不同類型電影的發行量
  • 問題4:不同類型電影的收益能力
  • 問題5:不同風格電影的受歡迎程度

二、理解數據

工具:Jupyter Notebook
下載好的csv文件:tmdb-movies.csv
導入文件后通過對數據的查看,我們篩選出與問題重點有關的變量:

序號 變量名 說明
1 id tmdb身份標識
2 popularity 電影受歡迎程度
3 budget 電影預算(單位:$)
4 revenue 電影收入(單位:$)
5 genres 電影風格
6 release_date 發行日期
7 vote_count 評價的次數
8 vote_average 平均評分
9 release_year 發行年份

三、數據整理

  • 對數據集大概的情況進行了解
  • 查看是否有數據類型需要轉換
  • 有無缺失值,是否需要填充或者刪除
  • 有無冗余數據,是否需要刪除
  • 查看列標簽,與問題無關的列標簽可以刪除
# 導入語句
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

# 讀取文件
df_movie = pd.read_csv('tmdb-movies.csv')
# 查看文件
df_movie.head(1)
# 數據集的行數列數
df_movie.shape
# 數據集的數據類型
df_movie.dtypes
# 檢查有無缺失值
df_movie.isnull().sum()
# 檢查有無冗余數據
df_movie.duplicated().sum()
# 打印列標簽,方便刪除用不到的列
for i,v in enumerate(df_movie.columns):
    print(i,v)

四、數據清理

  • 清理 ['imdb_id', 'original_title', 'cast', 'homepage', 'tagline', 'keywords', 'overview', 'runtime', 'production_companies'] ,以上列標簽與問題關聯不大。
  • 使用id列標簽來查看冗余數據是否需要刪除,因為id是唯一的,假如有兩個一樣的id,那么就可以刪除多余的數據。
  • 檢查缺失值所在的列,通過列標簽來判斷缺失值需要填充還是刪除。
# 清理列標簽
df_movie.drop(['imdb_id', 'original_title', 'cast', 'homepage', 'tagline', 'keywords', 'overview', 'runtime', 'production_companies'], 
             axis=1, inplace=True)

# 查看電影數據集的列標簽,確定成功
df_movie.head(1)
for i,v in enumerate(df_movie.columns):
    print(v)
    
# 查看冗余數據
df_movie['id'].duplicated().any()
# 刪除冗余數據
df_movie.drop_duplicates(inplace=True)
# 檢查是否刪除成功
df_movie.duplicated().any()
# 檢查缺失值所在的列數
df_movie.isnull().any()
# 可以看出缺失值在導演和電影類型當中,可以刪除缺失值
df_movie.dropna(inplace=True)
# 檢查缺失值是否清理完畢
df_movie.isnull().any()

五、可視化數據

1、什么對于票房的影響最大?

# 計算相關系數矩陣
df_revenue_corr = df_movie.corr()
df_revenue_corr['revenue'].sort_values(ascending=False)

# 根據矩陣從中選出相關性最高的
df_movie[['popularity', 'vote_count', 'budget', 'profit', revenue']].corr()
popularity vote_count budget profit revenue
popularity 1.000000 0.794798 0.541389 0.632243 0.665637
vote_count 0.794798 1.000000 0.641547 0.761011 0.798562
budget 0.541389 0.641547 1.000000 0.564219 0.729293
profit 0.632243 0.761011 0.564219 1.000000 0.976375
revenue 0.665637 0.798562 0.729293 0.976375 1.000000

得出:

  • 受歡迎程度和票房相關性:0.6656
  • 評價次數和票房相關性:0.7986
  • 電影預算和票房相關性:0.7293
  • 收益和票房相關性:0.9764

以上我們可以看到,相關性最高的是vote_count(投票總數),budget(電影投入)profit(電影收益),popularity(受歡迎程度)

  • 由于vote_countprofit都是在票房出來之后才會有,因此相關性最高,但同時也需要剔除。
  • 因此對popularitybudget進行可視化。
# 創建票房收入數據框
revenue = df_movie[['popularity', 'budget', 'revenue']]

# 可視化票房收入與受歡迎程度(藍)的相關性散點圖,\并配線性回歸線。
fig = plt.figure(figsize=(17, 5))
ax1 = plt.subplot(131)
ax1 = sns.regplot(x='popularity', y='revenue', data=revenue, x_jitter=.1)
plt.title('revenue by popularity',fontsize=15)
plt.xlabel('popularity',fontsize=12)
plt.ylabel('revenue',fontsize=12)

# 可視化票房收入電影預算(紅)的相關性散點圖,并配線性回歸線。
ax2 = plt.subplot(132)
ax2 = sns.regplot(x='budget', y='revenue', data=revenue, x_jitter=.1,color='r',marker='+')
plt.title('revenue by budget',fontsize=15)
plt.xlabel('budget',fontsize=12)
plt.ylabel('revenue',fontsize=12)

繪制線性相關圖:

相關因素圖.png

2、電影的投入對于電影票房的影響

# 得出平均預算
budget_mean = df_movie.budget.mean()

# 通過平均預算分出高低預算兩組
low_budget = df_movie.query('budget < {}'.format(budget_mean))
high_budget = df_movie.query('budget >= {}'.format(budget_mean))
new_samples = df_movie.shape[0]
new_samples == low_budget['revenue'].count() + high_budget['revenue'].count()

# 得出平均收入
mean_revenue_low = low_vote['revenue'].mean()
mean_revenue_high = high_vote['revenue'].mean()

# 可視化數據
locations = [1, 2]
heights = [mean_revenue_low, mean_revenue_high]
labels = ['Low Budget', 'High Bubget']
plt.bar(locations, heights, tick_label = labels)
plt.title('Average Revenue by Bubget')
plt.xlabel('Budget Content')
plt.ylabel('Revenue')

繪制條形圖:

高低預算對比.png

可以看出預算更高的電影,票房也會比低預算的電影更高。


3、不同類型電影的發行量

# 單獨提取出genre
set_genre = set()
for x in df_movie['genres']:
    set_genre.update(x.split('|'))
set_genre.discard('')

# 轉換成dataframe類型
df_genre = pd.DataFrame()
for genre in set_genre:
    df_genre[genre] = df_movie['genres'].str.contains(genre).map(lambda x:1 if x else 0)
df_genre['year']=df_movie['release_year']

# 形成新的列
genre_by_year = df_genre.groupby('year').sum()
genresum_by_year = genre_by_year.sum().sort_values()

fig = plt.figure(figsize=(12,10))
ax = plt.subplot(111)
ax = genresum_by_year.plot.bar(alpha=.7)
plt.xticks(rotation=60)
plt.title('Top genre', fontsize=15)
plt.xlabel('genre', fontsize=15)
plt.ylabel('count', fontsize=15)

繪制柱形圖:

電影風格發行數量.png

最受歡迎的前五名:

  • Drama(戲?。?/li>
  • Comedy(喜?。?/li>
  • Thriller(驚險)
  • Action(動作)
  • Adventure(冒險)

4、不同類型電影的收益能力

# 可可視化數據
fig = plt.figure(figsize=(18,13))
ax1 = fig.add_subplot(111)
plt.bar(x, profit_rate['profit'], label='profit', alpha=.7)
plt.xticks(x,xl,rotation=60,fontsize=12)
plt.yticks(fontsize=12)
ax1.set_title('Profit by genres', fontsize=20)
ax1.set_ylabel('Film Profit',fontsize=18)
ax1.set_xlabel('Genre',fontsize=18)
ax1.set_ylim(0,1.2e11)
ax1.legend(loc=2,fontsize=15)

#次縱坐標軸標簽設置為百分比顯示
import matplotlib.ticker as mtick

# 添加多一個兄弟軸,另一條y軸
ax2 = ax1.twinx()
ax2.plot(x, profit_rate['profit_rate'], 'ro-', lw=2, label='profit_rate')

# #次縱坐標軸標簽設置為百分比顯示
fmt='%.2f%%'
yticks = mtick.FormatStrFormatter(fmt)
ax2.yaxis.set_major_formatter(yticks)
plt.yticks(fontsize=15)
ax2.set_ylabel('Profit_rate',fontsize=18)
ax2.legend(loc=1,fontsize=15)
plt.grid(0)

繪制條形圖和折線圖:

電影風格收益能力.png

收益能力最高的五個類型:

  • Adventure(冒險)
  • Action(動作)
  • Comedy(喜?。?/li>
  • Drama(喜劇)
  • hriller(驚險)

5、不同類型電影的受歡迎程度

# 創建受歡迎程度的數據框
df_popularity = pd.DataFrame()
df_popularity = pd.concat([df_genre.iloc[:, :-1], df_movie['popularity']], axis=1)
df_popularity.head()

# 計算每個風格電影的受歡迎程度的均值
popularity_mean = []
for genre in set_genre:
    popularity_mean.append(df_popularity.groupby(genre, as_index=False).mean().loc[1,'popularity'])
    
genre_popularity = pd.DataFrame(index=set_genre)
genre_popularity['popularity_mean'] = popularity_mean
genre_popularity.sort_values('popularity_mean', inplace=True)

# 可視化數據
fig = plt.figure(figsize=(14, 8))
ax = plt.subplot(111)
genre_popularity.plot(ax=ax, kind='barh')
plt.title('Popularity by genre', fontsize=18)
plt.xlabel('Mean of popularity', fontsize=15)
plt.ylabel('Film genres', fontsize=14)
plt.xticks(fontsize=11)
plt.yticks(fontsize=11)
plt.legend(fontsize=11)

繪制橫向條形圖:

電影風格受歡迎程度.png

受歡迎程度最高的五個類型:

  • Adventure(冒險)
  • Science Fiction(科幻小說)
  • Fantasy(幻想)
  • Action(動作)
  • Animation(動畫)

六、結論

1.電影類型方面

從收益來看:

  • Adventure(冒險)
  • Action(動作)
  • Comedy(喜劇)
  • Drama(戲?。?/li>
  • hriller(驚險)

從受歡迎程度來看:

  • Adventure(冒險)
  • Science Fiction(科幻小說)
  • Fantasy(幻想)
  • Action(動作)
  • Animation(動畫)

建議:

  • 結合兩組數據,我們可以看出冒險類,動作類喜劇類,科幻類的電影收益和受歡迎程度都比較高,建議首選以上四種類型電影。

2.電影投入方面

  • 電影投入得越多,正常來說會是個大片,票房也應該會大賣。但還需要其他綜合因素的考量,例如演員陣容,導演,電影類型等等。但不可否認的是,電影投入得多,演員陣容也會更豪華,導演知名度較高,才是高票房的保障。因此,如果不考慮其他綜合因素情況下,高投入會比低投入電影的票房高。
  • 電影投入包含許多的方面,有一個方面也是非常重要,那就是在上映之前,電影的知名度,也就是受歡迎的程度。因此,電影的預算建議多投入在廣告宣傳方面,在上映之前打響知名度。

提示:

  • 本項目分析使用的數據對于探索的問題已經足夠

    • 數據量使用足夠大,來源于著名的tmdb電影網站,數據量達上萬條,足夠對探索問題作出相關性的判斷。

    • 篩選出的特征足夠用于探索目標的分析,電影的票房、預算、收益、受歡迎程度和電影類型。以上篩選出來的數據集大多數與這五個特征有關

  • 探索過程中對數據的清洗、處理、操作不會對最后分析帶來偏差和不確定性

    • 對于缺失值的處理:因為出現缺失值的列數對于最后分析的問題來說,并不在對比之列,因此可以刪除
    • 對于冗余數據的處理:此數據集只出現了一個冗余數據,并且同一個id,因此可以刪除。
    • 對于數據類型的處理:數據類型都比較合理,并沒有需要轉換的數據類型。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,345評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,494評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,283評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,953評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,714評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,410評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,940評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,776評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,976評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,210評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,642評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,878評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,654評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,958評論 2 373