- independent samples t-test
- 독립적인 두 표본의 평균 차이를 검정하는 t-검정
- 남녀의 성적, A반과 B반의 키, 경기도와 충청도의 소득 따위의 서로 독립인 두 집단에서 얻은 표본을 독립표본(two sample)이라고 한다.
- 주요 검정 절차
1. 데이터 준비
2. 두 집단의 정규성 확인
3. 두 집단의 등분산성 확인
4. 정규성, 등분산성 성립 여부에 따라 t-검정 전개
- 사용 메소드
- 정규성 확인 : stats.shapiro(독립변수1)
- 등분산성 확인
- 등분산성 모수 검정일 경우
- stats.levene(독립변수1, 독립변수2)
- 등분산성 비모수 검정일 경우
- stats.bartlett(독립변수1. 독립변수2)
- 이중 독립표본 t-검정
- 등분산성 만족
- stats.ttest_ind(독립변수1, 독립변수2, equal_var=True)
- 등분산성 불만족
- stats.ttest_ind(독립변수1, 독립변수2, equal_var=False)
- 정규성 만족
- stats.mannwhitneyu(독립변수1, 독립변수2)
- 정규성 불만족
- stats.wilcoxon(독립변수1, 독립변수2)
- jikwon 테이블에서 총무부, 영업부 직원의 연봉의 평균에 차이가 존재하는지 검정하시오.
- 귀무가설 : 총무부, 영업부 직원의 연봉의 평균 차이가 없다.
- 대립가설 : 총무부, 영업부 직원의 연봉의 평균 차이가 있다.
1. 라이브러리 Import
import numpy as np import pandas as pd import scipy.stats as stats import MySQLdb import pickle
2. 데이터 준비
config = {} df = pd.DataFrame() with open("mydb.dat", 'rb') as f: config = pickle.load(f) try: conn = MySQLdb.connect(**config) sql = "SELECT buser_name, jikwon_pay FROM jikwon a INNER JOIN buser b ON a.buser_num=b.buser_no" df = pd.read_sql(sql, conn) df.columns = ['부서명', '연봉'] except Exception as e: print('err : ', e) finally: conn.close() print(df.head()) # 부서명 연봉 # 0 총무부 9900 # 1 영업부 8800 # 2 영업부 7900 # 3 전산부 4500 # 4 영업부 3000 print(df.info()) # # Column Non-Null Count Dtype # --- ------ -------------- ----- # 0 부서명 30 non-null object # 1 연봉 30 non-null int64
3. Null 값 확인
print(df.isnull().sum()) # 부서명 0 # 연봉 0
4. 총무부와 영업부로 표본 분리
df1 = df[df['부서명'] == '총무부'] df2 = df[df['부서명'] == '영업부'] pay1 = df1.iloc[:, [1]] pay2 = df2.iloc[:, [1]] print(pay1.head(3)) # 연봉 # 0 9900 # 9 3700 # 12 4900 print(pay2.head(3)) # 연봉 # 1 8800 # 2 7900 # 4 3000
5. 두 집단의 평균 차이 확인
print(pay1.mean()) # 연봉 5414.285714 print(pay2.mean()) # 연봉 4908.333333
6. 정규성 확인
pay1 = np.array(pay1)[:, 0] # array로 만들 때 2차원으로 생성되므로 인덱싱을 통해 차원 축소 수행 pay2 = np.array(pay2)[:, 0] # array로 만들 때 2차원으로 생성되므로 인덱싱을 통해 차원 축소 수행 print(stats.shapiro(pay1).pvalue) print(stats.shapiro(pay2).pvalue) # 0.02604489028453827 # 0.02560843899846077 # 정규성 분석 : 두 집단의 p-value 모두 유의수준보다 낮으므로 정규성을 만족하지 않는다.
7. 등분산성 확인
print(len(pay1), '\t', len(pay2)) # 7 12 -> 30개 이하의 데이터 개수를 갖으므로 비모수 검정[bartlett()] 수행 print(stats.bartlett(pay1, pay2).pvalue) # 0.718364632372039 # 등분산성 분석 : 두 집단의 등분산성 척도(p-value)가 유의수준보다 높으므로 등분산성 성립
8. 이중 독립표본 t-검정 전개
# 정규성 불만족, 등분산성 만족 print(stats.ttest_ind(pay1, pay2, equal_var=True).pvalue) # 등분산성 만족 # 0.6523879191675446 # 결과 분석 # 0.65(p-value) > 0.05(유의수준) # 대립가설의 p-value가 유의수준보다 높으므로 유의미한 결과를 도출할 수 없다고 판단 # -> 대립가설 기각 # -> 귀무가설 채택
- paired samples t-test
- 동일한 표본 내에서의 t-검정
- 하나의 집단에 대해 독립변수를 적용하기 전과 후의 종속변수의 수준을 측정하고, 이들의 평균 차이를 통계적으로 확인
- 예시
- 광고 전 후의 상품 선호도
- 매출액 평균의 차이
- 주요 검정 절차
1. 데이터 준비
2. 두 집단의 정규성 확인
3. 정규성 성립 여부에 따라 t-검정 전개
- 사용 메소드
- 정규성 확인 : stats.shapiro(독립변수1)
- 이중 동일표본 t-검정 : stats.ttest_rel(독립변수1, 독립변수2)
- 어느 학급의 중간고사, 기말고사의 학업능력이 변화했다고 이야기 할 수 있는가?
- 귀무가설 : 어느 학급의 중간고사, 기말고사 학업능력 평균 차이가 없다.
- 대립가설 : 어느 학급의 중간고사, 기말고사 학업능력 평균 차이가 있다.
- 1. 라이브러리 Import
import numpy as np import scipy.stats as stats
- 2. 데이터 준비
mid = np.array([80, 75, 85, 50, 60, 75, 45, 70, 90, 95, 85, 80]) fin = np.array([90, 70, 90, 65, 80, 85, 65, 75, 80, 90, 95, 95]) print(mid) print(fin) # [80 75 85 50 60 75 45 70 90 95 85 80] # [90 70 90 65 80 85 65 75 80 90 95 95]
- 3. 평균 차이 확인
print(mid.mean()) print(fin.mean()) # 74.16666666666667 # 81.66666666666667
- 4. 정규성 확인
print(stats.shapiro(mid).pvalue) print(stats.shapiro(fin).pvalue) # 0.3681465983390808 # 0.19300280511379242 # 정규성 분석 : 두 집단 모두 유의수준을 넘는 값을 갖으므로 정규성 성립(정규분포를 따름)
- 5. 이중 동일표본 t-검정 전개
# 정규성 만족 print(stats.ttest_rel(mid, fin)) # Ttest_relResult(statistic=-2.6281127723493993, pvalue=0.023486192540203194) # 결과 분석 # 0.02(p-value) < 0.05(유의수준) # 대립가설의 p-value가 유의수준보다 낮으므로 유의미한 결과를 도출할 수 있다고 판단 # -> 대립가설 채택 # -> 귀무가설 기각