我的第一份电影数据分析报告

2018-06-14  本文已影响575人  科研小土豆

TMDB 电影数据分析报告

[TOC]

一、背景概述

近年来电影产业迅猛发展,其已成为重要的艺术和娱乐载体。同时,电影也可看成是一种极度依附于资本和工业水准的投资形式,因此分析电影数据有助于抓住电影工业发展的趋势,更好地为投资者提供投资策略。

二、提出问题

  1. 年产电影数量的趋势是什么?电影评分随着时间的趋势是什么?能说明什么问题?
  2. 电影预算和评分数量二者分别与票房的关系?
  3. 电影关键词中有哪些热度很高?
  4. 哪家电影公司制作的电影最多?

三、 理解数据

  1. id: 电影id
  2. imdb_id: imdb id
  3. popularity: 流行度
  4. budget:预算
  5. revenue:收入
  6. original_title:片名
  7. cast: 演职员表
  8. homepage: 电影主页
  9. directior: 导演
  10. tagline: 宣传语
  11. keywords:关键词
  12. overview: 影片概述
  13. runtime:影片时长
  14. genres:影片风格
  15. production_companies:出品公司
  16. release_date:发行日期
  17. vote_count:得票总数
  18. vote_average:平均分
  19. release_year:发行年
  20. budget_adj:调整后预算
  21. revenue_adj:调整后收入

四、导入包

import time
from time import strftime
from datetime import datetime
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_style('darkgrid')
%matplotlib inline
import json
#词云包
from wordcloud import WordCloud,ImageColorGenerator,STOPWORDS
from PIL import Image

五、 数据清洗

  1. 缺失值处理:为了更准确地分析,检查budget, revenue, vote_count, vote_average, budget_adj, revenue_adj列是否有空值或0. 检查后发现vote_count,vote_average列均无空值或0
while False:
    print(sum(df['budget'].isnull()))
    break
while False:
    print(sum(df['budget']==0))
    break
budget_avg = sum(df['budget'])/sum(df['budget']!=0)
df['budget']=df['budget'].replace(0,budget_avg)

六、回答问题及数据可视化

  1. 年产电影数量的趋势是什么?电影评分随着时间的趋势是什么?能说明什么问题?



由图可见,年产电影的趋势不断上升,而近些年的评分越来越低,从评分均值上看,一直处于下滑状态。推测近年来,电影虽数量大幅上升,而电影质量整体下滑,因而评分普遍低。代码如下:

#解决图片中文乱码    
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
#统计每年的电影数量
year_count = df.groupby('release_year')['release_year'].count()
year = df['release_year']
#绘制电影数量&年份折线图
fg = plt.figure(figsize=(10,6))
ax1 = fg.add_subplot(1,1,1)
year_count.plot(x =year.index, y =year_count, label = 'year movie produce trend', ax = ax1)
plt.title('year count &  year', fontsize = 16)
plt.xticks(fontsize = 14)
plt.yticks(fontsize = 14)
plt.xlabel('year', fontsize =16)
plt.ylabel('year count', fontsize =16)
plt.legend(fontsize = 13)
#筛选4分以上的评分
scores = df[df['vote_average']>4].sort_values(by = 'vote_average', ascending = False)
scores_year = scores.groupby('release_year')['vote_average'].mean()
scores_year = scores_year[:100]
#print(scores_year )
#绘制评分&年份均值折线图
fg = plt.figure(figsize=(10,6))
ax1 = fg.add_subplot(1,1,1)
scores_year.plot(x =scores_year.index, y = 'vote_average', label = 'vote trend', ax = ax1)
plt.title('vote average & release year', fontsize = 16)
plt.xticks(fontsize = 14)
plt.yticks(fontsize = 14)
plt.xlabel('release year', fontsize =16)
plt.ylabel('vote average', fontsize =16)
plt.legend(fontsize = 13)

困难点:一开始画图时,图中汉字无法显示,通过网上查找资料完成。

  1. 电影预算和评分数量二者分别与票房的关系?

由上图可知,电影票房与评分个数和预算之间均有相关关系。电影票房与评分个数之间的关系强于其与调整后预算的关系。绘图代码如下:

#票房与预算关系
while False:
    sns.regplot(df['budget'],df['revenue_adj'])
    plt.title('电影票房与调整后预算的关系')
    plt.xlabel('调整后续预算')
    plt.ylabel('票房')
    plt.grid(False)
    break

#票房与评分数量关系
while True:
    sns.regplot(df['vote_count'],df['revenue_adj'],color="g")
    plt.title('电影票房与评分个数的关系')
    plt.xlabel('评分个数')
    plt.ylabel('票房')
    plt.grid(True)
    break
  1. 电影关键词中有哪些热度很高?

从上图即电影关键词词云可见, woman director(女导演),independent film(独立电影), based novel(小说改编)等词语在电影关键字中出现频率很高,由此可以了解大众的关注的热点,了解观众的偏好 。其代码如下:

#绘制图谱
#读入背景图片 
pic_mask = np.array(Image.open("C:\\Users\\lenovo\\Pictures\\udacity-program3\\earth.jpg"))
#读取生成词云的文件或字符串
wordlist = []
for word in df['keywords']:
    wordlist.append(word)
wordstr = "".join(str(wordlist))
plt.figure(figsize= (10,8))
# 设置停用词
stopwords = set(STOPWORDS)
stopwords.add('film')
my_wordcloud =WordCloud(
            background_color = 'black',# 设置背景颜色 
            mask = pic_mask, # 设置背景图片
            stopwords = stopwords, # 设置停用词
            max_words = 500,# 设置最大现实的字数
            max_font_size = 360 ,# 设置字体最大值
            scale =1,
            random_state = 80 # 设置有多少种随机生成状态,即有多少种配色方案
                       )
my_wordcloud.generate(wordstr)
image_colors = ImageColorGenerator(pic_mask)
plt.imshow(my_wordcloud)
plt.axis('off')
plt.show()

困难点:

  1. 安装wordcloud包时, 通过prompt直接输入pip install wordcloud 无法安装,注意要安装python版本对应的wordcloud版本,最后在CSDN网站上找到网友上传的资料,点这里获取
  2. 背景图片路径报错,通过网上查找资料,将“/”替换为"//",解决问题。
  1. 哪家电影公司制作的电影最多?

由图可知,Hamer Film productions出品的电影最多, 其次是Eon Productions, 第三名是International Production Company. 其代码如下:

#哪家电影公司制作的电影最多
df = pd.read_csv('tmdb-movies.csv')


#一部电影有多个电影公司,需要分出来,转化为列表,汇总
df['production_companies'] = df['production_companies'].str.split('|')
#类型汇总为列表
list1=[]
for i in df['production_companies'].str:
    list1.extend(i)
#统计同类型的频率
companies=pd.Series(list1).value_counts().sort_values(ascending=True)
#companies=companies.drop('')

#类型汇总为set(去掉重复)
min_year = df['release_year'].min()
max_year = df['release_year'].max()
liste_companies = set()
for s in df['production_companies'].str:
    liste_companies = set().union(s, liste_companies)
liste_companies = list(liste_companies )
liste_companies[1:]

#建立时间与电影公司映射关系

company_df = pd.DataFrame(  index = liste_companies[1:],columns= range(min_year, max_year + 1))
company_df = company_df.fillna(value = 0)
year = np.array(df['release_year'])
z = 0
for i in df['production_companies'].str:
    split_company = list(i)
    for j in split_company:
        if type(j)!=float: 
            company_df.loc[j, year[z]] = company_df.loc[j, year[z]] + 1
    z+=1
company_df.head(10)
company_df = company_df.T
new = company_df.sum()
new[70:100]

#绘制电影数量与电影公司关系图表
plt.rcParams['font.sans-serif']=['SimHei']#中文显示
plt.rcParams['axes.unicode_minus']=False
plt.subplots(figsize=(18,8))
ax = new[70:100].plot.bar(width=0.7)
plt.xticks(fontsize=13)
plt.yticks(range(0,100,100), fontsize=20)
plt.title('电影公司&电影数量', fontsize = 16)
plt.show()

困难点:大多数影片包含多个电影公司,电影公司之间采用"|"分割,切割数据,转换数据类型和统计数据有难度,查询资料后,类比资料信息完成。

七、分析总结

这次数据分析的过程还是比较困难的,虽然分析出了一些结果,但还有很多想做的地方仍然没有实现,希望继续努力学习数据分析的课程,不断进步。

上一篇 下一篇

猜你喜欢

热点阅读