數(shù)據(jù)分析實(shí)戰(zhàn)二——清洗數(shù)據(jù)

今日食餐

  • ployinterp_column-->拉格朗日填充數(shù)值
  • programmer_1-->篩選異常數(shù)據(jù)(包括NaN)進(jìn)行填充
  • programmer_2-->最小-最大規(guī)范化、零-均值規(guī)范化吉嚣、小數(shù)定標(biāo)規(guī)范化
  • programmer_3-->利用PCA計(jì)算特征向量,用于降維分析
import os 
import numpy as np
import pandas as pd
from pandas import DataFrame, Series
import matplotlib.pyplot as plt

import pywt
from scipy.interpolate import lagrange
from scipy.io import loadmat  # mat是MATLAB的專用格式蒋院,調(diào)用loadmat方法讀取
from sklearn.cluster import KMeans
from sklearn.decomposition import PCA

1 lagrange填充空值

可視化的理解
公式推導(dǎo)

path = os.getcwd()
inputfile = path + '/chapter4/data/catering_sale.xls'
outputfile = path + '/tmp/tmp4/sales.xls'

data = pd.read_excel(inputfile)
data.head()
360截圖18430704113413.png
data[(data['銷量'] < 400) | (data['銷量'] > 5000)] = None

def ployinterp_column(index, df, k=5):
    y = df[list(range(index - k, index))
            + list(range(index + 1, index + 1 + k))]
    y = y[y.notnull()]
    #取空值數(shù)據(jù)周圍12個非空數(shù)據(jù)為已知數(shù)樣本
    
    return lagrange(y.index, list(y))(index)

y.index:已有數(shù)據(jù)的x。list(y):已有數(shù)據(jù)的y乾忱。 index:要插入的x 的值娱挨。

df = data[data['銷量'].isnull()] #銷量為空值的數(shù)據(jù)

index_list = df['銷量'].index #銷量為空值的數(shù)據(jù)的索引

for index in index_list:
    data.loc[index,'銷量']= ployinterp_column(index, data['銷量'])

data.to_excel(outputfile)

2規(guī)范化處理

(1)不同規(guī)范化處理方法的選擇

  • 在分類、聚類算法中洋侨,需要使用距離來度量相似性的時候、或者使用PCA技術(shù)進(jìn)行降維的時候倦蚪,StandardScaler表現(xiàn)更好(避免不同量綱對方差希坚、協(xié)方差計(jì)算的影響);
  • 在不涉及距離度量陵且、協(xié)方差裁僧、數(shù)據(jù)不符合正態(tài)分布、異常值較少的時候慕购,可使用MinMaxScaler聊疲。(eg:圖像處理中,將RGB圖像轉(zhuǎn)換為灰度圖像后將其值限定在 [0, 255] 的范圍)沪悲;
  • 在帶有的離群值較多的數(shù)據(jù)時获洲,推薦使用RobustScaler。

(2)preprocessing.scale 與 preprocessing.StandardScaler

使用sklearn.preprocessing.StandardScaler類殿如,使之fit(X_Train)

datafile = path + '/chapter4/data/normalization_data.xls'
data = pd.read_excel(datafile, header=None)
#指定作為列名的行贡珊,默認(rèn)0最爬,即取第一行,數(shù)據(jù)為列名行以下的數(shù)據(jù)飞崖;
#若數(shù)據(jù)不含列名,則設(shè)定 header = None谨胞;
data.head()
360截圖18430702597672.png
print('最大最小規(guī)范化')
print((data - data.min()) / (data.max() - data.min()))

print('零均值規(guī)范化')
print((data - data.mean()) / data.std()) #按列標(biāo)準(zhǔn)化

print('單列')
print((data.iloc[:,0] - data.iloc[:,0].mean()) / data.iloc[:,0].std())
360截圖1624122095136134.png
from  sklearn import preprocessing
print('\n  sklearn-preprocessing.scale')
data_scale=preprocessing.scale(data)
#在SciKit-Learn中的preprocessing.scale()可以直接將給定數(shù)據(jù)進(jìn)行Z-Score規(guī)范化固歪。按列標(biāo)注化
print(data_scale,'\n')
print(data_scale.mean(axis=0))
print(data_scale.std(axis=0))#默認(rèn)按行計(jì)算
360截圖18500828194268.png
print('\n小數(shù)定標(biāo)規(guī)范化')
#np.ceil返回大于等于該值的最小整數(shù),np.log10計(jì)算最高位是幾位數(shù)胯努,log10(100)=2
#通過移動小數(shù)點(diǎn)的位置來進(jìn)行規(guī)范化牢裳。小數(shù)點(diǎn)移動的位數(shù)取決于該屬性數(shù)據(jù)取值的最大絕對值。
print(data / 10**np.ceil(np.log10(data.abs().max())))
360截圖18430710251424.png

3 聚類

datafile = path + '/chapter4/data/discretization_data.xls'
data = pd.read_excel(datafile)
data.head()
360截圖17001019102137115.png
data = data['肝氣郁結(jié)證型系數(shù)'].copy()
k = 4
方法一 直接對數(shù)組進(jìn)行分類--分箱等距
d1 = pd.cut(data, k, labels=range(k))
方法二: 等頻率離散化
w = [1.0 * i / k for i in range(k + 1)]
# percentiles表示特定百分位數(shù)叶沛,同四分位數(shù)
w = data.describe(percentiles=w)[4:4 + k + 1]
#取幾個分位數(shù)的值作為不等長列表蒲讯,用于cut函數(shù)
w[0] = w[0] * (1 - 1e-10)
d2 = pd.cut(data, w, labels=range(k))
方法三: 使用Kmeans
kmodel = KMeans(n_clusters=k, n_jobs=4)
kmodel.fit(data.values.reshape(len(data), 1))

# 輸出聚類中心,并且排序
c = DataFrame(kmodel.cluster_centers_).sort_values(0)

# 相鄰兩項(xiàng)求中點(diǎn)灰署,作為邊界點(diǎn)
w = DataFrame.rolling(c, 2).mean().iloc[1:]
# 加上首末邊界點(diǎn)
w = [0] + list(w[0]) + [data.max()]
d3 = pd.cut(data, w, labels=range(k))
def cluster_plot(d, k):
    plt.figure(figsize=(8, 3))
    for j in range(0, k):
        plt.plot(data[d == j], [j for i in d[d == j]], '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()

print('d1等距\n',d1[:5])
print('d2百分位\n',d2[:5])
print('d3聚類\n',d3[:5])
360截圖17970217292761.png

4利用PCA計(jì)算特征向量判帮,用于降維分析

PCA(Principal Component Analysis,主成分分析)溉箕。降維致力于解決三類問題晦墙。

  • 降維可以緩解維度災(zāi)難問題;
  • 降維可以在壓縮數(shù)據(jù)的同時讓信息損失最小化肴茄;
  • 理解幾百個維度的數(shù)據(jù)結(jié)構(gòu)很困難晌畅,兩三個維度的數(shù)據(jù)通過可視化更容易理解。

當(dāng)數(shù)據(jù)集不同維度上的方差分布不均勻的時候寡痰,PCA最有用抗楔。如果是一個球殼形數(shù)據(jù)集,PCA不能有效的發(fā)揮作用拦坠,因?yàn)楦鱾€方向上的方差都相等连躏;沒有丟失大量的信息維度一個都不能忽略。

inputfile = path + "/chapter4/data/principal_component.xls"
outputfile = "tmp/tmp4/dimention_reducted.xls"

data = pd.read_excel(inputfile, header=None)
data.head()
360截圖18430702749187.png
pca = PCA()
data_pca=pca.fit(data)

#禁用科學(xué)計(jì)數(shù)法
np.set_printoptions(suppress=True,   precision=10,  threshold=2000,  linewidth=150)  
pd.set_option('display.float_format',lambda x : '%.2f' % x)

# 返回各個模型的特征向量
pca.components_
# 返回各個成分各自的方差百分比
pca.explained_variance_ratio_

data.to_excel(outputfile, index=False)

遺留問題:pca之后是不是就該怎么建模怎么建模了贞滨,它只是減少了輸入維度反粥?(請路過的高人指教~)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市疲迂,隨后出現(xiàn)的幾起案子才顿,更是在濱河造成了極大的恐慌,老刑警劉巖尤蒿,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件郑气,死亡現(xiàn)場離奇詭異,居然都是意外死亡腰池,警方通過查閱死者的電腦和手機(jī)尾组,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門忙芒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人讳侨,你說我怎么就攤上這事呵萨。” “怎么了跨跨?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵潮峦,是天一觀的道長。 經(jīng)常有香客問我勇婴,道長忱嘹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任耕渴,我火速辦了婚禮拘悦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘橱脸。我一直安慰自己础米,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布添诉。 她就那樣靜靜地躺著椭盏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吻商。 梳的紋絲不亂的頭發(fā)上掏颊,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天,我揣著相機(jī)與錄音艾帐,去河邊找鬼乌叶。 笑死,一個胖子當(dāng)著我的面吹牛柒爸,可吹牛的內(nèi)容都是我干的准浴。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼捎稚,長吁一口氣:“原來是場噩夢啊……” “哼乐横!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起今野,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤葡公,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后条霜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體催什,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年宰睡,在試婚紗的時候發(fā)現(xiàn)自己被綠了蒲凶。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片气筋。...
    茶點(diǎn)故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖旋圆,靈堂內(nèi)的尸體忽然破棺而出宠默,到底是詐尸還是另有隱情,我是刑警寧澤灵巧,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布搀矫,位于F島的核電站,受9級特大地震影響孩等,放射性物質(zhì)發(fā)生泄漏艾君。R本人自食惡果不足惜采够,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一肄方、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蹬癌,春花似錦权她、人聲如沸咸这。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽研底。三九已至董济,卻和暖如春步清,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背虏肾。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工廓啊, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人封豪。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓谴轮,卻偏偏與公主長得像,于是被迫代替她去往敵國和親吹埠。 傳聞我的和親對象是個殘疾皇子第步,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評論 2 360