[proDS] 가설검정 : t-test

Gammi·2022년 11월 25일
0

proDS

목록 보기
11/13

🔗 참고

귀무가설 : 두 집단 간 평균이 같다
대립가설 : 두 집단 간 평균이 같지 않다




📕 단일 표본 t 검정(One Sample t-test)


  • 단일 모집단에서 추출된 하나의 표본이 대상

  • 원래 t검정은 두 집단 간의 평균 비교하는 건데 샘플이 하나?

    -> 하나는 모평균임!

    => 모평균과 표본평균의 차이 검정


✔ scipy - ttest_1samp()


  • 단일 표본 t검정 실시할 때 사용

  • popmean 파라미터에 모평균 입력

  • popmean 파라미터에 모평균과 같은 값 입력하면 1 출력(귀무가설 기각X),

    모평균과 멀어질수록 0 출력

  • 검정통계량, p-value 출력


import pandas as pd
from scipy.stats import ttest_1samp

ir = pd.read_csv("iris.csv")
stat, p = ttest_1samp(ir["Sepal.Length"], popmean = 4) 
print(round(stat,2))
print(round(p, 2))
# p-value 0 나옴
# 모평균과 표본평균 다르다
# 귀무가설 기각한다
# 모평균은 ir["Sepal.Length"].mean() 이렇게 구하는데 5.84임





📕 대응 표본 t-검정


  • 동일한 모집단으로부터 추출된 두 표본 집단이 대상

✔ scipy - ttest_rel()


  • 대응 표본 t검정 실시할 때 사용

  • 검정에 실시하는 두 변수 차례대로 지정


import pandas as pd
from scipy.stats import ttest_rel

stat, p = ttest_rel(ir["Sepal.Length"], ir["Sepal.Width"])
# 변수 두 개 넣고 출력
print(round(stat,2))
print(round(p, 2))
# round() 함수 이용해서 소수점 둘째자리까지 출력
# 이렇게 출력했을 때
# 검정 통계량은 34.82, p-value는 0.0 출력됨
# p-value의 값이 0이니까 두 평균 다르다
# 따라서 귀무가설을 기각함





📕 독립 2 표본 t-검정


  • 독립된 두 표본집단이 대상

  • 등분산 여부에 따라 검정통계량 계산식 다름

  • 보통 t-test하면 이 경우가 제일 많음


✔ scipy - ttest_ind()


  • 독립 2 표본 t검정 실시할 떄 사용

  • 검정에 실시하는 두 변수 차례대로 지정

  • 등분산 가정 만족하는 경우, equal_var 파라미터에 True 값 할당


import pandas as pd
form scipy.stats import ttest_ind

ir = pd.read_csv("iris.csv")
ir["Species"].unique()
# 중복 제거한 값 출력됨

stat, p = ttest_ind(ir.loc[ir["Species"] == "setosa", "Petal.Length"],
                    ir.loc[ir["Species"] == "versicolor", "Petal.Length"])
# Species가 setosa인 것과 versicolor인 거의 꽃잎 길이 출력한 거임                    
print(round(stat,3))
print(round(p,3))





  1. 자료가 수집된 지역의 평균 온도는 20도라고 한다. 수집된 데이터를 사용하여 양측 검정을 실시했을 때 p-value는 얼마인가?
import pandas as pd
form scipy.stats import ttest_1samp
df = pd.read_csv("bike.csv")

stat, p = ttest_1samp(df["temp"], popmean = 20)
# 자료가 수집된 지역의 평균 온도가 20도 = 모평균이 20도
print(round(p,3))
# p-value만 물어봤으니까 p만 출력해도 됨!
# 출력하면 0.002 나옴ㅎㅎ



  1. 2011년 1월의 데이터를 대상으로 동 시간대의 casual과 registered의 평균차이 검정 시 검정통계량은?
import pandas as pd
form scipy.stats import ttest_rel
df = pd.read_csv("bike.csv")

df["datetime"] = pd.to_datetime(df["datetime"])
df["year"]= df["datetime"].dt.year
df["month"]= df["datetime"].dt.month
# 필요한 게 2011년 1월이니까 년도랑 월 변수 따로 뽑아줌

df_sub = df.loc[(df["year"] == 2011) & (df["month"]==1),]
# 2011년 1월만 따로 뽑아서 저장
stat, p = ttest_1samp(df_sub["casual"], df_sub["registered"])
print(round(abs(stat),3))



  1. 주중과 주말의 registered 평균 검정 시 검정통계량은?
import pandas as pd
form scipy.stats import ttest_ind
df = pd.read_csv("bike.csv")

df["datetime"] = pd.to_datetime(df["datetime"])
df["wday"] = df["datetime"].dt.weekday
df["hday"] = (df["wday"] >=5) + 0
# 새로운 컬럼 만들 때는 loc나 iloc 사용 안함...
# 주말은 5, 6번이니까 주말은 1에 저장, 나머지(주중)는 0에 저장

stat, p = ttest_ind(df.loc[df["hday"] == 1, "registered"],
					df.loc[df["hday"] == 0, "registered"])
print(round(abs(stat),3))
profile
개발자가 되었어요⭐️

0개의 댓글