本文是针对kaggle上的数据集TMDB 5000 Movie Dataset进行数据分析。
数据集在以下链接就可下载 https://www.kaggle.com/tmdb/tmdb-movie-metadata

本文将按以下几个步骤描述,数据分析的流程:
1.提出问题,给出分析目的;
2.数据清洗;
3.针对问题建立模型;
4.数据可视化;
5.分析结果,形成数据分析报告
1.提出问题,给出分析目的
首先观察数据,tmdb_5000_credit文件标签有电影id,名称,演员,工作人员

tmdb_5000_movies标签有,很多。能用上的有id,名称,电影标语,电影时长,评分,预算金额,电影类型,关键字,制作公司,上映时期,收入。
从本人阅片无数的角度来看,基于电影推荐提出几个问题如下:
-
分类型推荐。每个人都有自己的爱好,电影也一样,找出每个类型下评分最高前20名,并给出相应电影的标语tagline,简介overview。
-
按制作国家分类推荐。也许就是一时兴起就想看一个美国大片,或者看个迪士尼的动漫也还挺好,哎看个日本的文艺小清新片子也是个不错的idea。
-
按热门电影推荐,根据popularity的值从高到低排序。
-
按评分推荐,分数要较高且评分人数高于某值。
-
按观影者心情推荐。抑郁的人推荐小众文艺片,从生活出发到灵魂结束,在平淡中找到人生的意义,积极向上的电影;无聊的人推荐喜剧,科技探索片也是个不错的选择;开心的人推荐烧脑片之类的剧情电影,让你忘掉开心,【笑脸】。
2.数据清洗
数据清洗主要分三步:1.数据预处理;2.特征提取;3.特征选取[1]。
2.1 数据预处理
数据预处理包括:发现和填补缺失值、数据类型转换、异常值删除等。
首先合并两个数据表,删除重复的movie_id,删除本次分析不需要用到的列。

查看数据信息,看那个数据缺失。

数据中release_date列缺失1条数据,runtime列缺失2条数据,通过索引的方式找到具体是哪一部电影,上网搜索准确数据填上,homepage,
overview, tagline以字符null填充。对于release_date列,需将其转换为日期类型,然后提取出“年份”数据。
查找release_date缺失的那一列,搜索数据填上,同理runtime列。

homepage, overview, tagline以字符null填充。

2.2 特征提取
针对提出的每一个问题,选取合适的特征去研究分析,构造dataframe进行数据可视化。
credits数据中,cast、crew是json的格式,需要将演员、导演读取出来,以字符串格式显示。movies数据中genres、keywords、production_companies也是json格式,需要转化成字符串。通过json.loads先将JSON字符串转换为字典列表"[{},{},{}]"的形式,再遍历每个字典,取出键(key)为‘name’所对应的值(value),并将这些值(value)用
“,” 分隔。[1]

再提取导演和主演。


3.数据可视化
3.1 问题1. 分类型推荐
每个人都有自己的爱好,电影也一样,找出每个类型下评分最高前20名,并给出相应电影的标语tagline,简介overview及电影主页homepage。
首先看哪种类型电影数量最多,及电影类型随时间的变化趋势。提取所有的电影类型,对各种电影类型进行one-
hot编码,如果一个值中包含指定内容,则编码为1,否则编码为0。






# 电影类型随时间的变化趋势图
fig = plt.figure(figsize=(10, 8)) # 设置画图框尺寸
ax1 = plt.subplot(1, 1, 1)# 设置图的位置
plt.plot(genre_year60) #画折线图
# 设置图形格式
plt.title(\'电影类型随时间的变化趋势图\', fontsize=18)
plt.xlabel(\'年份\', fontsize=18)
plt.ylabel(\'数量\', fontsize=18)
plt.xticks(range(1960, 2017, 10))# 设置x轴的刻度
plt.legend(genre_year60)
plt.show()
fig.savefig(\'film genre by year.png\', dpi=600)
[/code]

在研究分类型推荐电影时,为了降低主观性先删除评价人数小于100的电影记录。
```code
genres_df[\'id\'] = merge_df[\'id\']
genres_df[\'title\'] = merge_df[\'title\']
genres_df[\'vote_average\'] = merge_df[\'vote_average\']
genres_df[\'vote_count\'] = merge_df[\'vote_count\']
# 删除评价人数小于100的电影
genres_df = genres_df[genres_df[\'vote_count\'] > 100]
[/code]
例如针对剧情Drama电影,在genres_df中找出\'Drama\'值为1的记录,新建数据框,加入电影的id, title, vote_average,
tagline, overview,利用vote_average降序排列,取前20个记录。

drama类型下,评分前20的电影如下图,同理其他类型。
drama类型下的推荐电影:
### 
###
3.2 问题2. 按制作国家分类推荐
也许就是一时兴起就想看一个美国大片,或者看个迪士尼的动漫也还挺好,哎看个日本的文艺小清新片子也是个不错的idea。
首先看哪种国家电影数量最多,及每个国家的电影随时间的变化趋势。由于很多电影的制作国家不止一个,所以按问题一中的思路,提取所有的电影制作国家,对各个国家进行one-
hot编码,如果一个值中包含指定内容,则编码为1,否则编码为0。

考查哪种国家电影数量最多,用pie图看每个国家电影数目比例。


每个国家的电影随时间的变化趋势。


以美国为例,按制作国家推荐电影。

美国电影评分top20:
id | title | vote_average | tagline
---|---|---|---
278 | The Shawshank Redemption | 8.5 | Fear can hold you prisoner. Hope
can set you f...
238 | The Godfather | 8.4 | An offer you can\'t refuse.
550 | Fight Club | 8.3 | Mischief. Mayhem. Soap.
240 | The Godfather: Part II | 8.3 | I don\'t feel I have to wipe
everybody out, Tom...
424 | Schindler\'s List | 8.3 | Whoever saves one life, saves the world
entire.
244786 | Whiplash | 8.3 | The road to greatness can take you to the
edge.
680 | Pulp Fiction | 8.3 | Just because you are a character doesn\'t mean
...
510 | One Flew Over the Cuckoo\'s Nest | 8.2 | If he\'s crazy, what does
that make you?
497 | The Green Mile | 8.2 | Miracles do happen.
769 | GoodFellas | 8.2 | Three Decades of Life in the Mafia.
73 | American History X | 8.2 | Some Legacies Must End.
13 | Forrest Gump | 8.2 | The world will never be the same, once you\'ve
...
311 | Once Upon a Time in America | 8.2 | Crime, passion and lust for
power - Sergio Leo...
1891 | The Empire Strikes Back | 8.2 | The Adventure Continues...
539 | Psycho | 8.2 | The master of suspense moves his cameras into ...
155 | The Dark Knight | 8.2 | Why So Serious?
389 | 12 Angry Men | 8.2 | Life is in their hands. Death is on their
minds.
27205 | Inception | 8.1 | Your mind is the scene of the crime.
11 | Star Wars | 8.1 | A long time ago in a galaxy far, far away...
77 | Memento | 8.1 | Some memories are best forgotten.
### 3.3 问题3. 按热门电影推荐
根据popularity的值从高到低排序。

输出结果如下,可见按popularity推荐的是比较新的人们关注度高的电影,例如小黄人,星际穿越,死侍,银河护卫队等等。
id | title | year | polularity
---|---|---|---
211672 | Minions | 2015 | 875.581305
157336 | Interstellar | 2014 | 724.247784
293660 | Deadpool | 2016 | 514.569956
118340 | Guardians of the Galaxy | 2014 | 481.098624
76341 | Mad Max: Fury Road | 2015 | 434.278564
135397 | Jurassic World | 2015 | 418.708552
22 | Pirates of the Caribbean: The Curse of the Bla... | 2003 |
271.972889
119450 | Dawn of the Planet of the Apes | 2014 | 243.791743
131631 | The Hunger Games: Mockingjay - Part 1 | 2014 | 206.227151
177572 | Big Hero 6 | 2014 | 203.734590
87101 | Terminator Genisys | 2015 | 202.042635
271110 | Captain America: Civil War | 2016 | 198.372395
244786 | Whiplash | 2014 | 192.528841
155 | The Dark Knight | 2008 | 187.322927
286217 | The Martian | 2015 | 167.932870
27205 | Inception | 2010 | 167.583710
109445 | Frozen | 2013 | 165.125366
209112 | Batman v Superman: Dawn of Justice | 2016 | 155.790452
19995 | Avatar | 2009 | 150.437577
550 | Fight Club | 1999 | 146.757391
### 3.4 问题4. 按评分推荐
分数要较高且评分人数高于某值,取评分人数大于100的记录,显示前20个。

输出结果如下,可见按评分推荐的是一些比较经典的,像肖申克的救赎,教父,辛德勒的名单等等。
id | title | year | vote_average
---|---|---|---
278 | The Shawshank Redemption | 1994 | 8.5
238 | The Godfather | 1972 | 8.4
424 | Schindler\'s List | 1993 | 8.3
680 | Pulp Fiction | 1994 | 8.3
129 | Spirited Away | 2001 | 8.3
240 | The Godfather: Part II | 1974 | 8.3
244786 | Whiplash | 2014 | 8.3
550 | Fight Club | 1999 | 8.3
510 | One Flew Over the Cuckoo\'s Nest | 1975 | 8.2
13 | Forrest Gump | 1994 | 8.2
155 | The Dark Knight | 2008 | 8.2
389 | 12 Angry Men | 1957 | 8.2
128 | Princess Mononoke | 1997 | 8.2
497 | The Green Mile | 1999 | 8.2
539 | Psycho | 1960 | 8.2
346 | Seven Samurai | 1954 | 8.2
1891 | The Empire Strikes Back | 1980 | 8.2
73 | American History X | 1998 | 8.2
4935 | Howl\'s Moving Castle | 2004 | 8.2
769 | GoodFellas | 1990 | 8.2
与问题二的结果对比,可见美国评分top20里面包括了大部分总体电影评分top20,也正好证实了美国是电影大国,有质有量。
### 3.5 问题5. 按观影者心情推荐
抑郁的人推荐小众文艺片,从生活出发到灵魂结束,在平淡中找到人生的意义,积极向上的电影;无聊的人推荐喜剧,科技探索片也是个不错的选择;开心的人推荐烧脑片之类的剧情电影,让你忘掉开心,【笑脸】。
观影者心情与电影类型对应表 观影者心情 | 对应推荐的电影类型
---|---
高兴happy | Drama, adventure, thriller, horror
伤心sad | Comedy, science fiction, family, fantasy
迷茫exhausted | Romance, adventure, family, mystery
无聊bored | Comedy, science fiction, thriller, crime
轻松relaxed | Drama, comedy, romance,music
孤独lonely | comedy, family, mystery, documentary
生气angry | Comedy, adventure, family, crime
以伤心sad为例,推荐这四种Comedy, science fiction, family, fantasy电影的前10个。


###
有个问题暂时不知道怎么解决,就是怎么同时找出每个类型的评分前20,由于每部电影属于多个类型,这样就会有重复的记录,在类型少的时候可以一个一个找出但是太多的时候就不行了,如果有人看的话希望可以多多交流多多学习。
[1] Kaggle——TMDB 5000 Movie Dataset电影数据分析. [
https://blog.csdn.net/zhuoyue65/article/details/80285875
](https://blog.csdn.net/zhuoyue65/article/details/80285875)
