數據分析(5)-數據清洗

數據清洗:

1缺失值處理

此處缺失值處理主要有-均值\中位數\衆數插補、使用固定值、最近臨插補、迴歸方法、插值法

下面主要介紹“拉格朗日插值法“與“牛頓插值法”

(1)拉格朗日插值法

根據數學知識可知,對於平面上已知的n個點可以找到一個n-1次多項式,滿足n各點的代入,解出拉格朗日插值多項式,代入缺失值處的x,求出缺失值的Y值

(2)牛頓插值法

方式雷同

用拉格朗日法進行補值:

import pandas as pd 
from scipy.interpolate import lagrange#拉格朗日插值函數

inputfile='./data/catering_sale.xls'
outputfile='./tmp/sales.xls'

data=pd.read_excel(inputfile)
data[u'銷量'][(data[u'銷量']<400)&(data[u'銷量']>5000)]=None#去除異常值

def ployinterp_column(s,n,k=5):#定義列插值函數
    y = s[list(range(n-k,n))+list(range(n+1,n+k+1))]
    y=y[y.notnull()]#去除沒有值的項
    return lagrange(y.index,list(y))(n)#獲取近似值

for i in data.columns:#遍歷每個元素,對控制進行插值
    for j in range(len(data)):
        if (data[i].isnull())[j]:#isnull()返回與data相同shape的數組,只不過元素全是布爾型
            data[i][j]=ployinterp_column(data[i],j)
            
data.to_excel(outputfile)
2異常值處理

異常值處理的辦法:刪除含有異常值的記錄、視爲缺失值、平均值修正、不處理

數據集成:

1實物識別

同名(屬性)異義、異名同義、單位不統一

2冗餘屬性識別

可以通過該屬性值的相關性分析來進行篩選

數據變換:

數據變換則爲平方、開方、取對數、差分運算符,使得數據從非平穩序列至平穩序列發展

1規範化

(1)最小-最大規範化

表現爲如上公式


(2)0-均值規範化

使得數據均值爲0,標準差爲1

公式如下:


(3)小數定標規範化

通過移動屬性值的小數點,將屬性值範圍映射到[-1,1],移動小數位數取決於屬性絕對值的最大值

公式如下:


2連續數據離散化

主要方法爲:

-等寬法:將屬性的值域分成具有相同寬度的區間,區間的個數由數據的本身特點而定

-等頻法:將相同數量的記錄放入每個區間

-聚類

數據離散化:

import pandas as pd
datafile = './data/discretization_data.xls' #參數初始化
data = pd.read_excel(datafile) #讀取數據
data = data[u'肝氣鬱結證型係數'].copy()
k = 4

d1=pd.cut(data,k,labels=range(k))#等寬離散化

w2=[1.0*i/k for i in range(k+1)]
w2=data.describe(percentiles=w2)[4:4+k+1]#按照w2所給百分比參數,求得分位數
w2[0]=w2[0]*(1-1e-10)
d2=pd.cut(data,w2,labels=range(k))

from sklearn.cluster import KMeans #引入KMeans
kmodel=KMeans(n_clusters=k,n_jobs=1)#建模
kmodel.fit(data.values.reshape(len(data),1))#reshape提前給數據定型
c=pd.DataFrame(kmodel.cluster_centers_).sort_values(0)
w3=c.rolling(window=2,center=False).mean().iloc[1:]#相鄰兩項求和,最爲邊界點
w3=[0]+list(w3[0])+[data.max()]
d3=pd.cut(data,w3,labels=range(k))#分k類,w3則需包含k+1位元素

def cluster_plot(d, k): #自定義作圖函數來顯示聚類結果
  import matplotlib.pyplot as plt
  plt.rcParams['font.sans-serif'] = ['SimHei'] #用來正常顯示中文標籤
  plt.rcParams['axes.unicode_minus'] = False #用來正常顯示負號
  
  plt.figure(figsize=(8,3))
  for i in range(0,k):
      plt.plot(data[d==i],[i for j in d[d==i]],'o')
  plt.ylim(-0.5, k-0.5)
  return plt
cluster_plot(d1,k).show()
cluster_plot(d2,k).show()
cluster_plot(d3,k).show()
3屬性構造

定義:爲將已有屬性集構造出新的屬性,並加入到屬性集合當中

4小波變換

目的爲尋找影響問題的潛在屬性值!

小波變化特徵提取:

inputfile='./data/leleccum.mat' #提取自Matlab的信號文件
from scipy.io import loadmat #mat是MATLAB專用格式,需要用loadmat讀取它
mat=loadmat(inputfile)
signal=mat['leleccum'][0]

import pywt #導入PyWavelets
coeffs = pywt.wavedec(signal, 'bior3.7', level = 5)
#返回結果爲level+1個數字,第一個數組爲逼近係數數組,後面的依次是細節係數數組
數據違約:

1屬性違約

屬性違約通過屬性合併來創建新屬性維數

主成分分析的函數如下:

sklearn.decomposition.PCA(n_components=None,copy=None,whiten=False)

#n_components爲變換後主成分個數;copy爲布爾型,True則原數據不會改變;whiten爲True,則使得特徵具有相同方差

主成分分析降維:

import pandas as pd
inputfile='./data/principal_component.xls'
outfile='./data/dimention_reducted.xls'

data=pd.read_excel(inputfile,header=None)

from sklearn.decomposition import PCA

pca=PCA()
pca.fit(data)
pca.components_#返回模型的特徵向量
pca.explained_variance_ratio_#返回各個成分的貢獻值
2數值規約
數值規約分爲有參數與無參數,有參數則主要通過線性迴歸等來評價模型,最終只儲存參數,而無參數則通過直方圖、聚類或抽樣
(1)直方圖
通過將橫座標的範圍值變大,使得圖表表現的稀疏
(2)聚類
(3)抽樣
s個樣本無放回簡單隨機抽樣、s個樣本有放回簡單隨機抽樣、聚類抽樣、分類抽樣
(4)參數迴歸
簡單線性模型與對數線性模型

python主要數據預處理函數:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章