데이터분석 study/통계학 기초

TIL_24.08.07_ 가설검정의 주의점

justdata 2024. 8. 7. 14:04

주차를 나누어서 작성하는 것이 좋을 것 같아

TIL을 나누어서 작성했다.

https://justdata.tistory.com/49

 

TIL_24.08.07_상관계수

상관계수5.1 피어슨 상관계수두 연속형 변수 간의 선형관계를 측정하는 지표-1에서 1사이의 값을 가지며1은 완전한 양의 선형 관계-1은 완전한 음의 선형 관계0은 선형 관계가 없음을 의미 피어

justdata.tistory.com

 

 

6.1 재현가능성

우연히 결과가 나오는 것이 아닌, 항상 일관된 결과가 나오는지 확인해야 한다.

1) 재현 가능성이란 무엇인가

  • 동일한 연구나 실험을 반복했을 때 일관된 결과가 나오는지 여부. 연구의 신뢰성을 높이는 중요한 요소.
  • 가설 검정 원리상의 문제나 가설검정의 잘못된 사용이 낮은 재현성으로 이어진다는 문제 발생
  • 최근 논문을 다시 재현해서 실험을 해보는데 똑같은 결과가 안나오는 사례가 많은... 재현성 위기가 문제가 되고 있다.

중요성

  • 결과가 재현되지 않는다면 해당 가설의 신뢰도 떨어짐.

2) 재현성 위기의 원인

실험 조건을 동일하게 조성하기 어려움

  • 완전 동일하게 다시 똑같은 실험을 수행하는 것이 쉽지 않음
  • 또한 가설검정 자체도 100% 검정력을 가진것이 아니기 때문에 오차가 나타날 수 있음.

가설 검정 사용 방법에 있어서 잘못됨

  • p값이 0.05가 유도되게끔 조작하는 것이 가능(p해킹)
  • 실제로는 통계적으로 아무 의미가 없음에도 의미가 있다고 해버리는 1종 오류를 저지를 수 있다.
  • 0.05라는 것은 100번 중에 5번 즉, 20번 중에 1번은 귀무가설이 옮음에도 불구하고 기각될 수 있다.
  • 유의수준으로 통제하는 것이 중요
  • 하지만, 유의수준을 너무 낮추면 베타값이 커져버리는 문제발생..
  • 따라서 , 어떤 논문에서는 유의수준을 0.005로 설정하면서 데이터 수를 70% 더 늘려서 베타 값도 컨트롤 하는 방향을 제안하기도 한다.

 

6-2 p-해킹

인위적으로 p-값을 낮추지 않을 수 있도록 조심해야 한다.

  • p-해킹은 데이터 분석을 반복하여 p-값을 인위적으로 낮추는 행위
  • 유의미한 결과를 얻기 위해 다양한 변수를 시도하거나, 데이터를 계속해서 분석하는 등의 방법을 포함
  • 마음에 드는 상황만 골라서 보고해서도 안됨 모든 결과를 다보고하거나 더 엄격한 추가실험을 수행
  • 가능한 가설을 미리 세우고 검증하는 가설검증형 방식으로 분석을 해야 하며 만약 탐색적으로 분석한 경우 가능한 모든 변수를 보고하고 본페로니 보정과 같은 방법을 사용해야 함.

 

6-3 선택적 보고

조심해야 하는 부분

  • 유의미란 결과만 공개할 때
    • 다수의 데이터 분석 중 유의미한 결과가 나온 실험만을 보고서에 작성하여 발표
  • 결과를 보면서 가설을 다시 새로 설정했는데 마치 처음부터 설정한 가설이라고 얘기할 때
    • 미리 가설과 실험 방법 등에 대해서 설정을 한 다음 연구를 수행하거나 연구하는 동안 얻어진 모든 변수와 결과에 대해서 공개하지 못할 때

 

6-4 자료수집 중단 시점 결정

자료수집 중단 시점 결정

  • 데이터 수집을 시작하기 전에 언제 수집을 중단할지 명확하게 결정하지 않으면, 원하는 결과가 나올 때가지 데이터를 계속 수집할 수 있음. 이는 결과의 신뢰성을 떨어뜨림

* 코드실습을 하기 전에 colab에서 한글폰트가 깨졌을 때 한글폰트 설치하는 방법

   - 구글 colab에서 시각화 라이브러리 (matplotlib, seaborn)을 사용하게 되면

      한글 깨짐 현상이 나타난다.

 

* 해결 방법 

   step 1. colab 파일을 연 뒤 첫 번째 cell에 아래 코드를 실행 후 런타임 재시작

!sudo apt-get install -y fonts-nanum
!sudo fc-cache -fv
!rm ~/.cache/matplotlib -rf

 

   step 2. matplotlib의 폰트를 설치한 폰트로 지정 
 
import matplotlib.pyplot as plt
plt.rc('font', family='NanumBarunGothic')

 

예시)

!sudo apt-get install -y fonts-nanum
!sudo fc-cache -fv
!rm ~/.cache/matplotlib -rf

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats

# 데이터 수집 예시
np.random.seed(42)
data = np.random.normal(0,1,1000)
sample_sizes = [10,20,30,40,50,100,200,300,400,500]
p_values = []

for size in sample_sizes:
  sample = np.random.choice(data, size)
  _, p_value = stats.ttest_1samp(sample,0)
  p_values.append(p_value)

plt.rc('font', family='NanumBarunGothic')

# p-값 시각화
plt.plot(sample_sizes, p_values, marker = 'o')
plt.axhline(y=0.05, color='r', linestyle='--', linewidth=1)
plt.title('자료수집 중단 시점에 따른 p-값 변화')
plt.xlabel('샘플 크기')
plt.ylabel('p-값')
plt.show()

 

 

 

6-5 데이터 탐색 및 검증 분리

  • 데이터 탐색과 검증을 분리하면 탐색 과정에서 발견된 패턴이
  • 검증 데이터에서도 유효한지 확인 가능
  • 검증 데이터는 철저하게 탐색 데이터와 구분되어져야 함

데이터 탐색과 검증 분리는 언제 사용해야 하는가?

  • 검증하기 위한 데이터가 따로 필요할 때
    • 데이터셋을 탐색용(training) 과 검증용 (test)으로 분리하여 사용

 

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score

# 데이터 생성
np.random.seed(42)
x = 2 * np.random.rand(100,1)
y = 4 + 3 * x + np.random.randn(100,1)

# 데이터 분할 (탐색용 80%, 검증용 20%)
x_train, x_test, y_train, y_test = train_test_split(x,y, test_size=0.2,random_state=42)

# 모델 학습
model = LinearRegression()
model.fit(x_train, y_train)

# 탐색용 데이터로 예측
y_train_pred = model.predict(x_train)

# 검증용 데이터로 예측
y_test_pred = model.predict(x_test)

# 탐색용 데이터 평가
train_mse = mean_squared_error(y_train, y_train_pred)
train_r2 = r2_score(y_train, y_train_pred)
print(f'탐색용 데이터셋 MSE: {train_mse}')
print(f'탐색용 데이터셋 R^2: {train_r2}')
# -- 탐색용 데이터셋 MSE: 0.8476788564209705
# -- 탐색용 데이터셋 R^2: 0.7582381034538057

# 검증용 데이터 평가
test_mse = mean_squared_error(y_test, y_test_pred)
test_r2 = r2_score(y_test, y_test_pred)
print(f'검증용 데이터셋 MSE: {test_mse}')
print(f'검증용 데이터셋 R^2: {test_r2}')
# -- 검증용 데이터셋 MSE: 0.6536995137170021
# -- 검증용 데이터셋 R^2: 0.8072059636181392