電影數據分析案例












Python代碼實現如下:
1.提出問題
電影公司製作一部新電影推向市場時,要想獲得成功,通常要了解電影市場趨勢,觀眾喜好的電影類型,電影的發行情況,改編電影和原創電影的收益情況,以及觀眾喜歡什麼樣的內容。
本案例來源於kaggle上的TMDB 5000 Movie Dataset數據集,為了探討電影數據可視化,為電影的製作提供數據支持,主要研究以下幾個問題:
l 電影類型如何隨著時間的推移發生變化的?
l 電影類型與利潤的關係?
l Universal和Paramount兩家影視公司的對比情況如何?
l 改編電影和原創電影的對比情況如何?
l 電影時長與電影票房及評分的關係?
l 分析電影關鍵字
2.理解數據
2.1 採集數據
從kaggle上的TMDB 5000 Movie Dataset下載數據集:TMDB 5000 Movie Dataset
2.2導入數據

2.3查看數據集信息

下面是moviedf數據集中部分欄位的含義介紹:

3.數據清洗
(1)合併數據集
先將credits數據集和moviedf數據集中的數據合併在一起,再查看合併後的數據集信息:

(2)選取子集
由於數據集中包含的信息過多,其中部分數據並不是我們研究的重點,所以從中選取我們需要的數據:

由於後面的數據分析涉及到電影類型的利潤計算,先求出每部電影的利潤,並在數據集moviesdf中增加profit數據列:

(3)缺失值處理
通過上面的數據集信息可以知道:整個數據集缺失的數據比較少
其中release_date(首次上映日期)缺失1個數據,runtime(電影時長)缺失2個數據,可以通過網上查詢補齊這個數據。
填補release_date(首次上映日期)數據:

找出runtime(電影時長)缺失的數據:

填充runtime缺失值:

(4)數據格式轉換
genres列數據處理:

release_date列數據處理:

4.數據分析及可視化
問題一:電影類型如何隨著時間的推移發生變化的?
(1)建立包含年份與電影類型數量的關係數據框:


(2)數據可視化
繪製各種電影類型的數量柱狀圖:


繪製各種電影類型佔比的餅狀圖:


分析結論:
1.從上面的結果可以看出,在所有的電影類型中,Drama(戲劇)類型電影最多,占所有電影類型的18.9%,其次為Comedy(喜劇),占所有電影類型的14.2%。
2.在所有電影類型中,電影數量排名前5的電影類型分別為:Drama(戲劇)、Comedy(喜劇)、Thriller(驚悚)、Action(動作)、Romance(冒險)。
(3)電影類型隨時間變化的趨勢分析:

分析結論:從圖中觀察到,隨著時間的推移,所有電影類型都呈現出增長趨勢,尤其是1992年以後各個類型的電影均增長迅速,其中Drama(戲劇)和Comedy(喜劇)增長最快,目前仍是最熱門的電影類型。
問題二:電影類型與利潤的關係?
先求出各種電影類型的平均利潤:

電影類型平均利潤數據可視化:

分析結論:從圖中觀察到,拍攝Animation、Adventure、Fantasy這三類電影盈利最好,而拍攝Foreign、TV、Movie這三類電影會存在虧本的風險。
問題三:Universal Pictures和Paramount Pictures兩家影視公司發行電影的對比情況如何?
Universal Pictures(環球影業)和Paramount Pictures(派拉蒙影業)是美國兩家電影巨頭公司。
(1)查看 Universal Pictures和Paramount Pictures兩家影視公司電影發行的數量
先對production_companies列數據進行處理:

查詢production_companies數據列並統計Universal Pictures和Paramount Pictures的數據:

使用餅狀圖比較兩家公司發行的電影佔比:

(2)分析Universal Pictures和Paramount Pictures兩家影視公司電影發行的走勢
抽取相關數據列進行處理:

兩家影視公司電影發行的折線圖:

分析結論:從圖中觀察到,隨著時間的推移,Universal Pictures和Paramount Pictures公司的電影發行量呈現出增長趨勢,尤其是在1995年後增長迅速,其中Universal Pictures公司比Paramount Pictures公司發行的電影數量更多。
問題四:改編電影和原創電影的對比情況如何?
對keywords列數據處理:

描繪柱狀圖,對改編電影與原創電影在預算、收入及利潤三方面進行比較:

分析結論:從圖上可以看出,改編電影的預算略高於原創電影,但改編電影的票房收入和利潤遠遠高於原創電影, 這可能是改編電影擁有一定的影迷基礎。
問題五:電影時長與電影票房及評分的關係
電影時長與電影票房的關係:

電影時長與電影平均評分的關係:

分析結論:從圖上可以看出,電影要想獲得較高的票房及良好的口碑,電影的時長應保持在90~150分鐘內。
問題六:分析電影關鍵字
先提取電影關鍵字:
通過詞雲包WordCloud生成詞雲圖:


分析結論:通過對電影關鍵字的分析,電影中經常被提及的詞語是女性(woman)、獨立(independent),其次是謀殺(murder)、愛情(love)、警察(police)、暴力(violence),可見觀眾對女性和獨立方面題材的電影最感興趣,其次是是犯罪類和愛情類電影。
源碼如下:
# coding: utf-8# # 電影數據分析案例# # 1.提出問題# 電影公司製作一部新電影推向市場時,要想獲得成功,通常要了解電影市場趨勢,觀眾喜好的電影類型,電影的發行情況,改編電影和原創電影的收益情況,以及觀眾喜歡什麼樣的內容。# # 本案例來源於kaggle上的[TMDB 5000 Movie Dataset數據集](https://www.kaggle.com/tmdb/tmdb-movie-metadata),為了探討電影數據可視化,為電影的製作提供數據支持,主要研究以下幾個問題:# * **電影類型如何隨著時間的推移發生變化的?**# * **電影類型與利潤的關係?**# * **Universal和Paramount兩家影視公司的對比情況如何?**# * **改編電影和原創電影的發行對比情況如何?**# * **電影時長與電影票房及評分的關係?**# * **分析電影關鍵字**# # 2.理解數據# ## 2.1 採集數據# [從kaggle上的TMDB 5000 Movie Dataset下載數據集](https://www.kaggle.com/tmdb/tmdb-movie-metadata)# ## 2.2 導入數據# In[38]:import jsonimport pandas as pdimport numpy as npfrom pandas import Series,DataFramefrom datetime import datetimeimport warningswarnings.filterwarnings(ignore) # 忽略python運行過程中的警告錯誤# 數據可視化import matplotlib.pyplot as pltimport seaborn as sns # 使用Seaborn庫from wordcloud import WordCloud,STOPWORDS,ImageColorGenerator # 導入詞雲包from scipy.misc import imreadget_ipython().magic(matplotlib inline)# In[39]:# 導入電影數據credits_file = D:\Python\notebook\tmdb_5000_credits.csvmovies_file = D:\Python\notebook\tmdb_5000_movies.csvcredits = pd.read_csv(credits_file)movies = pd.read_csv(movies_file)# ## 2.3 查看數據集信息# In[40]:credits.head()# In[41]:movies.head()# # 3.數據清洗# ### (1)合併數據集# In[42]:# 合併數據集fulldf = pd.concat([credits,movies],axis=1)# 查看合併後的數據集信息fulldf.info()# ### (2)選取子集# In[43]:moviesdf = fulldf[[original_title,crew,release_date,genres,keywords,production_companies, production_countries,revenue,budget,runtime,vote_average]]moviesdf.info()# In[44]:# 增加profit列moviesdf[profit] = moviesdf[revenue] - moviesdf[budget]moviesdf.head()# ### (3)缺失值處理# **通過上面的數據集信息可以知道:整個數據集缺失的數據比較少**# # **其中release_date(首次上映日期)缺失1個數據,runtime(電影時長)缺失2個數據,可以通過網上查詢補齊這個數據**# In[45]:# 找出release_date(首次上映日期)缺失的數據release_date_null = moviesdf[release_date].isnull()moviesdf.loc[release_date_null,:]# In[46]:# 填充指定日期,從網上查到這部電影上映日期為2014年6月1日moviesdf[release_date] = movies[release_date].fillna(2014-06-01)# 修改日期格式moviesdf[release_date] = pd.to_datetime(moviesdf[release_date],format=%Y-%m-%d)moviesdf.info()# In[47]:# 找出runtime(電影時長)缺失的數據runtime_date_null = moviesdf[runtime].isnull()moviesdf.loc[runtime_date_null,:]# In[48]:#填充runtime缺失值網上查詢結果:電影《Chiamatemi Francesco - Il Papa della gente》的時長為98分鐘;電影《To Be Frank, Sinatra at 100》的時長為81分鐘values1 = {runtime:98.0}values2 = {runtime:81.0}moviesdf.fillna(value=values1,limit = 1,inplace = True)moviesdf.fillna(value=values2,limit = 1,inplace = True)moviesdf.loc[runtime_date_null,:]# ### (4)數據格式轉換# **genres列數據處理**# In[49]:# genres列格式化,建立包含所有genre類型的列表moviesdf[genres] = moviesdf[genres].apply(json.loads)# 自定義函數解碼json數據def decode(column): z = [] for i in column: z.append(i[name]) return .join(z)moviesdf[genres] = moviesdf[genres].apply(decode)moviesdf.head(2)# In[50]:# 建立genres列表,提取電影的類型genres_list = set()for i in moviesdf[genres].str.split( ): genres_list = set().union(i,genres_list) genres_list = list(genres_list) genres_list genres_list.remove()# **release_date列數據處理**# In[51]:# 保留日期中的年份moviesdf[release_date] = pd.to_datetime(moviesdf[release_date]).dt.yearcolumns = {release_date:year}moviesdf.rename(columns=columns,inplace=True)moviesdf[year].apply(int).head()# # 4.數據分析及可視化# ## 問題一:電影類型如何隨著時間的推移發生變化的?# ### (1)建立包含年份與電影類型數量的關係數據框# In[52]:for genre in genres_list: moviesdf[genre] = moviesdf[genres].str.contains(genre).apply(lambda x:1 if x else 0)# In[53]:genre_year = moviesdf.loc[:,genres_list]# In[54]:# 把年份作為索引標籤genre_year.index = moviesdf[year]# 將數據集按年份分組並求和,得出每個年份,各電影類型的電影總數genresdf = genre_year.groupby(year).sum()# 查看數據集,tail默認查看後5行的數據genresdf.tail() # In[55]:# 匯總電影類型的數量genresdfSum = genresdf.sum(axis=0).sort_values(ascending=False)genresdfSum# ### (2)數據可視化# ### 繪製柱狀圖# In[56]:# 設置畫板大小fig=plt.figure(figsize=(12,8))# 創建畫紙,這裡只使用1張畫紙繪圖,圖形直接輸出在整張畫紙上ax1 = plt.subplot(111)# 在畫紙上繪圖# 電影類型的數量按降序排序rects = genresdfSum.sort_values(ascending=True).plot(kind=barh,label=genres)plt.title(各種電影類型的數量統計圖)plt.xlabel(電影數量(部),fontsize=15)plt.ylabel(電影類型,fontsize=15)plt.show()# ### 繪製餅狀圖# In[57]:genres_pie = genresdfSum / genresdfSum.sum()# 設置other類,當電影類型所佔比例小於%1時,全部歸到other類中others = 0.01genres_pie_otr = genres_pie[genres_pie >= others]genres_pie_otr[Other] = genres_pie[genres_pie < others].sum()# 所佔比例小於或等於%2時,對應的餅狀圖往外長高一截explode = (genres_pie_otr <= 0.02) / 20 + 0.05 # 設置餅狀圖的參數genres_pie_otr.plot(kind=pie,label=,startangle=50,shadow=False, figsize=(10,10),autopct=%1.1f%%,explode=explode)plt.title(各種電影類型所佔的比例)# 分析結論:# # 1.從上面的結果可以看出,在所有的電影類型中,Drama(戲劇)類型電影最多,占所有電影類型的18.9%,其次為Comedy(喜劇),占所有電影類型的14.2%。# # 2.在所有電影類型中,電影數量排名前5的電影類型分別為:Drama(戲劇)、Comedy(喜劇)、Thriller(驚悚)、Action(動作)、Romance(冒險)。# ### 電影類型隨時間變化的趨勢分析# In[58]:plt.figure(figsize=(12,8))plt.plot(genresdf,label=genresdf.columns)plt.xticks(range(1910,2018,5))plt.legend(genresdf)plt.title(電影類型隨時間的變化趨勢,fontsize=15)plt.xlabel(年份,fontsize=15)plt.ylabel(數量(部),fontsize=15)plt.grid(True)plt.show()# 分析結論:從圖中觀察到,隨著時間的推移,所有電影類型都呈現出增長趨勢,尤其是1992年以後各個類型的電影均增長迅速,其中Drama(戲劇)和Comedy(喜劇)增長最快,目前仍是最熱門的電影類型。# ## 問題二:電影類型與利潤的關係?# In[59]:# 把電影類型作為索引mean_genre_profit = pd.DataFrame(index=genres_list)# 求出每種電影類型的平均利潤newarray = []for genre in genres_list: newarray.append(moviesdf.groupby(genre,as_index=True)[profit].mean())newarray2 = []for i in range(len(genres_list)): newarray2.append(newarray[i][1])mean_genre_profit[mean_profit] = newarray2mean_genre_profit.head()# In[60]:# 數據可視化plt.figure(figsize=(12,8))# 對於mean_profit列數據按值大小進行降序排序mean_genre_profit.sort_values(by=mean_profit,ascending=True).plot(kind=barh)plt.title(各種電影類型的平均利潤)plt.xlabel(平均利潤(美元))plt.ylabel(電影類型)plt.grid(True)plt.show()# 分析結論:從圖中觀察到,拍攝Animation、Adventure、Fantasy這三類電影盈利最好,而拍攝Foreign、TV、Movie這三類電影會存在虧本的風險# ## 問題三:Universal Pictures和Paramount Pictures兩家影視公司的電影發行對比情況如何?# ### (1)查看 Universal Pictures和Paramount Pictures兩家影視公司電影發行的數量# In[61]:# production_companies列數據格式化moviesdf[production_companies] = moviesdf[production_companies].apply(json.loads)# 調用自定義函數decode處理production_companies列數據moviesdf[production_companies] = moviesdf[production_companies].apply(decode)moviesdf.head(2)# In[62]:# 查詢production_companies數據列中是否含有Universal Pictures、Paramount Pictures,有則標記為1moviesdf[Universal Pictures] = moviesdf[production_companies].str.contains(Universal Pictures).apply(lambda x:1 if x else 0)moviesdf[Paramount Pictures] = moviesdf[production_companies].str.contains(Paramount Pictures).apply(lambda x:1 if x else 0)# In[63]:# 統計Universal Pictures和Paramount Pictures的數據a = moviesdf[Universal Pictures].sum()b = moviesdf[Paramount Pictures].sum()dict_company = {Universal:a,Paramount:b}company_vs = pd.Series(dict_company)company_vs# In[64]:# 使用餅狀圖顯示兩家公司發行電影所佔的比例company_vs.plot(kind=pie,label=,startangle=50,shadow=False, autopct=%1.1f%%)plt.title(Universal Pictures和Paramount Pictures兩家公司電影發行數量對比,fontsize=13)# ### (2)分析Universal Pictures和Paramount Pictures兩家影視公司電影發行的走勢# In[65]:# 抽取相關數據列,以release_year作為索引companydf = moviesdf[[Universal Pictures,Paramount Pictures]]companydf.index = moviesdf[year]# 對Universal和Paramount公司的發行數量按年分組求和companydf = companydf.groupby(year).sum()companydf.tail()# In[66]:# 數據可視化plt.figure(figsize=(12,8))plt.plot(companydf,label=companydf.columns)plt.xticks(range(1910,2018,5))plt.legend(companydf)plt.title(Universal Pictures和Paramount Pictures公司的電影發行量時間走勢,fontsize=15)plt.xlabel(年份,fontsize=15)plt.ylabel(數量(部),fontsize=15)plt.grid(True)plt.show()# 分析結論:從圖中觀察到,隨著時間的推移,Universal Pictures和Paramount Pictures公司的電影發行量呈現出增長趨勢,尤其是在1995年後增長迅速,其中Universal Pictures公司比Paramount Pictures公司發行的電影數量更多。# ## 問題四:改編電影和原創電影的對比情況如何?# In[67]:# keywords列數據格式化moviesdf[keywords] = moviesdf[keywords].apply(json.loads)# 調用自定義函數decode處理keywords列數據moviesdf[keywords] = moviesdf[keywords].apply(decode)moviesdf[keywords].tail()# In[68]:# 提取關鍵字a = based on novelmoviesdf[if_original] = moviesdf[keywords].str.contains(a).apply(lambda x: no original if x else original)moviesdf[if_original].value_counts()# In[69]:original_profit = moviesdf[[if_original,budget,revenue,profit]]original_profit = original_profit.groupby(by=if_original).mean()original_profit# In[70]:# 數據可視化plt.figure(figsize=(12,8))original_profit.plot(kind=bar)plt.title(改編電影與原創電影在預算、收入和利潤的比較)plt.xlabel(改編電影和原創電影)plt.ylabel(金額(美元))plt.show()# 分析結論:從圖上可以看出,改編電影的預算略高於原創電影,但改編電影的票房收入和利潤遠遠高於原創電影,# 這可能是改編電影擁有一定的影迷基礎。# ## 問題五:電影時長與電影票房及評分的關係# In[71]:# 電影時長與電影票房的關係moviesdf.plot(kind=scatter, x=runtime, y=vote_average, figsize=(8, 6))plt.title(電影時長與電影票房的關係,fontsize=15)plt.xlabel(電影時長(分鐘),fontsize=15)plt.ylabel(電影票房(美元),fontsize=15)plt.grid(True)plt.show()# In[72]:# 電影時長與評分的關係moviesdf.plot(kind=scatter, x=runtime, y=vote_average, figsize=(8, 6))plt.title(電影時長與電影平均評分的關係,fontsize=15)plt.xlabel(電影時長(分鐘),fontsize=15)plt.ylabel(電影平均評分,fontsize=15)plt.grid(True)plt.show()# 分析結論:從圖上可以看出,電影要想獲得較高的票房及良好的口碑,電影的時長應保持在90~150分鐘內。# ## 問題六:分析電影關鍵字# In[73]:# 利用電影關鍵字製作詞雲圖# 建立keywords_list列表keywords_list = []for i in moviesdf[keywords]: keywords_list.append(i) keywords_list = list(keywords_list) keywords_list# 把字元串列表連接成一個長字元串lis = .join(keywords_list)# 使用空格替換中間多餘的字元串slis.replace(s,)# In[74]:# 生成詞雲wc = WordCloud( background_color="black", # 背景顏色 max_words=2000, # 詞雲顯示的最大詞數 max_font_size=100, # 字體最大值 random_state=12, # 設置一個隨機種子,用於隨機著色 ) # 根據字元串生成詞雲wc.generate(lis) plt.figure(figsize=(16, 8))# 以下代碼顯示圖片 plt.imshow(wc) plt.axis("off") plt.show() # 分析結論:通過對電影關鍵字的分析,電影中經常被提及的詞語是女性(woman)、獨立(independent),其次是謀殺(murder)、愛情(love)、警察(police)、暴力(violence),可見觀眾對女性和獨立方面題材的電影最感興趣,其次是是犯罪類和愛情類電影。
推薦閱讀:
※在數據分析方面,比起python,excel的局限性在哪?
※學完 VB 後學什麼編程語言更好?
※樹的平衡與再平衡。
※Python爬蟲(3):爬取豆瓣電影TOP250
※python 爬蟲 圖片抓取問題,有的網站中的圖片不能抓取?

