정준 상관 분석(CCA)이란? AI에서 두 변수 묶음의 함께 움직이는 축을 찾는 방법
TL;DR
정준 상관 분석(CCA)은 같은 대상에서 얻은 두 변수 묶음을 각각 선형 조합해 두 점수 사이의 상관을 크게 만드는 방법입니다. 센서 측정과 품질 측정처럼 관찰 관점이 다른 자료에서 함께 움직이는 방향을 찾습니다. 한쪽 분산이 큰 축을 찾는 PCA, 공분산을 활용해 정답을 예측하는 PLS 회귀와 구별합니다. 훈련 상관이 높아도 인과관계나 새 자료의 성능이 보장되지는 않으므로 행 대응과 독립 평가를 함께 확인합니다.
핵심 3줄 요약
- 핵심 1
두 자료의 행을 먼저 맞춥니다. 같은 행은 같은 대상이나 같은 관측 시점을 뜻해야 합니다. - 핵심 2
축은 두 묶음에서 한 쌍씩 나옵니다. 여러 원본 변수를 섞은 두 점수의 상관을 살핍니다. - 핵심 3
상관과 예측 오차는 다릅니다. 새 자료의 점수 상관과 실제 수치 예측 품질을 따로 평가합니다.
이 글에서 다룰 내용
- 정준 상관 분석의 한 문장 정의
- 두 센서 묶음의 평균으로 관계를 찾는 쉬운 예시
- 행 대응·중심화·축 계산·성분 변환의 작동 순서
- 성분 수·스케일링·가중치·로딩·회전의 뜻
- PCA·PLS·일반 상관 분석과의 차이
- 두 관점의 수치 자료를 함께 분석하는 사용처
- 고차원 불안정성·평가 누수·인과 해석의 주의점
정준 상관 분석을 한 문장으로 정의하면 무엇인가요?
정준 상관 분석은 동일한 관측 대상의 두 변수 묶음에서 각각 선형 조합을 만들고 그 조합 점수 사이의 상관이 커지도록 방향을 찾는 다변량 분석 방법입니다.
영문명은 Canonical Correlation Analysis이고 약어는 CCA입니다. 정준상관분석처럼 붙여 쓰기도 합니다. 한 자료의 열 하나와 다른 자료의 열 하나를 고정해 상관을 계산하는 대신 양쪽의 여러 열을 함께 섞습니다. 찾아낸 조합을 정준 변수나 정준 점수라고 부릅니다.
입력 X가 표본 수 × 첫 묶음의 변수 수라면 다른 입력 Y는 같은 표본 수 × 둘째 묶음의 변수 수입니다. 양쪽 열 수는 달라도 됩니다. scikit-learn 문서는 둘째 묶음을 y 또는 target이라고 부르지만 분석 목적에서는 두 관점의 측정값일 수도 있습니다. 분류 정답만 받는 방법은 아닙니다.
한 줄 정리: 두 관점의 측정값을 각각 요약한 뒤 그 두 요약이 가장 강하게 함께 움직이는 방향을 찾습니다.
쉬운 예시로 이해해 볼까요?
감자나라ai님이 같은 여섯 대상에서 센서 묶음 X와 측정 묶음 Y를 얻었다고 가정해 보겠습니다. 각 묶음에는 두 열이 있으며 설명용 숫자를 직접 정했습니다. 아래 괄호 하나가 한 행입니다. 실제 고객이나 장비를 측정한 결과는 아닙니다.
- X의 여섯 행은
(0, -2), (-2, 0), (1, -1), (-1, 1), (2, 0), (0, 2)입니다. - Y의 대응 행은
(-1, -3), (-1, -3), (-2, 2), (-2, 2), (3, 1), (3, 1)입니다. - 첫 열끼리의 피어슨 상관은 약 0.478입니다. 두 묶음에서 각 행의 두 열을 평균내면 각각
(-1, -1, 0, 0, 1, 1)과(-2, -2, 0, 0, 2, 2)가 되어 상관은 1입니다.
각 열에 따로 섞여 있던 변화가 평균에서는 상쇄되도록 만든 예시입니다. 한 열끼리만 비교할 때보다 여러 열의 조합에서 관계가 더 뚜렷해집니다. NumPy로 상관을 계산하고 공분산을 백색화한 뒤 SVD를 푸는 선형 CCA 계산에서도 첫 정준 상관이 1임을 확인했습니다. scikit-learn 추정기를 실행한 결과로 소개하지 않습니다.
상관 1인 두 점수도 숫자는 같지 않습니다. 둘째 점수는 첫째 점수의 두 배이므로 같은 단위의 정답을 정확히 예측했다는 뜻이 아닙니다. 이 작은 자료는 원리를 보여 주는 계산이며 훈련에서 얻은 관계가 새로운 대상에도 유지되는지까지 검증한 실험은 아닙니다.
쉬운 예시: CCA는 각각의 측정값을 비교하는 데서 그치지 않고 여러 측정값의 조합을 비교합니다. 상관이 높다는 결과와 값이 같다는 결과는 구별하세요.
왜 AI에서 정준 상관 분석이 중요한가요?
두 관점에서 공유하는 변화를 살핍니다
같은 대상의 센서값과 품질 지표, 행동 측정과 설문 수치처럼 자료가 두 묶음으로 나뉠 수 있습니다. CCA는 각 묶음 안의 큰 변화만 남기기보다 두 묶음 사이의 선형 관계를 찾습니다. 업무에서 무엇을 함께 분석하려는지와 두 묶음의 측정 시점을 먼저 정합니다.
변수 한 쌍의 상관만으로 놓친 조합을 봅니다
원본 열끼리의 상관표는 어느 측정끼리 관계가 있는지 보여 주지만 여러 열을 결합한 관계까지 직접 찾지는 않습니다. CCA는 열 조합으로 만든 두 점수를 살핍니다. 다만 변수가 많으면 우연한 관계도 강하게 맞출 수 있으므로 훈련 상관과 검증 상관을 함께 봅니다.
차원 축소의 목표를 분명히 합니다
성분 몇 쌍으로 표현을 줄여 관계를 읽을 수 있지만 원본 정보를 가장 많이 보존하는 축과는 다릅니다. 정준 상관은 PCA의 설명 분산 비율이나 회귀의 오차가 아닙니다. 상관이 큰 방향만 남긴 뒤 실제 분류·검색·회귀에 쓰려면 그 후속 과제를 따로 평가합니다.
핵심 인사이트: 두 묶음이 함께 움직이는 관계를 찾는 일, 한 묶음을 압축하는 일, 다른 수치를 예측하는 일은 평가 기준이 다릅니다.
정준 상관 분석은 어떤 순서로 작동하나요?
1. 같은 대상의 행을 정렬하고 중심을 맞춥니다
양쪽 자료의 식별자와 시점을 맞춥니다. 행 개수가 같아도 순서가 뒤섞이면 다른 대상끼리 관계를 학습합니다. 확인한 scikit-learn 구현은 양쪽 훈련 평균을 빼고 기본
scale=True
에서는 열별 표준편차로 척도도 조정합니다.
scale=False
는 표준편차에 따른 조정을 끄는 값입니다. 중심화까지 생략하지 않습니다. 결측값 대체나 앞단 특징 생성이 필요하다면 그 통계도 훈련 분할에서 정하고 검증 자료에는 저장한 처리만 적용합니다.
2. 각 묶음의 관계를 반영해 조합 방향을 구합니다
기본 CCA는 두 조합의 분산을 고려한 상관을 크게 만듭니다. 교차 공분산 행렬만 SVD로 분해해 가장 큰 방향을 고르는 PLS 방식과 그대로 같지는 않습니다. 일반적인 풀이에는 각 묶음의 공분산을 백색화하고 교차 관계의 SVD를 푸는 방식도 있습니다.
scikit-learn의 CCA는 문헌의 Mode B에 해당하며 확인한 구현은 두 잔차 묶음의 의사역행렬을 이용해 가중치를 반복 갱신합니다. 이 계산을 단순한 Mode A의 교차 공분산 특이벡터 계산이라고 설명하지 않습니다. statsmodels의 CanCorr는 SVD 기반 풀이를 문서화합니다.
3. 성분 쌍을 얻고 남은 관계를 찾습니다
양쪽 방향으로 각 사례를 투영하면 성분 점수 한 쌍을 얻습니다. scikit-learn 구현은 각 묶음을 자기 점수로 근사하고 그 부분을 빼는 정준형 디플레이션을 사용합니다. 이후 남은 자료에서 다음 쌍을 찾습니다. PLS 회귀의 정답 잔차 갱신을 그대로 옮기지 않습니다.
첫 쌍 뒤의 성분도 각 묶음 안에서 앞선 점수와 겹치지 않는 관계를 찾는다는 목적이 있습니다. 훈련에서 분리한 관계가 테스트에서도 같은 직교성이나 같은 상관을 갖는다고 보장하지는 않습니다. 성분의 개수와 유효한 관계의 개수도 같지 않을 수 있습니다.
주요 설정과 결과는 어떻게 읽나요?
성분 수의 계산 범위와 유효 차원을 나눕니다
n_components
는 남길 성분 쌍의 수이며 기본값은 2입니다. 확인한 API와 구현은 표본 수·X 열 수·Y 열 수 중 가장 작은 값을 명목 상한으로 검사합니다. 중심화, 중복 열과 선형 의존 때문에 실제 남은 방향은 그보다 적을 수 있습니다.
Y가 한 열이면 이 CCA의 성분 쌍은 최대 하나입니다. 수치 정답 하나에도 여러 성분을 사용할 수 있는 PLSRegression의 범위를 복사하지 않습니다. 계산 가능한 범위 안에서 검증 상관과 해석 안정성을 보고 필요한 쌍만 남깁니다.
점수·가중치·로딩·회전은 역할이 다릅니다
정준 점수는 사례를 옮긴 좌표이고 가중치는 각 단계의 조합 방향입니다.
x_loadings_
와
y_loadings_
는 해당 점수로 각 묶음을 근사할 때 쓰는 로딩입니다. 원본 변수와 점수의 상관을 따로 계산한 값도 같은 로딩 속성으로 부르지 않습니다.
새 자료의 변환에는 저장된 중심·척도와
x_rotations_
,
y_rotations_
를 사용합니다.
transform(X_new, Y_new)
는 양쪽 점수를,
transform(X_new)
는 첫 묶음의 점수만 반환합니다. 가중치 행렬을 새 자료의 최종 투영 행렬과 무조건 같게 취급하지 않습니다.
반복 종료와 상관 평가를 구분합니다
max_iter
와
tol
은 방향을 찾는 반복의 한도와 종료 기준입니다. tol은 연속한 X 가중치 차이의 제곱 노름과 비교하며 업무상 허용 오차나 최소 상관이 아닙니다.
n_iter_
와 종료 경고를 살펴보고 한도 도달을 충분한 수렴으로 보고하지 않습니다.
score(X_test, Y_test)
는 predict의 수치 예측에 대한 R²입니다. 정준 점수 쌍의 상관을 직접 반환하는 메서드가 아닙니다. 상관이 목적이면 양쪽 테스트 점수를 transform으로 얻고 같은 성분 쌍의 피어슨 상관을 계산합니다. 예측이 목적이면 원래 단위의 오차도 따로 봅니다.
정준 상관 분석과 헷갈리는 용어는 무엇이 다른가요?
일반 상관 분석·PCA와의 차이
일반적인 상관 계산은 정한 변수 두 개가 함께 변하는 정도를 잽니다. CCA는 두 묶음에서 그 관계가 강한 조합을 찾습니다. 주성분 분석(PCA)는 한 묶음에서 분산이 큰 직교 축을 찾으며 다른 묶음과의 관계를 축 선택에 사용하지 않습니다.
PLS 회귀·정준형 PLS와의 차이
부분 최소제곱 회귀(PLS)는 입력과 수치 정답의 공분산을 활용해 예측합니다. 정준형 PLS도 두 묶음의 조합을 찾지만 가중치 계산의 목표와 방식이 CCA와 다릅니다. 상관과 공분산, 정준 점수와 수치 예측을 분리해야 비슷한 클래스 이름을 잘못 교환하지 않습니다.
백색화·커널 CCA·인과 추론과의 차이
데이터 백색화는 한 묶음의 공분산을 단위 행렬로 바꾸는 변환이며 CCA 풀이의 일부가 될 수 있습니다. 커널 CCA·정규화 CCA·딥 CCA는 목적과 계산을 확장한 별도 변형입니다. 기본 CCA에 이름만 바꿔 적용하지 않으며 선형 관계를 찾았다고 원인을 확인한 것으로 해석하지 않습니다.
비교 정리: PCA는 한 묶음의 분산, CCA는 두 조합의 상관, PLS는 공분산을 활용한 표현과 예측을 살핍니다.
실전에서는 어디에 쓰이나요?
같은 대상의 두 측정 묶음을 분석합니다
센서 특징과 품질 측정, 생체 신호와 행동 수치처럼 두 관점의 관계를 탐색하는 후보입니다. 대응하는 대상과 관측 기간을 고정하고 무엇이 함께 움직이는지 확인합니다. 해석할 때는 단위와 변수 조합, 다른 요인의 영향을 함께 기록합니다.
두 관점의 수치 특징을 비교합니다
이미지 특징과 설명문 특징처럼 이미 숫자로 만든 두 표현에도 관계 분석을 시험할 수 있습니다. 기본 선형 CCA가 원본 이미지나 문장을 자동 이해하는 모델은 아닙니다. 훈련에 짝지어진 사례가 필요하며 서로 다른 대상을 자동으로 짝지어 주는 도구로 소개하지 않습니다.
공식 예제의 훈련·테스트 흐름을 참고합니다
scikit-learn 비교 예제는 공유 잠재 변수가 있는 합성 자료를 나눈 뒤 훈련에서 fit하고 양쪽 테스트를 transform합니다. 산점도의 상관 표시 부분은 PLSCanonical 블록이므로 그 표시값을 CCA 결과로 옮기지 않습니다. CCA 블록의 실제 추정기와 변환 호출을 따로 확인합니다.
정준 상관 분석을 적용할 때 어떤 순서로 확인하나요?
1. 두 묶음의 의미와 행 대응을 고정합니다
같은 행이 무엇을 나타내는지, 각 열의 단위와 시점이 무엇인지 기록합니다. 식별자로 조인한 뒤 누락·중복 행과 시간 차이를 검사합니다. 같은 사람이나 장비의 반복 관측이 훈련과 테스트에 섞이지 않도록 대상별 또는 시간별 분할을 선택합니다.
2. 전처리와 축을 훈련 안에서 학습합니다
결측 처리와 필요한 앞단 차원 축소, CCA 학습을 각 훈련 폴드에서 수행합니다. 전체 두 묶음으로 먼저 축을 만든 뒤 나누지 않습니다. 테스트에는 저장한 전처리와 회전을 사용하고 양쪽 테스트의 행 순서를 다시 대조합니다.
3. 상관과 해석의 안정성을 함께 봅니다
성분 수별 검증 상관과 분할별 변동을 남깁니다. 특정 열의 계수 하나만 해석하지 말고 변수와 점수의 관계, 중복 열과 스케일도 확인합니다. 통계적 유의성 검정이 필요하면 사용한 검정의 가정과 분석 절차를 별도로 확인하며 큰 상관만으로 유의하다고 보고하지 않습니다.
4. 새 자료에 같은 변환을 적용합니다
양쪽 열 순서, 전처리, 모델과 버전을 저장합니다. 새로운 X만 들어오면 첫 묶음의 점수는 만들 수 있지만 그 사례의 두 점수 사이 상관은 실제 Y 없이는 평가할 수 없습니다. predict로 만든 Y를 실제 Y 대신 넣어 독립 검증했다고 보고하지 않습니다.
실전 팁: 정준 상관을 보고하려면 먼저 실제 두 테스트 묶음과 저장된 모델이 필요합니다. 훈련 상관, 검증 상관, 예측 R²를 서로 다른 항목에 기록하세요.
사용할 때 무엇을 주의해야 하나요?
첫째, 고차원의 높은 훈련 상관을 과신하지 않습니다. 변수 수에 비해 표본이 적거나 열이 거의 중복되면 의사역행렬 계산과 관계 추정이 불안정해질 수 있습니다. 계산이 끝나도 일반화가 확인된 것은 아닙니다. 차원 축소나 정규화 CCA 같은 대안도 훈련 분할 안에서 비교합니다.
둘째, 상관을 원인이나 같은 숫자로 읽지 않습니다. 한 점수를 양수 배율로 키워도 상관은 유지됩니다. 성분 쌍의 부호를 동시에 바꿀 수도 있으므로 좌표 부호만 보고 업무상 좋고 나쁨을 정하지 않습니다. 실제 인과 주장에는 별도의 설계와 근거가 필요합니다.
셋째, 내부 설정을 공개 생성자 인자로 복사하지 않습니다. 공식 구현의
mode="B"
와
algorithm="nipals"
는 CCA 내부 선택입니다. 확인한 CCA 생성자는 이 두 인자를 받지 않습니다. PLSCanonical에 있는
algorithm="svd"
를 같은 방식으로 넣지 않습니다.
넷째, 역변환이나 통계 출력을 과장하지 않습니다. 적은 성분으로 되돌린 값은 일반적으로 근사 재구성입니다. statsmodels는 정준 상관 배열과 검정 메서드를 문서화하지만 이를 scikit-learn CCA가 자동 반환하는 신뢰구간으로 소개하지 않습니다. 수치 예측, 상관, 유의성은 각각 확인합니다.
주의: 상관을 크게 만드는 계산은 자료의 대응이나 품질을 대신 보증하지 않습니다. 높은 훈련 상관 하나로 새 대상의 관계와 안전성을 확정하지 않습니다.
자주 묻는 질문
Q1. CCA는 반드시 분류 정답 라벨이 있어야 하나요?
분류 라벨일 필요는 없습니다. 같은 대상에서 얻은 두 수치 변수 묶음이 필요합니다. 한쪽만으로 학습하는 PCA와 다르며 각 행의 대응이 먼저 확인돼야 합니다.
Q2. 상관이 1이면 두 점수가 완전히 같은가요?
아닙니다. 두 점수가 배율이나 위치만 다르게 움직여도 상관은 1일 수 있습니다. 예시의 두 점수는 두 배 차이가 납니다. 원래 단위의 예측 오차와 동일성은 따로 검사합니다.
Q3. score를 호출하면 정준 상관을 얻나요?
scikit-learn CCA의 score는 수치 예측의 R²입니다. 정준 상관은 실제 테스트 X와 Y를 변환한 뒤 같은 성분 쌍 사이에서 계산합니다. 성분 좌표와 회귀 평가 지표도 구분합니다.
Q4. Y가 한 열이면 성분을 여러 개 만들 수 있나요?
이 구현의 CCA는 둘째 묶음이 한 열이면 성분 쌍 상한이 하나입니다. 수치 정답 하나에도 여러 성분을 쓰는 PLSRegression과 계약이 다릅니다. 변수 수와 중심화 뒤의 유효 차원도 함께 확인합니다.
Q5. scale을 끄면 평균도 빼지 않나요?
확인한 구현은 scale=False여도 훈련 평균을 빼서 중심화합니다. 끄는 것은 표준편차에 따른 열별 척도 조정입니다. 새 자료에는 훈련에서 저장한 기준을 적용합니다.
Q6. 새 자료에는 두 묶음이 모두 필요한가요?
첫 묶음의 점수 변환이나 수치 예측에는 새 X만 사용할 수 있습니다. 두 점수의 실제 상관을 평가하려면 대응하는 새 Y도 있어야 합니다. 새 Y를 예측값으로 대신한 검사는 독립 상관 평가가 아닙니다.
출처
마무리
정준 상관 분석은 같은 대상의 두 변수 묶음에서 상관이 큰 선형 조합 쌍을 찾는 방법입니다. 원본 변수, 정준 점수, 가중치와 최종 투영을 구별하면 출력 숫자가 무엇을 뜻하는지 읽기 쉬워집니다.
처음에는 작은 짝지어진 자료로 행 대응과 점수 계산을 확인하세요. 이후 훈련에서만 전처리와 축을 학습하고 실제 두 테스트 묶음에서 관계를 다시 평가합니다. 높은 상관뿐 아니라 표본 대비 변수 수, 분할별 변동과 해석의 한계까지 남기는 것이 마지막 점검입니다.
