送给喜欢电影的你(三)

今天讲一些如何对爬取后的数据做基础分析,看一下豆瓣上电影质量的分布情况。其实主要涉及的是一些技术代码的讲解,不涉及什么高深的业务分析。

在机器学习过程中,对于特征工程这部分的工作,最开始就是看一下数据的分布,一般是通过透视表来观察。pandas工具包就可以很好的实现透视表来展示数据。

首先我要将需要的依赖包导入进来

import pandas as pd

import numpy as np

import constants as cons

from utils.mysql import *

import matplotlib.pyplot as plt

%matplotlib inline

由于我的数据直接存储到了mysql数据库中,所以可以自己写一个方法来load数据

data = get_all_data(conn_mysql(cons.MYSQL_DICT['LOCAL']['host'],

cons.MYSQL_DICT['LOCAL']['user'],

cons.MYSQL_DICT['LOCAL']['password'],

cons.MYSQL_DICT['LOCAL']['database']))

清洗一下

data.drop_duplicates(inplace=True, subset='dataId')

data['score'] = data['score'].replace('', '0', regex=True)

data.reset_index(drop=True, inplace=True)

data.head()

接下来就是数据可视化了

python中有个很好用的画图工具:matplotlib,官方文档也非常详细。对于这个工具的使用,我个人的感觉,熟能生巧。也是现学现用,多总结。

先做个透视表来简单看下各个国家的电影产量

plt.rcParams['font.sans-serif'] = ['SimHei'] # 正常显示中文

plt.rcParams['axes.unicode_minus'] = False # 正常显示符号

movie = data[data['form'] == '电影'] # 将所有类型为电影的数据筛选出来

pivot = movie.pivot_table(index=['region'], values='dataId', aggfunc=np.count_nonzero) # 生成透视表

pivot.sort_values(by='dataId', inplace=True, ascending=False) # 对数据进行排序

pivot.plot(kind='bar') # 数据可视化展示

通过pandas来画图,看得不是很清楚,调参数也比较麻烦,所以为了更好地将数据展示,可以利用matplotlib画出来

我们可以从三个维度分别对电影的数据进行分析:国家、电影类型、评分区间

color_bar = [ 'y', 'r', 'b','k','coral', 'teal']

label_dict = {'region':'国家/地区', 'types':'类型', 'score_dis': '评分区间'}

fig = plt.figure(figsize=(20,16))

ax = [fig.add_subplot(311), fig.add_subplot(312), fig.add_subplot(313)]

for i, col in enumerate(['region', 'types', 'score_dis']):

c_pivot = movie.pivot_table(index=[col], values='dataId', aggfunc=np.count_nonzero)

index = range(len(c_pivot))

c_pivot.sort_values(by='dataId', inplace=True, ascending=False)

y = c_pivot['dataId'].values

ax[i].bar(index, y, 0.5, color=color_bar[i], tick_label=c_pivot.index, label=label_dict[col])

text = [ax[i].text(*item, va='bottom', ha='center') for item in zip(index, y, y)]

ax[i].legend(loc='best')

plt.savefig('movie.png', dpi=300)

从上图可以看出,豆瓣中的数据,美国的电影产量最多。因为我的爬虫部署在国外的VPS(虚拟专用服务器),由于我使用的服务器内存较小,爬取的阈值只设置为300页,不然美国会有更多的电影数据爬取(这里打个广告,有想使用VPS的朋友,可以点击我的链接注册,可获得本人免费的远程支持:https://www.vultr.com/?ref=7308747)。

其次是中国、日本、法国。剧情类的电影最多,其实使用电影类型这个维度分析时比较扯,因为一部电影的类型可以为多种,比如周星星的《功夫》,类型为喜剧、动作、犯罪、奇幻。而我之前在清洗数据的时候进行了去重,所以这张图,我犯懒了,将就着看吧,我们着重讲的是技术,只要在工作中不要这样分析就可以了,不然会害死业务的~

从另一个维度“评分区间”中可以看到,大部分电影都集中在6-8分,这也很合理,如果画一个曲线图的话,电影的评分情况会符合正态分布。

看的出产片量最高的国家为美国、中国、日本、法国。我想比较下这几个国家的影片质量,可以分别看一下各国影片的评分情况。

comp_m = movie[movie.loc[:,'region'].apply(lambda x: True if x in ['美国', '中国大陆', '日本', '法国'] else False)]

c_pivot = comp_m.pivot_table(index=['region','score_dis'], values='dataId',aggfunc=np.count_nonzero)

names = comp_m['region'].unique().tolist() # ['美国', '日本', '中国大陆', '法国']

x = np.arange(0, 10, 2)

bar_width = 0.4

xticks_position = x + (0+bar_width*3)/2

plt.figure(figsize=(12,8))

for i, i_name in enumerate(names):

part = c_pivot.loc[i_name]

part['sort'] = part.index

part.sort_values(by='sort', ascending=False, inplace=True)

part['text'] = part['dataId'].astype(str)+'\n'+round(part['p']*100,1).astype(str)+'%'

y = part['dataId'].values

plt.bar(x, y, bar_width, color=color_bar[i], label=i_name)

text = [plt.text(*item, va='bottom', ha='center',size=14) for item in zip(x, y, part['text'].values))]

x = x + bar_width

plt.xticks(xticks_position,part['sort'].sort_values(ascending=False).tolist())

plt.legend(loc='best')

plt.tight_layout()

plt.title('电影数据对比')

plt.savefig('电影数据对比.png', dpi=300)

# plt.show()

plt.close()

图中展示的结果非常详细,可以看到,美国9分以上的电影,占到了产片量的2.3%,而中国只有0.5%,四国中垫底,差距还是很明显的。8-9分的电影中国只有5.9%,美国达到了13.8%,并且四国中依然垫底!看一看4分以下的电影,中国站到了产片量的18.6%,哈哈,不负众望,终于登顶啦.......

中国的电影业还有很长一段路去走吧,得需要多少好电影做分母去缓冲恶劣的分子啊???(当然,不可否认的是豆瓣上的电影数据也并非完整,自我安慰下吧)

总结:

本篇文章主要讲的是如何用通过python将数据可视化,以便更好地看到数据的分布。在画图过程中会遇到一些难点,对于matplotlib这个包,我个人认为唯一的技巧就是多看官方文档,熟能生巧吧。

接下来的文章我要向影评的方向进攻了。可能会涉及到自然语言处理,不过数据准备的工作可能会有些费时。我个人认为,对于电影的短评,可以明显的表现出观众对某部电影的情绪,比如有的观众很喜欢某部电影,就会在短评中极端性得提出表扬。

上图截取自《至暗时刻》的短评。可以看到句子中“完美”、“张弛有度”、“高峰”等词都是对电影的正面评价,并且在这几句话中,完全是倾向于高分的评价,没有一点不满意的地方,且句子中不拖泥带水。

而这部电影的中差评中,“不要再引进”、“不看”、“直接差评”等词语更是强烈反应出观众的情绪。

对于长评中,多数的作者并非为专业影评,我大致浏览了一下。文章中有褒有贬,并且文中的大多数篇幅在剧透,评分标准不明显,作为数据的训练集并不妥。

所以,我可以对豆瓣中的影评做以下处理:

对于短评,通过评分或者手工标记,训练一个分类器。

对于长评,词频统计,做一个词云图

我们下回再见。

欢迎大家关注我的公众号

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180429G09M0O00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券