NumPy 中文教程

第一部分:基础认知与环境准备
第 1 章 全面认识 NumPy
第 2 章 开发环境搭建与验证
第二部分:核心对象 ——ndarray 数组
第 3 章 ndarray 数组基础
第 4 章 数组的形状与维度操作
第四部分:高级应用与数据处理
第 8 章 数组的排序、查找与去重
第 9 章 缺失值与异常值处理
第 10 章 随机数生成与抽样
第 11 章 文件读写与数据交互
第五部分:实战场景与落地应用
第 12 章 数值计算实战
第 13 章 数据分析实战
第六部分:优化进阶与问题解决
第 14 章 NumPy 性能优化
第 15 章 NumPy 进阶扩展
第 16 章 常见问题与解决方案

9.2 异常值处理

NumPy异常值处理教程:检测、修正与可视化方法详解

NumPy 中文教程

本教程为NumPy新手详细讲解异常值处理的完整流程,包括使用3σ原则和四分位数法检测异常值,以及替换、截断、删除等修正方法,并提供可视化辅助技巧,结合NumPy代码示例,帮助您轻松掌握数据清洗技能。

推荐工具
PyCharm专业版开发必备

功能强大的Python IDE,提供智能代码补全、代码分析、调试和测试工具,提高Python开发效率。特别适合处理列表等数据结构的开发工作。

了解更多

NumPy异常值处理教程:从检测到可视化

引言

在数据分析和科学计算中,异常值(Outliers)是偏离正常数据分布的观测值,可能由测量误差、数据录入错误或真实极端事件引起。处理异常值是数据预处理的关键步骤,因为它可以显著影响统计分析、机器学习和可视化结果的准确性。NumPy作为Python的核心数值计算库,提供了强大的数组操作功能,使得异常值处理变得高效和直观。本教程将引导您使用NumPy进行异常值检测、修正和可视化辅助,内容设计简单易懂,适合初学者。

什么是异常值?

异常值是指数据集中与其他观测值显著不同的数据点,它们可能反映了噪声或有趣的模式。在处理前,通常需要先检测异常值,然后根据上下文决定如何修正。NumPy数组可以方便地存储和操作数据,使这一过程流畅。

异常值检测

异常值检测旨在识别数据中的离群点。NumPy提供了多种统计函数来辅助检测。以下是两种常用方法:

3σ原则

基于正态分布的假设,3σ原则使用均值和标准差来检测异常值。在正态分布中,约99.7%的数据落在均值±3个标准差的范围内。超过此范围的观测值被认为是异常值。

NumPy代码示例:

首先,导入NumPy并创建示例数据:

import numpy as np

# 创建一个包含异常值的NumPy数组
np.random.seed(0)  # 设置随机种子以确保可复现性
data = np.concatenate([np.random.normal(0, 1, 95),  # 95个正态分布点
                       np.array([10, -10])])       # 添加两个异常值
print("数据数组:", data)

# 计算均值和标准差
mean = np.mean(data)
std_dev = np.std(data)
print(f"均值: {mean:.2f}, 标准差: {std_dev:.2f}")

# 定义异常值阈值
lower_bound = mean - 3 * std_dev
upper_bound = mean + 3 * std_dev
print(f"下界: {lower_bound:.2f}, 上界: {upper_bound:.2f}")

# 检测异常值
outliers = data[(data < lower_bound) | (data > upper_bound)]
print("检测到的异常值:", outliers)

四分位数法

四分位数法不依赖于分布假设,更稳健地识别异常值。它使用第一四分位数(Q1)、第三四分位数(Q3)和四分位距(IQR = Q3 - Q1)。异常值定义为低于Q1-1.5IQR或高于Q3+1.5IQR的点。

NumPy代码示例:

# 使用相同的示例数据
# 计算四分位数和IQR
q1 = np.percentile(data, 25)  # 第一四分位数
q3 = np.percentile(data, 75)  # 第三四分位数
iqr = q3 - q1
print(f"Q1: {q1:.2f}, Q3: {q3:.2f}, IQR: {iqr:.2f}")

# 定义异常值阈值
lower_bound_iqr = q1 - 1.5 * iqr
upper_bound_iqr = q3 + 1.5 * iqr
print(f"IQR下界: {lower_bound_iqr:.2f}, IQR上界: {upper_bound_iqr:.2f}")

# 检测异常值
outliers_iqr = data[(data < lower_bound_iqr) | (data > upper_bound_iqr)]
print("IQR法检测到的异常值:", outliers_iqr)

异常值修正

检测到异常值后,需要根据场景修正。NumPy支持多种修正方法,通过数组操作实现。

替换

将异常值替换为其他值,如均值、中位数或固定值。

NumPy代码示例:

# 假设使用3σ原则检测异常值,替换为数据的中位数
median = np.median(data)
corrected_data = data.copy()  # 创建副本以避免修改原始数据

# 替换异常值
corrected_data[(data < lower_bound) | (data > upper_bound)] = median
print("替换后的数据(前10个元素):", corrected_data[:10])

截断

将异常值截断到指定边界,例如将超出阈值的数据设置为边界值。

NumPy代码示例:

# 使用IQR法边界进行截断
truncated_data = data.copy()
truncated_data[data < lower_bound_iqr] = lower_bound_iqr
truncated_data[data > upper_bound_iqr] = upper_bound_iqr
print("截断后的数据(前10个元素):", truncated_data[:10])

删除

直接删除包含异常值的行或列,适用于异常值数量较少且不影响整体分析的情况。

NumPy代码示例:

# 假设数据是二维数组,删除包含异常值的行
# 创建一个示例二维数组
np.random.seed(1)
data_2d = np.random.randn(10, 3)  # 10行3列
print("原始二维数据:")
print(data_2d)

# 使用IQR法检测每列的异常值,并标记异常行
# 计算每列的四分位数和IQR
q1_col = np.percentile(data_2d, 25, axis=0)
q3_col = np.percentile(data_2d, 75, axis=0)
iqr_col = q3_col - q1_col
lower_bounds = q1_col - 1.5 * iqr_col
upper_bounds = q3_col + 1.5 * iqr_col

# 检测异常行(如果某行中任何列的值异常)
outlier_rows = np.any((data_2d < lower_bounds) | (data_2d > upper_bounds), axis=1)
print("异常行索引:", np.where(outlier_rows)[0])

# 删除异常行
data_cleaned = data_2d[~outlier_rows]
print("删除异常行后的数据(行数减少):")
print(data_cleaned.shape)

异常值处理的可视化辅助

可视化可以帮助直观理解异常值的分布和修正效果。虽然NumPy本身不提供绘图功能,但可以与Matplotlib等库结合使用。以下是使用Matplotlib的示例。

NumPy与Matplotlib代码示例:

import matplotlib.pyplot as plt

# 使用之前的数据进行可视化
# 绘制原始数据的直方图
plt.figure(figsize=(12, 4))
plt.subplot(1, 3, 1)
plt.hist(data, bins=20, edgecolor='black', alpha=0.7)
plt.title("原始数据直方图")
plt.axvline(mean, color='red', linestyle='--', label='均值')
plt.axvline(lower_bound, color='orange', linestyle=':', label='3σ下界')
plt.axvline(upper_bound, color='orange', linestyle=':', label='3σ上界')
plt.legend()

# 绘制箱线图显示异常值
plt.subplot(1, 3, 2)
plt.boxplot(data, vert=False)
plt.title("箱线图(显示IQR异常值)")
plt.xlabel("值")

# 绘制修正后数据的直方图
plt.subplot(1, 3, 3)
plt.hist(corrected_data, bins=20, edgecolor='black', alpha=0.7, color='green')
plt.title("替换异常值后的直方图")
plt.axvline(median, color='red', linestyle='--', label='中位数')
plt.legend()

plt.tight_layout()
plt.show()

解释:

  • 直方图显示数据分布,红线表示均值或中位数。
  • 箱线图直观展示异常值(使用四分位数法)。
  • 通过对比原始和修正后的直方图,可以评估修正效果。

结论

异常值处理是数据清洗的重要环节,NumPy通过其高效的数组操作和统计函数,简化了这一过程。本教程介绍了基于3σ原则和四分位数法的检测方法,以及替换、截断和删除等修正技巧,并借助可视化辅助理解。建议在实际应用中根据数据特性选择合适的检测和修正策略。不断练习NumPy代码,您将能轻松应对复杂的数据预处理任务。

进阶提示: 对于大规模数据,考虑使用NumPy的向量化操作以提高效率,并结合Pandas库进行更复杂的数据管理。

开发工具推荐
Python开发者工具包

包含虚拟环境管理、代码格式化、依赖管理、测试框架等Python开发全流程工具,提高开发效率。特别适合处理复杂数据结构和算法。

获取工具包