壹
猫眼Top100电影数据分析概述
从这一节开始,我们就综合利用已学到的一些分析技术来尝试做一些比较复杂的实际数据分析项目。在这些实际的项目案例中,我们将会看到一个完整的数据分析流程:数据清理——数据分析——数据可视化(即数据解释)。最终使得用户能够一眼看清楚一批复杂数据中所蕴含的知识。
本节所要讲的一个案例是:对利用爬虫手段从猫眼网站所爬下来的Top100的电影数据展开分析。在爬下来的电影数据集中,最重要的数据包括影片的主演、影片的上映时间、制作国、影评分等。
而我们想知道的是:在这批数据中,主要有哪些国家制作了这些脍炙人口的影片、最著名的演员都有哪些、不同的年份或不同的月份下影片的上映情况、不同影评分下的影片数量分布情况等信息。通过这些信息我们就知道,哪些国家发型的大片最多,哪些年份上映的好看影片最多,通常都会集中在哪些月份进行集中上映,同时我们还能知道最受观众喜爱的演员都有哪些。最后我们还能够清楚地看到,在这100部影片中,大部分影片的一个打分情况。
现在,就让我们来具体分析一下这批影片数据。关于影片数据集如何获取的,大家可以利用我们所介绍过的爬虫技术从猫眼网站进行爬取,这里就不再单独介绍。
此外,我们在本项目中采用了百度开发出来的pyecharts库来开展可视化操作,它在当前项目中要比Matplotlib库更加好用,尤其是在折线图的展示上。
如果没有安装过这个可视化库的,可以参考一下下面这个网址所提供的一个安装思路:
https://blog.csdn.net/zqs305082800/article/details/84581299
另外一个库:collections,则可用于快速统计不同数据出现的次数。非常方便。
感兴趣的小伙伴们可以考虑对pyecharts库和collections库做一个深入了解,必将对你的数据分析工作有莫大帮助。
PS:本项目案例中的代码都是成段出现,并非是连一片出现的,这是因为我在测试的过程中发现:若把这些片段的代码集中到一起,最终只能展示出最后的那个分析结论的可视化效果图,其余分析结论的可视化展示就会失效。故而我这里选择了分段来讲解。
再有一点需要说明的是:本项目案例中,有些处理逻辑参考借鉴了一丢丢前辈们的有益思路。因此,如果你觉得这里的分析处理逻辑似曾相识,请不要过于惊讶,哈哈哈!但我会尽可能地把我对这个项目分析案例的理解以及对这些理解的实现展示地更透彻一些!
贰
展示数据集的基本信息
首先,我们将数据导入到代码中,并查看一下这批数据集的基本信息以及一些基本的统计量分析结果。对于影评分,我们可以查看它的平均分、最大值、最小值等。然后我们就开始对数据集中的一些数据做进一步的分析处理,并以可视化的形式展示给大家。这里所要分析的数据就是影片的上映日期,先看看不同年份下所上映的影片数的一个分布情形,以折线图进行展示:
import pandas as pd
import numpy as np
from pyecharts.charts import Line,Bar,Pie
import pyecharts.options as opts
from collections import Counter
#设置字段对齐
pd.set_option('display.unicode.ambiguous_as_wide', True)
pd.set_option('display.unicode.east_asian_width', True)
#设置最大显示列数与显示宽度,以防止出现不必要的换行输出现象
pd.set_option('display.max_columns',500)
pd.set_option('display.width',1000)
data = pd.read_csv('maoyan.csv',encoding='utf-8')
print('前10部影片信息:')
print(data.head(10))
#查看数据基本信息
print('查看影片数据基本信息:')
print(data.info())
#查看数据集中的基本统计分析
print('查看影片数据基本统计结果:')
print(data.describe())
#获得电影的平均分
print('获得所有影片的平均分:')
print(data['star'].mean())
#提取日期的年份与月份,这里没有采用Pandas库中的to_datatime()
#主要是考虑到原始数据中的日期没有包含天,只有年和月
#且采用字符串分割操作更显得方便些
data['year'] = data['pub_time'].str.split('-').str[0]
data['month'] = data['pub_time'].str.split('-').str[1]
year = data.groupby('year')['year'].count()
attr_year = list(year.index)
num_year = list(year)
#以下是pyecharts库中绘制折线图的基本套路
#先声明一个Line对象,然后添加X轴坐标
#然后添加y轴坐标,如果需要给y轴坐标起名字的话,可添加名字
#利用is_smooth可以设置折现是光滑曲线还是不光滑的折线
#最后设置一下折线图的一些全局属性,比如标题,位置是居中还是
#左对齐或右对齐等
line = (
Line()
.add_xaxis(attr_year)
.add_yaxis('',num_year,is_smooth=True)
.set_global_opts(title_opts=opts.TitleOpts(,pos_left='center'))
)
#下面这一行代码让折线图在Jupyter Notebook上显示的
#一条必备命令,缺少它,我们所绘制的折线图
#将不会在Notebook上显示。
line.render_notebook()
其运行结果截图如下:
从这个折线图上我们不难看出这么一个信息:在1993年到2013年这11年间,上映的大片普遍比较多(个别年份除外)。当然,这个讯息的背后还能进一步得出什么样的结论,比如是否可以进一步判定在这11年间内,大片的行情普遍比较火等,这就要靠更专业的人士结合他们所处行业的综合信息来作出这方面的判断了。
叁
查看不同月份上映的影片数
通常,电影的上映时间是很有讲究的,比如一些大片会选在黄金周来上映,因为那个时期观影人数会更多;再比如,影片的排挡也会综合考虑不同月份下的行情。因此,我们可以对这批影片数据做进一步分析,看看通常在哪些月份上映的影片数最多:
month = data.groupby('month')['month'].count()
attr_month = list(month.index)
v_month = list(month)
#以下是利用pyecharts库制作柱状图的基本思路
bar = (
Bar()#声明一个Bar对象
.add_xaxis(attr_month)#添加X坐标
.add_yaxis('',v_month)#添加y坐标值,也可以再加个标题
.set_global_opts(title_opts=opts.TitleOpts(,pos_left='center'))#设置好柱状图的全局信息,包括图标题、位置等!
)
#这一步非常重要,千万不能省略,否则
#无法在NoteBook上显示
bar.render_notebook()
其运行结果如下:
从这个柱状图来看,我们可以看出一个大体的趋势:步入到下半年之后,影片通常都会扎堆放映了。这可以被电影从业人员视作是一个影片档期排挡规律。比如我们国家每年都会有一个贺岁档,我想大概也是因为这个原因吧。至于为什么会有这么一个神奇的规律,这就需要深度分析人们的社会行为、消费习惯规律等数据才能得出一个准确答案,而不是从这一批数据中就能得到的。
肆
影片发行国分布情况分析
弄明白影片上映时间的规律之后,我们接下来就会想着这些最受欢迎的影片大多来源于哪些国家。通过这样的分析,我们就可以看出当前哪些国家制作的影片最受欢迎,或者还可以这么说:哪些国家在制作这种受欢迎大片上的实力最牛掰。
#本段代码的作用是分析出不同国家所制作的影片数的一个占比情况
def get_country(country):
#首先要做的就是提取所有的国家信息
country_str = ''
if country.find('(') < 0 or country.find('中国香港') > 0 :
#这里的条件判断并不特别严谨,是因为满足上述
#条件的第一个判断,也可能是来自国外的影片,比如
#数据集中的泰坦尼克号这部影片就来自国外,但我们会依据
#这里的判断而将其归类于中国电影
#获取国家这个API实际上还需要做进一步的分析,
#但就目前数据集中有限的信息,我们很难做出最完美的判断。
#因此,这就说明采集数据时,保证数据信息的完整性
#是多么的重要。
country_str = '中国'
elif country.find('法国戛纳') > 0:
country_str = '法国'
else:
country_str = country.split('(')[1].strip(')')
return country_str
data['country'] = data['pub_time'].map(get_country)
country = data.groupby('country')['country'].count()
attr_country = list(country.index)
num_country = list(country)
#以下是pyecharts库绘制饼状图的基本思路
pie = Pie()#声明一个Pie图对象
pie.add(
"国家",#设置饼状图名称
#设置一下饼状图中要显示的数据
[list(z) for z in zip(attr_country ,num_country )],
# center为圆心坐标
center=["20%", "50%"],
# 60为内半径,80为外半径
radius=[60, 80],
)
#设置饼状图的全局属性,包括标题、位置信息等
pie.set_global_opts(
title_opts=opts.TitleOpts(,pos_left='left'),
legend_opts=opts.LegendOpts(
type_="scroll", pos_top="200%", pos_left="80%", orient="vertical"
),
)
# 设置显示百分比
pie.set_series_opts(
tooltip_opts=opts.TooltipOpts(
trigger="item", formatter="{a}
{b}: {c} ({d}%)"
))
#下面这行代码是确保饼状图能够在Notebook上显示的必备代码
pie.render_notebook()
其运行结果如下:
从这个国家分布的饼状图上来看,中美两国所发布的大片受到的喜爱程度最高,尤其是中国。这个原因我想主要还是在于发布这个猫眼Top100的网站里参与影片评分的人绝大多数还是以中国人为主。这里边多少有一些爱国情怀的作用,哈哈哈。
壹
小结
这一节我们简单地分析了一下猫眼Top100电影数据集中的一些基本信息,包括影片上映时间规律、影片发行国规律等信息。在这些分析过程中,我们利用了所学习到的分组分析、基本统计分析等分析技术。在分析影片发行国规律时我们还对数据做了比较复杂的处理,这属于数据清理的范畴。最后我们利用可视化的形式展示了我们所分析出来的结论,并对这个结论做了一些基本的解释。
因此,我们可以从这个实际的小项目中就能够完整地看到数据分析的三个主要环节——数据清理、数据分析、分析结果解释等。
当然,对于这批数据集的分析我们还没结束,还有一些重要的信息有待提取,这就留待下一节的项目案例分享中继续为大家分享。
本节的数据分析项目案例分享就到此为止,谢谢大家!我们下一节的分享中,不见不散!