728x90
728x90
제3유형 시험 준비 (가설 검정, 고급 통계)
들어가며
- 빅데이터분석기사 실기 제3유형 시험 준비를 위한 내용을 정리해본다.
- 제3유형은 ①가설 검정과 ②고급 통계의 내용이 포함된다.
1️⃣ 가설 검정
☑️ (통계적) 가설 검정
- 관찰된 현상/효과가 우연에 의한 것인지 알아보기 위해 가설을 세우고, 가설의 합당성을 확인하는 과정
- A 그룹과 B 그룹에서 보이는 어떤 차이가 우연에 의한 것인지, 실제로 다른 것인지 통계적으로 검증하는 것
변수 유형 | 집단 수 | 검정 방식 | 설명 |
수치형(연속형) | 1개 | 단일 표본 t-검정 | 모평균과 표본 평균이 유의하게 다른지 검정 |
2개 | 독립 표본 t-검정 | 2개의 독립된 집단의 평균 차이 검정 | |
대응 표본 t-검정 | 같은 집단에서 2번 측정한 결과의 평균 차이 검정 | ||
2개 이상 | 일원 분산 분석 (One Way ANOVA) |
3개 이상의 집단의 평균이 동일한지 검정 | |
이원 분산 분석 (Two Way ANOVA) |
2개 이상의 요인이 있는 경우, 집단 간 차이 검정 | ||
범주형(명목형) |
1개 | 카이제곱 적합도 검정 | 표본이 특정 분포를 따르는지 검정 |
2개 | 카이제곱 독립성 검정 | 두 범주형 변수 간의 독립성을 검정 | |
2개 이상 | 다변량 분산 분석 (MANOVA) |
여러 개의 종속 변수를 포함한 집단 간 차이 검정 | |
범주형(명목형) & 수치형(연속형) |
1개 이상 | 회귀 분석 | 연속형(수치형) 종속 변수와 명목형/연속형 독립 변수 간의 관계 검정 |
로지스틱 회귀 분석 | 명목형(범주형) 종속 변수와 명목형/연속형 독립 변수 간의 관계 검정 |
☑️ 가설
📌 귀무 가설($H_0$)
- 영가설, 우리가 사실로 믿고 있는 주장, 기존의 주장에 해당된다.
- 검정의 대상이 되는 가설
- 귀무 가설이 맞는지 틀렸는지를 통계적으로 증명하고자 하는 것
- 귀무 가설이 틀렸다는 것을 보임으로써 대립 가설이 맞다고 얘기하고 싶은 것
📌 대립 가설($H_1$)
- 맞는지 확인하고 싶은 주장
- 단측 검정 : 모수가 어떤 값보다 크다/작다와 같은 식
- 양측 검정 : 모수가 어떤 값과 다르다는 식
예제
- 출근 시간 A 버스의 평균 배차 간격이 5분이라고 한다. 하지만, 최근 몇 개월간 A 버스를 타고 출근을 해 본 결과 평균 배차 간격이 5분이 아닌 것 같다. 이를 검정하려고 할 때, 적절한 귀무 가설과 대립 가설을 설정하시오.
- 귀무 가설($H_0$) : A 버스의 평균 배차 간격이 5분이다. ($\overline{X}=5$)
- 대립 가설($H_1$) : A 버스의 평균 배차 간격이 5분이 아니다. ($\overline{X} \neq 5$)
- 양측 감정
- B 공장은 제품 불량률을 1% 이하로 유지하고 있다. 그런데 최근 제품 불량 문의가 기존 보다 자주 들어오고 있어 제품 불량률이 높아졌을 것이라는 의심이 든다. 이를 검정하려고 할 때, 적절한 귀무 가설과 대립 가설을 설정하시오.
- 귀무 가설($H_0$) : 제품 불량률이 1% 이하이다. ($p ≤ 0.01$)
- 대립 가설($H_1$) : 제품 불량률이 1% 초과이다. ($p > 0.01$)
- 단측 검정
📌 가설 검정
- 귀무 가설을 채택할지 기각할지 결정하는 과정
✅ 귀무 가설을 기각할 경우, 대립 가설은 자동으로 채택된다.
✅ 단, 귀무 가설을 기각한다고 해서 귀무 가설을 '틀렸다'라고 하지는 않으며, 귀무 가설을 채택할 '충분한 근거'가 없다고 한다.
📌 검정 통계량
- 모수(모집단의 평균 등)에 대한 가설을 설정한 후 이를 확인하기 위해 샘플 데이터로부터 구하는 통계량
☑️ 통계적으로 유의하다
- 관찰된 현상/결과는 우연에 의한 것일 수도 있고, 실제로 그러한 것일 수도 있다.
- 따라서 관찰 결과가 우연하게 일어날 수 없는 극단적인 것임을 확인했을 때, 우리는 이것을 통계적으로 유의하다고 말할 수 있다.
☑️ 유의 확률(p-value)
- 검정 통계량보다 극단적인 값이 나타날 확률
- 가설 검정 시, 귀무 가설을 채택하는 기준이 되는 유의 수준(Significance Level)을 정하게 되는데, p-value와 유의 수준을 비교하여 귀무 가설 채택 여부를 결정한다.
- 유의 수준은 일반적으로 α로 표기한다.
- 유의수준 값은 보통 0.05(5%)나 0.01(1%)로 설정한다.
- p-value 값이 크면 클수록
- 관측된 결과가 극단적인 케이스일 확률이 낮아진다.
- 귀무 가설이 참일 확률이 높아진다.
- p-value ~ 귀무 가설을 지지하는 정도
예제
- 우리가 알고 있는 사실 : A 가게에서 판매하는 식빵의 평균 무게는 200g이다.
✅ 우리가 알고 있는 사실이 정말 맞다면, A가게의 식빵의 무게를 재면 대체로 200g 언저리의 값이 나올 것이다. | |
✅ 실제로 A 가게에서 판매하는 식빵 50개의 평균 무게를 구해보니 205g 이었다. | |
✅ 우리가 알고 있는 사실에 기반하면, A 가게의 식빵 무게가 205g보다 클 확률은 28%이다. ⇒ 205g 이라는 값이 이상하고, 극단적인 값이 아니다. ⇒ 우리가 알고 있는 사실이 틀렸다고 보기 힘들다. |
|
✅ 통계적으로 다시 표현하면, $H_0$ : A가게 식빵 평균 무게는 200g이다. ($\bar{X}=200$) $H_1$ : A가게 식빵 평균 무게는 200g이 아니다.. ($\bar{X} \neq 200$) ⇒ 유의 확률(p-value) : 0.28 ⇒ 유의 수준(α) @0.05@에서 p-value > 0.05(α) 이므로, 귀무 가설($H_0$) 채택 (기각하지 못한다.) |
☑️ 절차
절차 | 설명 |
1 | 귀무 가설과 대립 가설을 설정한다. |
2 | 검정 통계량을 계산한다. |
3 | 유의 수준(α)을 결정한다. (보통 0.05로 설정) |
4 | 귀무 가설이 옳다는 가정하에 계산된 유의 확률(p-value)를 확인한다. |
5 | 유의 수준(α)과 유의 확률(p-value)를 비교하여 귀무 가설을 채택 또는 기각 한다. ※ p-value > α : 귀무 가설($H_0$) 채택 |
보통 유의 수준(α)을 @0.05@로 지정하며, p-value > 0.05(α)일 경우 귀무 가설($H_0$)을 채택한다.
2️⃣ 가설 검정 기준 및 방법
☑️ 가설 검정 기준
- 구분 기준 (일반적)
- 무엇을 검정하는가
- 연속형 변수 : 모평균, 모비율, 모분산, 모분포
- 범주형 변수 : 기대 빈도, 관찰 빈도
- 대상 집단 수가 몇 개인가
- 1개
- 2개
- 3개 이상
- 무엇을 검정하는가
☑️ 가설 검정 방법
- 가설 검정 관련 함수들은 @scipy.stats@ 패키지에서 가져올 수 있다.
from scipy.stats import *
3️⃣ 모평균 검정
☑️ 모집단이 하나인 경우
- 모집단의 평균 $\mu$의 값이 $\mu_0$인지 아닌지 검증하는 과정
- 양측 검정
- $H_0$ : $\mu = \mu_0$
- $H_1$ : $\mu \neq \mu_0$
- 단측 검정
- 경우 1
- $H_0$ : $\mu ≥ \mu_0$
- $H_1$ : $\mu < \mu_0$
- 경우 2
- $H_0$ : $\mu ≤ \mu_0$
- $H_1$ : $\mu > \mu_0$
- 경우 1
- 양측 검정
$\mu$ 는 모집단의 평균, $\bar{x}$ 는 표본 집단의 평균을 의미한다.
📌 모분산 $\sigma^{2}$를 알 때 : Z-Test
- 표본의 크기가 $n$일 때, 검정 통계량 $Z = \frac{\overline{X} - \mu_{0}}{\frac{\sigma}{\sqrt{n}}}$
📌 모분산 $\sigma^{2}$를 모를 때
- 표본의 크기가 작을 경우 (@n < 30@) : T-Test
- 표본의 크기가 $n$이고, 표본 표준편차가 $S$일 때, 검정 통계량 $T= \frac{\overline{X} - \mu_{0}}{\frac{S}{\sqrt{n}}}$
- 표본의 크기가 충분히 클 경우 (@n ≥ 30@)
- 정규 분포를 따른다고 가정할 수 있다.
- 모표준편차 $\sigma$ 대신 표본 표준편차 $S$를 사용하여 Z-Test를 수행한다.
예제 코드 : 단일 표본 T 검정(One Sample T-Test)
- 공장에서 트렌드에 맞는 신제품을 출시했다.
- 생산된 신제품 7개의 높이를 측정한 결과는 다음과 같다.
신제품의 높이(cm) : 12, 14, 16, 19, 11, 17, 13 |
- 유의수준 0.05일 때, 신제품들의 평균 높이가 11cm인지 아닌지에 대해 양측 검정을 수행한다.
귀무가설 : 신제품 높이의 평균은 11cm이다. 대립가설 : 신제품 높이의 평균은 11cm가 아니다. |
표본 개수가 30개 미만이고, 모분산을 모르며 평균을 검정하는 문제이므로 단일 표본 T 검정을 수행한다.
import pandas as pd
from scipy.stats import shapiro, wilcoxon, ttest_1samp
data = {
'height': [12, 14, 16, 19, 11, 17, 13]
}
df = pd.DataFrame(data)
# 샤피로 윌크 검정 (데이터가 정규 분포를 따른지 확인)
statistics, pvalue = shapiro(df['height'])
alpha = 0.05 # 유의수준
if pvalue >= alpha:
print("귀무가설 채택 (정규성 만족)")
# T-검정 수행
statistics, pvalue = ttest_1samp(df['height'], popmean=11) # 평균 높이 : 11
if pvalue >= alpha:
print("귀무가설 채택")
else:
print("대립가설 채택")
else:
print("대립가설 채택 (정규성 불만족)")
# 윌콕슨 검정 수행 수행
statistics, pvalue = wilcoxon(df['height'] - 11, alternative='two-sided') # 평균 높이 : 11, 양측 검정
if pvalue >= alpha:
print("귀무가설 채택")
else:
print("대립가설 채택")
⇒ 우선, 샤피로 윌크 검정을 이용하여 해당 데이터가 정규성을 만족하는지 확인한다.
⇒ 해당 데이터가 정규성을 만족하면, @ttest_1samp()@ 함수를 이용하여 T-검정을 수행한다.
⇒ 해당 데이터가 정규성을 만족하지 않으면, @wilcoxon()@ 함수를 이용하여 윌콕슨 검정을 수행한다.
☑️ 모집단이 2개 이상인 경우
- 두 모평균 $\mu_1, \mu_2$ 사이에 차이가 있는지 검증하는 과정
- 두 집단의 모분산이 같은지(같다고 가정할 수 있는지)에 따라 Z-Test 또는 T-Test 사용
- 3개 이상의 집단에 대한 평균 비교는 ANOVA(분산 분석)로 검정
독립 표본 T-검정(Two Sample T-Test)
- 데이터가 서로 다른 모집단에서 추출된 경우 사용할 수 있는 분석 방법
- 독립된 두 집단의 평균 차이를 검정하는 방법
- 독립 표본 T-검정을 하기 전에 반드시 정규성, 등분산성 가정이 만족되는지 확인한다.
- 정규성 검정은 표본의 수에 따라 다음과 같은 방법을 적용한다.
표본의 수 | 설명 |
10개 미만 | - 정규성을 만족하지 못한다고 가정 - 만-위트니 검정(Mann-Whitney Test) |
10개 이상 ~ 30개 이하 | - 샤피로-윌크 검정(Shapiro-Wilk Test) - 콜모고르프-스미르노프 검정(Kolmogorov-Smirnov Test) |
30개 이상 | - 중심 극한 정리 |
- 등분산 검정은 @levene()@ 함수를 사용하여 검정한다.
- 독립 표본 T-검정은 @ttest_ind()@ 함수를 사용하여 수행한다.
예제 코드 : 독립 표본 T-검정(Two Sample T-Test)
- @cats@ 데이터는 고양이들의 성별, 몸무게, 심장의 무게를 담고 있다.
- 유의수준 0.05일 때 고양이들의 성별에 따른 몸무게의 평균은 통계적으로 다르다고 할 수 있는지에 대한 검정을 수행하려고 한다.
귀무가설 : 고양이의 성별에 따른 평균 몸무게는 통계적으로 유의한 차이가 없음. 대립가설 : 고양이의 성별에 따른 평균 몸무게는 통계적으로 유의한 차이가 있음. |
import pandas as pd
from scipy.stats import levene, ttest_ind
cats = pd.read_csv('./datasets/cats.csv')
# 그룹 설정
group1 = cats[cats['Sex'] == 'F']['Bwt'] # Female의 몸무게
group2 = cats[cats['Sex'] == 'M']['Bwt'] # Male의 몸무게
# 등분산성 검정 수행
statistics, pvalue = levene(group1, group2)
alpha = 0.05 # 유의수준
if pvalue >= alpha:
print("귀무가설 채택 (등분산성 만족)")
# 독립 표본 T-검정 수행
# equal_var : 두 그룹의 분산이 동일한지 여부를 설정 (등분산성 만족이므로 True로 설정)
statistics, pvalue = ttest_ind(group1, group2, equal_var=True)
else:
print("대립가설 채택 (등분산성 불만족)")
# 독립 표본 T-검정 수행
# equal_var : 두 그룹의 분산이 동일한지 여부를 설정 (등분산성 불만족이므로 False로 설정)
statistics, pvalue = ttest_ind(group1, group2, equal_var=False)
if pvalue >= alpha:
print("귀무가설 채택")
else:
print("대립가설 채택")
대응(쌍체) 표본 T-검정(Paired Sample T-Test, Matched Pair T-Test)
- 한 집단에서 처치를 받기 전과 후의 차이를 알아보기 위해 사용하는 검정 방법
- 표본(Sample)이 1개, 독립 변수가 1개일 때 사용한다.
- 쌍체 표본 T-검정에서는 모집단의 관측값이 정규 분포를 만족한다는 정규성 가정을 만족해야 한다.
예제 코드 : 대응(쌍체) 표본 T-검정(Paired Sample T-Test, Matched Pair T-Test)
- 7명의 환자를 대상으로 수면 영양제를 복용하기 전과 후의 수면 시간을 측정하여 영양제의 효과가 있는지를 판단하고자 한다.
- 유의수준이 0.05일 때 영양제 복용 전과 후의 평균 수면 시간에 차이가 있는지를 알아보는데, 단측 검정을 수행하여 영양제 복용 후에 수면 시간이 더 늘어났는지를 검정하려고 한다.
- 수면 영양제를 복용하기 전과 후의 수면 시간은 다음과 같다. (표본이 정규성을 만족한다는 가정 하에 단측 검정 수행)
수면 영양제 복용 전 7명의 환자들 수면 시간 : 5, 3, 8, 4, 3, 2, 1 수면 영양제 복용 후 7명의 환자들 수면 시간 : 8, 6, 6, 5, 8, 7, 3 |
귀무가설 : 수면 영양제를 복용하기 전과 후의 평균 수면 시간에는 차이가 없음. 대립가설 : 수면 영양제를 복용하기 전과 후의 평균 수면 시간 차이는 0보다 작음. (수면 영양제를 복용한 후 평균 수면시간이 늘어남.) |
import pandas as pd
from scipy.stats import ttest_rel
data = {
'before': [5, 3, 8, 4, 3, 2, 1],
'after': [8, 6, 6, 5, 8, 7, 3]
}
df = pd.DataFrame(data)
# 쌍체 표본 T-검정 수행
# 단측 검정 (복용 전 수면 시간 < 복용 후 수면 시간)
statistics, pvalue = ttest_rel(data['before'], data['after'], alternative='less')
alpha = 0.05 # 유의수준
if pvalue >= alpha:
print("귀무가설 채택")
else:
print("대립가설 채택")
ANOVA 분산 분석
- 2개 이상의 집단 간 평균의 차이가 통계적으로 유의한지 검정하는 방법
- 그룹 간 평균 차이가 통계적으로 유의미한지 판단하기 위해 그룹 내의 분산과 그룹 간의 분산을 비교한다.
- 귀무가설 : 모든 그룹의 평균이 같다.
- 대립가설 : 적어도 하나의 그룹 평균이 다르다.
- ANOVA를 사용하기 위해서는 다음의 가정을 만족해야 한다.
가정 | 설명 | 검정 함수(@scipy.stats@) |
정규성 가성 | 각 집단의 데이터는 정규 분포를 따라야 한다. | @shapiro()@ |
등분산성 가정 | 모든 집단의 분산이 동일해야 한다. | @levene()@ |
독립성 가정 | 각 집단의 표본은 서로 독립적이어야 한다. | - |
- ANOVA는 실험 설계 방식에 따라 3가지 유형으로 나눌 수 있다.
종류 | 설명 |
일원 분산 분석 (One-way ANOVA) |
- 3개 이상의 집단의 평균이 동일한지 검정하는 방법 - 독립 변수(요인)가 1개일 때 사용 - 예) 서로 다른 3개(독립된 집단)의 치료법(독립 변수)이 환자에게 미치는 영향을 비교할 때 |
이원 분산 분석 (Two-way ANOVA) |
- 독립 변수가 2개일 때 사용 - 상호작용 효과(Interaction Effect)도 분석할 수 있음. - 예) 성별(남성, 여성)(독립 변수1)과 치료법(독립 변수2)이 치료 효과에 미치는 영향을 동시에 비교할 때 |
반복 측정 분산 분석 (Repeated Measures ANOVA) |
- 같은 집단을 반복 측정하여 시간의 변화나 조건에 따른 변화를 분석할 때 사용 - 예) 같은 환자를 대상으로 시간에 따라 치료 전, 후, 추적 관찰 시점의 데이터를 비교할 때 |
예제 코드 : 일원 분산 분석(One-way ANOVA)
- iris 데이터는 붓꽃의 종, 꽃받침의 길이와 너비, 꽃잎의 길이와 너비를 기록한 데이터이다.
- 이를 이용하여 붓꽃의 종(@species@)에 따라 꽃받침의 너비(@sepal_width@)가 차이 나는지 분산 분석으로 검정하시오.
- 주어진 데이터가 정규성과 등분산성을 만족한다고 가정한다.
귀무가설 : 붗꽃의 종에 따른 꽃받침 너비는 동일하다. 대립가설 : 적어도 하나의 붓꽃의 종에서 꽃받침 너비가 차이난다. |
import pandas as pd
from scipy.stats import f_oneway
df = pd.read_csv('/datasets/iris.csv')
# 그룹 설정
group1 = df.loc[df['species'] == 'setosa', 'sepal_width']
group2 = df.loc[df['species'] == 'versicolor', 'sepal_width']
group3 = df.loc[df['species'] == 'virginica', 'sepal_width']
# 일원 분산 분석 수행
statistics, pvalue = f_oneway(group1, group2, group3)
alpha = 0.05 # 유의수준
if pvalue >= alpha:
print("귀무가설 채택")
else:
print("대립가설 채택")
4️⃣ 모분산 검정
☑️ 모집단이 하나인 경우
- 모집단의 분산 $\sigma^{2}$의 값이 $\sigma^{2}_0$인지 아닌지 검증하는 과정
- 양측 검정
- $H_0$ : $\sigma^{2}= \sigma^{2}_0$
- $H_1$ : $\sigma^{2} \neq \sigma^{2}_0$
- 단측 검정
- 경우 1
- $H_0$ : $\sigma^{2} ≥ \sigma^{2}_0$
- $H_1$ : $\sigma^{2} < \sigma^{2}_0$
- 경우 2
- $H_0$ : $\sigma^{2} ≤ \sigma^{2}_0$
- $H_1$ : $\sigma^{2} > \sigma^{2}_0$
- 경우 1
- 양측 검정
📌 카이제곱 검정 (분산 검정)
- 모집단이 1개일 경우, 모집단의 분산을 검정할 때는 카이제곱 검정을 사용한다.
- 정규 분포임을 가정하고 진행한다.
- 표본의 크기가 $n$, 표본 분산이 $S^{2}$일 때, 검정 통계량 $χ^{2}_{(n-1)} = (n-1)\frac{S^{2}}{\sigma^{2}_0}$
☑️ 모집단이 2개인 경우
- 두 모분산 $\sigma^{2}_1, \sigma^{2}_2$ 사이에 차이가 있는지 검증하는 과정
- 양측 검정
- $H_0$ : $\sigma^{2}_1 = \sigma^{2}_2$
- $H_1$ : $\sigma^{2}_1 \neq \sigma^{2}_2$
- 단측 검정
- 경우 1
- $H_0$ : $\sigma^{2}_1 ≥ \sigma^{2}_2$
- $H_1$ : $\sigma^{2}_1 < \sigma^{2}_2$
- 경우 2
- $H_0$ : $\sigma^{2}_1 ≤ \sigma^{2}_2$
- $H_1$ : $\sigma^{2}_1 > \sigma^{2}_2$
- 경우 1
- 양측 검정
📌 F-검정
- 두 표본의 크기가 $n_1, n_2$이고, 표본 분산이 $S_1^2, S_2^2$일 때, 검정 통계량 $F = \frac{S^2_1}{S^2_2} \sim F(n_1 - 1, n_2 - 1)$
- 모집단이 2개일 경우, 모집단의 분산을 검정할 때는 F 검정을 사용한다.
- 두 모집단 분산 간의 비율에 대한 검정이다.
$$F = \frac{s^{2}_{1}}{s_{2}^{2}} \quad(s^{2}_{1} >s^{2}_{2})$$
예제 코드 : F 검정
- 유의수준이 0.05일 때 무작위로 5개의 값을 생성한 두 그룹(@df1@, @df2@)의 분산이 같은지에 대한 검정을 하려고 한다.
1번 그룹 : 1, 2, 3, 4, 6 2번 그룹 : 4, 5, 6, 7, 8 |
귀무가설 : 두 그룹의 분산은 같다. 대립가설 : 두 그룹의 분산은 같지 않다. |
import numpy as np
from scipy.stats import f_oneway
df1 = np.array([1, 2, 3, 4, 6])
df2 = np.array([4, 5, 6, 7, 8])
# F-검정 수행
statistics, pvalue = f_oneway(df1, df2)
alpha = 0.05 # 유의수준
if pvalue >= alpha:
print("귀무가설 채택")
else:
print("대립가설 채택")
- F 검정 함수를 직접 구현하려면 다음과 같이 코드를 작성한다.
더보기
import numpy as np
import scipy.stats import f
df1 = np.array([1, 2, 3, 4, 6])
df2 = np.array([4, 5, 6, 7, 8])
def f_test(x, y):
# 분자가 분모보다 크도록 설정
# ddof=0 : 모분산, ddof=1 : 표본분산
if np.var(x, ddof=1) < np.var(y, ddof=1):
x, y = y, x
# F 통계량 = 표본분산(x) / 표본분산(y)
f_value = np.var(x, ddof=1) / np.var(y, ddof=1)
# F 통계량은 표본분산을 사용하므로 (데이터 개수 - 1)로 계산해 자유도를 맞춤.
x_dof = x.size - 1
y_dof = y.size - 1
p_value = (1 - f.cdf(f_value, x_dof, y_dof)) * 2 # 양측 검정
return f_value, p_value
# F 검정 수행
f_value, p_value = f_test(df1, df2)
alpha = 0.05 # 유의수준
if pvalue >= alpha:
print("귀무가설 채택")
else:
print("대립가설 채택")
5️⃣범주형 변수 검정
☑️ 분할표(교차표, Cross Table)
- 두 범주형 변수에 대한 교차 빈도수를 나타낸 표
- 파이썬에서 판다스(Pandas)의 @crosstab()@ 함수를 이용하여 만들 수 있다.
import pandas as pd
table = pd.crosstab(df['변수A'], df['변수B'])
관찰 빈도
집단 \ 제품 선호 여부 | 선호 | 비선호 | 계 |
A 집단 | 150 | 50 | 200 |
B 집단 | 175 | 75 | 200 |
계 | 325 | 75 | 400 |
기대 빈도
- 가정 : A 집단, B 집단의 제품 선호 여부에 차이가 없다.
집단 \ 제품 선호 여부 | 선호 | 비선호 | 계 |
A 집단 | 150 | 50 | 200 |
B 집단 | 150 | 50 | 200 |
계 | 300 | 100 | 400 |
📌 카이제곱 검정
검정 방법 | 설명 |
적합도 검정 (변수 1개) | - 도수 분포와 기대 분포의 차이가 있는지 검정하는 과정 $H_0$ : 도수 분포와 기대 분포가 같다. $H_1$ : 도수 분포와 기대 분포가 같지 않다. |
독립성 검정 (변수 2개) | - 두 범주형 변수가 독립적인지 아닌지 검정하는 과정 (분할표(교차표)) $H_0$ : 두 변수가 독립이다. $H_1$ : 두 변수가 독립이 아니다. |
동질성 검정 | - 여러 집단에 대한 범주형 변수의 분포가 동질한지 검정하는 과정 $H_0$ : 두 집단의 분포가 같다. $H_1$ : 두 집단의 분포가 같지 않다. |
검정 통계량 | - 관찰 빈도를 $O$, 기대 빈도를 $E$라고 할 때, 카이제곱 통계량 $\chi^{2} = \sum \frac{(O-E)^{2}}{E}$ |
예제 코드 1 : 적합도 검정
- 유의수준이 0.05일 때 초등학교에 남학생이 90명, 여학생이 160명이 있다.
- 남학생, 여학생 비율이 45%와 55%인지를 카이제곱 검정을 이용하여 분석하려고 한다.
귀무 가설 : 초등학교 남학생, 여학생 비율은 45%와 55% 대립 가설 : 초등학교 남학생, 여학생 비율이 45%와 55%가 아님. |
이 문제는 관측된 빈도(90명, 160명)와 기대되는 빈도(총 인원수 기준으로 45%, 55%)를 비교하여, 실제 데이터가 기대 분포와 일치하는지 분석해야 하는 문제이다. 분석 특정 범주(남학생, 여학생)에 대한 기대 비율과 관측된 결과를 비교하는 상황이므로, 카이제곱 적합도 검정을 수행하는 것이 적합하다.
import numpy as np
from scipy.stats import chisquare
# 관측된 데이터(Observed Data)
observed = np.array([90, 160])
# 기대되는 비율(Expected Ratio)
expected_ratio = np.array([0.45, 0.55])
# 기대되는 빈도수(Expected Frequencies)
expected_freq = expected_ratio * np.sum(observed)
# 적합도 검정
statistics, pvalue = chisquare(observed, f_exp=expected_freq)
alpha = 0.05 # 유의수준
if pvalue >= alpha:
print("귀무가설 채택")
else:
print("대립가설 채택")
예제 코드 2 : 독립성 검정
- 타이타닉호의 침몰 사건에서 생존한 승객 및 사망한 승객의 정보를 포함한 데이터에서, 생존 여부(@Survived@)를 예측하고자 한다.
- 이때, @Gender@와 @Survived@ 변수 간의 독립성 검정을 실시하였을 때, 카이제곱 통계량은? (반올림하여 소수 셋째 자리까지 계산)
import pandas as pd
from scipy.stats import chi2_contingency
df = pd.read_csv('/data/Titanic.csv')
# 교차표 생성
table = pd.crosstab(df['Gender'], df['Survived'])
statistics, pvalue, df, expected = chi2_contingency(table)
answer = round(statistics, 3)
print(answere)
예제 코드 3 : 동질성 검정
- 유의수준이 0.05일 때, 남학생과 여학생의 각 과목에 대한 데이터는 다음과 같다.
과목 \ 성별 | 남학생 | 여학생 |
수학 | 30명 | 35명 |
영어 | 40명 | 30명 |
과학 | 20명 | 35명 |
- 남학생과 여학생 두 그룹을 대상으로 선호하는 과목이 동일한지 여부를 검정하려고 한다.
귀무 가설 : 남학생과 여학생의 선호 과목 분포는 서로 차이가 없다. 대립 가설 : 남학생과 여학생의 선호 과목 분포는 서로 차이가 있다. |
import pandas as pd
from scipy.stats import chi2_contingency
data = {
'과목': ['수학', '영어', '과학'],
'남학생': [30, 40, 20],
'여학생': [35, 30, 35]
}
df = pd.DataFrame(data)
# 교차표 생성
table = df.set_index('과목')
# 카이제곱 동질성 검정 수행
statistics, pvalue, df, expected = chi2_contingency(table)
alpha = 0.05 # 유의수준
if pvalue >= alpha:
print("귀무가설 채택")
else:
print("대립가설 채택")
⇒ @table@ 변수를 출력해보면 다음과 같다.
table:
남학생 여학생
과목
수학 30 35
영어 40 30
과학 20 35
@pd.crosstab()@은 2개 이상의 범주형 변수를 교차하여 빈도수를 집계할 때 사용한다. (예: 성별과 과목 선호도를 따로 행과 열에 범주형 변수로 나누어 교차 빈도를 분석할 때) 반면, @df.set_index()@는 이미 정리된 표 형태의 데이터를 인덱스 형태로 변환하는 역할만 하며 새로운 집계 작업이 필요하지 않을 때 적합하다. 이 문제에서는 과목 선호 데이터를 이미 집계한 표로 주어졌기 때문에, 단순히 @df.set_index()@를 사용해 교차표를 만들었다.
6️⃣ 고급 통계 : 회귀 분석
☑️ 문제 예시
☑️ 머신러닝과 통계에서의 회귀 분석의 의미
머신러닝 | 통계 | |
목적 | 신규 데이터 분류 및 회귀 예측 | 모집단의 특성 추론 |
중요 포인트 | 예측 성능을 높이는 것이 중요함. | 모집단의 특성을 추론하고 설명하는 것이 중요함. |
활용 패키지 | 사이킷런(@sklearn@) | @statsmodel.api@ |
☑️ 회귀 분석의 종류
종류 | 설명 | 예시 |
단순 선형 회귀 | 1개의 독립 변수와 1개의 종속 변수 사이의 선형 관계 모델링 (하나의 직선) |
온도와 아이스크림 매출의 관계 |
다중 선형 회귀 | 2개 이상의 독립 변수와 1개의 종속 변수의 관계를 모델링 (여러 개의 직선) |
물고기의 무게와 길이, 폭, 두께, 지느러미 길이의 관계 |
다항 선형 회귀 | 독립 변수와 종속 변수의 비선형 관계를 모델링 (곡선) | 주택의 가격과 크기의 관계 |
로지스틱 회귀 | 종속 변수가 범주형 데이터인 경우 | 꽃 종류와 꽃잎, 꽃받침의 크기, 길이의 관계 |
검정 통계량, 상관 계수, 회귀 계수, 오즈비 등을 묻는 문제가 출제된다.
회귀식에서 귀무가설과 대립가설은 다음과 같다.
✅ 귀무가설 : 해당 변수는 종속 변수에 미치는 영향력이 없다.
✅ 대립가설 : 해당 변수는 종속 변수에 미치는 영향력이 있다.
따라서 유의하지 않은 변수를 구해야 하는 문제가 출제될 경우, 귀무가설을 채택할 수 있는(p-value > 유의수준) 변수를 선택한다.
📌 단순 선형 회귀
예제 코드
import numpy as np
import pandas as pd
import statsmodels.api as sm
import matplotlib.pyplot as plt
# (1) 조정된 데이터 생성 : 온도와 아이스크림 매출
np.random.seed(0)
temperatures = np.random.randint(20, 35, 100) # 더 많은 데이터 포인트 추가
sales = temperatures * 70 - 500 + np.random.normal(0, 100, 100) # 기울기와 절편 조정, 변동성 조정
# (2) 데이터프레임 생성
data = pd.DataFrame({
'temperature': temperatures,
'ice_cream_sales': sales
})
# (3) statsmodels를 사용한 단순 선형 회귀 재적합 ✅
## 독립 변수 생성
X = data['temperature']
## 종속 변수 생성
y = data['ice_cream_sales']
## 상수항 추가
X = sm.add_constant(data['temperature'])
## 회귀 모델 생성
model = sm.OLS(y, X).fit()
# (4) 모델링 결과 확인 ✅
summary = model.summary()
print(summary)
설명 | |
① 회귀 계수 (절편, @coef@) | ✅ 회귀 계수(절편)는 각 독립 변수가 종속 변수에 미치는 영향을 미치는 지 보여주는 지표이다. ✅ 이 값은 독립 변수 값이 1단위 증가할 때 종속 변수의 예상 변화량을 의미한다. ✅ 회귀 계수 값이 양수이면 독립 변수와 종속 변수 간에 양의 관계가 있음을, 음수이면 음의 관계가 있음을 의미한다. ☑️ @const@의 값 -452.2143은 y = ax + b에서 @b@의 값(y절편)을 의미한다. ☑️ @temperature@의 회귀 계수는 @67.9405@이며, 이것은 @temperature@가 1 증가할 때 @ice_cream_sales@가 평균적으로 67.9405만큼 증가한다는 뜻이다. 💡coef 값은 해당 변수 값이 1 증가할 때 평균적으로 coef 값 만큼 증가한다는 뜻이다. |
② p-value (@P>|t|@) | ✅ p-value는 해당 변수가 종속 변수에 대해 유의미한 영향을 미치는지를 검정하는 지표로, 0에서 1 사이의 값을 가진다. ✅ 일반적으로 p-value가 @0.05@보다 작으면 (즉, @P>|t| < 0.05@), 해당 변수가 종속 변수에 유의미한 영향을 미친다고 해석한다. (p-value가 0.05 보다 클 경우, 귀무가설 채택한다.) ☑️ @temperature@의 p-value는 0.000으로 0.05보다 작기 때문에 유의미하다고 볼 수 있다. 💡P>|t| 값이 0.05보다 작을 경우, 유의미하다고 볼 수 있다. |
③ 결정 계수(R², @R-squared@) | ✅ 결정 계수(R²)는 모델이 종속 변수의 총 변동 중 얼마나 많은 부분을 설명하는지 나타내는 지표이다. ✅ $0 < R^{2} < 1$, $R^2$ 이며, 1에 가까울수록 모델의 설명력이 높다는 것을 의미한다. ✅ 하지만, 결정 계수 값이 크다고 해서 항상 모델이 좋다고 단정할 수는 없다. (독립 변수 간의 다중공선성(Multicollinearity) 문제가 있을 경우, 결정 계수 값이 과대 평가될 수 있기 때문이다.) ☑️ 0.874가 나왔다는 것은 이 모델의 데이터의 87.4%를 설명한다고 보면 된다. (@ice_cream_sales@의 변동성 중 약 87.4%를 설명하고 있다는 뜻이다.) 💡R-squared 값이 이 1에 가까울수록 모델의 설명력이 높다고 할 수 있다. |
④ F-통계량 (@F-statistic@) | ✅ F-통계량은 모델에 포함된 독립 변수가 종속 변수에 대해 유의미한 설명력을 제공하는지를 평가하기 위해 사용되는 지표이다. ✅ F-통계량이 크고, p-값(Prob (F-statistic))이 매우 낮으면 (일반적으로 @0.05@ 미만), 모델이 유의미하다는 것을 나타낸다. ☑️ 위 결과에서 F-통계량은 @680.3@으로 높고, p-값은 @6.90e-46@으로 0에 매우 가까우므로 모델이 유의미하다고 판단할 수 있다. 💡F-statistic 값이 크고, Prop (F-statistic) 값이 매우 작을수록 (0.05 미만) 모델이 유의미하다고 볼 수 있다. |
📌 다중 선형 회귀
예제 코드
import numpy as np
import pandas as pd
import statsmodels.api as sm
# (1) 데이터 생성
np.random.seed(0)
fish_length = np.random.uniform(15, 40, 100) # 길이
fish_width = np.random.uniform(5, 10, 100) # 폭
fish_thickness = np.random.uniform(1, 5, 100) # 두께
fish_fin_length = np.random.uniform(3, 8, 100) # 지느러미 길이
fish_weight = 200 + (20 * fish_length) + (10 * fish_width) + (5 * fish_thickness) + (15 * fish_fin_length) + np.random.normal(0, 10, 100)
# (2) 데이터프레임 생성
fish_data = pd.DataFrame({
'length': fish_length,
'width': fish_width,
'thickness': fish_thickness,
'fin_length': fish_fin_length,
'weight': fish_weight,
})
# (3) 다중 선형 회귀 모델 생성 ✅
## 독립 변수 생성
X = fish_data[['length', 'width', 'thickness', 'fin_length']]
## 종속 변수 생성
y = fish_data['weight']
## 상수항 추가
X = sm.add_constant(X)
## 회귀 모델 생성
model = sm.OLS(y, X).fit()
# (4) 모델링 결과 확인 ✅
summary = model.summary()
print(summary)
설명 | |
① 회귀 계수 (절편, @coef@) | ✅ 회귀 계수(절편)는 각 독립 변수가 종속 변수에 미치는 영향을 미치는 지 보여주는 지표이다. ✅ 이 값은 독립 변수 값이 1단위 증가할 때 종속 변수의 예상 변화량을 의미한다. ✅ 회귀 계수 값이 양수이면 독립 변수와 종속 변수 간에 양의 관계가 있음을, 음수이면 음의 관계가 있음을 의미한다. ☑️ @const@의 값 191.6867은 y = ax + b에서 @b@의 값(y절편)을 의미한다. ☑️ @length@의 회귀 계수는 @20.2239@이며, 이것은 @length@가 1 증가할 때 @weight@가 평균적으로 20.2239만큼 증가한다는 뜻이다. ☑️ @width@의 회귀 계수는 @9.9082@이며, 이것은 @width@가 1 증가할 때 @weight@가 평균적으로 9.9082만큼 증가한다는 뜻이다. ☑️ @thickness@의 회귀 계수는 @11.6707@으로 나타나며, 이는 @thickness@가 1 증가할 때 @weight@가 평균적으로 11.6707만큼 증가한다는 뜻이다. ☑️ @fin_length@의 회귀 계수는 @14.8495@이며, 이것은 @fin_length@가 1 증가할 때 @weight@가 평균적으로 14.8495만큼 증가한다는 뜻이다. 💡coef 값은 해당 변수 값이 1 증가할 때 평균적으로 coef 값 만큼 증가한다는 뜻이다. |
② p-value (@P>|t|@) | ✅ p-value는 해당 변수가 종속 변수에 대해 유의미한 영향을 미치는지를 검정하는 지표로, 0에서 1 사이의 값을 가진다. ✅ 일반적으로 p-value가 @0.05@보다 작으면 (즉, @P>|t| < 0.05@), 해당 변수가 종속 변수에 유의미한 영향을 미친다고 해석한다. (p-value가 0.05 보다 클 경우, 귀무가설 채택한다.) ☑️ @length@, @width@, @fin_length@의 p-value는 0.000으로 0.05보다 작기 때문에 유의미하다고 볼 수 있다. ☑️ 그러나 @fin_length@의 p-value는 0.136으로 0.05보다 크므로, 이 변수는 @weight@에 대해 유의미하지 않을 수 있다. 💡P>|t| 값이 0.05보다 작을 경우, 유의미하다고 볼 수 있다. |
③ 결정 계수(R², @R-squared@) | ✅ 결정 계수(R²)는 모델이 종속 변수의 총 변동 중 얼마나 많은 부분을 설명하는지 나타내는 지표이다. ✅ $0 < R^{2} < 1$, $R^2$ 이며, 1에 가까울수록 모델의 설명력이 높다는 것을 의미한다. ✅ 하지만, 결정 계수 값이 크다고 해서 항상 모델이 좋다고 단정할 수는 없다. (독립 변수 간의 다중공선성(Multicollinearity) 문제가 있을 경우, 결정 계수 값이 과대 평가될 수 있기 때문이다.) ☑️ 0.996가 나왔다는 것은 이 모델의 데이터의 99.6%를 설명한다고 보면 된다. (@weight@의 변동성 중 약 99.6%를 설명하고 있다는 뜻이다.) 💡R-squared 값이 이 1에 가까울수록 모델의 설명력이 높다고 할 수 있다. |
④ F-통계량 (@F-statistic@) | ✅ F-통계량은 모델에 포함된 독립 변수가 종속 변수에 대해 유의미한 설명력을 제공하는지를 평가하기 위해 사용되는 지표이다. ✅ F-통계량이 크고, p-값(Prob (F-statistic))이 매우 낮으면 (일반적으로 @0.05@ 미만), 모델이 유의미하다는 것을 나타낸다. ☑️ 위 결과에서 F-통계량은 @6376@으로 높고, p-값은 @1.72e-114@로 0에 매우 가까우므로 모델이 유의미하다고 판단할 수 있다. 💡F-statistic 값이 크고, Prop (F-statistic) 값이 매우 작을수록 (0.05 미만) 모델이 유의미하다고 볼 수 있다. |
📌 다항 선형 회귀
예제 코드
import numpy as np
import pandas as pd
import statsmodels.api as sm
import matplotlib.pyplot as plt
# (1) 데이터 생성
np.random.seed(0)
house_size = np.random.uniform(50, 250, 100) # 주택 크기 : 50제곱미터 ~ 250제곱미터
house_price = 5000 + 20 * house_size + 0.2 * house_size ** 2 + np.random.normal(0, 2000, 100) # 주택 가격 : 강한 비선형 관계
# (2) 데이터프레임 생성
house_data = pd.DataFrame({
'size': house_size,
'price': house_price
})
# 다항 특성 생성 : size^2
house_data['size^2'] = house_data['size'] ** 2
# (3) 다항 회귀 모델 생성 ✅
## 독립 변수 생성
X = house_data[['size', 'size^2']]
## 종속 변수 생성
y = house_data['price']
## 상수항 추가
X = sm.add_constant(X)
## 회귀 모델 생성
model = sm.OLS(y, X).fit()
# (4) 모델링 결과 확인 ✅
summary = model.summary()
print(summary)
설명 | |
① 회귀 계수 (절편, @coef@) | ✅ 회귀 계수(절편)는 각 독립 변수가 종속 변수에 미치는 영향을 미치는 지 보여주는 지표이다. ✅ 이 값은 독립 변수 값이 1단위 증가할 때 종속 변수의 예상 변화량을 의미한다. ✅ 회귀 계수 값이 양수이면 독립 변수와 종속 변수 간에 양의 관계가 있음을, 음수이면 음의 관계가 있음을 의미한다. ☑️ @const@의 값 3835.8351은 y = ax + b에서 @b@의 값(y절편)을 의미한다. ☑️ @size@의 회귀 계수는 @45.8583@이며, 이것은 @size@가 1 증가할 때 @price@가 평균적으로 45.8583만큼 증가한다는 뜻이다. ☑️ @size^2@의 회귀 계수는 @0.1096@으로 나타나며, 이는 @size^2@이 1 증가할 때 @price@가 평균적으로 0.1096만큼 증가한다는 뜻이다. 💡coef 값은 해당 변수 값이 1 증가할 때 평균적으로 coef 값 만큼 증가한다는 뜻이다. |
② p-value (@P>|t|@) | ✅ p-value는 해당 변수가 종속 변수에 대해 유의미한 영향을 미치는지를 검정하는 지표로, 0에서 1 사이의 값을 가진다. ✅ 일반적으로 p-value가 @0.05@보다 작으면 (즉, @P>|t| < 0.05@), 해당 변수가 종속 변수에 유의미한 영향을 미친다고 해석한다. (p-value가 0.05 보다 클 경우, 귀무가설 채택한다.) ☑️ @size@의 p-value는 0.021로 0.05보다 작기 때문에 유의미하다고 볼 수 있다. ☑️ 그러나 @size^2@의 p-value는 0.099로 0.05보다 크므로, 이 변수는 @price@에 대해 유의미하지 않을 수 있다. 💡P>|t| 값이 0.05보다 작을 경우, 유의미하다고 볼 수 있다. |
③ 결정 계수(R², @R-squared@) | ✅ 결정 계수(R²)는 모델이 종속 변수의 총 변동 중 얼마나 많은 부분을 설명하는지 나타내는 지표이다. ✅ $0 < R^{2} < 1$, $R^2$ 이며, 1에 가까울수록 모델의 설명력이 높다는 것을 의미한다. ✅ 하지만, 결정 계수 값이 크다고 해서 항상 모델이 좋다고 단정할 수는 없다. (독립 변수 간의 다중공선성(Multicollinearity) 문제가 있을 경우, 결정 계수 값이 과대 평가될 수 있기 때문이다.) ☑️ 0.839가 나왔다는 것은 이 모델의 데이터의 83.9%를 설명한다고 보면 된다. (@price@의 변동성 중 약 83.9%를 설명하고 있다는 뜻이다.) 💡R-squared 값이 이 1에 가까울수록 모델의 설명력이 높다고 할 수 있다. |
④ F-통계량 (@F-statistic@) | ✅ F-통계량은 모델에 포함된 독립 변수가 종속 변수에 대해 유의미한 설명력을 제공하는지를 평가하기 위해 사용되는 지표이다. ✅ F-통계량이 크고, p-값(Prob (F-statistic))이 매우 낮으면 (일반적으로 @0.05@ 미만), 모델이 유의미하다는 것을 나타낸다. ☑️ 위 결과에서 F-통계량은 @253.2@로 높고, p-값은 @3.15e-39@로 0에 매우 가까우므로 모델이 유의미하다고 판단할 수 있다. 💡F-statistic 값이 크고, Prop (F-statistic) 값이 매우 작을수록 (0.05 미만) 모델이 유의미하다고 볼 수 있다. |
📌 로지스틱 회귀
예제 코드
from sklearn.datasets import load_iris
import pandas as pd
import statsmodels.api as sm
# iris 데이터셋 불러오기
iris = load_iris()
iris_df = pd.DataFrame(iris.data, columns=iris.feature_names)
# versicolor(1)와 virginica(2)만 선택하고, 종(species)을 이진 변수로 변환하기
## versicolor=0, virginica=1
iris_df['species'] = iris.target
iris_filtered = iris_df[(iris_df['species'] == 1) | (iris_df['species'] == 2)]
iris_filtered['species'] = iris_filtered['species'].map({ 1: 0, 2: 1 })
# ✅ 로지스틱 회귀 모델 생성
## 독립 변수 생성
X = iris_filtered.drop('species', axis=1)
## 종속 변수 생성
y = iris_filtered['species']
## 상수항 추가
X = sm.add_constant(X)
## 회귀 모델 생성
model = sm.Logit(y, X).fit()
# ✅ 모델링 결과 확인
summary = model.summary()
print(summary)
설명 | |
① 회귀 계수 (절편, @coef@) | ✅ 회귀 계수(절편)는 각 독립 변수가 종속 변수에 미치는 영향을 미치는 지 보여주는 지표이다. ✅ 이 값은 독립 변수 값이 1단위 증가할 때 종속 변수의 예상 변화량을 의미한다. ✅ 회귀 계수 값이 양수이면 독립 변수와 종속 변수 간에 양의 관계가 있음을, 음수이면 음의 관계가 있음을 의미한다. ☑️ @const@의 값 -42.6378은 y = ax + b에서 @b@의 값(y절편)을 의미한다. ☑️ @sepal length (cm)@의 회귀 계수는 @-2.4652@이며, 이것은 @sepal length (cm)@가 1 증가할 때 로그 오즈(Log Odds)가 -2.4652만큼 감소한다는 뜻이다. ☑️ @sepal width (cm)@의 회귀 계수는 @-6.6809@이며, 이것은 @sepal width (cm)@가 1 증가할 때 로그 오즈(Log Odds)가 -6.6809만큼 감소한다는 뜻이다. ☑️ @petal length (cm)@의 회귀 계수는 @9.4294@이며, 이것은 @petal length (cm)@가 1 증가할 때 로그 오즈(Log Odds)가 9.4294만큼 증가한다는 뜻이다. ☑️ @petal width (cm)@의 회귀 계수는 @18.2861@이며, 이것은 @petal width (cm)@가 1 증가할 때 로그 오즈(Log Odds)가 18.2861만큼 증가한다는 뜻이다. 💡coef 값은 해당 변수 값이 1 증가할 때 coef 값 만큼 로그 오즈(Log Odds) 값이 증가한다는 뜻이다. |
② p-value (@P>|t|@) | ✅ p-value는 해당 변수가 종속 변수에 대해 유의미한 영향을 미치는지를 검정하는 지표로, 0에서 1 사이의 값을 가진다. ✅ 일반적으로 p-value가 @0.05@보다 작으면 (즉, @P>|t| < 0.05@), 해당 변수가 종속 변수에 유의미한 영향을 미친다고 해석한다. (p-value가 0.05 보다 클 경우, 귀무가설 채택한다.) ☑️ @petal length (cm)@의 p-value는 각각 0.047로 0.05보다 작기 때문에 유의미하다고 볼 수 있다. ☑️ 그러나 나머지 변수의 p-value는 0.05보다 크므로, 유의미하지 않을 수 있다. 💡P>|t| 값이 0.05보다 작을 경우, 유의미하다고 볼 수 있다. |
③ 의사 결정 계수(PR², @Pseudo R-squ@) / 로그 우도(Log-Likelihood) |
✅ 의사 결정 계수(PR²)는 로지스틱 회귀와 같은 비선형 모델에서 모델의 설명력을 평가하는 지표로 사용된다. 선형 회귀의 결정 계수(R²)와 유사하게 해석되지만, 정확히 동일한 개념은 아니다. ✅ $0 < PR^{2} < 1$ 이며, 1에 가까울수록 모델의 설명력이 높다는 것을 의미한다. ✅ 로그 우도(@Log-Likelihood@)는 로지스틱 모델의 적합도를 평가하는 지표이다. 로그 우도는 모델이 주어진 데이터를 얼마나 잘 설명하는지 나타내며, 값이 클수록 모델이 데이터를 잘 설명함을 의미한다. ☑️Pseudo R-squ가 0.9142가 나왔다는 것은 이 모델의 데이터의 91.42%를 설명한다고 보면 된다. ☑️ Log-Likelihood는 -5.9493이 나왔다. 💡Pseudo R-squ 값이 이 1에 가까울수록, Log-Likelihood 값이 클수록 모델의 설명력이 높다고 할 수 있다. |
④ Log-Likelihood Ratio p-value (@LLR p-value@) | ✅ @LLR p-value@는 로지스틱 모델의 유의성을 평가하는 지표이다. ✅ 현재 모델과 기저 모델(독립 변수가 포함되지 않은 모델) 사이의 차이를 평가하는데, p-값이 매우 낮으면 (일반적으로 @0.05@ 미만), 모델이 유의미하다는 것을 나타낸다. ☑️ 위 결과에서 LLR p-value는 @1.947e-26@로 0에 매우 가까우므로 모델이 유의미하다고 판단할 수 있다. 💡LLR p-value 값이 매우 작을수록 (0.05 미만) 모델이 유의미하다고 볼 수 있다. |
☑️ 참고
📌 오즈비(Odds Ratio) 구하기
- 오즈비(Odds Ratio)는 특정 변수의 값이 변할 때, 결과가 긍정적으로 변화할 확률의 변화 정도를 나타낸다.
- 오즈비는 각 계수(@coef@)의 지수를 취해 계산할 수 있다.
$$\text{Odds Ratio} = e^{\text{coef}}$$ |
- 오즈비는 넘파이(NumPy) 패키지의 @exp@ 함수를 이용하여 구할 수 있다.
import numpy as np
answer = np.exp(coef)
print(answer)
- 전체 변수의 오즈비를 구하면 다음과 같다.
import numpy as np
import pandas as pd
# 회귀 계수를 딕셔너리로 만든다.
coefficients = {
'const': -42.6378,
'sepal length (cm)': -2.4652,
'sepal width (cm)': -6.6809,
'petal length (cm)': 9.4294,
'petal width (cm)': 18.2861
}
# 각 계수의 지수를 취해 오즈비를 계산한다.
odds_ratios = {var: np.exp(coef) for var, coef in coefficients.items()}
# 결과를 데이터프레임으로 표시한다.
odds_ratios_df = pd.DataFrame(list(odds_ratios.items()), columns=['Variable', 'Odds Ratio'])
print(odds_ratios_df)
Variable Odds Ratio 0 const 3.038357e-19 1 sepal length (cm) 8.499184e-02 2 sepal width (cm) 1.254648e-03 3 petal length (cm) 1.244906e+04 4 petal width (cm) 8.740823e+07 |
- 변수가 @N@ 증가하면 오즈비는 다음과 같이 증가한다. [8회 실기 기출]
# ⭕정답
np.exp(N * coef(변수)) # coef : 회귀 계수
# ✖️오답
N * np.exp(coef(변수))
📌 @from_formula@를 이용하여 모델링하기
- 다음과 같이 @from_formula@를 이용할 경우, 일일히 ①독립 변수 중 범주형 변수를 따로 수치형 변수로 인코딩을 해주지 않아도 되고, ②상수항을 추가해주지 않아도 된다.
- 아래와 같은 방법으로 사용할 수 있다.
import statsmodels.api as sm
df = pd.read_csv('./datasets/example.csv')
formula = '종속변수 ~ 독립변수1 + 독립변수2 + ... + 독립변수N'
model1 = sm.OLS.from_formula(formula, df)
model2 = sm.Logit.from_formula(formula, df)
@from_formula@를 사용하지 않는 경우
- 모델링 전에 범주형 변수를 수치형 변수로 변환 해주어야 하고, 상수항을 따로 추가해줘야 한다.
import pandas as pd
import statsmodels.api as sm
df = pd.read_csv('data/Titanic.csv')
# (1) 범주형 변수 -> 수치형 변수 (라벨 인코딩)
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
df['Gender'] = le.fit_transform(df['Gender'])
x = df(['Gender', 'SibSp', 'Parch', 'Fare'])
x = sm.add_constant(x) # (2) 상수항 추가
y = df['Survived']
model = sm.Logit(y, X).fit()
summary = model.summary()
print(summary)
@from_formula@를 사용하는 경우
- 모델링 전에 변수를 따로 변환해주거나 상수항을 따로 추가해주지 않아도 된다.
import pandas as pd
import statsmodels.api as sm
df = pd.read_csv('data/Titanic.csv')
formula = 'Survived ~ Gender + SibSp + Parch + Fare'
model = sm.Logit.from_formula(formula, df).fit()
summary = model.summary()
print(summary)
- @from_formula()@에 대한 자세한 내용은 아래의 공식 문서를 참고한다.
728x90
728x90
'Certificate > 빅데이터분석기사' 카테고리의 다른 글
[빅데이터분석기사 실기] 제1유형 시험 준비 (0) | 2024.11.25 |
---|---|
[빅데이터분석기사 실기] help(), dir() 활용하기 (0) | 2024.11.25 |
[빅데이터분석기사 실기] corr() 함수와 numeric_only 옵션 (0) | 2024.11.25 |
[빅데이터분석기사 실기] 시험장 들어가기 전에 보기 빠르게 보기 좋은 강의 모음 (1) | 2024.11.17 |
[빅데이터분석기사 실기] 제6회 기출 변형 문제 (제3유형) (0) | 2024.11.16 |
[빅데이터분석기사 실기] 제7회 기출 변형 문제 (제3유형) (0) | 2024.11.16 |
[빅데이터분석기사 실기] 제8회 기출 변형 문제 (제3유형) (2) | 2024.11.15 |
[빅데이터분석기사 실기] 판다스(pandas) 출력 길이 제한 해제하기 (0) | 2024.10.27 |