-
[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-검정을 활용해 두 집단 간 평균 차이를 검정할 수 있음
✅ 상관분석을 통해 변수 간 관련성을 파악할 수 있음
✅ 시각화(히트맵)로 직관적인 해석이 가능함
📢 데이터 기반의 의사결정이 필요한 모든 영역에서 가설 검정은 필수적인 과정입니다!
'Why Not SW CAMP 5기 > 수업 기록' 카테고리의 다른 글
[2월 2주차-2/13(3)]🍻음주 빈도가 삶의 만족도와 건강 상태에 미치는 영향 분석 (0) 2025.02.13 [2월 2주차-2/13(2)]🌟 인터랙티브 시각화: HTML 파일로 저장하여 웹 브라우저에서 실행하기 (1) 2025.02.13 [2월 2주차-2/12(3)]한국복지패널데이터로 한국인의 삶을 분석해보자! 🧐 (0) 2025.02.13 [2월 2주차-2/12(2)]📝 Pandas로 데이터 정제하기: 이상치 & 결측치 처리 (0) 2025.02.12 [2월 2주차-2/12(1)]이터레이터(Iterator)와 제너레이터(Generator) 쉽게 이해하기 (0) 2025.02.12