本文是针对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)
 
                    
                 
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号