admin管理员组

文章数量:1594225

前言
最近刚好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数据,需要处理为列表进行分析。

处理方法:

  1. json本身为字符串类型,先转换为字典列表
  2. 再将字典列表转换为,以’,'分割的字符串
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'].

本文标签: 数据电影TMDbPythonDatabase