[R] 연습

[R] 차원축소(MDS편)

Simon Yoon 2021. 12. 19. 23:17

이전 포스팅에서 차원축소의 방법 중 하나인 PCA를 연습했었다.

2021.12.11 - [[R] 연습] - [R] 차원축소 (PCA편)

 

이번 포스팅에서는 다차원 척도법(MDS: Multi Dimensional Scaling)을 연습하고자 한다.

다차원 척도법은 n개의 개체간의 유사성을 바탕으로 2/3차원의 저차원 공간에 나타낼 수 있도록 하는 방법이다.

예를 들어 한 회사에서 판매 전략을 세우기 위해 시장에서 판매되는 제품들을 조사한 후 유사성을 알아보고자 한다.

데이터를 바탕으로 제품들 사이의 유사성, 비유사성을 2차원 공간상에 시각적으로 표현하여 분석할 수 있을 것이다.

 

MDS에는 두 가지 방식이 있는데, 계량적 MDS(metric MDS), 비계량적 MDS(non-metric MDS)가 있다.

일단 이번 포스팅에서는 계량적 MDS 과정을 연습할 것이다.


이번 포스팅에서도 Cereals 데이터를 사용할 것이다. 77개의 제품들 간의 유사성을 바탕으로 스케일링을 하고 플롯까지 작성해 보겠다.

Cereals.csv
0.00MB
Cereals 데이터의 일부

일단 데이터에서 1) 결측치 제거, 2) 행 이름 변경, 3) 분석에 제외할 열 삭제(numeric data만 사용) 를 해줄 것이다.

 

# 데이터 준비하기
cereal <- read.csv("Cereals.csv")
summary(cereal)
colSums(is.na(cereal))
cereal[is.na(cereal$carbo), "carbo"] <- mean(cereal$carbo, na.rm = T)
cereal[is.na(cereal$sugars), "sugars"] <- mean(cereal$sugars, na.rm = T)
cereal[is.na(cereal$potass), "potass"] <- mean(cereal$potass, na.rm = T)
rownames(cereal) <- cereal[,1]
cereal <- cereal[,-c(1,2,3)]

Q. 전통적 다차원 척도법(Classical MDS)를 하려면?

A. stats 패키지의 cmdscale() 함수를 사용하자.

 

참고로 이번 코드에는 다음의 세 개의 패키지를 사용했다.

 

# 패키지 준비하기
library(magrittr)
library(dplyr)
library(ggpubr)

 

활용 방법은 다음과 같다.

 

# compute MDS
cereal.mds <- cereal %>% 
  dist() %>% 
  cmdscale() %>% 
  as_tibble()
colnames(cereal.mds) <- c("Dim.1", "Dim.2")

 

 

이렇게 하면 cereal.mds가 생성되고, 위의 사진과 같은 결과를 얻을 수 있다. 이 값을 바탕으로 2차원에 각 제품을 표시할 수 있게 된다.


2차원 플롯을 그릴 수 있는 코드는 다음과 같다.

 

ggscatter(cereal.mds, x = "Dim.1", y = "Dim.2",
          label = rownames(cereal),
          size = 1,
          repel = T)

 

플롯 생성 결과

 

위 처럼 플롯을 생성할 수 있는데, 자료가 많고 이름이 길다 보니 한눈에 보기 어렵다. 따라서 k-평균 군집화 방법을 통해서 총 5개의 군집으로 분류하고 이를 시각적으로 확인하고자 한다.


k-평균 군집화(k-means clustering) 방법과 시각화는 다음과 같이 작성할 수 있다.

 

# k-평균 군집화
cereal.clst <- kmeans(cereal.mds, 5)$cluster %>% 
  as.factor
cereal.mds <- cereal.mds %>% 
  mutate(group = cereal.clst)
  
# 플롯
ggscatter(cereal.mds, x = "Dim.1", y = "Dim.2",
          label = rownames(cereal),
          color = "groups",
          palette = "jco",
          size = 1,
          ellipse = T,
          ellipse.type = "convex",
          repel = T)

 

k-평균 군집화 이후 시각화 결과

 

결과 플롯을 보면 알 수 있듯이 좀 더 시각적으로 구별이 쉬워졌다. 회색 부분은 bran(겨)가 주성분인 제품들로, 오른쪽 상단의 제품군은 대부분 wheat(밀)이 제품명에 적혀있음을 알 수 있다.

'[R] 연습' 카테고리의 다른 글

[R] 기초 문법 1  (0) 2022.01.09
[R] 군집분석(k-means clustering편)  (0) 2021.12.26
[R] reshape2 패키지 활용하기  (0) 2021.12.18
[R] reshape 패키지 활용하기  (0) 2021.12.17
[R] 정규화(Normalization)편  (0) 2021.12.12