Python数据分析实战:TMDB电影数据可视化
出品:Python數據之道 (ID:PyDataLab)?
作者:葉庭云
編輯:Lemon
一、數據預處理
本文將以項目實戰的形式,對 TMDB電影數據進行數據分析與可視化實戰,所使用的數據來源于 Kaggle,文末提供數據的下載方式。
import?json import?pandas?as?pd import?numpy?as?np from?datetime?import?datetime import?warningswarnings.filterwarnings('ignore')????#?不顯示告警信息 #?讀取電影數據??指定引擎??不然會報錯誤 df?=?pd.read_csv('tmdb_5000_movies.csv',?engine='python') df.head() #?由于數據集中包含的信息過多,其中部分數據并不是我們研究的重點,所以從中抽取分析要用的數據: #?關鍵詞??電影名稱??電影類型??首次上映日期??電影時長??預算??收入 df1?=?df[['keywords',?'original_title',?'genres',?'release_date',?'runtime',?'budget',?'revenue',?'vote_count',?'vote_average']] df1.info() #?方法二??查閱資料?填充缺失數據 #?IMDb官網??https://www.imdb.com/title/tt3856124/df1.loc[2656,?'runtime']?=?98.0 df1.loc[4140,?'runtime']?=?81.0 df1.loc[4553,?'release_date']?=?'2014-06-01' df1.info() #?genres列數據處理 df1['genres'].head() #?將str轉換為json df1['genres']?=?df1['genres'].apply(json.loads)def?decode(col):genre?=?[]for?item?in?col:genre.append(item['name'])return?'|'.join(genre)df1['genres']?=?df1['genres'].apply(decode) df1.head() #?提取release_date的年份 df1['release_date']?=?pd.to_datetime(df1['release_date']).dt.year #?改列的名稱 col?=?{'release_date':?'year'} df1.rename(columns=col,?inplace=True) df1['year'].apply(int).head()????#?轉為整數 #?保存為已清洗數據 df1.to_excel('已清洗數據.xlsx')二、數據分析
1. 建立包含年份與電影類型數量的關系數據框
各類型電影的數量如何隨著時間的推移發生變化的?建立包含年份與電影類型數量的關系數據框 提取取2000-2017年的各電影類型數量 ?熱力圖可視化
""" @Author ?:葉庭云 @Date ???:2020/10/2 11:40 """ import?pandas?as?pd import?matplotlib.pyplot?as?plt import?matplotlib?as?mpl import?seaborn?as?sns#?讀取Excel數據 df?=?pd.read_excel('已清洗數據.xlsx') #?有個別行數據清洗時不是nan?但為空列表?提取后為nan df.dropna(inplace=True) #?建立genres列表,提取電影的類型 genres_set?=?set() for?genre?in?df['genres'].str.split('|'):for?item?in?genre:genres_set.add(item)genres_list?=?list(genres_set)for?genre?in?genres_list:#?判斷每行??有這個類型??對應類型的列下添個1df[genre]?=?df['genres'].str.contains(genre).apply(lambda?x:?1?if?x?else?0)genre_year?=?df.loc[:,?genres_list] #?將年份作為索引標簽 genre_year.index?=?df['year'] #?將數據集按年份分組并求和,得出每個年份,各電影類型的電影總數 genresdf?=?genre_year.groupby('year').sum() #?包含年份與電影類型數量的DataFrame print(genresdf) #?取2000-2016年的電影類型數量??熱力圖可視化?17年數據就沒幾部 datas?=?genresdf.iloc[-18:-1:1,?::] mpl.rcParams['font.family']?=?'Kaiti' fig,?ax?=?plt.subplots(figsize=(15,?9)) print(datas) #?繪制熱力圖??? cmap:從數字到色彩空間的映射 sns.heatmap(data=datas.T,?linewidths=0.25,linecolor='white',?ax=ax,?annot=True,fmt='d',?cmap='Accent',?robust=True,)#?添加描述信息???x?y軸??title ax.set_xlabel('年份',?fontdict={'size':?18,?'weight':?'bold'}) ax.set_ylabel('電影類型',?fontdict={'size':?18,?'weight':?'bold'}) ax.set_title(r'2000-2016年各電影類型數量',?fontsize=25,?x=0.5,?y=1.02)#?隱藏邊框 ax.spines['top'].set_visible(False) ax.spines['right'].set_visible(False) ax.spines['left'].set_visible(False) ax.spines['bottom'].set_visible(False)#?保存?展示圖片 plt.savefig('heat_map.png') plt.show()從熱力圖可以直觀分析出,Drama 和 Comedy 每年的電影數量都比較多,Thriller每年的電影數量也比較可觀。
2. 數量最多的電影類型Top10
""" @Author ?:葉庭云 @Date ???:2020/10/2 11:40 """ import?pandas?as?pd import?matplotlib.pyplot?as?plt import?matplotlib?as?mpl#?讀取數據 df?=?pd.read_excel('已清洗數據.xlsx') #?有個別行提取類型時不是nan?但為空列表?再提取后為nan df.dropna(inplace=True) #?建立genres列表,提取電影的類型 genres_set?=?set() for?genre?in?df['genres'].str.split('|'):for?item?in?genre:genres_set.add(item)genres_list?=?list(genres_set)for?genre?in?genres_list:#?判斷每行??有這個類型??對應類型的列下添個1df[genre]?=?df['genres'].str.contains(genre).apply(lambda?x:?1?if?x?else?0)genre_year?=?df.loc[:,?genres_list] #?將年份作為索引標簽 genre_year.index?=?df['year'] #?將數據集按年份分組并求和,得出每個年份,各電影類型的電影總數 genresdf?=?genre_year.groupby('year').sum() genres_count?=?genresdf.sum(axis=0).sort_values(ascending=False)????#?升序 #?print(genres_count.index) #?print(genres_count.values) colors?=?['#FF0000',?'#FF1493',?'#00BFFF',?'#9932CC',?'#0000CD',?'#FFD700',?'#FF4500',?'#00FA9A',?'#191970','#006400'] #?設置大小???像素 plt.figure(figsize=(12,?8),?dpi=100) #?設置中文顯示 mpl.rcParams['font.family']?=?'SimHei' plt.style.use('ggplot') #?繪制柱形圖??設置柱條的寬度和顏色 plt.barh(genres_count.index[9::-1],?genres_count.values[9::-1],?height=0.6,?color=colors[::-1]) plt.xlabel('電影數量',?fontsize=12) plt.ylabel('電影類型',?fontsize=12,?color='red') plt.title('數量最多的電影類型Top10',?fontsize=18,?x=0.5,?y=1.05) plt.savefig('test_001.png') plt.show()電影數量最多的電影類型前五為:Drama(戲劇)、Comedy(喜劇)、Thriller(驚悚)、Action(動作)、Romance(浪漫)
3. 各種電影類型所占比例
""" @Author ?:葉庭云 @Date ???:2020/10/2 11:40 """ import?pandas?as?pd import?matplotlib.pyplot?as?plt import?matplotlib?as?mpldf?=?pd.read_excel('已清洗數據.xlsx') #?有個別行提取類型時不是nan?但為空列表?提取后為nan df.dropna(inplace=True) #?建立genres列表,提取電影的類型 genres_set?=?set() for?genre?in?df['genres'].str.split('|'):for?item?in?genre:genres_set.add(item)genres_list?=?list(genres_set)for?genre?in?genres_list:#?判斷每行??有這個類型??對應類型的列下添個1df[genre]?=?df['genres'].str.contains(genre).apply(lambda?x:?1?if?x?else?0)genre_year?=?df.loc[:,?genres_list] #?將年份作為索引標簽 genre_year.index?=?df['year'] #?將數據集按年份分組并求和,得出每個年份,各電影類型的電影總數 genresdf?=?genre_year.groupby('year').sum() genres_count?=?genresdf.sum(axis=0).sort_values(ascending=False)????#?升序 #?print(genres_count.index) #?print(genres_count.values) #?print(len(genres_count.values))#?設置中文顯示 mpl.rcParams['font.family']?=?'SimHei' #?設置大小??像素 plt.figure(figsize=(12,?8),?dpi=100) plt.axes(aspect='equal')???#?保證餅圖是個正圓 explodes?=?[0,?0,?0,?0,?0,?0,?0,?0,?0,?0,?0,?0,?0,?0,?0.1,?0.25,?0.4,?0.55,?0.7,?0.85] plt.pie(genres_count.values,?labels=genres_count.index,autopct='%.2f%%',?shadow=True,?explode=explodes,startangle=15,?labeldistance=1.1,) plt.title('各種電影類型所占比例',?fontsize=18) plt.savefig('test_002.png') plt.show()在所有的電影類型中,Drama(戲劇)類型電影最多,占比高達18.89%,其次為Comedy(喜劇),占比14.16%。
4. 電影關鍵詞分析
""" @Author ?:葉庭云 @Date ???:2020/10/2 11:40 """ import?pandas?as?pd import?collections from?wordcloud?import?WordCloud import?matplotlib.pyplot?as?pltdf?=?pd.read_csv('tmdb_5000_movies.csv')['keywords']key_words_list?=?[] for?item?in?df:item?=?eval(item)if?item:?????#?為空列表??濾掉#?['aftercreditsstinger',?'duringcreditsstinger']??這個詞語頻率比較高?但好像沒啥意義??濾掉key_words_list.extend([x['name']?for?x?in?item?if?x['name']?not?in?['aftercreditsstinger',?'duringcreditsstinger']])words_count?=?collections.Counter(key_words_list) print(words_count)wc?=?WordCloud(background_color='white',max_words=2000,max_font_size=100,random_state=8, )wc.generate_from_frequencies(words_count) plt.imshow(wc) plt.axis('off') plt.savefig('test_003.png') plt.show()通過對電影關鍵字的詞云圖分析,可以發現電影中經常被提及的關鍵詞是女性(woman)、獨立(independent),其次是謀殺(murder)、暴力(violence)、復仇(revenge)、基于小說(based on novel),可見觀眾對女性和獨立方面題材的電影最感興趣,其次是犯罪類和基于小說改編的電影。
5. 各類型電影數量隨時間變化趨勢
""" @Author ?:葉庭云 @Date ???:2020/10/2 11:40 """ import?pandas?as?pd import?matplotlib.pyplot?as?plt import?matplotlib?as?mpl#?讀取數據 df?=?pd.read_excel('已清洗數據.xlsx') #?有個別行提取類型時不是nan?但為空列表?提取后為nan df.dropna(inplace=True) #?建立genres列表,提取電影的類型 genres_set?=?set() for?genre?in?df['genres'].str.split('|'):for?item?in?genre:genres_set.add(item)genres_list?=?list(genres_set)for?genre?in?genres_list:#?判斷每行??有這個類型??對應類型的列下添個1df[genre]?=?df['genres'].str.contains(genre).apply(lambda?x:?1?if?x?else?0)genre_year?=?df.loc[:,?genres_list] #?將年份作為索引標簽 genre_year.index?=?df['year'] #?將數據集按年份分組并求和,得出每個年份,各電影類型的電影總數 genresdf?=?genre_year.groupby('year').sum() print(genresdf) #?設置中文顯示 mpl.rcParams['font.family']?=?'SimHei' #?設置大小??像素 plt.figure(figsize=(10,?6),?dpi=100) #?設置圖形顯示風格 plt.style.use('ggplot') #?DataFrame?繪制折線圖 plt.plot(genresdf,?label=genresdf.columns) #?添加描述信息 plt.xticks(range(1915,?2018,?5)) plt.xlabel('年份',?fontsize=12) plt.ylabel('電影數量',?fontsize=12) plt.title('各電影類型的數量隨時間變化趨勢',?fontsize=18,?x=0.5,?y=1.02) #?顯示圖例 plt.legend(genresdf) #?保存圖片 plt.savefig('test_004.png') #?展示圖片 plt.show()從折線圖圖中容易發現,隨著時間的推移,所有電影類型都呈現出增長趨勢,大概在1992年以后各類型的電影均增長迅速,可能原因為人們物質生活水平提高,對觀影有了更多需求,其中Drama(戲劇)和Comedy(喜劇)增長最快,目前仍是最熱門的電影類型。
6. 電影票房與電影時長關系
""" @Author ?:葉庭云 @Date ???:2020/10/2 11:40 """ import?pandas?as?pd import?matplotlib?as?mpl import?matplotlib.pyplot?as?plt#?讀取數據 df?=?pd.read_excel('已清洗數據.xlsx') #?電影時長???票房 run_time,?revenue?=?df['runtime'],?df['revenue']#?設置中文顯示 mpl.rcParams['font.family']?=?'SimHei' #?設置圖形顯示風格 plt.style.use('ggplot') #?設置大小??像素 plt.figure(figsize=(9,?6),?dpi=100) #?繪制散點圖 plt.scatter(run_time,?revenue) #?添加描述信息 plt.title('電影票房與電影時長的關系',?fontsize=18,?x=0.5,?y=1.02) plt.xlabel('電影時長(分鐘)') plt.ylabel('電影票房(億美元)') #?保存圖片 plt.savefig('test_005.png') #?顯示圖片 plt.show()7. 電影平均評分與電影時長關系
""" @Author ?:葉庭云 @Date ???:2020/10/2 11:40 @CSDN ???:https://blog.csdn.net/fyfugoyfa """ import?pandas?as?pd import?matplotlib?as?mpl import?matplotlib.pyplot?as?plt import?numpy?as?np#?讀取數據 df?=?pd.read_excel('已清洗數據.xlsx') #?提取電影時長??平均評分 run_time,?rating_score?=?df['runtime'],?df['vote_average']#?設置中文顯示 mpl.rcParams['font.family']?=?'SimHei' #?設置圖形顯示風格 plt.style.use('ggplot') #?設置大小??像素 plt.figure(figsize=(9,?6),?dpi=100) #?繪制散點圖 plt.scatter(run_time,?rating_score,?c='purple') plt.yticks(np.arange(0,?10.5,?1)) #?添加描述信息 plt.title('電影平均評分與電影時長的關系',?fontsize=18,?x=0.5,?y=1.02) plt.xlabel('電影時長(分鐘)') plt.ylabel('平均評分') #?保存圖片 plt.savefig('test_006.png') #?顯示圖片 plt.show()從兩幅散點圖可以看出,電影要想獲得較高的票房及良好的口碑,電影的時長應保持在 100-150 分鐘內較好。
作者簡介:
葉庭云
個人格言: 熱愛可抵歲月漫長
CSDN 博客: https://blog.csdn.net/fyfugoyfa/
本文數據獲取方式
本文數據可以通過下述步驟來獲取:
??1. 掃描下方二維碼
? 2. 回復關鍵詞:電影
(建議復制關鍵詞)
????長按上方二維碼?2 秒 回復「電影」即可獲取資料總結
以上是生活随笔為你收集整理的Python数据分析实战:TMDB电影数据可视化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 台安变频器n2按键说明_台安变频器N2
- 下一篇: 学习Java技术Eclipse版本的选择