Udacity数据分析(入门)-TMDb电影数据集探索

TMDb电影数据集探索

  • 项目概述
  • 数据集
  • 项目重点
    • 需要探索的问题
    • 目的
  • 项目流程
    • 第一步:选择数据集
    • 第二步:组织文件
    • 第三步:数据整理
      • 常规属性
      • 数据清理
    • 第四步:探索性数据分析
      • 研究问题 1 :哪种体裁/类型(genres)的平均预算(budget)最高?
      • 研究问题 2 :最受欢迎(popularity)前五的体裁/类型(genres),每年的受欢迎程度是如何变化的?
      • 研究问题 3 :哪种电影类型的评分(vote_average)最高;评分和受欢迎程度(popularity)有何关系?
    • 结论
  • 数据集来源

项目概述

在本项目中,将分析一个TMDb(The Movie Database:美国电影数据集),然后传达我的发现。将使用 Python 库 NumPy、Pandas 和 Matplotlib 来使帮助我进行分析。

数据集

本数据集中包含 10,000 条电影信息,信息来源为“电影数据库”(TMDb,The Movie Database),包括用户评分和票房。
“演职人员 (cast)”、“电影类别 (genres)”等数据列包含由竖线字符(|)分隔的多个数值。“演职人员 (cast) ”列中有一些奇怪的字符。以“_adj”结尾的最后两列表示了考虑了通货膨胀之后的相关电影的预算和收入(以2010年美元的价值来计算)。

项目重点

需要探索的问题

  1. 哪种体裁/类型(genres)的平均预算(budget)最高?
  2. 最受欢迎(popularity)前五的体裁/类型(genres),每年的受欢迎程度是如何变化的?
  3. 哪种电影类型的评分(vote_average)最高——和受欢迎程度(popularity)有何关系?

目的

经过对数据集的探索:

  • 了解如何调查数据集中的问题,以及将数据整理成可以使用的格式
  • 并练习传达我的分析结果。
  • 能够在 NumPy 和 Pandas 中使用向量化运算,以加快数据分析代码的运行速度
  • 熟悉 Pandas 的 Series 和 DataFrame 对象,可以使访问数据更方便
  • 了解如何使用 Matplotlib 生成图形,展示你的发现

项目流程

第一步:选择数据集

本次选取探索的数据集为“TMDb电影数据库”,数据集中包含来自1960-2016年上映的近11,000部电影的基本信息,主要包括了电影类型、预算、票房、演职人员、时长、评分等信息。

第二步:组织文件

  • 用来传达发现的报告文档
  • 用来分析数据的Python 代码()
  • 数据集(tmdb-movies.csv)

第三步:数据整理

#加载要使用的库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

%matplotlib inline

常规属性

#导入数据
df_tmdb = pd.read_csv('tmdb-movies.csv')
#查看基本信息
df_tmdb.info()

查看后发现,共包含10866组,每组数据包含21种数据。

#了解数据的基本形态
df_tmdb.head(3)
id imdb_id popularity budget revenue original_title cast homepage director tagline ... overview runtime genres production_companies release_date vote_count vote_average release_year budget_adj revenue_adj
0 135397 tt0369610 32.985763 150000000 1513528810 Jurassic World Chris Pratt|Bryce Dallas Howard|Irrfan Khan|Vi... http://www.jurassicworld.com/ Colin Trevorrow The park is open. ... Twenty-two years after the events of Jurassic ... 124 Action|Adventure|Science Fiction|Thriller Universal Studios|Amblin Entertainment|Legenda... 6/9/15 5562 6.5 2015 1.379999e+08 1.392446e+09
1 76341 tt1392190 28.419936 150000000 378436354 Mad Max: Fury Road Tom Hardy|Charlize Theron|Hugh Keays-Byrne|Nic... http://www.madmaxmovie.com/ George Miller What a Lovely Day. ... An apocalyptic story set in the furthest reach... 120 Action|Adventure|Science Fiction|Thriller Village Roadshow Pictures|Kennedy Miller Produ... 5/13/15 6185 7.1 2015 1.379999e+08 3.481613e+08
2 262500 tt2908446 13.112507 110000000 295238201 Insurgent Shailene Woodley|Theo James|Kate Winslet|Ansel... http://www.thedivergentseries.movie/#insurgent Robert Schwentke One Choice Can Destroy You ... Beatrice Prior must confront her inner demons ... 119 Adventure|Science Fiction|Thriller Summit Entertainment|Mandeville Films|Red Wago... 3/18/15 2480 6.3 2015 1.012000e+08 2.716190e+08

3 rows × 21 columns

#查看重复数据
df_tmdb.duplicated().sum()

显示有1条重复数据。

#清除重复数据并检查
df_tmdb.drop_duplicates(inplace=True)
df_tmdb.duplicated().sum()
0
#查看空值数据
df_tmdb.isnull().sum()
id                         0
imdb_id                   10
popularity                 0
budget                     0
revenue                    0
original_title             0
cast                      76
homepage                7929
director                  44
tagline                 2824
keywords                1493
overview                   4
runtime                    0
genres                    23
production_companies    1030
release_date               0
vote_count                 0
vote_average               0
release_year               0
budget_adj                 0
revenue_adj                0
dtype: int64
#了解各项目的数据分布
df_tmdb.describe()
id popularity budget revenue runtime vote_count vote_average release_year budget_adj revenue_adj
count 10865.000000 10865.000000 1.086500e+04 1.086500e+04 10865.000000 10865.000000 10865.000000 10865.000000 1.086500e+04 1.086500e+04
mean 66066.374413 0.646446 1.462429e+07 3.982690e+07 102.071790 217.399632 5.975012 2001.321859 1.754989e+07 5.136900e+07
std 92134.091971 1.000231 3.091428e+07 1.170083e+08 31.382701 575.644627 0.935138 12.813260 3.430753e+07 1.446383e+08
min 5.000000 0.000065 0.000000e+00 0.000000e+00 0.000000 10.000000 1.500000 1960.000000 0.000000e+00 0.000000e+00
25% 10596.000000 0.207575 0.000000e+00 0.000000e+00 90.000000 17.000000 5.400000 1995.000000 0.000000e+00 0.000000e+00
50% 20662.000000 0.383831 0.000000e+00 0.000000e+00 99.000000 38.000000 6.000000 2006.000000 0.000000e+00 0.000000e+00
75% 75612.000000 0.713857 1.500000e+07 2.400000e+07 111.000000 146.000000 6.600000 2011.000000 2.085325e+07 3.370173e+07
max 417859.000000 32.985763 4.250000e+08 2.781506e+09 900.000000 9767.000000 9.200000 2015.000000 4.250000e+08 2.827124e+09

1.涉及空值的数据列为imdb_id,cast,homepage,director,tagline,keywords,overview,genres,production_companies;对于已提出的问题,仅涉及genres含有23个空值(为自变量),需要消除空值行。

2.对于"budget"列,存在“零值”,为了消除影响需将所有零值数据行去除

数据清理

#填充'genres'中的空值数据为“NaN”
df_tmdb['genres'] = df_tmdb['genres'].fillna("NaN")

#获取被填充的空值的索引
df_index = df_tmdb[df_tmdb.genres == 'NaN'].index.tolist()

#删除对应索引的行并检查
df_tmdb = df_tmdb.drop(df_index)
df_tmdb.shape
(10842, 21)

由10866组删除后变为10842组;删除的1组为重复数据,23组为’genres’的空值数据。

#根据'genres'中的不同体裁类型单列成行,生成新的dataframe
df_tmdb = df_tmdb.drop('genres', axis = 1).join(df_tmdb['genres'].str.split('|', expand = True).stack().reset_index(level = 1, drop = True).rename('genres'))
df_tmdb.head()
id imdb_id popularity budget revenue original_title cast homepage director tagline ... overview runtime production_companies release_date vote_count vote_average release_year budget_adj revenue_adj genres
0 135397 tt0369610 32.985763 150000000 1513528810 Jurassic World Chris Pratt|Bryce Dallas Howard|Irrfan Khan|Vi... http://www.jurassicworld.com/ Colin Trevorrow The park is open. ... Twenty-two years after the events of Jurassic ... 124 Universal Studios|Amblin Entertainment|Legenda... 6/9/15 5562 6.5 2015 1.379999e+08 1.392446e+09 Action
0 135397 tt0369610 32.985763 150000000 1513528810 Jurassic World Chris Pratt|Bryce Dallas Howard|Irrfan Khan|Vi... http://www.jurassicworld.com/ Colin Trevorrow The park is open. ... Twenty-two years after the events of Jurassic ... 124 Universal Studios|Amblin Entertainment|Legenda... 6/9/15 5562 6.5 2015 1.379999e+08 1.392446e+09 Adventure
0 135397 tt0369610 32.985763 150000000 1513528810 Jurassic World Chris Pratt|Bryce Dallas Howard|Irrfan Khan|Vi... http://www.jurassicworld.com/ Colin Trevorrow The park is open. ... Twenty-two years after the events of Jurassic ... 124 Universal Studios|Amblin Entertainment|Legenda... 6/9/15 5562 6.5 2015 1.379999e+08 1.392446e+09 Science Fiction
0 135397 tt0369610 32.985763 150000000 1513528810 Jurassic World Chris Pratt|Bryce Dallas Howard|Irrfan Khan|Vi... http://www.jurassicworld.com/ Colin Trevorrow The park is open. ... Twenty-two years after the events of Jurassic ... 124 Universal Studios|Amblin Entertainment|Legenda... 6/9/15 5562 6.5 2015 1.379999e+08 1.392446e+09 Thriller
1 76341 tt1392190 28.419936 150000000 378436354 Mad Max: Fury Road Tom Hardy|Charlize Theron|Hugh Keays-Byrne|Nic... http://www.madmaxmovie.com/ George Miller What a Lovely Day. ... An apocalyptic story set in the furthest reach... 120 Village Roadshow Pictures|Kennedy Miller Produ... 5/13/15 6185 7.1 2015 1.379999e+08 3.481613e+08 Action

5 rows × 21 columns

#去除“budget_adj”的零值数据
df_tmdb = df_tmdb[df_tmdb['budget_adj'] > 0]
df_tmdb = df_tmdb[df_tmdb['popularity'] > 0]

"popularity"实际不存在零值数据。

df_tmdb['genres'].value_counts()
Drama              2316
Comedy             1740
Thriller           1641
Action             1428
Adventure           906
Romance             861
Crime               823
Horror              765
Science Fiction     701
Family              523
Fantasy             508
Mystery             440
Animation           260
History             183
Music               169
War                 155
Western              74
Documentary          64
Foreign              35
TV Movie              9
Name: genres, dtype: int64

第四步:探索性数据分析

研究问题 1 :哪种体裁/类型(genres)的平均预算(budget)最高?

要计算不同"genres"电影的"budget"均值,并经过排序得出最高的类型;并且为了消除通胀影响,计算"budget_adj"的数据。

# 以“genres”分组,计算各种体裁对应的budget平均值,按降序排列
budget_mean = df_tmdb.groupby('genres')['budget_adj'].mean().sort_values(ascending=False)
budget_mean
genres
Adventure          7.133755e+07
Animation          6.800557e+07
Fantasy            6.749065e+07
Family             6.337153e+07
Action             5.502584e+07
Western            5.462267e+07
Science Fiction    5.176227e+07
War                5.039431e+07
History            4.847202e+07
Thriller           3.663947e+07
Mystery            3.586516e+07
Crime              3.542695e+07
Comedy             3.470445e+07
Music              3.135773e+07
Romance            3.113657e+07
Drama              3.052799e+07
Horror             1.661574e+07
Foreign            1.277944e+07
TV Movie           5.492844e+06
Documentary        5.063684e+06
Name: budget_adj, dtype: float64
#根据计算出的budget平均值,做bar图比较
budget_mean.plot(kind = 'bar',
                 color = 'grey')

plt.ylabel('Budget')

plt.title('Budget of different kinds of Genres');

Udacity数据分析(入门)-TMDb电影数据集探索_第1张图片

结论1:根据降序排列画出的图,排第一(平均预算最高的)的为“Adventure”类型。

研究问题 2 :最受欢迎(popularity)前五的体裁/类型(genres),每年的受欢迎程度是如何变化的?

计算不同"genres"电影对应的"popularity"均值,降序得到前五位的类型;并作出各类型电影,“popularity"随"release_year”(上映时间)变化的图像。

#计算不同体裁的影片,受欢迎程度的总平均值,降序排列
popularity_mean = df_tmdb.groupby(['genres'])['popularity'].mean().sort_values(ascending=False)
#选取最受欢迎前五的体裁(获取对应的索引表)
most_popularity = popularity_mean[:5].index.tolist()
most_popularity
['Adventure', 'Science Fiction', 'Fantasy', 'Animation', 'Action']

结论2-1:最受欢迎(popularity)前五的电影类型是Adventure,Science Fiction,Fantasy,Action,Animation。

#选取前五的体裁,生成包含体裁(genres)、上映时间(release_year)、受欢迎度(popularity)的数据表
df_popularity = df_tmdb[['genres', 'release_year', 'popularity']].set_index('genres').loc[most_popularity].reset_index('genres')
#建立一个五种体裁的,根据年份的受欢迎程度表
df_popularity_year = pd.pivot_table(df_popularity, values='popularity', index='release_year', columns='genres')
#作图,横轴为年份,纵轴为受欢迎程度
df_popularity_year.plot(kind='line',subplots=True, sharex=True, sharey=True, figsize=(20,20));

Udacity数据分析(入门)-TMDb电影数据集探索_第2张图片

结论2-2:1960-2016期间最受欢迎的前五类电影类型中,除"Animation"外均在2010年后有了进一步提升。

研究问题 3 :哪种电影类型的评分(vote_average)最高;评分和受欢迎程度(popularity)有何关系?

计算"vote_average"的平均值并选出最高的类型(“genres”);根据作出的"vote_average"(评分)和"popularity"(受欢迎程度)散点图了解相关关系。

# 得到vote_average均值最大的体裁类型
df_tmdb.groupby('genres')['vote_average'].mean().sort_values(ascending=False).index[0]
'Documentary'

结论3-1:Documentary体裁的平均评分最高。

#得到不同体裁的评分、受欢迎程度表
df_vote = df_tmdb[['genres', 'vote_average', 'popularity']]
#根据不同体裁,做“评分”与对应“受欢迎度”的散点图
df_vote_scatter = sns.FacetGrid(df_vote, col='genres', col_wrap=4, hue='vote_average')
df_vote_scatter.map(plt.scatter, 'vote_average', 'popularity', alpha=.7)
df_vote_scatter.add_legend();

Udacity数据分析(入门)-TMDb电影数据集探索_第3张图片

结论3-2:除去Western、Documentary、TV Movie、Foreign数据较少;可以发现随着平均评分由低到高,均存在较低的受欢迎度(popularity),而随着受欢迎度增加,对应的平均评分也相应提高。

结论

1.以根据通胀后的预算(budget)数据来比较,"Adventure"类型的电影1960-2016期间的平均预算最高。

其中去除了可能产生影响的"budget_adj"的零值数据(异常值),因为实际预算不可能为零因此此类零值数据不应作为分析要素使用,当然经过验证:去除前后得到的上述结论相同。

2.1960-2016最受欢迎(popularity)前五的电影类型是Adventure,Science Fiction,Fantasy,Action,Animation;其中Adventure,Science Fiction,Action在2010年后受欢迎度有明显提升。

有3种电影类型,由于对"budget_adj"异常值的处理 以及 本身的数据缺失,导致1985年以前的数据不连贯,因此5种最受欢迎类型的直接比较仅适用于1985年之后的变化。

3.1960-2016的数据中Documentary类型的平均评分最高;更高的受欢迎度,伴随更高的评分,但高评分不代表受欢迎。

不同类型下的"popularity"均存在数值较大的数据,但不了解实际打分依据就无法真正判定是否为异常值,因此未做处理;另外根据Western、Documentary、TV Movie、Foreign四种类型,无法得出上述结论,可能由于数据量有限的缘故。

数据集来源

TMDb电影数据

你可能感兴趣的:(Udacity,python)