![Search icon](https://hackernoon.imgix.net/search-new.png?w=19&h=19)
우리가 데이터를 깊이 파고들어 숨겨진 보석 같은 통찰력을 찾아내려고 할 때, 우리는 종종 수많은 가설을 저글링하는 자신을 발견하게 됩니다. 모든 손님이 마스크를 착용하고 각 손님 뒤에 누가 있는지 알아내려고 하는 파티에 있다고 상상해 보십시오. 추측하는 사람이 많을수록 실수할 확률이 높아집니다. 이것이 통계의 다중 비교 문제의 어려움입니다. 테스트하는 모든 가설에 대해 또 다른 가설이 나타나서 적어도 한 번은 틀릴 확률이 높아집니다. Python 스타일과 약간의 유머를 사용하여 이 개념을 분석하여 상황을 가볍게 유지해 보겠습니다.
이것을 상상해 보세요: 당신은 실험이나 설문 조사를 수행하고 있고 대답하려는 질문(가설)의 전체 목록이 있습니다. 문제는 더 많은 질문을 할수록 잘못된 답변을 얻을 가능성이 더 커진다는 것입니다(안녕하세요, 유형 I 오류입니다 !). 다중 비교 문제로 알려진 통계적 파티 파울입니다.
귀무 가설(H0): 귀무 가설은 특별한 일이 일어나지 않는다는 기본 가정입니다. 그것은 마치 파티에 참석한 손님을 보고 "가면을 쓴 연예인이 아니라 그냥 평범한 사람이군요"라고 말하는 것과 같습니다. 여러 가설을 테스트할 때 기본적으로 게스트 그룹을 확인하여 그 중 유명인이 있는지 확인합니다.
제1종 오류: 제1종 오류는 유명인을 발견했다고 잘못 생각했지만, 그 사람은 정말 좋은 의상을 입은 사람일 뿐인 경우입니다. 통계의 세계에서는 유의미한 효과나 차이가 없는데 유의미한 효과나 차이를 발견했다고 생각하여 귀무가설을 잘못 기각하는 경우를 말합니다.
FWER(Family-Wise Error Rate): FWER는 파티에 단골 손님 한 명이라도 유명인으로 잘못 식별될까 봐 매우 걱정하는 것과 같습니다. 실행 중인 모든 테스트 중에서 적어도 하나의 제1종 오류를 범할 확률입니다. 20가지 가설을 테스트하는 경우 FWER는 20가지 테스트 전체에서 단 한 번의 실수도 발생하지 않도록 주의합니다. Bonferroni 조정과 같은 수정은 중요성에 대한 기준을 더욱 엄격하게 만들어 FWER를 제어하는 데 도움이 됩니다. 이는 유형 I 오류를 범할 가능성을 낮추고 잘못된 "유명인"을 불러 당황스러워하는 일을 방지합니다.
FDR(False Discovery Rate): FDR은 균형에 관한 것입니다. "좋아, 실수로 단골 손님 몇 명에게 연예인을 부를 수도 있지만, 실제 연예인을 최대한 많이 만나고 싶다"고 말하는 것과 같습니다. FDR은 귀하가 수행한 모든 발견 중에서 잘못된 발견의 예상 비율을 제어합니다. FWER에 비해 조금 더 완화되어 대부분의 경우 귀하가 옳다면 일부 손님이 유명인이라는 사실에 대해 틀릴 수 있습니다. 이 접근 방식은 일부 잘못된 경보가 프로세스의 일부임을 인정하고 더 많은 잠재적인 통찰력을 발견하기 위해 일부 위험을 감수해도 괜찮을 때 유용합니다.
Bonferroni 수정은 파티에서 매우 조심스러운 친구로, 군중 속에서 유명인을 식별하는 실수를 하지 않도록 해줍니다. 한 번에 많은 가능성을 살펴볼 때 각 발견에 대해 더욱 확신을 가질 것을 요구합니다.
작동 방식:
공식:
여기서 α 는 초기 확실성 수준(보통 0.05)이고 n 은 테스트 중인 가설의 수입니다.
영향:
이 방법은 중요한 결과로 간주되는 기준을 더 높게 설정하여 잘못된 발견(제1종 오류)의 가능성을 크게 줄입니다. 그러나 그 엄격함은 실수하지 않는 데 너무 집중하기 때문에 유명인을 알아보지 못하는 것처럼 진정한 결과를 인식하지 못하게 할 수도 있습니다.
본질적으로 Bonferroni 수정은 실제 발견을 놓칠 위험이 있는 거짓 긍정을 방지하는 데 우선순위를 두므로 가설 테스트에서 보수적인 선택이 됩니다.
정신을 잃지 않고 여러 가설의 미로를 탐색하기 위해 일부 Python 코드를 사용하여 손을 더럽혀 봅시다.
가장 먼저, 작업에 적합한 도구가 있는지 확인하세요.
pip install numpy statsmodels
그리고 가세요
from statsmodels.stats.multitest import multipletests import numpy as np # Imagine these are your p-values from testing various hypotheses p_values = [0.005, 0.0335, 0.098543, 0.00123] # Let's say we did 4 tests # Applying Bonferroni correction bonf_rejected, bonf_corrected, _, _ = multipletests(p_values, alpha=0.05, method='bonferroni') print("Bonferroni Approach") print(f"Rejected: {bonf_rejected}") print(f"Adjusted p-values: {bonf_corrected}\n")
Bonferroni 수정을 p-값에 적용한 후 얻은 결과를 분석해 보겠습니다.
기각된 가설 : Bonferroni 수정은 수정된 임계값을 기준으로 어떤 가설을 기각해야 하는지 알려줍니다. 여기서는 첫 번째( True
) 가설과 마지막( True
) 가설이 기각됩니다. 즉, 다중 비교를 조정한 후에도 통계적으로 유의미한 결과를 보여줍니다.
조정된 p-값 : 조정된 p-값은 [0.02, 0.134, 0.394172, 0.00492]
입니다. 조정을 통해 p-값이 증가하여 여러 테스트에서 발생하는 제1종 오류(거짓양성)의 위험 증가를 제어합니다.
해석: p-값 [0.005, 0.00123]
(원본)의 경우: 수정 후 이는 [0.02, 0.00492]
입니다. 이는 임계값 0.05 미만으로 유지되어 결과가 통계적으로 유의함을 나타냅니다.
Benjamin-Hochberg 교정은 파티에서 균형 잡힌 문지기 역할을 하며, 지나치게 엄격하지 않으면서 일반 손님을 유명인으로 착각하는 위험을 능숙하게 관리합니다. 중간 지점을 찾아 관리 가능한 수준의 위험을 감수하면서 실제 발견을 자신있게 식별할 수 있습니다.
작동 방식:
시나리오: 파티 참석자들 사이에서 유명인을 발견하는 것과 유사하게 여러 결과를 평가하고 있습니다.
Benjamin-Hochberg의 전략: 이 방법은 각 p-값의 순위에 따라 유의 수준을 조정하므로 엄격한 Bonferroni 수정에 비해 더 유연한 접근 방식이 가능합니다. 이는 모든 발견 중에서 잘못된 발견이 발생할 것으로 예상되는 비율인 FDR(False Discovery Rate)을 제어합니다.
과정:
P-값 순위: 가장 작은 것부터 가장 큰 것까지.
유의 수준 조정: 각 가설에 대해 서로 다른 임계값을 계산하며, 이는 p-값이 더 작은 가설에 대해 더 관대해집니다. 이는 순위와 총 테스트 수를 기준으로 합니다.
영향:
FDR 제어에 중점을 둠으로써 Benjamin-Hochberg 수정을 통해 더 많은 발견이 중요한 것으로 인식될 수 있으며 일부는 거짓 긍정일 수 있음을 인정하지만 이러한 오류의 전체 비율이 제어 상태로 유지되도록 보장합니다. 이 접근 방식은 많은 가설을 탐색하고 중요한 결과를 놓치지 않기 위해 일정 수준의 잘못된 발견을 용인할 의향이 있는 경우에 특히 유용합니다.
요약하면, Benjamin-Hochberg 보정은 실제 효과 발견과 위양성 비율 제어 사이의 실질적인 균형을 제공하므로 다중 비교를 다루는 연구자에게 유용한 도구가 됩니다.
구출을 위한 파이썬:
# Benjamini-Hochberg correction for the brave from statsmodels.stats.multitest import multipletests import numpy as np # Imagine these are your p-values from testing various hypotheses p_values = [0.005, 0.0335, 0.098543, 0.00123] # Let's say we did 4 tests # Applying BH correction bh_rejected, bh_corrected, _, _ = multipletests(p_values, alpha=0.05, method='fdr_bh') print("Benjamini-Hochberg Approach") print(f"Rejected: {bh_rejected}") print(f"Adjusted p-values: {bh_corrected}")
기각된 가설 : [True, True, False, True]
조정된 p-값을 기반으로 기각된 가설을 나타냅니다. 이 경우 첫 번째, 두 번째, 네 번째 가설이 기각되어 유의미한 결과를 제시합니다.
조정된 p-값 : [0.01, 0.04466667, 0.098543, 0.00492]
수정 후 각 가설의 조정된 유의 수준에 해당합니다. 이러한 값은 알파 수준(이 경우 0.05)과 비교되어 어떤 가설이 기각되는지 결정합니다.
해석: p-값 [0.005, 0.0335, 0.00123]
(원본)의 경우: 수정 후에는 [0.01, 0.04466667, 0.00492]
입니다. 이는 임계값 0.05 미만으로 유지되어 결과가 통계적으로 유의함을 나타냅니다.
첫 번째 및 네 번째 가설(둘 다 인정): 아무리 조심성이나 모험심이 있어도 모두가 인정하는 틀림없는 연예인과 같습니다. 두 가지 방법 모두 놓칠 수 없는 유명인을 찾는 것과 같이 이러한 결과가 중요하다는 데 동의합니다.
두 번째 가설(BH는 인정하지만 Bonferroni는 인정하지 않음): 이는 신중함과 낙관주의가 혼합된 BH 방법이 기꺼이 투자할 의향이 있는 좀 더 틈새 시장이거나 떠오르는 유명인을 나타냅니다. 그러나 극도로 보수적인 Bonferroni는 위양성 결과에 대한 두려움 때문에 기회를 놓치기 때문에 조심하는 것을 선호합니다.
이 은유는 통계적 수정의 민감도와 특이성 사이의 본질적인 균형과 연구의 맥락 또는 참석하는 파티 유형에 따라 올바른 접근 방식을 선택하는 것의 중요성을 강조합니다.
많은 가설을 고려하는 것은 통계 오류의 지뢰밭을 탐색하는 것과 약간 비슷합니다. 하지만 올바른 도구(고마워요, Python!)와 전략(안녕하세요 Bonferroni 및 Benjamin-Hochberg)을 사용하면 과학적 무결성을 유지하면서 이 문제를 처리할 수 있습니다. 위험과 보상의 균형을 맞추는 것이 중요하다는 점을 기억하세요. 자신을 재보험하든 금을 쫓든 상관없이 여러 비교를 이해하고 수정하면 결론을 훨씬 더 신뢰할 수 있게 만들 수 있습니다. 좋은 데이터 검색을 즐겨보세요!