1. 程式人生 > >Python資料分析與挖掘學習筆記(4)淘寶商品資料探索與清洗實戰

Python資料分析與挖掘學習筆記(4)淘寶商品資料探索與清洗實戰

一、相關理論:

資料探索的核心:

(1)資料質量分析(跟資料清洗密切聯絡)

(2)資料特徵分析(分佈、對比、週期性、相關性、常見統計量等)

資料清洗的步驟:

(1)缺失值處理(通過describe與len直接發現、通過0資料發現)

(2)異常值處理(通過散點圖發現)

一般遇到缺失值,處理方式為:刪除、插補、不處理

    插補的方式主要有:均值插補、中位數插補、眾數插補、固定值插補、最近資料插補、迴歸插補、插值法等等。

一般遇到異常值,一般處理方式為:視為缺失值、刪除、修補(平均數、中位數等等)

二、資料準備:        

        本例使用的是某時間的淘寶商品資料,儲存在MySQL資料庫中(資料分享:連結:https://pan.baidu.com/s/1SsSy-mxvCStxk4e2PYxB3A  提取碼:tquy,將該檔案從MySQL開啟執行即可),資料庫結構如下:

三、資料探索與清洗實戰:

1、連線MySQL資料庫並檢視資料表基本情況:

import pymysql
import numpy as npy
import pandas as pda
import matplotlib.pylab as pyl

conn=pymysql.connect(host="127.0.0.1",user="root",passwd="******",db="sys")
sql="select * from taob"
data=pda.read_sql(sql,conn)
#檢視資料的基本情況
print(data.describe())

結果:

可以大致瞭解數值欄位的統計情況,如個數、平均值、標準差、分位數、最大最小值等等。

2、缺失或0資料處理:通過檢視最小值,可發現有0資料,這可能是由於多種原因導致的,因此需要處理價格為0的資料,程式碼:

#將0資料處理為中位數
x=0
#需要注意下面這種特殊的程式碼結構,可以使程式碼更加簡潔
data["price"][(data["price"]==0)]=None
for i in data.columns:
    for j in range(len(data)):
        if(data[i].isnull())[j]:
            data[i][j]="36"
            x+=1
print("共處理"+str(x)+"個數據")

       此處還可以將其處理為平均數,另外可以通過len(data)與data.describe中的count進行對比來發現缺失資料,本例沒有因此不進行講解。

3、異常值處理:主要通過畫散點圖(橫軸為價格,縱軸為評論數)來進行實現,因為價格與評論是具有相關性的,可以直觀的看出資料是否正常:(執行時出現warning可以忽略)

#得到價格
data2=data.T
price=data2.values[2]
#得到評論資料
comt=data2.values[3]
#做圖找異常
pyl.plot(price,comt,'o')
pyl.show()

        可以看到,評論數異常>20000,價格異常>2300(這一判斷受主觀影響),因此需要進行資料清洗,將異常的資料進行插補處理:

#評論數異常>20000,價格異常>2300
#獲取資料行數
line=len(data.values)
#獲取資料列數
col=len(data.values[0])
#獲取資料
da=data.values
#遍歷行
for i in range(0,line):
    #遍歷行的列資料
    for j in range(0,col):
        #價格異常
        if(da[i][2]>2300):
            print(da[i][j])#輸出原資料看看是否出現了問題
            da[i][j]=36
        #評論異常
        if(da[i][3]>200000):
            print(da[i][j])
            da[i][j]=58

#重新進行資料視覺化
da2=da.T
price=da2[2]
comt=da2[3]
pyl.plot(price,comt,'o')
pyl.show()

注:賦值可能會導致資料直方圖視覺化結果不符合正態分佈。

結果:

4、資料分佈分析(繪製直方圖):

#價格最大最小值
pricemax=da2[2].max()
pricemin=da2[2].min()
#評論數最大最小值
commentmax=da2[3].max()
commentmin=da2[3].min()
#極差:最大值-最小值
pricerg=pricemax-pricemin
commentrg=commentmax-commentmin
#組距:極差/組數
pricedst=pricerg/12
commentdst=commentrg/12
#畫價格的直方圖
pricesty=npy.arange(pricemin,pricemax,pricedst)
pyl.hist(da2[2],pricesty)
pyl.show()
#畫評論的直方圖
commentsty=npy.arange(commentmin,commentmax,commentdst)
pyl.hist(da2[3],commentsty)
pyl.show()

感謝韋瑋老師的指導