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()