分析遇到非正态数据该怎么办?
總第194篇/張俊紅
我們在前面講過數(shù)據(jù)的正態(tài)性檢驗:正態(tài)性檢驗,介紹了檢驗數(shù)據(jù)是否正態(tài)的兩種方法。這一節(jié)我們來看一下,如果數(shù)據(jù)不滿足正態(tài)時該怎么辦,答案就是將非正態(tài)數(shù)據(jù)通過Box-Cox變換進(jìn)一步轉(zhuǎn)換成符合正態(tài)分布的數(shù)據(jù)。這一篇就給大家分享下Box-Cox變換的具體內(nèi)容。
Box-Cox變換是多種變換的總稱,具體的公式如下:
上面公式中y(λ)表示變換后的值,根據(jù)λ的值不同,屬于不同的變換,當(dāng)λ值取以下特定的幾個值時就變成了特殊的數(shù)據(jù)變換:
當(dāng)λ=0時,Box-Cox變換就變成了對數(shù)變換,y(λ) = ln(y);
當(dāng)λ=0.5時,Box-Cox變換就變成了平方根變換,y(λ) = y^1/2
當(dāng)λ=1時,Box-Cox變換變換就是它本身,y(λ) = y
當(dāng)λ=2時,Box-Cox變換就變成了平方變化,y(λ) = y^2
當(dāng)λ=-1時,Box-Cox變換就變成了倒數(shù)變化,y(λ) = 1/y。
λ值除了可以選擇上述特定的值以外,還可以選擇其他值,那當(dāng)我們拿到一份非正態(tài)數(shù)據(jù)時,我們應(yīng)該取λ值等于多少對齊進(jìn)行變換呢?這個又該怎么定呢?
λ值取多少,我們可以利用Python中現(xiàn)成的函數(shù),讓函數(shù)自動去探索,然后返回給我們最優(yōu)的值是多少就可以。這個函數(shù)就是boxcox_normmax,這個函數(shù)用來計算給定的非正態(tài)數(shù)據(jù)對應(yīng)的最優(yōu)λ值。
boxcox_normmax(x[,?brack,?method])參數(shù):x:非正態(tài)數(shù)據(jù)brack:?λ值搜索間隔,默認(rèn)即可method:計算λ值的方法,有pearsonr、mle、all三種可選,默認(rèn)為pearsonr,即按照相關(guān)性的方法去計算,如果選all,則會返回各種方法的計算結(jié)果返回值:返回λ值當(dāng)我們得到最優(yōu)的λ值以后,就可以根據(jù)λ值進(jìn)行數(shù)據(jù)轉(zhuǎn)換了,這個時候可以用另外的一個函數(shù)boxcox,這個函數(shù)是根據(jù)指定的λ值對原始數(shù)據(jù)進(jìn)行轉(zhuǎn)換。
boxcox(x[,?lmbda,?alpha])參數(shù):x:非正態(tài)數(shù)據(jù)lambda:轉(zhuǎn)換的λ值alpha:計算置信區(qū)間時所用到的alpha值返回值:boxcox:經(jīng)過轉(zhuǎn)換以后的數(shù)據(jù)maxlog:如果在傳入時lambda參數(shù)值沒有指定的話,該函數(shù)也會計算一個λ值出來(min_ci, max_ci):如果lambda參數(shù)為空且alpha參數(shù)不為空時,會計算maxlog的一個置信區(qū)間出來我們上面講了計算λ值有不同的方法,那到底哪種方法計算出來的λ值更加可靠一些呢?我們可以通過另外一個函數(shù)boxcox_normplot來查看到底哪種方法計算出來的λ值更可靠。
boxcox_normplot(x,?la,?lb,?plot=None,?N=80)參數(shù):x:非正態(tài)數(shù)據(jù)la,lb:λ值的上下界plot:繪圖的畫布N:橫軸的坐標(biāo)點(diǎn)個數(shù)返回值:lmbdas:通過box-cox算出來的多個λ值ppcc:相關(guān)系數(shù),可以理解成λ值的可靠程度以上就是box-cox變換過程中用到的三個不同的函數(shù),接下來我們給大家實際演示一下這三個函數(shù)如何使用。
首先,我們導(dǎo)入一份非正態(tài)數(shù)據(jù),并繪制這份數(shù)據(jù)的概率密度圖,需要這份數(shù)據(jù)的在公眾號后臺回復(fù)非正態(tài)數(shù)據(jù),即可獲得。
import?pandas?as?pd import?numpy?as?np import?seaborn?as?sns df?=?pd.read_excel(r"非正態(tài)數(shù)據(jù)集.xlsx") sns.distplot(df["price"],color?=?"#D86457")通過上面的概率密度圖,我們可以看出這是一份偏態(tài)數(shù)據(jù),也就是非正態(tài)。接下來我們先利用boxcox_normmax函數(shù)來尋找最優(yōu)λ值,代碼如下:
在獲得最優(yōu)λ值以后,我們再利用boxcox函數(shù)來進(jìn)行數(shù)據(jù)轉(zhuǎn)換,具體代碼如下:
x?=?stats.boxcox(df["price"],stats.boxcox_normmax(df["price"])) sns.distplot(x,color?=?"#D86457")對轉(zhuǎn)換后的數(shù)據(jù)再次進(jìn)行概率密度圖的繪制,我們可以看到,數(shù)據(jù)就很正態(tài)了。
接下來再來我們再看一下我們計算出來的λ值是不是最優(yōu)的,具體代碼如下:
fig?=?plt.figure() ax?=?fig.add_subplot(111) stats.boxcox_normplot(df["price"],?-20,?20,plot?=?ax) plt.axvline(x?=?stats.boxcox_normmax(df["price"]),color?=?"#D86457") plt.show()中間紅色那條線的位置就是我們求出來最優(yōu)的λ值,結(jié)果很吻合。
以上就是關(guān)于Box-Cox變換的理論和實戰(zhàn)內(nèi)容,大家多多練習(xí)。
總結(jié)
以上是生活随笔為你收集整理的分析遇到非正态数据该怎么办?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 英雄td值得培养的英雄
- 下一篇: 快手个人主页在哪里(快手创作者服务平台)