统计特征:偏度和峰度(可视化图例解释)

基本概念

        在机器学习和数据分析中,峰度和偏度可以作为特征提取的指标,用于评估数据的分布形状,从而帮助理解数据集的特征并选择合适的模型。

峰度:衡量数据分布的尖锐程度或尾部的厚度。

  • 高峰度:分布曲线尖锐,尾部较重,峰度较高,表示更多极值。

  • 常态峰度:类似正态分布,峰度接近零。

  • 低峰度:分布曲线较平缓,尾部轻,峰度较低,数据更分散。

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy.stats import kurtosis

plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体字体
plt.rcParams['axes.unicode_minus'] = False  # 处理负号显示
# 设置随机种子
np.random.seed(0)

# 生成不同高峰度的数据
data_h= np.random.laplace(loc=0, scale=1, size=1000)  # 高峰度分布
data_n = np.random.normal(loc=0, scale=1, size=1000)    # 常态峰度分布
data_l = np.random.uniform(low=-2, high=2, size=1000)   # 低峰度分布

# 计算高峰度
kurt_h = kurtosis(data_leptokurtic)
kurt_n = kurtosis(data_mesokurtic)
kurt_l = kurtosis(data_platykurtic)

# 绘图
plt.figure(figsize=(12, 6))

# 高峰度分布
plt.subplot(1, 3, 1)
sns.histplot(data_h, bins=30, kde=True, color='blue', stat='density')
plt.title('高峰度分布')

# 常态峰度分布
plt.subplot(1, 3, 2)
sns.histplot(data_n, bins=30, kde=True, color='green', stat='density')
plt.title('常态峰度分布')

# 低峰度分布
plt.subplot(1, 3, 3)
sns.histplot(data_l, bins=30, kde=True, color='red', stat='density')
plt.title('低峰度分布')  # 修正了这个标题

plt.tight_layout()
plt.show()

偏度:衡量数据分布的对称性或偏斜方向。

  • 正偏 (右偏):右偏分布指的是数据分布的尾部向右侧延伸,即较高的值(极端值)分布在右侧。此时,均值通常大于中位数。

  • 负偏 (左偏):左偏分布指的是数据分布的尾部向左侧延伸,即较低的值(极端值)分布在左侧。此时,均值通常小于中位数。

  • 对称 (无偏):分布呈对称形状,类似于正态分布,偏度接近零。

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy.stats import skew

# 设置字体以支持中文
plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体字体
plt.rcParams['axes.unicode_minus'] = False  # 处理负号显示

# 设置随机种子
np.random.seed(0)

# 生成不同偏度的数据
data_r = np.random.exponential(scale=1, size=1000)  # 右偏分布
data_l = -np.random.exponential(scale=1, size=1000)  # 左偏分布
data_n = np.random.normal(loc=0, scale=1, size=1000)  # 对称分布

# 计算偏度
skew_r = skew(data_r)
skew_l = skew(data_l)
skew_n= skew(data_n)

# 绘图
plt.figure(figsize=(15, 5))

# 右偏分布
plt.subplot(1, 3, 1)
sns.histplot(data_r, bins=30, kde=True, color='blue', stat='density')
plt.title(f'右偏分布 (偏度: {skew_r:.2f})')

# 左偏分布
plt.subplot(1, 3, 2)
sns.histplot(data_l, bins=30, kde=True, color='green', stat='density')
plt.title(f'左偏分布 (偏度: {skew_l:.2f})')

# 对称分布
plt.subplot(1, 3, 3)
sns.histplot(data_n, bins=30, kde=True, color='red', stat='density')
plt.title(f'对称分布 (偏度: {skew_n:.2f})')

plt.tight_layout()
plt.show()

检验方法

1、可视化方法(主观判断)

直方图: 

  • 偏度:直方图的形状可以显示数据分布的偏斜程度。如果左侧尾巴较长,说明数据左偏;如果右侧尾巴较长,说明数据右偏。

  • 峰度:直方图的尖峭程度可以反映峰度。如果直方图的形状很尖,则可能具有高峰度;如果形状比较平坦,则可能具有低峰度。

  • 结合偏度和峰度一起判断。

import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np

plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体字体
plt.rcParams['axes.unicode_minus'] = False  # 处理负号显示
np.random.seed(10)

# 示例数据
data = np.random.normal(loc=50, scale=10, size=200)
data = np.append(data, [150, 160, 180])  # 添加异常值

# 绘制直方图
plt.hist(data, bins=30, edgecolor='black')
plt.title("直方图")
plt.xlabel("Value")
plt.ylabel("Frequency")
plt.show()

箱线图:

  • 偏度:可以判断。通过观察箱体的对称性和须的长度,可以判断数据的偏度。如果箱体的中位线偏向一侧,或一侧的须较长,说明数据存在偏斜。

  • 峰度:不直接判断。箱线图主要显示数据的四分位数和极端值,不能直接判断峰度。

# 示例数据
data = np.random.normal(loc=50, scale=10, size=200)
data = np.append(data, [150, 160])  # 添加异常值

# 绘制箱线图
sns.boxplot(data=data)
plt.title("箱线图")
plt.show()

QQ图:

  • 偏度:可以间接判断。QQ图通过将样本分位数与理论分布的分位数进行比较,偏离直线的程度可以间接反映数据的偏度。

  • 峰度:可以判断。QQ图的偏离程度也可以用来判断峰度。如果尾部比理论分布的尾部更重,说明数据的峰度较高。

# 生成示例数据
data3 = np.random.normal(loc=50, scale=10, size=200)
data3 = np.append(data, [150, 190])  # 添加异常值

# 绘制QQ图
stats.probplot(data3, dist="norm", plot=plt)   # dist="norm",表示与正太分布比较
plt.title("QQ")
plt.show()

2、统计方法(调包)

import numpy as np
import pandas as pd
from scipy.stats import skew, kurtosis

# 生成一个示例数据集
data = np.random.normal(loc=0, scale=1, size=100)  # 正态分布数据

# 计算偏度和峰度
skewness_ = skew(data)
kurtosis_ = kurtosis(data)   # 默认计算修正峰度
print(f"偏度: {skewness_:.4f}")
print(f"峰度: {kurtosis_:.4f}")

# 偏度: 0.2053
# 峰度: 0.0802

偏度的绝对值通常被认为是:

  • [0, 0.5]:分布近似对称。

  • [0.5 , 1]:轻微的偏斜。

  • [>1 ]:明显的偏斜。

正常峰度(以3为界点)

  • 峰度 = 3:正态峰度。

  • 峰度 > 3:高峰度(比正态更尖锐)。这通常意味着存在更多的极端值(异常值)。

  • 峰度 < 3:低峰度(比正态更平坦)。这表明数据的极端值较少,数据分散更广。

修正峰度(正常峰度-3,即以0为界点):

  • 修正峰度 = 0:正态峰度

  • 修正峰度 > 0:高峰度

  • 修正峰度 < 0:低峰度

 

高峰度

高峰度的特征

  • 分布的集中性更强:高峰度分布说明大部分数据值集中在均值附近,数据密度较高。这通常意味着中间的值变化较小,而多数数据点更靠近均值。

  • 极端值更多:高峰度分布在尾部有更多的极端值或离群点,即数据中包含更多异常的高值或低值。

  • 偏离正态分布:对于假设数据正态分布的模型来说,高峰度可能影响结果的准确性或鲁棒性。

高峰度处理方法

  • 去除异常值:这种方法简单有效,但可能导致信息丢失。

  • 变换数据:对数据进行变换,如使用对数变换、平方根变换或Box-Cox变换,以减小异常值影响。

  • 聚合数据:将数据分组并计算组内的均值或中位数,从而降低异常值的影响。

  • 数据插补:如果异常值影响了模型的表现,可以考虑用插补方法(如均值、邻近值或插值法)来替换异常值。

  • 利用模型鲁棒性:使用对异常值不敏感的模型,如决策树或随机森林。这些模型可以更好地处理高峰度数据。

 低峰度

低峰度的特征

  • 分布平坦:低峰度表明数据值的分布较为平坦,数据的集中性较弱。与高峰度相比,数据点分散得更广,意味着均值附近的数据点不如高峰度分布那样密集。

  • 极端值较少:低峰度分布通常在尾部表现出较少的极端值或离群点。这意味着数据中不太可能包含异常的高值或低值,整体上显得更加“正常”。

  • 信息量更均匀:低峰度分布表示信息在不同值之间更均匀地分布,而不是集中在某些特定值上。这种特征可能会影响数据的特征选择和模型构建,因为它可能会导致某些特征的影响力被低估。

低峰度处理方法

  • 增加样本量:收集更多数据,以提高数据集中程度,减少扁平化效应。

  • 特征工程:进行特征选择或构造新特征,增强模型对数据中重要特征的捕捉能力。

  • 使用非参数方法:考虑使用非参数检验或建模方法(如决策树),这些方法对数据分布的假设要求较低。

  • 归一化或标准化:将数据进行归一化或标准化,帮助数据更好地适应模型。

  • 考虑多模型集成:结合不同模型的预测结果,可以帮助提升在低峰度数据上的表现。

左偏和右偏

左偏特征

  • 集中低值:大多数数据值集中在较低的数值上,分布的“峰”偏向左侧。

  • 极端值:存在一些较高的极端值,这些值会拉高均值。

  • 数据分布形态:典型的右偏分布包括指数分布、泊松分布和某些类型的正态分布(如对数正态分布)。

示例:收入分布。大多数人的收入较低,但少数人拥有非常高的收入,导致整体分布右偏。

右偏特征

  • 集中高值:大多数数据值集中在较高的数值上,分布的“峰”偏向右侧。

  • 极端值:存在一些较低的极端值,这些值会拉低均值。

  • 数据分布形态:典型的左偏分布包括某些类型的正态分布和对数分布。

示例:考试成绩分布。大多数学生成绩较高,但可能有少数学生的成绩非常低,导致整体分布左偏。

左偏处理方法

左偏、右偏处理方法

  • 数据变换:

                1、对数变换:对右偏数据进行对数变换可以有效减小偏度,使数据更接近正态分布。

                2、平方根变换:适合于计数数据,能够减少偏度的影响。

                3、反向变换:使用反函数(例如 y=1/x​)来处理极端高值,使用反函数(例如y=−x)

                                        来处理极端低值。

  • 去除离群点:通过 Z-score 或 IQR 方法识别和去除极端值,以降低极端值对整体分析的影响

  • 数据分组:将数据分组或分桶,例如使用类别变量来代替原始数值,减少极端值的影响。

  • 模型选择:或者使用适合左偏或右偏分布的模型。

# 文章如有错误,希望大噶指正,一起学习进步!

# 最后,如果文章对大家有帮助的话 ,就点个小赞支持一下叭!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值