机器学习系列(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


相关文章
|
2月前
|
机器学习/深度学习 数据采集 数据挖掘
实战派教学:掌握Scikit-learn,轻松实现数据分析与机器学习模型优化!
【10月更文挑战第4天】Scikit-learn凭借高效、易用及全面性成为数据科学领域的首选工具,简化了数据预处理、模型训练与评估流程,并提供丰富算法库。本文通过实战教学,详细介绍Scikit-learn的基础入门、数据预处理、模型选择与训练、评估及调优等关键步骤,助你快速掌握并优化数据分析与机器学习模型。从环境搭建到参数调优,每一步都配有示例代码,便于理解和实践。
102 2
|
25天前
|
机器学习/深度学习 数据采集 算法
机器学习在医疗诊断中的前沿应用,包括神经网络、决策树和支持向量机等方法,及其在医学影像、疾病预测和基因数据分析中的具体应用
医疗诊断是医学的核心,其准确性和效率至关重要。本文探讨了机器学习在医疗诊断中的前沿应用,包括神经网络、决策树和支持向量机等方法,及其在医学影像、疾病预测和基因数据分析中的具体应用。文章还讨论了Python在构建机器学习模型中的作用,面临的挑战及应对策略,并展望了未来的发展趋势。
87 1
|
1月前
|
机器学习/深度学习 数据采集 搜索推荐
利用Python和机器学习构建电影推荐系统
利用Python和机器学习构建电影推荐系统
67 1
|
2月前
|
机器学习/深度学习 并行计算 数据挖掘
R语言是一种强大的统计分析工具,广泛应用于数据分析和机器学习领域
【10月更文挑战第21天】R语言是一种强大的统计分析工具,广泛应用于数据分析和机器学习领域。本文将介绍R语言中的一些高级编程技巧,包括函数式编程、向量化运算、字符串处理、循环和条件语句、异常处理和性能优化等方面,以帮助读者更好地掌握R语言的编程技巧,提高数据分析的效率。
57 2
|
2月前
|
机器学习/深度学习 算法 数据挖掘
从零到精通:Scikit-learn在手,数据分析与机器学习模型评估不再难!
【10月更文挑战第4天】在数据科学领域,模型评估是连接理论与实践的桥梁,帮助我们理解模型在未知数据上的表现。对于初学者而言,众多评估指标和工具常令人困惑。幸运的是,Scikit-learn 这一强大的 Python 库使模型评估变得简单。本文通过问答形式,带你逐步掌握 Scikit-learn 的评估技巧。Scikit-learn 提供了丰富的工具,如交叉验证、评分函数(准确率、精确率、召回率、F1 分数)、混淆矩阵和 ROC 曲线等。
44 1
|
3月前
|
机器学习/深度学习 算法 数据挖掘
Python数据分析革命:Scikit-learn库,让机器学习模型训练与评估变得简单高效!
在数据驱动时代,Python 以强大的生态系统成为数据科学的首选语言,而 Scikit-learn 则因简洁的 API 和广泛的支持脱颖而出。本文将指导你使用 Scikit-learn 进行机器学习模型的训练与评估。首先通过 `pip install scikit-learn` 安装库,然后利用内置数据集进行数据准备,选择合适的模型(如逻辑回归),并通过交叉验证评估其性能。最终,使用模型对新数据进行预测,简化整个流程。无论你是新手还是专家,Scikit-learn 都能助你一臂之力。
153 8
|
3月前
|
机器学习/深度学习 数据可视化 数据挖掘
数据可视化大不同!Python数据分析与机器学习中的Matplotlib、Seaborn应用新视角!
在数据科学与机器学习领域,数据可视化是理解数据和优化模型的关键。Python凭借其强大的可视化库Matplotlib和Seaborn成为首选语言。本文通过分析一份包含房屋面积、卧室数量等特征及售价的数据集,展示了如何使用Matplotlib绘制散点图,揭示房屋面积与售价的正相关关系;并利用Seaborn的pairplot探索多变量间的关系。在机器学习建模阶段,通过随机森林模型展示特征重要性的可视化,帮助优化模型。这两个库在数据分析与建模中展现出广泛的应用价值。
51 2
|
4月前
|
数据采集 机器学习/深度学习 算法
"揭秘数据质量自动化的秘密武器:机器学习模型如何精准捕捉数据中的‘隐形陷阱’,让你的数据分析无懈可击?"
【8月更文挑战第20天】随着大数据成为核心资源,数据质量直接影响机器学习模型的准确性和效果。传统的人工审查方法效率低且易错。本文介绍如何运用机器学习自动化评估数据质量,解决缺失值、异常值等问题,提升模型训练效率和预测准确性。通过Python和scikit-learn示例展示了异常值检测的过程,最后强调在自动化评估的同时结合人工审查的重要性。
107 2
|
22天前
|
机器学习/深度学习 算法 数据挖掘
数据分析的 10 个最佳 Python 库
数据分析的 10 个最佳 Python 库
68 4
数据分析的 10 个最佳 Python 库
|
4月前
|
数据采集 数据可视化 数据挖掘
数据分析大神养成记:Python+Pandas+Matplotlib助你飞跃!
在数字化时代,数据分析至关重要,而Python凭借其强大的数据处理能力和丰富的库支持,已成为该领域的首选工具。Python作为基石,提供简洁语法和全面功能,适用于从数据预处理到高级分析的各种任务。Pandas库则像是神兵利器,其DataFrame结构让表格型数据的处理变得简单高效,支持数据的增删改查及复杂变换。配合Matplotlib这一数据可视化的魔法棒,能以直观图表展现数据分析结果。掌握这三大神器,你也能成为数据分析领域的高手!
90 2