一.主題式網絡爬蟲設計方案
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!