📊 이중 독립표본 t-검정


📌 서로 독립인 두 집단의 평균 차이를 검정

  • 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)


📌 실습1) 이중 독립표본 t-검정

  • 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가 유의수준보다 높으므로 유의미한 결과를 도출할 수 없다고 판단
# -> 대립가설 기각
# -> 귀무가설 채택









📊 이중 동일표본 t-검정


📌 같은 표본 안에서의 평균 차이를 검정

  • paired samples t-test
    - 동일한 표본 내에서의 t-검정
    - 하나의 집단에 대해 독립변수를 적용하기 전과 후종속변수의 수준을 측정하고, 이들의 평균 차이를 통계적으로 확인

  • 예시
    - 광고 전 후의 상품 선호도
    - 매출액 평균의 차이

  • 주요 검정 절차
    1. 데이터 준비
    2. 두 집단의 정규성 확인
    3. 정규성 성립 여부에 따라 t-검정 전개

  • 사용 메소드

- 정규성 확인 : stats.shapiro(독립변수1)

- 이중 동일표본 t-검정 : stats.ttest_rel(독립변수1, 독립변수2)



📌 실습1) 이중 동일표본 t-검정

  • 어느 학급의 중간고사, 기말고사의 학업능력이 변화했다고 이야기 할 수 있는가?
    - 귀무가설 : 어느 학급의 중간고사, 기말고사 학업능력 평균 차이가 없다.
    - 대립가설 : 어느 학급의 중간고사, 기말고사 학업능력 평균 차이가 있다.

  • 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가 유의수준보다 낮으므로 유의미한 결과를 도출할 수 있다고 판단
# -> 대립가설 채택
# -> 귀무가설 기각


profile
데이터 사이언티스트를 목표로 하는 개발자

0개의 댓글