机器学习系列(2)_数据分析之Kaggle电影TMDB5000(上)

简介: 机器学习系列(2)_数据分析之Kaggle电影TMDB5000

一、数据整理



1、合并+处理缺失值


# tmdb_5000_movies.csv
budget  :电影成本
genres:风格列表,按|分隔,最多5种风格
homepage:电影首页URL
id :电影ID
keywords:电影关键词,按|分隔,最多5种关键词
original_language:原始语言
original_title  :电影名称
overview:剧情摘要
popularity:热度
production_companies:制作商
production_countries:制作地区
release_date:首次上映日期
revenue :收入
runtime :电影时长
spoken_languages:语言
status:是否发布
tagline:一句话说明一部电影(往往是海报上面的)
title :电影名称
vote_average:平均分
vote_count:投票人数
# tmdb_5000_credits.csv
movie_id:电影ID
title:电影名称
cast:演员表
crew:制作团队(分析那些人经常出现在高票房的电影里面)
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
plt.style.use('ggplot')
import json
import warnings
warnings.filterwarnings('ignore')#忽略警告
credits_file='D:/S072003Python/05DataMineML/tmdb_5000_credits.csv'
movies_file='D:/S072003Python/05DataMineML/tmdb_5000_movies.csv'
credits=pd.read_csv(credits_file)
movies=pd.read_csv(movies_file)

930a6b8854f240f1af7489f5b11b9867.pngdc907858473644ccb11dfc29f95f8c59.png

# 合并文档
fulldf=pd.concat([credits,movies],axis=1)
# 选择子集
moviesnames=['movie_id','original_title','cast','crew','release_date','genres','keywords','production_companies','production_countries','revenue','budget','runtime','vote_average']
moviesdf=fulldf[moviesnames]
moviesdf.head()
# 增加电影利润
moviesdf['profit']=moviesdf['revenue']-moviesdf['budget']
# 处理不理想数据
release_date_null=movies['release_date'].isnull()
moviesdf.loc[release_date_null]
moviesdf['release_date']=movies['release_date'].fillna('2014-06-01')
moviesdf['release_date']=pd.to_datetime(moviesdf['release_date'],format='%Y-%m-%d')
moviesdf.to_excel('moviesdf.xlsx',index=False)
moviesdf.head()
#3 找出runtime的缺失值
runtime_date_null=moviesdf['runtime'].isnull()
moviesdf[runtime_date_null]
values={'runtime:':98.0}
values={'runtime:':81.0}
moviesdf.fillna(value=values,limit=1,inplace=True)
moviesdf.fillna(value=values,limit=2,inplace=True)

2、对于json格式的数据进行分割提取


# 如何从json的数据格式提取需要的数据
# 提取电影风格数据genres
moviesdf['genreslist']=moviesdf['genres'].apply(json.loads)
moviesdf.head(1)
moviesdf['castlist']=moviesdf['cast'].apply(json.loads)
moviesdf['countries']=moviesdf['production_countries'].apply(json.loads) # json.loads()将str类型的数据转换为dict类型
moviesdf['companies']=moviesdf['production_companies'].apply(json.loads)
moviesdf['crewslist']=moviesdf['crew'].apply(json.loads)
moviesdf.head(1)

定义函数处理genres:

# 每一个genres
[{"id": 28, "name": "Action"}, {"id": 12, "name": "Adventure"}, {"id": 14, "name": "Fantasy"}, {"id": 878, "name": "Science Fiction"}]
#等于json格式的数据进行分割提取,通过自定义函数
def decode(column):
    z=[]
    for i in column:
        z.append(i['name'])
    return ' '.join(z) 
# 获取dict中第一个元素的name值
def decode1(column):
    z=[]
    for i in column:
        z.append(i['name'])
    return ''.join(z[0:1])  #切片,只输出第一个分隔
moviesdf['genresls']=moviesdf['genreslist'].apply(decode1)

afe43d385990483c94f1e8a55ade6169.png


二、 电影类型随时间变化怎么样?



# 电影类型与时间的关系
genres_list=set() # 获取所有的电影风格
for i in moviesdf['genresls'].str.split(' '):
    genres_list=set().union(i,genres_list) # 集合(set)是一个无序的不重复元素序列。可以使用大括号 { } 或者 set() 函数创建集合。
    genres_list=list(genres_list)
    genres_list
genres_list.remove('') # 去除空的元素
print(genres_list)
moviesdf['releaseyear']=pd.to_datetime(moviesdf['release_date']).dt.year
moviesdf.head(3)
moviesdf.to_excel('moviesdfv3.xlsx',index=False)

得到的所有电影的风格genres_list

['Movie', 'Documentary', 'Comedy', 'Crime', 'Fantasy', 'History', 'Drama', 'Horror', 'Action', 'War', 'Foreign', 'Thriller', 'Fiction', 'Animation', 'Science', 'Music', 'Western', 'Romance', 'Family', 'TV', 'Mystery', 'Adventure']

目的:由于每部电影不只一种风格,则为每种风格添加一个字段,如果该电影包含这种风格则填1,否则填0。

for genre in genres_list:
    moviesdf[genre]=moviesdf['genresls'].str.contains(genre).apply(lambda x:1 if x else 0)
moviesdf[genre].tail()
moviesdf.head(2)

b694c49a3aaf450e9f5343bead310791.png


genre_year=moviesdf.loc[:,genres_list]
genre_year.index=moviesdf['releaseyear']
genresdf=genre_year.groupby('releaseyear').sum()
genresdf
genresdf.plot(figsize=(16,10))

fef7b1bea07b429baeb317b003452f8d.png61291ecdceda4d2a8ff261019bef5a77.png

genresdfsum=genresdf.sum(axis=0).sort_values(ascending=False)
genresdfsum

genresdfsum:拿到从1916到2017年所有风格电影数据的总和

Drama          2297
Comedy         1722
Thriller       1274
Action         1154
Romance         894
Adventure       790
Crime           696
Fiction         535
Science         535
Horror          519
Family          513
Fantasy         424
Mystery         348
Animation       234
History         197
Music           185
War             144
Documentary     110
Western          82
Foreign          34
TV                8
Movie             8
dtype: int64
genresdfsum.sort_values().plot(kind='barh',label='genres') # 如果是kind='bar'则横纵坐标交换
plt.rcParams['font.sans-serif']=['Microsoft YaHei'] # 使用微软雅黑的字体
plt.title('电影类型数量排名统计图')
plt.xlabel('电影数量')
plt.ylabel('电影类型')
plt.show()
e7ac1afc001a46fbb6d2ebf93e7e6159.png
# 计算电影类型的饼图
genres_pie=genresdfsum/genresdfsum.sum()
others=0.01
genres_pie_otr=genres_pie[genres_pie>=others]
genres_pie_otr['other']=genres_pie[genres_pie<others].sum()
explode=(genres_pie_otr<=0.02)/10+0.04
genres_pie_otr.plot(kind='pie',label='',startangle=50,shadow=False,figsize=(10,10),autopct='%1.1f%%',explode=explode)

201b7ccef42c4b9aa64de42f7409e412.png

# 电影类型和时间关系的分析
plt.figure(figsize=(16,10))
plt.plot(genresdf,label=genresdf.columns)
plt.xticks(range(1905,2021,5))
plt.legend(genresdf)
plt.title('电影类型与时间',fontsize=15)
plt.xlabel('年份',fontsize=15)
plt.ylabel('%ddir影数量',fontsize=15)
plt.show()

4880d409dad540c098165435d52760ab.png


三、 电影类型与利润的关系



# 电影类型与利润的关系
mean_genre_profit=pd.DataFrame(index=genres_list)
mean_genre_profit.head()
newarray=[]
for genre in genres_list:
#   moviesdf.groupby('War',as_index=True)['profit'].mean() # 使得War得到两组数据,第一组为0,即不是War类型的平均值,无意义,因此下面只取第二组1
    newarray.append(moviesdf.groupby(genre,as_index=True)['profit'].mean())
newarray2=[]
for i in range(len(genres_list)):
    newarray2.append(newarray[i][1]) # 这里取的是第二个数据,
mean_genre_profit['mean_profit']=newarray2
mean_genre_profit.head(17)

d5660dfbb38e4851b0f5680984f6c747.png


得到的mean_profit

mean_profit
Movie -1.150000e+06
Documentary 7.185600e+06
Comedy  4.597608e+07
Crime 3.830085e+07
Fantasy 1.297936e+08
History 2.762010e+07
Drama 3.143791e+07
Horror  2.897105e+07
Action  8.970235e+07
War 4.887342e+07
Foreign -2.934369e+05
Thriller  4.907608e+07
Fiction 1.005910e+08
Animation 1.592271e+08
Science 1.005910e+08
Music 3.254800e+07
Western 1.916726e+07
Romance 3.969103e+07
Family  1.116260e+08
TV  -1.150000e+06
Mystery 4.755644e+07
Adventure 1.423333e+08
# 绘制电影类型与平均利润的关系
mean_genre_profit.sort_values(by='mean_profit').plot(kind='barh')
plt.xlabel('平均利润')
plt.ylabel('电影类型')
plt.title('电影类型与平均利润的关系')

6530b78c08314f97a9cefc95d8d76779.png


相关文章
|
1月前
|
机器学习/深度学习 数据采集 数据挖掘
实战派教学:掌握Scikit-learn,轻松实现数据分析与机器学习模型优化!
【10月更文挑战第4天】Scikit-learn凭借高效、易用及全面性成为数据科学领域的首选工具,简化了数据预处理、模型训练与评估流程,并提供丰富算法库。本文通过实战教学,详细介绍Scikit-learn的基础入门、数据预处理、模型选择与训练、评估及调优等关键步骤,助你快速掌握并优化数据分析与机器学习模型。从环境搭建到参数调优,每一步都配有示例代码,便于理解和实践。
83 2
|
3月前
|
机器学习/深度学习 数据采集 数据可视化
基于爬虫和机器学习的招聘数据分析与可视化系统,python django框架,前端bootstrap,机器学习有八种带有可视化大屏和后台
本文介绍了一个基于Python Django框架和Bootstrap前端技术,集成了机器学习算法和数据可视化的招聘数据分析与可视化系统,该系统通过爬虫技术获取职位信息,并使用多种机器学习模型进行薪资预测、职位匹配和趋势分析,提供了一个直观的可视化大屏和后台管理系统,以优化招聘策略并提升决策质量。
169 4
|
19天前
|
机器学习/深度学习 并行计算 数据挖掘
R语言是一种强大的统计分析工具,广泛应用于数据分析和机器学习领域
【10月更文挑战第21天】R语言是一种强大的统计分析工具,广泛应用于数据分析和机器学习领域。本文将介绍R语言中的一些高级编程技巧,包括函数式编程、向量化运算、字符串处理、循环和条件语句、异常处理和性能优化等方面,以帮助读者更好地掌握R语言的编程技巧,提高数据分析的效率。
38 2
|
1月前
|
机器学习/深度学习 算法 数据挖掘
从零到精通:Scikit-learn在手,数据分析与机器学习模型评估不再难!
【10月更文挑战第4天】在数据科学领域,模型评估是连接理论与实践的桥梁,帮助我们理解模型在未知数据上的表现。对于初学者而言,众多评估指标和工具常令人困惑。幸运的是,Scikit-learn 这一强大的 Python 库使模型评估变得简单。本文通过问答形式,带你逐步掌握 Scikit-learn 的评估技巧。Scikit-learn 提供了丰富的工具,如交叉验证、评分函数(准确率、精确率、召回率、F1 分数)、混淆矩阵和 ROC 曲线等。
36 1
|
2月前
|
机器学习/深度学习 算法 数据挖掘
Python数据分析革命:Scikit-learn库,让机器学习模型训练与评估变得简单高效!
在数据驱动时代,Python 以强大的生态系统成为数据科学的首选语言,而 Scikit-learn 则因简洁的 API 和广泛的支持脱颖而出。本文将指导你使用 Scikit-learn 进行机器学习模型的训练与评估。首先通过 `pip install scikit-learn` 安装库,然后利用内置数据集进行数据准备,选择合适的模型(如逻辑回归),并通过交叉验证评估其性能。最终,使用模型对新数据进行预测,简化整个流程。无论你是新手还是专家,Scikit-learn 都能助你一臂之力。
129 8
|
2月前
|
机器学习/深度学习 数据可视化 数据挖掘
数据可视化大不同!Python数据分析与机器学习中的Matplotlib、Seaborn应用新视角!
在数据科学与机器学习领域,数据可视化是理解数据和优化模型的关键。Python凭借其强大的可视化库Matplotlib和Seaborn成为首选语言。本文通过分析一份包含房屋面积、卧室数量等特征及售价的数据集,展示了如何使用Matplotlib绘制散点图,揭示房屋面积与售价的正相关关系;并利用Seaborn的pairplot探索多变量间的关系。在机器学习建模阶段,通过随机森林模型展示特征重要性的可视化,帮助优化模型。这两个库在数据分析与建模中展现出广泛的应用价值。
48 2
|
3月前
|
数据采集 机器学习/深度学习 算法
"揭秘数据质量自动化的秘密武器:机器学习模型如何精准捕捉数据中的‘隐形陷阱’,让你的数据分析无懈可击?"
【8月更文挑战第20天】随着大数据成为核心资源,数据质量直接影响机器学习模型的准确性和效果。传统的人工审查方法效率低且易错。本文介绍如何运用机器学习自动化评估数据质量,解决缺失值、异常值等问题,提升模型训练效率和预测准确性。通过Python和scikit-learn示例展示了异常值检测的过程,最后强调在自动化评估的同时结合人工审查的重要性。
90 2
|
3月前
|
存储 数据采集 数据可视化
基于Python flask+MySQL+echart的电影数据分析可视化系统
该博客文章介绍了一个基于Python Flask框架、MySQL数据库和ECharts库构建的电影数据分析可视化系统,系统功能包括猫眼电影数据的爬取、存储、展示以及电影评价词云图的生成。
104 1
|
3月前
|
数据采集 存储 数据可视化
基于Python flask的猫眼电影票房数据分析可视化系统,可以定制可视化
本文介绍了一个基于Python Flask框架开发的猫眼电影票房数据分析可视化系统,该系统集成了数据爬取、存储处理、可视化展示和用户交互功能,使用户能够直观地分析和展示电影票房数据,具有高度定制性。
140 0
基于Python flask的猫眼电影票房数据分析可视化系统,可以定制可视化
|
4月前
|
机器学习/深度学习 自然语言处理 数据挖掘
机器学习不再是梦!PyTorch助你轻松驾驭复杂数据分析场景
【7月更文挑战第31天】机器学习已深深嵌入日常生活,从智能推荐到自动驾驶皆为其应用。PyTorch作为一个开源库,凭借简洁API、动态计算图及GPU加速能力,降低了学习门槛并提高了开发效率。通过一个使用PyTorch构建简单CNN识别MNIST手写数字的例子,展现了如何快速搭建神经网络。随着技能提升,开发者能运用PyTorch及其丰富的生态系统(如torchvision、torchtext和torchaudio)应对复杂场景,如自然语言处理和强化学习。掌握PyTorch,意味着掌握了数据时代的关键技能。
36 1