library(readxl)
library(ggplot2)
library(ggrepel)
library(reshape2)
# 2. 데이터 불러오기
data <- read_excel("d:/mydata/PCA용.xlsx")
# 3. 사용할 변수 선택 및 표준화
vars <- c("컨택률", "스윙률", "타구속도", "발사각도")
Z <- scale(data[, vars])
# 4. PCA 실행
pca_result <- prcomp(Z, center = FALSE, scale. = FALSE)
# 5. PCA 요약
summary(pca_result)
# 6. PCA 좌표 (2D) 시각화용
pca_coords <- as.data.frame(pca_result$x[, 1:2])
pca_coords$이름 <- data$이름
# 7. Loading 벡터 (선형계수)
loadings <- as.data.frame(pca_result$rotation[, 1:2])
loadings$변수 <- rownames(loadings)
# 8. Biplot 시각화 (개체 + 로딩벡터)
ggplot() +
geom_point(data = pca_coords, aes(x = PC1, y = PC2), color = "blue", size = 3) +
geom_text_repel(data = pca_coords, aes(x = PC1, y = PC2, label = 이름), size = 3) +
geom_segment(data = loadings, aes(x = 0, y = 0, xend = PC1*3, yend = PC2*3),
arrow = arrow(length = unit(0.2, "cm")), color = "red") +
geom_text_repel(data = loadings, aes(x = PC1*3, y = PC2*3, label = 변수),
color = "red", size = 4) +
xlab("PC1") + ylab("PC2") +
ggtitle("PCA Biplot: Players & Loadings") +
theme_minimal()
# 9. 주성분 분산 설명 비율 (Scree Plot)
explained_var <- pca_result$sdev^2 / sum(pca_result$sdev^2)
scree_df <- data.frame(PC = paste0("PC", 1:length(explained_var)),
Variance = explained_var)
ggplot(scree_df, aes(x = PC, y = Variance)) +
geom_col(fill = "skyblue") +
geom_text(aes(label = scales::percent(Variance, accuracy = 0.1)), vjust = -0.5) +
ggtitle("Proportion of Variance Explained by Each PC") +
ylab("Variance Explained") +
theme_minimal()
# 10. 각 변수의 각 PC에 대한 기여도 (loading²)
loading_sq <- loadings
loading_sq[, 1:2] <- loading_sq[, 1:2]^2 # 제곱해서 기여도로 만듦
loading_long <- melt(loading_sq, id.vars = "변수",
variable.name = "주성분", value.name = "기여도")
ggplot(loading_long, aes(x = reorder(변수, -기여도), y = 기여도, fill = 주성분)) +
geom_col(position = "dodge") +
ylab("Contribution (loading²)") +
xlab("Variable") +
ggtitle("Variable Contributions to Each Principal Component") +
theme_minimal()
# 11. 타구속도와 PC1의 상관관계
cor(data$타구속도, pca_result$x[, 1])
# 12. 모든 주성분에 대한 선형결합식 출력
cat("각 주성분의 구성식 (선형결합):\n\n")
for (pc in colnames(loadings)[1:2]) { # 필요한 경우 1:2를 1:ncol(loadings)로 변경
cat(sprintf("%s = ", pc))
terms <- sprintf("%.4f × %s", loadings[[pc]], loadings$변수)
cat(paste(terms, collapse = " + "), "\n\n")
}
#-----------------
pca_result$rotation
'통계학' 카테고리의 다른 글
등상관 구조에 대한 검정 및 구형성 (0) | 2025.05.28 |
---|---|
고유값과 고유벡터의 대수적 성질 (0) | 2025.05.28 |
주성분분석 1 (0) | 2025.05.26 |
Box-Cox 변환 (0) | 2025.05.19 |
마할라노비스거리를 이용한 정규성 검정 (0) | 2025.05.18 |