百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

Python数据清洗(三):异常值识别与处理

off999 2024-11-19 08:36 40 浏览 0 评论

作者 | 刘顺祥

来源 | 数据分析1480

在《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 Flask 容器化应用链路可观测

简介Flask是一个基于Python的轻量级Web应用框架,因其简洁灵活而被称为“微框架”。它提供了Web开发所需的核心功能,如请求处理、路由管理等,但不会强制开发者使用特定的工具或库。...

Python GUI应用开发快速入门(python开发软件教程)

一、GUI开发基础1.主流GUI框架对比表1PythonGUI框架比较框架特点适用场景学习曲线Tkinter内置库,简单小型应用,快速原型平缓PyQt功能强大,商用许可专业级桌面应用陡峭PySi...

【MCP实战】Python构建MCP应用全攻略:从入门到实战!

实战揭秘:Python Toga 打造跨平台 GUI 应用的神奇之旅

在Python的世界里,GUI(图形用户界面)开发工具众多,但要找到一款真正跨平台、易于使用且功能强大的工具并不容易。今天,我们就来深入探讨一下Toga——一款Python原生、操作系统原...

python应用目录规划(python的目录)

Python大型应用目录结构规划(企业级最佳实践)核心原则模块化:按业务功能拆分,高内聚低耦合可扩展性:支持插件机制和动态加载环境隔离:清晰区分开发/测试/生产环境自动化:内置标准化的构建测试部署流...

Python图形化应用开发框架:PyQt开发简介

PyQt概述定义:PyQt是Python绑定Qt框架的工具集,用于开发跨平台GUI应用程序原理:通过Qt的C++库提供底层功能,PyQt使用SIP工具生成Python绑定特点:支持Windows/ma...

[python] 基于PyOD库实现数据异常检测

PyOD是一个全面且易于使用的Python库,专门用于检测多变量数据中的异常点或离群点。异常点是指那些与大多数数据点显著不同的数据,它们可能表示错误、噪声或潜在的有趣现象。无论是处理小规模项目还是大型...

Python、Selenium 和 Allure 进行 UI 自动化测试的简单示例脚本

环境准备确保你已经安装了以下库:SeleniumAllurepytest你可以使用以下命令安装所需库:pipinstallseleniumallure-pytestpytest示例代码下面的代...

LabVIEW 与 Python 融合:打造强大测试系统的利器

在现代测试系统开发领域,LabVIEW和Python各自凭借独特优势占据重要地位。LabVIEW以图形化编程、仪器控制和实时系统开发能力见长;Python则凭借丰富的库资源、简洁语法和强大数...

软件测试进阶之自动化测试——python+appium实例

扼要:1、了解python+appium进行APP的自动化测试实例;2、能根据实例进行实训操作;本课程主要讲述用python+appium对APP进行UI自动化测试的例子。appium支持Androi...

Python openpyxl:读写样式Excel一条龙,测试报表必备!

无论你是测试工程师、数据分析师,还是想批量导出Excel的自动化工作者,只需一个库openpyxl,即可高效搞定Excel的各种需求!为什么选择openpyxl?支持.xlsx格式...

Python + Pytest 测试框架——数据驱动

引言前面已经和大家介绍过Unittest测试框架的数据驱动框架DDT,以及其实现原理。今天和大家分享的是Pytest测试框架的数据驱动,Pytest测试框架的数据驱动是由pytest自...

这款开源测试神器,圆了我玩游戏不用动手的梦想

作者:HelloGitHub-Anthony一天我在公司用手机看游戏直播,同事问我在玩什么游戏?我和他说在看直播,他恍然大悟:原来如此,我还纳闷你玩游戏,咋不用动手呢。。。。一语惊醒梦中人:玩游戏不用...

Python单元测试框架对比(pycharm 单元测试)

一、核心框架对比特性unittest(标准库)pytest(主流第三方)nose2(unittest扩展)doctest(文档测试)安装Python标准库pipinstallpytestp...

利用机器学习,进行人体33个2D姿态检测与评估

前几期的文章,我们分享了人脸468点检测与人手28点检测的代码实现过程,本期我们进行人体姿态的检测与评估通过视频进行人体姿势估计在各种应用中起着至关重要的作用,例如量化体育锻炼,手语识别和全身手势控制...

取消回复欢迎 发表评论: