数据分析项⽬实战:电影数据分析
⼀、项⽬背景
电影公司制作⼀部新电影推向市场时,要想获得成功,通常要了解电影市场趋势,观众 喜好的电影类型,电影的发⾏情况,改编电影和原创电影的收益情况,以及观众喜欢什么样的内容
本案例来源于 kaggle 上的 TMDB 5000 Movie Dataset 数据集,为了探讨电影数据可视化, 为电影的制作提供数据⽀持,主要研究以下⼏个问题:
(1)电影类型如何随着时间的推移发⽣变化的?
(2)电影类型与利润的关系?
(3)Universal 和 Paramount 两家影视公司的对⽐情况如何?
(4)改编电影和原创电影的对⽐情况如何?
(5)电影时长与电影票房及评分的关系?
(6)分析电影关键字
⼆、理解数据
**1、采集数据 **
2、导⼊数据,并进⾏查看
代码实现:
import pandas as pd
import json
# =============================================加载数据===================================
# 加载数据 --credits
credits = pd.read_csv('./tmdb_5000_credits.csv')
print('credits:\n', credits)
print('*'*100)
print('credits:\n', lumns)
print('*'*100)
print('credits:\n', credits.info())
print('*'*100)
# 加载数据
movies = pd.read_csv('./tmdb_5000_movies.csv')
print('movies:\n', movies)
print('#'*100)
print('movies:\n', lumns)
print('#'*100)
print('movies:\n', movies.info())
print('#'*100)
3、数据说明
电影数据说明表
列名说明
id标识号
imdb_id IMDB 标识号
popularity在 Movie Database 上的相对页⾯查看次数
budget预算(美元)
budget预算(美元)
列名说明
revenue收⼊(美元)
original_title电影名称
cast演员列表,按
homepage电影⾸页的 URL
director导演列表,按
tagline电影的标语
keywords与电影相关的关键字,按
overview剧情摘要
runtime电影时长
genres风格列表,按production_companies制作公司列表,按
release_date⾸次上映⽇期
vote_count评论次数
vote_average平均评分
release_year发⾏年份
三、数据清洗
1、合并数据集
先将 credits 数据集和 movie 数据集中的数据合并在⼀起,再查看合并后的数据集信息
代码实现:
# (1)合并数据
# print(credits['crew'])
# credits 中存在 movie_id 和 title
json值的类型有哪些# movies 中存在 id 和 title
# 将 credits 中的 movie_id 修改为 id
# print('credits的列索引:\n', lumns)
# 主键合并 ---on id 和 title
all_data = pd.merge(left=credits, right=movies, on=['id','title'], how='outer')
print('all_data:\n', all_data)
print('all_data:\n', lumns)
print('all_data:\n', all_data.dtypes)
2、选取⼦集
由于数据集中包含的信息过多,其中部分数据并不是我们研究的重点,所以从中选取我 们需要的数据:
代码实现:
# 筛选特征
all_data = all_data['original_title','crew','release_date','genres','keywords',
'production_companies','production_countries','revenue',
'budget','runtime','vote_average']
print('all_data的列索引:\n', lumns)
print('all_data的形状:\n', all_data.shape)
由于后⾯的数据分析涉及到电影类型的利润计算,先求出每部电影的利润,并在数据集 data 中增加 profit 数据列
代码实现:
# 增加利润
all_data['profit']= all_data['revenue']- all_data['budget']
print('all_data的列索引:\n', all_data)
print('all_data的形状:\n', all_data)
3、缺失值处理
代码实现:
# 检测缺失值
# pd.isnull + sum
res_null = pd.isnull(all_data).sum()
print('缺失值检测结果:\n', res_null)
# 检测到 release_date 存在⼀个缺失值 ---针对⽅式:填充,查具体的电影名称,根据电影名称查上映时间
# a、确定bool数组
mask = all_data.loc[:,'release_date'].isnull()
# b、根据bool数组来获取缺失值位置的电影名称
movie_name = all_data.loc[mask,'title']
print('缺失上映⽇期的电影名称为:\n', movie_name)
# 缺失上映⽇期的电影名称为:
# 4553 America Is Still the Place
# Name: title, dtype: object
# 通过上⽹查询该电影的上映⽇期为:2014-06-01
# c 、填充
all_data.loc[mask,'release_date']='2014-06-01'
# 将 release_date 转化为 pandas⽀持的时间序列
all_data.loc[:,'release_date']= pd.to_datetime(all_data.loc[:,'release_date'])
# 获取发⾏年份
all_data.loc[:,'release_year']= all_data.loc[:,'release_date'].dt.year
通过上⾯的结果信息可以知道:整个数据集缺失的数据⽐较少。 其中 release_date(⾸次上映⽇期)缺失 1 个数据,可以通过⽹上查询补齐这个数据,填补 release_date(⾸次上映⽇期)数据
4、数据格式转换
genres 列数据处理:
代码实现:
# 查看电影风格数据
print('电影风格:\n', all_data.loc[:,'genres'])# json数据类型
# json.loads # 可以将json转化为python类型
# 将 all_data.loc[:, 'genres'] 由 json类型转化为 python类型
all_data.loc[:,'genres']= all_data.loc[:,'genres'].transform(json.loads)
# 构建所有的电影的类型
all_movie_type =set()
# 定义⼀个函数,来提取电影类型
def get_movie_type(val):
"""
获取电影类型
:param val: 数据
:return: 提取之后的电影类型数据
"""
# 构建⼀个空列表,⽤来存储每⼀个电影的电影类型
type_list =[]
# 遍历列表
for item in val:
# 如果item存在
if item:
# 获取该电影的电影类型
movie_type = item['name']
# 将其加⼊到 type_list
type_list.append(movie_type)
# 将其加⼊到 all_movie_type
all_movie_type.add(movie_type)
return','.join(type_list)
# 调⽤
all_data.loc[:,'genres']= all_data.loc[:,'genres'].transform(get_movie_type) print('获取电影类型之后的结果:\n', all_data.loc[:,'genres'])
# 将所有的电影类型转化为 list
all_movie_type =list(all_movie_type)
# 遍历
for column in all_movie_type:
# 先增加
all_data.loc[:, column]=0
# 构建bool数组
mask = all_data.loc[:,'genres'].ains(column)
# 修改
all_data.loc[mask, column]=1
print('all_data:\n', all_data)
四、数据分析及可视化
五、问题⼀:电影类型如何随着时间的推移发⽣变化的?
1、建⽴包含年份与电影类型数量的关系数据框
代码实现:
# 需求:
# (1)电影类型如何随着时间的推移发⽣变化的?
# 电影类型、 ---genres(电影风格)
# 时间 ------ release_date (⾸次上映时间)
# 每⼀年各种电影的变化趋势。
# 按照发⾏年份进⾏分组,统计各个电影各个年份的数量
res = upby(by='release_year')[all_movie_type].sum() print('res:\n',res.tail())
# 根据 res 进⾏结果可视化
2、数据可视化
(1)绘制电影数据类型随时间变化趋势图
代码实现:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论