首页 > Python笔记 阅读数:45

Python电影数据分析项目

我们之前已经学过 Python 的基础知识,本节教程我们就用之前学过的来做一个综合案例,电影数据分析。

项目描述

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。

表 1:IMDB5000 部电影数据的属性信息
变量 描述
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]
电影上映数量排名前10位国家及地区
图 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) 评分与票房之间相关性不是很明显,但是大部分评分高的影片,票房基本上也较高。

相关文章