SciPy Statistical Significance Tests

تست معناداری آماری چیست؟

در آمار، معناداری آماری به این معنی است که نتیجه حاصل به خاطر دلیلی است که پشت سر آن وجود دارد و بر اساس شانس یا به صورت تصادفی حاصل نشده است.

جهت انجام تست‌های معناداری، SciPy مدول scipy.stats را معرفی کرده است.

ابتدا چند تکنیک و کلیدواژه که در انجام چنین تست‌هایی مهم هستند را با هم بررسی می‌کنیم.

فرضیه در آمار

فرضیه گمانی است که درباره یک پارامتر در جمعیت داریم.

فرضیه صفر

فرضیه صفر یا (Null Hypothesis)، فرض می‌کند که مشاهده از لحاظ آماری معنادار نیست.

فرضیه جایگزین

فرضیه جایگزین (Alternate Hypothesis) فرض می‌کند که مشاهدات به خاطر دلایلی رخ داده‌اند.

جایگزینی برای فرضیه صفر است.

برای مثال جهت ارزیابی یک دانش‌آموز فرض می‌کنیم که:

  • دانش‌آموز بدتر از میانگین است - فرضیه صفر.
  • دانش‌آموز بهتر از میانگین است - فرضیه جایگزین

آزمون یک طرفه

هنگامیکه فرضیه ما تنها یک طرف مقدار را تست می‌کند، به آن آزمون یک طرفه (one tailed test) می‌گوئیم.

مثلاً برای فرضیه صفر می‌گوئیم "میانگین برابر است " و می‌توان برای فرضیه جایگزین گفت، "میانگین کمتر از k است" یا "میانگین بیشتر از k است."

آزمون دو طرفه

زمانی که فرضیه هر دو سمت مقدار را تست می‌کند، به آن آزمون دو طرفه یا "two tailed test" می‌گوئیم.

مثلاً برای فرضیه صفر می‌گوئیم، "مقدار میانگین برابر است " و برای فرضیه جایگزین می‌توان گفت "مقدار میانگین برابر k نیست" در این حالت باید میانگین بزرگتر یا کوچکتر از k و هر دو طرف باید بررسی شوند.

مقدار آلفا

مقدار آلفا سطح معناداری است. مثلاً برای رد کردن فرضیه صفر داده‌ها چقدر باید به مقادیر اکستریم نزدیک باشند. مقادیر اکستریم معمولاً 0.05 ،0.01 و یا 0.1 در نظر گرفته می‌شوند.

مقدار P

مقدار P به ما می‌گوید که داده‌ها واقعاً چقدر به مقادیر اکستریم نزدیک هستند.

مقادیر آلفا و P جهت مشخص کردن معناداری به لحاظ آماری با هم مقایسه می‌شوند.

در صورتی که مقدار P کوچکتر مساوی مقدار آلفا باشد، فرضیه صفر را رد می‌کنیم و می‌گوئیم که داده‌ها به لحاظ آماری معنادار هستند. در غیر این صورت فرضیه صفر را می‌پذیریم.

آزمون T

آزمون T جهت تعیین وجود تفاوت معنادار بین میانگین دو متغیر استفاده می‌شود و به ما می‌گوید که آیا این دو متغیر به یک توزیع تعلق دارند یا خیر. این آزمون یک آزمون دو طرفه است.

تابع ttest_ind() دو نمونه هم اندازه را گرفته و یک تاپل شامل t-statistic و p-value را برمی‌گرداند.

در کد زیر می‌خواهیم بدانیم آیا مقادیر v1 و v2 مربوط به یک توزیع هستند یا خیر.


import numpy as np
from scipy.stats import ttest_ind

v1 = np.random.normal(size=100)
v2 = np.random.normal(size=100)

res = ttest_ind(v1, v2)

print(res)

خروجی:

اگر می‌خواهید تنها مقدار P را در نتیجه مشاهده کنید، می‌توانید از خصوصیت pvalue استفاده کنید.

...
res = ttest_ind(v1, v2).pvalue
print(res)

آزمون KS

آزمون KS بررسی می‌کند که آیا مقادیر داده شده از یک توزیع پیروی می‌کنند یا خیر.

به عنوان پارامتر ورودی باید مقداری مه می‌خواهیم تست شود را همراه با CDF به تابع بدهیم.

CDF می‌تواند یک رشته یا یک تابع با قابلیت فراخوانی باشد که احتمال را برمی‌گرداند.

می‌توان از آن، هم به عنوان آزمون یک طرفه و هم به عنوان آزمون دو طرفه استفاده کرد. به صورت پیش‌فرض یک آزمون دو طرفه است.

در کد زیر می‌خواهیم بدانیم که آیا مقدار داده شده از توزیع نرمال پیروی می‌کند یا خیر.


import numpy as np
from scipy.stats import kstest

v = np.random.normal(size=100)

res = kstest(v, 'norm')

print(res)

خروجی:

توصیف آمار داده‌ها

برای مشاهده کردن خلاصه‌ای از وضعیت مقادیر در یک آرایه می‌توان از تابع describe() استفاده کرد.

توصیف‌های زیر را برمی‌گرداند:

  1. تعداد مشاهدات (nobs)
  2. مقادیر کمینه و بیشینه
  3. میانگین
  4. واریانس
  5. چولگی (skewness)
  6. کشیدگی (kurtosis)

import numpy as np
from scipy.stats import describe

v = np.random.normal(size=100)
res = describe(v)

print(res)

خروجی:

آزمون نرمال بودن

آزمون نرمال بودن (Normality Test) بر اساس چولگی (skewness) و کشیدگی (kurtosis) است.

تابع normaltest() مقدار P را برای فرضیه صفر برمی‌گرداند.

"مقدار داده شده به توزیع نرمال تعلق دارد."

چولگی

مقیاسی برای میزان تقارن داده‌ها.

برای توزیع نرمال مقدار آن صفر است.

اگر مقدار آن منفی باشد یعنی انحراف داده‌ها به سمت چپ است.

اگر مقدار آن مثبت باشد یعنی انحراف داده‌ها به سمت راست است.

کشیدگی

مقیاسی برای اینکه بفهیم داده‌ها با چه شدتی به یک توزیع نرمال گره خورده‌اند.

مقدار مثبت به معنی گره خوردگی سنگین است.

مقدار منفی به معنی گره خوردگی سبک است.


import numpy as np
from scipy.stats import skew, kurtosis

v = np.random.normal(size=100)

print(skew(v))
print(kurtosis(v))

خروجی:

در کد زیر می‌خواهیم بررسی کنیم که داده‌ها به توزیع نرمال تعلق دارند یا خیر.


import numpy as np
from scipy.stats import normaltest

v = np.random.normal(size=100)

print(normaltest(v))

خروجی: