열렬히.뛰기

2022년 탐자 3차 시험

수학 & 통계 > 탐색적 자료분석 > 탐색적 자료분석 : 문제 > 2022년 탐자 3차 시험

문제

데이터셋은 iris 데이터를 이용했음. 특별히 준 데이터는 없었던 것으로 기억.

아래의 코드를 이용하면 iris 데이터를 얻을 수 있음.

r
library(datasets)
  1. iris 데이터의 차원을 축소하세요. 몇개의 요인 또는 주성분이 적합한가요? 왜 그런지 이유를 말해주세요.
  2. iris 데이터를 Petal.Length(꽃잎의 길이)만을 사용하여 품종을 구분해보시오. 이때 각 품종을 어떻게 구분할 수 있는지 설명하시오.
  3. 문제 2와 동일한 작업을 차원 축소된 데이터의 첫 번째 요인 또는 주성분을 사용하여 수행하시오. 결과를 비교하고 설명하시오.
  4. iris 데이터를 k-means 클러스터링 기법을 이용하여 군집화하시오. k=3일 때, 각 클러스터의 특징을 설명하시오.
  5. 가게에서 새로 구매한 iris 꽃 4개의 꽃잎 길이와 너비가 모두 동일하다고 가정하자. 이들의 품종을 구분하기 위해 문제 2, 3, 4에서 사용한 방법 중 어떤 것을 선택하겠습니까? 그 이유를 설명하시오.
  6. 가설: Sepal.Length(꽃받침의 길이)가 증가하면 Sepal.Width(꽃받침의 너비)도 증가한다. 이 가설이 맞는지 시각화를 통해 검증하시오. 이 과정에서 차원 축소 기법을 사용하는 것이 도움이 되었는지 설명하시오.

최종 코드

이 시험에서 성적은 받지 못했기에 해당 코드가 완벽한 정답이라고는 할 수 없음. 따라서 하나의 참고 예시로 보고, 여러가지 수단을 이용해서 문제를 풀 것.

r
## Title: Final Exam ##
## PID : 2018111373 ##
set.seed(100)

## Problem # 1 ##
rm(list=ls())
library(datasets)
str(iris)
summary(iris)

## NA 찾기
sum(is.na(iris))

## 상관계수와 표본공분산 보기
cor(iris[, 1:4])
cov(iris[, 1:4])

## pca 수행
pca1 = prcomp(iris[, 1:4])
pca2 = prcomp(iris[, 1:4])

windows()
par(mfrow=c(1,1))
biplot(pca2)
abline(v=0, col="blue", lty=2)
abline(h=0, col="blue", lty=2)

# 분산의 비율 측정
tmp = summary(pca2)
par(mfrow=c(1, 2))
screeplot(pca2)
screeplot(pca2, type='lines')
tmp$importance[3,]

## fa 수행
data = iris[, 1:4]
fa1 = factanal(data, factors=1, rotation='none')
fa2 = factanal(data, factors=1, rotation='varimax', scores="reg")
fa3 = factanal(data, factors=1, rotation='promax')

fa1$loadings
fa2$loadings
fa3$loadings

# 1번 결과 설명
# 우선 상관계수를 측정했을 때, 서로 간의 상관계수가 높은 항목이 굉장히 적은 편이다.
# 꽃받침(sepal)의 길이와 꽃잎(petal)의 길이, 그리고 꽃받침의 길이와 꽃잎의 너비,
# 꽃잎의 너비와 길이는 상관계수가 높지만, 나머지는 그렇지 못하다.

# pca를 통해서 주성분을 분석해보고, 설명되는 분산의 비율을 
# 보면 한 개의 주성분으로도 약 92%가 설명된다.
# 또, FA를 통해서 요인을 분석해 보아도, 1개의 요인으로
# 충분함을 알 수 있다. (회전하지 않은 것과 회전한 결과가 같다.)

# 따라서 1개의 주성분(또는 요인)이 적합하다.

## Problem # 2 ##
str(iris)
par(mfrow=c(1,2))
with(iris, boxplot(Petal.Length~Species))
hist(iris$Petal.Length)

# 1. 3가지 구간 찾기
summary(iris$Petal.Length[iris$Species == "setosa"])
summary(iris$Petal.Length[iris$Species == "versicolor"])
summary(iris$Petal.Length[iris$Species == "virginica"])

# setosa는 완벽하게 구분
# versicolor와 virginica 사이 겹치는 구간이 존재
# 다른 기준 없이 petal.length 만으로는 힘들다.

# 2. 구분짓기
plot(iris$Petal.Length, col=iris$Species)


## Problem # 3 ##
# 1. 3가지 구간 찾기
summary(fa2$scores[iris$Species == "setosa"])
summary(fa2$scores[iris$Species == "versicolor"])
summary(fa2$scores[iris$Species == "virginica"])

hist(fa2$scores)

# 역시 setosa는 완벽하게 구분
# versicolor와 virginica 사이 겹치는 구간이 존재
# 다른 기준 없이 petal.length 만으로는 힘들다.

# 2. 구분 짓기
par(mfrow=c(1,2))
hist(fa2$scores)
plot(fa2$scores, col=iris$Species, main="scores of fa2")


## Problem # 4 ##
h1 = hclust(dist(data, method = "euclidean"), method="average")
par(mfrow=c(1,1))
plot(h1)
rect.hclust(h1, k=3)


## Problem # 5 ##
# [답안]
# 1번째 방식의 경우 겹치는 구간이 존재하므로,
# 오직 꽃잎의 길이만 가지고 완벽히 구분하기에는 어려움이 존재한다.
# 
# 또, 차원 축소를 반영한 2번째 방식은 1번째 방식과 아무런 차이가 없다.
#
# 반면, 계층적 클러스터링을 사용한 3번째 방식의 경우 average linkage의 
# 특성 상 outlier에도 robust하다.
#
# 따라서, 다 같은 너비와 길이를 가진 꽃들을 3가지 종을 구분할 때는 
# 계층적 클러스터링을 선택하는 것이 올바른 방법이라고 생각한다.

## Problem # 6 ##
with(iris, plot(Sepal.Width~Sepal.Length,
     col = Species))

windows()
par(mfrow=c(1,3))
x1 = iris[iris$Species == "setosa",]
with(x1, plot(Sepal.Width~Sepal.Length))

x2 = iris[iris$Species == "versicolor",]
with(x2, plot(Sepal.Width~Sepal.Length))

x3 = iris[iris$Species == "virginica",]
with(x3, plot(Sepal.Width~Sepal.Length))

# 각각의 plot를 그려보면 더 길어질수록, 더 커진다는 가설이
# 성립함을 알 수 있다.
# 한편 이 데이터는 1가지 주성분(또는 요인)으로 대부분 설명 
# 가능하기 때문에 차원 축소가 큰 의미가 없다고 생각한다.