正態(tài)性是許多統(tǒng)計方法和機器學習模型的關鍵假設。當數(shù)據(jù)不滿足正態(tài)分布的時,可能會導致模型估計不準確(如線性回歸,都假設數(shù)據(jù)是正態(tài)分布的。如果這一假設被違反,那么參數(shù)估計可能會有偏),預測誤差增加,甚至導致某些統(tǒng)計檢驗的結論失效。為了解決這個問題,研究人員和統(tǒng)計學家們引入了多種數(shù)據(jù)轉換技術,其中最著名的之一就是 Box-Cox 轉換。
數(shù)據(jù)的正態(tài)性對于許多統(tǒng)計方法至關重要。例如,在假設檢驗、回歸分析、ANOVA 和很多其他方法中,數(shù)據(jù)的正態(tài)分布是關鍵假設之一。數(shù)據(jù)的非正態(tài)性可能會導致估計的偏誤、增加類型I和類型II錯誤的風險,以及降低模型的預測精度。因此,為了滿足正態(tài)性假設,研究者們經(jīng)常需要對數(shù)據(jù)進行某種形式的轉換。
Box-Cox 轉換是這樣的一種方法,它的目的是使偏斜的數(shù)據(jù)更接近正態(tài)分布。這種轉換方法是 George Box 和 David Cox 于 1964 年首次提出的,現(xiàn)已成為統(tǒng)計領域中的標準技術。
Box-Cox 轉換的數(shù)學模型定義如下:
其中, 是要被轉換的數(shù)據(jù),而 是轉換參數(shù)。選擇最佳的 值通常是通過最大化數(shù)據(jù)的對數(shù)似然來實現(xiàn)的。
為什么Box-Cox 能夠使數(shù)據(jù)正態(tài)?
Box-Cox 轉換的工作原理有幾個方面:
考慮一個例子,其中我們有一個數(shù)據(jù)集,該數(shù)據(jù)集記錄了不同城市的人口和相關的犯罪率。犯罪率的數(shù)據(jù)可能會受到極端值的影響,并且可能不是正態(tài)分布的。在這種情況下,我們可以使用 Box-Cox 轉換來矯正犯罪率的分布。
來看這份虛擬的數(shù)據(jù)。假設我們有一個包含20個城市的數(shù)據(jù)集。每個城市都有其人口數(shù)量和年犯罪率(表示為每10,000人中發(fā)生的犯罪事件數(shù))。
城市1 | 城市2 | 城市3 | 城市4 | 城市5 | 城市6 | 城市7 | 城市8 | 城市9 | 城市10 | 城市11 | 城市12 | 城市13 | 城市14 | 城市15 | 城市16 | 城市17 | 城市18 | 城市19 | 城市20 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
23 | 151 | 66 | 46 | 8 | 8 | 3 | 101 | 46 | 62 | 1 | 175 | 89 | 12 | 10 | 10 | 18 | 37 | 28 | 17 |
先直觀的看一下數(shù)據(jù)的頻率分布:
import matplotlib.pyplot as plt
import seaborn as sns
from scipy.stats import shapiro
# 數(shù)據(jù)
crime_rates = [23, 151, 66, 46, 8, 8, 3, 101, 46, 62, 1, 175, 89, 12, 10, 10, 18, 37, 28, 17]
# 繪制頻率分布直方圖和概率密度曲線
plt.figure(figsize=(10,6))
sns.histplot(crime_rates, kde=True, bins=10)
plt.title('Frequency Distribution of Crime Rates')
plt.xlabel('Crime Rate (per 10,000)')
plt.ylabel('Frequency')
plt.grid(True, which='both', linestyle='--', linewidth=0.5)
plt.show()
從上圖中,我們可以清晰地觀察到犯罪率數(shù)據(jù)的分布。這些數(shù)據(jù)似乎并不完全遵循正態(tài)分布。
我們可以使用統(tǒng)計方法(如 Shapiro-Wilk 測試)來檢驗數(shù)據(jù)的正態(tài)性。
# Shapiro-Wilk 測試
shapiro_test = shapiro(crime_rates)
shapiro_test
測試統(tǒng)計量 (W值) = 0.8087,p值 = 0.0012,由于p值(0.0012)小于0.05,我們拒絕原假設,即數(shù)據(jù)是正態(tài)分布的。因此,我們可以確定這些犯罪率數(shù)據(jù)并不是正態(tài)分布的。
此時我們可以應用 Box-Cox 轉換并選擇最佳的 λ 值來最大化對數(shù)似然。
from scipy.stats import boxcox
# 應用Box-Cox轉換
transformed_data, best_lambda = boxcox(crime_rates)
best_lambda, transformed_data
通過Box-Cox轉換,我們得到了最佳的 λ 值為 0.1701。這意味著當 λ 取此值時,轉換后的數(shù)據(jù)最大化了對數(shù)似然,從而更接近正態(tài)分布。
下面,我們將重新繪制轉換后的數(shù)據(jù)的頻率分布直方圖和概率密度曲線,并再次進行Shapiro-Wilk 測試,以確認數(shù)據(jù)的正態(tài)性。
# 繪制轉換后的數(shù)據(jù)的直方圖和概率密度曲線
sns.histplot(transformed_data, kde=True, bins=8)
plt.title('Transformed Crime Rates Distribution')
plt.xlabel('Transformed Crime Rates')
plt.ylabel('Frequency')
plt.show()
# 再次進行Shapiro-Wilk 測試
shapiro_transformed = shapiro(transformed_data)
shapiro_transformed
從上圖可以看出,經(jīng)過Box-Cox轉換后的犯罪率數(shù)據(jù)更接近正態(tài)分布。此外,新的Shapiro-Wilk測試結果顯示統(tǒng)計量為0.9826,p值為0.9628。由于此p值大于0.05,我們無法拒絕數(shù)據(jù)是正態(tài)分布的原假設。
這意味著經(jīng)過Box-Cox轉換后的數(shù)據(jù)滿足正態(tài)性假設。因此,我們可以放心地使用需要正態(tài)分布假設的統(tǒng)計方法進行進一步分析。
完美!
Box-Cox 轉換是統(tǒng)計和數(shù)據(jù)分析中的一個強大工具,它可以幫助我們矯正數(shù)據(jù)的非正態(tài)性。通過理解其背后的原理和知道如何在實際問題中應用它,我們可以更好地利用統(tǒng)計方法,從而得到更準確和有洞察力的結果。