Python数据预处理之异常值的处理——【自定义的three_sigma()函数、boxplot()方法】

文章目录

  • 基于3σ原则检测异常值
    • 代码实现
    • 测试
  • 基于箱型图检测异常值
  • 异常值的处理


基于3σ原则检测异常值

3σ原则,又称拉依达准则。是指假设一组检测数据只含有随机误差。对其进行计算处理得到标准偏差,按一定概率确定一个区间,凡是超过这个区间的误差都是粗大误差,在此误差范围内的数据应予以剔除。

正态分布概率公式中,σ表示标准差,μ表示平均数,f(x)表示正态分布函数。

正态分布公式
在这里插入图片描述

正态曲线下,

横轴区间(μ-σ,μ+σ)内的面积为68.268949%。

P{|X-μ|<σ}=2Φ(1)-1=0.6826

横轴区间(μ-2σ,μ+2σ)内的面积为95.449974%。

P{|X-μ|<2σ}=2Φ(2)-1=0.9544

横轴区间(μ-3σ,μ+3σ)内的面积99.730020%。

P{|X-μ|<3σ}=2Φ(3)-1=0.9974

由于“小概率事件”和假设检验的基本思想 “小概率事件”通常指发生的概率小于5%的事件,认为在一次试验中该事件是几乎不可能发生的。

由上可知,X落在(μ-3σ,μ+3σ)以外的概率小于千分之三,在实际问题中常认为相应的事件是不会发生的,基本上可以把区间(μ-3σ,μ+3σ)看作是随机变量X实际可能的取值区间,超过这个区间的就属于异常值,应予以剔除。


代码实现

import numpy as np
import pandas as pddef three_sigma(ser1):  # ser1表示传入DataFrame的某一列mean_value = ser1.mean()  # 求平均值std_value = ser1.std()  # 求标准差rule = (mean_value - 3 * std_value > ser1) | (ser1.mean() + 3 * ser1.std() < ser1)# 位于(u-3std,u+3std)区间的数据是正常的,不在这个区间的数据为异常的# 一旦发现有异常值,就标注为True,否则标注为Falseindex = np.arange(ser1.shape[0])[rule]  # 返回异常值的位置索引outrange = ser1.iloc[index]  # 获取异常数据return outrange

测试

将符合正态分布的包含异常值的测试数据保存在D:\数据分析\data.xlsx中。使用Pandas的read_excel()函数从文件中读取数据,并转换为DataFrame对象。之后分别对data中的A列数据和B列数据进行检测。

data = pd.read_excel(r'D:\数据分析\data.xlsx')
print(data)
print(three_sigma(data['A']))
print(three_sigma(data['B']))

输出结果:

    Unnamed: 0    A  B
0            0    1  2
1            1    2  3
2            2    3  8
3            3    4  5
4            4    5  6
5            5  560  7
6            6    2  8
7            7    3  9
8            8    4  0
9            9    5  3
10          10    3  4
11          11    2  5
12          12    4  6
13          13    5  7
14          14    5  2
15          15   23  4
16          16    2  55    560
Name: A, dtype: int64Series([], Name: B, dtype: int64)

基于箱型图检测异常值

箱型图是一种用作显示一组数据分散情况的统计图。在箱型图中,异常值通常被定义为小于QL-1.5QR或大于QU+1.5IQR的值。其中:

QL:下四分位数,表示全部观察值中有四分之一的数据取值比它大。

QU:上四分位数,表示全部观察值中有四分之一的数据取值比它小。

IQR:四分位数间距,是QU与QL之差,其间包含了全部观察值的一半。


箱型图是根据实际数据进行绘制,对数据没有任何要求(3σ原则要求数据服从正态分布或近似正态分布)。箱型图判断异常值的标准是以四分位数和四分位距为基础的。

Pandas中提供了一个专门用来绘制箱型图的boxplot()方法。

df = pd.DataFrame({'A': [1, 2, 3, 4],'B': [2, 3, 4, 5],'C': [1, 4, 7, 4],'D': [1, 5, 30, 3]})
print(df.boxplot(column=['A', 'B', 'C', 'D']))

输出结果:
在这里插入图片描述


异常值的处理

检测出异常值后,通常会才用如下四种方式处理这些异常值:

1、直接将含有异常值的记录删除

2、用具体的值来进行替换,可用前后两个观测值的平均值修正该异常值

3、不处理,直接在具有异常值的数据集上进行统计分析

4、视为缺失值,利用缺失值的处理方法修正该异常值

异常数据被检测出来之后,需要进一步确认他们是否为真正的异常值,等确认完以后再决定选用哪种方法进行解决。

如果希望对异常值进行修改(执行操作2),则可以使用Pandas中replace()方法进行替换,该方法不仅可以对单个数据进行替换,也可以多个数据执行批量替换操作。

replace(to_replace=None, value=None, inplace=False, limit=None, regex=False, method=‘pad’)

部分参数:

to_replace:表示查找被替换值的方式

value:用来替换任何匹配to_replace的值,默认值为None

limit:表示前向或后向填充的最大尺寸间隙

regex:接收布尔值或与to_replace相同的类型,默认为False,表示是否将to_replace和value解释为正则表达式

method:替换时使用的方法,pad/ffill表示前向填充,bfill表示后向填充


replace()方法的使用

print(df.replace(to_replace=30, value=3))
print(data.replace(to_replace=data.loc[5, ['A']], value=6))

输出结果:

AxesSubplot(0.125,0.11;0.775x0.77)A  B  C  D
0  1  2  1  1
1  2  3  4  5
2  3  4  7  3
3  4  5  4  3Unnamed: 0   A  B
0            0   1  2
1            1   2  3
2            2   3  8
3            3   4  5
4            4   5  6
5            5   6  7
6            6   2  8
7            7   3  9
8            8   4  0
9            9   5  3
10          10   3  4
11          11   2  5
12          12   4  6
13          13   5  7
14          14   5  2
15          15  23  4
16          16   2  5

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

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

相关文章

那个谷歌的网红扔鸡蛋的题,来看看教科书式的回答

leetcode顶级难题&#xff0c;谷歌面试天天问&#xff0c;来看看吧&#xff0c;带你来一步一步达到最优解。 谷歌不知道问了多少遍&#xff0c;蓝桥杯也出现过&#xff0c;leetcode上是顶级难题&#xff0c;到底是什么题能如此频繁地出现&#xff1f;我们一探究竟吧。 原题描述…

Python更改数据类型——astype()方法和to_numeric()函数

文章目录明确指定数据的类型通过dtypes属性进行查看创建Pandas对象指定数据类型转换数据类型通过astype()方法强制转换数据的类型通过to_numeric()函数转换数据类型明确指定数据的类型 通过dtypes属性进行查看 import pandas as pddf pd.DataFrame({A: [1, 2, 4],B: [9, -80…

不骗你,没读这一篇,你不可能懂二分

上篇文章讲动态规划获得了80k浏览&#xff0c;这次的二分也值得你们一看&#xff0c;这个系列是特别用心写的&#xff0c;准备出书的哦 动态规划 3.0 引子 图书馆自习的时候,一女生背着一堆书进阅览室,结果警报响了,大妈让女生看是哪本书把警报弄响了&#xff0c;女生把书倒出…

Python之数据合并——【concat()函数、merge()函数、join()方法、combine_first()方法】

文章目录轴向堆叠数据——concat()函数横向堆叠与外连接纵向堆叠与内连接主键合并数据——merge()函数内连接方式外连接方式左连接方式右连接方式其他根据行索引合并数据——join()方法四种连接方式行索引与列索引重叠合并重叠数据——combine_first()方法轴向堆叠数据——conc…

超硬核!操作系统学霸笔记,考试复习面试全靠它

之后会发布基于基础知识的大部分算法的模拟代码合集&#xff0c;敬请关注。 进程基础 进程的基本概念 程序顺序执行的特征&#xff1a; 1&#xff09;顺序性&#xff1a;处理机严格按照程序所规定的顺序执行&#xff0c;每一步操作必须在下一步操作开始前执行 2&#xff09;封…

配置tomcat6.0的HTTPS(单向)

利用JDK自带的产生证书的工具 生成证书 建立一个脚本文件&#xff0c;内容如下&#xff1a; set SERVER_DN"CNServer, OUshare, Oshare, Lsz, Sgd, CCN" set CLIENT_DN"CNClient, OUshare, Oshare, Lsz, Sgd, CCN" set KS_PASS-storepass changeit set KE…

Python之数据重塑——【stack()方法和unstack()方法、pivot()方法】

文章目录重塑层次化索引对于单层索引的DataFrame类对象stack()方法unstack()方法对于多层索引的DataFrame类对象辨析操作内层索引与外层索引的区别查看多层索引对象转换后的类型轴向旋转——pivot()方法重塑层次化索引 Pandas中重塑层次化索引的操作主要是stack()方法和unstac…

超硬核!学霸把操作系统经典算法给敲完了!要知行合一

上期的笔记&#xff0c;浏览快1万了&#xff0c;既然关注的人很多&#xff0c;那就发出来承诺过的算法全模拟&#xff0c;希望帮到你们。 上期的操作系统学霸笔记&#xff0c;考试复习面试全靠它 一、模拟进程调度 功能 data.h #ifndef _Data_h_ #define _Data_h_#include …

Python之数据转换——【rename()方法、cut()函数、get_dummies()函数】

文章目录重命名轴索引离散化连续数据哑变量处理类别型数据重命名轴索引 rename( self, mapper: Optional[Renamer] None, *, index: Optional[Renamer] None, columns: Optional[Renamer] None, axis: Optional[Axis] None, copy: bool True, inplace: bool False, level…

超硬核!数据结构学霸笔记,考试面试吹牛就靠它

上次发操作系统笔记&#xff0c;很快浏览上万&#xff0c;这次数据结构比上次硬核的多哦&#xff0c;同样的会发超硬核代码&#xff0c;关注吧。 超硬核&#xff01;操作系统学霸笔记&#xff0c;考试复习面试全靠它 第一次笔记&#xff08;复习c&#xff0c;课程概述&#xff…

Python之数据拆分——groupby()方法

文章目录groupby()方法通过列名进行分组通过Series对象进行分组Series对象与原数据的行索引长度相等Series对象与原数据的行索引长度不等通过字典进行分组按照columns轴的方向进行分组按照index轴的方向进行分组通过函数进行分组groupby()方法 groupby( self, byNone, axis0, l…

超硬核!小白读了这篇文章,就能在算法圈混了

作为一只超级硬核的兔子&#xff0c;从来不给你说废话&#xff0c;只有最有用的干货&#xff01;这些神级算法送给你 目录 第一节 1.1bogo排序 1.2位运算 1.3打擂台 1.4morris遍历 第二节 2.1睡眠排序 2.2会死的兔子 2.3矩阵快速幂 2.4摔手机/摔鸡蛋 时空复杂度目录 …

Python之数据聚合——aggregate()方法

文章目录使用内置统计方法聚合数据面向列的聚合方法aggregate()方法对每一列数据应用同一个函数对某列数据应用不同的函数对不同列数据应用不同函数使用内置统计方法聚合数据 实现数据拆分成组并分别计算平均数的操作 代码&#xff1a; import pandas as pd import numpy as…

超硬核十万字!全网最全 数据结构 代码,随便秒杀老师/面试官,我说的

本文代码实现基本按照《数据结构》课本目录顺序&#xff0c;外加大量的复杂算法实现&#xff0c;一篇文章足够。能换你一个收藏了吧&#xff1f; 当然如果落下什么了欢迎大家评论指出 目录 顺序存储线性表实现 单链表不带头标准c语言实现 单链表不带头压缩c语言实现 约瑟…

Python之分组级运算——【transform()方法、apply()方法】

文章目录数据转换——transform()方法数据应用——apply()方法数据转换——transform()方法 使用aggregate()方法进行聚合运算已经在上一篇博客中详细阐述&#xff0c;我们知道aggregate()方法返回的数据集的形状&#xff08;shape&#xff09;与被分组的数据集的形状是不同的…

java限制在同一台电脑上只允许有一个用户登录系统

在web应用系统中&#xff0c;出于安全性考虑&#xff0c;经常需要对同一客户端登录的用户数量和一个客户同时在多个客户端登陆进行限制。 具体一点就是&#xff1a; 1、在同一台电脑上一次只允许有一个用户登录系统&#xff1b; 2、一个用户在同一时间只允许在一个客户端登录…

Matplotlib——绘制图表

文章目录通过figure()函数创建画布通过subplot()函数创建单个子图通过subplots()函数创建多个子图通过add_subplot()方法添加和选中子图添加各类标签绘制常见图表绘制直方图——hist()函数绘制散点图——scatter()函数绘制柱状图——bar()函数设定线条的相关参数本地保存图片通…

限制在同一台电脑上只允许有一个用户登录系统

在web应用系统中&#xff0c;出于安全性考虑&#xff0c;经常需要对同一客户端登录的用户数量和一个客户同时在多个客户端登陆进行限制。 具体一点就是&#xff1a; 1、在同一台电脑上一次只允许有一个用户登录系统&#xff1b; 2、一个用户在同一时间只允许在一个客户端登录…

Seaborn——绘制统计图形

文章目录可视化数据的分布绘制单变量分布绘制双变量分布绘制成对的双变量分布用分类数据绘图类别散点图通过stripplot()函数画散点图swarmplot()函数类别内的数据分布绘制箱型图绘制提琴图类别内的统计估计绘制条形图绘制点图可视化数据的分布 绘制单变量分布 一般采用最简单…

Bokeh——交互式可视化库

文章目录前言如何通过Plotting绘制图形前言 Bokeh是一个专门针对Web浏览器使用的交互式可视化库&#xff0c;这是与其他可视化库相比最核心的区别。 如何通过Plotting绘制图形 Plotting是以构建视觉符号为核心的接口&#xff0c;可以结合各种视觉元素&#xff08;例如&#x…