# 필요한 패키지 설치 및 로드
install.packages("ggplot2")
install.packages("plotly")
library(ggplot2)
library(plotly)
# 아이리스 데이터셋 로드
iris_data <- read.csv("c:\\data\\iris2.csv")
# 주성분 분석 수행
pca_result <- prcomp(iris_data[, 1:4], scale. = TRUE)
## 설명: prcomp는 주성분 분석하는 함수이고 scale=TRUE 는 데이터를 표준화 하여 분석해라
## 평균:0 / 분산:1 로 조정
## pca_result를 출력해보면 각각의 주성분과 원래변수와의 상관계수를 나타낸다.
# 주성분 점수 추출
pca_scores <- data.frame(pca_result$x)
## 각각의 데이터 포인트가 주성분 공간에서 어디에 위치하는지를 설명하는 것(pca_score는 그 포인트의 좌표값임)
pca_scores$Species <- iris_data$Species
# 2차원 시각화
p <- ggplot(pca_scores, aes(x = PC1, y = PC2, color = Species)) +
geom_point(size = 3) +
labs(title = "PCA 결과", x = "PC1", y = "PC2") +
theme_minimal()
# plotly를 사용한 인터랙티브 시각화
p_interactive <- ggplotly(p)
# 시각화 출력
p_interactive
standard deviations : 표준편차(분산값에 루트 씌움)
예를 들어, 학생들의 성적(국어, 수학, 영어 등)에서 중요한 정보를 쉽게 찾을 수 있습니다.
■ 3. 예를 들어보면?
예시: 학생 성적 분석
PC1: 학생들의 전반적인 학업 성취도를 나타냅니다. 모든 과목에서 높은 점수를 받은 학생들이 높은 PC1 점수를 갖습니다.
PC2: 특정 과목에 대한 성취도를 나타냅니다. 예를 들어, 수학에서 높은 점수를 받은 학생들이 높은 PC2 점수를 갖습니다.
요약:
PC1: 전체 성적이 높은 학생들. PC2: 특정 과목에서 두드러지는 학생들. PCA는 학생들의 성적 데이터에서 중요한 패턴을 찾아내어 학습 성과를 효과적으로 분석하는 데 도움을 줍니다.
정리하면 :
모든 과목이 3과목이고 국어,영어,수학이 있다고 하고 국어(X축), 수학(Y축), 영어(Z축) 이라고 하자
그러면 PC1 은 국어,수학,영어를 가장 잘 설명하는 어느 직선이 된다.
PC2는 PC1과 직교하는 직선으로 자동으로 결정 된다.
PC3는 PC1, PC2와 직교된 상태에서 직교된 또 다른 직선으로 자동으로 결정 된다.
■ 과목 추가하여 3D 시각화
# 필요한 패키지 설치 및 로드
install.packages("ggplot2")
install.packages("plotly")
install.packages("scatterplot3d")
library(ggplot2)
library(plotly)
library(scatterplot3d)
# 데이터 생성
set.seed(123) # 재현성을 위해 시드 설정
num_students <- 100
data <- data.frame(
국어 = rnorm(num_students, mean = 70, sd = 10),
수학 = rnorm(num_students, mean = 65, sd = 12),
영어 = rnorm(num_students, mean = 75, sd = 8)
)
# 주성분 분석 수행
pca_result <- prcomp(data, scale. = TRUE)
# 주성분 점수 추출
pca_scores <- data.frame(pca_result$x)
# 주성분 방향 벡터
pc1_vector <- pca_result$rotation[,1]
# 데이터의 중심 계산
center <- colMeans(data)
# 3D 시각화
s3d <- scatterplot3d(data$국어, data$수학, data$영어, pch = 19, color = "blue", main = "3D PCA Plot",
xlab = "국어", ylab = "수학", zlab = "영어")
# 주성분 벡터 그리기 (데이터 중심을 기준으로 양쪽 방향)
s3d$points3d(center[1] + pc1_vector[1] * c(-10, 10), center[2] + pc1_vector[2] * c(-10, 10), center[3] + pc1_vector[3] * c(-10, 10), type = "l", col = "red", lwd = 3)
# Plotly를 사용한 인터랙티브 시각화
plot_ly(x = ~data$국어, y = ~data$수학, z = ~data$영어, type = 'scatter3d', mode = 'markers',
marker = list(size = 3, color = 'blue')) %>%
add_trace(x = center[1] + pc1_vector[1] * c(-10, 10), y = center[2] + pc1_vector[2] * c(-10, 10), z = center[3] + pc1_vector[3] * c(-10, 10),
type = 'scatter3d', mode = 'lines', line = list(color = 'red', width = 5)) %>%
layout(scene = list(xaxis = list(title = '국어'),
yaxis = list(title = '수학'),
zaxis = list(title = '영어'),
title = "3D PCA Plot with PC1"))