R/연습문제 풀이

[R] 요인 분석

연정양 2023. 1. 17.

###1-1###
#데이터파일 가져오기
library(memisc)
setwd("C:/R work/")
data.spss <- as.data.set(spss.system.file('drinking_water_example.sav'))
data.spss
drinking_water_exam <- data.spss[1:7]
drinking_water_exam_df <- as.data.frame(drinking_water_exam)
str(drinking_water_exam_df)


###1-2###
#주성분 분석으로 요인수 알아보기
pc <- prcomp(drinking_water_exam_df)
summary(pc)
plot(pc)

prcomp(drinking_water_exam_df)
#주성분 2개로 설정 (0.7848) -> 3개 이후 완만히 감소

#변수 간 상관관계 분석과 요인분석
cor(drinking_water_exam_df)

#요인분석 - varimax 요인회전법 적용, 회귀분석(scores속성 설정)
result <- factanal(drinking_water_exam_df, factors=2,
                   rotation = "varimax", scores = "regression")
result
#p-value가 0.114로 0.05 이상이므로 유효하며, 
#Uniquenesses항목에서 모든 변수가 0.5이하이므로 모두 유효하다.
#데이터 셋에서 의도한 요인과 요인으로 묶인 결과가 같게 나옴 

#요인수 3개일 경우
result1 <- factanal(drinking_water_exam_df, factors=3,
                   rotation = "varimax")
result1
#Uniquenesses항목과 p-value는 유효하나, 
#Factor3의 loadings가 +0.4 이하로 유의하지 않다. 
#따라서, 요인수 -> 2개로 설정.

##1-3##
#요인적재량 행렬의 컬럼명 변경 
result$loadings
colnames(result$loadings) = c('제품만족도', '제품친밀도')

##1-4##
#요인점수를 이용한 요인적재량 시각화

#제품만족도와 제품친밀도 요인적재량 시각화
result$scores
plot(result$scores[, c(1:2)],
     main = "제품만족도와 제품친밀도 요인점수 행렬")

text(result$scores[,1],result$scores[,2],
    cex = 0.5, pos = 1, col = "black")

#요인적재량 추가
points(result$loadings[, c(1:2)], pch = 16, col = "red")
text(result$loadings[,1], result$loadings[,2],
     labels = rownames(result$loadings),
     cex = 0.8, pos = 1, col = "red")
#q1,q2,q3 / q4,q5,q6,q7 요인들이 각각 가까운 곳에 위치해 있다. 

##1-5##
#요인별 변수 묶기(loadings 제시)
''' Loadings:
제품만족도 제품친밀도
Q1 0.212      0.789     
Q2 0.182      0.863     
Q3 0.170      0.820     
Q4 0.724      0.296     
Q5 0.882      0.149     
Q6 0.860      0.172     
Q7 0.742      0.198'''  
#위에 따라 '제품만족도'의 0.4이상 값을 갖는 q4,q5,q6,q7을 final1,
#'제품친밀도'의 0.4이상 값을 갖는 q1,q2,q3을 final2로 묶었다. 

final1 <- c(drinking_water_exam_df$Q4,
            drinking_water_exam_df$Q5,
            drinking_water_exam_df$Q6,
            drinking_water_exam_df$Q7)

final2 <- c(drinking_water_exam_df$Q1,
            drinking_water_exam_df$Q2,
            drinking_water_exam_df$Q3)

final1; final2


##문제2. 1번의 결과를 두 개의 데이터프레임으로 생성 후 상관관계 계수 제시

#요인별 변수 이용 데이터프레임 생성
f1 <- data.frame(drinking_water_exam_df$Q4,
                 drinking_water_exam_df$Q5,
                 drinking_water_exam_df$Q6,
                 drinking_water_exam_df$Q7)

f2 <- data.frame(drinking_water_exam_df$Q1,
                 drinking_water_exam_df$Q2,
                 drinking_water_exam_df$Q3)

#요인별 산술평균 계산
satisfaction <- round(f1$drinking_water_exam_df.Q4 + f1$drinking_water_exam_df.Q5 +
                        f1$drinking_water_exam_df.Q6 + f1$drinking_water_exam_df.Q7 /
                        ncol(f1),2)

closeness <- round(f2$drinking_water_exam_df.Q1 + f2$drinking_water_exam_df.Q2 +
                     f2$drinking_water_exam_df.Q3 / ncol(f2), 2)

#상관관계 분석
drinking_water_factor_df <- data.frame(satisfaction, closeness)
colnames(drinking_water_factor_df) <- c("제품만족도", "제품친밀도")
cor(drinking_water_factor_df)

'''           제품만족도 제품친밀도
제품만족도  1.0000000  0.4042153
제품친밀도  0.4042153  1.0000000'''

length(satisfaction); length(closeness);
#원본 데이터 길이와 동일함

#제품만족도, 제품친밀도 상관관계 분석 결과 
#0.4042153으로 다소 약한 양의 상관관계를 갖는다.
#그러므로 요인분석 결과 축소한 요인의 구조가 좋다고 판단할 수 있다.

댓글