爬取美團平台古樂牛香牛雜火鍋評論及評分數據分析與可視化處理


一.主題式網絡爬蟲設計方案

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!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM