首页 > 其他分享 >异常值检测

异常值检测

时间:2024-03-25 10:30:12浏览次数:18  
标签:plt name df 检测 离群 column 检测法 异常

离群值检测

离群值检测(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

相关文章

  • Spring全局异常
    前言最近做一个spring微服务,当请求进入接口后,一旦发生错误,服务就会抛出异常,但是这个异常不是我们封装的,有时候跑出的信息我们想统一处理。例:如果是客户请求数据错误应该报出400的HttpStatus.BAD_REQUEST。但是由于这个错误是我们内部抛出的他还是会自动抛500,而且服务有很多......
  • Python问题异常处理与日志结合
    我们掌握了try-except来处理程序运行中可能遇到的异常,以及使用logging来记录程序运行日志,该篇文章就结合二者来讲讲如何记录程序运行过程中的各种事件、状态信息以及遇到的异常情况,以便于追踪、诊断和解决程序运行时的问题。目录一、配置日志记录器 (logging.Logger)二、......
  • UE4 射线检测 拾取物品
    第一视角玩家这里比较重要的点是PickUp是一个接口,调用的是接口PickUp接口定义接口实现接口的Actor类继承这个接口,实现的时候,就变成了事件(当接口没有返回值时就可以作为事件被触发)在Projectsetting中添加tracechannel,在碰撞体上勾选一开始的时候,把网上找的骨骼网格放进......
  • 基于肤色模型和中值滤波的手部检测算法FPGA实现,包括tb测试文件和MATLAB辅助验证
    1.算法运行效果图预览RTL图:   仿真图:   导入到matlab显示效果如下:   2.算法运行软件版本matlab2022a vivado2019.2 3.算法理论概述      在计算机视觉领域,基于肤色模型和中值滤波的手部检测方法是一种常见的初步定位策略。该方法主要分为......
  • 攻击检测:全局智能监控与精准定位
    随着互联网的快速发展,网络安全问题日益凸显,其中分布式拒绝服务攻击(DDoS)已成为威胁企业网络安全的重要隐患。为了应对这一挑战,我们致力于为客户提供全面的DDoS防护服务,确保您的网络环境安全可靠,让您的业务持续运行。作为专业的网络安全服务提供商,我们拥有丰富的经验和先进的技术手......
  • 【保姆级教程】YOLOv8目标检测:训练自己的数据集
    一、YOLOV8环境准备1.1下载安装最新的YOLOv8代码仓库地址:https://github.com/ultralytics/ultralytics1.2配置环境pipinstall-rrequirements.txt-ihttps://pypi.tuna.tsinghua.edu.cn/simple二、数据准备2.1安装labelme标注软件pipinstalllabelme2......
  • Java 学习路线:基础知识、数据类型、条件语句、函数、循环、异常处理、数据结构、面向
    Java基础什么是JavaJava是一种由SunMicrosystems于1995年首次发布的编程语言和计算平台。Java是一种通用的、基于类的、面向对象的编程语言,旨在减少实现依赖性。它是一个应用程序开发的计算平台。Java快速、安全、可靠,因此在笔记本电脑、数据中心、游戏机、科学超级计......
  • python基础——异常、模块和包、pyecharts
    文章目录一、异常1、异常捕获2、异常传递二、python模块1、概念2、导入方式3、自定义模块4、python包5、导入第三方包三、pyecharts1、概念2、JSON数据格式一、异常1、异常捕获1.基本语法try: 可能发生错误的代码except: 如果出现异常应该执行的代码try: ......
  • Java零基础-数组:异常处理和错误处理
    哈喽,各位小伙伴们,你们好呀,我是喵手。  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把......
  • HarmonyOS NEXT应用异常处理案例
    介绍本示例介绍了通过应用事件打点hiAppEvent获取上一次应用异常信息的方法,主要分为应用崩溃、应用卡死以及系统查杀三种。效果图预览使用说明:点击构建应用崩溃事件,3s之后应用退出,然后打开应用进入应用异常页面,隔1min左右后,显示上次异常退出信息。点击构建应用卡死事件,需......