python异常值检测和处理_【Python实战】单变量异常值检测
【Python实战】单变量异常值检测
异常值检测是数据预处理阶段重要的环节,这篇文章介绍下对于单变量异常值检测的常用方法,通过Python代码实现。
一、什么是异常值
异常值是在数据集中与其他观察值有很大差距的数据点,它的存在,会对随后的计算结果产生不适当的影响,因此检测异常值并加以适当的处理是十分必要的。
二、异常值的处理
异常值并不都是坏的,了解这一点非常重要。只是简单地从数据中删除异常值,而不考虑它们如何影响结果的话,可能会导致灾难。
“异常值不一定是坏事。这些只是与其他模式不一致的观察。但事实上异常值非常有趣。例如,如果在生物实验中,某只老鼠没有死亡而其他老鼠都死了,去了解为什么将会非常有趣。这可能会带来新的科学发现。因此,检测异常值非常重要。” —— Pierre Lafaye de Micheaux,统计师
对于异常值,一般有如下几种处理:
删除含有异常值的记录(是否删除根据实际情况考虑)
将异常值视为缺失值,利用缺失值的处理方法进行处理
平均值修正(前后两个观测值的平均值)
不处理(直接在具有异常值的数据集上进行挖掘)
三、异常值的类型
异常值有两种类型:单变量和多变量(Univariate and Multivariate)。单变量异常值是仅由一个变量中的极值组成的数据点,而多变量异常值是至少两个变量的组合异常分数。假设您有三个不同的变量 - X,Y,Z。如果您在三维空间中绘制这些变量的图形,它们应该形成一种云。位于此云之外的所有数据点都将是多变量异常值。
举个例子:做客户分析,发现客户的年平均收入是80万美元。但是,有两个客户的年收入是4美元和420万美元。这两个客户的年收入明显不同于其他人,那这两个观察结果将被视为异常值,并且是单变量异常值,当我们看到单变量的分布时,可以找到这些异常值。
再举个例子:身高和体重之间的关系。我们对“身高”和“体重”有单变量和双变量分布,如下图所示。
看箱线图(box plot后面会介绍)没有任何异常值,再看散点图(scatter plot),有两个值在一个特定的身高和体重的平均值以下。可见多变量异常值是n维空间中的异常值,必须通过多维度的分布才能体现出来。
如果对异常值不太了解,可以阅读这篇《数据探索指南》,上述部分解释也是从中摘录的。
下面,我主要记录下单变量异常值检测的Python实现。
四、常用异常检测方法
原则上模拟数据集需要样本量足够大,这里仅是演示算法,所以就手动写了有限的样本。
异常值的测量标准有很多,比较常见的是描述性统计法、三西格玛法(3σ法)、箱线图等:
1. 描述性统计
基于常识或经验,假定我们认为大于10的数值是不符合常理的。
下面用Python代码实现用描述性统计求异常值:
# -*- coding: utf-8 -*-
data = [2.78, 1.79, 4.73, 3.81, 2.78, 1.80, 4.81, 2.79, 1.78, 3.32, 10.8, 100.0]
threshold = 10
# 定义描述性统计识别异常值函数
def descriptive_statistics(data):
return list(filter(lambda x: x > threshold, data))
outliers = descriptive_statistics(data)
print('异常值共有:{0}个,分别是:{1}'.format(len(outliers), outliers))
# 输出:异常值共有:2个,分别是:[10.8, 100.0]
2. 三西格玛(3σ)
当数据服从正态分布时,99%的数值应该位于距离均值3个标准差之内的距离,P(|x−μ|>3σ)≤0.003,当数值超出这个距离,可以认为它是异常值。
正态分布状况下,数值分布表:
数值分布
在数据中的占比
(μ-σ,μ+σ)
0.6827
(μ-2σ,μ+2σ)
0.9545
(μ-3σ,μ+3σ)
0.9973
注:在正态分布中σ代表标准差,μ代表均值,x=μ为图形的对称轴
下面用Python代码实现用三西格玛求异常值:
# -*- coding: utf-8 -*-
import pandas as pd
import numpy as np
data = [2.78, 1.79, 4.73, 3.81, 2.78, 1.80, 4.81, 2.79, 1.78, 3.32, 10.8, 100.0]
# 定义3σ法则识别异常值函数
def three_sigma(data_series):
rule = (data_series.mean() - 3 * data_series.std() > data_series) | (data_series.mean() + 3 * data_series.std() < data_series)
index = np.arange(data_series.shape[0])[rule]
outliers = data_series.iloc[index]
return outliers.tolist()
data_series = pd.Series(data)
outliers = three_sigma(data_series)
print('异常值共有:{0}个,分别是:{1}'.format(len(outliers), outliers))
# 输出:异常值共有:1个,分别是:[100.0]
3. 箱线图(box plot)
和3σ原则相比,箱线图依据实际数据绘制,真实、直观地表现出了数据分布的本来面貌,且没有对数据作任何限制性要求(3σ原则要求数据服从正态分布或近似服从正态分布)。
其判断异常值的标准以四分位数和四分位距为基础。四分位数给出了数据分布的中心、散布和形状的某种指示,具有一定的鲁棒性,即25%的数据可以变得任意远而不会很大地扰动四分位数,所以异常值通常不能对这个标准施加影响。鉴于此,箱线图识别异常值的结果比较客观,因此在识别异常值方面具有一定的优越性。
箱线图提供了识别异常值的一个标准,即:
上界 = Q3 + 1.5IQR
下界 = Q1 - 1.5IQR
小于下界或大于上界的值即为异常值。
其中,
Q3称为上四分位数(75%),表示全部观察值中只有四分之一的数据取值比它大;
Q1称为下四分位数(25%),表示全部观察值中只有四分之一的数据取值比它小;
IQR称为四分位数差,这里就是 Q3-Q1;
1.5其实是个参数λ,这个参数通常取1.5(类似于正态分布中的μ±λ)
文字描述可能比较绕,下面用图片来解释下。
第一四分位数 (Q1),又称“较小四分位数”,等于该样本中所有数值由小到大排列后第25%的数字。
第二四分位数 (Q2),又称“中位数”,等于该样本中所有数值由小到大排列后第50%的数字。
第三四分位数 (Q3),又称“较大四分位数”,等于该样本中所有数值由小到大排列后第75%的数字。
Q3与Q1的差距又称四分位距(InterQuartile Range,IQR)。
下面用Python代码实现用箱线图求异常值:
# -*- coding: utf-8 -*-
import pandas as pd
data = [2.78, 1.79, 4.73, 3.81, 2.78, 1.80, 4.81, 2.79, 1.78, 3.32, 10.8, 100.0]
# 定义箱线图识别异常值函数
def box_plot(data_series):
q_abnormal_low = data_series.quantile(0.25) - 1.5 * (data_series.quantile(0.75) - data_series.quantile(0.25))
q_abnormal_up = data_series.quantile(0.75) + 1.5 * (data_series.quantile(0.75) - data_series.quantile(0.25))
index = (data_series < q_abnormal_low) | (data_series > q_abnormal_up)
outliers = data_series.loc[index]
return outliers.tolist()
sorted_data = sorted(data)
data_series = pd.Series(sorted_data)
outliers = box_plot(data_series)
print('异常值共有:{0}个,分别是:{1}'.format(len(outliers), outliers))
# 输出:异常值共有:2个,分别是:[10.8, 100.0]
五、总结
以上是最基础的几种单变量异常值检测方法,没有最好的,只有对当前数据场景最合适的。
后期如果涉及机器学习的数据预处理,我会继续学习和研究多变量异常值的检测,相信会有更有意思的一些算法等着我去学习。
python异常值检测和处理_【Python实战】单变量异常值检测相关推荐
- python人工智能方向面试准备_人工智能实战就业(面试)学习路线图
这个项目是干什么的? 整理这个项目的初衷是方便同学们快速开启人工智能自学计划,在学习过程中少走弯路用最快的效率入门Ai并开始实战项目, 提供了近200个Ai实战案例和项目,这些并不是网上搜集来的,而是 ...
- 11小时 python自动化测试从入门到_自动化测试实战宝典(Robot Framework+Python从小工到专家)...
目录 第1部分 入门篇 第1章 大话测试行业 1.1 测试行业现状分析 1.2 未来发展趋势 1.3 测试工程师的核心竞争力 1.4 测试知识体系 1.5 测试发展能力图谱及推荐书单 1.6 本章总结 ...
- python嵩天课堂笔记_[Python机器学习]强化学习笔记(嵩天礼欣老师mooc第三周)
[Python机器学习]强化学习笔记(嵩天礼欣老师mooc第三周) [Python机器学习]强化学习笔记(嵩天礼欣老师mooc第三周) 目录 强化学习 定义 马尔科夫决策过程 基本元素 值函数 最优值 ...
- 四全集学python选哪种电脑_“Python教程哪个版本最适合学习?“python教程全集
python教程,求一套比较好的python教程 好不好主要先看你自己,理解能力样,有没有接触过编程,有没础,这很重要: 看教程,能不能先给你建立起知识体系框架,许多教程一上来就直接给你灌输知识很让人 ...
- python如何设置字体大小_[Python Basic]如何设置 Python 的运行环境
一如既往地, 咱们不仅仅是学习 Python 的基础知识, 同时, 也按照2/8 规律学习关键知识的关键部分 - python 核心词汇 如何安装 Python 下载 Python 打开网址:http ...
- python小软件制作教程_[Python]手把手教程:Python制作番茄钟
这篇文章是根据Udacity的免费课程 编程基础:Python所做的笔记,适合零基础学习Python 我们先了解这个番茄钟的概念,就是每隔一段固定的时间就提醒你休息一下,可能是播放一段音乐, 弹出一个 ...
- python如何检验显著性差异_[Python] 如何证明两组样本有显著性差异(t-test假设检验) | 学步园...
现有两组样本数据,假如它们分别基于两套不同的方法,或者测于不同的设备,又或是出自两个人之手,如何证明它们有或没有显著性差别呢?当然可以拿个Excel表把数据画个图,然后找一堆人来投票,看觉得差不多还是 ...
- python信用卡违约预测分析_数据挖掘实战(1):信用卡违约率分析
在数据挖掘的过程中,我们经常会遇到一些问题,比如:如何选择各种分类器,到底选择哪个分类算法,是 SVM,决策树,还是 KNN?如何优化分类器的参数,以便得到更好的分类准确率? 这两个问题,是数据挖掘核 ...
- python定位二维码_图像中二维码的检测和定位
二维码 二维条码/二维码(2-dimensional bar code)是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的:在代码编制上巧妙地利用构成计算机内部 ...
最新文章
- 异常检测算法:Isolation Forest
- Hexo+github搭建个人博客-环境搭建篇
- 游戏行业案例 | 99.7% 的充值玩家比例提升,从何而来?
- JavaWeb第一讲 Servlet的工作原理及生命周期
- jzoj3385-黑魔法之门【并差集】
- 《01》ECMAScript 6 简介
- java number转string_Java Number类, Character类,String类
- BugkuCTF-Reverse题逆向入门
- vuex中的值变化 页面重新渲染_浅谈浏览器的渲染过程,重绘与回流
- 字符串处理 —— 单模式匹配 —— 朴素的字符串匹配算法(BF 算法)
- 洛谷P4482 [BJWC2018]Border 的四种求法 字符串,SAM,线段树合并,线段树,树链剖分,DSU on Tree...
- Amoeba-mysql开源项目高可用读写分离
- 公开说说别人看不到_空间设置了权限说说所有人可见
- 【BZOJ3168】[Heoi2013]钙铁锌硒维生素 高斯消元求矩阵的逆+匈牙利算法
- 2020《人工智能技术服务》专业人才培养方案
- c语言更改记事本改为大写,pdf英文字母小写改大写怎么改
- elasticsearch使用7大原则,轻松玩转ES
- bulk这个词的用法_bulk是什么意思_bulk的翻译_音标_读音_用法_例句_爱词霸在线词典...
- 震惊!英伟达 4 月的发布会全部是合成的
- 哈佛大学开放课程:《公正:该如何做是好?》6