- 정규성 검정
* 예시
어느 회사의 직원들의 월급 데이터가 있다. 이 데이터가 정규 분포를 따르는지 확인하고 싶다. 주어진 월급 데이터를 사용하여 정규성 검정을 수행하고 결과를 해석한다.
salaries = [3500, 4000, 4000, 4500, 5000, 5000, 5500, 6000, 6500, 7000] # 월급
from scipy import stats
t_statistic, p_value = stats.shapiro(salaries)
t_statistic, p_value
if p_value >= 0.05:
print("귀무가설 : 데이터는 정규성을 만족합니다")
else:
print("대립가설 : 데이터는 정규성을 만족하지 않습니다")
# out:
귀무가설 : 데이터는 정규성을 만족합니다
>> stats.shapiro() : 정규성 검정을 수행하는 함수 중 하나
# 정규성 검정 : 데이터가 정규 분포를 따르는지를 확인하는 통계적인 방법 중 하나
# statistic은 검정 통계량이며, p_value는 귀무 가설이 참일 때 해당 검정 통계량 이상으로 극단적인 결과를 얻을 확률
# 일반적으로 p-value가 0.05보다 작으면 귀무 가설을 기각하고, 데이터가 정규 분포를 따르지 않는다고 판단
- 단일표본 T 검정
* 예시
주어진 데이터(data/trees.csv)에는 블랙 체리나무 31그루의 둘레와 높이, 부피가 저장되어 있다. 이 표본의 평균이 모평균과 일치하는지 단일표본 t-검정(One Sample t-test)을 통해 답하고자 한다. 가설은 아래와 같다.(단, 데이터의 각 변수들은 정규 분포를 만족한다고 가정한다.)
>가설검정
귀무가설 : 평균은 75이다.
대립가설 : 평균은 75가 아니다.
>데이터의 변수
Girth : 둘레
Height : 높이
Volume : 부피
(1) 검정통계량 구하기(반올림해서 소수점 둘째자리까지 계산)
import pandas as pd
df = pd.read_csv("./data/trees.csv") # 데이터 불러오기
from scipy import stats
t_score, p_value = stats.ttest_1samp(df['Height'],popmean=75)
print(round(t_score,2), round(p_value,2))
# out:
0.87 0.39
>> stats.ttest_1samp() : 특정한 가설적 평균과 표본 평균 간의 차이를 검정하여 두 값이 통계적으로 유의미한 차이가 있는지를 판단하는 데 사용
>> popmean : 가설적 평균
(2) p값을 반올림하여 소수점 넷째자리까지 구하고 유의수준 0.05하에서 가설검정의 결과를 채택/기각 중 하나로 선택하기
print(round(p_value, 4)) # 소수점 넷째 자리까지 반올림
if p_value >= 0.05:
print("채택")
else:
print("기각")
# out:
0.3892
채택
- 대응표본 T 검정
* 예시
주어진 데이터(data/insectsprays.csv)에는 여러 지역에서 스프레이를 뿌리기 전에 측정한 곤충의 수와 스프레이를 뿌린 다음의 곤충의 수가 저장되어 있다. 해당 스프레이가 구제 효과가 있는지(즉, 스프레이를 뿌린 뒤 곤충의 수가 감소했는지) 쌍체표본 t-검정(Paired t-test)을 통해 답하고자 한다.
> 가설검정 (d: 살충체를 뿌린 후의 곤충 수 - 살충제를 뿌리기 전의 곤충 수)의 평균
귀무가설 : d는 0이다.
대립가설 : d는 0이 아니다.
> 데이터의 변수
before_spr : 살충제 뿌리기 전 곤충의 수
after_spr : 살충제 뿌린 뒤 곤충의 수
> 단, d는 정규분포를 만족한다.
(1) 표본평균 구하기
import pandas as pd
df = pd.read_csv("./data/insectsprays.csv") # 데이터 불러오기
diff = df['after_spr']-df['before_spr']
print(round(diff.mean(),2))
# out:
-12.0
(2) 검정통계량 구하기(소수점 둘째 자리까지 반올림)
from scipy import stats
t_score, p_value = stats.ttest_rel(df['before_spr'], df['after_spr'])
print(round(t_score, 2), round(p_value, 2))
# out:
14.89 0,0
>> stats.ttest_rel(data1, data2) : 두 표본(data1, data2) 간의 평균 차이를 검정하여 검정 통계량과 p-value를 반환한다
이 검정은 보통 동일한 개체 또는 실험 단위에서 얻은 두 관련된 표본에 대해 사용됨. 관련된 표본 t-검정은 두 표본의 차이가 0인지 여부를 확인하여 두 집단 간의 차이를 검정함
- 독립표본 T 검정
*예시
주어진 데이터(data/toothgrowth.csv)에는 기니피그 60마리의 치아 길이, 투여한 비타민 C 종류, 투여량이 저장되어 있다. 오렌지주스를 투여받은 기니피그의 치아 길이 평균이 아스코르브산을 투여받은 기니피그의 치아 길이 평균과 일치하는지 t-검정(Two Sample t-test)를 통해 답하고자 한다. 가설은 아래와 같다.
> 가설검정
귀무가설 : 투여한 약제별 치아의 길이는 같다.
대립가설 : 투여한 약제별 치아의 길이는 같지 않다.
> 데이터의 변수
len : 치아의 길이
supp : 투여한 약제(VC: 아스코르브산, OJ: 오렌지주스)
does : 투여량
> 단, 데이터의 각 변수들은 정규분포를 만족한다.
(1) 등분산성 검정(독립표본 T-검정은 정규성 검정 뿐만 아니라, 두 그룹이 등분산성을 만족하는지 확인하는 작업 필요)
import pandas as pd
df = pd.read_csv("./data/toothgrowth.csv") # 데이터 불러오기
from scipy import stats
stats.levene(df.loc[df['supp'] == "VC", 'len'], df.loc[df['supp'] == "OJ", 'len'])
# out:
LeveneResult(statistic=1.2135720656945064, pvalue=0.2751764616144052)
>> p_value가 0.05보다 큼 = 귀무가설 채택 = 두 그룹 간의 분산이 통계적으로 같다
>> 즉 두 그룹이 등분산성을 만족한다.
>> stats.levene() : Levene의 등분산성 검정(Levene's test for equality of variances)을 수행하는 함수. 이 검정은 두 개 이상의 그룹 간의 분산이 동일한지를 확인하는 데 사용됨
(2) 표본평균 OJ, VC 구하기
OJ_result = df.loc[df['supp'] == 'OJ', 'len'].mean()
round(OJ_result, 2)
# out:
20.66
VC_result = df.loc[df['supp'] == 'VC', 'len'].mean()
round(VC_result, 2)
# out:
16.96
(3) 검정통계량 구하기(소수점 둘째 자리까지 반올림)
from scipy import stats
t_score, p_value = stats.ttest_ind(df.loc[df['supp']=="VC",'len'],
df.loc[df['supp']=="OJ",'len'],
equal_var = True) # equal_var=True : 등분산성 만족
print(round(t_score, 2), round(p_value, 2))
# out:
-1.92 0.06
>> stats.ttest_ind(그룹1, 그룹2) : 두 독립적인 표본 간의 t-검정(Independent Samples t-test)을 수행하는 함수. 이 검정은 두 개의 독립적인 그룹 간의 평균 차이가 통계적으로 유의미한지를 평가함.
'Python' 카테고리의 다른 글
[Streamlit] Input widgets(예시/연습) (1) | 2024.01.29 |
---|---|
캐글 튜토리얼 연습 (0) | 2024.01.16 |
가설검정 (2표본 문제에 관한 가설검정) (1) | 2024.01.11 |
가설검정 (t-검정/가설검정 오류/양측검정과 단측검정) (1) | 2024.01.11 |
[plotly] 사용법 간단 정리 (0) | 2024.01.09 |