所有文章 > AI驱动 > 数据分布与变化:从理论到实践指南

数据分布与变化:从理论到实践指南

什么是数据分布

数据分布指的是在给定数据集中,不同数值或取值出现的频率或概率的分布模式,它描述了数据集中各个数值或取值的分布情况,包括集中趋势(如均值、中位数、众数)、数据的变异程度(如标准差、方差)以及数据点在整个数据范围内的分布情况(如分位数、四分位数等)

具体来说,数据分布可以是连续的(如正态分布、指数分布)或离散的(如泊松分布、二项分布),分布的形状可以是对称的(如正态分布)、右偏的(如指数分布)或左偏的(如对数正态分布),理解数据分布有助于分析数据的特征、预测未来事件的发生概率,以及选择合适的统计模型来解释数据的行为和变化,在实际应用中,理解数据分布对于进行数据探索性分析、制定业务策略、进行预测建模以及进行决策支持都至关重要,接下来让我们一起来理解这些分布

正态分布

正态分布理论

正态分布是统计学中最重要的连续型概率分布之一,也称为高斯分布,它的特点是其概率密度函数呈钟形曲线,中心对称,左右两边的尾部渐近于水平轴但永远不触及,正态分布的概率密度函数公式如下:

import matplotlib.pyplot as plt
import numpy as np

plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False

# 第一个子图:均值为0,标准差为1的正态分布
mean1 = 0
std_dev1 = 1
num_samples = 1000
data1 = np.random.normal(mean1, std_dev1, num_samples)
plt.figure(figsize=(12, 6))

plt.subplot(1, 2, 1)
plt.hist(data1, bins=30, density=True, alpha=0.6, color='g', edgecolor='black')
plt.title('正态分布示例 1')
plt.xlabel('值')
plt.ylabel('密度')

x = np.linspace(-4, 4, 100)
p = 1/(std_dev1 * np.sqrt(2 * np.pi)) * np.exp(-(x - mean1)**2 / (2 * std_dev1**2))
plt.plot(x, p, 'k', linewidth=2, label = '正态分布曲线')
plt.legend()
plt.text(-3, 0.35, r'$\mu=0,\ \sigma=1$', fontsize=12)
plt.grid(True)

# 第二个子图:均值为5,标准差为10的正态分布
mean2 = 5
std_dev2 = 10
data2 = np.random.normal(mean2, std_dev2, num_samples)

plt.subplot(1, 2, 2)
plt.hist(data2, bins=30, density=True, alpha=0.6, color='g', edgecolor='black')
plt.title('正态分布示例 2')
plt.xlabel('值')
plt.ylabel('密度')

x = np.linspace(-30, 40, 100)
p = 1/(std_dev2 * np.sqrt(2 * np.pi)) * np.exp(-(x - mean2)**2 / (2 * std_dev2**2))
plt.plot(x, p, 'k', linewidth=2, label='正态分布曲线')
plt.legend()
plt.text(-25, 0.035, r'$\mu=5,\ \sigma=10$', fontsize=12)
plt.grid(True)

plt.tight_layout()
plt.show()

正态分布作用

正态分布的应用广泛,包括但不限于:

  • 统计推断: 在假设检验和置信区间估计中,正态分布是常用的基础分布之一,例如 t 检验、方差分析等。这些方法要求数据满足正态分布假设,以保证推断的准确性和可靠性
  • 数据建模: 在许多机器学习算法中,假设数据服从正态分布有时是必要的前提条件,如线性回归模型中的残差

如何检验数据是否为正态分布

正态分布检验是一种用来验证数据是否服从正态分布的方法,常见的正态分布检验包括以下几种:

直方图和正态概率图检验:

  • 直方图检验:通过观察数据的直方图来初步判断数据的分布形态,是否近似正态分布
  • 正态概率图(Q-Q 图):将数据的分位数与标准正态分布的分位数进行比较,如果数据点落在一条直线上,则表明数据与正态分布拟合良好

统计检验方法:

  • Shapiro-Wilk 检验:用于小样本(通常小于50个观测值)的正态性检验,具有较高的敏感性
  • Kolmogorov-Smirnov 检验:适用于大样本的正态性检验,但相对于 Shapiro-Wilk 检验来说,对于正态分布的检测能力较弱

偏度和峰度检验:

  • 偏度和峰度的数值可以提供关于数据分布形态的信息,对于正态分布来说,偏度应接近于0,峰度应接近于3

Anderson-Darling 检验:

  • Anderson-Darling 检验结合了样本的分位数与理论分布的比较,提供了对数据是否来自指定分布的详细检验
mean = 0   
std_dev = 1
num_samples = 1000

data = np.random.normal(mean, std_dev, num_samples)
# 添加异常值
data[0] = 8
data[1] = -5
plt.figure(figsize=(15, 5))
plt.subplot(1, 3, 1)
plt.hist(data, bins=30, density=True, alpha=0.6, color='g')
plt.title('正态分布(包含异常值)')
plt.xlabel('值')
plt.ylabel('密度')

xmin, xmax = plt.xlim()
x = np.linspace(xmin, xmax, 100)
p = np.exp(-(x-mean)**2 / (2*std_dev**2)) / (std_dev * np.sqrt(2*np.pi))
plt.plot(x, p, 'k', linewidth=2, alpha = 0.3)

# 标记异常值
plt.scatter([data[0], data[1]], [0, 0], color='red', marker='o', label='异常值')

plt.text(-3, 0.35, r'$\mu=0,\ \sigma=1$', fontsize=12)
plt.text(-3, 0.3, '均值和标准差 ', fontsize=10, color='blue')
plt.text(2, 0.2, '正态分布曲线', fontsize=10, color='black')
plt.legend()
plt.grid(True)

from scipy import stats
# 绘制 Q-Q 图
plt.subplot(1, 3, 2)
stats.probplot(data, dist="norm", plot=plt)
plt.title('Q-Q 图')
plt.xlabel('理论分位数')
plt.ylabel('样本分位数')
plt.grid(True)
# 绘制 P-P 图
plt.subplot(1, 3, 3)
stats.probplot(data, dist="norm", plot=plt, fit=True)
plt.title('P-P 图')
plt.xlabel('理论累积概率')
plt.ylabel('样本累积概率')
plt.grid(True)
plt.show()

生成一组包含异常值的正态分布数据,绘制包含异常值的直方图、Q-Q 图和 P-P 图,以帮助可视化数据分布和判断数据是否符合正态分布,如果数据点落在一条直线上,则表明数据与正态分布拟合良好,可发现存在两个数据点不在一条直线上,和异常值存在对应,对于这种异常值可采取3  原则来识别,3  原则来源于正态分布的特性,在正态分布中,约99.7%的数据点会落在均值和  的  的范围内,因此超过这个范围的数据点通常就被认为是异常值,详情代码参考往期文章基于分布的四种离群值检验方法

泊松分布

泊松分布理论

泊松分布是一种离散概率分布,用于描述在固定时间间隔或空间区域内,事件发生的次数,它假设这些事件是独立发生的,并且在任意两个不重叠的时间间隔内,事件发生的概率是相同的,泊松分布的概率质量函数公式如下:

# 设置泊松分布参数
lam = 3 # 泊松分布的参数 lambda,控制事件的平均发生率

# 生成泊松分布的数据
k_values = np.arange(0, 15) # 可视化的事件发生次数范围
probabilities = np.exp(-lam) * np.power(lam, k_values) / np.array([np.math.factorial(k) for k in k_values])

# 绘制泊松分布的柱状图
plt.figure(figsize=(10, 6), dpi=300)
plt.bar(k_values, probabilities, color='skyblue', edgecolor='black')

plt.title('泊松分布')
plt.xlabel('事件发生次数')
plt.ylabel('概率')
for k, prob in zip(k_values, probabilities):
plt.text(k, prob + 0.01, f'{prob:.3f}', ha='center', va='bottom')

plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.xticks(k_values)
plt.ylim(0, max(probabilities) + 0.1)
plt.show()

卡方分布

卡方分布理论

卡方分布是一种连续概率分布,常用于描述多个独立标准正态分布随机变量的平方和的分布,卡方分布的概率密度函数公式如下:

from scipy.stats import chi2

# 设置自由度
degrees_freedom_1 = 5
degrees_freedom_2 = 10
x = np.linspace(0, 20, 1000)
pdf_1 = chi2.pdf(x, degrees_freedom_1)
pdf_2 = chi2.pdf(x, degrees_freedom_2)

plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
plt.plot(x, pdf_1, label=f'k={degrees_freedom_1}')
plt.title('卡方分布概率密度函数')
plt.xlabel('x')
plt.ylabel('概率密度')
plt.legend()
plt.grid(True)

plt.subplot(1, 2, 2)
plt.plot(x, pdf_2, label=f'k={degrees_freedom_2}')
plt.title('卡方分布概率密度函数')
plt.xlabel('x')
plt.ylabel('概率密度')
plt.legend()
plt.grid(True)
plt.show()

卡方分布作用

  • 假设检验:用于比较观察到的数据与期望数据之间的差异,常见的例子包括卡方检验和拟合优度检验
  • 置信区间构造:用于估计参数的置信区间,尤其是在数据的分布未知但满足一定条件时,例如方差分析中对组间方差的估计
  • 模型拟合:用于评估模型的拟合程度,例如线性回归模型中的残差分析

文章转自微信公众号@Python机器学习AI