异常值检测!最佳统计方法实践(代码实现)!

线性回归应用:预测医疗费用 线性回归预测 比较自定义函数和sklearn函数预测 阅读详情

💡 作者:韩信子@ShowMeAI
📘 Python3◉技能提升系列:https://www.showmeai.tech/tutorials/56
📘 数据分析实战系列:https://www.showmeai.tech/tutorials/40
📘 本文地址:https://www.showmeai.tech/article-detail/336
📢 声明:版权所有,转载请联系平台与作者并注明出处
📢 收藏ShowMeAI查看更多精彩内容

💡 异常值 Q&A

异常值是距离其他数据值太远的数据点,也被称为离群点。它可能是自然发生的,也可能是由于测量不准确、拼写错误或系统故障造成的。异常值也可能出现在倾斜数据中,这些类型的异常值被认为是自然异常值。

了解异常值检测与分析的基础知识,请查看 ShowMeAI](https://www.showmeai.tech/) 这篇文章:

💦 异常值对分布有什么影响?

异常值会影响数据的均值、标准差和四分位数值。如果我们在去除异常值之前和之后计算这些统计数据,可能会有比较大的差异。

💦 异常值对机器学习模型有什么影响?

  • 如果认为异常值是自然的,不是由于测量错误产生的 → 应该将其保留在数据集中,并用『标准化』等数据预处理方式处理。
  • 如果有一个包含少量异常值的大型数据集 → 应该将其保留,不会显著影响结果。
  • 如果确定异常值是由测量误差造成的 → 应该将它们从数据集中删除。

去除异常值会带来数据集规模的减小,而且模型的适用性也会限制在输入值的度量范围内,丢弃自然异常值也可能导致模型不准确。

💡 基于可视化的异常值检测

异常值不容易被『肉眼』检测到,但我们有一些可视化工具可以帮助完成这项任务。最常见的是箱线图和直方图。我们这里用 🏆保险数据来做一个讲解:

🏆 实战数据集下载(百度网盘):公众号『ShowMeAI研究中心』回复『实战』,或者点击 这里 获取本文 [29]基于统计方法的异常值检测代码实战 『insurance数据集』

⭐ ShowMeAI官方GitHub:https://github.com/ShowMeAI-Hub

我们首先导入必要的库并加载数据集。

import numpy as np
import pandas as pd
import seaborn as sns
import statistics#Load dataset:
df = pd.read_csv('insurance.csv')
df

我们对变量『年龄』、『体重指数』和『费用』进行异常值检测分析。

第一种方法是使用箱线图 / Box-Plots 来绘制数据分布:

# age, bmi 和 expenses的箱线图绘图
sns.boxplot(y="age", data=df)
sns.boxplot(y="bmi", data=df)
sns.boxplot(y="expenses", data=df)

通过查看箱线图,我们可以看到变量 age 没有异常值,变量 bmi 在上限中有一些异常值,而变量 expense 在上限中有一系列异常值(表明存在偏态分布)。

为了检查偏态分布,我们再使用直方图绘图:

# age, bmi 和 expenses的直方图
sns.histplot(df, x="age", kde=True)
sns.histplot(df, x="bmi", kde=True)
sns.histplot(df, x="expenses", kde=True)

通过直方图,我们可以看到变量『age』是近似均匀分布,『bmi』接近正态分布,而『expense/费用』则呈偏态分布。

对于年龄,我们无需做异常值剔除;对于 bmi,我们将剔除高于 47 的值;对于费用,我们将剔除高于 50000 的值。

#bmi 和 expenses 的异常值处理
df.drop(df[df['bmi'] >= 47].index, inplace = True)
df.drop(df[df['expenses'] >= 50000].index, inplace = True)

现在,如果我们再次检查箱线图和直方图:

💡 基于统计方法的异常值检测

检测异常值有两种主要的统计方法:使用 z 分数和使用四分位距。

💦 使用 z 分数检测异常值

Z 分数是一种数学变换,它根据每个观测值与平均值的距离对其进行分类。z-score 的计算公示为:

我们定义异常检测标准:如果 z-score 小于 -3或 z-score 大于 3。

我们将重新加载数据集,因为我们在前面的示例中对其进行了更改,加载后的数据上我们会把变量转换为 z 分数:

# 重新加载数据
df = pd.read_csv('insurance.csv')

# 为age计算均值和标准差
mean_age = statistics.mean(df['age'])
stdev_age = statistics.stdev(df['age'])

# 计算z值
age_z_score = (df['age']-mean_age)/stdev_age

# 添加z结果到原dataframe
df['age_z_score'] = age_z_score.tolist()

现在我们将检查高于 3SD 或低于 -3SD 的值:

# 检测小于-3SD的值:
df.sort_values(by=['age_z_score'], ascending=True)

我们可以看到 -3SD 以下没有值。我们现在将检查 3SD 以上的值:

# 检测+3SD以上的值:
df.sort_values(by=['age_z_score'], ascending=False)

我们可以看到没有高于 3SD 的值。变量年龄没有异常值。

现在我们将对变量 bmi 执行相同的操作:

# 为bmi计算均值和标准差
mean_bmi = statistics.mean(df['bmi'])
stdev_bmi = statistics.stdev(df['bmi'])

# 为bmi计算z-score
bmi_z_score = (df['bmi']-mean_bmi)/stdev_bmi

# 添加到原始dataframe
df['bmi_z_score'] = bmi_z_score.tolist()

# 检查低于-3SD的值
df.sort_values(by=['bmi_z_score'], ascending=True)

# 检查大于3SD的值
df.sort_values(by=['bmi_z_score'], ascending=False)

这次我们会发现一些高于 3SD 的值:

我们对它进行剔除:

# 异常值处理
df.drop(df[df[‘bmi_z_score’] >= 3].index, inplace = True)

我们将对『expense/费用』应用相同的技术:

# 为expenses计算均值和标准差
mean_expenses = statistics.mean(df['expenses'])
stdev_expenses = statistics.stdev(df['expenses'])

# 计算z-score
expenses_z_score = (df['expenses']-mean_expenses)/stdev_expenses

# 添加到原始dataframe
df['expenses_z_score'] = expenses_z_score.tolist()

# 检查低于-3SD的值
df.sort_values(by=['expenses_z_score'], ascending=True)

# 检查高于3SD的值
df.sort_values(by=['expenses_z_score'], ascending=False)

# 异常值处理
df.drop(df[df[‘expenses_z_score’] >= 3].index, inplace = True)

如果我们再次检查箱线图和直方图,我们将获得:

💦 使用四分位距检测异常值

四分位间距将数据分为四个部分,从低到高排序,如下图所示,每个部分包含相同数量的样本。第一个四分位数(Q1)是边界中数据点的值。这同样适用于 Q2 和 Q3。 四分位距(IQR)是两个中间部分的数据点(代表 50% 的数据)。四分位距包含高于 Q1 和低于 Q3 的所有数据点。如果该点高于 Q3 + (1.5 x IQR),则存在较高的异常值,如果 Q1 - (1.5 x IQR),则存在较低的异常值。

代码实现如下:

# 重新加载数据
df = pd.read_csv('insurance.csv')

# 计算上下四分位数位置
q75_age, q25_age = np.percentile(df['age'], [75 ,25])
iqr_age = q75_age - q25_age
iqr_age

# 计算上下边界以用于异常检测
age_h_bound = q75_age+(1.5*iqr_age)
age_l_bound = q25_age-(1.5*iqr_age)
print(age_h_bound)
print(age_l_bound)

我们计算得到上边界 87 和下边界 -9:

# 排序
df.sort_values(by=['age'], ascending=True)
# 排序
df.sort_values(by=['age'], ascending=False)

我们看到没有异常值。

我们对变量 bmi 执行相同的操作:

# 计算上下四分位数位置
q75_bmi, q25_bmi = np.percentile(df['bmi'], [75 ,25])
iqr_bmi = q75_bmi - q25_bmi
iqr_bmi

# 计算上下边界以用于异常检测
bmi_h_bound = q75_bmi+(1.5*iqr_bmi)
bmi_l_bound = q25_bmi-(1.5*iqr_bmi)
print(bmi_h_bound)
print(bmi_l_bound)

# 排序
df.sort_values(by=['bmi'], ascending=True)
df.sort_values(by=['bmi'], ascending=False)

# 剔除异常值
df.drop(df[df['bmi'] >= 47.3].index, inplace = True)
df.drop(df[df['bmi'] <= 13.7].index, inplace = True)

我们只需要对可变费用做同样的事情,我们将获得以下箱线图和直方图:

参考资料

python数据分析课程笔记 | 第五章 Python统计分析(下) 5.3 卡方分析和方差分析 (1)卡方检验 阅读详情

相关推荐

查找时间序列数据中异常值的终极指南(第 1 部分)

我们将探索视觉和统计方法来有效识别时间序列数据中的异常值。对于任何想要提高分析准确性的人来说,这些基础知识都至关重要。

2401_85233349的博客 2053

异常值的检测与处理(附python代码及实例)

异常值的检查方法、处理方法(附python代码及具体实现案例)

weixin_45272208的博客 3万+

R语言检测异常值的几个案例

本文结合R语言,展示了异常检测的案例,主要内容如下: (1)单变量的异常检测 (2)使用LOF(localoutlierfactor,局部异常因子)进行异常检测 (3)通过聚类进行异常检测 (4)对时间序列进行异常检测 单变量异常检测 本部分展示了一个单变量异常检测的例子,并且演示了如何将这种方法应用在多元数据上。在该例中,单变量异常检测通过boxplot.stats()函数实现,并且返回产生箱线图的统计量。在返回的结果中,有一个部分是out,它结出了异常值的列表。更明确点,它列出了位于..

Mrrunsen的博客 2734

在Python中寻找数据异常值的三种方法

本文重点介绍了在Python中使用sklearn机器学习库来进行异常值检测的三种方法,并给出了相应的代码示例。您学废了嘛?httpshttpshttps。

sgzqc的专栏 7496

insurance.csv

用于数据分析以及模型训练的保险数据

别再纠结高边低边了!用TI BQ76952设计两轮车BMS,手把手教你选对架构(附电路图)

本文深度解析基于TI BQ76952芯片的电动两轮车BMS设计策略,涵盖高边/低边驱动选择、四种基础架构的电流路径分析及选型决策矩阵。通过实战案例分享,帮助工程师优化BMS架构,提升系统可靠性和成本效益,特别适合电摩和共享单车应用场景。

weixin_42665255的博客 517

数据清洗的异常值检测与处理

1.背景介绍 数据清洗是数据预处理的一个重要环节,它涉及到数据的整理、纠正和过滤,以提高数据质量,使数据更适合进行分析和挖掘。异常值检测和处理是数据清洗中的一个关键环节,它涉及到识别和处理数据中的异常值,以提高数据质量和分析结果的准确性。 异常值是指数据中与其他数据点显著不同的数据点,它们可能是由于测量误差、记录错误、数据抓取错误等原因产生的。异常值可能会影响数据分析和模型训练的结果,因此需要...

AI天才研究院 2297

UE4 专用服务器搭建(UE4.27为例)

专用服务器、DS服务器

mimo134的博客 2775

异常值检测

利用高斯分布这一有利工具来进行异常值检测

帅帅de三叔 1193

硬件-电源-智能保护:eFuse选型与实战设计全攻略

本文深入解析eFuse在硬件电源设计中的关键作用与实战选型技巧。作为智能保护器件,eFuse能提供毫安级精度的过流保护、多重故障防护和智能恢复功能,比传统保险丝快1000倍以上。文章详细介绍了eFuse的工作原理、五大选型维度和PCB布局要点,帮助工程师有效预防电源异常导致的硬件损坏,适用于AI服务器、工业控制等场景。

weixin_30879169的博客 201

WGCNA样本量不够怎么办?5种替代方案帮你解决小样本基因共表达分析难题

本文针对WGCNA样本量不足的问题,提供了5种科学替代方案,包括CEMiTool、参数调整、多组学数据整合、机器学习特征提取和公共数据利用。这些方法帮助研究者在小样本条件下仍能进行可靠的基因共表达分析,特别适用于罕见病和珍贵临床样本研究。

weixin_42554042的博客 306

数据分析——【统计学】异常值检测

阅读之前看这里????:博主是正在学习数据分析的一员,博客记录的是在学习过程中一些总结,也希望和大家一起进步,在记录之时,未免存在很多疏漏和不全,如有问题,还请私聊博主指正。 博客地址:天阑之蓝的博客,学习过程中不免有困难和迷茫,希望大家都能在这学习的过程中肯定自己,超越自己,最终创造自己。 在训练机器学习算法或应用统计技术时,错误值或异常值可能是一个严重的问题,它们通常会造成测量误差或异常系统条件的结果,因此不具有描述底层系统的特征。实际上,最佳做法是在进行下一步分析之前,就应该进行异常值去除处理。在某

天阑之蓝的博客 9274

CANOE-介绍 @014-基于CAPL的Someip测试(CANOE 15.0/16.0/17.0)【草稿】发送事件、方法

摘要:本文介绍了使用CANoe 16.0及更高版本配置SOME/IP测试环境的方法,包括硬件连接、工程配置和CAPL代码实现。SOME/IP是一种面向服务的车载通信协议,支持服务发现、事件推送和方法调用。文章详细说明了网络拓扑配置、数据库文件加载等步骤,并提供了CAPL代码示例,展示如何初始化多个应用端点(15个不同端口)和服务实例(73个服务),通过SomeIpOpenLocalApplicationEndpoint和SomeIpCreateProvidedServiceInstance函数实现。配置过程

沿流不止 424

数据清洗必修课:异常值检测与处理全攻略

异常值是那些与数据集其他观测值显著不同的异常观测。它们可能由于实验误差、测量误差,或仅仅是数据本身存在的变异性而出现。这些异常值会严重影响模型的表现,导致结果出现偏差——就像大学相对评分中顶尖学生能拉高平均分并影响评分标准一样。处理异常值是数据清洗过程中至关重要的一环。

Xianxiancq的博客 1720

29、智能问答系统:原理、挑战与实现

本文深入探讨了智能问答系统的原理、挑战与实现方法。从智能问答系统的定义、重要性、问题类型和构建步骤,到实现中的歧义问题、数据集创建及基于规则的系统实现,全面解析了这一自然语言处理领域的重要应用。同时,文章还介绍了智能问答系统的应用场景、发展趋势以及面临的挑战与应对策略,为读者提供了一个全面而深入的理解框架。

redis7keeper的博客 165

【MATLAB代码】UKF组合导航例程,15维状态量、3维观测量。附完整的代码,有中文注释、误差输出图像

摘要 本文提出了一种基于15维误差状态模型的UKF组合导航算法,实现了三维位置、速度和姿态的高精度估计。算法采用严格的误差状态模型,包含位置(3)、速度(3)、姿态(3)、陀螺偏差(3)和加速度计偏差(3)共15个状态量,通过3维GNSS位置观测进行校正。仿真结果表明,相比纯IMU积分,UKF算法能有效抑制误差积累,显著提高导航精度。文中提供了完整的MATLAB源代码,可直接运行并复现三维轨迹对比、位置/速度曲线及误差分析结果。

985工科博士毕业,专攻定位、导航和滤波等算法研究。从业10年,主要使用MATLAB 312

Python异常值的自动检测实战案例!

设定一个异常值的比例outliers_fraction为1%,这样设置是因为在标准正太分布的情况下(N(0,1))我们一般认定3个标准差以外的数据为异常值,3个标准差以内的数据包含了数据集中99%以上的数据,所以剩下的1%的数据可以视为异常值。该算法不采样任何基于聚类或距离的方法,因此他和那些基于距离的的异常值检测算法有着根本上的不同,孤立森林认定异常值的原则是异常值是少数的和不同的数据。基于聚类的异常检测中的假设是,如果我们对数据进行聚类,则正常数据将属于聚类,而异常将不属于任何聚类或属于小聚类。

hlh18030233613的博客 737

「UG/NX」BlockUI 树列表(回调函数)

官方对树控件提供了21种回调函数,树的一些操作可以在这些回调函数中进行操作。

何曾参静谧的博客 1334

四种检测异常值的常用技术简述

四种检测异常值的常用技术简述 在训练机器学习算法或应用统计技术时,错误值或异常值可能是一个严重的问题,它们通常会造成测量误差或异常系统条件的结果,因此不具有描述底层系统的特征。实际上,最佳做法是在进行下一步分析之前,就应该进行异常值去除处理 在某些情况下,异常值可以提供有关整个系统中局部异常的信息;因此,检测异常值是一个有价值的过程,因为在这个工程中,可以提供有关数据集的附加信息 目前有许多技术可以检测异常值,并且可以自主选择是否从数据集中删除。在这篇博文中,将展示KNIME分析平台中...

井底小蛙的博客 1418

贝叶斯统计 [韦来生编]

贝叶斯(Bayes)统计是近几十年来迅速发展起来的数理统计的一个重要分支。贝叶斯方法与经典统计方法的主要不同之处是进行统计推断时除了利用样本信息外,还要利用参数的先验信息,因此可以提高统计推断或统计决策的效果。它在经济、金融、生物、医学、自然科学和社会科学等许多领域具有广泛的应用。贝叶斯方法的研究已渗透到了统计学的几乎所有领域。作者在给中国科学技术大学概率论与数理统计专业本科生开设的“数理统计”课程中有一章专门讲授“贝叶斯方法和统计决策理论”,近十年来也给中国科学技术大学概率统计专业研究生开设过几次“贝叶斯分析”课。本书是在对过去讲稿的内容作了适当的增减和调整的基础上完成的。  本书共分六章。第1章是绪论,介绍了贝叶斯统计的若干基本概念,同时对必要的数理统计的基础知识有重点地作了回顾。第二章介绍了确定先验分布的若干可供选择的方法。第三章介绍了几类常见统计模型参数的后验分布的主要结果和计算方法。第四章和第五章分别介绍了“贝叶斯统计推断”和“贝叶斯统计决策”的内容。第六章介绍了贝叶斯统计计算的若干方法,包括蒙特卡洛方法和马尔可夫链蒙特卡洛(MCMC)方法以及相关统计软件的简介。本书的每一章附右大量的例题和习题,书末附有常用的几个表格和部分习题解答供读者查用。  大约可在54学时内讲授本书的第1章至第六章的主要内容,教师可根据学时需要选讲本书第1章至第六章的部分内容。书中标“*”号的章节可略去不讲,留给读者作为阅读材料。第六章例题中的R代码和部分例题的数据文件等可从作者个人主页下载。  作者在编写本书的过程中参考了J.O.Berger教授的《统计决策论及贝叶斯分析》和茆诗松教授编写的《贝叶斯统计》等书中的一些内容,以及《贝叶斯分析》一书中由张伟平博士编写的有关贝叶斯统计计算的一些内容。在此表示衷心感谢。  本书编写准备过程中,中国科学技术大学统计与金融系的几个研究生帮助完成了本书部分中文的录入和排版,作者对他们的辛勤工作表示真诚的感谢。高等教育出版社为本书的出版给予了大力支持。在此一并致谢。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

异常值检测_您一直想知道的有关异常值检测的信息,但又不敢问

异常值检测Outliers detection is a natural preliminary step in exploratory data analysis for getting the most impacting results in most data science projects. This process consists of eliminating exceptiona...

weixin_26711425的博客 520

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

python稳健性检验_有哪些比较好的做异常值检测的方法?

最近很多小伙伴都比较关注异常值检测的方法,接下来小编就为大家介绍几种,希望能帮到大家!!摘要: 本文介绍了异常值检测的常见四种方法,分别为Numeric Outlier、Z-Score、DBSCA以及Isolation Forest在训练机器学习算法或应用统计技术时,错误值或异常值可能是一个严重的问题,它们通常会造成测量误差或异常系统条件的结果,因此不具有描述底层系统的特征。实际上,最佳做法是在进...

weixin_39604819的博客 1062

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

数据科学中异常值检测和处理的实用指南

通过了解什么是异常值、存在的不同类型以及可用的各种检测和处理方法,您可以显着提高数据质量和机器学习模型的性能。请记住,检测方法的选择取决于数据的性质(单变量或多变量、分布等)以及您怀疑的异常值类型。除了删除和简单的插补之外,最近的研究还侧重于处理异常值的更细致的方法,以保留尽可能多的信息并防止数据泄露或偏见。虽然局部异常值因子 (LOF) 是一种流行的基于邻近度的方法,但更高级的方法使用不同的距离指标来考虑数据分布。是一个稳健的指标,它测量点和分布之间的距离,同时考虑变量之间的相关性。

weixin_42600279的博客 284

机器学习 异常值检测_异常值是否会破坏您的机器学习预测? 寻找最佳解决方案

机器学习 异常值检测 内部AI (Inside AI) In the world of data, we all love Gaussian distribution (also known as a normal distribution). In real-life, seldom we have normal distribution data. It is skewed, missing ...

weixin_26752765的博客 861

手把手教你如何利用K均值聚类实现异常值的识别!

作者 |刘顺祥来源 |数据分析1480(ID:lsxxx2011)前言在上一期的异常值识别《KNN除了可以做分类和预测,还知道它可以识别异常值吗?》中,我们详细分享了...

Python大本营的博客 5679

概率机器学习中的异常检测:从统计方法到深度学习完整指南

异常检测是概率机器学习中至关重要的技术,能够识别与正常模式显著不同的数据点。Kevin Murphy的《概率机器学习》系列书籍提供了从传统统计方法到现代深度学习的完整异常检测实现路径。无论是金融欺诈检测、工业设备故障预警,还是医疗异常诊断,这套系统都能提供可靠的技术支撑。 ## 📊 传统统计异常检测方法 **高斯分布与鲁棒模型**:在存在异常值的情况下,高斯分布比Student-t分布和La

gitblog_01147的博客 1056

数据预处理之基于密度的LOF异常值检测#matlab

基于密度的异常值检测方法LOF(Local Outlier Factor,局部离群因子)是一种经典的异常检测算法,它通过计算数据点相对于其局部邻域的密度偏差来识别异常值。(3)计算局部离群因子(LOF):LOF是一个数据点的局部异常因子,表示该点的局部密度与其邻近点的局部密度之比。量化异常程度:LOF算法不仅可以判断数据点是否为异常值,还可以给出每个数据点的异常程度,便于进一步的分析和处理。解释性:虽然LOF算法可以给出每个数据点的异常程度,但对于异常值的具体原因可能需要进一步的分析和解释。

m0_56619132的博客 1664
上一篇: 简单好用的个人图书管理系统;开源啦!北大NLP新手教程;『Rust命令行编程指南』随书代码;源代码结构可视化工具 | ShowMeAI资讯日报
下一篇: Win10截屏文字识别工具;Rust超全学习指南;助理教授/博士生存指南;Stable Diffussion的Mac本地部署版;前沿论文 | ShowMeAI资讯日报
ShowMeAI
博客等级 码龄5年 6514粉丝 672原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值