赞
踩
一、我们需要什么结论?
我们首先要做的就是定义我们想要的结论。那么根据这份IMDB网站上提取的100年间,65个国家,4937部电影数据,我们想要分析什么呢?
根据我的框架我想知道的结论有以下几点:电影票房和哪些因素的相关性最大?
产出/投入比高的电影主要受哪些因素影响?
电影口碑的相关因素?
从投资者角度进行电影投资预测。
二、如何定义数据?
有了这个框架以后,我们就需要根据这个框架来找相应的数据,但是有些数据是相关的,有些作用不大,我们就要提前对数据进行定义。
网上爬到的数据源有27个变量(variables),包括:电影名称,发行地区,语言,影片类型,上映时间,演员、导演及他们的粉丝数,预算,票房,IMDB评分,评论数,影片分级,影片长宽比,影片长度,发行海报人头数等数据。
如何利用这些变量,需要对他们进行一个简单整理,以便后续利用。
我把以上数据进行了整理,结构如下:
三、如何清洗数据?
有了清晰的数据结构之后,我们就要对数据进行筛选和清洗。
1. 首先查看数据类型
#导入数据分析包
import pandas as pd
import numpy as np
file='/Users/chenzhaograce/Data_Science_A-Z/2017电影票房数据.xlsx'
xls=pd.ExcelFile(file,dtype='object')
info=xls.parse('movie_metadata', dtype='object')
# 前5行,前3列
info.iloc[:5,0:3]
info.dtypes
Film object
Region object
Language object
Color object
Year object
Genre object
Plot object
Director object
Actor 1 object
Actor 2 object
Actor 3 object
Director FB fans object
Actor 1 FB fans object
Actor 2 FB fans object
Actor 3 FB fans object
Film FB fans object
Comments object
Comments by people object
Length object
Box Office object
Budget object
Number of people in posters object
Class object
Width/Height object
IMDB user poll object
IMDB mark object
IMDB link object
dtype: object
2. 删除缺失值
由于我们需要得到的结论和电影票房、电影预算、电影口碑三个相关,所以其中任何一列有缺失值数据就无效,需要删除。
print('删除缺失值前大小',info.shape)
删除缺失值前大小 (4937, 27)
info=info.dropna(subset=['Budget','Box Office','IMDB mark'],how='any')
print('删除缺失后大小',info.shape)
删除缺失后大小 (3804, 27)
我们可以看到有1100多条数据被删除了,只有3804条有效信息。
3. 数据类型转换
接下来我们要对数据进行转换,以便之后的数值运算。有些是定量数据,有些是定性数据。我们要做的是吧定量数据转化为float数据类型。这里我们主要把预算、票房、评分转换为float。
info['Box Office']=info['Box Office'].astype('float')
info['Budget']=info['Budget'].astype('float')
info['IMDB mark']=info['IMDB mark'].astype('float')
print('转换后的数据类型:\n', info.dtypes)
转换后的数据类型:
Film object
Region object
Language object
Color object
Year object
Genre object
Plot object
Director object
Actor 1 object
Actor 2 object
Actor 3 object
Director FB fans int64
Actor 1 FB fans object
Actor 2 FB fans object
Actor 3 FB fans object
Film FB fans object
Comments object
Comments by people object
Length object
Box Office float64
Budget float64
Number of people in posters object
Class object
Width/Height object
IMDB user poll object
IMDB mark float64
IMDB link object
dtype: object
4. 数据排序
基本的清洗结束后,我们先对数据进行排序,比如对票房、预算和评分进行倒序排列
# 按票房排序
info=info.sort_values(by='Box Office', ascending=False, na_position='first')
info.iloc[:5,0:7]
我们可以看到历史最高票房是阿凡达7.6亿美元,前五分别是:《阿凡达》、《泰坦尼克》、《侏罗纪世界》、《复仇者》、《黑暗骑士》。前五均是美国发行片,除了《泰坦尼克》都是2005年以后发行的影片。
我发现查看信息的时候太杂,我要进行信息精简,只看片名、地区、语种、年份、类型、票房、预算和评分。于是我进行以下精简。
new_info=info[['Film','Region','Language','Year','Genre','Box Office','Budget','IMDB mark']]
new_info=new_info.reset_index(drop=True)
new_info.iloc[:10,:6]
重新进行排序以后,范围扩大到前十名,发现很有意思的事情是:前十有2部星球大战、2部复仇者。前十里面8部都是动作片(广义),这是很有意思的现象。
接下来我们按照评分排序看看有什么发现。
# 按评分排序
new_info=new_info.sort_values(by='IMDB mark', ascending=False, na_position='first')
new_info=new_info.reset_index(drop=True)
new_info.head()
这个排名也很有意思:除了一部巴西的《继母》以外,其他都是美国发行的。和票房非常不同的是,口碑排名10部中有7部影片都是90年代的片子。
简单来看,顶尖影片的票房和口碑的排名美国在前列。
# 异常值处理
new_info.describe()
大致看了一下,没有异常值,进行下一步数据模型构建。
5. 构建模型双变量筛选:如IMBD评分大于8.5的影片中票房排序。
我们需要增加投入产出比的变量以计算相关因素的影响。
1)复杂筛选
用评分8.5以上,且票房排名按从大到小进行排序。
query=new_info.loc[:,'IMDB mark']>8.5
new_info.loc[query,:].sort_values(by='Box Office', ascending=False, na_position='first')
按这个筛选,我们就会发现不太对了。8.5以上评分的影片中最差的票房只有10万,最好的票房是5.3亿,差距太大。根据这个简单筛选,可以看出评分和票房的关系并不是很大,具体相关性有多高,需要进一步分析。
2)产出投入比
增加一个变量:产出投入比,来进行衡量。
new_info['output-input ratio']=new_info.loc[:,'Box Office']/new_info.loc[:,'Budget']
new_info.head()
query_ratio=new_info.loc[:,'output-input ratio']>50
new_info.loc[query_ratio,:].sort_values(by='IMDB mark', ascending=False, na_position='first')
这个排名显示了:在产出投入比大于50倍的情况下,IMDB评分排序。可以看到差距也很大,最低的和最高的分别是3.6分和8.3分。所以按这样的简单筛选并不能说明问题,需要更进一步的分析。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。