查看原文
其他

数据不够正态,Box-Cox 来转换

王海华 模型视角 2023-09-11

正态性是许多统计方法和机器学习模型的关键假设。当数据不满足正态分布的时,可能会导致模型估计不准确(如线性回归,都假设数据是正态分布的。如果这一假设被违反,那么参数估计可能会有偏),预测误差增加,甚至导致某些统计检验的结论失效。为了解决这个问题,研究人员和统计学家们引入了多种数据转换技术,其中最著名的之一就是 Box-Cox 转换。

为什么引入Box-Cox 转换?

数据的正态性对于许多统计方法至关重要。例如,在假设检验、回归分析、ANOVA 和很多其他方法中,数据的正态分布是关键假设之一。数据的非正态性可能会导致估计的偏误、增加类型I和类型II错误的风险,以及降低模型的预测精度。因此,为了满足正态性假设,研究者们经常需要对数据进行某种形式的转换。

Box-Cox 转换是这样的一种方法,它的目的是使偏斜的数据更接近正态分布。这种转换方法是 George Box 和 David Cox 于 1964 年首次提出的,现已成为统计领域中的标准技术。

数学模型是什么?

Box-Cox 转换的数学模型定义如下:

其中, 是要被转换的数据,而 是转换参数。选择最佳的 值通常是通过最大化数据的对数似然来实现的。

为什么Box-Cox 能够使数据正态?

Box-Cox 转换的工作原理有几个方面:

  1. 对偏度的矫正:通过调整数据的幂,Box-Cox 转换可以有效地桥正数据的偏斜性。对于正偏 斜的数据,选择 值小于 1 可以使数据向左移动,从而减少偏斜性。对于负偏斜的数据,选 择 值大于 1 可以进行桥正。
  2. 方差稳定化:Box-Cox 转换也可以矫正数据的异方差性,使其变得更加稳定。
  3. 数学理论: Box-Cox 转换的形式基于数学和统计理论,指出当选择适当的 值时,可以使数据的对数似然最大化,从而使数据更接近正态分布。

Box-Cox 转换的实际应用

考虑一个例子,其中我们有一个数据集,该数据集记录了不同城市的人口和相关的犯罪率。犯罪率的数据可能会受到极端值的影响,并且可能不是正态分布的。在这种情况下,我们可以使用 Box-Cox 转换来矫正犯罪率的分布。

来看这份虚拟的数据。假设我们有一个包含20个城市的数据集。每个城市都有其人口数量和年犯罪率(表示为每10,000人中发生的犯罪事件数)。

城市1城市2城市3城市4城市5城市6城市7城市8城市9城市10城市11城市12城市13城市14城市15城市16城市17城市18城市19城市20
231516646883101466211758912101018372817

先直观的看一下数据的频率分布:

import matplotlib.pyplot as plt
import seaborn as sns
from scipy.stats import shapiro

# 数据
crime_rates = [231516646883101466211758912101018372817]

# 绘制频率分布直方图和概率密度曲线
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()

从上图中,我们可以清晰地观察到犯罪率数据的分布。这些数据似乎并不完全遵循正态分布。

我们可以使用统计方法(如 Shapiro-Wilk 测试)来检验数据的正态性。

# Shapiro-Wilk 测试
shapiro_test = shapiro(crime_rates)
shapiro_test

测试统计量 (W值) = 0.8087,p值 = 0.0012,由于p值(0.0012)小于0.05,我们拒绝原假设,即数据是正态分布的。因此,我们可以确定这些犯罪率数据并不是正态分布的。

此时我们可以应用 Box-Cox 转换并选择最佳的 λ 值来最大化对数似然。

from scipy.stats import boxcox

# 应用Box-Cox转换
transformed_data, best_lambda = boxcox(crime_rates)

best_lambda, transformed_data

通过Box-Cox转换,我们得到了最佳的 λ 值为 0.1701。这意味着当 λ 取此值时,转换后的数据最大化了对数似然,从而更接近正态分布。

下面,我们将重新绘制转换后的数据的频率分布直方图和概率密度曲线,并再次进行Shapiro-Wilk 测试,以确认数据的正态性。

# 绘制转换后的数据的直方图和概率密度曲线
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

从上图可以看出,经过Box-Cox转换后的犯罪率数据更接近正态分布。此外,新的Shapiro-Wilk测试结果显示统计量为0.9826,p值为0.9628。由于此p值大于0.05,我们无法拒绝数据是正态分布的原假设。

这意味着经过Box-Cox转换后的数据满足正态性假设。因此,我们可以放心地使用需要正态分布假设的统计方法进行进一步分析。

完美!

结语

Box-Cox 转换是统计和数据分析中的一个强大工具,它可以帮助我们矫正数据的非正态性。通过理解其背后的原理和知道如何在实际问题中应用它,我们可以更好地利用统计方法,从而得到更准确和有洞察力的结果。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存