
TMDB 电影数据分析报告
[TOC]
一、背景概述
近年来电影产业迅猛发展,其已成为重要的艺术和娱乐载体。同时,电影也可看成是一种极度依附于资本和工业水准的投资形式,因此分析电影数据有助于抓住电影工业发展的趋势,更好地为投资者提供投资策略。
二、提出问题
- 年产电影数量的趋势是什么?电影评分随着时间的趋势是什么?能说明什么问题?
- 电影预算和评分数量二者分别与票房的关系?
- 电影关键词中有哪些热度很高?
- 哪家电影公司制作的电影最多?
三、 理解数据
- id: 电影id
- imdb_id: imdb id
- popularity: 流行度
- budget:预算
- revenue:收入
- original_title:片名
- cast: 演职员表
- homepage: 电影主页
- directior: 导演
- tagline: 宣传语
- keywords:关键词
- overview: 影片概述
- runtime:影片时长
- genres:影片风格
- production_companies:出品公司
- release_date:发行日期
- vote_count:得票总数
- vote_average:平均分
- release_year:发行年
- budget_adj:调整后预算
- 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
五、 数据清洗
- 缺失值处理:为了更准确地分析,检查budget, revenue, vote_count, vote_average, budget_adj, revenue_adj列是否有空值或0. 检查后发现vote_count,vote_average列均无空值或0
- budget列没有空值,但是有0,将所有budget非零值取平均值取代0值。同理可处理revenue列,budget_adj列, revenue_adj列
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)
六、回答问题及数据可视化
-
年产电影数量的趋势是什么?电影评分随着时间的趋势是什么?能说明什么问题?
由图可见,年产电影的趋势不断上升,而近些年的评分越来越低,从评分均值上看,一直处于下滑状态。推测近年来,电影虽数量大幅上升,而电影质量整体下滑,因而评分普遍低。代码如下:
#解决图片中文乱码
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)
困难点:一开始画图时,图中汉字无法显示,通过网上查找资料完成。
- 电影预算和评分数量二者分别与票房的关系?


由上图可知,电影票房与评分个数和预算之间均有相关关系。电影票房与评分个数之间的关系强于其与调整后预算的关系。绘图代码如下:
#票房与预算关系
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
- 电影关键词中有哪些热度很高?

从上图即电影关键词词云可见, 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()
困难点:
- 安装wordcloud包时, 通过prompt直接输入pip install wordcloud 无法安装,注意要安装python版本对应的wordcloud版本,最后在CSDN网站上找到网友上传的资料,点这里获取
- 背景图片路径报错,通过网上查找资料,将“/”替换为"//",解决问题。
- 哪家电影公司制作的电影最多?

由图可知,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()
困难点:大多数影片包含多个电影公司,电影公司之间采用"|"分割,切割数据,转换数据类型和统计数据有难度,查询资料后,类比资料信息完成。
七、分析总结
这次数据分析的过程还是比较困难的,虽然分析出了一些结果,但还有很多想做的地方仍然没有实现,希望继续努力学习数据分析的课程,不断进步。
网友评论