当前位置: 首页 > article >正文

模块三-数据清洗与预处理——15. 异常值检测与处理

15. 异常值检测与处理1. 概述异常值Outlier是指与其他观测值显著不同的数据点。它们可能来自测量错误、数据录入错误也可能是真实的极端情况如高收入人群。正确识别和处理异常值对数据分析至关重要。importpandasaspdimportnumpyasnpimportmatplotlib.pyplotaspltimportseabornassns# 设置中文字体plt.rcParams[font.sans-serif][SimHei,Arial Unicode MS,DejaVu Sans]plt.rcParams[axes.unicode_minus]False# 创建包含异常值的示例数据np.random.seed(42)dfpd.DataFrame({ID:range(1,101),年龄:np.random.normal(35,10,100).round(0),工资:np.random.normal(8000,2000,100).round(0),消费次数:np.random.poisson(10,100)})# 添加异常值df.loc[10,年龄]120# 年龄异常120岁df.loc[25,工资]50000# 工资异常极高df.loc[40,年龄]5# 年龄异常5岁df.loc[55,工资]500# 工资异常极低df.loc[70,消费次数]100# 消费次数异常print(原始数据:)print(df.head(15))print(f\n基本统计:)print(df[[年龄,工资,消费次数]].describe())2. 异常值检测方法2.1 描述性统计# 查看数据分布print(各列统计信息:)print(df[[年龄,工资,消费次数]].describe())# 观察 min 和 max 是否在合理范围print(f年龄范围:{df[年龄].min()}-{df[年龄].max()})print(f工资范围:{df[工资].min()}-{df[工资].max()})2.2 箱线图IQR方法IQR四分位距 Q3 - Q1通常将小于 Q1 - 1.5×IQR 或大于 Q3 1.5×IQR 的值视为异常。defdetect_outliers_iqr(data,column):使用 IQR 方法检测异常值Q1data[column].quantile(0.25)Q3data[column].quantile(0.75)IQRQ3-Q1 lower_boundQ1-1.5*IQR upper_boundQ31.5*IQR outliersdata[(data[column]lower_bound)|(data[column]upper_bound)]returnoutliers,lower_bound,upper_bound# 检测年龄异常值age_outliers,age_lower,age_upperdetect_outliers_iqr(df,年龄)print(f年龄正常范围: [{age_lower:.0f},{age_upper:.0f}])print(f年龄异常值数量:{len(age_outliers)})print(f年龄异常值:{age_outliers[年龄].tolist()})# 检测工资异常值salary_outliers,salary_lower,salary_upperdetect_outliers_iqr(df,工资)print(f\n工资正常范围: [{salary_lower:.0f},{salary_upper:.0f}])print(f工资异常值数量:{len(salary_outliers)})print(f工资异常值:{salary_outliers[工资].tolist()})2.3 Z-Score 方法Z-Score 表示数据点偏离均值的标准差倍数通常 |Z| 3 视为异常。defdetect_outliers_zscore(data,column,threshold3):使用 Z-Score 方法检测异常值z_scoresnp.abs((data[column]-data[column].mean())/data[column].std())outliersdata[z_scoresthreshold]returnoutliers,z_scores# 检测年龄异常值age_outliers_z,age_zdetect_outliers_zscore(df,年龄)print(f年龄 Z-Score 异常值数量:{len(age_outliers_z)})print(f年龄异常值:{age_outliers_z[年龄].tolist()})# 检测工资异常值salary_outliers_z,salary_zdetect_outliers_zscore(df,工资)print(f\n工资 Z-Score 异常值数量:{len(salary_outliers_z)})print(f工资异常值:{salary_outliers_z[工资].tolist()})2.4 可视化检测# 箱线图fig,axesplt.subplots(1,3,figsize(15,5))columns[年龄,工资,消费次数]fori,colinenumerate(columns):axes[i].boxplot(df[col])axes[i].set_title(f{col}箱线图)axes[i].set_ylabel(col)plt.tight_layout()plt.show()# 散点图plt.figure(figsize(10,6))plt.scatter(df[年龄],df[工资],alpha0.6)plt.xlabel(年龄)plt.ylabel(工资)plt.title(年龄 vs 工资 散点图)# 标记异常值age_outliers_idxage_outliers.index.tolist()plt.scatter(df.loc[age_outliers_idx,年龄],df.loc[age_outliers_idx,工资],colorred,s100,label年龄异常)salary_outliers_idxsalary_outliers.index.tolist()plt.scatter(df.loc[salary_outliers_idx,年龄],df.loc[salary_outliers_idx,工资],colororange,s100,markers,label工资异常)plt.legend()plt.show()3. 异常值处理方法3.1 删除异常值# 删除年龄异常的行df_cleandf[~df.index.isin(age_outliers.index)]print(f删除年龄异常前:{len(df)}行)print(f删除年龄异常后:{len(df_clean)}行)# 删除工资异常的行df_cleandf_clean[~df_clean.index.isin(salary_outliers.index)]print(f删除工资异常后:{len(df_clean)}行)3.2 截断/缩尾处理# 百分位数截断lower_bounddf[工资].quantile(0.01)upper_bounddf[工资].quantile(0.99)print(f1%分位数:{lower_bound:.0f}, 99%分位数:{upper_bound:.0f})df[工资_截断]df[工资].clip(lower_bound,upper_bound)print(\n截断后:)print(df[[工资,工资_截断]].head(10))# 比较原值和截断后的统计print(\n原工资统计:)print(df[工资].describe())print(\n截断后统计:)print(df[工资_截断].describe())3.3 替换异常值# 用中位数替换异常值median_agedf[年龄].median()df[年龄_替换]df[年龄].copy()df.loc[age_outliers.index,年龄_替换]median_ageprint(年龄替换:)print(df[[年龄,年龄_替换]].loc[age_outliers.index])# 用均值替换异常值mean_salarydf[工资].mean()df[工资_替换]df[工资].copy()df.loc[salary_outliers.index,工资_替换]mean_salaryprint(\n工资替换:)print(df[[工资,工资_替换]].loc[salary_outliers.index])4. 多维度异常检测4.1 业务规则检测# 定义业务规则defcheck_business_rules(df):基于业务规则的异常检测rules[]# 规则1年龄应在 18-70 之间rule1(df[年龄]18)|(df[年龄]70)rules.append((年龄超出业务范围,rule1))# 规则2工资应在 2000-50000 之间rule2(df[工资]2000)|(df[工资]50000)rules.append((工资超出业务范围,rule2))# 规则3消费次数应在 0-50 之间rule3(df[消费次数]0)|(df[消费次数]50)rules.append((消费次数超出业务范围,rule3))returnrules rulescheck_business_rules(df)forrule_name,rule_conditioninrules:violation_countrule_condition.sum()ifviolation_count0:print(f{rule_name}:{violation_count}条记录)print(df[rule_condition][[ID,年龄,工资,消费次数]])print()4.2 组合条件检测# 年龄与工资的组合异常如 18岁但工资 50000df[年龄工资比]df[工资]/df[年龄]unusualdf[(df[年龄]25)(df[工资]30000)]print(年龄25且工资30000的异常组合:)print(unusual[[ID,年龄,工资]])# 删除异常组合列dfdf.drop(年龄工资比,axis1)5. 完整示例销售数据异常检测# 创建销售数据np.random.seed(42)salespd.DataFrame({日期:pd.date_range(2024-01-01,periods200,freqD),销售额:np.random.normal(5000,1000,200).round(0),订单量:np.random.poisson(50,200),客单价:np.random.normal(100,20,200).round(0)})# 添加异常值sales.loc[15,销售额]30000# 异常高sales.loc[30,订单量]5# 异常低sales.loc[45,客单价]500# 异常高sales.loc[60,销售额]500# 异常低sales.loc[80,订单量]200# 异常高print(*60)print(销售数据异常检测与处理)print(*60)print(\n原始数据统计:)print(sales[[销售额,订单量,客单价]].describe())# 1. 使用 IQR 方法检测异常print(\n1. IQR 异常检测:)forcolin[销售额,订单量,客单价]:outliers,lower,upperdetect_outliers_iqr(sales,col)print(f{col}: 正常范围 [{lower:.0f},{upper:.0f}], 异常值{len(outliers)}个)# 2. 可视化异常fig,axesplt.subplots(1,3,figsize(15,5))fori,colinenumerate([销售额,订单量,客单价]):axes[i].boxplot(sales[col])axes[i].set_title(f{col}箱线图含异常)axes[i].set_ylabel(col)plt.tight_layout()plt.show()# 3. 处理异常值print(\n3. 异常值处理:)sales_cleansales.copy()forcolin[销售额,订单量,客单价]:Q1sales_clean[col].quantile(0.25)Q3sales_clean[col].quantile(0.75)IQRQ3-Q1 lowerQ1-1.5*IQR upperQ31.5*IQR# 截断处理sales_clean[col]sales_clean[col].clip(lower,upper)print(f处理前异常值:)print(f 销售额:{len(sales[(sales[销售额]lower)|(sales[销售额]upper)])})print(f处理后异常值:{len(sales_clean[(sales_clean[销售额]lower)|(sales_clean[销售额]upper)])})# 4. 处理前后对比print(\n4. 处理前后统计对比:)print(处理前:)print(sales[[销售额,订单量,客单价]].describe())print(\n处理后:)print(sales_clean[[销售额,订单量,客单价]].describe())6. 异常值处理决策流程发现异常值 │ ├─ 确认是数据错误 │ │ │ ├─ 能修正 → 根据正确值修正 │ ├─ 无法修正 → 删除 │ └─ 不确定 → 标记保留 │ ├─ 确认是真实极端值 │ │ │ ├─ 分析需要 → 保留 │ ├─ 模型敏感 → 截断/缩尾 │ └─ 需要平滑 → 替换均值/中位数 │ └─ 无法判断 │ ├─ 敏感分析 → 对比删除/保留的影响 └─ 标记列 → 添加异常标记字段7. 总结方法原理适用场景IQR 箱线图基于四分位距通用对分布假设要求低Z-Score基于标准差正态分布数据业务规则领域知识有明确范围约束可视化箱线图、散点图初步探索删除直接移除确定是错误数据截断/缩尾限制在百分位数内保留数据量替换用统计量替换减少异常影响

相关文章:

模块三-数据清洗与预处理——15. 异常值检测与处理

15. 异常值检测与处理 1. 概述 异常值(Outlier)是指与其他观测值显著不同的数据点。它们可能来自测量错误、数据录入错误,也可能是真实的极端情况(如高收入人群)。正确识别和处理异常值对数据分析至关重要。 import pa…...

Spring Boot 3.x 集成AD域实战:从SSL证书踩坑到密码重置,一篇讲透

Spring Boot 3.x 深度集成AD域实战:SSL证书配置与密码策略避坑指南 在企业级应用开发中,Active Directory(AD)集成是身份认证的核心环节。本文将带您深入Spring Boot 3.x与AD域集成的实战细节,特别聚焦于SSL证书配置和…...

模块三-数据清洗与预处理——14. 重复值处理

14. 重复值处理 1. 概述 重复值是数据中的常见问题,可能来自数据录入错误、系统重复导出、数据合并等原因。重复数据会导致统计偏差、模型过拟合,需要在数据预处理阶段处理。 import pandas as pd import numpy as np# 创建包含重复值的示例数据 df pd.…...

国产多模态大模型部署利器:深度解析陈天奇技术栈

国产多模态大模型部署利器:深度解析陈天奇技术栈 引言 在国产大模型“百模大战”的喧嚣浪潮中,我们的目光常常被那些能说会道、能文能图的多模态大模型本身所吸引。然而,一个同样关键却容易被忽视的问题是:如何让这些动辄数百亿…...

基于LLM与OpenClaw的智能自动化:构建自然语言驱动的桌面脚本生成器

1. 项目概述:连接两个世界的桥梁最近在折腾一个挺有意思的项目,叫hermes-openclaw-bridge。光看这个名字,可能有点摸不着头脑,但如果你同时关注过大型语言模型(LLM)和自动化脚本工具,大概就能猜…...

国产多模态大模型“刘知远”:技术原理、实战应用与未来展望

国产多模态大模型“刘知远”:技术原理、实战应用与未来展望 引言 在人工智能浪潮中,多模态大模型正成为推动AGI(通用人工智能)发展的关键引擎。当全球目光聚焦于GPT-4、DALL-E等明星模型时,国产力量也在悄然崛起。其中…...

告别内存泄漏和数组越界:用CppCheck给你的C++项目做一次免费‘体检’

深度解析CppCheck:为C项目构建坚不可摧的代码防线 在当今快节奏的软件开发环境中,代码质量往往成为项目后期维护的隐形杀手。许多C开发者都有过这样的经历:代码编译通过,测试用例跑通,却在生产环境中遭遇诡异崩溃。这些…...

深入GD32F407时钟树:对比STM32F4,聊聊国产MCU时钟设计的异同与调试技巧

深入解析GD32F407时钟树:从STM32F4迁移的实战指南 当工程师第一次将STM32F4项目移植到GD32F407平台时,最常遇到的"幽灵问题"往往与时钟配置有关。我曾亲眼见证一个团队花费两周时间追踪CAN总线通信异常,最终发现仅仅是APB1时钟分频…...

如何快速实现语音转文字:AsrTools 零配置音频转字幕工具指南

如何快速实现语音转文字:AsrTools 零配置音频转字幕工具指南 【免费下载链接】AsrTools ✨ AsrTools: Smart Voice-to-Text Tool | Efficient Batch Processing | User-Friendly Interface | No GPU Required | Supports SRT/TXT Output | Turn your audio into acc…...

从TTP223到JL523:低成本电容触摸按钮的选型与实战

1. 电容触摸按钮入门:从原理到选型 第一次接触电容触摸按钮是在五年前的一个智能台灯项目上。当时为了给台灯添加一个酷炫的触摸开关,我试遍了市面上各种方案,最终锁定了TTP223这颗经典芯片。没想到几年后,国产的JL523给了我更大的…...

量子计算连续门集:原理、实现与优化

1. 量子计算中的连续门集:概念与挑战在量子计算领域,门集(gate set)是实现量子算法的基本构建模块。传统量子计算通常依赖于离散的通用门集,如单量子比特门和CNOT门的组合。然而,这种离散门集在实现某些量子算法时存在明显局限——…...

C++多线程编程:深入剖析std::thread的使用方法

一、线程std::thread简介std::thread 是 C11 中引入的一个库&#xff0c;用于实现多线程编程。它允许程序创建和管理线程&#xff0c;从而实现并发执行。std::thread 在 #include<thread>头文件中声明&#xff0c;因此使用 std::thread 时需要包含 #include<thread>…...

别只会改设置!Chrome/Edge浏览器主页被劫持的三种隐藏原因与根治方法

浏览器主页劫持的深度攻防&#xff1a;从表象到根源的终极解决方案 每次打开浏览器&#xff0c;那个陌生的主页是否让你感到烦躁&#xff1f;大多数人会直奔浏览器设置试图修改&#xff0c;却发现根本无效。这背后隐藏着远比表面设置更复杂的机制——快捷方式参数注入、注册表钩…...

工业控制、通信设备、医疗仪器:MX30LF2G18AC-TI的嵌入式存储应用版图

MX30LF2G18AC-TI&#xff1a;2Gb SLC NAND闪存的工业级存储方案在工业控制、嵌入式系统以及通信设备等领域&#xff0c;非易失性存储器的选择直接影响设备的数据完整性、运行稳定性及长期供货保障。MX30LF2G18AC-TI是旺宏电子推出的一款2Gb SLC NAND闪存芯片&#xff0c;采用成…...

MCP图像生成服务器:在IDE中无缝集成AI绘图,提升开发与设计效率

1. 项目概述&#xff1a;一个能“听懂人话”的智能图像生成服务器 如果你和我一样&#xff0c;经常在 Cursor、Claude Code 这类 AI 编程工具里写代码、做设计&#xff0c;那你肯定遇到过这样的场景&#xff1a;脑子里有个很棒的视觉创意&#xff0c;比如“一个赛博朋克风格的…...

Doccano自动标注实战:我用它3天搞定了一个NER项目的数据标注

Doccano自动标注实战&#xff1a;我用它3天搞定了一个NER项目的数据标注 1. 项目背景与挑战 上个月接到了一个从新闻文本中抽取公司名和职位的NER任务&#xff0c;标注量约5000条。作为独立开发者&#xff0c;既没有专业标注团队&#xff0c;也没有充足预算购买商业标注服务。传…...

MyScaleDB:基于SQL的向量数据库实战,实现混合查询与AI应用开发

1. 项目概述&#xff1a;当向量数据库遇见SQL如果你最近在折腾大模型应用&#xff0c;尤其是想给AI应用加上“长期记忆”或者实现精准的文档问答&#xff0c;那你大概率已经听过“向量数据库”这个词。从早期的Milvus、Pinecone&#xff0c;到后来各大云厂商纷纷入局&#xff0…...

如何用Python 5分钟获取同花顺问财数据?量化分析终极指南

如何用Python 5分钟获取同花顺问财数据&#xff1f;量化分析终极指南 【免费下载链接】pywencai 获取同花顺问财数据 项目地址: https://gitcode.com/gh_mirrors/py/pywencai 还在为获取金融数据而烦恼吗&#xff1f;想快速筛选股票却苦于没有合适工具&#xff1f;今天我…...

WordPress Puock主题深度解析:高颜值集成化设计与实战配置指南

1. 项目概述&#xff1a;为什么选择Puock主题&#xff1f;如果你正在寻找一款功能强大、颜值在线&#xff0c;并且能让你从繁琐的WordPress主题配置中解脱出来的产品&#xff0c;那么Puock主题绝对值得你花时间深入了解。我接触过不少WordPress主题&#xff0c;从付费到开源&am…...

AI工具导航站Awesome-AITools:社区驱动的资源聚合与高效使用指南

1. 项目概述&#xff1a;为什么我们需要一个AI工具导航站&#xff1f;如果你最近也在关注AI领域&#xff0c;大概率会和我有同样的感受&#xff1a;新工具、新模型、新应用的出现速度&#xff0c;已经快到了让人眼花缭乱的地步。今天刚听说一个能自动剪辑视频的AI&#xff0c;明…...

基于MCP协议的GitHub PR代码审查工具:自动化安全与质量分析

1. 项目概述与核心价值 最近在折腾一个挺有意思的东西&#xff0c;一个专门给GitHub Pull Request做代码审查的MCP服务器。简单来说&#xff0c;它能让你的AI助手&#xff08;比如Cursor里的Claude&#xff09;直接读懂GitHub上的代码变更&#xff0c;然后像一位经验丰富的技术…...

CH32F103C8T6 vs STM32F103C8T6:程序下载生态深度对比与国产替代实战

CH32F103C8T6与STM32F103C8T6程序下载生态全维度对比与国产化迁移指南 在嵌入式开发领域&#xff0c;MCU的程序下载方式往往决定了开发效率的上限。当工程师从熟悉的STM32平台转向国产CH32时&#xff0c;最直接的"水土不服"往往就发生在烧录环节——同样的SWD接口为何…...

ARM与中科创达物联网加速器:一站式平台如何重塑产品开发

1. 项目概述&#xff1a;ARM与中科创达的物联网生态加速器2015年&#xff0c;半导体IP巨头ARM与总部位于北京的中科创达&#xff08;Thundersoft&#xff09;联合宣布&#xff0c;将在中国建立“ARM创新生态加速器”。这个消息在当时可能只是科技新闻版块的一则快讯&#xff0c…...

GeoJSON.io:3分钟创建专业地图,地理数据可视化从未如此简单

GeoJSON.io&#xff1a;3分钟创建专业地图&#xff0c;地理数据可视化从未如此简单 【免费下载链接】geojson.io A quick, simple tool for creating, viewing, and sharing spatial data 项目地址: https://gitcode.com/gh_mirrors/ge/geojson.io 你是否曾经需要在地图…...

实测Taotoken多模型聚合服务的响应延迟与稳定性观感

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 实测Taotoken多模型聚合服务的响应延迟与稳定性观感 1. 引言 在将大模型能力集成到实际应用的过程中&#xff0c;开发者除了关注模…...

解决ROS的‘Done checking log file disk usage’卡顿:你的~/.bashrc里ROS_IP设对了吗?

解决ROS日志检查卡顿&#xff1a;环境变量配置的深层解析与实战指南 当你在终端启动roscore时&#xff0c;是否遇到过长时间卡在"Done checking log file disk usage"提示的尴尬&#xff1f;这个问题看似简单&#xff0c;背后却隐藏着ROS环境配置的关键细节。本文将带…...

开发AI应用时借助Taotoken模型广场快速进行模型选型与测试

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 开发AI应用时借助Taotoken模型广场快速进行模型选型与测试 在开发基于大语言模型的应用或功能时&#xff0c;一个常见的挑战是如何…...

保姆级教程:用Python复现红外小目标检测的LCM算法(附完整代码)

从零实现红外小目标检测&#xff1a;LCM算法Python实战指南 在计算机视觉领域&#xff0c;红外小目标检测一直是颇具挑战性的任务。不同于常规物体检测&#xff0c;红外图像中的目标往往只有几个像素大小&#xff0c;缺乏纹理和形状特征。传统基于深度学习的方法在这种场景下常…...

SwiftUI原生集成ChatGPT API:从架构设计到流式响应实战

1. 项目概述&#xff1a;一个原生的Swift版ChatGPT客户端最近在折腾iOS和macOS上的AI应用开发&#xff0c;发现了一个挺有意思的开源项目&#xff1a;alfianlosari/ChatGPTSwift。简单来说&#xff0c;这是一个用纯SwiftUI构建的、直接调用OpenAI官方API的ChatGPT客户端。它不是…...

从专利大国到专利强国:企业全球专利布局策略与实战指南

1. 从“专利大国”到“专利强国”&#xff1a;一场关于价值与布局的深度思考最近翻看一些行业旧闻&#xff0c;2016年EE Times上那篇关于中国专利“不出海”的讨论&#xff0c;现在读来依然很有嚼头。文章核心就一句话&#xff1a;根据世界知识产权组织&#xff08;WIPO&#x…...