今天讲一些如何对爬取后的数据做基础分析,看一下豆瓣上电影质量的分布情况。其实主要涉及的是一些技术代码的讲解,不涉及什么高深的业务分析。
在机器学习过程中,对于特征工程这部分的工作,最开始就是看一下数据的分布,一般是通过透视表来观察。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这个包,我个人认为唯一的技巧就是多看官方文档,熟能生巧吧。
接下来的文章我要向影评的方向进攻了。可能会涉及到自然语言处理,不过数据准备的工作可能会有些费时。我个人认为,对于电影的短评,可以明显的表现出观众对某部电影的情绪,比如有的观众很喜欢某部电影,就会在短评中极端性得提出表扬。
上图截取自《至暗时刻》的短评。可以看到句子中“完美”、“张弛有度”、“高峰”等词都是对电影的正面评价,并且在这几句话中,完全是倾向于高分的评价,没有一点不满意的地方,且句子中不拖泥带水。
而这部电影的中差评中,“不要再引进”、“不看”、“直接差评”等词语更是强烈反应出观众的情绪。
对于长评中,多数的作者并非为专业影评,我大致浏览了一下。文章中有褒有贬,并且文中的大多数篇幅在剧透,评分标准不明显,作为数据的训练集并不妥。
所以,我可以对豆瓣中的影评做以下处理:
对于短评,通过评分或者手工标记,训练一个分类器。
对于长评,词频统计,做一个词云图
我们下回再见。
欢迎大家关注我的公众号
领取专属 10元无门槛券
私享最新 技术干货