admin管理员组文章数量:1593971
前言
最近刚好Python学完了,所以拿这个项目来练手。要知道好多爬虫数据仅仅凭借Excel和sql是没办法处理的,Python绝对是数据分析的绝佳兵器,数据清洗-数据处理-可视化都可以完成。实践出真知,虽然过程中遇到很多问题,但是学完之后能力就提升啦!这次将自己做的项目完整记录下来并进行分享,以备后续回忆和二次学习。也欢迎感兴趣的同学评论留言,希望我们共同学习,共同进步!
文章目录
- 1 项目背景
-
- 1.1 故事背景
- 1.2 提出问题
- 2 项目报告
- 3 理解数据
-
- 3.1 数据来源
- 3.2 数据字段
- 4 数据清洗
-
- 4.1 导入数据
- 4.2 缺失值处理
-
- 4.2.1 补全release_date
- 4.2.2 补全runtime
- 4.3 重复值处理
- 4.4 日期值处理
- 4.5 筛选数据
- 4.6 json数据转换
- 4.7 数据备份
- 5 数据分析
-
- 5.1 why
- 5.2 what
-
- 5.2.1 电影类型
-
- 5.2.1.1 电影类型数量(条形图)
- 5.2.1.2 电影类型占比(饼图)
- 5.2.1.3 电影类型变化趋势(折线图)
- 5.2.1.4 不同电影类型预算/利润(组合图)
- 5.2.2 电影关键词
- 5.3 when
-
- 5.3.1 电影时长
- 5.3.2 发行时间
- 5.4 where
- 5.5 who
-
- 5.5.1 票房分布及票房Top10的导演
- 5.5.2 评分分布及评分Top10的导演
- 5.6 how
-
- 5.6.1 原创VS改编占比(饼图)
- 5.6.2 原创VS改编预算/利润率(组合图)
- 5.7 how much
-
- 5.7.1 计算相关系数
- 5.7.2 票房影响因素散点图
1 项目背景
1.1 故事背景
数据分析最重要的就是要讲一个故事喽!故事怎么讲呢?无非就是提出问题-分析问题-解决问题。因为分析出来的数据解决了某个问题,所以,故事说出来才有卖点,别人才会觉得你的数据分析有价值,才愿意为你的数据分析买单。不多说啦,哈哈(⊙o⊙)…回归正题。
我讲故事就是,王思聪想要在海外开拓万达电影的市场,这次他在考虑:怎么拍商业电影才能赚钱?毕竟一些制作成本超过1亿美元的大型电影也会失败 。这个问题对电影业来说比以往任何时候都更加重要。 所以,他就请来了公司的数据分析师来帮他解决问题,给出一些建议,根据数据分析一下商业电影的成功是否存在统一公式?以帮助他更好地进行决策。
1.2 提出问题
解决的终极问题是:电影票房的影响因素有哪些?
接下来我们就分不同的维度分析:
- 观众喜欢什么电影类型?有什么主题关键词?
- 电影风格随时间是如何变化的?
- 电影预算高低是否影响票房?
- 高票房或者高评分的导演有哪些?
- 电影的发行时间最好选在啥时候?
- 拍原创电影好还是改编电影好?
2 项目报告
国际惯例先来一份数据报告:
3 理解数据
3.1 数据来源
本次使用的数据来自于kaggle平台(点击链接下载TMDb 5000 Movie Database)。收录了美国地区1916-2017年近5000部电影的数据,包含预算、导演、票房、电影评分等信息。
3.2 数据字段
原始数据集包含2个文件:
- tmdb_5000_movies:电影基本信息,包含20个变量
- tmdb_5000_credits:演职员信息,包含4个变量
4 数据清洗
4.1 导入数据
导入数据包
# 数据导入
import numpy as np
import pandas as pd
from pandas import DataFrame, Series
#可视化显示在界面
%matplotlib inline
import matplotlib
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #用来显示中文
plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号
import seaborn as sns
sns.set(color_codes=True)
# 学习seaborn参考:https://www.jianshu/p/c26bc5ccf604
import json
import warnings
warnings.filterwarnings('ignore')
from wordcloud import WordCloud, STOPWORDS
movies = pd.read_csv('F:\\tmdb-movie-metadata\\tmdb_5000_movies.csv',encoding = 'utf_8')
credits = pd.read_csv('F:\\tmdb-movie-metadata\\tmdb_5000_credits.csv',encoding = 'utf_8')
movies.info() #查看信息
credits.info()
运行结果:
续表:
从上述信息可知,共有记录4803条。
# 两个数据框都有title列,以及movies.riginal_title
# 以上三个数据列重复,删除两个
del credits['title']
del movies['original_title']
# 连接两个csv文件
merged = pd.merge(movies, credits, left_on='id', right_on='movie_id', how='left')
# 删除不需要分析的列
df=merged.drop(['homepage','overview','spoken_languages','status','tagline','movie_id'],axis=1)
df.info()
运行结果:
从上可知,发行日期 和 运行时间 两列有数据缺失。
接下来处理缺失值。
4.2 缺失值处理
缺失记录仅3条,采取网上搜索,补全信息。
4.2.1 补全release_date
# 查找缺失值记录-release_date
df[df.release_date.isnull()]
运行结果为:
缺失记录的电影标题为《America Is Still the Place》,日期为’ 2014-06-01 ’
# 填充缺失值
df['release_date'] = df['release_date'].fillna('2014-06-01')
4.2.2 补全runtime
# 查找缺失值记录-runtime
df[df.runtime.isnull()]
运行结果:
缺失记录的电影runtime分别为94min和 240min
# 根据行标签,填充缺失值
df.loc[2656] = df.loc[2656].fillna('94, limit=1')
df.loc[4140] = df.loc[4140].fillna('240, limit=1')
4.3 重复值处理
len(df.id.unique())
运行结果:有4803个不重复的id,可以认为没有重复数据。
4.4 日期值处理
将release_date列转换为日期类型:
#转换日期格式,增加 年份 月份 日 列
#如果日期不符合时间戳限制,则errors ='ignore'将返回原始输入,而不会报错。
#errors='coerce'将强制超出NaT的日期,返回NaT。
df['release_year'] = pd.to_datetime(df.release_date, format = '%Y-%m-%d',errors='coerce').dt.year
df['release_month'] = pd.to_datetime(df.release_date).apply(lambda x: x.month)
df['release_day'] = pd.to_datetime(df.release_date).apply(lambda x: x.day)
df.info()
运行结果:
养成处理完数据列就进行查看的习惯~
4.5 筛选数据
使用数据分析师最喜欢的一个语法:
df.describe()
运行结果:
- 票房、预算、受欢迎程度、评分为0的数据应该去除;
- 评分人数过低的电影,评分不具有统计意义,这里筛选评分人数大于50的数据。
df = df[(df.vote_count >= 50) &(df.budget * df.revenue * df.popularity * df.vote_average !=0)].reset_index(drop = 'True')
df
查看筛选结果:
df.info()
此时剩余2961条数据,包含19个字段。
4.6 json数据转换
**说明:**genres,keywords,production_companies,production_countries,cast,crew 这6列都是json数据,需要处理为列表进行分析。
处理方法:
- json本身为字符串类型,先转换为字典列表
- 再将字典列表转换为,以’,'分割的字符串
json_column = ['genres','keywords','production_companies','production_countries','cast','crew']
# 1-json本身为字符串类型,先转换为字典列表
for i in json_column:
df[i] = df[i].apply(json.loads)
# 提取name
# 2-将字典列表转换为以','分割的字符串
def get_name(x):
return ','.join([i['name'] for i in x])
df['cast'] = df['cast'].
版权声明:本文标题:Python数据分析-TMDb 5000 Movie Database电影数据分析 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dongtai/1728179224a1148239.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论