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

项目概述

在本项目中,将分析一个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)
idimdb_idpopularitybudgetrevenueoriginal_titlecasthomepagedirectortagline...overviewruntimegenresproduction_companiesrelease_datevote_countvote_averagerelease_yearbudget_adjrevenue_adj
0135397tt036961032.9857631500000001513528810Jurassic WorldChris Pratt|Bryce Dallas Howard|Irrfan Khan|Vi...http://www.jurassicworld.com/Colin TrevorrowThe park is open....Twenty-two years after the events of Jurassic ...124Action|Adventure|Science Fiction|ThrillerUniversal Studios|Amblin Entertainment|Legenda...6/9/1555626.520151.379999e+081.392446e+09
176341tt139219028.419936150000000378436354Mad Max: Fury RoadTom Hardy|Charlize Theron|Hugh Keays-Byrne|Nic...http://www.madmaxmovie.com/George MillerWhat a Lovely Day....An apocalyptic story set in the furthest reach...120Action|Adventure|Science Fiction|ThrillerVillage Roadshow Pictures|Kennedy Miller Produ...5/13/1561857.120151.379999e+083.481613e+08
2262500tt290844613.112507110000000295238201InsurgentShailene Woodley|Theo James|Kate Winslet|Ansel...http://www.thedivergentseries.movie/#insurgentRobert SchwentkeOne Choice Can Destroy You...Beatrice Prior must confront her inner demons ...119Adventure|Science Fiction|ThrillerSummit Entertainment|Mandeville Films|Red Wago...3/18/1524806.320151.012000e+082.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()
idpopularitybudgetrevenueruntimevote_countvote_averagerelease_yearbudget_adjrevenue_adj
count10865.00000010865.0000001.086500e+041.086500e+0410865.00000010865.00000010865.00000010865.0000001.086500e+041.086500e+04
mean66066.3744130.6464461.462429e+073.982690e+07102.071790217.3996325.9750122001.3218591.754989e+075.136900e+07
std92134.0919711.0002313.091428e+071.170083e+0831.382701575.6446270.93513812.8132603.430753e+071.446383e+08
min5.0000000.0000650.000000e+000.000000e+000.00000010.0000001.5000001960.0000000.000000e+000.000000e+00
25%10596.0000000.2075750.000000e+000.000000e+0090.00000017.0000005.4000001995.0000000.000000e+000.000000e+00
50%20662.0000000.3838310.000000e+000.000000e+0099.00000038.0000006.0000002006.0000000.000000e+000.000000e+00
75%75612.0000000.7138571.500000e+072.400000e+07111.000000146.0000006.6000002011.0000002.085325e+073.370173e+07
max417859.00000032.9857634.250000e+082.781506e+09900.0000009767.0000009.2000002015.0000004.250000e+082.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()
idimdb_idpopularitybudgetrevenueoriginal_titlecasthomepagedirectortagline...overviewruntimeproduction_companiesrelease_datevote_countvote_averagerelease_yearbudget_adjrevenue_adjgenres
0135397tt036961032.9857631500000001513528810Jurassic WorldChris Pratt|Bryce Dallas Howard|Irrfan Khan|Vi...http://www.jurassicworld.com/Colin TrevorrowThe park is open....Twenty-two years after the events of Jurassic ...124Universal Studios|Amblin Entertainment|Legenda...6/9/1555626.520151.379999e+081.392446e+09Action
0135397tt036961032.9857631500000001513528810Jurassic WorldChris Pratt|Bryce Dallas Howard|Irrfan Khan|Vi...http://www.jurassicworld.com/Colin TrevorrowThe park is open....Twenty-two years after the events of Jurassic ...124Universal Studios|Amblin Entertainment|Legenda...6/9/1555626.520151.379999e+081.392446e+09Adventure
0135397tt036961032.9857631500000001513528810Jurassic WorldChris Pratt|Bryce Dallas Howard|Irrfan Khan|Vi...http://www.jurassicworld.com/Colin TrevorrowThe park is open....Twenty-two years after the events of Jurassic ...124Universal Studios|Amblin Entertainment|Legenda...6/9/1555626.520151.379999e+081.392446e+09Science Fiction
0135397tt036961032.9857631500000001513528810Jurassic WorldChris Pratt|Bryce Dallas Howard|Irrfan Khan|Vi...http://www.jurassicworld.com/Colin TrevorrowThe park is open....Twenty-two years after the events of Jurassic ...124Universal Studios|Amblin Entertainment|Legenda...6/9/1555626.520151.379999e+081.392446e+09Thriller
176341tt139219028.419936150000000378436354Mad Max: Fury RoadTom Hardy|Charlize Theron|Hugh Keays-Byrne|Nic...http://www.madmaxmovie.com/George MillerWhat a Lovely Day....An apocalyptic story set in the furthest reach...120Village Roadshow Pictures|Kennedy Miller Produ...5/13/1561857.120151.379999e+083.481613e+08Action

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');

在这里插入图片描述

结论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));

在这里插入图片描述

结论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();

在这里插入图片描述

结论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电影数据

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页