數據正態化處理(sklearn))
Box-Cox變換是Box和Cox在1964年提出的一種廣義冪變換方法是統計建模中常用的一種數據變換用于連續的響應變量不滿足正態分布的情況。Box-Cox變換之后可以一定程度上減小不可觀測的誤差和預測變量的相關性。Box-Cox變換的主要特點是引入一個參數通過數據本身估計該參數進而確定應采取的數據變換形式Box-Cox變換可以明顯地改善數據的正態性、對稱性和方差相等性對許多實際數據都是行之有效的。但是當我們遇到雙峰性數據時使用box-cox方法進行處理處理出來的效果往往是不理想的因此我們需要換方法。通過數據處理發現sklearn.preprocessing.QuantileTransformer這個方法處理雙峰性數據的效果非常好因此我們接下來講講這種方法的具體使用以及對處理后的數據進行正態性檢驗以及查看峰度和偏度以及q-q圖。接下來我們先了解一下sklearn.preprocessing.QuantileTransformer這個方法。此方法將要素轉換為遵循均勻或正態分布。因此對于給定的特征此變換趨向于散布最頻繁的值。它還減少了邊際離群值的影響因此這是一個可靠的預處理方案。變換獨立應用于每個功能。首先特征的累積分布函數的估計值用于將原始值映射到均勻分布。然后使用關聯的分位數函數將獲得的值映射到所需的輸出分布。低于或高于擬合范圍的新數據/看不見數據的特征值將映射到輸出分布的邊界。請注意此變換是非線性的。它可能會扭曲以相同比例尺測量的變量之間的線性相關性但會使以不同比例尺測量的變量更直接可比。好了接下來我們進入實戰我們以 2022 SAS中國高校數據分析大賽 復賽題目-農產品期貨 數據為例子首先導入數據import pandas as pd import numpy as np from scipy import stats import matplotlib.pyplot as plt f pd.read_csv(rC:\Users\bai\Desktop\2022 SAS中國高校數據分析大賽 復賽題目-農產品期貨\2022 SAS中國高校數據分析大賽 復賽題目-農產品期貨\玉米期貨2005-2021日線數據\Corn_dat.csv) f.head() #查看數據導入畫圖庫查看原始數據的分布import seaborn as sns sns.set() #切換到sns的默認運行配置 sns.displot(f[High]) #畫直方圖畫q-q圖resstats.probplot(f[High],plotplt) #畫q-q圖參數檢驗p值偏度與峰度u f[High].mean() #求均值 std f[High].std() #求方差 result stats.kstest(f[High],norm,(u,std)) #正態分布檢驗 print(result) #輸出結果pvalue大于0.05才滿足正態分布print(fSkewness of saleprice: {f[High].skew()}) print(fKurtosis of saleprice: {f[High].kurt()})導入機器學習庫對數據進行處理from sklearn.preprocessing import QuantileTransformer #導入sklearn 分位數轉換器 將雙峰數據正態化 xQuantileTransformer(n_quantiles 300,output_distributionnormal, random_state0) #初始化參數 #f[High].values.reshape(-1,1) 由于在sklearn中所有的數據都應該是二維矩陣哪怕它只是單獨一行或一列 #比如前面做預測時僅僅只用了一個樣本數據所以需要使用.reshape(1,-1)進行轉換 high x.fit_transform(f[High].values.reshape(-1,1)) #調用分位數轉換器將數據進行轉換high.flatten() #將二維數據降維回來以便后面畫圖 f[high]high #將正態化的數據寫入表 f.head() #查看處理后的數據畫處理后的直方圖sns.displot(f[high]) #畫正態分布圖畫q-q圖resstats.probplot(f[high],plotplt) #畫q-q圖輸出檢驗參數u f[high].mean() #求均值 std f[high].std() #求方差 result stats.kstest(f[high],norm,(u,std)) #正態分布檢驗 print(result) #輸出結果pvalue大于0.05才滿足正態分布 print(fSkewness of saleprice: {f[High].skew()}) print(fKurtosis of saleprice: {f[High].kurt()})將原始數據還原回來方便數據分析fhigh x.inverse_transform(high) #將原始數據還原回來進行數據分析 print(fhigh)還原回來后和原數據相同。接下來就可以進行其他分析啦