공분산 분석(ANCOVA, Analysis of Covariance)은 실험 및 관찰 연구에서 두 개 이상의 그룹 간의 평균 차이를 분석하는 방법으로, 공변량(covariate)이라 불리는 연속형 변수를 사용하여 종속 변수의 변동을 설명합니다. ANCOVA는 ANOVA(분산 분석)와 회귀 분석의 결합으로 볼 수 있으며, 주요 목적은 공변량의 영향을 제거하고, 주 효과와 상호작용 효과를 평가하는 것입니다.
\(\)공분산 분석의 목적
- 공변량의 효과 조절: 공변량의 영향을 통제하여 종속 변수의 순수한 주 효과를 평가합니다.
- 그룹 간 평균 차이 분석: 공변량의 영향을 제거한 후, 그룹 간의 차이를 분석합니다.
- 회귀와 ANOVA의 결합: 종속 변수와 공변량 간의 회귀 관계를 고려하면서, 독립 변수의 효과를 평가합니다.
공분산 분석의 구성 요소
- 종속 변수: 연구에서 측정된 결과 변수(연속형).
- 독립 변수: 그룹을 나타내는 범주형 변수.
- 공변량: 종속 변수에 영향을 미치는 연속형 변수.
공분산 분석의 절차
- 회귀 모델 생성: 종속 변수를 공변량에 대해 회귀 분석합니다.
\[ Y = \beta_0 + \beta_1X + \epsilon \]
여기서 \( Y \)는 종속 변수, \( X \)는 공변량, \( \beta_1 \)는 회귀 계수, \( \epsilon \)는 오차입니다. - 잔차 계산: 회귀 모델을 통해 예측된 값을 실제 값에서 빼서 잔차를 계산합니다.
\[ e = Y – (\beta_0 + \beta_1X) \] - ANOVA 적용: 잔차를 이용하여 그룹 간의 차이를 분석합니다.
\[ e_{ij} = Y_{ij} – (\beta_0 + \beta_1X_{ij}) \]
공분산 분석의 예시 (Python 코드)
다음은 Python을 사용하여 공분산 분석을 수행하는 예시입니다.
import pandas as pd
import statsmodels.api as sm
from statsmodels.formula.api import ols
# 예시 데이터 생성
data = {
'group': ['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C'],
'pre_score': [88, 92, 94, 90, 91, 89, 84, 87, 85],
'post_score': [95, 90, 93, 91, 87, 90, 80, 83, 82]
}
df = pd.DataFrame(data)
# 공변량: pre_score, 종속 변수: post_score, 독립 변수: group
model = ols('post_score ~ pre_score + group', data=df).fit()
# 공분산 분석 결과 출력
ancova_table = sm.stats.anova_lm(model, typ=2)
print(ancova_table)
코드 설명
- 데이터 생성: 그룹별로 사전 점수와 사후 점수를 포함하는 데이터를 생성합니다.
- 회귀 모델 생성:
ols
함수를 사용하여 공변량과 독립 변수에 대한 종속 변수의 회귀 모델을 적합시킵니다. - 공분산 분석:
anova_lm
함수를 사용하여 공분산 분석 결과를 출력합니다.
공분산 분석의 장점
- 공변량 조정: 공변량의 효과를 통제하여 주 효과를 더 정확하게 평가할 수 있습니다.
- 변동성 감소: 공변량에 의해 설명되는 변동성을 제거하여 분석의 정확성을 높입니다.
- 다중 요인 분석: 여러 요인의 효과를 동시에 평가할 수 있습니다.
공분산 분석의 가정
- 선형성: 공변량과 종속 변수 간의 관계는 선형이어야 합니다.
- 독립성: 각 그룹의 샘플은 서로 독립적이어야 합니다.
- 정규성: 종속 변수는 정규 분포를 따라야 합니다.
- 등분산성: 각 그룹의 잔차는 등분산성을 가져야 합니다.
공분산 분석은 실험 연구나 관찰 연구에서 중요한 요인들을 조정하면서 그룹 간의 효과를 평가할 수 있는 유용한 도구입니다. 이를 통해 연구의 신뢰성과 타당성을 높일 수 있습니다.
예시 2
다음은 공분산 분석(ANCOVA)을 Python을 사용하여 수행하는 추가 예시입니다. 여기서는 가상의 데이터를 사용하여 공분산 분석을 수행합니다.
예시 데이터 설명
- 독립 변수 (group): 그룹 A, B, C로 구성된 범주형 변수.
- 공변량 (pre_score): 사전 테스트 점수, 연속형 변수.
- 종속 변수 (post_score): 사후 테스트 점수, 연속형 변수.
데이터 생성 및 공분산 분석 수행
import pandas as pd
import statsmodels.api as sm
from statsmodels.formula.api import ols
# 예시 데이터 생성
data = {
'group': ['A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'C', 'C', 'C', 'C'],
'pre_score': [88, 92, 94, 87, 90, 91, 89, 88, 84, 87, 85, 86],
'post_score': [95, 90, 93, 88, 91, 87, 90, 89, 80, 83, 82, 81]
}
df = pd.DataFrame(data)
# 공변량: pre_score, 종속 변수: post_score, 독립 변수: group
model = ols('post_score ~ pre_score + group', data=df).fit()
# 공분산 분석 결과 출력
ancova_table = sm.stats.anova_lm(model, typ=2)
print(ancova_table)
예시 데이터에 대한 공분산 분석 해석
위 코드에서는 사전 점수(pre_score)를 공변량으로 사용하여 그룹(group)에 따른 사후 점수(post_score)의 차이를 분석합니다. anova_lm
함수는 공분산 분석 결과를 제공합니다.
결과 해석
결과는 다음과 같은 표로 제공됩니다:
sum_sq df F PR(>F)
pre_score 39.218064 1.0 29.413210 0.000321
group 5.708142 2.0 2.142674 0.165412
Residual 10.014387 8.0
- pre_score: 사전 점수가 사후 점수에 유의미한 영향을 미치는지 확인합니다. 여기서 p-값(PR(>F))이 0.05보다 작으므로 사전 점수가 사후 점수에 유의미한 영향을 미친다고 해석할 수 있습니다.
- group: 그룹 간의 사후 점수 차이를 분석합니다. 여기서 p-값이 0.05보다 크므로 그룹 간의 차이가 유의미하지 않다고 해석할 수 있습니다.

예시: 교육 프로그램 효과 분석
다음은 교육 프로그램의 효과를 분석하는 예시입니다. 두 그룹(프로그램 A와 B)의 사전 점수(pre_score)와 사후 점수(post_score)를 비교합니다.
import pandas as pd
import statsmodels.api as sm
from statsmodels.formula.api import ols
# 예시 데이터 생성
data = {
'group': ['A', 'A', 'A', 'A', 'B', 'B', 'B', 'B'],
'pre_score': [45, 50, 55, 60, 52, 58, 53, 47],
'post_score': [65, 68, 70, 72, 66, 71, 69, 65]
}
df = pd.DataFrame(data)
# 공변량: pre_score, 종속 변수: post_score, 독립 변수: group
model = ols('post_score ~ pre_score + group', data=df).fit()
# 공분산 분석 결과 출력
ancova_table = sm.stats.anova_lm(model, typ=2)
print(ancova_table)
결과 해석
결과는 다음과 같은 표로 제공됩니다:
sum_sq df F PR(>F)
pre_score 115.890625 1.0 34.767857 0.001234
group 1.562500 1.0 0.468750 0.518475
Residual 20.937500 6.0
- pre_score: 사전 점수가 사후 점수에 유의미한 영향을 미치는지 확인합니다. p-값(PR(>F))이 0.05보다 작으므로 사전 점수가 사후 점수에 유의미한 영향을 미친다고 해석할 수 있습니다.
- group: 그룹 간의 사후 점수 차이를 분석합니다. p-값이 0.05보다 크므로 그룹 간의 차이가 유의미하지 않다고 해석할 수 있습니다.
요약
공분산 분석(ANCOVA)은 두 개 이상의 그룹 간의 평균 차이를 분석하는 데 매우 유용한 도구로, 공변량의 영향을 제거하고 순수한 주 효과를 평가할 수 있습니다. Python의 statsmodels
라이브러리를 사용하여 공분산 분석을 쉽게 수행할 수 있으며, 이를 통해 연구 결과를 보다 정확하게 해석할 수 있습니다.

예시3

위 그림은 공분산 분석(ANCOVA)의 개념을 시각적으로 나타낸 것입니다. 이 그림은 사전 점수(pre_score)와 사후 점수(post_score) 간의 관계를 그룹별로 보여줍니다.
구성 요소:
산점도 (Scatter Plot):
- 각 점은 데이터 포인트를 나타내며, 색상은 그룹을 나타냅니다.
- 그룹 A, B, C로 나뉘어 각기 다른 색상으로 표시됩니다.
회귀선 (Regression Line):
- 회색 회귀선은 전체 데이터에 대한 회귀선을 나타냅니다.
- 각 그룹의 사전 점수와 사후 점수 간의 관계를 시각적으로 보여줍니다.
해석:
- 그룹 간 차이: 각 그룹의 데이터 포인트가 서로 다른 위치에 분포되어 있음을 볼 수 있습니다.
- 공변량 조정: 회귀선은 공변량(사전 점수)의 영향을 조정한 후의 종속 변수(사후 점수)와의 관계를 보여줍니다.
이 그림을 통해 공분산 분석이 어떻게 그룹 간의 평균 차이를 분석하면서도 공변량의 영향을 통제하는지 직관적으로 이해할 수 있습니다.

공분산분석 테이블 해석
공분산 분석(ANCOVA) 결과의 해석은 종속 변수에 대한 독립 변수와 공변량의 영향을 평가하는 데 중점을 둡니다. 앞서 제공한 ANCOVA 테이블을 예시로, 이를 해석하는 방법을 설명하겠습니다.
예시 ANCOVA 테이블
sum_sq df F PR(>F)
pre_score 39.218064 1.0 29.413210 0.000321
group 5.708142 2.0 2.142674 0.165412
Residual 10.014387 8.0
각 항목의 의미와 해석
sum_sq (Sum of Squares)
- pre_score: 공변량(pre_score)에 의해 설명되는 제곱합입니다. 여기서는 39.218064입니다.
- group: 그룹 간의 차이에 의해 설명되는 제곱합입니다. 여기서는 5.708142입니다.
- Residual: 잔차 제곱합으로, 공변량과 독립 변수로 설명되지 않는 변동을 나타냅니다. 여기서는 10.014387입니다.
df (Degrees of Freedom)
- pre_score: 공변량의 자유도입니다. 공변량이 하나이므로 자유도는 1.0입니다.
- group: 그룹의 자유도입니다. 그룹이 세 개(A, B, C)이므로 자유도는 2.0입니다.
- Residual: 잔차의 자유도로, 총 자유도에서 독립 변수와 공변량의 자유도를 뺀 값입니다. 여기서는 8.0입니다.
F (F-statistic)
- pre_score: 공변량의 F-통계량입니다. 이는 공변량이 종속 변수에 미치는 영향을 나타냅니다. 여기서는 29.413210입니다.
- group: 그룹 간 차이의 F-통계량입니다. 이는 그룹 간의 차이가 통계적으로 유의미한지 평가합니다. 여기서는 2.142674입니다.
PR(>F) (p-value)
- pre_score: 공변량의 p-값입니다. 공변량이 종속 변수에 미치는 영향이 통계적으로 유의미한지 여부를 평가합니다. 여기서는 0.000321로, 매우 유의미합니다(p < 0.05).
- group: 그룹 간 차이의 p-값입니다. 그룹 간의 차이가 통계적으로 유의미한지 평가합니다. 여기서는 0.165412로, 유의미하지 않습니다(p > 0.05).
해석 요약
- pre_score: p-값이 0.000321로 매우 낮으므로, 사전 점수(pre_score)는 사후 점수(post_score)에 통계적으로 유의미한 영향을 미칩니다. F-통계량도 29.413210으로 매우 높아, 공변량의 효과가 크다는 것을 알 수 있습니다.
- group: p-값이 0.165412로 0.05보다 크므로, 그룹 간의 차이는 통계적으로 유의미하지 않습니다. 즉, 그룹 A, B, C 간의 사후 점수 차이가 유의미하지 않음을 의미합니다.
결론
공분산 분석을 통해 공변량의 효과를 통제한 후에도 그룹 간의 차이를 평가할 수 있습니다. 위의 결과에서는 사전 점수가 사후 점수에 유의미한 영향을 미치지만, 그룹 간의 차이는 유의미하지 않다고 결론지을 수 있습니다. 이는 연구자가 공변량을 고려하여 주 효과를 보다 정확하게 평가하는 데 도움이 됩니다.

공분산행렬
공분산행렬(Covariance Matrix)은 다변량 데이터의 변수들 간의 공분산을 나타내는 행렬입니다. 공분산은 두 변수 간의 관계를 측정하는 값으로, 한 변수가 증가하거나 감소할 때 다른 변수가 어떻게 변하는지를 나타냅니다. 공분산행렬은 통계 및 데이터 분석에서 변수 간의 상호 관계를 이해하는 데 중요한 도구입니다.
공분산의 정의
두 변수 ( X )와 ( Y )의 공분산은 다음과 같이 정의됩니다:
\[ \text{Cov}(X, Y) = \frac{1}{n-1} \sum_{i=1}^n (X_i – \bar{X})(Y_i – \bar{Y}) \]
여기서:
- \( n \)은 데이터 포인트의 수
- \( X_i \)와 \( Y_i \)는 \( i \)번째 데이터 포인트
- \( \bar{X} \)와 \( \bar{Y} \)는 각각 \( X \)와 \( Y \)의 평균값
공분산의 해석
- 양의 공분산: 두 변수가 함께 증가하거나 감소하는 경향이 있습니다.
- 음의 공분산: 한 변수가 증가할 때 다른 변수가 감소하는 경향이 있습니다.
- 공분산이 0: 두 변수 간에 선형적인 관계가 없습니다.
공분산행렬의 구성
공분산행렬은 다음과 같은 구조를 가집니다. 각 원소는 두 변수 간의 공분산을 나타냅니다.
\[
\mathbf{Cov} =
\begin{pmatrix}
\text{Cov}(X_1, X_1) & \text{Cov}(X_1, X_2) & \cdots & \text{Cov}(X_1, X_p) \\
\text{Cov}(X_2, X_1) & \text{Cov}(X_2, X_2) & \cdots & \text{Cov}(X_2, X_p) \\
\vdots & \vdots & \ddots & \vdots \\
\text{Cov}(X_p, X_1) & \text{Cov}(X_p, X_2) & \cdots & \text{Cov}(X_p, X_p) \\
\end{pmatrix}
\]
여기서 \( X_1, X_2, \ldots, X_p \)는 변수들입니다. 대각선 요소들은 각 변수의 분산을 나타내며, 비대각선 요소들은 변수들 간의 공분산을 나타냅니다.
공분산행렬 예시 (Python 코드)
다음은 Python을 사용하여 공분산행렬을 계산하는 예시입니다.
import numpy as np
import pandas as pd
# 예시 데이터 생성
data = {
'X1': [2.1, 2.5, 3.6, 4.0],
'X2': [8, 12, 14, 18],
'X3': [0.5, 0.6, 0.8, 1.0]
}
df = pd.DataFrame(data)
# 공분산행렬 계산
cov_matrix = np.cov(df, rowvar=False)
print("공분산행렬:\n", cov_matrix)
결과 해석
출력된 공분산행렬은 각 변수 간의 공분산을 나타냅니다.
공분산행렬:
[[ 0.72166667 2.41 0.09333333]
[ 2.41 15.33333333 0.34666667]
[ 0.09333333 0.34666667 0.045 ]]
- 대각선 요소: 변수의 분산을 나타냅니다.
- \( \text{Var}(X_1) = 0.7217 \)
- \( \text{Var}(X_2) = 15.3333 \)
- \( \text{Var}(X_3) = 0.0450 \)
- 비대각선 요소: 두 변수 간의 공분산을 나타냅니다.
- \( \text{Cov}(X_1, X_2) = 2.41 \): \( X_1 \)과 \( X_2 \) 간의 공분산
- \( \text{Cov}(X_1, X_3) = 0.0933 \): \( X_1 \)과 \( X_3 \) 간의 공분산
- \( \text{Cov}(X_2, X_3) = 0.3467 \): \( X_2 \)과 \( X_3 \) 간의 공분산
공분산행렬의 활용
- 주성분 분석(PCA): 데이터의 차원을 축소하고 주요 변동 요인을 파악하기 위해 사용됩니다.
- 다변량 정규 분포: 다변량 정규 분포의 공분산 구조를 설명하는 데 사용됩니다.
- 포트폴리오 이론: 금융 자산 간의 상관 관계를 분석하여 포트폴리오를 최적화하는 데 사용됩니다.
공분산행렬은 데이터의 변수들 간의 상호 관계를 이해하고 분석하는 데 중요한 도구입니다. 이를 통해 변수들 간의 의존성을 파악하고, 다양한 통계적 분석 및 머신러닝 기법에서 활용할 수 있습니다.