統計學---極端異常值的檢測
你在整理統計公司人的收入情況,手一抖,不小心把某個人的月薪26249變成262490了,某個人的月薪16895變成1689.5了。於是變成了如下的情況:
incomes=[25590, 23306, 26780, 29463, 22485, 262490, 24985, 1689.5, 17700, 18257, 24132, 21479, 19304, 16511, 18573, 26606, 20917, 19394, 24322, 28383, 16478, 29062, 23232, 17580, 26804, 28500, 25018, 24001, 27530, 27459, 22776, 19835, 16475, 15201, 28801, 19509, 19098, 17993, 15131, 26187, 25022, 27430, 19114, 18295, 25365, 23550, 20413, 19335, 21286, 22911]
有時候資料集中會包含一個或多個數值異常大或異常小的值,這樣的極端值稱為異常極端值(outlier)。這在現實資料集中是很有可能發生的,如資料錄入錯誤、測量錯誤、試驗錯誤、資料處理錯誤等。異常值的存在當然對資料統計產生很多不良的影響,例如降低資料統計的說服力和可信度。
因此,我們首先想到的是把異常值檢測出來。這裡就需要用到排序,利用排序,將資料從小到大進行排列。然後將資料進行等分。如果分成2部分,那這個數就是中位數。如果分為4部分,那這個數就叫四分位數。注意,這不是美式足球(橄欖球)中的四分位;四分位數不止一個,是3個,即通過3個四分位數將資料分為了4個數量上相等的部分。
這3個四分位數分別用Q1,Q2,Q3表示。你可能並不陌生,股票市場中,經常有Q1財報,Q2財報,Q3財報,Q4財報的說法,指的是四個季度的財報情況,一年4個季度,也是四等分。
那麼,對於上面的資料,怎樣計算Q1,Q2,Q3呢?可以利用pandas的describe函式。
import pandas as pd
four = pd.Series(data).describe()
print(four)
print('Q1= {0}, Q2= {1}, Q3={2}'.format(four['25%'],four['50%'],four['75%']))
輸出結果:
count 50.000000
mean 26835.150000
std 34372.619505
min 1689.500000
25% 19102.000000
50% 22843.500000
75% 26037.750000
max 262490.000000
dtype: float64
Q1= 19102.0, Q2= 22843.5, Q3= 26037.75
可以看出,pandas的describe函式不僅能得出資料集的樣本數量,均值,標準差,最小值、最大值,以及3個四分位數,即在資料25%,50%,75%位置的數。我們通常把Q3-Q1的差值稱為四分位距(interquartile range,IQR),或四分差。
那什麼是異常極端值呢,用如下計算公式:
Q1 = four['25%']
Q3 = four['75%']
IQR = Q3 - Q1
upper = Q3 + 1.5 * IQR
lower = Q1 - 1.5 * IQR
print(upper, lower)
輸出結果:
36441.375 8698.375
高於upper或者低於lower的值都屬於異常極端值。
畫出影象如下:
incomes = pd.DataFrame(incomes)
import seaborn as sns
import matplotlib.pyplot as plt
sns.boxplot(data=incomes, palette="Set1")
plt.show()
很容易發現標為黑色菱形的這2個極端值。那這個計算極端值的1.5是怎麼得來的呢,這是統計學中經過大量分析和經驗積累得出的標準,一般情況不做調整。