لماذا الإحصاءات المتينة؟
الانحراف المعياري مقياس قوي للانتشار، لكن لديه نقطة ضعف حرجة: حساسية شديدة للقيم المتطرفة. قيمة واحدة شاذة يمكن أن تضخم الانحراف المعياري بشكل كبير، مما يعطي صورة مضللة عن التباين النموذجي.
الإحصاءات المتينة توفر مقاييس انتشار تقاوم تأثير القيم المتطرفة، مما يجعلها ضرورية للبيانات الواقعية حيث أخطاء القياس وأخطاء إدخال البيانات أو الحالات المتطرفة الحقيقية شائعة.
مثال: تأثير القيمة المتطرفة
نقطة الانهيار
انحراف الوسيط المطلق (MAD)
MAD هو أكثر مقاييس الانتشار متانة. يحسب وسيط الانحرافات المطلقة عن الوسيط:
صيغة MAD
إيجاد الوسيط
حساب الانحرافات
إيجاد MAD
تعديل MAD لتقدير σ: للبيانات ذات التوزيع الطبيعي، MAD ≈ 0.6745 × σ. لتقدير الانحراف المعياري من MAD، اضرب في 1.4826:
تقدير SD من MAD
لماذا 1.4826؟
المدى الربيعي (IQR)
IQR يقيس انتشار الـ 50% الوسطى من البيانات — المدى بين المئين الخامس والعشرين والمئين الخامس والسبعين:
صيغة IQR
يُستخدم IQR على نطاق واسع لأنه بسيط الفهم، سهل التصور في مخططات الصندوق، ويشكّل أساس “قاعدة 1.5×IQR” الشائعة لكشف القيم المتطرفة.
تعديل IQR لتقدير σ: للبيانات الطبيعية، IQR ≈ 1.35 × σ. لتقدير SD من IQR:
تقدير SD من IQR
مقارنة المقاييس المتينة
الانحراف المعياري
MAD
IQR
متى تستخدم الإحصاءات المتينة
- التحليل الاستكشافي: عندما لا تعرف ما إذا كانت القيم المتطرفة موجودة، ابدأ بالمقاييس المتينة
- مشاكل جودة البيانات: عندما قد تحتوي البيانات على أخطاء أو مشاكل في القياس
- التوزيعات ثقيلة الأطراف: عندما تكون القيم المتطرفة متوقعة (العوائد المالية، مطالبات التأمين)
- العينات الصغيرة: عندما يكون للقيم المتطرفة تأثير مبالغ فيه بسبب قلة الملاحظات
- كشف القيم المتطرفة: استخدام SD لكشف القيم المتطرفة أمر دائري؛ استخدم IQR أو MAD بدلاً من ذلك
أمثلة على التطبيق البرمجي
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}")