作者 | 刘顺祥

来源 | 数据分析1480

原文 |Python数据清洗--缺失值识别与处理

在《Python数据清洗(一):类型转换和冗余数据删除》和《Python数据清洗(二):缺失值识别与处理》文中已经讲解了有关数据中重复观测和缺失值的识别与处理,在本节中将分享异常值的判断和处理方法。

异常值也称为离群点,就是那些远离绝大多数样本点的特殊群体,通常这样的数据点在数据集中都表现出不合理的特性。如果忽视这些异常值,在某些建模场景下就会导致结论的错误(如线性回归模型、K均值聚类等),所以在数据的探索过程中,有必要识别出这些异常值并处理好它们。

异常值的识别

通常,异常值的识别可以借助于图形法(如箱线图、正态分布图)和建模法(如线性回归、聚类算法、K近邻算法),在本期内容中,将分享两种图形法,在下一期将分享基于模型识别异常值的方法。

箱线图法

箱线图技术实际上就是利用数据的分位数识别其中的异常点,该图形属于典型的统计图形,在学术界和工业界都得到广泛的应用。箱线图的形状特征如下图所示:

图中的下四分位数指的是数据的25%分位点所对应的值(Q1);中位数即为数据的50%分位点所对应的值(Q2);上四分位数则为数据的75%分位点所对应的值(Q3);上须的计算公式为Q3+1.5(Q3-Q1);下须的计算公式为Q1-1.5(Q3-Q1)。其中,Q3-Q1表示四分位差。如果采用箱线图识别异常值,其判断标准是,当变量的数据值大于箱线图的上须或者小于箱线图的下须时,就可以认为这样的数据点为异常点。

所以,基于上方的箱线图,可以定义某个数值型变量中的异常点和极端异常点,它们的判断表达式如下表所示:

在Python中可以使用matplotlib模块实现数据的可视化,其中boxplot函数就是用于绘制箱线图的。下面以1700年至1988年太阳黑子数量的数据为例,利用箱线图法识别数据中的异常点和极端异常点。具体的代码如下:

# 导入第三方模块

import pandas as pd

import matplotlib.pyplot as plt

# 导入数据

sunspots = pd.read_csv(r'C:\Users\Administrator\Desktop\sunspots.csv')

# 绘制箱线图(1.5倍的四分位差,如需绘制3倍的四分位差,只需调整whis参数)

plt.boxplot(x = sunspots.counts, # 指定绘制箱线图的数据

whis = 1.5, # 指定1.5倍的四分位差

widths = 0.7, # 指定箱线图的宽度为0.8

patch_artist = True, # 指定需要填充箱体颜色

showmeans = True, # 指定需要显示均值

boxprops = {'facecolor':'steelblue'}, # 指定箱体的填充色为铁蓝色

# 指定异常点的填充色、边框色和大小

flierprops = {'markerfacecolor':'red', 'markeredgecolor':'red', 'markersize':4},

# 指定均值点的标记符号(菱形)、填充色和大小

meanprops = {'marker':'D','markerfacecolor':'black', 'markersize':4},

medianprops = {'linestyle':'--','color':'orange'}, # 指定中位数的标记符号(虚线)和颜色

labels = [''] # 去除箱线图的x轴刻度值

)

# 显示图形

plt.show()

如上图所示,利用matplotlib子模块pyplot中的boxplot函数可以非常方便地绘制箱线图,其中左图的上下须设定为1.5倍的四分位差,右图的上下须设定为3倍的四分位差。从左图可知,发现数据集中至少存在5个异常点,它们均在上须之上;而在右图中并没有显示极端异常点。

通过上图可以直观地发现数据中是否存在异常点或极端异常点,但无法得知哪些观测为异常点,以及这些异常点的具体数值。为解决该问题,读者可以通过下方的代码实现查询:

# 计算下四分位数和上四分位

Q1 = sunspots.counts.quantile(q = 0.25)

Q3 = sunspots.counts.quantile(q = 0.75)

# 基于1.5倍的四分位差计算上下须对应的值

low_whisker = Q1 - 1.5*(Q3 - Q1)

up_whisker = Q3 + 1.5*(Q3 - Q1)

# 寻找异常点

sunspots.counts[(sunspots.counts > up_whisker) | (sunspots.counts < low_whisker)]

正态分布图法

根据正态分布的定义可知,数据点落在偏离均值正负1倍标准差(即sigma值)内的概率为68.2%;数据点落在偏离均值正负2倍标准差内的概率为95.4%;数据点落在偏离均值正负3倍标准差内的概率为99.6%。

所以,换个角度思考上文提到的概率值,如果数据点落在偏离均值正负2倍标准差之外的概率就不足5%,它属于小概率事件,即认为这样的数据点为异常点。同理,如果数据点落在偏离均值正负3倍标准差之外的概率将会更小,可以认为这些数据点为极端异常点。为使读者直观地理解文中提到的概率值,可以查看标准正态分布的概率密度图,如下图所示:

进一步,基于上图的结论,可以按照下表中的判断条件,识别出数值型变量的异常点和极端异常点,如下表所示:

利用正态分布的知识点,结合pyplot子模块中的plot函数绘制折线图和散点图,并借助于两条水平参考线识别异常值或极端异常值。

接下来以某公司的支付转化率数据为例,使用正态分布的特性识别数据集中的异常点和极端异常点,该数据呈现的是2017年第三季度每天的支付转化率。我们利用如上介绍的plot函数,识别数据中可能存在的异常点或极端异常点。具体代码如下:

# 读入外部数据

pay_ratio = pd.read_excel(r'C:\Users\Administrator\Desktop\pay_ratio.xlsx')

# 绘制单条折线图,并在折线图的基础上添加点图

plt.plot(pay_ratio.date, # x轴数据

pay_ratio.ratio, # y轴数据

linestyle = '-', # 设置折线类型

linewidth = 2, # 设置线条宽度

color = 'steelblue', # 设置折线颜色

marker = 'o', # 往折线图中添加圆点

markersize = 4, # 设置点的大小

markeredgecolor='black', # 设置点的边框色

markerfacecolor='black') # 设置点的填充色

# 显示图形

plt.show()

# 添加上下界的水平参考线(便于判断异常点,如下判断极端异常点,只需将2改为3)

plt.axhline(y = pay_ratio.ratio.mean() - 2* pay_ratio.ratio.std(), linestyle = '--', color = 'gray')

plt.axhline(y = pay_ratio.ratio.mean() + 2* pay_ratio.ratio.std(), linestyle = '--', color = 'gray')

# 导入模块,用于日期刻度的修改(因为默认格式下的日期刻度标签并不是很友好)

import matplotlib as mpl

# 获取图的坐标信息

ax = plt.gca()

# 设置日期的显示格式

date_format = mpl.dates.DateFormatter("%m-%d")

ax.xaxis.set_major_formatter(date_format)

# 设置x轴每个刻度的间隔天数

xlocator = mpl.ticker.MultipleLocator(7)

ax.xaxis.set_major_locator(xlocator)

# 为了避免x轴刻度标签的紧凑,将刻度标签旋转45度

plt.xticks(rotation=45)

如上图所示,左图中的两条水平线是偏离均值正负2倍标准差的参考线,目测有6个样本点落在参考线之外,可以判定它们属于异常点;而对于右图中偏离均值正负3倍标准差的参考线来说,仅有1个样本点落在参考线之外,即说明该样本点就是2017年第三季度的唯一极端异常点。

同理,也可以借助于下面的代码,查询出异常点所对应的水流量:

# 计算判断异常点和极端异常点的临界值

outlier_ll = pay_ratio.ratio.mean() - 2* pay_ratio.ratio.std()

outlier_ul = pay_ratio.ratio.mean() + 2* pay_ratio.ratio.std()

extreme_outlier_ll = pay_ratio.ratio.mean() - 3* pay_ratio.ratio.std()

extreme_outlier_ul = pay_ratio.ratio.mean() + 3* pay_ratio.ratio.std()

# 寻找异常点

pay_ratio.loc[(pay_ratio.ratio > outlier_ul) | (pay_ratio.ratio < outlier_ll), ['date','ratio']]

# 寻找极端异常点

pay_ratio.loc[(pay_ratio.ratio > extreme_outlier_ul) | (pay_ratio.ratio < extreme_outlier_ll), ['date','ratio']]

异常点

极端异常点

尽管基于箱线图的分位数法和基于正态分布的参考线法都可以实现异常值和极端异常值的识别,但是在实际应用中,需要有针对性的选择。如果待判断的变量近似服从正态分布,建议选择正态分布的参考线法识别异常点,否则使用分位数法识别异常点。

扫码进入CDA官方小程序,解锁更多新鲜资讯和优质内容,还有免费试听课程,不要错过哟!

python数据异常值处理_Python数据清洗(三):异常值识别与处理相关推荐

  1. python绘制正态分布函数_Python数据清洗(三):异常值识别与处理

    作者 | 刘顺祥 来源 | 数据分析1480 原文 |Python数据清洗--缺失值识别与处理 在<Python数据清洗(一):类型转换和冗余数据删除>和<Python数据清洗(二) ...

  2. python异常值删除_python数据清洗中,是如何识别和处理异常值的?

    异常值处理是pythonshujuqingxi/' style='color:#000;font-size:14px;'>python数据清洗中重要的步骤,虽然异常值出现频率比较低,但是如果置之 ...

  3. python 数据框缺失值_Python:处理数据框中的缺失值

    python 数据框缺失值 介绍 (Introduction) In the last article we went through on how to find the missing value ...

  4. 成都python数据分析师培训_python数据分析师

    企业想要在竞争激烈的市场中胜出,决策的速度和反应的效率尤为重要.根据调查显示,75%的企业在面临拟定策略时,常常无法获得实时且有根据的决策信息.什么样的数据.要透过什么样的方法,才能且实时的转变成决策 ...

  5. python数据可视化库_python和r中用于数据可视化的前9个库

    python数据可视化库 In the rapidly growing world of today, when technology is expanding at a rate like neve ...

  6. python数据查询教程_Python数据可视化教程之基础篇

    经过学习之后,我总结了利用python实现可视化的三个步骤: 确定问题,选择图形 转换数据,应用函数 参数设置,一目了然 1 首先,要知道我们用哪些库来画图? matplotlib python中最基 ...

  7. python数据统计代码_Python 数据的累加与统计的示例代码

    问题 你需要处理一个很大的数据集并需要计算数据总和或其他统计量. 解决方案 对于任何涉及到统计.时间序列以及其他相关技术的数据分析问题,都可以考虑使用 Pandas库 . 为了让你先体验下,下面是一个 ...

  8. python数据建模数据集_Python中的数据集

    python数据建模数据集 There are useful Python packages that allow loading publicly available datasets with j ...

  9. python数据科学库_Python数据科学库

    python数据科学库 什么是数据科学? (What is Data Science?) We live in an information age, where the challenge is t ...

最新文章

  1. 诺奖得主涉嫌学术不端!30余篇论文被指涉嫌P图造假、复制粘贴,合作者包括中国学者...
  2. CouchDB 简单HTTP接口使用说明
  3. 19个必须知道的Visual Studio快捷键
  4. 节点的度与网络稀疏性
  5. RabbitMQ指南之四:路由(Routing)和直连交换机(Direct Exchange)
  6. 企业实战_13_MyCat清除冗余数据
  7. mysql添加用户及权限
  8. Python - 装饰器
  9. LeetCode 面试题13. 机器人的运动范围
  10. c语言 连接两个字符串不使用库函数
  11. Java基础学习总结(89)——为什么单元测试应该我们开发人员来写
  12. MyEclipse生成WAR包并在Tomcat下部署发布[转]
  13. 智能指针(二):shared_ptr实现原理
  14. 泛微oa连接mysql,泛微OA 数据库维护笔记(e-cology)
  15. python的metaclass分析
  16. 动态数据的表格页面展示
  17. Groovy Script 获取当前时间函数
  18. 苹果 iPhone 14 Pro/Max 手机最新细节曝光,终于盼来 USB-C 接口
  19. 复杂社会网络传播模式研究项目申报书
  20. [渝粤教育] 北部湾大学 团体心理辅导 参考 资料

热门文章

  1. 使用基于Vue.js和Hbuilder的混合模式移动开发打造属于自己的移动App
  2. 如何远程管理独立游戏开发团队
  3. js创建数组的方法有哪些?
  4. sklearn 快速入门教程
  5. mysql数据库入门教程
  6. Android-PickerView框架的简单使用
  7. 美团大象、头条Lark,为什么小巨头都要做自己的IM?
  8. tf.squeeze()函数
  9. 数字ic笔试2022小米提前批
  10. spring 配置文件报错 Cannot resolve class or package