统计描述与分位数,基于IQR或3σ原则识别异常
使用 retail_orders 数据集,包含价格、数量等数值列。
使用 describe() 方法可以快速查看数据的统计摘要,包括计数、均值、标准差、最小值、25%分位数、中位数、75%分位数和最大值。
import pandas as pd
df = pd.read_csv('retail_orders.csv')
print(df['price'].describe())
describe() 默认只分析数值列,对于包含非数值列的数据,需要指定参数才能看到所有列的统计信息。
IQR(Interquartile Range)是统计学中衡量数据离散程度的指标,计算公式为:IQR = Q3 - Q1。其中 Q1 是第25百分位数(下四分位数),Q3 是第75百分位数(上四分位数)。
Q1 = df['price'].quantile(0.25)
Q3 = df['price'].quantile(0.75)
IQR = Q3 - Q1
print(f"Q1: {Q1}, Q3: {Q3}, IQR: {IQR}")
quantile() 时,参数范围是 0 到 1 之间的小数,0.5 表示中位数。
IQR方法是经典的异常值检测方法。根据统计学原理,正常数据通常分布在 [Q1 - 1.5×IQR, Q3 + 1.5×IQR] 范围内,超出这个范围的数据被识别为异常值。
lower = Q1 - 1.5 * IQR
upper = Q3 + 1.5 * IQR
outliers = df[(df['price'] < lower) | (df['price'] > upper)]
print(f"异常值数量: {len(outliers)}")
print(outliers[['product', 'price']])
3σ原则(也称为拉依达准则)基于正态分布假设。在正态分布中,约99.7%的数据落在均值±3个标准差范围内。超出这个范围的数据被认为是异常值。
mean = df['price'].mean()
std = df['price'].std()
lower = mean - 3 * std
upper = mean + 3 * std
outliers = df[(df['price'] < lower) | (df['price'] > upper)]
print(f"异常值数量: {len(outliers)}")
print(outliers[['product', 'price']])
检测到异常值后,需要根据业务场景选择合适的处理方式。常见的处理方法包括:删除异常值或用统计量替换。通常推荐使用中位数替换,因为中位数不受极端值影响。
median = df['price'].median() df['price_clean'] = df['price'].copy() df.loc[(df['price'] < lower) | (df['price'] > upper), 'price_clean'] = median print(f"处理后的数据:") print(df[['product', 'price', 'price_clean']])
df.loc[条件, '列'] = 值 可以根据条件对特定列进行批量赋值,这是数据清洗中最常用的技巧之一。