1. 程式人生 > >Python商品資料預處理與K-Means聚類視覺化分析

Python商品資料預處理與K-Means聚類視覺化分析

資料提取

在我之前的文章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聚類視覺化分析的全部過程。 

大資料部落——中國專業的第三方資料服務提供商,提供定製化的一站式資料探勘和統計分析諮詢服務

統計分析和資料探勘諮詢服務 :y0.cn/teradat(諮詢服務請聯絡官網客服

點選這裡給我發訊息QQ:3025393450

【服務場景】  

科研專案; 

公司專案外包 ;線上線下一對一培訓 ;資料採集;學術研究;報告撰寫;市場調查。

【大資料部落】提供定製化的一站式資料探勘和統計分析諮詢服務

【大資料部落】大資料部落提供定製化的一站式資料探勘和統計分析諮詢服務

分享最新的大資料資訊,每天學習一點資料分析,讓我們一起做有態度的資料人【大資料部落】大資料部落提供定製化的一站式資料探勘和統計分析諮詢服務

微信客服號:lico_9e

QQ交流群:186388004 大資料部落

【大資料部落】r語言電商網站爬蟲

歡迎關注微信公眾號,瞭解更多資料乾貨資訊!

【大資料部落】大資料部落提供定製化的一站式資料探勘和統計分析諮詢服務