상관 분석 실무: Pearson·Spearman·Kendall tau 선택과 상관 행렬 활용

Pearson, Spearman, Kendall tau 상관계수의 가정과 차이를 비교하고, 전처리·유의성 검정·상관 행렬 시각화까지 정리한다.

2026-08-14 · 최초 발행 2025-10-14

상관계수 선택은 데이터의 관계를 먼저 읽는 일이다

상관 분석은 두 변수 사이의 선형 또는 단조(monotonic) 관계가 어느 방향으로, 얼마나 강하게 나타나는지를 [-1, 1] 범위의 계수로 나타내는 방법이다. 피처 간 중복을 줄이고 관계 구조를 확인하며 모델의 안정성을 높이는 데 쓰인다. 다만 상관관계 자체가 인과관계를 뜻하지는 않는다.

연속형 변수의 선형 관계에는 Pearson 상관계수 r이 맞는다. 이상치와 비정규성의 영향을 받기 쉽다는 점은 함께 고려해야 한다. 값의 순위를 바탕으로 단조 관계를 보는 Spearman 순위 상관계수 ρ는 비선형 단조 관계와 이상치에 상대적으로 강건하다. Kendall tau τ는 순서쌍의 일치와 불일치 비율을 이용하며, 표본 수가 적거나 동점이 많은 서열 자료를 해석할 때 적합하다.

상관계수만 보고 판단하지 않는 것도 중요하다. p-value와 신뢰구간을 확인하고, 많은 변수를 동시에 비교한다면 FDR 또는 Bonferroni 같은 다중비교 보정을 함께 적용해야 허위 양성을 관리할 수 있다.

관계 형태와 데이터 상태에 맞추는 기준

선형 관계를 중점적으로 본다면 Pearson을 선택한다. 비선형이더라도 단조 관계가 예상되거나 순서형 자료를 다룬다면 Spearman 또는 Kendall이 적합하다.

이상치, 비정규성, 동점은 선택을 바꾸는 요인이다. 이런 특성이 두드러지면 Spearman이나 Kendall을 우선 검토한다. 표본 수가 작을 때는 Kendall의 해석 안정성이 유리할 수 있지만 계산 비용은 커진다.

구분 Pearson Spearman Kendall tau
관계 가정 선형 관계 전제 단조 관계 전제 단조 관계 전제(순서쌍)
데이터 척도 연속형(간격/비율) 연속형·서열 연속형·서열/동점 빈번
이상치 민감도 높음 낮음(랭크) 낮음(순서쌍)
동점 대응 취약 랭크 평균 처리 내재적 처리 우수
계산 비용 낮음 중간 높음
표본 수 적합성 중·대 표본 전 표본 소표본 해석 안정
해석 용이성 높음(회귀 연계) 중간 중간
운영 편의 매우 높음 높음 제한적(성능 이슈)

성능과 확장성은 Pearson이, 이상치 대응과 안정성은 Kendall이 강점이다. Spearman은 이 둘 사이에서 다목적으로 적용하기 좋은 선택지다.

전처리와 검정이 결과의 신뢰도를 좌우한다

결측치는 pairwise complete 방식이나 다중대치로 처리할 수 있다. 분석 대상 전체에서 일관된 결측 처리 정책을 정해 두어야 비교 결과가 흔들리지 않는다.

이상치는 robust 스케일링이나 랭크 기반 상관으로 영향을 줄일 수 있으며, 필요에 따라 winsorization 또는 변환을 적용한다. 상관계수는 무차원 계수이므로 스케일 조정은 필요하지 않다. 다만 로깅이나 Box-Cox 변환으로 관계를 선형화할 수 있는지는 검토할 만하다.

Pearson의 p-value는 t-검정으로 계산할 수 있다. Spearman과 Kendall에는 순열 또는 근사 분포 기반 검정을 적용한다. 신뢰구간이 필요하면 비모수 부트스트랩을 사용하고, 변수 수가 많을 때는 Benjamini–Hochberg(FDR) 같은 다중검정 보정을 적용한다.

상관 행렬을 의사결정에 연결하는 흐름

수치형 피처만 추려 메트릭별 상관 행렬을 만들고, 상삼각 마스킹·절대값 기준 색상 매핑·주석 표시를 조합하면 읽기 쉬운 결과를 만들 수 있다. clustermap을 함께 사용하면 피처 군집 구조도 확인할 수 있으며, 임계치 필터는 고상관 변수 후보를 자동으로 추출하는 데 유용하다.

선형 가정단조/서열동점 많음/소표본예외: 결측률 과다예외: 검정력 부족입력: 원천 데이터셋(수치/서열변수)전처리: 결측/이상치/형 변환관계 형태 가설메트릭: Pearson메트릭: Spearman 또는Kendall메트릭: Kendall 권장상관 행렬 계산유의성 검정 다중비교 보정시각화: 히트맵/클러스터의사결정: 피처 축소, 경보임계치, 리스크 헤지정책: 변수 제외/대치 재설계샘플증대/부트스트랩/효과크기중심

Pearson과 Spearman의 계산 복잡도는 O(n·p^2), Kendall은 O(n^2·p^2) 경향을 보인다. 피처 수 p 또는 표본 수 n이 커지면 샘플링과 분산 처리를 검토해야 한다. 전처리, 상관 계산, 검정, 보정, 리포트 생성을 파이프라인으로 연결하고 스케줄링 및 변경 추적 로그를 남기면 재현성을 확보할 수 있다.

분석 목적에 따라 달라지는 적용 방식

피처 선택과 다중공선성 관리에서는 수치형 피처를 추출한 뒤 Spearman 상관 행렬을 계산하고, |ρ| ≥ 0.8인 변수 쌍을 표시한다. 이후 업무 맥락과 해석 가능성을 기준으로 대체 또는 삭제를 결정하고, 회귀 모델에서는 VIF를 다시 확인한다. 과적합을 줄이고 해석력과 학습·추론 시간을 개선하는 흐름이다.

금융 포트폴리오에서는 자산 수익률의 롤링 Spearman 상관으로 레짐 전환을 감지하고, 저상관 또는 음의 상관 자산의 비중을 조정한 뒤 스트레스 시나리오를 검증한다. 상관이 급등하는 국면에서 드로우다운을 완화하고 헤지 효율을 높이는 데 활용할 수 있다.

제조 공정에서는 센서별 Kendall tau로 순서형 등급과 공정 변수의 관계를 확인한다. 상관 임계치를 넘으면 경보를 발생시키고 원인 변수 후보 목록을 출력해 오탐을 줄이며 공정 안정화에 연결한다.

의료·설문 데이터에서는 서열형 리커트 문항 사이의 Kendall tau로 문항 중복을 찾을 수 있다. 이를 바탕으로 설문을 축소하고 피로도와 측정 일관성 문제를 다룬다.

온라인 서비스 A/B 분석에서는 Spearman으로 지표 사이의 비선형 단조 관계를 확인한 뒤 유의성 검정과 FDR 보정을 적용한다. 지표가 상충하거나 함께 움직이는 구조를 해석해 실험 결론의 강건성을 확보하는 보조 수단이 된다.

계산·검정·시각화를 한 흐름으로 구현하기

전제조건

  • Python 3.11, pandas 2.2+, numpy 1.26+, scipy 1.11+, seaborn 0.13+, matplotlib 3.8+
  • 선택: statsmodels 0.14+ (FDR 보정)
# 환경: Python 3.11, pandas 2.2, numpy 1.26, scipy 1.11, seaborn 0.13, matplotlib 3.8
import numpy as np, pandas as pd
from scipy import stats
import seaborn as sns
import matplotlib.pyplot as plt

# 1) 예시 데이터 생성 (선형, 단조 비선형, 비단조)
rng = np.random.default_rng(42)
n = 800
x = rng.normal(size=n)
y_linear = 0.7*x + rng.normal(scale=0.6, size=n)              # Pearson 높음
y_monotonic = np.exp(0.8*x) + rng.normal(scale=0.5, size=n)    # 단조 비선형: Spearman 유리
y_nonlinear = (x**2) + rng.normal(scale=0.4, size=n)           # 비단조: 세 계수 모두 낮을 수 있음
# 일부 결측 주입
mask = rng.random(n) < 0.03
y_linear[mask] = np.nan

df = pd.DataFrame({
    "x": x,
    "y_linear": y_linear,
    "y_monotonic": y_monotonic,
    "y_nonlinear": y_nonlinear
})

# 2) 상관 행렬 계산 (pairwise, 결측 자동 제거)
corr_pearson  = df.corr(method="pearson")
corr_spearman = df.corr(method="spearman")
corr_kendall  = df.corr(method="kendall")

print("Pearson\n", corr_pearson.round(3))
print("Spearman\n", corr_spearman.round(3))
print("Kendall\n", corr_kendall.round(3))

# 3) p-value 행렬 계산 유틸리티
def corr_pvalues(data: pd.DataFrame, method: str = "pearson") -> pd.DataFrame:
    cols = data.columns
    pvals = pd.DataFrame(np.ones((len(cols), len(cols))), columns=cols, index=cols)
    for i, c1 in enumerate(cols):
        for j, c2 in enumerate(cols):
            if j <= i:
                continue
            sub = data[[c1, c2]].dropna()
            if len(sub) < 3:
                p = np.nan
            else:
                if method == "pearson":
                    r, p = stats.pearsonr(sub[c1], sub[c2])
                elif method == "spearman":
                    r, p = stats.spearmanr(sub[c1], sub[c2])
                elif method == "kendall":
                    r, p = stats.kendalltau(sub[c1], sub[c2])
                else:
                    raise ValueError("Unsupported method")
            pvals.loc[c1, c2] = p
            pvals.loc[c2, c1] = p
    np.fill_diagonal(pvals.values, 0.0)
    return pvals

pvals_spear = corr_pvalues(df, method="spearman")
print("Spearman p-values\n", pvals_spear)

# 4) 다중비교 보정(FDR, 옵션)
try:
    from statsmodels.stats.multitest import multipletests
    p_flat = pvals_spear.where(~np.eye(len(pvals_spear), dtype=bool)).stack().values
    rej, p_adj, _, _ = multipletests(p_flat, method="fdr_bh")
    pvals_adj = pvals_spear.copy()
    pvals_adj.values[np.where(~np.eye(len(pvals_spear), dtype=bool))] = p_adj
    print("FDR 보정 p-value (Spearman)\n", pvals_adj)
except Exception as e:
    print("statsmodels 미설치 또는 오류로 FDR 보정 생략:", e)

# 5) 히트맵 시각화
sns.set_theme(style="white")
for title, mat in [("Pearson", corr_pearson), ("Spearman", corr_spearman), ("Kendall", corr_kendall)]:
    plt.figure(figsize=(6, 4))
    mask = np.triu(np.ones_like(mat, dtype=bool))
    sns.heatmap(mat, mask=mask, vmin=-1, vmax=1, cmap="coolwarm", annot=True, fmt=".2f",
                linewidths=.5, cbar_kws={"shrink": .8}, square=True, center=0)
    plt.title(f"{title} Correlation Matrix")
    plt.tight_layout()
    plt.show()

# 6) 대규모 데이터 주의: Kendall은 O(n^2) 경향 → 필요 시 샘플링

고차원 데이터(p>200)에서는 Spearman을 먼저 적용한 뒤 Kendall은 후보 쌍만 정밀 검증하는 방식이 적합하다. 시간의존 데이터는 정상성과 자기상관을 제거한 후 상관을 계산해야 하며, 차분 또는 잔차 상관 분석을 적용할 수 있다. 신뢰구간이 필요하다면 부트스트랩(예: 2000회)으로 상관 분포를 추정한다.

피처 축소와 운영 안정성에 주는 효과

상관 임계 0.8을 적용해 피처 중복을 제거하면 1540% 차원 축소와 모델 추론 시간 1030% 단축을 기대할 수 있다. 드로우다운과 오탐률은 5~15% 감소가 기대된다.

관계 구조를 시각화하면 분석 결과를 공유하기 쉬워지고 모델 해석 가능성도 높아진다. 이상치와 데이터 드리프트를 조기에 감지하는 경보 체계를 설계하는 기반으로도 활용할 수 있다.

상관 분석피어슨 상관스피어만 상관켄달 타우상관 행렬데이터 분석