ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [2월 2주차-2/13(1)]📊 통계 분석 기법을 이용한 가설 검정
    Why Not SW CAMP 5기/수업 기록 2025. 2. 13. 12:20

    데이터를 분석할 때, 단순한 요약을 넘어 신뢰할 수 있는 결론을 내리기 위해 우리는 "가설 검정"을 수행합니다. 가설 검정은 통계적 방법을 활용하여 데이터를 기반으로 특정 주장이 타당한지를 평가하는 과정입니다.

    🔍가설 검정이란?

    가설 검정은 데이터를 기반으로 가설이 맞는지를 판단하는 과정입니다.

    즉, 표본 데이터를 통해 모집단의 특성을 추론하고, 이를 통해 특정 가설이 타당한지 검토하는 것입니다.

    📌통계 분석의 종류

    (1) 기술 통계 (Descriptive Statistics)

    • 데이터를 요약하여 설명하는 방법
    • 대표적인 기법: 평균(mean), 중앙값(median), 표준편차(standard deviation)
    • 예시: 한 회사의 직원 월급 데이터를 분석하여 평균 월급을 계산

    (2) 추론 통계 (Inferential Statistics)

    • 데이터에서 얻은 정보를 바탕으로 확률을 계산하여 결론 도출
    • 예시: 남성과 여성의 평균 월급 차이가 우연히 발생한 것인지 검토
    • 만약, 우연히 발생할 확률(유의확률)이 낮다면 → "통계적으로 유의하다"라고 판단 ✅

    🧐통계적 가설 검정 (Statistical Hypothesis Testing)

    (1) 유의확률 (p-value)이란?

      실제로는 차이가 없는데, 우연히 차이가 발생할 확률을 의미합니다.

    • p-value가 작을수록: 우연히 발생할 가능성이 적으므로, 통계적으로 유의한 차이라고 판단합니다.
    • 일반적으로 p-value < 0.05면 "통계적으로 유의한 차이가 있다"고 결론 내립니다.

    (2) 주요 가설 검정 방법

    • t-검정 (t-test): 두 집단의 평균 차이를 검정
    • 상관분석 (Correlation Analysis): 두 변수 간의 관계를 분석

    📌 t-검정 1: Compact vs SUV 자동차의 도시 연비 차이

    import pandas as pd
    from scipy import stats
    
    mpg = pd.read_csv('./data/mpg.csv')
    
    mpg.query('category in ["compact", "suv"]') \
        .groupby('category', as_index=False) \
        .agg(n=('category', 'count'), mean=('cty', 'mean'))
    
    '''
      category   n      mean
    0  compact  47  20.12766
    1      suv  62  13.50000
    '''
    
    # Compact와 SUV 차량만 필터링
    compact = mpg.query('category == "compact"')['cty']
    suv = mpg.query('category == "suv"')['cty']
    
    # t-검정 수행
    # equal_var = True : 집단(변수)간의 분산 같다
    ttest_result = stats.ttest_ind(compact, suv, equal_var=True)
    print(ttest_result)
    
    '''
    TtestResult(statistic=11.917282584324107, 
                pvalue=2.3909550904711282e-21, -> e-21은 앞에 0이 21개 있다는 뜻
                df=107.0)
    
    
    compact와 suv간 평균 도시연비 차이가 통계적으로 유의하다
    '''

    📊 결과 해석

    TtestResult(statistic=11.91, pvalue=2.39e-21, df=107.0)
    
    • p-value ≈ 0.00000000000000000000239 → 0.05보다 훨씬 작음
    • 따라서 Compact와 SUV 간 도시 연비 차이가 통계적으로 유의하다는 결론!

    📌 t-검정 2: 일반 휘발유 vs 고급 휘발유 사용 차량의 연비 차이

    mpg.query('fl in ["r", "p"]') \
        .groupby('fl', as_index = False) \
        .agg(n = ('category', 'count'),
             mean = ('cty', 'mean'))
    '''
      fl    n       mean
    0  p   52  17.365385
    1  r  168  16.738095
    '''
    
    # 일반(r) 및 고급(p) 휘발유 차량만 필터링
    regular = mpg.query('fl == "r"')['cty']
    premium = mpg.query('fl == "p"')['cty']
    
    # t-검정 수행
    ttest_result = stats.ttest_ind(regular, premium, equal_var=True)
    print(ttest_result)
    
    '''
    TtestResult(statistic=-1.066182514588919, 
                pvalue=0.28752051088667036, 
                df=218.0)
    '''

    📊 결과 해석

    TtestResult(statistic=-1.07, pvalue=0.287)
    
    • p-value = 0.287 (28.7%) → 0.05보다 큼
    • 실제로는 차이가 없는데 우연에 의해 차이가 관찰될 학률이 28.75% 라는 의미
    • 즉, 고급 휘발유와 일반 휘발유 차량 간 도시 연비 차이는 통계적으로 유의하지 않음
    • 고급 휘발유 도시 연비 평균이 0.6정도 높지만 이런 정도의 차이는 우연히 발생했을 가능성이 높음

    📌 상관분석: 실업률과 개인 소비 지출의 관계

    ## 실업자 수(unemploy)와 개인 소비 지출(pce)의 상관관계
    
    import matplotlib.pyplot as plt
    import seaborn as sns
    
    economics = pd.read_csv('./data/economics.csv')
    
    # 상관계수 계산
    economics[['unemploy', 'pce']].corr()
    '''
    상관행렬
              unemploy       pce
    unemploy  1.000000  0.614518
    pce       0.614518  1.000000
    '''
    
    # 유의확률 계산
    stats.pearsonr(economics['unemploy'], economics['pce'])
    '''
    PearsonRResult(statistic=0.6145176141932082, <- 상관계수
                   pvalue=6.773527303289964e-61) <- 유의확률
    
    '''

    📊 결과 해석

    상관계수 = 0.61 (양의 상관관계)
    p-value ≈ 0.000000000000000000000067 → 매우 작음
    
    • 실업률이 증가하면 소비 지출도 증가하는 경향
    • 통계적으로 유의한 상관관계가 있음

    📌 히트맵을 활용한 상관관계 분석

    mtcars = pd.read_csv('./data/mtcars.csv')
    
    '''
        mpg  cyl   disp   hp  drat     wt   qsec  vs  am  gear  carb
    0  21.0    6  160.0  110  3.90  2.620  16.46   0   1     4     4
    1  21.0    6  160.0  110  3.90  2.875  17.02   0   1     4     4
    2  22.8    4  108.0   93  3.85  2.320  18.61   1   1     4     1
    '''
    
    # 상관행렬 만들기
    car_cor = mtcars.corr()
    
    # 소수점 둘째 자리까지 반올림
    car_cor = round(car_cor, 2)
    
    # 해상도 설정
    plt.rcParams.update({'figure.dpi': '120',
                         'figure.figsize': [7.5, 5.5]})
    
    # 히트맵: sns.heatmap(상관행렬, 상관계수 표시, 컬러맵)
    # 상관계수 표시: annot: True
    # 컬러맵: cmap='RdBu'
    sns.heatmap(car_cor, annot=True, cmap='RdBu')
    plt.show()

    📊 결과 해석

    • 색이 파란색에 가까울수록 양의 상관관계
    • 색이 빨간색에 가까울수록 음의 상관관계
    • 특정 변수 간 강한 관련성이 있는지 한눈에 파악 가능

    📌 히트맵( 대각행렬, 빈 행과 열 제거 )

    ## 대각행렬 제거
    # mask 만들기
    import numpy as np
    mask = np.zeros_like(car_cor)
    
    # 오른쪽 위 대각 행렬을 1로 바꾸기
    mask[np.triu_indices_from(mask)] = 1
    
    # 히트맵 mask 적용: 
    sns.heatmap(data=car_cor, 
                annot=True, 
                cmap='RdBu',
                mask = mask)
    
    plt.show()
    
    ## 빈 행과 열 제거하기
    # mask 첫번째 행, 마지막 열 제거
    # 상관행렬 첫번째 행, 마지막 열 제거
    mask_new = mask[1:, :-1]
    cor_new = car_cor.iloc[1:, :-1]
    
    sns.heatmap(data=cor_new, 
                annot=True, 
                cmap='RdBu',
                mask = mask_new)
    
    plt.show()


    결론

    가설 검정을 통해 데이터 간의 관계를 검토할 수 있음

    t-검정을 활용해 두 집단 간 평균 차이를 검정할 수 있음

    상관분석을 통해 변수 간 관련성을 파악할 수 있음

    시각화(히트맵)로 직관적인 해석이 가능함

    📢 데이터 기반의 의사결정이 필요한 모든 영역에서 가설 검정은 필수적인 과정입니다!

Designed by Tistory.