Python电影数据分析项目
我们之前已经学过 Python 的基础知识,本节教程我们就用之前学过的来做一个综合案例,电影数据分析。
IMDB 创建于 1990 年 10 月 17 日,从 1998 年开始成为亚马逊公司旗下网站。IMDB 正式启动于 1993 年,目前已经成为互联网上第一个完全以电影为内容的网站。与之相似的国内网站有豆瓣网站。
在电影数据分析项目中,选择的数据集是从 IMDB 网站上抓取的 5043 部电影数据,该数据集称为 IMDB5000 部电影数据集,文件名为 movie_metadata.csv。在该电影数据集中包含有 28 个属性,4906 张海报,电影时间跨度超过 100 年,共有 66 个国家及地区的影片,并包括 2399 位导演和数千位演员的信息。
其中,IMDB5000 部电影数据集的 28 个属性信息见表 1。
要求根据 IMDB5000 部电影数据集进行下列数据分析。
1) 电影出品国及地区的情况分析。
2) 电影数量的分析。
3) 电影类型的分析。
4) 电影票房统计及电影票房相关因素分析。
5) 电影评分统计及电影评分相关因素分析
下面将根据数据分析的问题,利用 Jupyter Notebook 集成开发环境说明电影数据分析项目的操作步骤及相关程序代码。
在准备数据中,主要的任务是导入“movie_metadata.csv”数据集,其程序代码如下。
2) 显示电影出品数量排名前 10 位的国家及地区
3) 绘制电影出品数量排名前 10 位的柱形图(见图 1)

图 1:电影上映数量排名前 10 位国家及地区
2) 绘制每年的电影数量图形(见图 2)

图 2:每年的电影数量
3) 按年份统计每年电影总数量、彩色影片数量和黑白影片数量并绘制图形(见图 3)

图 3:每年的电影总数量、彩色影片数量和黑白影片数量
1) 计算不同类型的电影数量
首先用 for 循环语句遍历 movies_df_new 数据框中电影类型(Genres)列,用 split() 分隔该列中的每一行的字符串,并将分隔的字符串保存到 types 列表中,然后将列表转换成 types_df 数据框,再计算每一个电影类型数量。
2)绘制不同类型的电影数量图形(见图 4)

图 4:不同类型的电影数量
3)绘制各个电影类型的比例饼图(见图 5)

图 5:电影类型的分布比例
2) 绘制每年票房统计图(见图 6)

图 6:每年票房统计图
3) 查看票房收入排名前 20 位电影片名和类型
4) 电影评分与票房的关系散点图(见图 7)

图 7:电影评分与票房的关系
5) 电影时长与票房的关系散点图(见图 8)

图 8:电影时长与票房的关系
2) 评分与受欢迎程度的关系散点图(见图 9)

图 9:评分与受欢迎程度的关系
2) 电影产业的高速发展始于 20 世纪 90 年代,彩色电影发展迅速,其中剧情片(Drama)、喜剧片(Comedy)、惊悚片(Thriller)、动作片(Action)、爱情片(Romance)是所有电影类型中产量较高的几种类型。
3) 电影票房收入从 20 世纪 90 年代后高速增长。
4) 票房收入排名前 20 位的电影主要有《阿凡达》《泰坦尼克号》《侏罗纪世界》和《复仇者联盟》等,类型主要为科幻、爱情、动作和冒险类,说明这类电影一般情况能产生较高的票房收益。
5) 评分前 20 位的电影主要有《肖申克的救赎》《教父》《蝙蝠侠:黑暗骑士》《教父 2》和《黄金三镖客》等。
6) 评分与受欢迎程度之间相关性不是很明显,但是大部分受欢迎度高的影片,评分也是高的。
7) 从电影时长与票房的关系可见,电影时长过短或过长票房效果都不佳,一般电影时长在 90~160 分钟最佳。
8) 评分与票房之间相关性不是很明显,但是大部分评分高的影片,票房基本上也较高。
项目描述
IMDB(Internet Movie Data Base,互联网电影数据库)是目前全球互联网中最大的一个电影资料库,在该电影资料库中有丰富的电影作品信息,包括影片演员、导演、电影题材、片长、剧情关键字、分级、评分等关于影片的基本信息,其中使用最多的就是 IMDB 的评分。IMDB 创建于 1990 年 10 月 17 日,从 1998 年开始成为亚马逊公司旗下网站。IMDB 正式启动于 1993 年,目前已经成为互联网上第一个完全以电影为内容的网站。与之相似的国内网站有豆瓣网站。
在电影数据分析项目中,选择的数据集是从 IMDB 网站上抓取的 5043 部电影数据,该数据集称为 IMDB5000 部电影数据集,文件名为 movie_metadata.csv。在该电影数据集中包含有 28 个属性,4906 张海报,电影时间跨度超过 100 年,共有 66 个国家及地区的影片,并包括 2399 位导演和数千位演员的信息。
其中,IMDB5000 部电影数据集的 28 个属性信息见表 1。
变量 | 描述 |
---|---|
rnovie_title | 电影片名 |
color | 画面颜色 |
genres | 电影题材 |
duration | 电影时长 |
director_name | 导演姓名 |
actor_1_name | 男一号演员姓名 |
actor_2_name | 男二号演员姓名 |
actor_3_name | 男三号演员姓名 |
num_critic_for_reviews | 评论家评论的数量 |
num_user_for_reviews | 用户的评论数量 |
director_facebook_likes | 脸书喜欢该导演的人数 |
actor_1_facebook_likes | 脸书上喜爱男一号的人数 |
actor_2_facebook_likes | 睑书上喜爱男二号的人数 |
actor_3_facebook_likes | 脸书上喜爱男三号的人数 |
gross | 总票房 |
num_voted_users | 参与投票的用户数量 |
cast_total_facebook_likes | 脸书上投喜爱的总数 |
movie_facebook_likes | 脸书上被点赞的数量 |
facenumber_in_poster | 海报中的人脸数量 |
plot_keywords | 剧情关键字 |
country | 国家及地区 |
content_rating | 电影分级 |
budget | 制作成本 |
title_year | 电影年份 |
imdb_score | IMDB上的评分 |
movie_imdb_link | IMDB地址 |
aspect_ratio | 画布的比例 |
language | 语言 |
要求根据 IMDB5000 部电影数据集进行下列数据分析。
1) 电影出品国及地区的情况分析。
2) 电影数量的分析。
3) 电影类型的分析。
4) 电影票房统计及电影票房相关因素分析。
5) 电影评分统计及电影评分相关因素分析
下面将根据数据分析的问题,利用 Jupyter Notebook 集成开发环境说明电影数据分析项目的操作步骤及相关程序代码。
准备数据
在项目描述中,已经阐述了 IMDB5000 部电影数据分析的具体要求,并介绍了电影数据集“movie_metadata.csv”的结构。在确定了数据分析问题后,下面的步骤是准备数据。在准备数据中,主要的任务是导入“movie_metadata.csv”数据集,其程序代码如下。
In [1]: import pandas as pd import matplotlib.pyplot as plt In [2]: #加载数据 movies_df = pd.read_csv('d:/data/movie_metadata.csv',encoding="GBK") In [3]: movies_df.head() #输出默认前5行 In [4]: movies_df.info() #输出movies_df的信息 movies_df.describe() #输出movies_df的基本统计量和分位数等值
数据清洗
当数据导入完成后,下一步要完成的工作就是数据清洗。在电影数据分析项目中,数据清洗的主要任务是对原始数据集进行缺失值和重复值的处理。其程序代码如下。1. 统计每列缺失值个数
In [5]: column_null_number = movies_df.isnull().sum() In [6]: print('每列缺失值个数','\n',column_null_number)
2. 删除任何含有缺失值的行
In [7]: movies_df_nonull = movies_df.dropna() In [8]: print('每列缺失值个数','\n',movies_df_nonull.isnull().sum())
3. 删除重复数据
In [9]: movies_df_new = movies_df_nonull.drop_duplicates(keep='first')
4. 查看数据清洗后信息
In [10]: movies_df_new.count() In [11]: movies_df_new.head() #输出默认前5行
5. 输出 movies_df_new 的基本统计量和分位数等值
In [12]: movies_df_new.describe()通过删除缺失值和重复数据,获得一个数据清洗后的“干净”数据 movies_df_new,有效数据记录为 3723 条。
数据分析与数据可视化
在电影数据分析项目中,数据分析主要内容和相关程序代码如下。1. 电影出品国及地区的情况分析
1) 统计每个国家及地区出品的电影数量In [13]: country_group = movies_df_new.groupby('country').size() In [14]: country_group
2) 显示电影出品数量排名前 10 位的国家及地区
In [15]: group_head_10=country_group.sort_values(ascending=False).head(10) In [16]: group_head_10
3) 绘制电影出品数量排名前 10 位的柱形图(见图 1)
In [17]: group_head_10.plot(kind = 'bar') Out[17]

图 1:电影上映数量排名前 10 位国家及地区
2. 电影数量分析
1) 按年份统计每年的电影数量In [18]: group_year= movies_df_new.groupby('title_year').size() In [19]: group_year
2) 绘制每年的电影数量图形(见图 2)
In [20]: group_year.plot() Out[20]

图 2:每年的电影数量
3) 按年份统计每年电影总数量、彩色影片数量和黑白影片数量并绘制图形(见图 3)
In [21]: movies_df_new['title_year'].value_counts().sort_index().\ plot(kind='line',label='total number') movies_df_new[movies_df_new['color']=='Color']['title_year'].\ value_counts().sort_index().plot(kind='line',\ c='red',label='color number') movies_df_new[movies_df_new['color']!='Color']['title_year'].\ value_counts().sort_index().plot(kind='line',c='black',\ label='Black White number') plt.legend(loc='upper left') Out[21]

图 3:每年的电影总数量、彩色影片数量和黑白影片数量
3. 电影类型的分析
根据电影数据集中影片类型属性的格式,如“Action|Adventure|Fantasy|Sci-Fi”可见,影片类型是由表示影片类型关键字组成,每个影片类型关键字用“|”分隔符分隔。1) 计算不同类型的电影数量
首先用 for 循环语句遍历 movies_df_new 数据框中电影类型(Genres)列,用 split() 分隔该列中的每一行的字符串,并将分隔的字符串保存到 types 列表中,然后将列表转换成 types_df 数据框,再计算每一个电影类型数量。
In [22]:types = [] for tp in movies_df_new['genres']: sp = tp.split('|') for x in sp: types.append(x) types_df = pd.DataFrame({'genres':types}) In [23]: types_df_counts = types_df['genres'].value_counts() In [24]: types_df_counts Out[24]: Drama 1876 Comedy 1455 Thriller 1105 Action 951 Romance 851 Adventure 773 Crime 704 Fantasy 504 Sci-Fi 492 Family 440 Horror 386 Mystery 378 Biography 238 Animation 196 War 150 Music 149 Sport 147 History 147 Musical 96 Western 57 Documentary 45 Film-Noir 1 Name: genres, dtype: int64
2)绘制不同类型的电影数量图形(见图 4)
In [25]:types_df_counts.plot(kind='bar') plt.xlabel('genres') plt.ylabel('number') plt.title('genres&number') Out[25]

图 4:不同类型的电影数量
3)绘制各个电影类型的比例饼图(见图 5)
In [26]:b1 = types_df_counts/types_df_counts.sum() explode = (b1>=0.06)/20+0.02 types_df_counts.plot.pie(autopct='%1.1f%%',figsize=(8,8),\ label='',explode=explode) plt.title('Movie Type Proportional Distribution Map') Out[26]

图 5:电影类型的分布比例
4. 电影票房统计及电影票房相关因素的分析
1) 每年票房统计In [27]: year_gross = movies_df_new.groupby('title_year')['gross'].sum()
2) 绘制每年票房统计图(见图 6)
In [28]:year_gross.plot(figsize=(10,5)) plt.xticks(range(1915,2018,5)) plt.xlabel('year') plt.ylabel('gross') plt.title('year&gross') Out[28]

图 6:每年票房统计图
3) 查看票房收入排名前 20 位电影片名和类型
In [29]: movie_grose_20 = movies_df_new.sort_values(['gross'],\ ascending=False).head(20) In [30]: movie_grose_20[['movie_title','gross','genres']]
4) 电影评分与票房的关系散点图(见图 7)
In [31]: plt.scatter(x= movies_df_new.imdb_score,y= \ movies_df_new.gross/1000000000) plt.xlabel('imdb_score') plt.ylabel('gross') plt.title('imdb_score&gross') Out[31]

图 7:电影评分与票房的关系
5) 电影时长与票房的关系散点图(见图 8)
In [32]: plt.scatter(x= movies_df_new.duration,y= \ movies_df_new.gross/1000000000) plt.xlabel('duration') plt.ylabel('gross') plt.title('duration&gross') Out[32]

图 8:电影时长与票房的关系
5. 电影评分统计及电影评分相关因素分析
1) 显示在 IMDB 网站上评分排名前20位电影的片名和评分。In [33]: movie_score_20 = movies_df_new.sort_values(['imdb_score'],\ ascending=False).head(20) In [34]: movie_score_20[['movie_title','imdb_score']]
2) 评分与受欢迎程度的关系散点图(见图 9)
In [35]: plt.scatter(x= movies_df_new.imdb_score,y= \ movies_df_new.movie_facebook_likes) plt.xlabel('imdb_score') plt.ylabel('movie_facebook_likes') plt.title('imdb_score&likes') Out[35]

图 9:评分与受欢迎程度的关系
6. 分析总结
1) 电影高产地区主要集中在欧美。2) 电影产业的高速发展始于 20 世纪 90 年代,彩色电影发展迅速,其中剧情片(Drama)、喜剧片(Comedy)、惊悚片(Thriller)、动作片(Action)、爱情片(Romance)是所有电影类型中产量较高的几种类型。
3) 电影票房收入从 20 世纪 90 年代后高速增长。
4) 票房收入排名前 20 位的电影主要有《阿凡达》《泰坦尼克号》《侏罗纪世界》和《复仇者联盟》等,类型主要为科幻、爱情、动作和冒险类,说明这类电影一般情况能产生较高的票房收益。
5) 评分前 20 位的电影主要有《肖申克的救赎》《教父》《蝙蝠侠:黑暗骑士》《教父 2》和《黄金三镖客》等。
6) 评分与受欢迎程度之间相关性不是很明显,但是大部分受欢迎度高的影片,评分也是高的。
7) 从电影时长与票房的关系可见,电影时长过短或过长票房效果都不佳,一般电影时长在 90~160 分钟最佳。
8) 评分与票房之间相关性不是很明显,但是大部分评分高的影片,票房基本上也较高。