
數據提取
在我之前的文章Scrapy自動爬取商品數據爬蟲里實現了爬蟲爬取商品網站搜索關鍵詞為python的書籍商品,爬取到了60多頁網頁的1260本python書籍商品的書名,價格,評論數和商品鏈接,並將所有商品數據存儲到本地的.json文件中。數據存儲格式如下:

爬蟲爬取到的商品數據
接下來對爬取到的商品數據作預處理及可視化分析,使用工具為Anaconda的Jupyter notebook和python3.6環境。首先用python將爬取到的數據輸出為.csv文件,方便觀察和保存再利用。觀察第1260個數據可以發現價格格式為“¥46.60”,評論數格式為“301條評論”,都為字符串格式,要先分別轉換為數字格式“46.60”和“301”以方便處理。
import jsonimport csvimport numpy as npyimport pandas as pda#讀取.json文件dic=[]f = open("D:/python/.../getdata.json", 'r',encoding='utf-8')#這里為.json文件路徑for line in f.readlines(): dic.append(json.loads(line))#對爬取到的數據作處理,將價格和評論數由字符串處理為數字 tmp=''name,price,comnum,link=[]for i in range(0,1260): dic[i]['price']=tmp + dic[i]['price'][1:] dic[i]['comnum']=dic[i]['comnum'][:-3]+tmp price.append(float(dic[i]['price'])) comnum.append(int(dic[i]['comnum'])) name.append(dic[i]['name']) link.append(dic[i]['link'])data = numpy.array([name,price,comnum,link]).Tprint (data)
這里將爬取的數據都作處理后,轉換為python科學計算庫的numpy.array格式,data輸出結果如下:

print(data)
然后將data存儲為.csv文件
#要存儲.csv文件的路徑csvFile = open('D:/python/.../csvFile.csv','w') writer = csv.writer(csvFile)writer.writerow(['name', 'price', 'comnum','link'])for i in range(0,1260): writer.writerow(data[i])csvFile.close()
現在可以打開該路徑下的.csv文件,已存儲為如下格式:

.csv文件
當然可以在Scrapy爬蟲項目中修改pipelines.py文件,爬取到數據后直接輸出為.csv文件保存至本地,以相同方式改動添加上面的代碼即可,這里因為爬取到的數據並不直接可用,為方便分析處理先輸出到了.json文件。
數據預處理
缺失值處理
首先用數據分析處理庫pandas讀取.csv文件中的數據,存儲為數據框格式。可以發現該數據中有許多書的評論數為0,所以首先要做數據清洗,找到這些缺失值,這也是數據分析過程中很重要的一環。在數據分析過程中,對這些缺失數據有兩種處理方式,可以用評論數的均值來填補,也可以直接刪除缺失數據,針對相應情況選擇處理方式。
#讀取.csv文件數據data = pda.read_csv("D:/python/.../csvFile.csv")#發現缺失值,將評論數為0的值轉為Nonedata["comnum"][(data["comnum"]==0)]=None#均值填充處理#data.fillna(value=data["comnum"].mean(),inplace=True)#刪除處理,data1為缺失值處理后的數據data1=data.dropna(axis=0,subset=["comnum"])
缺失數據過多,這里采取刪除處理方式。
異常值處理
在做異常值處理時首先要找到異常值,先畫數據的散點圖觀察一下數據分布情況,這里用python的數據可視化庫Matplotlib作圖。
import matplotlib.pyplot as plt#畫散點圖(橫軸:價格,縱軸:評論數)#設置圖框大小fig = plt.figure(figsize=(10,6))plt.plot(data1['price'],data1['comnum'],"o")#展示x,y軸標簽plt.xlabel('price')plt.ylabel('comnum')plt.show()

價格-評論數散點圖
可以看到有部分數據評論數過高,或許為熱銷商品或者存在刷評論,還有一部分數據價格過高,甚至高達700,而一般書籍價格不會高過¥150。對於這些異常值我們在作數據分析時一般不會考慮,刪除或者改動這些異常值即可。再看看數據的箱型圖觀察分布情況:
fig = plt.figure(figsize=(10,6))#初始化兩個子圖,分布為一行兩列ax1 = fig.add_subplot(1,2,1)ax2 = fig.add_subplot(1,2,2)#繪制箱型圖ax1.boxplot(data1['price'].values)ax1.set_xlabel('price')ax2.boxplot(data1['comnum'].values)ax2.set_xlabel('comnum')#設置x,y軸取值范圍ax1.set_ylim(0,150)ax2.set_ylim(0,1000)plt.show()

箱型圖
價格的箱型圖中黃線表示中位數,大概為¥50,箱型圖上下分別為上四分位和下四分位,分別為¥40到¥70,上下界分別為¥110和¥0,最上方的圓點都是離群點。可以看到評論數中位數分布點較低。離群點的數值明顯偏離其余觀測值,會對分析結果產生不良影響,所以我們將價格¥120以上,評論數700以上的離群點刪除,不作考慮,代碼如下:
#刪除價格¥120以上,評論數700以上的數據data2=data[data['price']<120]data3=data2[data2['comnum']<700]#data3為異常值處理后的數據fig = plt.figure(figsize=(10,6))plt.plot(data3['price'],data3['comnum'],"o")plt.xlabel('price')plt.ylabel('comnum')plt.show()
處理后數據剩余約500個,新數據分布如下圖:

價格-評論數散點圖
數據可視化分析
直方圖可視化分析
最后可以對數據做可視化分析了,可以對價格及評論數做直方圖,分析數據分布情況。
#求最值pricemax=da2[1].max()pricemin=da2[1].min()commentmax=da2[2].max()commentmin=da2[2].min()##計算極差pricerg=pricemax-pricemincommentrg=commentmax-commentmin#組距=極差/組數pricedst=pricerg/13commentdst=commentrg/13fig = plt.figure(figsize=(12,5))ax1 = fig.add_subplot(1,2,1)ax2 = fig.add_subplot(1,2,2)#繪制價格直方圖#numpy.arrange(最小,最大,組距)pricesty=numpy.arange(pricemin,pricemax,pricedst)ax1.hist(da2[1],pricesty,rwidth=0.8)ax1.set_title('price')#繪制評論數直方圖commentsty=numpy.arange(commentmin,commentmax,commentdst)ax2.hist(da2[2],commentsty,rwidth=0.8)ax2.set_title('comnum')plt.show()

直方圖
從直方圖中可以觀察到:1、書的價格大致呈正態分布,¥40左右的書籍比較多,說明python書籍基本定價在¥40左右2、評論數在50條以下的書籍商品最多(200多本),隨着評論數遞增,商品數量逐漸減少,說明大部分商品銷量一般,銷量較好的書就是那幾本經典作品。
K-Means聚類可視化分析
最后對數據作聚類分析,這里采用了機器學習算法——K-Means聚類算法,K-Means聚類算法是機器學習中的一個無監督學習算法,簡單,快速,適合常規數據集,具體的算法執行步驟如下:1、初始化聚類中心2、計算樣本點到各個聚類中心的距離,選擇距離小的,進行聚類3、計算新的聚類中心,改變新的聚類中心4、重復2-3步,直到聚類中心不發生改變通過調用Python的機器學習庫sklearn,可利用此算法實現對商品的分類:
#轉換數據格式tmp=numpy.array([data3['price'],data3['comnum']]).T#調用python關於機器學習sklearn庫中的KMeansfrom sklearn.cluster import KMeans#設置分為3類,並訓練數據kms=KMeans(n_clusters=3)y=kms.fit_predict(tmp)#將分類結果以散點圖形式展示fig = plt.figure(figsize=(10,6))plt.xlabel('price')plt.ylabel('comnum')for i in range(0,len(y)): if(y[i]==0): plt.plot(tmp[i,0],tmp[i,1],"*r") elif(y[i]==1): plt.plot(tmp[i,0],tmp[i,1],"sy") elif(y[i]==2): plt.plot(tmp[i,0],tmp[i,1],"pb")plt.show()

聚類分布圖
從聚類結果中可以看到,K-Means聚類算法將評論數100以下的分為了一類,評論數大致從100到350的分為一類,評論數大致在350以上的分為了一類,基本按照書籍是否暢銷分成了三類,從圖中可明顯看出聚類效果。
總結
本文總結了拿到一份初始的爬蟲數據后,從數據提取成文件,到數據缺失值和異常值處理,再到商品的直方圖分布和K-Means聚類可視化分析的全部過程。以上過程就是利用python進行簡單的數據分析的大致過程,讀者在拿到一份數據后,也可參考本文代碼按照此過程自己進行數據分析,自己玩轉數據啦。
相關推薦:
| 標題 |
|---|
| 使用R語言隨機波動模型SV處理時間序列中的隨機波動率 (2020-04-15 14:49) |
| R語言用WinBUGS 軟件對學術能力測驗(SAT)建立分層模型 (2020-04-14 16:27) |
| R語言使用隨機技術差分進化算法優化的Nelson-Siegel-Svensson模型 (2020-04-12 18:52) |
| 已遷離北京外來人口的數據畫像 (2020-04-11 20:55) |
| R語言用神經網絡改進Nelson-Siegel模型擬合收益率曲線分析 (2020-04-10 15:51) |
| 用R語言用Nelson Siegel和線性插值模型對債券價格和收益率建模 (2020-04-06 11:16) |
| R語言LME4混合效應模型研究教師的受歡迎程度 (2020-03-27 15:18) |
| R語言Black Scholes和Cox-Ross-Rubinstein期權定價模型案例 (2020-03-25 14:36) |
| R語言中的Nelson-Siegel模型在匯率預測的應用 (2020-03-25 14:07) |
| R語言中的block Gibbs吉布斯采樣貝葉斯多元線性回歸 (2020-03-06 16:20) |
