【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实战】单变量异常值检测相关推荐

  1. python人工智能方向面试准备_人工智能实战就业(面试)学习路线图

    这个项目是干什么的? 整理这个项目的初衷是方便同学们快速开启人工智能自学计划,在学习过程中少走弯路用最快的效率入门Ai并开始实战项目, 提供了近200个Ai实战案例和项目,这些并不是网上搜集来的,而是 ...

  2. 11小时 python自动化测试从入门到_自动化测试实战宝典(Robot Framework+Python从小工到专家)...

    目录 第1部分 入门篇 第1章 大话测试行业 1.1 测试行业现状分析 1.2 未来发展趋势 1.3 测试工程师的核心竞争力 1.4 测试知识体系 1.5 测试发展能力图谱及推荐书单 1.6 本章总结 ...

  3. python嵩天课堂笔记_[Python机器学习]强化学习笔记(嵩天礼欣老师mooc第三周)

    [Python机器学习]强化学习笔记(嵩天礼欣老师mooc第三周) [Python机器学习]强化学习笔记(嵩天礼欣老师mooc第三周) 目录 强化学习 定义 马尔科夫决策过程 基本元素 值函数 最优值 ...

  4. 四全集学python选哪种电脑_“Python教程哪个版本最适合学习?“python教程全集

    python教程,求一套比较好的python教程 好不好主要先看你自己,理解能力样,有没有接触过编程,有没础,这很重要: 看教程,能不能先给你建立起知识体系框架,许多教程一上来就直接给你灌输知识很让人 ...

  5. python如何设置字体大小_[Python Basic]如何设置 Python 的运行环境

    一如既往地, 咱们不仅仅是学习 Python 的基础知识, 同时, 也按照2/8 规律学习关键知识的关键部分 - python 核心词汇 如何安装 Python 下载 Python 打开网址:http ...

  6. python小软件制作教程_[Python]手把手教程:Python制作番茄钟

    这篇文章是根据Udacity的免费课程 编程基础:Python所做的笔记,适合零基础学习Python 我们先了解这个番茄钟的概念,就是每隔一段固定的时间就提醒你休息一下,可能是播放一段音乐, 弹出一个 ...

  7. python如何检验显著性差异_[Python] 如何证明两组样本有显著性差异(t-test假设检验) | 学步园...

    现有两组样本数据,假如它们分别基于两套不同的方法,或者测于不同的设备,又或是出自两个人之手,如何证明它们有或没有显著性差别呢?当然可以拿个Excel表把数据画个图,然后找一堆人来投票,看觉得差不多还是 ...

  8. python信用卡违约预测分析_数据挖掘实战(1):信用卡违约率分析

    在数据挖掘的过程中,我们经常会遇到一些问题,比如:如何选择各种分类器,到底选择哪个分类算法,是 SVM,决策树,还是 KNN?如何优化分类器的参数,以便得到更好的分类准确率? 这两个问题,是数据挖掘核 ...

  9. python定位二维码_图像中二维码的检测和定位

    二维码 二维条码/二维码(2-dimensional bar code)是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的:在代码编制上巧妙地利用构成计算机内部 ...

最新文章

  1. 异常检测算法:Isolation Forest
  2. Hexo+github搭建个人博客-环境搭建篇
  3. 游戏行业案例 | 99.7% 的充值玩家比例提升,从何而来?
  4. JavaWeb第一讲 Servlet的工作原理及生命周期
  5. jzoj3385-黑魔法之门【并差集】
  6. 《01》ECMAScript 6 简介
  7. java number转string_Java Number类, Character类,String类
  8. BugkuCTF-Reverse题逆向入门
  9. vuex中的值变化 页面重新渲染_浅谈浏览器的渲染过程,重绘与回流
  10. 字符串处理 —— 单模式匹配 —— 朴素的字符串匹配算法(BF 算法)
  11. 洛谷P4482 [BJWC2018]Border 的四种求法 字符串,SAM,线段树合并,线段树,树链剖分,DSU on Tree...
  12. Amoeba-mysql开源项目高可用读写分离
  13. 公开说说别人看不到_空间设置了权限说说所有人可见
  14. 【BZOJ3168】[Heoi2013]钙铁锌硒维生素 高斯消元求矩阵的逆+匈牙利算法
  15. 2020《人工智能技术服务》专业人才培养方案
  16. c语言更改记事本改为大写,pdf英文字母小写改大写怎么改
  17. elasticsearch使用7大原则,轻松玩转ES
  18. bulk这个词的用法_bulk是什么意思_bulk的翻译_音标_读音_用法_例句_爱词霸在线词典...
  19. 震惊!英伟达 4 月的发布会全部是合成的
  20. 哈佛大学开放课程:《公正:该如何做是好?》6

热门文章

  1. oa crm erp
  2. Oracle调优之Hint用法整理笔记
  3. 叩丁狼分享—培训实战教程之浅谈过滤器Filter
  4. 行!看到抖音上 Python 程序员晒得工资条,我沉默了
  5. 关于浏览器兼容问题及hack写法
  6. JVE非我全“芯”出击,多款越级新品即将发布
  7. windows安装yum
  8. Vue全家桶+SSR+Koa2全栈开发美团网⑧——首页登录注册
  9. ArcGIS实验教程——实验二十四:人口密度制图
  10. java double 精度范围_float 和 double 范围和精度