數據可視化-電影數據分析

數據可視化-電影數據分析

來自專欄 數據分析學習記錄

一、提出問題

本文簡單分析當製作一部電影時,應考慮哪些客觀因素才能使電影獲得成功?為客戶提供有效的數據依據,以便作出更準確的決策。本次數據分析報告主要圍繞以下幾點進行分析:

問題一:電影類型如何隨時間發生變化? * 電影數量上的對比 * 電影收入的對比問題二:影響電影收入的客觀因素有哪些?問題三:兩家電影公司Universal Pictures 和 Paramount Pictures之間的對比。 * 電影發行數量上的對比 * 電影產生的利潤對比問題四:改編電影和原創電影之間的對比。 * 電影發行數量上的對比 * 電影產生的利潤對比

二、理解數據

獲取數據:[Kaggle TMDB](https://www.kaggle.com/tmdb/tmdb-movie-metadata)重點關注的變數有:imdb_id:IMDB 標識號popularity:在 Movie Database 上的相對頁面查看次數budget:預算(美元)revenue:收入(美元)original_title:電影名稱cast:演員列表,按 | 分隔,最多 5 名演員homepage:電影首頁的 URLdirector:導演列表,按 | 分隔,最多 5 名導演tagline:電影的標語keywords:與電影相關的關鍵字,按 | 分隔,最多 5 個關鍵字overview:劇情摘要runtime:電影時長genres:風格列表,按 | 分隔,最多 5 種風格production_companies:製作公司列表,按 | 分隔,最多 5 家公司release_date:首次上映日期vote_count:評分次數vote_average:平均評分release_year:發行年份budget_adj:根據通貨膨脹調整的預算(2010 年,美元)revenue_adj:根據通貨膨脹調整的收入(2010 年,美元)

1、導入模塊

import json #解析模塊(json 是輕量級的數據交換語言)import pandas as pdimport numpy as npimport matplotlib.pyplot as plt #數據可視化import seaborn as sns #seaborn%matplotlib inlineimport warningswarnings.filterwarnings(action = ignore)

2、導入數據

credits_file=C:/Users/Administrator/Movie/tmdb_5000_credits.csvmovies_file=C:/Users/Administrator/Movie/tmdb_5000_movies.csvcredits=pd.read_csv(credits_file,encoding=utf-8)movies=pd.read_csv(movies_file,parse_dates=[release_date])#查看數據集行列數print(credits:,credits.shape,movies:,movies.shape)credits: (4803, 4) movies: (4803, 20)

3、查看信息

credits.head()

太長,不全部截出

movies.head()

4、合併數據集

#合併數據集,並查看數據集行列數和數據類型,缺失情況del credits[title] #兩個數據集中title相同,刪除其中一個full=pd.concat([credits,movies],axis=1)print(合併後數據集:,full.shape)合併後數據集: (4803, 23)

三、數據清洗

1、選擇子集

#選擇子集,選擇與問題相關的特徵數據full=full[[id,title,vote_average,production_companies,genres, release_date,keywords,runtime,budget,revenue,vote_count,popularity]]#查看數據集信息full.info()<class pandas.core.frame.DataFrame>RangeIndex: 4803 entries, 0 to 4802Data columns (total 12 columns):id 4803 non-null int64title 4803 non-null objectvote_average 4803 non-null float64production_companies 4803 non-null objectgenres 4803 non-null objectrelease_date 4802 non-null datetime64[ns]keywords 4803 non-null objectruntime 4801 non-null float64budget 4803 non-null int64revenue 4803 non-null int64vote_count 4803 non-null int64popularity 4803 non-null float64dtypes: datetime64[ns](1), float64(3), int64(4), object(4)memory usage: 375.3+ KB

2、缺失值處理

#release_date缺失一條數據#先找到這條數據full.loc[full[release_date].isnull(),title] 4553 America Is Still the PlaceName: title, dtype: object#上網查到缺失電影首次上映日期為2014-06-01,填充缺失值full[release_date]=full[release_date].fillna(2014-06-01)full.loc[4553,release_date]2014-06-01#runtime缺失兩條數據,數值型可用平均數填充full[runtime]=full[runtime].fillna(full[runtime].mean())

2.數據類型轉換

時間序列中提取年份

#release_date轉換為年月日,並提取年份full[release_year]=pd.to_datetime(full[release_date],format=%Y-%m-%d).dt.yearfull[release_year].head()0 20091 20072 20153 20124 2012Name: release_year, dtype: int64

json格式轉換為字元串

#定義函數def getname(x): a=[] for i in x: a.append(i[name]) return ,.join(a)#genres 風格種類full[genres]=full[genres].apply(json.loads)full[genres]=full[genres].apply(getname)full[genres].head()0 Action,Adventure,Fantasy,Science Fiction1 Adventure,Fantasy,Action2 Action,Adventure,Crime3 Action,Crime,Drama,Thriller4 Action,Adventure,Science FictionName: genres, dtype: object# production_companies 製作公司full[production_companies]=full[production_companies].apply(json.loads)full[production_companies]=full[production_companies].apply(getname)# keywords 與電影相關的關鍵字full[keywords]=full[keywords].apply(json.loads)full[keywords]=full[keywords].apply(getname)

四、問題分析

1、電影類型隨時間變化

#提取電影類型genresList=set() #用集合提取出不重複的類型for s in full[genres].str.split(,): genresList=set().union(s,genresList)genresList=list(genresList)genresList.remove()genresList[Adventure, Music, Science Fiction, Mystery, History, Romance, Foreign, Action, Horror, Documentary, Animation, Drama, Crime, Family, Western, TV Movie, Fantasy, Thriller, War, Comedy]#將電影類型添加到列,需進行one-hot編碼genresDf=pd.DataFrame()for genre in genresList: genresDf[genre]=full[genres].str.contains(genre).apply(lambda x:1 if x else 0)#用年份索引genresDf[release_year]=full[release_year]genresDf.index=full[release_year]genresDf=genresDf.sort_index() #按數據框行索引進行排序genresDf.head()#對每個類型的電影按年份求和genresDf=genresDf.groupby(release_year).sum() #groupby函數對數據集進行聚類運算 genresDf.head()#匯總各電影類型的總量total=genresDf.sum().sort_values() #默認升序排列#選出數量最多的十類電影total=total[-10:]totalFamily 513Horror 519Science Fiction 535Crime 696Adventure 790Romance 894Action 1154Thriller 1274Comedy 1722Drama 2297dtype: int64#數量最多的10大類型電影total.plot(kind=barh,figsize=(8,5),width=0.8) #barh橫向柱狀圖更易比較大小plt.title(各電影類型的數量對比,fontsize=18)plt.xlabel(數量,fontsize=15)plt.grid(True)plt.show()

#電影類型隨時間的變化genresDf=genresDf[[Drama,Comedy,Thriller,Action,Romance,Adventure, Crime,Science Fiction,Horror,Family]]genresDf.plot(figsize=(8,5))plt.title(電影類型隨時間變化)plt.xlabel(時間)plt.ylabel(數量)plt.grid(True)plt.show()

從上圖可以看出,所有類型的電影在1960年前幾乎沒什麼變化,從1960-1990開始緩慢增長,此後呈現急劇增長,其中戲劇(Drama)增長最快,數量最多,喜劇(Comedy)次之,到近代恐怖片(Thriller)數量超過喜劇,動作片(Action)接近恐怖片。這四類電影都可作為投資的首選。

2、影響電影收入的客觀因素有哪些?

#電影收入的相關矩陣corrDf=full.corr()corrDf[revenue].sort_values(ascending=False) #相關程度按降序排列revenue 1.000000vote_count 0.781487budget 0.730823popularity 0.644724runtime 0.251080vote_average 0.197150release_year 0.090084id -0.050425Name: revenue, dtype: float64#電影收入與預算的關係sns.regplot(full[budget],full[revenue]) #seaborn中regplot函數用於繪製雙變數線性回歸曲線plt.title(電影收入與預算的關係)plt.xlabel(預算)plt.ylabel(收益)plt.grid(True)plt.show()

可以看出,電影收入與評分次數、預算、電影頁面相對查看次數的相關性較高。

電影收入和預算的相關性曲線是正線性相關,所以,保證一定的電影預算是提高電影收入的重要基礎。

3、Universal Pictures和Paramount Pictures之間的對比

3.1 電影發行量對比

#電影發行總量對比full[Universal Pictures]=full[production_companies].str.contains(Universal Pictures).apply(lambda x:1 if x else 0)full[Paramount Pictures]=full[production_companies].str.contains(Paramount Pictures).apply(lambda x:1 if x else 0)Universal_total=full[Universal Pictures].sum()Paramount_total=full[Paramount Pictures].sum()total_all=pd.Series({Universal Pictures:Universal_total,Paramount Pictures: Paramount_total})total_allParamount Pictures 285Universal Pictures 314dtype: int64#可視化total_all.plot(kind=pie,autopct=%1.1f%%,explode=(0.05,0), startangle=90,labeldistance=1.1,shadow=False)plt.title(Universal Pictures和Paramount Pictures電影發行總量對比,fontsize=10)plt.show()

#利潤=收入-預算full[profit]=full[revenue]-full[budget]full[Universal_profit]=full[Universal Pictures]*full[profit]full[Paramount_profit]=full[Paramount Pictures]*full[profit]#電影年發行量對比companyDf=full[[release_year,Universal Pictures,Paramount Pictures,Universal_profit, Paramount_profit]]companyDf.index=companyDf[release_year]companyDf=companyDf.sort_index()companyDf=companyDf.groupby(release_year).sum()companyDf.head()#可視化plt.plot(companyDf.index,companyDf[Universal Pictures],label=Universal Pictures)plt.plot(companyDf.index,companyDf[Paramount Pictures],label=Paramount Pictures)plt.xlabel(時間)plt.ylabel(發行量)plt.title(Universal Pictures和Paramount Pictures電影年發行量對比)plt.grid(True)plt.legend()plt.show()

從電影發行總量上看,Universal Pictures公司比Paramount Pictures公司多;

從電影年發行量隨時間的變化來看,兩家製作公司基本都是在增長,但Universal Pictures公司在近期增長更平穩。

3.2 利潤對比

#總利潤對比Universal_profit=full[Universal_profit].sum()Paramount_profit=full[Paramount_profit].sum()profit_total=pd.Series({Universal_profit:Universal_profit,Paramount_profit:Paramount_profit})profit_totalParamount_profit 27568910158Universal_profit 28990348596dtype: int64#可視化profit_total.plot(kind=pie,autopct=%1.1f%%,explode=(0.05,0), startangle=90,labeldistance=1.1,shadow=False)plt.title(Universal Pictures和Paramount Pictures的總利潤對比,fontsize=10)plt.show()

#年利潤對比可視化plt.plot(companyDf.index,companyDf[Universal_profit],label=Universal Pictures)plt.plot(companyDf.index,companyDf[Paramount_profit],label=Paramount Pictures)plt.xlabel(時間)plt.ylabel(利潤)plt.title(Universal Pictures和Paramount Pictures年利潤對比)plt.grid(True)plt.legend()plt.show()

兩家製作公司的利潤對比,總利潤Universal Pictures公司多於Paramount Pictures公司;

從年利潤上看,兩家公司利潤都隨時間增長,其中Universal_profit公司增長較平穩,且最近幾年增長最快。

由此可見,相較於Universal Pictures公司,選擇Paramount Pictures公司帶來高回報的概率更高。

4、改編電影和原創電影的對比

4.1 數量對比

#原創電影和改編電影分類full[if_original]=full[keywords].str.contains(based on novel).apply(lambda x:not original if x else original)full[if_original].head()0 original1 original2 not original3 original4 not originalName: if_original, dtype: object#兩種類型數量匯總信息key_count=full[if_original].value_counts()key_countoriginal 4606not original 197Name: if_original, dtype: int64#可視化key_count.plot(kind=pie,autopct=%1.1f%%,explode=(0.05,0), startangle=90,labeldistance=1.1,shadow=False)plt.title(改編電影和原創電影數量對比,fontsize=10)plt.show()

4.2 改編電影和原創電影平均利潤對比

#原創電影和改編電影的平均利潤original_total=full.groupby(if_original)[profit].mean()original_totalif_originalnot original 9.848457e+07original 5.127943e+07Name: profit, dtype: float64#可視化original_total.plot(kind=bar)plt.title(改編電影和原創電影平均利潤對比,fontsize=15)plt.ylabel(平均利潤,fontsize=12)plt.grid(True)plt.show()

從以上兩幅可視化圖片可以看出,原創電影的發行數量遠遠多於改編電影;

但改編電影的平均利潤卻是原創電影的近兩倍;說明原創電影雖然是主流電影,但好的小說改編電影卻能帶來更多的利潤。

所以,如果有較好的小說劇本,可以嘗試製作改編電影,可以帶來更多的收益。


結論

1. 所有類型的電影的數量都隨時間的推移而增長,其中戲劇(Drama)增長最快,數量最多,喜劇(Comedy)次之,到近代恐怖片(Thriller)數量超過喜劇,動作片(Action)也接 近恐怖片。這四類電影都可作為投資的首選。

2. 電影收入與評分次數、預算、電影頁面相對查看次數的相關性較高,所以適當增加電影預算 和廣告宣傳,都可以使電影收入增長。

3. Universal Pictures 和 Paramount Pictures兩家製作公司對比,Universal Pictures 公司

在發行數量和利潤上都佔有優勢。

4. 原創電影雖然是主流電影,但好的小說改編電影卻能帶來更多的利潤。如果有較好的小說劇本,可以嘗試製作改編電影,可以帶來更多的收益。

推薦閱讀:

小白數據分析之「IMDB電影」
全球恐怖襲擊數據的可視分析
Kaggle入門:House Prices Prediction
數據中心機房運維可視化平台
天池公益雲圖可視化大賽銅獎

TAG:數據分析 | 數據可視化 |