통계 뿌시기 - 검정

수수수수퍼노인·2025년 9월 17일

통계 뿌시기

목록 보기
3/11
post-thumbnail

" A / B 검정 "

A / B 검정

A와 B 중 어느 것이 더 효과적인지 평가하기 위해 사용되는 검정 방법

방법 : 사용자들을 두 그룹으로 나누고 각 그룹에 다른 버전을 제공한 후 반응을 비교

목적 : 두 그룹 간의 변화가 우연이 아니라 통계적으로 유의미한지 확인

사례 : 마케팅, 웹사이트 디자인 등

  • 전환율, 클릭률, 구매수, 방문 기간, 방문 페이지 수, 특정 페이지 방문 여부, 매출 등의 지표를 비교
  • 온라인 쇼핑몰에서 2가지 디자인에 대한 랜딩 페이지를 테스트하여 어떤 디자인이 더 높은 구매 전환율을 가져오는지 평가
# 원칙적으로 Z-검정 or 피셔 정확검정을 사용해야 하나, 간단하게 보여주기 위해 t-test로 진행
# 표본 크기가 크고 전환율이 극단적이지 않다는 가정 -> 이런 경우 t-test 결과는 z-검정 결과와 거의 같음

# 가정된 전환율 데이터
group_a = np.random.binomial(1, 0.30, 100)  # 30% 전환율
group_b = np.random.binomial(1, 0.45, 100)  # 45% 전환율

# t-test를 이용한 비교
t_stat, p_val = stats.ttest_ind(group_a, group_b)
print(f"T-Statistic: {t_stat}, P-value: {p_val}")

" 가설 검정 "

가설 검정

표본 데이터를 통해 모집단의 가설을 검증, 데이터가 특정 가설을 지지하는지 평가하는 과정

귀무가설(H0)과 대립가설(H1)을 설정하고 귀무가설을 기각할지를 결정

  • 귀무가설(H0) : 기존에 알고 있는 것
  • 대립가설(H1) : 알고 싶은 것, 알려고 하는 것

검정을 왜 할까?

  • 모수에 대해 어떤 주장(가설)을 세우고, 추정한 값으로 그것이 타당한지 검정하는 것
    • 추정한 값을 이용해서, 모집단에 대한 특정 가설이 표본 데이터와 일치하는지 통계적으로 판단
    • 통계량 : 표본의 함수, 표본의 식
    • 표본의 추정량 : 특정 모수를 추정하기 위해 사용하는 통계량
      • 불편추정량 : 표본의 기댓값 = 모수
      • 일치추정량 : 표본의 크기가 커질수록 추정량이 모수에 수렴
      • 유효추정량 : 추정량 중에 분산이 가장 작은 것
      • 충분추정량 : 모수에 대한 정보를 가장 많이 담고 있는 추정량

방법

  • 확증적 자료분석 : 미리 가설을 세운 다음 검증해 나가는 분석
  • 탐색적 자료분석 : 미리 가설을 세우지 않고 데이터를 탐색해보며 가설 후보를 찾고 데이터의 특징을 찾는 것

단계

  • 귀무가설(H0)과 대립가설(H1) 설정
  • 유의수준(ɑ) 결정
    • “얼마나 엄격하게 H0을 기각할지” 결정하는 기준값
    • H0이 참인데도 잘못 기각할 확률의 최대 허용치
    • α = 0.05 → H0이 참이어도, 극단적인 결과로 기각할 확률이 5%다
    • 검정의 신뢰 수준(confidence level) : 1 − α
  • 검정통계량 계산
    • 검정통계량 : 검정을 위한 표본의 식
      • 귀무가설에서 검정하고자 하는 것에 따라 달라짐
        • ex) H0 : 두 집단 평균 차이가 없다 → t검정 사용
  • p-값과 유의수준(ɑ) 비교
    • p-값 ≤ ɑ : 귀무가설(H0) 기각, 대립가설(H1) 채택
    • p-값 > ɑ : 귀무가설(H0) 채택, 대립가설(H1) 기각
  • 결론 도출

통계적 유의성

결과가 우연히 발생한 것이 아니라 어떤 효과가 실제로 존재함을 나타내는 지표

p-값

  • H0이 참일 때, 현재 관측값(= 검정통계량 값)보다 극단적인 결과가 나올 확률
    • 왜 H0이 참일 때? 우리가 알고 있는 것에 기반해서 확인해야 하니까
  • 왜 p-값 ≤ ɑ : 귀무가설(H0) 기각, 대립가설(H1) 채택할까 ?
    • p-값이 작다는 것은 검정통계량 값이 오른쪽(혹은 왼쪽) 끝에 위치함을 의미 = 귀무가설을 참이라고 하기 어려움
  • p-값이 0.03이라면, 3%의 확률로 우연히 이러한 결과가 나올 수 있음을 의미

제 1종 오류와 제 2종 오류

  • 제 1종 오류 : 귀무가설이 참인데 기각하는 오류
    • 아무런 영향이 없는데 영향이 있다는 결론 도출
    • 잘못된 긍정, 위양성
    • ɑ를 경계로 귀무가설을 기각하므로, 제 1종 오류는 ɑ만큼 발생
      • ɑ를 정함으로써 제 1종 오류 제어 가능
  • 제 2종 오류 : 귀무가설이 거짓인데 채택하는 오류
    • 영향이 있는데 영향이 없다는 결론 도출
    • 잘못된 부정, 위음성
    • β = 제 2종 오류가 일어날 확률
      • β를 통제할 수 없음
      • 표본의 크기가 커질수록 β가 작아짐
      • ɑ와 β는 상충관계, ɑ가 너무 작으면 β가 커짐

신뢰구간과 가설검정

둘 다 데이터의 모수에 대한 정보를 구하고자 하는 것이지만 접근 방식이 다름

  • 신뢰구간 : 특정 모수가 포함될 범위를 제공
  • 가설검정 : 모수가 특정 값과 같은지 다른지 테스트

사례 : 새로운 약물이 기존 약물보다 효과 있는지 검정

  • 귀무가설(H0) : 새로운 약물은 기존 약물과 큰 차이가 없다
  • 대립가설(H1) : 새로운 약물이 기존 약물과 대비해 효과가 있다
# 기존 약물(A)와 새로운 약물(B) 효과 데이터 생성
A = np.random.normal(50, 10, 100)
B = np.random.normal(55, 10, 100)

# 평균 효과 계산
mean_A = np.mean(A)
mean_B = np.mean(B)

# t-검정 수행
t_stat, p_value = stats.ttest_ind(A, B)

print(f"A 평균 효과: {mean_A}")
print(f"B 평균 효과: {mean_B}")
print(f"t-검정 통계량: {t_stat}")
print(f"p-값: {p_value}")

# t-검정의 p-값 확인 (위 예시에서 계산된 p-값 사용)
print(f"p-값: {p_value}")
if p_value < 0.05:
    print("귀무가설을 기각합니다. 통계적으로 유의미한 차이가 있습니다.")
else:
    print("귀무가설을 기각하지 않습니다. 통계적으로 유의미한 차이가 없습니다.")

" t 검정 "

t 검정

작은 표본에서 두 집단 간의 평균 차이가 통계적으로 유의미한지 검정

표본 수가 적거나 모집단 분산을 모를 때 t-분포를 이용

방법

  • 단일표본 t-검정 : 한 집단의 평균과 특정 값 비교
    • “우리 학급 학생 평균 키가 170cm와 같은가?”
  • 독립표본 t-검정 : 서로 다른 두 집단의 평균 비교
    • “남학생과 여학생의 평균 키 차이 검정”
  • 대응표본 t-검정 : 같은 집단에서 전후 평균 비교
    • “다이어트 전후 체중 변화 검정”

사례

  • 단일표본 t 검정 : 학생 평균 점수가 70점과 같은가?
  • 독립표본 t 검정 : 두 클래스의 시험 성적 비교
  • 대응표본 t 검정 : 같은 학생의 시험 전후 평균 차이 비교
# 학생 점수 데이터
scores = np.random.normal(72, 8, 25)  # 평균 72, 표준편차 8, 표본 25개

# 단일표본 t검정 (평균 70과 비교)
t_stat, p_val = stats.ttest_1samp(scores, 70)
print(f"단일표본 t검정, T-Statistic: {round(t_stat, 2)}, P-value: {round(p_val, 3)}")

# 학생 점수 데이터
scores_method1 = np.random.normal(70, 10, 30)
scores_method2 = np.random.normal(75, 10, 30)

# 독립표본 t검정
t_stat, p_val = stats.ttest_ind(scores_method1, scores_method2)
print(f"독립표본 t검정, T-Statistic: {round(t_stat, 2)}, P-value: {round(p_val, 3)}")

# 같은 학생의 시험 전후 점수
scores_before = np.random.normal(68, 7, 20)
scores_after  = scores_before + np.random.normal(5, 3, 20)  # 평균 +5 점 상승

# 대응표본 t검정
t_stat, p_val = stats.ttest_rel(scores_before, scores_after)
print(f"대응표본 t검정, T-Statistic: {round(t_stat, 2)}, P-value: {round(p_val, 3)}")

" 다중 검정 "

다중 검정

여러 가설을 동시에 검정, 1종 오류 증가 문제

문제

  • 단일 검정에서 유의수준 α = 0.05 → 5% 확률로 1종 오류
  • 20번 검정 → 평균적으로 1종 오류가 1회 발생할 가능성
  • 1,000번 검정 → 50회 정도 1종 오류 발생 예상

즉, 다중 검정을 그냥 하면 거짓 양성(false positive)이 많아짐

해결방법

  • 본페로니 보정 : α를 검정 수 m으로 나눠 사용
    • α_corrected = α / m
  • 튜키 보정, 던넷 보정, 윌리엄스 보정 등

사례 : 세 그룹 간 평균 차이 검정

# 세 그룹의 데이터 생성
np.random.seed(42)
group_A = np.random.normal(10, 2, 30)
group_B = np.random.normal(12, 2, 30)
group_C = np.random.normal(11, 2, 30)

# 세 그룹 간 평균 차이에 대한 t검정 수행
p_values = []
p_values.append(stats.ttest_ind(group_A, group_B).pvalue)
p_values.append(stats.ttest_ind(group_A, group_C).pvalue)
p_values.append(stats.ttest_ind(group_B, group_C).pvalue)

# 본페로니 보정 적용
alpha = 0.05
adjusted_alpha = alpha / len(p_values)  # 3개(p_value 개수)로 나눔

# 결과 출력
print(f"본페로니 보정된 유의 수준: {adjusted_alpha:.4f}")
for i, p in enumerate(p_values):
    if p < adjusted_alpha:
        print(f"검정 {i+1}: 유의미한 차이 발견 (p = {p:.4f})")
    else:
        print(f"검정 {i+1}: 유의미한 차이 없음 (p = {p:.4f})")

" 카이제곱 검정 "

카이제곱 검정

범주형 데이터의 적합도 검정, 독립성 검정, 동질성 검정

적합도 검정

  • 범주형 데이터의 관찰 빈도 vs 기대 빈도 일치 여부 비교
  • 데이터 형태 : 단일 범주형 변수
  • 주사위가 공정한가? (1~6 면 동일 확률인가)
    • p-값 ≤ α : 주사위가 공정하지 않을 가능성 있음
    • p-값 > α : 주사위가 공정하다고 볼 수 있음

독립성 검정

  • 두 범주형 변수 간 연관성 검정
  • 데이터 형태 : 교차표(cross-tab)
  • 성별과 흡연 여부 관련성 검정
    • p-값 ≤ α : 성별과 흡연 여부 연관 있음
    • p-값 > α : 성별과 흡연 여부는 독립 관계임

동질성 검정

  • 여러 집단의 범주형 분포가 동일한지 비교
  • 데이터 형태 : 교차표(cross-tab)
  • 지역별 선호 브랜드 분포 비교
    • p-값 ≤ α : 지역별 선호 브랜드 차이가 있음
    • p-값 > α : 지역별 선호 브랜드 차이가 통계적으로 유의하지 않음

사례

  • 적합도 검정 : 주사위가 공정한가? (1~6 면 동일 확률인가)
  • 독립성 검정 : 성별과 흡연 여부 관련성 검정
  • 동질성 검정 : 지역별 선호 브랜드 분포 비교
# 적합도 검정
observed = [20, 30, 25, 25]
expected = [25, 25, 25, 25]
chi2_stat, p_value = stats.chisquare(observed, f_exp=expected)
print(f"적합도 검정 카이제곱 통계량: {chi2_stat:.2f}, p-값: {p_value:.3f}")

# 성별과 흡연 여부 독립성 검정
observed = np.array([[30, 10], [20, 40]])
chi2_stat, p_value, dof, expected = stats.chi2_contingency(observed)
print(f"독립성 검정 카이제곱 통계량: {chi2_stat:.2f}, p-값: {p_value:.3f}")

# 예시 데이터: 지역별 선호 브랜드 (A, B, C)
# 행 = 지역 (서울, 부산, 대구), 열 = 브랜드 (A, B, C)
observed = np.array([
    [30, 50, 20],  # 서울
    [25, 35, 40],  # 부산
    [20, 40, 40]   # 대구
])

# 동질성 검정 (카이제곱 독립성 검정 사용 가능)
chi2_stat, p_value, dof, expected = stats.chi2_contingency(observed)
print(f"동질성 검정 카이제곱 통계량: {chi2_stat:.2f}, p-값: {p_value:.3f}")
profile
화이팅구리

1개의 댓글

comment-user-thumbnail
2025년 9월 17일

주인장 이걸로 공부하니까 잘 들어오네요

답글 달기