TMDB电影数据分析(下)

🌟欢迎来到 我的博客 —— 探索技术的无限可能!


🌟博客的简介(文章目录)

TMDB电影数据分析(下)

      本文对源自Kaggle TMDB电影数据集进行分析影响电影票房的因素,数据分析流程包含数据集概分析、数据清洗、数据统计以及分析影响电影票房的因素。影响票房因素可能是电影预算、电影类型、电影时长、受欢迎程度、电影评分,发行时间等有关系,通过具体数据进行分析影响票房的因素。

数据集概分析 以及 数据清洗

接上文TMDB电影数据分析(上)

数据统计

1、查看收入前十的电影信息

      初步猜测影响电影收入的因素是电影预算,电影类型,上映年份,电影时长,评分,参与评分次数,受欢迎程度等。下面我们找出电影收入最高的前十部电影的基本信息。
在这里插入图片描述

      第一行代码调用sort_values()方法针对revenue字段进行降序排列并取前10行记录赋值给top10变量。该变量的值是一份DataFrame表格,一共有11行,第一行是列标题,剩下10行是电影收入排名前十的电影信息。第二行代码输出top10表格中的buget、genres、original_title等字段,结果发现电影收入排名前十的电影预算相对高,genres字段中id为12、name为Adventure的电影和id为28、name为Action的电影占比较大,release_date字段中显示上映年份基本分布在2000年后,vote_count字段表明参与评分次数相对充足,从vote_average字段看出收入高的电影评分不低,而popularity字段显示高收入电影的受欢迎程度。

2、计算收入与其他字段相关系数

      第一行代码在原数据集中增加一个release_year字段,数据集中提供了电影上映日期,但release_data字段值的数据类型不是日期类型,使用DataFrame的to_datatime()函数将指定格式转为日期格式,使用year属性获取日期中的年份作为新增字段的值。为了验证猜测,第二行代码中调用DataFrame的corr()函数计算budget、release_year、runtime、popularity、vote_average、vote_count等字段与revenue(电影收入)字段的相关性,获取发现revenue字段与budget、popularity及vote_count字段相关系数分别为0.70、0.60及0.76,具有高相关性,revenue字段与runtime、release_year、vote_average字段相关系数分别为0.23、0.14、0.18,具有低相关性。
在这里插入图片描述

3、查看电影年份分布

      首先调用DataFrame中的value_counts()方法对release_year字段值进行频数统计,得出各个年度发行的电影数量,数据集中电影发行年份自1916年起,包含89个年份的电影信息。
在这里插入图片描述

      通过绘制直方图直观看出电影在各年度的分布情况,如下图所示。
在这里插入图片描述

      从图中可以看出,电影发行年份集中在2000-2016年之间。

4、查看电影时长分布

      统计不同时长电影的数量,通过数据可以看出数据集中记录的电影时长总共有136个以及不同时长电影的数量。
在这里插入图片描述

      通过直方图可以直观看出电影时长集中分布在80-130之间,其中时长在90-110的电影数量占比较大。
在这里插入图片描述

5、查看预算分布

在这里插入图片描述

      数据集中低预算电影占比较大,预算集中在0至0.5x108

6、查看评分分布

在这里插入图片描述

      电影的评分集中分布在5-7分

7、查看评论次数分布

在这里插入图片描述

      数据集中绝大多数电影评论次数低于2000,其中评论次数在500以内评论次数占比最大。

影响收入的因素分析

1、绘制电影收入与影响因子散点图

      下面的代码绘制budget、release_year、runtime、popularity、vote_average、vote_count等字段与revenue字段的散点图。Matplotlib.pyplot模块参数可用plt.rcParams[‘配置参数’]=[修改值]进行修改默认配置,rcParams即run configuration parameters运行配置参数。第一行代码修改配置参数中的字体(font)为黑体(SimHei),是为了在图中可以正常显示中文。第三行代码使用Matplotlib.pyplot模块提供的subplots()函数返回一个元组,包括一个图形对象和所有的axes对象作为元素的ndarray对象,ndarray是2行3列的矩阵,每一个axes对象通过索引进行访问,索引下标从0开始。为每一个axes对象调用scatter()方法绘制散点图,并调用set_title()方法为每个axes对象增加标题。完成子图绘制后,代码第7行调用suptitle()方法为fig对象增加一个标题。效果如下图所示;

在这里插入图片描述
在这里插入图片描述

      上图的第一行标题为budget、popularrity、vote_count的三个子图能更可以直观看出,budget、popularrity、vote_count字段与revenue字段呈线性分布,意味着随影响因子增长,收入整体均呈增长趋势。而第二行标题为vote_average、runtime、release_year的三个子图表明,vote_average、runtime、release_year字段与revenue字段没有明显的线性关系。

2、分组分析电影收入与影响因子的关系

      由于电影发行时间集中在2000年以后,为了更好研究影响电影票房的因素,我们针对2001年至2015年发布的电影数据做进一步分析。

      首先,提取出发行年份在2001年至2015年的所有电影,保存到movies中,筛选后数据还有2103条记录。
在这里插入图片描述

      电影中数据记录了2001至2015总共15年的电影数据,时间跨度可能会相对大一些,按照年份进行分组,以每5年作为一组,将电影数据分成三组,针对每一组数据分析影响电影票房的因素。
在这里插入图片描述

      接下来,使用cut()方法将电影票房按照四分位点划分为四个等级,分别为’Low’, ‘Medium’, ‘Moderately High’, ‘High’,也即“低”、“中下”、“中上”和“高”。
在这里插入图片描述

      划分等级后,按照revenueclass、 fiveyearclass字段对数据进行分组,取出各组数据的中位数,保存到变量d_summary中。
在这里插入图片描述

      按年份分组后,得到三组数据,分别为‘2001-2005年’,‘2006-2010年’,‘2011-2015年’,针对每一组数据进行分析,随着收入越高,对应的预算越高,受欢迎程度越高,评论次数越多,电影时长、评分情况表现不明显。下面通过绘制条形图可以更直观的显示影响收入的因素。

      下面代码调用matplotlib.pyplot模块中bar()函数绘制电影收入与预算、受欢迎度、评论次数、评分、时长、发行年份之间关系的条形图。
在这里插入图片描述

在这里插入图片描述

      上图中含有6幅图,图中横坐标表示收入等级,纵坐标表示影响因素,针对每一幅图,同一收入等级中有三根柱子,从左向右以此表示为第一个5年数据,即2001至2005年电影数据,第二个5年数据,即2006至2010年电影数据,第三个5年数据,即2011至2015年电影数据。第一行分别绘制收入与预算条形图、收入与受欢迎程度条形图、收入与评论次数条形图。从收入与受欢迎程度图像可以看出,三组5年数据,每一组数据均是当电影票房高时,对应受欢迎程度也高,当收入处于同一个等级时,随着时间的推移,电影受欢迎程度略微增高,可能电影受欢迎层度受时间影响,间接影响着电影票房。

      针对收入与预算条形图,对于每一组年份,预算对票房的影响比较明显,收入高的电影,对应预算也高,即随着预算增加,电影票房也增加。说明投资方在制片质量上具有保障性,外加对影片宣传力度大,使票房得以提高。另外,针对收入等级相同时,预算投入与时间没有直接关系,说明不会因为当时时代背景而影响电影预算投入。

      针对收入与评论次数条形图,电影票房受评论次数影响比较大,参与评论的次数多的电影,电影票房高。

      第二行分别绘制收入与评分条形图、收入与时长条形图、收入与年份条形图。从这三幅条形图可以看出,电影收入与电影评分、电影时长、电影发行年份的关联度不明显。说明评分高低、时长长短及上映年份与电影收入无关。

3、分析电影类型对电影收入的影响

      由于每一部电影类型可以兼有多种类型,数据集中genres字段值是以字典数据类型给出。定义一个counttype函数,以数据集作为参数,使用for循环遍历genres字段数据,函数返回值为以电影类型为键,电影类型数量为值构成键值对的字典。
在这里插入图片描述

      针对数据集数据统计各种类型电影数量,将统计结果绘制成条形图,可以更直观查看不同类型电影数量,发现Drama、Comedy是占比最多的。

在这里插入图片描述
在这里插入图片描述

      按照受欢迎程度进行排序,提取最受欢迎前100部电影。并统计最受欢迎的100部电影不同类型占比。由于每一部电影类型可以兼有多种类型,数据集中genres字段值是以字典数据类型给出。使用for循环遍历genres字段数据,并以电影类型为键,电影数目为值构成的键值对作为元素存储到moviestype字典中,得到最受欢迎前100部电影不同类型的数量。
在这里插入图片描述
在这里插入图片描述

      100部最受欢迎电影中,其中Adventure类型和Action类型占比较高。猜测Adventure类型和Action类型是最受欢迎的两类电影,电影类型会影响电影受欢迎程度。

      针对不同收入等级统计电影类型出现频数,并提取频数最多的前5种类型电影,绘制条形图,效果如下:
在这里插入图片描述

在这里插入图片描述

      Action、Adventure、Drama、Comedy、Thriller等类型电影在收入不同等级中占比都很高,考虑到Drama、Comedy在整体电影类型占比中基数比较大,可以猜测电影类型对电影票房具有一定影响,但影响不明显。电影票房可能与影片质量本身有密切关系。

      本博客采用TMDB电影数据集,记录了1919-2016年间电影4803组数据,从电影的评分、预算、受欢迎程度、评论次数、时长、类型以及票房等信息进行分析评价,主要有以下结论:

      (1) 电影评分主要集中在5-7分,电影评分与电影收入没有明显关联关系。说明评分高低不代表电影好坏,不一定能带来更好收益,可能有一大部分观众没有参与评分。

      (2) 电影受欢迎程度,电影预算及评论数量直接影响电影收入。说明电影拍摄前期在灯光、演员、道具、服饰、制作等方面投入较大,保证影片质量,另外收入高的影片,参与评论次数多,观众更受欢迎,说明可以电影宣传比较到位,宣传力度大。

      (3) 最受欢迎的电影类型是Adventure,Action,且收入最高的电影类型依然是Adventure,Action,说明电影类型对电影收入有一定影响,但影响不明显。推测可能与电影上映地区的文化有关。

      (4) 电影时长对电影收入影响不大,记录中电影时长集中分布在90-110分钟,推测原因是数据集中不同时长的数据量过少,体现不出时长和收入的关系,另外,收入高的电影时长比较适中,所以电影时长适中才能保证观众对电影满意,同时能够保证拍片质量,创造更多收益;时长过短,无法保证质量,过长影响观众的观感。

一、数据分析项目介绍 1. 项目所需的模块库介绍 pandas用法: 需要导入以下模块 import numpy as np import pandas as pd from pandas import Series, Dataframe 2.项目背景介绍 互联网电影资料库(Internet Movie Database,简称IMDB)是一个关于电影演员、电影、电视节目、电视明星和电影制作的在线数据库。电影作为艺术和娱乐载体已成为我们生活中的一部分,作为电影爱好者之一,希望通过分析了解电影市场大体情况,以便于以后选择电影观看。 使用的数据是IMDB美国票房排名前1000的电影数据,数据包含了电影名称,票房金额,上映年份,演职人员,IMDB评分,电影类型等信息,数据中的很多电影大家也比较熟悉。相信不少人都有这样的经历,当想要看一部电影的时候,会去百度一下谁是导演,谁是主演。如果导演是克里斯托弗•诺兰,心里已经给电影打了个8分以上的评分了。而阿汤哥的动作片,预期也都能肾上腺素飙升。对于已上映的电影,不少人会去豆瓣搜索现时的评分,或是前作的评价,若是豆瓣高分、高评论数,也会按奈不住去蹭下热度。如果要去电影院观看的话,想必不少人会更倾向选择动作片或者科幻大片这类特效丰富,影音冲击强烈的电影。近几年特效技术和3D动画的日渐成熟,影院观影已经是越来越多人的第一选择。 IMDB的资料中包括了影片的众多信息、演员、片长、内容介绍、分级、评论等。对于电影的评分目前使用最多的就是IMDB评分。 截至2018年6月21日,IMDB共收录了4,734,693部作品资料以及8,702,001名人物资料。 3.项目所需数据介绍 数据的属性包括:电影名称、评论数、评分、导演、上映时间、上映国家、主要演员、语言、IMDB评分等。 理解数据: color 、director_name 、num_critic_for_reviews、duration、director_facebook_likes 、actor_3_facebook_likes、actor_2_name 、actor_1_facebook_likes 、gross 、genres 、actor_1_name 、movie_title 、num_voted_users、cast_total_facebook_likes 、actor_3_name 、facenumber_in_poster 、plot_keywords 、movie_imdb_link 、num_user_for_reviews、language 、country、content_rating、budget、title_year 、actor_2_facebook_likes 、imdb_score 、aspect_ratio 、movie_facebook_likes 4.项目功能详细介绍 显示电影评分分布的情况; 电影数量与平均分年度变化的情况; 评论家评论数与评分的关系; 评分与电影票房的关系; 电影数量大于5前提下平均分前十的导演推荐的数据; 不同电影类型的年份累计分析; 电影时长的分布及时长是否和评分有相关性; 电影时长的分布及时长是否和评分有相关性。 二、数据分析过程 1.主要功能实现的类和方法介绍 # 清洗runtime电影时长列数据,可使用str.split()方法 df['runtime'] = df['runtime'].str.split('').str.get(0).astype(int) df['runtime'].head() # 清洗year列,使用str[:]选取年份数字并转换成int类型,使用df.unique()方法检查数据 df['year'] = df['year'].str[-5:-1].astype(int) df['year'].unique() 2. 数据分析过程代码和解释说明 导入包: 导入、查看、清洗数据: 评分分布图: 电影数量与平均分布年度变化: 评论家评论数&评分、评分&票房: 电影数量大于5平均分前十的导演: 统计不同年份、不同类型电影的数量: cumsum = df.groupby(['main_genre', 'year']).title.count() # 使用累加功能统计1980年起不同年份不同电影类型的累计数量,对于中间出现的缺失值,使用前值填充 genre_cumsum = cumsum.unstack(level=0).cumsum().ffill() # 只选取总数量大于50的电影类型数据 genre_cumsum = genre_cumsum.loc[:,genre_cumsum.iloc[-1,:] >= 50] # 根据电影类型统计数据作图 fig, ax2 = plt.subplots(figsize=(12,6)) genre_cumsum.plot(ax=ax12, legend=False, linewidth=3) # 添加数据标签 for i in last_row.iteritems(): if i[0] == 'Adventure' or i[0] == 'Biography' or i[0] == 'Horror': ax2.annotate('{} {}'.format(int(i[1]), i[0]), xy=(2018.5, i[1]-5), fontsize=12) else: ax2.annotate('{} {}'.format(int(i[1]), i[0]), xy=(2018.5, i[1]+5), fontsize=12) # 美化图表 ax2.set_title('The Aggregate Movies of Different Genres Over Years', fontsize=16) ax2.spines['top'].set_visible(False) ax2.spines['right'].set_visible(False) ax2.spines['left'].set_visible(False) ax2.tick_params(bottom=True, labelleft=False) ax2.set_xlabel('') plt.tight_layout() 电影时长的分布及时长是否和评分有相关性: fig, ax4 = plt.subplots() df['runtime_min'].hist(range=(70,210), bins=14, color=(114/255,158/255,206/255)) ax4.set_title('The Runtime Distribution of US Top Box Office Movies') ax4.spines['top'].set_visible(False) ax4.spines['left'].set_visible(False) ax4.spines['right'].set_visible(False) ax4.set_xticklabels(np.arange(70,220,10)) ax4.set_xticks(np.arange(70,220,10)) ax4.grid() 绘制时长和IMDB评分相关性: fig = plt.figure(figsize=(14,7)) sns.lmplot(data=df, x='runtime_min', y='imdb_rate') sns.despine() 三、数据分析结果评估 1、评分分布主要在5.0~8.0之间,3.0以下和9.0以上分布很少。如果8.0算为优秀,则优秀电影占比较少。 2、电影数量在1990~2000年间快速增长,2009年达到较高值。而电影的平均分整体上呈下降趋势。 3、评论家评论数与评分整体呈正相关关系,500以上评论家评论数对应的评分都高于6.0。 4、评分与票房整体呈正相关关系,但关系不强。 IMDB评分人数和电影票房的相关性很弱,高票房不代表评分人数多,低票房电影也能有大量的IMDB评分人数。 5、电影数量大于5平均分前十的导演:Christopher Nolan、Quentin Tarantino 、 Stanley Kubrick、 James Cameron 、Peter Jackson 、Alejandro G. Iñárritu 、David Fincher 、Martin Scorsese 、 Wes Anderson 、Paul Greengrass。 6. 前五大电影类型分别是动作片Action,喜剧片Comedy,动画片Animation,剧情片Drama,冒险片Adventure。1995年之前,动作片和喜剧片都是影院观众最喜爱的电影类型,对应的高票房数量不分伯仲,剧情片是另一相对流行的电影类型。1995年后,高票房的动作片快速增长,甩开了喜剧片。喜剧片随仍是高票房数量第二多的电影类型,但近几年增速明显放缓。高票房动画片进入榜单的时间最晚,但在1998年前后迎来明显增长,此后的十年里完成了对剧情片和冒险片的超越。如果动画片保持目前的增速,有望在之后的十几二十年里超越喜剧片,成为高票房数量第二的电影类型。 7. 时长和IMDB评分呈一定的相关性,时长短的电影既有高分也有低分,但时长超过160分钟的电影基本都能获得6分以上的分数,时长最长的两部电影甚至得到了接近9分的超高得分,IMDB评分接近或低于4分的电影时长均小于130分钟。丰富的剧情和长长的故事也许也是一种容易感染观众的方式,这也和之前提到的好的故事打动观众相呼应。 四、总结 数据分析的过程往往是一个从宏观到微观的过程。先从宏观上把握数据大体的情况,大胆地提出假设,然后再将数据进行细分,小心地求证。通过数据的对比,就很容易看出调整的效果。 有关活动效果的数据分析往往也会涉及数据的对比。具体的思路是从要分析的目的入手,首先思考造成这种情况的可能原因有什么,再从每个可能的原因中找到相应的数据,与要分析的目的的数据进行比较,看哪一个是造成该情况发生的主要原因。 这里要用到的是excel的图表工具,把每一种可能的数据都作出一个图表,与要分析的目的的数据图表进行比较,如果有某一个数据的变化曲线与之相差不多,则可以说这个所对应的原因是造成该情况发生的主要原因。 以上是分析活动的一些核心数据,核心数据的分析是最主要的,因为这直接反应了该活动最本质的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZShiJ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值