一.主题式网络爬虫设计方案
1.主题式网络爬虫名称:爬取美团平台古乐牛香牛杂火锅评论及评分数据分析与可视化处理
2.主题式网络爬虫爬取的内容:美团平台古乐牛香牛杂火锅评论及评分数据
3.设计方案概述:
实现思路:通过开发者工具抓取古乐牛香牛杂火锅评论及评分的数据,分析该数据的url拼接方式,通过requests模块进行翻页爬取,将它转换成json数据进行解析,提取用户名称,用户评论,用户评分及用户评星数据,通过pandas模块对数据进行保存,随后对数据进行清洗和处理,通过jieba、wordcloud分词对文本数据进行分析并呈现,最后使用多种模块对评分及星级数据进行分析和可视化,并根据数据之间的关系分析两个变量之间的相关系数建立变量之间的多元回归方程
技术难点:此次使用的库多,需要仔细阅读官方文档并熟练使用。
二、主题页面的结构特征分析
1.首先我们进入 美图平台 古乐牛香牛杂火锅(南俊店)(https://www.meituan.com/meishi/114865734/)
打开开发者工具进行抓包处理 如下图:
我们会抓取到非常多数据包,通过反复查找,我们会发现这个request url为:https://www.meituan.com/meishi/api/poi/getMerchantComment?uuid=0bb11f415036498cae5a.1585902206.1.0.0&platform=1&partner=126&originUrl=https%3A%2F%2Fwww.meituan.com%2Fmeishi%2F114865734%2F&riskLevel=1&optimusCode=10&id=114865734&userId=&offset=0&pageSize=10&sortType=1 的一个数据包,我们点击Previvew查看他的内容,会发现它就是我们要找的用户评论数据包:
那么接下来就可以打开这个URL,查看我们想要的数据了!!!
不难发现 我们想要的用户名称,用户评论,用户评分,用户评星的数据分别保存在 data//comments下面的comment,userLevel,star里面,那么我们开始用python对它进行爬取和保存吧!
首先我们把cookie,user-agent,host和referer拿下来
然后是要对这些用户评论数据的url 进行分析。
通过点击下一页,我们会发现,只有offset=xx改变了:
并且我们发现规律,第一页对应的是offset=0,第二页对应的是offset=10,第三页是offset=20....所以我们可以对URL进行拼接处理,实现翻页爬取。
url1='https://www.meituan.com/meishi/api/poi/getMerchantComment?uuid=0bb11f415036498cae5a.1585902206.1.0.0&platform=1&partner=126&originUrl=https%3A%2F%2Fwww.meituan.com%2Fmeishi%2F114865734%2F&riskLevel=1&optimusCode=10&id=114865734&userId=&offset=' url2='&pageSize=10&sortType=1' #我们不妨把它拆分为两部分,把offset=xx的数字部分单独取出,通过for循环更改后再将url1和url2拼接 #我们爬取前10页数据进行分析 for set in range(10): url=url1+str(set*10)+url2 #注意要使用str将数字变为字符,再拼接 print('正在爬取第{}页数据'.format(set+1)) #print(url),检查url是否拼接正确 html=requests.get(url=url,headers=headers)
然后我们把爬取下来的数据转换成可处理的json数据,并将我们想要的数据都保存在先前定义的4个数组当中,并将数据全部存储到F:\\python\\PL//pl.xlsx中
#使用json.loads函数让数据转换为可处理的json格式 a=json.loads(html.text) #可以在该数据中发现我们想要的用户,评论,评分,星级都在["data"]["comments"]中 #那我们可以用for循环去遍历这个json数据 for x in a["data"]["comments"]: #将我们想要的数据都赋值给一个变量 o=x["comment"] p=x["userLevel"] q=x["userName"] s=int(x["star"]/10) #除以10是因为星级的评判只有0~5星,再用int使它变为整形 #将数据都添加进我们先前生成的4个数组当中 pl.append(o) pf.append(p) yh.append(q) xj.append(s) #print('用户:'+str(q)+'评分:'+str(p)+'分'+'星级'+str(s)+'星') #这里检查是否提取正确 #使用pandas的DataFrame函数创建匹配列名并存放数据 df = pd.DataFrame({'用户':yh,'评论':pl,'评分':pf,'星级':xj}) #将数据保存为excel文件,存放在F:\\python\\PL中并命名为pl.xlsx df.to_excel('F:\\python\\PL//pl.xlsx',index=False)
我们看一下我们的数据有没有成功保存
ok !数据保存下来了
接下来我们在进行分词之前,为了让我们可以更直观地看到用户评分和用户评星所占的比例,我们通过合计评分分值和星级数量来绘制饼图,查看5分和5星所占的比例
#合计所有评分中0,1,2,3,4,5分的数量 m=collections.Counter(pf) #合计所有星级中0,1,2,3,4,5星的数量 x=collections.Counter(xj) #先看看它们数量有多少 print('=========评分分值总计如下=========') print('评0分的总计为:',m[0],'\n' '评1分的总计为:',m[1],'\n' '评2分的总计为:',m[2],'\n' '评3分的总计为:',m[3],'\n' '评4分的总计为:',m[4],'\n' '评5分的总计为:',m[5],'\n' ) print('=========星级数量总计如下=========') print('评0分星总计为:',x[0],'\n' '评1分星总计为:',x[1],'\n' '评2分星总计为:',x[2],'\n' '评3分星总计为:',x[3],'\n' '评4分星总计为:',x[4],'\n' '评5分星总计为:',x[5],'\n' ) plt.rcParams['font.sans-serif']=['SimHei'] # 用来正常显示中文标签 plt.rcParams['axes.unicode_minus'] = False #在将dict转为DataFrame时会报错 需要在尾部添加参数:index = [0] #我们将统计好的评分数据保存在一个excel中 df = pd.DataFrame({'0分总计':m[0],'1分总计':m[1],'2分总计':m[2],'3分总计':m[3],'4分总计':m[4],'5分总计':m[5]},index = [0]) df.to_excel('pfzj.xlsx',index=False) #我们开始绘制评分分值总计的饼图 plt.figure(figsize=(10,10))#将画布设定为正方形,则绘制的饼图是正圆 label=['0分总计','1分总计','2分总计','3分总计','4分总计','5分总计']#定义饼图的标签,标签是列表 explode=[0,0,0,0,0,0.1] #设定各项距离圆心n个半径 #绘制饼图 values=[m[0],m[1],m[2],m[3],m[4],m[5]] #加入数值 plt.pie(values,explode=explode,labels=label,autopct='%1.1f%%')#绘制饼图的参数 plt.title('评分分值总计图') plt.savefig('./评分分值总计图') plt.show() #我们将统计好的星级数据保存在另一个excel中 dm = pd.DataFrame({'0星总计':x[0],'1星总计':x[1],'2星总计':x[2],'3星总计':x[3],'4星总计':x[4],'5星总计':x[5]},index = [0]) dm.to_excel('xjzj.xlsx',index=False) #我们开始绘制星级数量总计的饼图 plt.figure(figsize=(10,10))#将画布设定为正方形,则绘制的饼图是正圆 label=['0星总计','1星总计','2星总计','3星总计','4星总计','5星总计']#定义饼图的标签,标签是列表 explode=[0,0,0,0,0,0.1]#设定各项距离圆心n个半径 #绘制饼图 values=[x[0],x[1],x[2],x[3],x[4],x[5]]#加入数值 plt.pie(values,explode=explode,labels=label,autopct='%1.1f%%')#绘制饼图的参数 plt.title('星级数量总计图') plt.savefig('星级数量总计图') plt.show()
运行代码,结果如下:
我们来看一下评分总计的数据和星级数量总计的数据是否保存成功:
ok !评分总计的数据和星级数量总计的数据保存成功
我们再来看看生成的饼图数据:
好的,我们完成了评分饼图和星级饼图的绘制,可以看出这家店还是不错的,以前路过因为排队排到路边去了,就放弃了去品尝的想法Q.Q
接下来,我们开始通过jieba和wordcloud分词,对用户评论数据进行可视化吧!
为了使生成的词云更加精美有趣,我使用了最近很火的瑞幸咖啡的LOGO!!
1 #保存完excel文件后,再将评论数据单独提取出,保存为一个文本 2 3 #因为我们需要通过jieba、wordcloud分词对文本数据进行分析并呈现 4 5 6 7 fos = open("评论文本.txt", "w", encoding="utf-8") 8 for i in pl: 9 fos.write(str(i)) 10 fos.close() 11 12 #保存完毕 13 14 15 #接下来我们要对评论数据进行数据清洗,将特殊符号全部删除掉 16 #以便我们更好地分词和呈现数据 17 18 19 #这里我们定义一个clearSen函数,用于将将特殊符号全部删除 20 21 def clearSen(comment): 22 comment = comment.strip() 23 comment = comment.replace('、', '') 24 comment = comment.replace(',', '。') 25 comment = comment.replace('《', '。') 26 comment = comment.replace('》', '。') 27 comment = comment.replace('~', '') 28 comment = comment.replace('…', '') 29 comment = comment.replace('\r', '') 30 comment = comment.replace('\t', ' ') 31 comment = comment.replace('\f', ' ') 32 comment = comment.replace('/', '') 33 comment = comment.replace('、', ' ') 34 comment = comment.replace('/', '') 35 comment = comment.replace('。', '') 36 comment = comment.replace('(', '') 37 comment = comment.replace(')', '') 38 comment = comment.replace('_', '') 39 comment = comment.replace('?', ' ') 40 comment = comment.replace('?', ' ') 41 comment = comment.replace('了', '') 42 comment = comment.replace('➕', '') 43 comment = comment.replace(':', '') 44 return comment 45 46 47 #打开数据文件进行jieba.cut处理,使它生成一个生成器 48 text = (open('评论文本.txt','r',encoding='utf-8')).read() 49 segs=jieba.cut(text) 50 51 #定义一个新的数组,用于存放清洗后地数据 52 mytext_list=[] 53 54 #对其进行文本清洗 55 for x in segs: 56 cs=clearSen(x) 57 mytext_list.append(cs) 58 59 60 #将清洗后的数据放入即将用于生成的词云中 61 cloud_text=",".join(mytext_list) 62 63 64 #为了使生成的词云更加精美有趣,我使用了最近很火的瑞幸咖啡的LOGO 65 66 67 #加载背景图片 68 cloud_mask = np.array(Image.open("瑞幸.jpg")) 69 70 71 #对生成的词云图片进行设置 72 wc = WordCloud( 73 background_color="white", #背景颜色 74 mask=cloud_mask, 75 max_words=100000, #显示最大词数 76 font_path="simhei.ttf", #使用字体,我使用的是黑体 77 min_font_size=10, #字体最小字号 78 max_font_size=50, #字体最大字号 79 width=1000, #图幅宽度 80 height=1000 81 #图幅高度 82 ) 83 84 85 #调用词云数据 86 wc.generate(cloud_text) 87 #生成词云图片,名称为2.jpg 88 wc.to_file("词云.jpg")
代码运行结果如下:
successfully-------证明生成成功!!
我们来到文件夹看到我们生成的词云图片:
词云非常精美!接下来我们开始对评分和星级数据进行清理和分析,做可视化处理
#通过jieba、wordcloud分词对文本数据进行分析并呈现后,我们开始分析评分和星级的数据关系 #将pl.xlsx读取给mt变量 mt=pd.read_excel('F:\\python\\PL//pl.xlsx') #这里我们定义一个shujuqingli的函数,用于对评分和星级的数据清理 def shujuqingli(mt): #查看统计空值情况 print(mt.isnull()) #查看重复值情况 print(mt.duplicated()) #查看空值情况 print(mt['评分'].isnull().value_counts()) print(mt['星级'].isnull().value_counts()) #查看异常值处理情况 print(mt.describe()) #将mt放入shujuqingli函数中进行清理 shujuqingli(mt) #检查后发现数据无异常 #接下来我们对它进行数据分析与可视化(例如:数据柱形图、直方图、散点图、盒图、分布图) plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签 plt.rcParams['axes.unicode_minus']=False #使用numpy中的random.rand函数返回一组服从标准正态分布的随机样本值。 x=np.random.rand(50) y=np.random.rand(50) #设置x轴的标签文本 plt.xlabel("评分") #设置y轴的标签文本 plt.ylabel("星级") #画出散点图 plt.scatter(x,y,100,color='g',alpha=1) #这里我们使用sns.jointplot函数 #kind的值 必须是 'scatter', 'reg', 'resid', 'kde', 或者 'hex'种类 #散点图 + 分布图 sns.jointplot(x="评分",y="星级",data=mt,kind='scatter') #联合分布图 sns.jointplot(x="评分",y="星级",data=mt,kind='reg') #密度图 sns.jointplot(x="评分",y="星级",data=mt,kind="kde",space=0,color='b') #残差模块图 sns.jointplot(x="评分",y="星级",data=mt,kind='resid') #六边形图 sns.jointplot(x="评分",y="星级",data=mt,kind='hex') #调用corr方法,计算每个列两两之间的相似度 print(mt.corr()) #调用corr方法,计算该序列与传入序列之间的相关度 print(mt['评分'].corr(mt['星级'])) #这里开始对评分和星级数据进行分析和可视化 pldict={'评分':pf,'星级':xj} #转换为DataFrame的数据格式 pldf = DataFrame(pldict) #绘制散点图 plt.scatter(pldf.评分,pldf.星级,color = 'b',label = "Exam Data") #添加图的标签(x轴,y轴) plt.xlabel("评分") plt.ylabel("星级") #显示图像 plt.savefig("pldf.jpg") plt.show() #我们通过回归方程 y = a + b*x (模型建立最佳拟合线) #使用pandas的loc函数显示索引,并赋值给exam_X,csY csX = pldf.loc[:,'星级'] csY = pldf.loc[:,'评分'] #实例化一个线性回归的模型 model = LinearRegression() #使用values.reshape(-1,1)更改数据的行列数目 zzX = csX.values.reshape(-1,1) zzY = csY.values.reshape(-1,1) #建立模型拟合 model.fit(zzX,zzY) jieju = model.intercept_#截距 xishu = model.coef_#回归系数 print("最佳拟合线:截距",jieju,",回归系数:",xishu) plt.scatter(zzX, zzY, color='blue', label="train data") #训练数据的预测值 xunlian = model.predict(zzX) #绘制最佳拟合线 plt.plot(zzX, xunlian, color='black', linewidth=3, label="best line") #添加图标标签 plt.legend(loc=2) plt.xlabel("评分") plt.ylabel("星级") #显示图像 plt.savefig("最终.jpg") plt.show()
代码运行会出现很多图片,我们可以逐个保存,实现数据持久化存储
代码运行结果如下:
我们绘制的图片如下:
这是我们通过回归方程最终得到的图片
最终附上本次程序的源码及文件截图:
1 import requests 2 import json 3 import time 4 import jieba 5 import pandas as pd 6 from wordcloud import WordCloud 7 import matplotlib.pyplot as plt 8 import matplotlib 9 import numpy as np 10 import seaborn as sns 11 import jieba.analyse 12 from PIL import Image 13 from pandas import DataFrame,Series 14 from sklearn.model_selection import train_test_split 15 from sklearn.linear_model import LinearRegression 16 import collections 17 18 #新建4个数组,分别用来存放爬取下来的评论,评分,用户,星级 19 20 pl=[] 21 pf=[] 22 yh=[] 23 xj=[] 24 25 #设置请求头 26 #cookie有时效性,需要爬取时需要进行更换 27 28 29 30 headers={ 31 'Cookie': '_lx_utm=utm_source%3DBaidu%26utm_medium%3Dorganic; _lxsdk_cuid=1713f23471ec8-0fff7149bdd69c-3f6b4f04-144000-1713f23471ec8; __mta=147731336.1585902209621.1585902209621.1585902209621.1; ci=110; rvct=110%2C1; client-id=68720d01-7956-4aa6-8c0e-ed3ee9ae6295; _hc.v=51b2d328-c63b-23ed-f950-4af49bde68ee.1585902347; _lxsdk=1713f23471ec8-0fff7149bdd69c-3f6b4f04-144000-1713f23471ec8; uuid=0bb11f415036498cae5a.1585902206.1.0.0', 32 'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36', 33 'Host': 'qz.meituan.com', 34 'Referer': 'https://qz.meituan.com/s/%E6%B3%89%E5%B7%9E%E4%BF%A1%E6%81%AF%E5%AD%A6%E9%99%A2/' 35 36 } 37 38 39 #开始拼接url 40 41 url1='https://www.meituan.com/meishi/api/poi/getMerchantComment?uuid=0bb11f415036498cae5a.1585902206.1.0.0&platform=1&partner=126&originUrl=https%3A%2F%2Fwww.meituan.com%2Fmeishi%2F114865734%2F&riskLevel=1&optimusCode=10&id=114865734&userId=&offset=' 42 url2='&pageSize=10&sortType=1' 43 44 #我们不妨把它拆分为两部分,把offset=xx的数字部分单独取出,通过for循环更改后再将url1和url2拼接 45 46 47 #我们爬取前10页数据进行分析 48 49 for set in range(10): 50 url=url1+str(set*10)+url2 51 52 #注意要使用str将数字变为字符,再拼接 53 54 print('正在爬取第{}页数据'.format(set+1)) 55 #print(url),检查url是否拼接正确 56 html=requests.get(url=url,headers=headers) 57 58 #使用json.loads函数让数据转换为可处理的json格式 59 a=json.loads(html.text) 60 61 62 #可以在该数据中发现我们想要的用户,评论,评分,星级都在["data"]["comments"]中 63 #那我们可以用for循环去遍历这个json数据 64 for x in a["data"]["comments"]: 65 #将我们想要的数据都赋值给一个变量 66 o=x["comment"] 67 p=x["userLevel"] 68 q=x["userName"] 69 s=int(x["star"]/10) #除以10是因为星级的评判只有0~5星,再用int使它变为整形 70 71 72 #将数据都添加进我们先前生成的4个数组当中 73 pl.append(o) 74 pf.append(p) 75 yh.append(q) 76 xj.append(s) 77 #print('用户:'+str(q)+'评分:'+str(p)+'分'+'星级'+str(s)+'星') 78 #这里检查是否提取正确 79 80 #使用pandas的DataFrame函数创建匹配列名并存放数据 81 df = pd.DataFrame({'用户':yh,'评论':pl,'评分':pf,'星级':xj}) 82 83 #将数据保存为excel文件,存放在F:\\python\\PL中并命名为pl.xlsx 84 df.to_excel('F:\\python\\PL//pl.xlsx',index=False) 85 86 87 88 #保存完excel文件后,再将评论数据单独提取出,保存为一个文本 89 90 #因为我们需要通过jieba、wordcloud分词对文本数据进行分析并呈现 91 92 93 94 fos = open("评论文本.txt", "w", encoding="utf-8") 95 for i in pl: 96 fos.write(str(i)) 97 fos.close() 98 99 #保存完毕 100 101 #在进行分词之前,为了让我们可以更直观地看到用户评分和用户评星所占的比例 102 103 #我们通过合计评分分值和星级数量来绘制饼图,查看5分和5星所占的比例 104 105 #合计所有评分中0,1,2,3,4,5分的数量 106 m=collections.Counter(pf) 107 108 #合计所有星级中0,1,2,3,4,5星的数量 109 x=collections.Counter(xj) 110 111 112 #先看看它们数量有多少 113 114 print('=========评分分值总计如下=========') 115 print('评0分的总计为:',m[0],'\n' 116 '评1分的总计为:',m[1],'\n' 117 '评2分的总计为:',m[2],'\n' 118 '评3分的总计为:',m[3],'\n' 119 '评4分的总计为:',m[4],'\n' 120 '评5分的总计为:',m[5],'\n' 121 ) 122 123 124 125 126 print('=========星级数量总计如下=========') 127 print('评0分星总计为:',x[0],'\n' 128 '评1分星总计为:',x[1],'\n' 129 '评2分星总计为:',x[2],'\n' 130 '评3分星总计为:',x[3],'\n' 131 '评4分星总计为:',x[4],'\n' 132 '评5分星总计为:',x[5],'\n' 133 ) 134 135 plt.rcParams['font.sans-serif']=['SimHei'] # 用来正常显示中文标签 136 plt.rcParams['axes.unicode_minus'] = False 137 138 139 140 #在将dict转为DataFrame时会报错 需要在尾部添加参数:index = [0] 141 142 #我们将统计好的评分数据保存在一个excel中 143 df = pd.DataFrame({'0分总计':m[0],'1分总计':m[1],'2分总计':m[2],'3分总计':m[3],'4分总计':m[4],'5分总计':m[5]},index = [0]) 144 df.to_excel('pfzj.xlsx',index=False) 145 146 147 148 #我们开始绘制评分分值总计的饼图 149 plt.figure(figsize=(10,10))#将画布设定为正方形,则绘制的饼图是正圆 150 label=['0分总计','1分总计','2分总计','3分总计','4分总计','5分总计']#定义饼图的标签,标签是列表 151 explode=[0,0,0,0,0,0.1] #设定各项距离圆心n个半径 152 #绘制饼图 153 values=[m[0],m[1],m[2],m[3],m[4],m[5]] #加入数值 154 plt.pie(values,explode=explode,labels=label,autopct='%1.1f%%')#绘制饼图的参数 155 plt.title('评分分值总计图') 156 plt.savefig('./评分分值总计图') 157 plt.show() 158 159 160 161 #我们将统计好的星级数据保存在另一个excel中 162 dm = pd.DataFrame({'0星总计':x[0],'1星总计':x[1],'2星总计':x[2],'3星总计':x[3],'4星总计':x[4],'5星总计':x[5]},index = [0]) 163 dm.to_excel('xjzj.xlsx',index=False) 164 165 166 167 #我们开始绘制星级数量总计的饼图 168 plt.figure(figsize=(10,10))#将画布设定为正方形,则绘制的饼图是正圆 169 label=['0星总计','1星总计','2星总计','3星总计','4星总计','5星总计']#定义饼图的标签,标签是列表 170 explode=[0,0,0,0,0,0.1]#设定各项距离圆心n个半径 171 #绘制饼图 172 values=[x[0],x[1],x[2],x[3],x[4],x[5]]#加入数值 173 plt.pie(values,explode=explode,labels=label,autopct='%1.1f%%')#绘制饼图的参数 174 plt.title('星级数量总计图') 175 plt.savefig('星级数量总计图') 176 plt.show() 177 178 179 180 181 182 183 184 185 186 187 188 189 #接下来我们要对评论数据进行数据清洗,将特殊符号全部删除掉 190 #以便我们更好地分词和呈现数据 191 192 193 #这里我们定义一个clearSen函数,用于将将特殊符号全部删除 194 195 def clearSen(comment): 196 comment = comment.strip() 197 comment = comment.replace('、', '') 198 comment = comment.replace(',', '。') 199 comment = comment.replace('《', '。') 200 comment = comment.replace('》', '。') 201 comment = comment.replace('~', '') 202 comment = comment.replace('…', '') 203 comment = comment.replace('\r', '') 204 comment = comment.replace('\t', ' ') 205 comment = comment.replace('\f', ' ') 206 comment = comment.replace('/', '') 207 comment = comment.replace('、', ' ') 208 comment = comment.replace('/', '') 209 comment = comment.replace('。', '') 210 comment = comment.replace('(', '') 211 comment = comment.replace(')', '') 212 comment = comment.replace('_', '') 213 comment = comment.replace('?', ' ') 214 comment = comment.replace('?', ' ') 215 comment = comment.replace('了', '') 216 comment = comment.replace('➕', '') 217 comment = comment.replace(':', '') 218 return comment 219 220 221 #打开数据文件进行jieba.cut处理,使它生成一个生成器 222 text = (open('评论文本.txt','r',encoding='utf-8')).read() 223 segs=jieba.cut(text) 224 225 #定义一个新的数组,用于存放清洗后地数据 226 mytext_list=[] 227 228 #对其进行文本清洗 229 for x in segs: 230 cs=clearSen(x) 231 mytext_list.append(cs) 232 233 234 #将清洗后的数据放入即将用于生成的词云中 235 cloud_text=",".join(mytext_list) 236 237 238 #为了使生成的词云更加精美有趣,我使用了最近很火的瑞幸咖啡的LOGO 239 240 241 #加载背景图片 242 cloud_mask = np.array(Image.open("瑞幸.jpg")) 243 244 245 #对生成的词云图片进行设置 246 wc = WordCloud( 247 background_color="white", #背景颜色 248 mask=cloud_mask, 249 max_words=100000, #显示最大词数 250 font_path="simhei.ttf", #使用字体,我使用的是黑体 251 min_font_size=10, #字体最小字号 252 max_font_size=50, #字体最大字号 253 width=1000, #图幅宽度 254 height=1000 255 #图幅高度 256 ) 257 258 259 #调用词云数据 260 wc.generate(cloud_text) 261 #生成词云图片,名称为2.jpg 262 wc.to_file("词云.jpg") 263 264 265 266 267 268 269 270 #通过jieba、wordcloud分词对文本数据进行分析并呈现后,我们开始分析评分和星级的数据关系 271 272 273 #将pl.xlsx读取给mt变量 274 275 mt=pd.read_excel('F:\\python\\PL//pl.xlsx') 276 277 #这里我们定义一个shujuqingli的函数,用于对评分和星级的数据清理 278 def shujuqingli(mt): 279 280 #查看统计空值情况 281 print(mt.isnull()) 282 #查看重复值情况 283 print(mt.duplicated()) 284 #查看空值情况 285 print(mt['评分'].isnull().value_counts()) 286 print(mt['星级'].isnull().value_counts()) 287 #查看异常值处理情况 288 print(mt.describe()) 289 290 #将mt放入shujuqingli函数中进行清理 291 shujuqingli(mt) 292 293 #检查后发现数据无异常 294 295 296 #接下来我们对它进行数据分析与可视化(例如:数据柱形图、直方图、散点图、盒图、分布图) 297 plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签 298 plt.rcParams['axes.unicode_minus']=False 299 300 301 #使用numpy中的random.rand函数返回一组服从标准正态分布的随机样本值。 302 x=np.random.rand(50) 303 y=np.random.rand(50) 304 305 #设置x轴的标签文本 306 plt.xlabel("评分") 307 #设置y轴的标签文本 308 plt.ylabel("星级") 309 310 311 312 #画出散点图 313 plt.scatter(x,y,100,color='g',alpha=1) 314 315 #这里我们使用sns.jointplot函数 316 #kind的值 必须是 'scatter', 'reg', 'resid', 'kde', 或者 'hex'种类 317 318 319 320 #散点图 + 分布图 321 322 sns.jointplot(x="评分",y="星级",data=mt,kind='scatter') 323 324 #联合分布图 325 326 sns.jointplot(x="评分",y="星级",data=mt,kind='reg') 327 328 #密度图 329 330 sns.jointplot(x="评分",y="星级",data=mt,kind="kde",space=0,color='b') 331 332 #残差模块图 333 334 sns.jointplot(x="评分",y="星级",data=mt,kind='resid') 335 336 #六边形图 337 338 sns.jointplot(x="评分",y="星级",data=mt,kind='hex') 339 340 341 #调用corr方法,计算每个列两两之间的相似度 342 343 print(mt.corr()) 344 345 #调用corr方法,计算该序列与传入序列之间的相关度 346 347 print(mt['评分'].corr(mt['星级'])) 348 349 350 351 352 353 354 355 356 357 #这里开始对评分和星级数据进行分析和可视化 358 pldict={'评分':pf,'星级':xj} 359 360 361 #转换为DataFrame的数据格式 362 pldf = DataFrame(pldict) 363 364 #绘制散点图 365 plt.scatter(pldf.评分,pldf.星级,color = 'b',label = "Exam Data") 366 367 #添加图的标签(x轴,y轴) 368 plt.xlabel("评分") 369 plt.ylabel("星级") 370 #显示图像 371 plt.savefig("pldf.jpg") 372 plt.show() 373 374 375 376 377 #我们通过回归方程 y = a + b*x (模型建立最佳拟合线) 378 379 380 #使用pandas的loc函数显示索引,并赋值给exam_X,csY 381 csX = pldf.loc[:,'星级'] 382 csY = pldf.loc[:,'评分'] 383 384 385 #实例化一个线性回归的模型 386 model = LinearRegression() 387 388 389 390 #使用values.reshape(-1,1)更改数据的行列数目 391 zzX = csX.values.reshape(-1,1) 392 zzY = csY.values.reshape(-1,1) 393 394 395 #建立模型拟合 396 model.fit(zzX,zzY) 397 398 jieju = model.intercept_#截距 399 400 xishu = model.coef_#回归系数 401 402 print("最佳拟合线:截距",jieju,",回归系数:",xishu) 403 404 405 406 plt.scatter(zzX, zzY, color='blue', label="train data") 407 408 #训练数据的预测值 409 xunlian = model.predict(zzX) 410 411 412 #绘制最佳拟合线 413 plt.plot(zzX, xunlian, color='black', linewidth=3, label="best line") 414 415 416 417 #添加图标标签 418 plt.legend(loc=2) 419 plt.xlabel("评分") 420 plt.ylabel("星级") 421 #显示图像 422 plt.savefig("最终.jpg") 423 plt.show() 424
五、总结
结论:经过对数据的分析和可视化,从不同的数据团和拟合曲线可以看出用户评分和用户评星之间没有太大的联系,再从评论中看,用户体验受着诸多因素影响,不过总体来说,用户对这家店的评析还是不错的,有机会一定去品尝品尝泉州的风味美食。
小结:在这次对美团古乐牛香的数据进行分析的过程中,不仅巩固了之前学过的一些知识,而且还扩大了自己对python库的认识和应用。通过官方文档的介绍,并结合实际案例,我掌握python各种强大的第三方库的使用,对python这门语言变得更加热爱,也提升了个人对数据分析与可视化的操作能力,果然人生苦短,我用python!