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

技术

picture.image

什么是数据分布

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

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

正态分布

正态分布理论

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

其中 是随机变量, 是分布的均值, 是分布的方差

正态分布参数 决定了其分布的中心位置,而 决定了分布的幅度(分布形状),接下来通过代码生成标准的正态分布来观察这些特点


          
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()
      

picture.image

正态分布作用

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

  • 统计推断: 在假设检验和置信区间估计中,正态分布是常用的基础分布之一,例如 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()
      

picture.image

生成一组包含异常值的正态分布数据,绘制包含异常值的直方图、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()
      

picture.image

卡方分布

***卡方

分布理论***

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

其中 是随机变量的取值, 是自由度用于确定分布形状,当 较大时卡方分布趋近于正态分布, 是伽马函数满足 ,卡方分布的期望值为 方差为 ,接下来随机生成一个卡方分布可视化帮助我们更好理解


          
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()
      

picture.image

卡方分布作用

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

往期推荐

SHAP全解析:机器学习、深度学习模型解释保姆级教程

Pythorch框架构建Attention-lstm时序模型

利用python meteostat库对全球气象数据访问,获取历史气象数据

Python桑基图可视化:揭示数据行为路径

基于分布的四种离群值检验方法

常见激活函数详解

特征工程——数据转换

回归任务常见评价指标解读以及Python实现

如果你对类似于这样的文章感兴趣。

欢迎关注、点赞、转发~

个人观点,仅供参考

0
0
0
0
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论