헤맨 만큼 내 땅이다

Python/빅데이터분석기사 실기

빅분기 실기 유형 3 정리 (가설 검정 및 통계 분석)

mm대장 2025. 11. 13. 00:02

두 집단이 정말 차이가 있는 걸까? 아니면 우연일까?

t-검정이나 카이제곱 검정 등을 활용해 데이터의 의미를 통계적으로 확인하는 방법에 대한 유형입니다.

 

가. 가설검정

 

1. T-검정

1) 일표본 평균 검정: 모분산을 모르는 경우 (단일표본 t 검정)

from scipy import stats
statistic, pvalue = stats.ttest_1samp(sample_data, popmean=기준값)

 

2) 이표본 독립표본 평균 검정(독립표본 t 검정, 대응표본 t 검정)

statistic, pvalue = stats.ttest_ind(male_data, female_data, equal_var=False)

3) 대응 표본

statistic, pvalue = stats.ttest_rel(before, after)

 

구분 함수 이름 설명

단일표본 t-test stats.ttest_1samp() 한 집단 평균 vs 기준값 비교
독립표본 t-test ✅ stats.ttest_ind() 독립 집단 평균 비교
대응표본 t-test stats.ttest_rel() 한 집단의 전후 평균 비교

 

2. Chi-검정 : 테이블 형태의 자료(범주형 자료)에 대한 가설 검정

cnt_tb = pd.crosstab(df['Department'], df['JobSatisfaction'])
statistic, pvalue, dof, expected = stats.chi2_contingency(cnt_tb)

 

3. ANOVA : Analysis of Variance (분산분석)

1)일원분산분석 (One-way ANOVA)

ANOVA 목적 : “그룹별 숫자 값을 비교하는 시험”

예:
부서별(JobSatisfaction)이 서로 차이가 있는지 알려면

  • Sales 부서 사람들의 만족도들
  • HR 부서 사람들의 만족도들
  • R&D 부서 사람들의 만족도들

각각의 숫자 묶음이 필요해.

이걸 ANOVA 함수에 넣으면 됨:

f_oneway(그룹1, 그룹2, 그룹3 ...)

 

ANOVA 분석 적용

예시
f_stat, p_value = stats.f_oneway(sample1, sample2, sample3, ...)

예제 사용
statistic, p_value = stats.f_oneway(*Samples)

 

 

2)이원분산분석

 

나. 통계분석

1. 선형 회귀 분석

★  R^2의 의미 

공식적 정의:

  • RSS (Residual Sum of Squares): 모델이 맞추지 못한 오차 제곱합
  • TSS (Total Sum of Squares): 데이터가 평균에서 얼마나 퍼져 있는지 제곱합

즉, R²는 모델이 데이터의 변동성을 얼마나 설명하는지를 나타냄

 

  • 일반적으로 R²의 범위는 0 ~ 1
    • 0 → 모델이 데이터를 전혀 설명하지 못함
    • 1 → 모델이 데이터를 완벽하게 설명함
  • 단, 회귀에서 y의 예측치가 평균보다 더 안 맞으면 음수가 나올 수도 있음
    → 예: 모델이 너무 엉망이면 RSS > TSS → R² < 0

p-value란?

p-value = 귀무가설(H₀)이 맞다고 했을 때, 지금처럼 극단적인 결과가 나올 확률

  • 즉, 귀무가설이 맞다고 가정했을 때 데이터가 얼마나 이상한지 측정한 값
  • 작을수록 → 데이터가 귀무가설과 맞지 않을 가능성이 높음

 2. 직관적 의미

  • p-value가 작다 (예: < 0.05)
    → 관측된 데이터가 귀무가설 하에서는 거의 나올 수 없음
    귀무가설 기각, 대립가설 지지
  • p-value가 크다 (예: > 0.05)
    → 관측된 데이터가 귀무가설 하에서도 충분히 나올 수 있음
    귀무가설 기각 불가, 차이가 있다고 말하기 어렵다

 

- 다중 회귀 모델 (model = sm.OLS(y, x_const) : 종속변수(Y)가 연속형이어야 함

OLS : Ordinary Least Squares(일반 최소 제곱법)

+ R-squared 찾는 법 : result.rsqured

import statsmodels.api as sm
sm.OLS(y, X)

 

- 로지스틱 회귀 분석 (model = sm.Logit(y, X_const) : 종속변수(Y)가 **범주형(0/1 등)**이어야 함

필요 모듈
import pandas as pd  
import numpy as np   #오즈비 계산
import statsmodels.api as sm   #로지스틱 회귀 모델 적용

 

1) 회귀식에 절편 추가

절편(intercept)이 필요할까?

회귀식은 기본적으로 이런 형태야:

y=β0+β1X1+β2X2+…y = \beta_0 + \beta_1 X_1 + \beta_2 X_2 + \dots

여기서

  • β0\beta_0 = 절편, intercept
  • β1,β2,...\beta_1, \beta_2, ... = 각 변수의 계수

문제는… statsmodels는 절편(β0)을 자동으로 포함하지 않는다.

그래서 직접 X에 **상수 1짜리 열(column)**을 추가해야 한다.

X_const = sm.add_constant(X)

 

+여러개 독립 변수를 X에 넣을때

X = df[['Column1', 'Column2', 'Column3']]

 

2) 로지스틱 회귀 모델

model = sm.Logit(y, X_const)
result = model.fit()
print(result.summary())

 

3) 결과값 변수의 회귀계수 구하기

ans_3 = result.params.loc['Glucose']

 

- 오즈비

odds_ratio = np.exp(회귀계수)

 

- 추가 예측하기

sample = pd.DataFrame([{
'satisfaction':0.5,
'salary' : 0.7,
'years_at_company' : 3.0,
'const' : 1.0
}])
ans3 = result.predict(sample)