2023년 상반기부터 통계 관련 문항들이 객관식 선다형으로 나오다가 이제 그냥 코드짜는 2문제로 바뀌었다.
작업형3 유형이 그 대상인데, 아래 캐글에 좋은 예제가 있어서 같이 풀어보았다. . . .. ..
* 쌍체표본 t검정
scipy.stats의 ttest_rel 활용
주어진 데이터는 고혈압 환자 치료 전후의 혈압이다. 해당 치료가 효과가 있는지 대응(쌍체)표본 t-검정을 진행하시오
- 귀무가설(H0): >= 0
- 대립가설(H1): < 0
- = (치료 후 혈압 - 치료 전 혈압)의 평균
- 유의수준: 0.05
- 의 표본평균은?(소수 둘째자리까지 반올림)
- 검정통계량 값은?(소수 넷째자리까지 반올림)
- p-값은?(소수 넷째자리까지 반올림)
- 가설검정의 결과는? (유의수준 5%)
# lib import!
import pandas as pd
import numpy as np
from scipy import stats
# Data Load
df = pd.read_csv("/kaggle/input/bigdatacertificationkr/high_blood_pressure.csv")
# 1번 평균
df['diff'] = df['bp_post'] - df['bp_pre']
avg = df['diff'].mean()
print(round(avg,2))
# 2번 검정통계량 구하기
stat, pvalue = stats.ttest_rel(df['bp_post'], df['bp_pre'], alternative = 'less')
통계학은 늘 그랬듯 상식을 검증할 것이다.
치료 후에 고혈압이 조금이라도 낮아지는게 상식이므로,
(치료 후 혈압) < (치료 전 혈압) 을 기대할 것이고,
따라서 μ = (치료 후 혈압) - (치료 전 혈압) 으로 정의한 상황에서 귀무가설은 μ >= 0, 대립가설은 μ < 0
* scipy ttest 코드에서 alternative(대립가설) 옵션을 less를 두는데, 이는 array를 투입할때 앞 샘플 평균이 뒤 샘플 평균보다 작을것을 의미한다.
** pvalue가 주어진 유의수준(0.05) 보다 작으면 귀무가설을 기각하고 대립가설을 채택하면 됌.
귀무가설, 대립가설의 의미와 예시
T-test, chi-square test를 공부하다보니 귀무가설과 대립가설을 어떻게 설정해야 하는지 헷갈릴 때가 있었다. p-value에 따라 귀무가설의 기각 여부가 결정되니, 내가 어떻게 세우느냐에 따라 검정 결
velog.io
* scipy의 stats 라이브러리에 있는 함수들 외우기.
https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.ttest_ind.html
scipy.stats.ttest_ind — SciPy v1.10.1 Manual
[4] Yuen, Karen K. “The Two-Sample Trimmed t for Unequal Population Variances.” Biometrika, vol. 61, no. 1, 1974, pp. 165-170. JSTOR, www.jstor.org/stable/2334299. Accessed 30 Mar. 2021. [5] Yuen, Karen K., and W. J. Dixon. “The Approximate Behaviour
docs.scipy.org
Calculate the t-test on TWO RELATED samples of scores, a and b.
This is a test for the null hypothesis that two related or repeated samples have identical average (expected) values.
equal_var : bool, optional
alternative : {‘two-sided’, ‘less’, ‘greater’}, optional
독립표본 t검정
scipy.stats.ttest_ind 활용.
Calculate the T-test for the means of two independent samples of scores.
This is a test for the null hypothesis that 2 independent samples have identical average (expected) values. This test assumes that the populations have identical variances by default.
=> 정규분포의 가정
단일표본 t검정
=> scipy.stats의 ttest_1samp 함수 활용
모집단이 정규분포 따르고, 표본 크기가 충분히 크다는 가정.
from scipy.stats import ttest_1samp
# 데이터
scores = [75, 80, 68, 72, 77, 82, 81, 79, 70, 74, 76, 78, 81, 73, 81, 78, 75, 72, 74, 79, 78, 79]
# 모평균 가설검정
mu = 75 # 검정할 모평균
alpha = 0.05 # 유의수준
# t-test를 사용하여 가설 검정
t_statistic, p_value = ttest_1samp(scores, mu, alternative='greater')
# 결과 출력
print("t-statistic:", t_statistic)
print("p-value:", p_value)
if p_value < alpha:
print("귀무가설을 기각합니다. 모평균은 75보다 큽니다.")
else:
print("귀무가설을 채택합니다. 모평균은 75보다 크지 않습니다.")
이때 특히 함수명만 아니라, 해당 함수에 있는 인자(파라미터)들이 어떤식으로 구성되어 있는지 range 등 파악하기!
일원배치법
scipy.stats 의 f_oneway 함수 활용
import scipy.stats as stats
# 데이터
groupA = [85, 92, 78, 88, 83, 90, 76, 84, 92, 87]
groupB = [79, 69, 84, 78, 79, 83, 79, 81, 86, 88]
groupC = [75, 68, 74, 65, 77, 72, 70, 73, 78, 75]
# 일원배치법 수행
f_value, p_value = stats.f_oneway(groupA, groupB, groupC)
# F-value
print(round(f_value,2))
# p-value
print(format(p_value,'.6f'))
shapiro-wilk 검정
scipy.stats의 shapiro 함수 활용
from scipy import stats
data = [75, 83, 81, 92, 68, 77, 78, 80, 85, 95, 79, 89]
# Shapiro-Wilk 검정 수행
statistic, p_value = stats.shapiro(data)
# 결과 출력
print("Shapiro-Wilk 검정 통계량:", statistic)
print("p-value:", p_value)
# 유의 수준 0.05에서의 검정 결과 확인
alpha = 0.05
if p_value > alpha:
print("귀무 가설을 기각할 수 없다. 데이터는 정규 분포를 따름")
else:
print("귀무 가설을 기각한다. 데이터는 정규 분포를 따르지 않음")
* round 뒤에 인자 주의
*