一、p分位數概念
原則上p是可以取0-1之間的任意值,四分位數是p分位數中較為有名的。
所謂四分位數:即把數值由小到大排列並分成四等份,處於三個分割點位置的數值就是四分位數。
- 第1四分位數 (Q1):又稱“較小四分位數”,等於該樣本中所有數值由小到大排列后第25%的數字
- 第2四分位數 (Q2):又稱“中位數”,等於該樣本中所有數值由小到大排列后第50%的數字
- 第3四分位數 (Q3):又稱“較大四分位數”,等於該樣本中所有數值由小到大排列后第75%的數字
第3四分位數與第1四分位數的差距又稱四分位距(InterQuartile Range, IQR)
二、pandas中quantile函數
quantile()
函數語法為:
DataFrame.quantile(q=0.5, axis=0, numeric_only=True, interpolation='linear')
參數解釋:
q -- 浮點數或者數組,默認值0.5,取中位數(0 ≤ q ≤ 1)
axis -- 行或列,默認為0,取值為:{0, 1, ‘index’, ‘columns’}
0 or ‘index’ -- 行
1 or ‘columns’ -- 列
interpolation -- 插值方法,取值為:{‘linear’, ‘lower’, ‘higher’, ‘midpoint’, ‘nearest’}
當選中的分位點位於兩個數數據點 i and j 之間時:
linear: i + (j - i) * fraction, fraction由計算得到的pos的小數部分
lower: i.
higher: j.
nearest: i or j whichever is nearest.
midpoint: (i + j) / 2.
三、實例
# 測試數據
df = pd.DataFrame(np.array([[1, 1], [2, 10], [3, 100], [4, 100]]),columns=['a', 'b'])
'''
a b
0 1 1
1 2 10
2 3 100
3 4 100
'''
# 0.1分位數
df.quantile(0.1)
a 1.3
b 3.7
Name: 0.1, dtype: float64
# 0.5分位數(中位數)
df.quantile(0.5)
a 2.5
b 55.0
Name: 0.5, dtype: float64
# 測試數據
age sex
0 54.0 男
1 39.0 男
2 59.0 男
3 59.0 男
4 52.0 男
# 求分位數
data.age.quantile([0.25, 0.5, 0.75])
0.25 35.0
0.50 45.0
0.75 54.0
Name: age, dtype: float64
四、應用
在數據清洗過程中,可以利用分位數實現對異常數據的剔除。
- 蓋帽法
# 蓋帽法
def blk(floor, root):
def f(x):
if x < floor:
x = floor
elif x > root:
x = root
return x
return f
- 清洗
data["col"] = data["col"].map(blk(0, root=data["col"].quantile(0.99)))
- 缺失值填充
data["col"] = data["col"].fillna(0)
注意,需先通過蓋帽法完成異常數據清洗后,再進行缺失值填充。
參考鏈接1:pandas中的quantile函數