好友
阅读权限 10
听众
最后登录 1970-1-1
py看考场
发表于 2019-3-17 01:28
本帖最后由 py看考场 于 2019-4-8 22:45 编辑
大家好,前两个帖子为大家介绍了scrapy的安装配置以及对猫眼流浪地球评论的爬取,这个帖子是对爬取的数据可视化分析。
传输门 scrapy的安装配置 scrapy爬取评论数据
可视化分析之前,windows 环境必须下载安装好的第三方模块有pandas,collections,pyecharts,jieba,matplotlib以及wordcloud,地图有关模块
其中pyecharts(各种图表)下载后通过pip安装,,方式和“scrapy的安装配置 ” 中的方法一样,在此就不介绍了
collections(统计)是python的内置模块,无需安装
重点介绍一下pandas,jieba,matplotlib和wordcloud,地图有关模块的安装方法
一.模块安装
1.pandas数据处理,matplotlib绘图
因为pandas,matplotlib依赖numpy,所以先pip install numpy,然后再pip install pandas, pip install --upgrade setuptools, pip install matplotlib
2.jieba分词
全自动安装: pip install jieba
半自动安装:首先在 https://pypi.org/project/jieba/#files 中下载.zip文件(访问此链接需要外网,不然速度太慢,因此在本帖最后我将附上此文件)
首先定位到解压后jieba的setup.py文件存在地方,然后输入python setup.py install安装(这里我已经安装过了)
3.wordcloud词云
这个模块安装较绕,我也是踩坑后解决的
直接用pip install wordcloud安装报错 " error: Microsoft Visual C++ 14.0 is required. Get it with “Microsoft Visual C++ Build "
查看了很多方法,还是直接在 https://www.lfd.uci.edu/~gohlke/pythonlibs/#wordcloud下载源文件安装最简单,最方便
下载的版本等信息可以参考我之前写的" scrapy的安装配置 ", 将下载后的文件复制,放入你的python安装包的目录下(我是放在E:\Python3.6.0\Scripts下) 首先一定要进去E:\Python3.6.0\Scripts这个路径下,然后在用pip install wordcloud-xxx.whl 安装,安装完后可以将安装包删除
4.地图相关模块
安装国家、省级、市级地图包
pip install echarts-countries-pypkg
pip install echarts-china-provinces-pypkg
pip install echarts-china-cities-pypkg
OK,相关模块已经安装好了!
二.直接上代码
提前说明一下,做词云用的数据跟做图表用的数据大小不同,因为数据过大时生成词云会出现MemoryError错误(64bit的python不会出现这种情况)
[Python] 纯文本查看 复制代码
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# author : jin time :2019/3/3
import pandas as pd
from collections import Counter
from pyecharts import Geo, Bar, Scatter
import jieba
import matplotlib.pyplot as plt
from wordcloud import WordCloud, STOPWORDS
import time
#观众地域图中部分注释
#attr:标签名称(地点)
#value:数值
#visual_range:可视化范围
#symbol_size:散点的大小
#visual_text_color:标签颜色
#is_visualmap:是否映射(数量与颜色深浅是否挂钩)
#maptype:地图类型
#读取csv文件(除了词云,其它图表用的源数据)
def read_csv(filename, titles):
comments = pd.read_csv(filename, names = titles, low_memory = False)
return comments
#词云用的源数据(比较小)
def read_csv1(filename1, titles):
comments = pd.read_csv(filename1, names = titles, low_memory = False)
return comments
#全国观众地域分布
def draw_map(comments):
attr = comments['city_name'].fillna('zero_token') #以'zero_token'代替缺失数据
data = Counter(attr).most_common(300) #Counter统计各个城市出现的次数,返回前300个出现频率较高的城市
# print(data)
data.remove(data[data.index([(i,x) for i,x in data if i == 'zero_token'][0])]) #检索城市'zero_token'并移除('zero_token', 578)
geo = Geo('《流浪地球》全国观众地域分布', '数据来源:Mr.jin', title_color = '#fff', title_pos = 'center', width = 1000, height = 600, background_color = '#404a59')
attr, value = geo.cast(data) #data形式[('合肥',229),('大连',112)]
geo.add('', attr, value, visual_range = [0, 4500], maptype = 'china', visual_text_color = '#fff', symbol_size = 10, is_visualmap = True)
geo.render('C:\\Users\\1\\Desktop\\流浪地球影评\\观众地域分布-地理坐标图.html')
print('全国观众地域分布已完成')
#观众地域排行榜单
def draw_bar(comments):
data_top20 = Counter(comments['city_name']).most_common(20) #前二十名城市
bar = Bar('《流浪地球》观众地域排行榜单', '数据来源:Mr.jin', title_pos = 'center', width = 1200, height = 600)
attr, value = bar.cast(data_top20)
bar.add('', attr, value, is_visualmap = True, visual_range = [0, 4500], visual_text_color = '#fff', is_more_utils = True, is_label_show = True)
bar.render('C:\\Users\\1\\Desktop\\流浪地球影评\\观众地域排行榜单-柱状图.html')
print('观众地域排行榜单已完成')
#观众评论数量与日期的关系
#必须统一时间格式,不然时间排序还是乱的
def draw_data_bar(comments):
time1 = comments['time']
time_data = []
for t in time1:
if pd.isnull(t) == False and 'time' not in t: #如果元素不为空
date1 = t.replace('/', '-')
date2 = date1.split(' ')[0]
current_time_tuple = time.strptime(date2, '%Y-%m-%d') #把时间字符串转化为时间类型
date = time.strftime('%Y-%m-%d', current_time_tuple) #把时间类型数据转化为字符串类型
time_data.append(date)
data = Counter(time_data).most_common() #data形式[('2019/2/10', 44094), ('2019/2/9', 43680)]
data = sorted(data, key = lambda data : data[0]) #data1变量相当于('2019/2/10', 44094)各个元组 itemgetter(0)
bar = Bar('《流浪地球》观众评论数量与日期的关系', '数据来源:Mr.jin', title_pos = 'center', width = 1200, height = 600)
attr, value = bar.cast(data) #['2019/2/10', '2019/2/11', '2019/2/12'][44094, 38238, 32805]
bar.add('', attr, value, is_visualmap = True, visual_range = [0, 3500], visual_text_color = '#fff', is_more_utils = True, is_label_show = True)
bar.render('C:\\Users\\1\\Desktop\\流浪地球影评\\观众评论日期-柱状图.html')
print('观众评论数量与日期的关系已完成')
#观众评论数量与时间的关系
#这里data中每个元组的第一个元素要转化为整数型,不然排序还是乱的
def draw_time_bar(comments):
time = comments['time']
time_data = []
real_data = []
for t in time:
if pd.isnull(t) == False and ':' in t:
time = t.split(' ')[1]
hour = time.split(':')[0]
time_data.append(hour)
data = Counter(time_data).most_common()
for item in data:
temp1 = list(item)
temp2 = int(temp1[0])
temp3 = (temp2,temp1[1])
real_data.append(temp3)
data = sorted(real_data, key = lambda x : x[0])
bar = Bar('《流浪地球》观众评论数量与时间的关系', '数据来源:Mr.jin', title_pos = 'center', width = 1200, height = 600)
attr, value = bar.cast(data)
bar.add('', attr, value, is_visualmap = True, visual_range = [0, 3500], visual_text_color = '#fff', is_more_utils = True, is_label_show = True)
bar.render('C:\\Users\\1\\Desktop\\流浪地球影评\\观众评论时间-柱状图.html')
print('观众评论数量与时间的关系已完成')
#词云,用一部分数据生成,不然数据量有些大,会报错MemoryError(64bit的python版本不会)
def draw_word_cloud(comments):
data = comments['comment']
comment_data = []
print('由于数据量比较大,分词这里有些慢,请耐心等待')
for item in data:
if pd.isnull(item) == False:
comment_data.append(item)
comment_after_split = jieba.cut(str(comment_data), cut_all = False)
words = ' '.join(comment_after_split)
stopwords = STOPWORDS.copy()
stopwords.update({'电影', '非常', '这个', '那个', '因为', '没有', '所以', '如果', '演员', '这么', '那么', '最后', '就是', '不过', '这个', '一个', '感觉', '这部', '虽然', '不是', '真的', '觉得', '还是', '但是'})
wc = WordCloud(width = 800, height = 600, background_color = '#000000', font_path = 'simfang', scale = 5, stopwords = stopwords, max_font_size = 200)
wc.generate_from_text(words)
plt.imshow(wc)
plt.axis('off')
plt.savefig('C:\\Users\\1\\Desktop\\流浪地球影评\\WordCloud.png')
plt.show()
#观众评分排行榜单
def draw_score_bar(comments):
score_list = []
data_score = Counter(comments['score']).most_common()
for item in data_score:
if item[0] != 'score':
score_list.append(item)
data = sorted(score_list, key = lambda x : x[0])
bar = Bar('《流浪地球》观众评分排行榜单', '数据来源:Mr.jin', title_pos = 'center', width = 1200, height = 600)
attr, value = bar.cast(data)
bar.add('', attr, value, is_visualmap = True, visual_range = [0, 4500], visual_text_color = '#fff', is_more_utils = True, is_label_show = True)
bar.render('C:\\Users\\1\\Desktop\\流浪地球影评\\观众评分排行榜单-柱状图.html')
print('观众评分排行榜单已完成')
#观众用户等级排行榜单
def draw_user_level_bar(comments):
level_list = []
data_level = Counter(comments['user_level']).most_common()
for item in data_level:
if item[0] != 'user_level':
level_list.append(item)
data = sorted(level_list, key = lambda x : x[0])
bar = Bar('《流浪地球》观众用户等级排行榜单', '数据来源:Mr.jin', title_pos = 'center', width = 1200, height = 600)
attr, value = bar.cast(data)
# is_more_utils = True 提供更多的实用工具按钮
bar.add('', attr, value, is_visualmap = True, visual_range = [0, 4500], visual_text_color = '#fff', is_more_utils = True, is_label_show = True)
bar.render('C:\\Users\\1\\Desktop\\流浪地球影评\\观众用户等级排行榜单-柱状图.html')
print('观众用户等级排行榜单已完成')
if __name__ == '__main__':
filename = 'C:\\Users\\1\\Desktop\\流浪地球影评\\comment.csv'
filename2 = 'C:\\Users\\1\\Desktop\\流浪地球影评\\info3.csv'
titles = ['city_name','comment','user_id','nick_name','score','time','user_level']
comments = read_csv(filename, titles)
comments2 = read_csv1(filename2, titles)
draw_map(comments)
draw_bar(comments)
draw_data_bar(comments)
draw_time_bar(comments)
draw_word_cloud(comments2)
draw_score_bar(comments)
draw_user_level_bar(comments)
三.程序运行后效果与分析
1.观众地域分布-地理坐标图
由全国地域热力图可见,观众主要分布在中 部, 南部,东部以及东北部,各省会城市的 观众尤 其多(红色代表观众最多),这与实际 的经济、 文化、消费水平基本相符。
2.《流浪地球》观众地域排行榜单
找到排名前20的城市,北京观众最多, 不愧是首都。令人惊奇的是成都超过广 州和上海位列第三,其它基本上也都是 一二线城市
3.《流浪地球》观众评分排行榜单
可以看到评分满分的用户几乎超过总 人数的70%,可见观众看完电影之后 很满足,也说明了电影的可看性很高
4.《流浪地球》观众评论数量与日期的关系
通过观众的评论日期可以看出,大年初一 上映的第一天评论人数并不多,应该大家 都在家里和家人团聚,从初二开始评论数 就开始激增。其中初五,初六两天达到了 峰值,原因可能是这两天是放假的最后两 天,大家想趁着放假结束带着自己的孩子 看一看电影吧。上班之后大家很忙,故人 数开始下降
5.《流浪地球》观众评论数量与时间的关系
从图中可以看出,评论的数量主要集中 在16-17点和21-23点,因为这部电影时 长为2小时,所以把评论时间往前移动2 小时基本就是看电影时间。可以看出大 家都是中午吃完饭(13点左右)和晚上吃 完饭(19点左右)后再去看电影的,而且 晚上看电影的人更多
6.《流浪地球》观众用户等级排行榜单
可见用户等级为0,5,6的用户基本没 有,而且随着等级的提升,人数急剧 变少。新用户可能是以年轻人为主, 对科幻电影感兴趣,因而评论数量较 多,而老用户主要偏向于现实剧情类 的电影,评论数量较少
7.《流浪地球》词云图
这是8万多的评论集中产生的词云,出现的词越多,在图片中的字号就越大。可以看到大家评论最多的词为“好看”、“可以”、“流浪”,“地球”、“国产”、“科幻片”等
四.备注
1. 以上就是对 《流浪地球》的可视化分析,分析结果仅代表个人观点
2.本来还想做一个关于 用户等级与评分之间的关系 的图表 ,一直达不到想要的效果, 如果有大佬看到,希望指点一二,多谢
3.未解决数据过大时生成词云出现 MemoryError问题 (可以把32bitpython卸掉装为64bitpython,但想要其它解决方法), 如果有大佬看到,希望指点一二,多谢
4.我将本帖用到的comment.csv和info3.csv以及生成的图表等数据已打包放在下面
5.如果对大家有用的话希望可以给个 热心
6. jieba模块下载链接 : https://pan.baidu.com/s/1qe3XUK8X0PPErixkpAuA2g 提取码: fkev
7. 图表文件下载链接 : https://pan.baidu.com/s/128a8wBEn28-69L3PVC9lCw 提取码: 2fwr
8. 源代码 :
data_analysis.zip
(2.79 KB, 下载次数: 88)
免费评分
查看全部评分