1. 程式人生 > >python資料分析與挖掘之資料清洗

python資料分析與挖掘之資料清洗

        資料探索的目的是及早發現數據的一些簡單規律或特徵,資料清洗的目的是留下可靠的資料,避免髒資料的干擾。

這兩者沒有嚴格的先後順序,經常在一個階段進行。

        資料清洗我們要達到的目的是修復資料到正常的數值。

        簡單講一下資料探索的核心,其實包括兩點:

        1.資料質量分析(跟資料清洗密切聯絡)。這一點其實很重要,因為我們要處理異常資料和缺失資料,這就是俗稱的髒資料。

        2.資料特徵分析。這就需要我們用到統計學上的知識對資料進行分析,我舉一下常見的分析方法有:分佈,對比,週期性,相關性, 常見統計量等。

        講到核心的第二點,我覺得有必要解釋下幾種常見的分析方法:

        分佈:我們通過發現數據的分佈規律,明白資料大致的走勢和分析。

        對比:比較資料在同一個圖中的情況。

        相關性:兩組或者多組資料在同一橫軸和縱軸的關係。

        常見的統計量:因為我們可以通過describe知道資料大致情況,比如中位數、平均數等。

        通過以上幾種常見的分析方法,當你拿到資料的時候,千萬不要急,你可以套著以上幾種分析方法,萬變不離其宗,總有一個是適合的。

        好啦,前面只是一個鋪墊,真正的菜來啦!!!

        重點還是資料清洗,資料清洗這裡面還是有挺多技巧噠。一般資料清洗無非就是有兩種情況:

        1.缺失值得處理。我們可以通過describe與len直接發現,還有就是通過0資料發現。

        2.異常值處理。通過散點圖發現,如果那些數值偏離得太大,這個資料很大可能就是異常值,你要處理一下。

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

        我簡單講下插補的方式吧,這點很重要,不然你很難去處理資料。插補的方式主要有,均值插補,中位數插補,眾數插補,固定值插補,最近資料插補,迴歸插補,拉格朗日插值,牛頓插值法,分段插值等等。

        對,還有一種情況,遇到異常值,處理方式為視為缺失值,刪除,修補(平均數 中位數等等) ,不處理。

        一下子說了這麼多太苦澀了,我通過爬取某電商商品價格和評論,具體講解下操作。     

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="root",db="shop",charset="utf8")
sql = "select * from product"
data =pda.read_sql(sql,conn)
print(data.describe())  #以通過describe與len直接發現
print(len(data))  #上下兩個對比發現缺失資料 10200

        通過打印出來,知道資料的情況,我分析一遍。

            price        comment
count  10200.00000    10200.000000
mean     64.49324     562.239601   平均數
std     176.10901    6078.909643   標準差
min       0.00000       0.000000   價格為0不可能,所以你要處理
25%      20.00000      16.000000
50%      36.00000      58.000000   中位數
75%      66.00000     205.000000
max    8910.00000  650210.000000   也要處理一下,評論數太大,就知道異常得太厲害

10200  #len(data)發現大小與describe中資料量大小一樣,所以此時我們就不能通過describe和len來發現異常缺失值,現在能做的是通過0

        所以採用的是用0來對比資料,因為價格不可能為0的,我可以通過這個入手。

#把價格為0的變為空值--->迴圈處理,發現空值就補充為中位數(異常值的影響小一點)或者平均數,拉格朗差值,牛頓
data["price"][(data["price"]==0)] = None   #發現價格為空值的,你就進行處理
#將所有價格為0處理成空值
x=0
for i in data.columns:
    for j in range(len(data)):
        if (data[i].isnull())[j]:
            data[i][j]="36"      #這裡直接給了中位數36,在describe中得到
            x+=1   #處理一次加1

print(x)

        以上這些就是處理缺失值,接下第二步,我們要處理異常值。我們可以通過散點圖,最快發現異常的值,因為它肯定是偏離正常範圍最厲害的。

#異常值處理
#畫散點圖 (橫軸為價格,縱軸為評論數)
#首先先得到價格
data2 = data.T
price = data2.values[2]
#得到評論資料
comt = data2.values[3]
pyl.plot(price,comt,'o')
pyl.show()
#先看圖確定異常點,然後用程式確定這個數,迴圈處理
#異常值處理
#評論數異常>200000,價格異常>2300
#首先得到所有行數和列數
line = len(data.values)
col = len(data.values[0])
print(line)
print(col)
da = data.values #所有資訊的新陣列
print(da)
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  #58為中位數

        通過以上的異常值處理後,我們可以再列印一下散點圖,看看處理情況。

#異常處理後的影象
da2 = da.T
price = da2[2]
comt = da2[3]
pyl.plot(price,comt,'o')
pyl.show()

        以上這些,就是大致的資料清理的做法以及實現方式。

        不過,我還是要補充一點,這是我們要記住的,嚴重偏離的資料,我們一般會幹掉,但是如果你獲取的資料量很小,我就不建議你把它幹掉,因為一旦幹掉,你的樣本資料將變少,不值得。切記,千萬不要以犧牲資料量為代價來換取可靠資料,顯然不可取,你要根據實際情況而定。