离群值检测
离群值检测(Outlier Detection)是指在给定数据集中,识别和定位与其他数 据点明显不同的异常观测值。离群值也被称为异常值、异常点或异常数据,它们 与其他数据点的特征、分布或行为存在显著的偏差。
1 3sigma 检测法
σ 检测法(3-Sigma Rule)是一种基于统计学原理的离群值检测方法,它使用数 据的均值和标准差来确定是否存在离群值。该方法基于正态分布的假设,假设数 据遵循正态分布,并将离群值定义为与均值相差 3 倍标准差以上的数据点。 以下是 3σ 检测法的原理:
1. 假设数据集(或样本)为 X,其中包含 n 个数据点。
2. 计算数据集的均值(μ)和标准差(σ)。
3. 根据正态分布的性质,约 68%的数据点落在均值的±1σ 范围内,约 95%的 数据点落在均值的±2σ 范围内,约 99.7%的数据点落在均值的±3σ 范围内。
4. 使用 3σ 原则,将数据集中与均值相差 3 倍标准差以上的数据点定义为离 群值。
5. 检查数据集中是否存在离群值,如果存在,则将其标记为离群值。 需要注意的是,3σ 检测法假设数据遵循正态分布,因此在非正态分布的情况下, 该方法可能无法准确识别离群值。此外,3σ 检测法只能检测到与均值相差 3 倍 标准差以上的离群值,对于较小的离群值可能无法有效检测。
2 箱线图检测法
箱线图检测法(Boxplot)是一种基于统计学原理的离群值检测方法,它使用数据 的分位数和四分位距来确定是否存在离群值。该方法通过绘制箱线图来可视化数 据的分布情况,并根据一定的规则来判断是否存在离群值。 以下是箱线图检测法的原理:
1. 假设数据集(或样本)为 X,其中包含 n 个数据点。
2. 计算数据集的四分位数:第一四分位数(Q1)、中位数(Q2,也称为第二 四分位数)和第三四分位数(Q3)。
3. 计算四分位距(IQR),即 Q3 和 Q1 之间的差值,即 IQR = Q3 - Q1。
4. 根据箱线图的绘制规则,绘制箱体,箱体的上边界为 Q3,下边界为 Q1, 中位数用一条线表示。
5. 根据箱线图的绘制规则,计算上界和下界:上界为 Q3 + 1.5 * IQR,下界 为 Q1 - 1.5 * IQR。
6. 检查数据集中是否存在超过上界或下界的数据点,如果存在,则将其定义 为离群值。
7. 将离群值标记在箱线图上,通常用单独的点表示。 箱线图检测法通过观察箱线图的形状和离群值的存在来判断数据的分布情况和 是否存在离群值。离群值通常被认为是与其他数据点明显不同的异常值。箱线图 检测法相对于 3σ 检测法对非正态分布的数据更加稳健,同时可以提供更多关于 数据分布的信息。然而,箱线图检测法也有其局限性,对于一些特殊的数据分布, 可能无法准确识别离群值,因此在实际应用中需要综合考虑其他因素来选择合适 的离群值检测方法
3 Zscore 检测法
Zscore 检测法(Z-score Method)是一种基于统计学原理的离群值检测方法,它 使用数据的标准化分数(Z 分数)来确定是否存在离群值。该方法通过计算数据 点与均值之间的偏差,以及偏差与标准差之间的比例来判断是否存在离群值。 以下是 Zscore 检测法的原理:
1. 假设数据集(或样本)为 X,其中包含 n 个数据点。
2. 计算数据集的均值(μ)和标准差(σ)。
3. 对每个数据点计算 Z 分数,即将数据点与均值相减,然后除以标准差,得 到 Z 分数:Z = (X - μ) / σ。
4. 根据 Z 分数的性质,Z 分数表示数据点与均值之间的偏差程度,正值表示 数据点高于均值,负值表示数据点低于均值。
5. 根据经验规则,通常将 Z 分数大于某个阈值(例如 3 或 2)的数据点定义为离群值。
6. 检查数据集中是否存在 Z 分数大于阈值的数据点,如果存在,则将其标记 为离群值。
Zscore 检测法基于数据点与均值之间的偏差来判断离群值,离群值的 Z 分数 越大,表示其与均值的偏差越大。该方法可以适用于各种数据分布,不仅仅局限 于正态分布。然而,Zscore 检测法也有其局限性,对于小样本数据或者存在严重 偏斜的数据分布,可能会出现误判的情况。因此,在实际应用中需要结合数据的 特点和领域知识来选择合适的离群值检测方法
代码参考
#1 3sigma 检测法
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 使用SimHei字体
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
# 读取CSV文件
df = pd.read_csv("asd.csv", encoding='utf-8', encoding_errors='replace')
# 删除有NaN空值的的数据
df = df.dropna(subset=['RBAPWV'])
# 定义列名
column_name = 'RBAPWV'
# 计算均值和标准差
mean = df[column_name].mean()
std = df[column_name].std()
# 定义异常值的范围(使用3-Sigma Rule)
lower_limit = mean - 3 * std
upper_limit = mean + 3 * std
# 检测异常值
outliers = df[(df[column_name] < lower_limit) | (df[column_name] > upper_limit)]
# 打印异常值(如果需要)
# print("异常值:")
# print(outliers)
# 绘制直方图以及异常值范围(可选)
plt.hist(df[column_name], bins=50, density=True) # 调整bins的数量以更好地适应你的数据
plt.axvline(x=lower_limit, color='r', linestyle='--', label=f'Lower Limit: {lower_limit:.2f}')
plt.axvline(x=upper_limit, color='r', linestyle='--', label=f'Upper Limit: {upper_limit:.2f}')
plt.axvline(x=mean, color='g', linestyle='-', label=f'Mean: {mean:.2f}')
plt.title('3-Sigma Rule for Outlier Detection')
plt.xlabel(column_name)
plt.ylabel('Frequency')
plt.legend()
plt.show()
#2 箱线图检测法
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 使用SimHei字体,这是一个常用的包含中文的字体
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
# 读取CSV文件
df = pd.read_csv("asd.csv", encoding='utf-8', encoding_errors='replace')
# 删除有NaN空值的的数据,还有一些其他方法比如填补均值
df = df.dropna(subset=['RBAPWV'])
# 假设你要检测名为'column_name'的列中的异常数据
column_name = 'RBAPWV' # 请将'your_column_name'替换为你要检测的具体列名
# 计算IQR
Q1 = df[column_name].quantile(0.25)
Q3 = df[column_name].quantile(0.75)
IQR = Q3 - Q1
# 定义异常值的范围(通常使用1.5 * IQR作为标准)
lower_limit = Q1 - 1.5 * IQR
upper_limit = Q3 + 1.5 * IQR
# 检测异常值
outliers = df[(df[column_name] < lower_limit) | (df[column_name] > upper_limit)]
# print("异常值:")
# print(outliers)
# 绘制箱线图
plt.boxplot(df[column_name])
plt.title('箱线图检测异常值')
plt.ylabel(column_name)
plt.show()
#3 Z-score检测法
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
plt.rcParams['font.sans-serif'] = ['SimHei'] # 使用SimHei字体
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
# 读取CSV文件
df = pd.read_csv("asd.csv", encoding='utf-8', encoding_errors='replace')
# 删除有NaN空值的的数据
df = df.dropna(subset=['RBAPWV'])
# 定义列名
column_name = 'RBAPWV'
# 计算Z-scores
z_scores = np.abs(stats.zscore(df[column_name]))
# 定义异常值的阈值(通常使用3作为标准)
threshold = 3
# 检测异常值
outliers = df[(z_scores > threshold)]
# 打印异常值(如果需要)
# print("异常值:")
# print(outliers)
# 绘制直方图以及异常值范围(可选)
plt.hist(df[column_name], bins=50, density=True, label='Data Distribution') # 调整bins的数量以更好地适应你的数据
plt.title('Z-score Outlier Detection')
plt.xlabel(column_name)
plt.ylabel('Frequency')
# 标记异常值(可选)
# 这里不会直接在直方图上标记每个异常值,因为直方图显示的是分布,而不是单个数据点。
# 但可以通过其他方式展示异常值,比如在一个单独的图中或者通过文本输出。
# 显示图例并展示图形
plt.legend()
plt.show()
标签:plt,name,df,检测,离群,column,检测法,异常
From: https://blog.csdn.net/2301_79675943/article/details/137005505