Python代寫商品數據預處理與K-Means聚類可視化分析

數據提取

 

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

爬蟲爬取到的商品數據

接下來對爬取到的商品數據做預處理及可視化分析,使用工具爲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輸出結果以下:json

print(data)

而後將data存儲爲.csv文件vim

#要存儲.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文件app

固然能夠在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"])

缺失數據過多,這裏採起刪除處理方式。post

異常值處理

在作異常值處理時首先要找到異常值,先畫數據的散點圖觀察一下數據分佈狀況,這裏用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()

直方圖

從直方圖中能夠觀察到:一、書的價格大體呈正態分佈,¥40左右的書籍比較多,說明python書籍基本訂價在¥40左右二、評論數在50條如下的書籍商品最多(200多本),隨着評論數遞增,商品數量逐漸減小,說明大部分商品銷量通常,銷量較好的書就是那幾本經典做品。

K-Means聚類可視化分析

最後對數據做聚類分析,這裏採用了機器學習算法——K-Means聚類算法,K-Means聚類算法是機器學習中的一個無監督學習算法,簡單,快速,適合常規數據集,具體的算法執行步驟以下:一、初始化聚類中心二、計算樣本點到各個聚類中心的距離,選擇距離小的,進行聚類三、計算新的聚類中心,改變新的聚類中心四、重複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進行簡單的數據分析的大體過程,讀者在拿到一份數據後,也可參考本文代碼按照此過程本身進行數據分析,本身玩轉數據啦。

若是您有任何疑問,請在下面發表評論。 

 

大數據部落 -中國專業的第三方數據服務提供商,提供定製化的一站式數據挖掘和統計分析諮詢服務

統計分析和數據挖掘諮詢服務:y0.cn/teradat(諮詢服務請聯繫官網客服

點擊這裏給我發消息QQ:3025393450

 

​QQ交流羣:186388004 

【服務場景】  

科研項目; 公司項目外包;線上線下一對一培訓;數據爬蟲採集;學術研究;報告撰寫;市場調查。

【大數據部落】提供定製化的一站式數據挖掘和統計分析諮詢

歡迎選修咱們的R語言數據分析挖掘必知必會課程!

 

 
歡迎關注 微信公衆號,瞭解更多數據乾貨資訊!
 
相關文章
相關標籤/搜索