本文仅提供具体计算方法,至于具体应用暂时懒得写。
异常值检测-识别离群值
百分位数percentile:第k个百分位数是具有如下性质的值x:k%的数据项位于或低于x,中位数就是第50个百分位数
四分位数:Q1 (25th percentile,第(n+3)/4个数), Q3 (75th percentile,第(3n+1)/4个数)
中间四分位数极差/四分位间距(interquartile range,IQR): IQR = Q3 – Q1
孤立点/离群值(outlier):落在至少高于第三个四分位数或低于第一个四分位数1.5×IQR处的值。位于范围外1.5×IQR到3×IQR范围的数值,称作适度离群值(mild outlier)。位于范围外3×IQR以上的数值,称作极端离群值(extreme outlier)。
上下限:上限=min{Q3+1.5IQR,MAX},下限=max{Q1-1.5IQR,MIN}。
换句话说,上下限是忽略掉异常值(包括温和异常值)之后的最大值和最小值。
例1:
如上图,下边界=5,Q1=7,Q2=8.5,Q3=9,上边界=10,IQR=Q3-Q1=2(即△Q)。适度离群值=3.5,极端离群值=0.5。
例2:
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
prices = [100, 150, 200, 250, 300, 350, 400, 450, 500, 1000]
df = pd.DataFrame(prices, columns=['Price'])
summary_stats = df.describe().transpose()
print(summary_stats)
sns.boxplot(y=prices)
plt.show()
由输出数据可知:总数=10,均值=370,标准差=256.255,Q1=200+(250-200)*25%=212.5,中位数Q2=(300+350)/2=325.0,Q3=400+(450-400)*0.75%=437.5
计算得:
IQR=Q3-Q1=225。
箱型图中对应的五条线依次是:
下限=MIN=100,Q1=212.5,Q2=325.0,Q3=437.5,上限=去掉异常值1000后的最大值=500。
实际数据集:
import pandas as pd
import os
file_path = os.path.join('input', 'Ch3-HousePrice-train.csv')
df_train = pd.read_csv(file_path)
sns.boxplot(df_train['SalePrice'])
plt.show()