【IQR与MAD】原理,一文带你玩转箱型图含详细解释与代码

IQR方法

基于四分位数:使用数据的第一四分位数(25%)和第三四分位数(75%)来计算。
对称:相对于中位数对称地考虑上下界。
受极端值影响:如果数据中包含极端值,IQR可能会被拉得很大,导致异常值的检测不够敏感。

MAD方法

基于中位数:只考虑中位数和每个点的偏差。
稳健:对异常值不敏感,特别适合于含有离群点的数据。
非对称:只考虑偏离中位数的绝对偏差,因此不是关于中位数对称的。

优点比较:

对于含有离群点的数据集:MAD通常更优,因为它对异常值的敏感度低。
对于较为对称分布的数据集:IQR可能更优,因为它可以更好地反映数据的分散程度。

缺点比较:

对于含有极端值的数据集:IQR的敏感性可能导致它不如MAD稳健。
对于非对称分布的数据集:MAD可能不如IQR好,因为它可能不会充分反映数据的实际分布。

总结:

IQR方法

基于四分位数:使用数据的第一四分位数(25%)和第三四分位数(75%)来计算。
对称:相对于中位数对称地考虑上下界。
受极端值影响:如果数据中包含极端值,IQR可能会被拉得很大,导致异常值的检测不够敏感。

MAD方法

基于中位数:只考虑中位数和每个点的偏差。
稳健:对异常值不敏感,特别适合于含有离群点的数据。
非对称:只考虑偏离中位数的绝对偏差,因此不是关于中位数对称的。

优点比较:

对于含有离群点的数据集:MAD通常更优,因为它对异常值的敏感度低。
对于较为对称分布的数据集:IQR可能更优,因为它可以更好地反映数据的分散程度。

缺点比较:

对于含有极端值的数据集:IQR的敏感性可能导致它不如MAD稳健。
对于非对称分布的数据集:MAD可能不如IQR好,因为它可能不会充分反映数据的实际分布。

总结:

如果数据集受到极端值的影响较大,或者含有大量的重复值,MAD可能是一个更好的选择。
如果数据分布较为均匀,没有极端的异常值,IQR可能会更有用。

在这里插入图片描述

四分位数

一组数据按照从小到大顺序排列后,把该组数据四等分的数,称为四分位数。

第一四分位数 (Q1)、第二四分位数 (Q2,也叫“中位数”)和第三四分位数 (Q3)分别等于该样本中所有数值由小到大排列后第25%、第50%和第75%的数字。

第三四分位数与第一四分位数的差距又称四分位距(interquartile range, IQR)。

偏态

与正态分布相对,指的是非对称分布的偏斜状态。在统计学上,众数和平均数之差可作为分配偏态的指标之一:如平均数大于众数,称为正偏态(或右偏态);相反,则称为负偏态(或左偏态)。

箱形图可以用来观察数据整体的分布情况,利用中位数,25/%分位数,75/%分位数,上边界,下边界等统计量来来描述数据的整体分布情况。通过计算这些统计量,生成一个箱体图,箱体包含了大部分的正常数据,而在箱体上边界和下边界之外的,就是异常数据。
判断数据的偏态和尾重

**对于标准正态分布的大样本,**中位数位于上下四分位数的中央,箱形图的方盒关于中位线对称。中位数越偏离上下四分位数的中心位置,分布偏态性越强。异常值集中在较大值一侧,则分布呈现右偏态;异常值集中在较小值一侧,则分布呈现左偏态。

比较多批数据的形状

箱子的上下限,分别是数据的上四分位数和下四分位数。这意味着箱子包含了50%的数据。因此,箱子的宽度在一定程度上反映了数据的波动程度。箱体越扁说明数据越集中,端线(也就是“须”)越短也说明数据集中。

matplotlib参数详解

plt.boxplot(x,                      # x:指定要绘制箱图的数据notch=None,           # notch:是否是凹口的形式展现箱线图,默认非凹口sym=None,              # sym:指定异常点的形状,默认为+号显示vert=None,              # vert:是否需要将箱线图垂直摆放,默认垂直摆放whis=None,             # whis:指定上下须与上下四分位的距离,默认为1.5倍的四分位差positions=None,   # positions:指定箱线图的位置,默认为[0,1,2…]widths=None,         # widths:指定箱线图的宽度,默认为0.5patch_artist=None,        # patch_artist:是否填充箱体的颜色meanline=None,             # meanline:是否用线的形式表示均值,默认用点来表示showmeans=None,       # showmeans:是否显示均值,默认不显示showcaps=None,           # showcaps:是否显示箱线图顶端和末端的两条线,默认显示showbox=None,             # showbox:是否显示箱线图的箱体,默认显示showfliers=None,          # showfliers:是否显示异常值,默认显示boxprops=None,           # boxprops:设置箱体的属性,如边框色,填充色等labels=None,                  # labels:为箱线图添加标签,类似于图例的作用flierprops=None,          # filerprops:设置异常值的属性,如异常点的形状、大小、填充色等medianprops=None,   # medianprops:设置中位数的属性,如线的类型、粗细等meanprops=None,       # meanprops:设置均值的属性,如点的大小、颜色等capprops=None,           # capprops:设置箱线图顶端和末端线条的属性,如颜色、粗细等whiskerprops=None)   # whiskerprops:设置须的属性,如颜色、粗细、线的类型等
import matplotlib.pyplot as plt
import numpy as npnp.random.seed(100)
data = np.random.normal(size=(1000,4),loc=0,scale=1)ax = plt.subplot()
ax.boxplot(data)                                 # 绘图
ax.set_xlim([0,5])                               # 设置x轴值的范围  rotation=30
# ax.set_xticks()  							      # 自定义x轴的值
ax.set_xlabel("xlabel")                  # 设置x轴的标签
ax.set_xticklabels(['A','B','C','D'],  rotation=30,fontsize=10)   # 设置x轴坐标值的标签 旋转角度 字体大小
ax.set_title("xcy")       					  # 设置图像标题
ax.legend(labels= ['A','B','C','D'],loc='best',)  # 增加图例
ax.text(x=0.2 , y=3.5 , s="test" ,fontsize=12)   # 增加注plt.show()

seaborn参数讲解

  • x, y, hue:数据或向量数据中的变量名称
    用于绘制长格式数据的输入。

  • data:DataFrame,数组,数组列表
    用于绘图的数据集。如果x和y都缺失,那么数据将被视为宽格式。否则数据被视为长格式。

  • order, hue_order:字符串列表
    控制分类变量(对应的条形图)的绘制顺序,若缺失则从数据中推断分类变量的顺序。

  • orient:“v”或“h”
    控制绘图的方向(垂直或水平)。这通常是从输入变量的 dtype 推断出来的,但是当“分类”变量为数值型或绘制宽格式数据时可用于指定绘图的方向。

  • color:matplotlib颜色
    所有元素的颜色,或渐变调色板的种子颜色。

  • palette:调色板名称,列表或字典
    用于hue变量的不同级别的颜色。可以从color_palette()得到一些解释,或者将色调级别映射到matplotlib颜色的字典。

  • saturation:float
    控制用于绘制颜色的原始饱和度的比例。通常大幅填充在轻微不饱和的颜色下看起来更好,如果您希望绘图颜色与输入颜色规格完美匹配可将其设置为1。

  • width:float
    不使用色调嵌套时完整元素的宽度,或主要分组变量一个级别的所有元素的宽度。

  • dodge:bool
    使用色调嵌套时,元素是否应沿分类轴移动。

  • fliersize:float
    用于表示异常值观察的标记的大小。

  • linewidth:float
    构图元素的灰线宽度。

  • whis:float
    控制在超过高低四分位数时 IQR (四分位间距)的比例,因此需要延长绘制的触须线段。超出此范围的点将被识别为异常值。

  • notch:boolean
    是否使矩形框“凹陷”以指示中位数的置信区间。还可以通过plt.boxplot的一些参数来控制

  • ax:matplotlib轴
    绘图时使用的 Axes 轴对象,否则使用当前 Axes 轴对象

  • kwargs:键值映射
    其他在绘图时传给plt.boxplot的参数

features_per_row = 25# 计算需要绘制的行数
num_rows = (data.shape[1] + features_per_row - 1) // features_per_row# 对于每个25个特征的区间绘制一个箱形图
for i in range(num_rows):start_col = i * features_per_rowend_col = min(start_col + features_per_row, data.shape[1])data_long = pd.melt(data.iloc[:, start_col:end_col])plt.figure(figsize=(12, 6), dpi=300)  # 设定每个图的大小sns.boxplot(x='variable', y='value', data=data_long)plt.xticks(rotation=90)  # 旋转x轴标签plt.tight_layout()plt.show()

在这里插入图片描述

自动识别异常值并删除

IQR版本

for column in df.select_dtypes(include=[np.number]).columns:Q1 = df[column].quantile(0.25)Q3 = df[column].quantile(0.75)IQR = Q3 - Q1lower_bound = Q1 - 300 * IQRupper_bound = Q3 + 300 * IQR# 确定异常值outliers = df[(df[column] < lower_bound) | (df[column] > upper_bound)]outlier_values = outliers[column].valuesif len(outlier_values)>0:# 打印结果print(IQR)print(f"特征 '{column}' 的异常值数量: {len(outlier_values)}")if len(outlier_values) > 0:print(f"特征 '{column}' 的异常值: {outlier_values}")else:print(f"特征 '{column}' 没有检测到异常值。")print()  

MAD版本

df=data# 定义一个函数来计算MAD
def mad(data, const=0.6745):med = np.median(data)mad = np.median(np.abs(data - med))return mad if mad != 0 else None# 初始化一个空的索引列表,用于存储异常值所在的行
outlier_indices = []# 对DataFrame中的每一列应用MAD方法
for column in df.select_dtypes(include=[np.number]).columns:median = df[column].median()mad_value = mad(df[column])# 只有当MAD值大于0.1时才进行异常值检测if mad_value and mad_value > 0.1:# 设置一个异常值阈值,这里使用的是80倍的MADthreshold = 100 * mad_valuelower_bound = median - thresholdupper_bound = median + threshold# 确定异常值outliers = df[(df[column] < lower_bound) | (df[column] > upper_bound)]outlier_values = outliers[column].values# 如果找到异常值,将它们的索引添加到列表中if len(outlier_values) > 0:outlier_indices.extend(outliers.index.tolist())# 打印结果print(f"特征 '{column}' 的MAD值: {mad_value}")print(f"特征 '{column}' 的异常值数量: {len(outlier_values)}")print(f"特征 '{column}' 的异常值: {outlier_values}")print()# 删除异常值所在的行
df_cleaned = df.drop(index=set(outlier_indices))print(f"删除异常值后的数据行数: {df_cleaned.shape[0]}")

每文一语

细致入微

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/178138.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CMA认证是什么?CMA软件测试报告如何获取?

资格证书在各行各业都是一种专业性象征&#xff0c;如第三方检测机构的CMA认证&#xff0c;在相应的检测报告上加盖CMA章可获得国家以及行业认可&#xff0c;还是享受税收优惠的有力证明材料。 一、CMA认证是什么?   CMA是中国计量认证的简称&#xff0c;由省级以上人民政府…

顺序栈的基本操作(超详细)

目录 前言 一、顺序栈的定义 二、顺序栈的c语言结构描述表示 三、顺序栈中基本操作的实现 3.1顺序栈的初始化 3.2判断顺序栈是否为空 3.3求顺序栈的长度 3.4清空顺序栈 3.5销毁顺序栈 3.6顺序栈的入栈 3.7顺序栈的出栈 3.8求栈顶元素 3.9遍历顺序栈 四、顺序栈的…

JDK21发布了!面试官:来,谈下jdk21的新特性!

1.前言 JDK21 计划23年9月19日正式发布&#xff0c;尽管一直以来都是“版随意出&#xff0c;换 8 算我输”&#xff0c;但这么多年这么多版本的折腾&#xff0c;若是之前的 LTS 版本JDK17你还觉得不错&#xff0c;那 JDK21还是有必要关注一下&#xff0c;因为会有一批重要更新…

华清远见嵌入式学习——C++——作业一

作业要求&#xff1a; 代码&#xff1a; #include <iostream>using namespace std;int main() {string str;cout << "请输入一个字符串&#xff1a;" << endl;getline(cin,str);int dx0,xx0,sz0,kg0,qt0;int len str.size() 1;for(int i0;i<l…

HarmonyOS 传感器开发指南

HarmonyOS 系统传感器是应用访问底层硬件传感器的一种设备抽象概念。开发者根据传感器提供的Sensor接口&#xff0c;可以查询设备上的传感器&#xff0c;订阅传感器数据&#xff0c;并根据传感器数据定制相应的算法开发各类应用&#xff0c;比如指南针、运动健康、游戏等。 运作…

Centos 如何判断分区是mbr还是gpt格式

1 介绍 MBR 自20世纪80年代初以来的标准分区表格式每个驱动器最多支持四个主分区最多可以划分2TB的磁盘 GPT GPT是MBR分区表格式的后续每个驱动器最多支持128个分区可以将一个磁盘分区到最大到18艾字节 对小于2TB的磁盘使用MBR对大于2TB的磁盘使用GTP 2 查询方式 2.1 fdis…

校园虚拟化部署与横向扩展统一存储

项目背景 这所隶属教育部直属重点大学&#xff0c;学校设有11个学科体系&#xff0c;现有本硕博学生共29000余人&#xff0c;为积极响应“中国教育现代化2023战略部署”&#xff0c;校方制定教育信息化2.0发展目标&#xff0c;通过平台融合&#xff0c;数据驱动、技术赋能等措…

Linux常见指令基础知识

目录 初始Linux操作系统 Linux背景&#xff1a; 开源 &#xff1a; 发行版本&#xff1a; ​编辑 OS概念&#xff0c;定位&#xff1a; 使用 XShell 远程登录 Linux Linux相关知识 文件是什么&#xff1f; 路径分隔符 &#xff08;.&#xff09; 和 &#xff08;. .&…

Docker Swarm总结+Jenkins安装配置与集成(5/5)

博主介绍&#xff1a;Java领域优质创作者,博客之星城市赛道TOP20、专注于前端流行技术框架、Java后端技术领域、项目实战运维以及GIS地理信息领域。 &#x1f345;文末获取源码下载地址&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb;…

反射、枚举以及lambda表达式

1. 反射 1.1 定义 java的.class文件在运行时会被编译为一个Class对象&#xff0c;既然是对象&#xff0c;那么我们就可以通过一定的方式取到这个对象&#xff0c;然后对于这个对象进行一系列操作&#xff08;改变原本类的属性、方法&#xff09;。 这个操作就是反射&#xf…

数据仓库建模下篇

在实际业务中&#xff0c;给了我们一堆数据&#xff0c;我们怎么拿这些数据进行数仓建设呢&#xff0c;数仓工具箱作者根据自身多年的实际业务经验&#xff0c;给我们总结了如下四步。 数仓工具箱中的维度建模四步走&#xff1a; 维度建模四步走 这四步是环环相扣&#xff0c…

JOSEF 可调漏电继电器 RT-L1KS φ25mm 导轨或面板安装

RT-L系列可调漏电继电器&#xff08;以下简称继电器&#xff09;适用于交流电压至690V&#xff0c;频率为50Hz&#xff0c;电流至1500A及以下漏电继电器中性点接地电路中。 RT-L系列可调型漏电继电器 RT-L1K可调型漏电继电器 RT-L2K可调型漏电继电器 RT-L3K可调型漏电继电器…

Mybaits-plus的使用

MybatisPlus特性 润物无声&#xff1a; 只做增强不做改变&#xff0c;引入它不会对现有工程产生改变&#xff0c;如丝般顺滑。 效率至上 只需简单配置&#xff0c;即可快速进行单表CRUD操作&#xff0c;从而节省大量时间。 使用MybatisPlus依赖基本步骤 引入MybatisPlus依…

echarts点击事件

有这么个需求要点击叶片的时候跳转页面 代码&#xff1a;点击之后 报错了 解决办法 1、使用箭头函数&#xff08;箭头函数没有自己的 this&#xff0c;所以在箭头函数中使用 this 时&#xff0c;其指向与外层作用域相同。&#xff09;或者使用闭包来解决上下文的问题。 2、使…

微信可以添加多少好友?

不知道有没有小伙伴好奇&#xff0c;微信到底可以添加多少好友&#xff1f;正好这个话题也上热搜了&#xff0c;我们就来了解一下。 有网友表示&#xff0c;自己的微信好友数量有10004个&#xff0c;已经不能再添加新的微信好友了。 一个微信号&#xff0c;可以添加的好友上限…

初识Linux(2).妈妈再也不用担心我Linux找不到门了。

文章目录 前言 1.man指令&#xff08;重要&#xff09;&#xff1a;例如&#xff1a; 2.cp指令&#xff08;重要&#xff09;&#xff1a;例如&#xff1a;把123.txt复制到a目录中类似window如下操作&#xff1a; 3.mv例如&#xff1a;类似window如下操作&#xff1a; 4.nano例…

算法效率的度量

算法效率的度量通常是通过时间复杂度和空间复杂度来描述的。 一、时间复杂度 算法中所有语句的执行次数之和为T(n)&#xff0c;它是算法问题规模n的函数&#xff0c;时间复杂度主要分析T(n)的数量级。 分类 1. 最好时间复杂度&#xff1a;最好情况下&#xff0c;算法的时间…

山西临县“5·7”火灾事故调查报告公布,揭秘富维烟火报警系统

近日&#xff0c;山西临县“57”火灾事故调查报告震惊全国&#xff0c;提醒我们火灾防控的重要性。在这起悲剧中&#xff0c;我们深刻认识到&#xff0c;及时发现火灾并迅速应对至关重要。这不仅是对生命安全的保护&#xff0c;也是对财产损失的有效减少。而在这方面&#xff0…

sCrypt 现已支持各类主流前端框架

sCrypt 现已支持各类主流前端框架&#xff0c;包括&#xff1a; ReactNext.jsAngularSvelteVue 3.x or 2.x bundled with Vite or Webpack 通过在这些支持的前端框架中集成sCrypt开发环境&#xff0c;你可以直接在前端项目里访问合约实例和调用合约&#xff0c;方便用户使用Se…

UE5 - 虚幻引擎各模块流程图

来自虚幻官方的一些资料&#xff0c;分享一下&#xff1b; 一些模块的流程图&#xff0c;比如动画模块&#xff1a; 或角色相关流程&#xff1a; 由于图片比较大&#xff0c;上传到了网络&#xff0c;可自取&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1BQ2KiuP08c…