Tại sao cần thống kê bền vững?
Độ lệch chuẩn là đại lượng đo độ phân tán mạnh mẽ, nhưng nó có một điểm yếu nghiêm trọng: cực kỳ nhạy cảm với giá trị ngoại lai. Một giá trị cực đoan duy nhất có thể làm SD tăng đáng kể, cho bức tranh sai lệch về biến thiên điển hình.
Thống kê bền vững cung cấp các đại lượng đo độ phân tán chống lại ảnh hưởng của ngoại lai, khiến chúng thiết yếu cho dữ liệu thực tế nơi lỗi đo lường, nhập liệu sai hoặc trường hợp cực đoan thực sự là phổ biến.
Ví dụ: Ảnh hưởng của giá trị ngoại lai
Điểm sụp đổ
Độ lệch tuyệt đối trung vị (MAD)
MAD là đại lượng đo độ phân tán bền vững nhất. Nó tính trung vị của các độ lệch tuyệt đối từ trung vị:
Công thức MAD
Tìm trung vị
Tính độ lệch
Tìm MAD
Quy đổi MAD để ước lượng σ: Với dữ liệu phân phối chuẩn, MAD ≈ 0,6745 × σ. Để ước lượng SD từ MAD, nhân với 1,4826:
Ước lượng SD từ MAD
Tại sao 1,4826?
Khoảng tứ phân vị (IQR)
IQR đo độ phân tán của 50% dữ liệu ở giữa—khoảng giữa phân vị thứ 25 và 75:
Công thức IQR
IQR được sử dụng rộng rãi vì đơn giản, dễ trực quan hóa trong biểu đồ hộp và là cơ sở cho quy tắc phổ biến “1,5×IQR” để phát hiện ngoại lai.
Quy đổi IQR để ước lượng σ: Với dữ liệu chuẩn, IQR ≈ 1,35 × σ. Để ước lượng SD từ IQR:
Ước lượng SD từ IQR
So sánh các đại lượng bền vững
Độ lệch chuẩn
MAD
IQR
Khi nào sử dụng thống kê bền vững
- Phân tích khám phá: Khi bạn không biết liệu ngoại lai có tồn tại, hãy bắt đầu với đại lượng bền vững
- Vấn đề chất lượng dữ liệu: Khi dữ liệu có thể chứa lỗi hoặc vấn đề đo lường
- Phân phối đuôi nặng: Khi giá trị cực đoan được kỳ vọng (lợi nhuận tài chính, yêu cầu bảo hiểm)
- Mẫu nhỏ: Khi ngoại lai có tác động lớn quá mức do ít quan sát
- Phát hiện ngoại lai: Sử dụng SD để phát hiện ngoại lai là vòng tròn; dùng IQR hoặc MAD thay thế
Ví dụ triển khai
import numpy as np
from scipy import stats
def mad(data):
"""Median Absolute Deviation"""
median = np.median(data)
return np.median(np.abs(data - median))
def scaled_mad(data):
"""MAD scaled to estimate SD (for normal data)"""
return 1.4826 * mad(data)
def iqr(data):
"""Interquartile Range"""
return np.percentile(data, 75) - np.percentile(data, 25)
# Compare on data with outlier
data = [10, 12, 11, 13, 12, 11, 100]
print(f"SD: {np.std(data, ddof=1):.2f}")
print(f"MAD: {mad(data):.2f}")
print(f"Scaled MAD: {scaled_mad(data):.2f}")
print(f"IQR: {iqr(data):.2f}")