상세 컨텐츠

본문 제목

통계_검정, 상관 분석, 쌍 비교, 회귀 분석, 다변량 분석

경험 리뷰/한국경제 with Tossbank

by shok11 2024. 8. 4. 11:52

본문

728x90
반응형

 

1. 통계 검정의 중요성.

- 연구의 신뢰성 증대

- 객관적인 의사 결정

- 오류 감소

   1종오류 ( α 오류 ) :  실제로는 맞지 않는 가설을 맞다고 잘못 판단하는 오류.

   2종오류 ( β 오류 ) : 실제로 맞는 가설을 틀렸다고 잘못 판단하는 오류.

- 자료 해석의 명확성

 

 

2. 통계적 검정 절차의 개요.

통계적 검정은 특정 가설을 검정하는 과정입니다.

 

- 가설 설정

귀무가설 ( H0 ) : 변수가 없다는 가정. / 차이가 없거나 효과가 없다는 것을 주장.

대립가설 ( H1 ) : 귀무가설과 반대되는 주장. / 차이가 있거나 효과가 있다는 것을 주장.

 

- ex.

귀무가설(H0): 새로운 약물과 기존 약물의 효과 차이는 없다.

대립가설(H1): 새로운 약물이 기존 약물보다 효과가 더 좋다.

 

 

- 유의 수준(α) 결정

일반적으로 0.05(5%)를 많이 사용하지만, 목적에 따라 0.01(1%)이나 0.10(10%) 등을 사용합니다.

 

- 적절한 통계 검정 방법 선택

데이터의 유형, 샘플의 수, 정규성 여부등을 고려하여 적절한 검정 방법을 선택.

 

- 검정 통계량 계산

t값 계산.

 

- p-값 계산 및 해석

ex . p-값이 0.03이라면, 유의 수준 0.05보다 작으므로 귀무가설을 기각.

 

- 결론 도출

ex. 새로운 학습 방법이 기존 방법보다 효과가 더 좋다는 결론 도출.

 

3. 샘플 수에 따른 분류

 

샘플 수에 따라 적절한 통계 검정 방법을 선택해야 합니다. 이를 통해 보다 정확하고 신뢰할 수 있는 결과를 얻을 수 있습니다.  샘플 수는 1개, 2개, 3개 이상으로 구분할 수 있습니다.

 


- 1개 샘플

One-Sample t-test (단일 표본 t-검정): 샘플의 평균이 특정 값과 다른지 검정할 때 사용합니다.

 

Sign Test (부호 검정): 샘플의 중앙값이 특정 값과 다른지 검정할 때 사용합니다. 비모수 검정 방법입니다.

 


- 2개 샘플

- 연속형 데이터

 

Independent t-test (독립 표본 t-검정): 두 독립 표본의 평균이 같은지 검정합니다.

정규성 가정, 등분산성 가정.

 

Welch’s t-test (웰치의 t-검정): 두 독립 표본의 평균이 같은지 검정합니다.

정규성 가정, 등분산성 가정하지 않을 시.

 

Paired t-test (대응 표본 t-검정): 두 대응 표본의 평균이 같은지 검정합니다.

정규성 가정.

 

Mann-Whitney U Test (맨-휘트니 U 검정): 두 독립 표본의 순위가 같은지 검정합니다. +비모수 검정 방법.

정규성 가정하지 않음.

 

Wilcoxon Signed-Rank Test (윌콕슨 부호 순위 검정): 두 대응 표본의 중앙값이 같은지 검정합니다. +비모수 검정 방법.

정규성 가정하지 않음.

 

- 범주형 데이터

 

Chi-Square Test (카이제곱 검정): 두 범주형 변수 간의 독립성을 검정합니다.

관측 빈도가 충분히 클 때 사용.

 

Fisher’s Exact Test (피셔의 정확 검정): 두 범주형 변수 간의 독립성을 검정합니다.

관측 빈도가 작을 때 사용.

 

McNemar’s Test (맥네마 검정): 두 대응 범주형 변수 간의 변화가 대칭적인지 검정합니다.

 


- 3개 이상 샘플

- 연속형 데이터

 

ANOVA (분산 분석): 세 개 이상의 독립 표본 평균이 같은지 검정합니다.

정규성 가정, 등분산성 가정.

 

Repeated Measures ANOVA (반복 측정 분산 분석): 동일 대상에 대해 반복 측정한 데이터의 평균이 같은지 검정합니다.

정규성 가정.

 

MANOVA (다변량 분산 분석): 다수의 종속 변수에 대한 그룹 간 차이를 검정합니다.

정규성 가정.

 

Kruskal-Wallis Test (크루스칼-월리스 검정): 세 개 이상의 독립 표본의 순위가 같은지 검정합니다. +비모수 검정 방법

정규성 가정하지 않음.

 

Friedman Test (프리드만 검정): 동일한 대상에 대해 여러 번 측정한 데이터의 순위가 같은지 검정합니다. +비모수 검정

정규성 가정하지 않음.

 

- 범주형 데이터

 

Chi-Square Test (카이제곱 검정): 세 개 이상의 범주형 변수 간의 독립성을 검정합니다

관측 빈도가 충분히 클 때 사용.

 

Cochran’s Q Test (코크란의 Q 검정): 세 개 이상의 관련 이항 변수가 서로 다른지 검정합니다.

 

4. 데이터 유형

 

일반적으로 데이터는 연속형 데이터와 범주형 데이터로 구분됩니다.

 

- 연속형 데이터 (연속 변수)

숫자로 표현되며, 측정값이 연속적인 값을 가지는 데이터입니다. 이는 두 값 사이에 무한히 많은 값을 가질 수 있습니다.

ex. 키, 몸무게, 온도, 시간,,,

검정방법. 정규성 검정, t-검정, ANOVA(분산분석), 상관 분석, 회귀 분석

 

- 범주형 데이터 (명목 변수, 서열 변수)

특정 범주나 그룹으로 구분되는 데이터입니다. 이는 숫자로 표현되더라도 숫자는 순서나 크기를 나타내지 않습니다.

ex. 성별, 혈액형, 선호 색, 질병 유무

검정방법. 카이제곱 검정, 피셔의 정확 검정, 맥네마 검정, 로지스틱 회귀 분

 

- 이산형 데이터

범주형 데이터와 유사한 점이 많지만, 연속형 데이터와는 다른 특성을 가진다.

이산형 데이터는 주로 정수 값을 가지며, 셀 수 있는 데이터를 의미합니다. 또한 각 값 사이에 무한히 많은 값이 존재하지 않습니다.

ex. 학생 수(10, 20, 30), 자동차 대수(1, 2, 3), 주사위 눈금(1, 2, 3, 4, 5, 6)

검정방법. 포아송 분포 검

 

5. 정규성 검정

 

데이터가 정규 분포를 따르는지 여부를 확인하는 과정 많은 통계적 검정 방법은 데이터가 정규 분포를 따른다는 가정 하에 이루어집니다. 따라서 데이터가 정규 분포를 따르는지 확인하는 것이 중요합니다.

 

이산형 데이터에 대한 정규성 검정은 거의 수행되지 않습니다. 이는 이산형 데이터가 연속적인 값을 가지는 것이 아니기 때문입니다.

 

- 검정 결과 해석

p-값 > 유의수준: 데이터가 정규 분포를 따른다고 판단할 수 있습니다.

p-값 ≤ 유의 수준:데이터가 정규 분포를 따르지 않는다고 판단할 수 있습니다.

 

- Shapiro-Wilk Test

작은 표본에서도 높은 검정을 제공하며, 정규 분포에서 크게 벗어난 데이터에 민감합니다.

from scipy import stats
sample_data = [1.1, 2.3, 2.1, 3.3, 4.4]
stat, p_value = stats.shapiro(sample_data)
print(stat, p_value)

 

- Kolmogorov-Smirnov Test

데이터가 특정 분포를 따르는지 검정하는 방법, 다른 분포를 검정할 때도 사용한다.

from scipy import stats
sample_data = [1.1, 2.3, 2.1, 3.3, 4.4]
stat, p_value = stats.kstest(sample_data, 'norm')
print(stat, p_value)

 

- Anderson-Darling Test

정규 분포를 포함한 여러 분포를 검정할 수 있습니다. 특히 표본의 양 끝 부분에서의 차이에 민감합니다.

from scipy import stats
sample_data = [1.1, 2.3, 2.1, 3.3, 4.4]
result = stats.anderson(sample_data, dist='norm')
print(result)

 

- Q-Q Plot (Quantile-Quantile Plot)

데이터의 정규성을 시각적으로 판단할 수 있는 도구, 정규 분포와 얼마나 유사한지를 확인할 수 있습니다.

 

import numpy as np
import matplotlib.pyplot as plt
import scipy.stats as stats

sample_data = np.random.normal(loc=0, scale=1, size=100)
stats.probplot(sample_data, dist="norm", plot=plt)
plt.show()

 

6. 통계적 검정 방법

 


- 1개 샘플에 대한 검정 방법.

 

- One-Sample t-test (단일 표본 t-검정)

단일 표본의 평균이 특정 값과 다른지 검정 / (가정) 데이터가 정규 분포를 따를 때.

from scipy import stats
sample_data = [2.3, 1.9, 2.1, 2.4, 2.6]
t_statistic, p_value = stats.ttest_1samp(sample_data, popmean=2.0)
# popmean은 단일 표본 t-검정에서 비교하고자 하는 모집단의 가정된 평균
print(t_statistic, p_value)

 

 

- Sign Test (부호 검정)

단일 표본의 중앙값이 특정 값과 다른지 검정 / (가정) 데이터가 연속적이고 대칭적일 때. / 정규 분포를 따르지 않을 때.

from scipy import stats
sample_data = [1.1, 2.3, 2.1, 3.3, 4.4]
median = 2.0
result = stats.binom_test(sum(np.sign(sample_data - median) > 0), n=len(sample_data), p=0.5)
print(result)

 


- 2개 샘플에 대한 검정 방법.

- 연속형 데이터

 

- Independent t-test (독립 표본 t-검정)

두 독립 표본의 평균이 같은지 검정 / (가정) 두 샘플이 정규 분포를 따르고 등분산성을 가질 때

from scipy import stats
sample_data1 = [1.1, 2.3, 2.1, 3.3, 4.4]
sample_data2 = [2.1, 2.4, 3.1, 3.5, 3.9]
t_statistic, p_value = stats.ttest_ind(sample_data1, sample_data2)
print(t_statistic, p_value)

 

- Welch’s t-test (웰치의 t-검정)

두 독립 표본의 평균이 같은지 검정 / (가정) 두 샘플이 정규 분포를 따르지만 등분산성을 가정하지 않을 때

from scipy import stats
sample_data1 = [1.1, 2.3, 2.1, 3.3, 4.4]
sample_data2 = [2.1, 2.4, 3.1, 3.5, 3.9]
t_statistic, p_value = stats.ttest_ind(sample_data1, sample_data2, equal_var=False)
print(t_statistic, p_value)

 

- Paired t-test (대응 표본 t-검정)

두 대응 표본의 평균이 같은지 검정 / (가정) 두 샘플이 정규 분포를 따를 때

from scipy import stats
sample_data1 = [1.1, 2.3, 2.1, 3.3, 4.4]
sample_data2 = [1.5, 2.8, 2.5, 3.7, 4.1]
t_statistic, p_value = stats.ttest_rel(sample_data1, sample_data2)
print(t_statistic, p_value)

 

- Mann-Whitney U Test (맨-휘트니 U 검정)

두 독립 표본의 순위가 같은지 검정 / (가정) 비모수 검정 방법, 정규성 가정하지 않을 때

from scipy import stats
sample_data1 = [1.1, 2.3, 2.1, 3.3, 4.4]
sample_data2 = [2.1, 2.4, 3.1, 3.5, 3.9]
u_statistic, p_value = stats.mannwhitneyu(sample_data1, sample_data2)
print(u_statistic, p_value)

 

- Wilcoxon Signed-Rank Test (윌콕슨 부호 순위 검정)

두 대응 표본의 중앙값이 같은지 검정 / (가정) 비모수 검정 방법, 정규성 가정하지 않을 때

from scipy import stats
sample_data1 = [1.1, 2.3, 2.1, 3.3, 4.4]
sample_data2 = [1.5, 2.8, 2.5, 3.7, 4.1]
w_statistic, p_value = stats.wilcoxon(sample_data1, sample_data2)
print(w_statistic, p_value)

 

- 범주형 데이터

 

- Chi-Square Test (카이제곱 검정)

두 범주형 변수 간의 독립성을 검정 / (가정) 각 셀이 충분히 큰 빈도를 가질 때

from scipy import stats
observed = [[10, 20], [30, 40]]
chi2_statistic, p_value, dof, expected = stats.chi2_contingency(observed)
print(chi2_statistic, p_value)

 

- Fisher’s Exact Test (피셔의 정확 검정)

두 범주형 변수 간의 독립성을 검정 / (가정) 작은 표본에도 적합

from scipy import stats
observed = [[10, 20], [30, 40]]
odds_ratio, p_value = stats.fisher_exact(observed)
print(odds_ratio, p_value)

 

- McNemar’s Test (맥네마 검정)

두 대응 범주형 변수 간의 변화가 대칭적인지 검정 / (가정) 대칭성을 검정

from statsmodels.stats.contingency_tables import mcnemar
table = [[10, 20], [30, 40]]
result = mcnemar(table)
print(result.statistic, result.pvalue)

 


- 3개 이상 샘플에 대한 검정 방법

- 연속형 데이터

 

- ANOVA (분산 분석)

세 개 이상의 독립 표본 평균이 같은지 검정 / (가정) 정규성 및 등분산성일 때

from scipy import stats
sample_data1 = [1.1, 2.3, 2.1, 3.3, 4.4]
sample_data2 = [2.1, 2.4, 3.1, 3.5, 3.9]
sample_data3 = [3.2, 3.5, 3.8, 4.0, 4.3]
f_statistic, p_value = stats.f_oneway(sample_data1, sample_data2, sample_data3)
print(f_statistic, p_value)

 

- Repeated Measures ANOVA (반복 측정 분산 분석)

동일한 대상에 대해 여러 번 측정한 데이터의 평균 차이 검정 / (가정) 정규성 및 등분산성일 때

import pandas as pd
import pingouin as pg

df = pd.DataFrame({'subject': ['A', 'B', 'C', 'D'],
                   'time1': [1.1, 2.3, 2.1, 3.3],
                   'time2': [2.1, 2.4, 3.1, 3.5],
                   'time3': [3.2, 3.5, 3.8, 4.0]})
rm_anova = pg.rm_anova(dv='time', within='time', subject='subject', data=df)
print(rm_anova)

 

- MANOVA (다변량 분산 분석)

다수의 종속 변수에 대한 그룹 간 차이를 검정 / (가정) 정규성 및 등분산성일 때

from statsmodels.multivariate.manova import MANOVA

df = pd.DataFrame({'group': ['A', 'A', 'B', 'B'],
                   'var1': [1.1, 2.3, 2.1, 3.3],
                   'var2': [2.1, 2.4, 3.1, 3.5]})
maov = MANOVA.from_formula('var1 + var2 ~ group', data=df)
print(maov.mv_test())

 

- Kruskal-Wallis Test (크루스칼-월리스 검정)

세 개 이상의 독립 표본의 순위가 같은지 검정 / (가정) 비모수 검정 방법, 정규성 가정하지 않을 때

from scipy import stats
sample_data1 = [1.1, 2.3, 2.1, 3.3, 4.4]
sample_data2 = [2.1, 2.4, 3.1, 3.5, 3.9]
sample_data3 = [3.2, 3.5, 3.8, 4.0, 4.3]
h_statistic, p_value = stats.kruskal(sample_data1, sample_data2, sample_data3)
print(h_statistic, p_value)

 

- Friedman Test (프리드만 검정)

동일한 대상에 대해 여러 번 측정한 데이터의 순위가 같은지 검정 / (가정) 비모수 검정 방법, 정규성 가정하지 않을 때

from scipy import stats
sample_data1 = [1.1, 2.3, 2.1, 3.3, 4.4]
sample_data2 = [2.1, 2.4, 3.1, 3.5, 3.9]
sample_data3 = [3.2, 3.5, 3.8, 4.0, 4.3]
f_statistic, p_value = stats.friedmanchisquare(sample_data1, sample_data2, sample_data3)
print(f_statistic, p_value)

 

- 범주형 데이터

 

- Chi-Square Test (카이제곱 검정)

세 개 이상의 범주형 변수 간의 독립성을 검정 / (가정) 각 셀이 충분히 큰 빈도를 가질 때

from scipy import stats
observed = [[10, 20, 30], [30, 40, 50], [20, 10, 40]]
chi2_statistic, p_value, dof, expected = stats.chi2_contingency(observed)
print(chi2_statistic, p_value)

 

- Cochran’s Q Test (코크란의 Q 검정)

세 개 이상의 관련 이항 변수가 서로 다른지 검정 / (가정) 비모수 검정 방법, 정규성 가정하지 않을 때

from statsmodels.stats.contingency_tables import cochrans_q

data = [[1, 0, 1], [1, 1, 0], [0, 1, 1], [1, 1, 1]]
result = cochrans_q(data)
print(result)

 

통계적 검정 방법은 데이터의 유형(연속형, 범주형)과 샘플의 수(1개, 2개, 3개 이상)에 따라 다양하게 선택됩니다.

검정 방법은 특정 가정과 상황에 맞추어 사용되며, 이를 통해 데이터의 특성과 연구 질문에 맞는 검정 방법을 선택할 수 있습니다.

 


- 이산형 데이터에 대한 검증 방법

 

- 포아송 분포에 대한 검정 방법

일정한 시간 또는 공간에서 어떤 사건이 발생하는 횟수를 모델링합니다. 사건은 독립적으로 발생하며, 특정한 시간 또는 공간 내에서 사건 발생률이 일정하다는 가정

 

- 포아송 적합도 검정 (Poisson Goodness-of-Fit Test)

데이터가 포아송 분포를 따르는지 검정 / (가정) 데이터가 포아송 분포를 따를 것으로 예상

import numpy as np
from scipy import stats

# 예시 데이터 (포아송 분포를 따른다고 가정)
data = np.random.poisson(lam=3, size=100)

# 관측 빈도 계산
observed_freq = np.bincount(data)
expected_freq = len(data) * stats.poisson.pmf(np.arange(len(observed_freq)), mu=np.mean(data))

# 카이제곱 적합도 검정
chi2_statistic, p_value = stats.chisquare(f_obs=observed_freq, f_exp=expected_freq)
print(chi2_statistic, p_value)

 

- 이항 분포에 대한 검정 방법

이항 분포는 성공과 실패 두 가지 결과만 가능한 실험을 n번 반복했을 때, 성공이 k번 발생할 확률

 

- 이항 적합도 검정 (Binomial Goodness-of-Fit Test)

데이터가 이항 분포를 따르는지 검정 / (가정) 데이터가 이항 분포를 따를 것으로 예상

import numpy as np
from scipy import stats

# 예시 데이터 (이항 분포를 따른다고 가정)
n = 10  # 시도 횟수
p = 0.5  # 성공 확률
data = np.random.binomial(n, p, size=100)

# 관측 빈도 계산
observed_freq = np.bincount(data)
expected_freq = len(data) * stats.binom.pmf(np.arange(len(observed_freq)), n, p)

# 카이제곱 적합도 검정
chi2_statistic, p_value = stats.chisquare(f_obs=observed_freq, f_exp=expected_freq)
print(chi2_statistic, p_value)

 

- 회귀 분석

 

- 포아송 회귀 분석 (Poisson Regression)

종속 변수가 포아송 분포를 따를 때 독립 변수와의 관계를 모델링 / (가정) 종속 변수가 포아송 분포를 따를 때

import pandas as pd
import statsmodels.api as sm
import statsmodels.formula.api as smf

# 예시 데이터
data = {'count': [2, 3, 4, 2, 5, 1, 2, 4],
        'hours': [1, 2, 3, 1, 4, 1, 1, 2]}
df = pd.DataFrame(data)

# 포아송 회귀 분석
model = smf.poisson('count ~ hours', data=df).fit()
print(model.summary())

 

- 이항 회귀 분석 (Binomial Regression)

종속 변수가 이항 분포를 따를 때 독립 변수와의 관계를 모델링 / (가정) 종속 변수가 이항 분포를 따를 때

import pandas as pd
import statsmodels.api as sm
import statsmodels.formula.api as smf

# 예시 데이터
data = {'success': [0, 1, 1, 0, 1, 0, 1, 1],
        'trials': [1, 1, 1, 1, 1, 1, 1, 1],
        'hours': [1, 2, 3, 1, 4, 1, 1, 2]}
df = pd.DataFrame(data)

# 이항 회귀 분석
model = smf.logit('success ~ hours', data=df).fit()
print(model.summary())

 

7. 상관 분석

 

두 변수 간의 관계를 분석하는 통계 기법.  변수들 간의 연관성을 파악하고, 한 변수가 다른 변수에 대해 어떻게 변화하는지 이해할 수 있습니다.

 

- 상관 계수의 해석

값의 범위: 상관 계수는 -1에서 1 사이의 값을 가진다.

1: 완전한 양의 선형 관계

0: 선형 관계없음

-1: 완전한 음의 선형 관계

 

- Pearson 상관 계수 (Pearson Correlation Coefficient)

두 연속형 변수 간의 선형 관계를 측정하는 방법, 선형 관계의 강도와 방향을 측정

(가정) 두 변수는 모두 연속형 변수, 두 변수는 정규 분포를 따라야 한다, 두 변수 간의 관계는 선형이어야 한다.

import numpy as np
from scipy.stats import pearsonr

# 예시 데이터
x = np.array([1, 2, 3, 4, 5])
y = np.array([2, 4, 6, 8, 10])

# Pearson 상관 계수 계산
correlation, p_value = pearsonr(x, y)
print(f"Pearson 상관 계수: {correlation}, p-value: {p_value}")

 

- pearman의 순위 상관 계수 (Spearman's Rank Correlation Coefficient)

두 변수의 순위 간의 관계를 측정하는 방법 / 데이터가 연속적이지 않거나, 순위 데이터일 때 사용

두 변수 간의 단조(monotonic) 관계의 강도와 방향을 측정

(가정) 데이터가 연속형이 아니어도 됨, 두 변수 간의 관계가 선형일 필요는 없으며, 단조 관계를 가진다.

import numpy as np
from scipy.stats import spearmanr

# 예시 데이터
x = np.array([1, 2, 3, 4, 5])
y = np.array([5, 6, 7, 8, 7])

# Spearman 상관 계수 계산
correlation, p_value = spearmanr(x, y)
print(f"Spearman 상관 계수: {correlation}, p-value: {p_value}")

 

- Kendall의 타우 계수 (Kendall's Tau Coefficient)

두 변수 간의 순위 일치 정도를 측정하는 방법

두 변수 간의 순위 일치의 강도와 방향을 측정

(가정) 데이터가 연속형이 아니어도 된다, 변수 간의 관계가 선형일 필요는 없으며, 단조 관계를 가진다.

import numpy as np
from scipy.stats import kendalltau

# 예시 데이터
x = np.array([1, 2, 3, 4, 5])
y = np.array([2, 3, 4, 5, 6])

# Kendall의 타우 계수 계산
correlation, p_value = kendalltau(x, y)
print(f"Kendall의 타우 계수: {correlation}, p-value: {p_value}")

 

8. 매칭된 쌍 비교

 

- 대응 표본 (Paired Sample)

같은 대상이나 서로 밀접하게 관련된 두 개의 데이터 집합을 비교하는 데 사용됩니다. 각각의 데이터 쌍은 같은 대상에서 나온 것으로, 같은 대상에서 두 번 측정하거나, 밀접하게 관련된 두 그룹을 비교할 때 사용

ex. 약물 투여 전후, 쌍둥이 형제의 키 비교, 두 손의 힘 비교

 

- Paired t-test (대응 표본 t-검정)

두 대응 표본(같은 대상에 대해 두 번 측정한 데이터)의 평균이 같은지 검정 / (가정) 데이터가 정규 분포를 따를 때

ex. 약물 투여 전후의 혈압 변화, 교육 프로그램 시행 전후의 시험 점수 변화.

from scipy import stats

# 예시 데이터 (약물 투여 전후 혈압 변화)
before = [120, 130, 115, 140, 135]
after = [110, 125, 120, 130, 128]

# Paired t-test
t_statistic, p_value = stats.ttest_rel(before, after)
print(f"t-statistic: {t_statistic}, p-value: {p_value}")

 

- Wilcoxon Signed-Rank Test (윌콕슨 부호 순위 검정)

두 대응 표본의 중앙값이 같은지 검정 비모수 검정 방법으로, 데이터가 정규 분포를 따르지 않는 경우에 사용 /  (가정)데이터가 정규 분포를 따르지 않을 때

ex. 새로운 치료법 적용 전후의 환자 상태 변화, 동일한 집단에서 두 가지 조건 하의 작업 수행 시간 비교

from scipy import stats

# 예시 데이터 (교육 프로그램 시행 전후 시험 점수 변화)
before = [85, 88, 75, 90, 95]
after = [90, 85, 80, 88, 100]

# Wilcoxon Signed-Rank Test
w_statistic, p_value = stats.wilcoxon(before, after)
print(f"Wilcoxon statistic: {w_statistic}, p-value: {p_value}")

 

9. 회귀 분석

 

변수들 간의 관계를 모델링하고, 독립 변수가 종속 변수에 미치는 영향을 분석하는 통계 기법, 주로 단순 회귀 분석, 다중 회귀 분석, 로지스틱 회귀 분석이 있다.

 

- 단순 회귀 분석 (Simple Linear Regression)

하나의 독립 변수와 하나의 종속 변수 간의 관계를 분석하는 방법 / 두 변수 간의 선형 관계를 모델링

독립 변수를 사용하여 종속 변수를 예측하거나 설명

(가정) 독립 변수와 종속 변수 간의 선형 관계, 독립 변수의 값이 고정, 오차의 분포가 정규 분포를 따름, 등분산성

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression

# 예시 데이터
X = np.array([[1], [2], [3], [4], [5]])
y = np.array([2, 3, 5, 7, 11])

# 단순 회귀 분석 모델
model = LinearRegression()
model.fit(X, y)

# 예측
y_pred = model.predict(X)

# 시각화
plt.scatter(X, y, color='blue')
plt.plot(X, y_pred, color='red')
plt.xlabel('독립 변수 (X)')
plt.ylabel('종속 변수 (y)')
plt.title('단순 회귀 분석')
plt.show()

 

- 다중 회귀 분석 (Multiple Linear Regression)

두 개 이상의 독립 변수와 하나의 종속 변수 간의 관계를 분석하는 방법 / 여러 독립 변수를 사용하여 종속 변수를 예측하거나 설명

(가정) 독립 변수와 종속 변수 간의 선형 관계, 독립 변수의 값이 고정, 오차의 분포가 정규 분포를 따름, 등분산성, 립 변수들 간에 다중 공선성이 없음.

import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression

# 예시 데이터
data = {
    'X1': [1, 2, 3, 4, 5],
    'X2': [2, 4, 6, 8, 10],
    'y': [2, 3, 5, 7, 11]
}
df = pd.DataFrame(data)

# 독립 변수와 종속 변수 분리
X = df[['X1', 'X2']]
y = df['y']

# 다중 회귀 분석 모델
model = LinearRegression()
model.fit(X, y)

# 예측
y_pred = model.predict(X)

# 결과 출력
print(f"회귀 계수: {model.coef_}")
print(f"절편: {model.intercept_}")
print(f"예측값: {y_pred}")

 

- 로지스틱 회귀 분석 (Logistic Regression)

종속 변수가 범주형인 경우, 주로 이항(종속 변수가 0 또는 1과 같은 두 개의 범주로 나뉘는 경우)에 사용

독립 변수를 사용하여 종속 변수가 특정 범주에 속할 확률을 예측

(가정) 독립 변수와 종속 변수 간의 선형 관계, 오차의 분포가 로지스틱 분포를 따름, 독립 변수들 간에 다중 공선성이 없음

import numpy as np
from sklearn.linear_model import LogisticRegression

# 예시 데이터
X = np.array([[1, 2], [2, 3], [3, 4], [4, 5], [5, 6]])
y = np.array([0, 0, 1, 1, 1])

# 로지스틱 회귀 분석 모델
model = LogisticRegression()
model.fit(X, y)

# 예측
y_pred = model.predict(X)
y_pred_prob = model.predict_proba(X)

# 결과 출력
print(f"예측값: {y_pred}")
print(f"예측 확률: {y_pred_prob}")

 

10. 다변량 분석

 

여러 변수를 동시에 고려하여 분석하는 방법, 변수들 간의 관계를 이해하고 설명하는 데 사용됩니다.

여러 변수들 간의 상호작용과 그 영향을 고려합니다.

 

- MANOVA (다변량 분산 분석)

MANOVA는 여러 종속 변수가 있을 때, 그룹 간의 차이를 검정하는 방법 / ANOVA의 확장

여러 종속 변수들에 대한 그룹 간의 평균 차이를 동시에 검정

(가정) 종속 변수들이 다변량 정규 분포를 따름 / 각 그룹의 공분산 행렬이 동일

import pandas as pd
from statsmodels.multivariate.manova import MANOVA

# 예시 데이터
df = pd.DataFrame({
    'group': ['A', 'A', 'A', 'B', 'B', 'B'],
    'var1': [2.5, 3.6, 2.9, 3.2, 3.7, 3.4],
    'var2': [3.0, 3.1, 2.8, 3.3, 3.5, 3.1]
})

# MANOVA
maov = MANOVA.from_formula('var1 + var2 ~ group', data=df)
print(maov.mv_test())

 

- MANCOVA (공변량을 포함한 다변량 분산 분석)

MANCOVA는 MANOVA의 확장으로, 하나 이상의 공변량(covariate)을 포함하여 분석하는 방법

공변량의 효과를 통제하면서 여러 종속 변수들에 대한 그룹 간의 차이를 검정

(가정) 종속 변수들이 다변량 정규 분포를 따름 / 각 그룹의 공분산 행렬이 동일 / 공변량과 종속 변수들 간의 관계가 선형

import pandas as pd
import statsmodels.api as sm
from statsmodels.formula.api import ols

# 예시 데이터
df = pd.DataFrame({
    'group': ['A', 'A', 'A', 'B', 'B', 'B'],
    'covariate': [1.1, 2.3, 1.9, 2.7, 3.1, 2.8],
    'var1': [2.5, 3.6, 2.9, 3.2, 3.7, 3.4],
    'var2': [3.0, 3.1, 2.8, 3.3, 3.5, 3.1]
})

# MANCOVA
model = ols('var1 + var2 ~ group + covariate', data=df).fit()
manova = sm.stats.multicomp.MultiComparison(model.resid, df['group'])
print(manova.tukeyhsd().summary())

 

- 주성분 분석 (PCA, Principal Component Analysis)

PCA는 데이터의 차원을 축소하면서, 원래 데이터의 분산을 최대한 보존하는 새로운 축을 찾는 방법

고차원 데이터를 저 차원 공간으로 변환하여 주요 패턴을 찾고 시각화하거나, 데이터 압축을 통해 분석을 용이하게 합니다.

(가정)  데이터가 선형적인 구조를 가지고 있음.

import numpy as np
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt

# 예시 데이터
data = np.array([
    [2.5, 3.0],
    [3.6, 3.1],
    [2.9, 2.8],
    [3.2, 3.3],
    [3.7, 3.5],
    [3.4, 3.1]
])

# PCA
pca = PCA(n_components=2)
principal_components = pca.fit_transform(data)

# 시각화
plt.scatter(principal_components[:, 0], principal_components[:, 1])
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.title('PCA')
plt.show()

 

- 판별 분석 (Discriminant Analysis)

판별 분석은 여러 독립 변수를 사용하여 관측값이 어떤 그룹에 속하는지 분류하는 방법 / 주로 선형 판별 분석(LDA)과 이차 판별 분석(QDA)이 있다.

그룹 간의 차이를 최대화하고, 새로운 데이터가 어떤 그룹에 속할지 예측

종속 변수의 각 그룹이 다변량 정규 분포를 따름 / LDA의 경우, 그룹 간의 공분산 행렬이 동일

import numpy as np
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis

# 예시 데이터
X = np.array([
    [2.5, 3.0],
    [3.6, 3.1],
    [2.9, 2.8],
    [3.2, 3.3],
    [3.7, 3.5],
    [3.4, 3.1]
])
y = np.array([0, 1, 0, 1, 1, 0])  # 그룹 라벨

# LDA
lda = LinearDiscriminantAnalysis()
lda.fit(X, y)
X_new = np.array([[3.0, 3.2]])
print(f"Predicted group: {lda.predict(X_new)}")

 


가공된 데이터를 받아 상관 분석까지 마치는 과정 

 

- 데이터 수집 및 이해

데이터 수집: 데이터를 불러오고 구조를 이해합니다.

데이터 이해: 변수의 의미와 데이터의 분포를 파악합니다.

import pandas as pd

# 데이터 불러오기
data = pd.read_csv('data.csv')

# 데이터 구조 파악
print(data.head())
print(data.info())
print(data.describe())

 

-데이터 전처리

결측치 처리: 결측값을 처리합니다(제거하거나 대체).

이상치 처리: 이상치를 식별하고 처리합니다.

데이터 변환: 필요에 따라 데이터 변환(예: 로그 변환, 정규화 등)을 수행합니다.

범주형 변수 처리: 범주형 변수를 더미 변수로 변환합니다.

# 결측치 처리
data = data.dropna()  # 결측치 제거 예시

# 이상치 처리
# 예: IQR을 사용한 이상치 제거
Q1 = data.quantile(0.25)
Q3 = data.quantile(0.75)
IQR = Q3 - Q1
data = data[~((data < (Q1 - 1.5 * IQR)) |(data > (Q3 + 1.5 * IQR))).any(axis=1)]

# 범주형 변수 처리
data = pd.get_dummies(data, drop_first=True)

 

- 데이터 탐색 및 시각화

기초 통계량 확인: 변수들의 기초 통계량을 확인합니다.

시각화: 변수 간의 관계를 시각화합니다(예: 히스토그램, 박스 플롯, 산점도).

import seaborn as sns
import matplotlib.pyplot as plt

# 히스토그램
data.hist(bins=30, figsize=(20, 15))
plt.show()

# 산점도 행렬
sns.pairplot(data)
plt.show()

 

- 정규성 검정

정규성 검정: 변수들이 정규 분포를 따르는지 검정합니다.

from scipy import stats

# 정규성 검정 예시 (Shapiro-Wilk test)
for column in data.columns:
    stat, p = stats.shapiro(data[column])
    print(f'{column}: W-statistic={stat}, p-value={p}')

 

 - 상관 분석

Pearson 상관 분석: 연속형 변수 간의 선형 상관관계를 분석합니다.

Spearman 상관 분석: 순위 데이터나 비선형 관계의 상관성을 분석합니다.

# Pearson 상관 분석
pearson_corr = data.corr(method='pearson')
print(pearson_corr)

# Spearman 상관 분석
spearman_corr = data.corr(method='spearman')
print(spearman_corr)

# 상관 행렬 시각화
plt.figure(figsize=(12, 8))
sns.heatmap(pearson_corr, annot=True, cmap='coolwarm')
plt.title('Pearson Correlation Matrix')
plt.show()

 

- 매칭된 쌍 비교

Paired t-test

Wilcoxon Signed-Rank Test

 

- 회귀 분석

단순 회귀 분석

다중 회귀 분석

로지스틱 회귀 분석

 

- 다변량 분석

MANOVA (다변량 분산 분석)

MANCOVA (공변량을 포함한 다변량 분산 분석)

주성분 분석 (PCA)

판별 분석 (Discriminant Analysis)

 

 

이 과정을 통해 가공된 데이터를 받아 변수를 분석할 수 있습니다.

다음엔 "Kaggle" 데이터로 직접 검정해보는 과정으로 돌아오겠습니다!!

728x90
반응형

관련글 더보기