마할라노비스거리가 카이제곱 분포를 따르는 이유
--------------------------------------------
참고) 여기서 Q^t 선형변환과 Sigma^(-1/2) 선형변환의 차이
“공분산 행렬의 고유분해에서 얻은 정규직교행렬의 전치행렬 QTQ^T는, 어떤 벡터를 공분산 행렬이 정의하는 방향(즉, 원래 변수들 간의 상관관계 구조)을 따라 회전시켜, 고유벡터 축 위의 좌표계로 선형 변환시키는 역할을 한다.”
------------------------------------------------------
Y로 변형해준 순간 Y의 각 변수들은 평균이 0 분산이 감마i인 정규분포를 따른다. 따라서 Yi제곱을 감마i로 나누는 순간 표준 정규분포를 따르는 변수를 제곱해준 꼴이 된다. 그리고 이들의 합은 당연히 카이제곱 분포를 따른다.
------------------------
참고) 촐레스키분해를 통해 구한 L을 통한 변환과 고유벡터들의 합인 Q^t를 통한 변환의 차이
# 필요한 패키지 로드
library(readxl)
library(MASS)
library(ggplot2)
# 1. 파일 읽기
file_path <- "D:/mydata/PCA용.xlsx"
df <- read_excel(file_path)
# 2. 필요한 열만 선택
vars <- df[, c("컨택률", "스윙률", "타구속도")]
vars <- na.omit(vars) # 결측값 제거
# 3. 평균 벡터와 공분산행렬 계산
mu <- colMeans(vars)
Sigma <- cov(vars)
# 4. 마할라노비스 거리 계산
mahal_dist2 <- mahalanobis(vars, center = mu, cov = Sigma)
# 5. 마할라노비스 거리 제곱이 카이제곱 분포를 따르는지 확인
# Kolmogorov-Smirnov 검정
ks_result <- ks.test(mahal_dist2, "pchisq", df = 3)
# 6. Q-Q plot 시각화
qq_df <- data.frame(
quantile = sort(mahal_dist2),
theoretical = qchisq(ppoints(length(mahal_dist2)), df = 3)
)
ggplot(qq_df, aes(sample = quantile)) +
stat_qq(distribution = qchisq, dparams = list(df = 3), color = "blue") +
stat_qq_line(distribution = qchisq, dparams = list(df = 3), color = "red") +
labs(title = "Q-Q Plot: Mahalanobis Distance² vs Chi-Square(3)",
x = "Theoretical Quantiles (Chi-Square)",
y = "Sample Quantiles (Mahalanobis²)")
# 7. 결과 출력
cat("Kolmogorov-Smirnov test p-value:", ks_result$p.value, "\n")