빅분기실기 최종 정리_3

topics 900-자격증 100-데이터분석 & AI
types 학습 이론
contexts 자격증
tags

빅분기 실기 최종 정리 3 - 통계 검정

https://wikidocs.net/287831

검정

귀무가설 : “변화 X”, “차이 X”, “관계 X” ,"영향없다","같다","우연"
H0 : 귀무
p<0.05 기각 : 먼가이슈가잇는거임, 차이가크거나 관계가잇거나

from scipy.stats import shapiro, levene, ttest_ind,chi2_contingency,chisquare,pearsonr
빅분기실기 최종 정리_3-1764356371928.png

z검정(단일표본)

https://wikidocs.net/287750

from scipy.stats import norm
import numpy as np

# <span id="주어진-값"></span>주어진 값
x_bar = 5.1      # 표본 평균
mu_0 = 5.0       # 귀무가설 하 모집단 평균
sigma = 0.4      # 모집단 표준편차
n = 40           # 표본 수

# <span id="z-통계량-계산"></span>z-통계량 계산
z = (x_bar - mu_0) / (sigma / np.sqrt(n))

# <span id="양측-검정이므로-p-value는-양쪽-꼬리-합"></span>양측 검정이므로 p-value는 양쪽 꼬리 합
p = 2 * norm.sf(abs(z))  # 또는 p = 2 * (1 - norm.cdf(abs(z)))

print(f'z 통계량: {z:.3f}')
print(f'p-value: {p:.3f}')

t검정

종류 비교 대상 예시 Python 함수 자유도
독립 표본 t-검정 서로 다른 집단 남 vs 여 평균 키 비교 ttest_ind(g1,g2) n-1
대응 표본 t-검정 같은 사람/같은 객체 전후 비교 다이어트 전 vs 후 ttest_rel(befor ,after) n1 + n2 − 2
단일 표본 t-검정 기준값(하나의 평균)과 비교 우리반 키가 전국 평균과 같나? ttest_1samp(g,기준) n-1

흐름

import pandas as pd
from scipy.stats import shapiro, levene, ttest_ind

# <span id="예시-컬럼-이름과-그룹-값"></span>예시: 컬럼 이름과 그룹 값
group_col = 'group'   # 예: 성별, 반, 처리군 등
value_col = 'value'   # 예: 점수, 키, 혈압 등
g1_name = 'A'
g2_name = 'B'

# <span id="1-데이터-나누기"></span>1) 데이터 나누기
group1 = df[df[group_col] == g1_name][value_col]
group2 = df[df[group_col] == g2_name][value_col]

print("=== 1. 정규성 검정 (Shapiro-Wilk) ===")
stat1, p1 = shapiro(group1)  # stat1 클수록 정규형에 가까움
stat2, p2 = shapiro(group2)

print(f"{g1_name} Shapiro p-value:", p1)
print(f"{g2_name} Shapiro p-value:", p2)

if p1 >= 0.05 and p2 >= 0.05:
    print("→ 두 집단 모두 정규성 가정 만족 (p ≥ 0.05)")
else:
    print("→ 정규성 가정 일부/전체 불만족 (p < 0.05) - 해석 시 주의")

print("\n=== 2. 등분산 검정 (Levene) ===")
stat_levene, p_levene = levene(group1, group2)
print("Levene F-statistic:", stat_levene)
print("Levene p-value:", p_levene)

if p_levene >= 0.05:
    print("→ 등분산 가정 만족: equal_var=True 사용")
    equal_var_flag = True
else:
    print("→ 등분산 가정 불만족: equal_var=False 사용 (Welch t-test)")
    equal_var_flag = False

print("\n=== 3. 독립 표본 t-검정 (ttest_ind) ===")
t_stat, p_t = ttest_ind(group1, group2, equal_var=equal_var_flag)

print("t-statistic:", t_stat)
print("t-test p-value:", p_t)

alpha = 0.05
if p_t < alpha:
    print(f"→ 유의수준 {alpha}에서 두 집단의 평균은 다르다 (귀무가설 기각).")
else:
    print(f"→ 유의수준 {alpha}에서 두 집단의 평균은 같다 (귀무가설 채택).")

카이제곱 검정

독립성 검정

import pandas as pd
from scipy.stats import chi2_contingency

# <span id="교차표빈도표-생성"></span>교차표(빈도표) 생성
table = pd.crosstab(df['성별'], df['브랜드'])

# <span id="카이제곱-독립성-검정"></span>카이제곱 독립성 검정
chi2, p, dof, expected = chi2_contingency(table)

print("Chi2:", chi2) # 관찰값과 기대값이 얼마나 다른가,
print("p-value:", p)
print("dof:", dof)
print("Expected:\n", expected)

# <span id="해석"></span>해석
if p < 0.05:
    print("유의수준 0.05에서 두 변수는 관계있") # 귀무가설 기각
else:
    print("유의수준 0.05에서 두 변수는 관계가없다(독립).") #귀무가설 채택
이름 의미 키워드
chi2 관찰-기대한 차이 크기 차이정도 chi2큼 : 독립아님
p 그 차이가 우연인지 확률 유의성 p < 0.05 : 독립아님
dof 카이제곱 분포 기준선(자유도) 구조 (행−1) × (열−1)
expected 기대되는 표 비교기준

적합도 검정

import numpy as np
from scipy.stats import chisquare

# <span id="관측값"></span>관측값
observed = np.array([60, 20, 20])
# <span id="기대비율을-실제-기대빈도로-변환"></span>기대비율을 실제 기대빈도로 변환
expected_ratio = np.array([0.5, 0.3, 0.2])
expected = expected_ratio * observed.sum()

chi2, p = chisquare(f_obs=observed, f_exp=expected)

print("Chi2:", chi2)
print("p-value:", p)

if p < 0.05:
    print("유의수준 0.05에서 예상대로안나옴(적합하지 않다).")
else:
    print("유의수준 0.05에서 예상대로나옴(적합하다).") 

피어슨 검정

선형관계 검정

from scipy.stats import pearsonr

x = df['height']
y = df['weight']

r, p = pearsonr(x, y)

print("r:", r)
print("p-value:", p)

if p < 0.05:
    print("→ 유의한 상관관계가 있다.")
else:
    print("→ 유의한 상관관계가 없다.")

회귀분석

종속변수 모델 함수
연속형 다중선형회귀 sm.OLS
범주형 로지스틱회귀(이진/다중) sm.LogitMNLogit
import statsmodels.api as sm
import pandas as pd

X = df.drop(columns=['churn'])
y = df['churn']

X_const = sm.add_constant(X)
model = sm.Logit(y, X_const).fit()

df = pd.DataFrame({
    'X1': [1, 2, 3, 4, 5],
    'X2': [2, 3, 2, 5, 4],
    'Y':  [3, 4, 6, 7, 8]
})

X = df<a href="/pages/'X1'%2C-'X2'.html" class="wiki-link">'X1', 'X2'</a> # 독립변수
X_const = sm.add_constant(X)  # 절편 추가
y = df['Y'] # 종속변수

model = sm.OLS(y, X_const).fit()

print(model.summary())
  • odds_ratios = np.exp(model.params["속성"])
  • coef = model.params["속성"]빅분기 3유형-1750458321998.png