오랑우탄의 반란

[기초통계] 가설검정의 주의점 (파이썬) 본문

PYTHON/데이터분석

[기초통계] 가설검정의 주의점 (파이썬)

5&2 2024. 8. 2. 17:27
반응형

 

기초통계 시리즈의 마지막으로 가설검정의 주의점에 대해 간단하게 짚고 넘어가겠습니다.

 

재현 가능성, p해킹, 선택적 보고

  • 동일 연구나 실험을 반복했을 때 결과가 일관되게 재현이 가능해야 하고, 이는 연구의 신뢰성을 높여줌.
  • 하지만 0.05 수준의 p값에 대해 가설검정의 잘못된 사용이 낮은 재현성으로 이어진다는 문제가 발생하고 있다고 함
  • 0.05라는 것은 20번 중에 1번은 귀무가설이 옳을 수 있음에도 이것이 기각될 수 있다는 얘기인데, 이런 오류를 피하기 위해 데이터 모수를 늘리는 방향이 제안됨
  • p해킹이란 p값을 인위적으로 낮추고자 데이터 분석을 반복하거나, 유의미한 결과를 얻기 위해 분석을 반복하는 것
  • 결과에 따라 가설을 변경하거나 데이터 개수를 늘려서 결과에 이를 맞추려고 하면 안됨
  • 유의미한 결과, 유의미하지 않은 결과 모두 보고해야 함

 

자료수집 중단 시점 결정

  • 데이터 수집을 시작하기 전에 언제 수집을 중단할지 명확하게 결정하지 않으면 원하는 결과가 나올 때까지 데이터를 계속 수집할 수 있으며, 이는 결과의 신뢰성을 떨어뜨림
  • 예) 50명의 데이터를 수집하기로 했으나, 원하는 결과가 나오지 않자 100명까지 추가로 수집
# 데이터 수집 예시
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)

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

 

 

데이터 탐색과 검증 분리

  • 데이터 탐색을 통해 가설을 설정하고, 이를 검증하기 위해 별도의 독립된 데이터셋을 사용하는 것으로, 이는 데이터 과적합을 방지하고 결과의 신뢰성을 높임
  • 데이터셋을 탐색용(training)과 검증용(test)으로 분리하여 사용

from sklearn.model_selection import train_test_split

# 데이터 생성
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}, R2: {train_r2}")

# 검증용 데이터 평가
test_mse = mean_squared_error(y_test, y_test_pred)
test_r2 = r2_score(y_test, y_test_pred)
print(f"검증용 데이터 - MSE: {test_mse}, R2: {test_r2}")

 

원래는 탐색용 데이터 결과가 더 잘 나온다고 합니다.

탐색용 데이터 - MSE: 0.8476788564209705, R2: 0.7582381034538057
검증용 데이터 - MSE: 0.6536995137170021, R2: 0.8072059636181392

 

 

 

이상 파이썬을 활용한 데이터분석의 기반이 되는 기초 통계 관련 내용을 살펴봤습니다. 




오랑우탄이 영어를 하고 오랑이가 데이터분석가가 되는 그날까지~

 

 

반응형