열렬히.뛰기

2022년 탐자 2차 시험

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

문제

한글 해석본 (실제 시험에서는 영어로 나옴)

  1. 데이터셋 data.clin2를 생성해보기. 이때, 각 질문 Q1부터 Q10까지의 변수를 각 방문 시점 별로 분리하여 Q1_1, Q1_2, Q1_3, Q1_4, …, Q10_4와 같이 새로운 변수로 확장해야 함.
  2. 새 변수 만들기 + 상관관계
    1. 각 환자(ID)별로 모든 방문 시점에 대한 변수들의 평균을 계산하여 새로운 데이터셋 data.clin.mean을 만들기.
    2. 이후 data.clin2의 변수들(단, ID 열은 제외)에 대한 상관관계 행렬을 계산 및 해석하고, 변수들 간의 주목할 만한 상관관계와 그것이 데이터의 맥락에서 무엇을 의미하는지 논의해야 함.
  3. 동일한 환자에 대한 설문조사 데이터가 data_svy.csv 파일에 포함되어 있음.
    1. data.clindata.svy를 환자 ID를 기준으로 병합하기.
    2. data.clin2data.svy를 환자 ID를 기준으로 병합하기.
    3. data.clin.meandata.svy를 환자 ID를 기준으로 병합하기.
  4. 군집분석
    1. 병합된 데이터셋 3개 중에서 군집 분석을 수행하기에 가장 적합하다고 생각되는 데이터 선택하기. 각 데이터셋의 특성을 논의하고, 선택한 데이터셋이 왜 더 나은지에 대해 근거를 제시해야 함.
    2. 선택한 데이터셋에 대해 계층적 군집 분석을 사용하여 적절한 군집의 수를 결정하고, 군집화에서 중요한 역할을 하는 변수를 식별하기.

첨부파일

첨부파일prod-files-secure.s3.us-west-2.amazonaws.com 첨부파일prod-files-secure.s3.us-west-2.amazonaws.com

해답

1번

  • 여러모로 당황스러웠던 문제.
  • 노가다성이 강한 문제이므로 그냥 코딩 스킬을 잘 기르는 것이 중요하다고 생각
  • 하단의 코드가 정답이라기 보다는 참고용으로 쓸 것.
r
data.clin = read.csv("data_clin.csv")
head(data.clin)
str(data.clin)
summary(data.clin$visit)

library(reshape)
data.clin1 = data.clin
data.clin1$Q1_1 = data.clin[data.clin$visit==1,]$Q1
data.clin1$Q1_2 = data.clin[data.clin$visit==2,]$Q1
data.clin1$Q1_3 = data.clin[data.clin$visit==3,]$Q1
data.clin1$Q1_4 = data.clin[data.clin$visit==4,]$Q1

data.clin1$Q2_1 = data.clin[data.clin$visit==1,]$Q2
data.clin1$Q2_2 = data.clin[data.clin$visit==2,]$Q2
data.clin1$Q2_3 = data.clin[data.clin$visit==3,]$Q2
data.clin1$Q2_4 = data.clin[data.clin$visit==4,]$Q2

data.clin1$Q3_1 = data.clin[data.clin$visit==1,]$Q3
data.clin1$Q3_2 = data.clin[data.clin$visit==2,]$Q3
data.clin1$Q3_3 = data.clin[data.clin$visit==3,]$Q3
data.clin1$Q3_4 = data.clin[data.clin$visit==4,]$Q3

data.clin1$Q4_1 = data.clin[data.clin$visit==1,]$Q4
data.clin1$Q4_2 = data.clin[data.clin$visit==2,]$Q4
data.clin1$Q4_3 = data.clin[data.clin$visit==3,]$Q4
data.clin1$Q4_4 = data.clin[data.clin$visit==4,]$Q4

data.clin1$Q5_1 = data.clin[data.clin$visit==1,]$Q5
data.clin1$Q5_2 = data.clin[data.clin$visit==2,]$Q5
data.clin1$Q5_3 = data.clin[data.clin$visit==3,]$Q5
data.clin1$Q5_4 = data.clin[data.clin$visit==4,]$Q5

data.clin1$Q6_1 = data.clin[data.clin$visit==1,]$Q6
data.clin1$Q6_2 = data.clin[data.clin$visit==2,]$Q6
data.clin1$Q6_3 = data.clin[data.clin$visit==3,]$Q6
data.clin1$Q6_4 = data.clin[data.clin$visit==4,]$Q6

data.clin1$Q7_1 = data.clin[data.clin$visit==1,]$Q7
data.clin1$Q7_2 = data.clin[data.clin$visit==2,]$Q7
data.clin1$Q7_3 = data.clin[data.clin$visit==3,]$Q7
data.clin1$Q7_4 = data.clin[data.clin$visit==4,]$Q7

data.clin1$Q8_1 = data.clin[data.clin$visit==1,]$Q8
data.clin1$Q8_2 = data.clin[data.clin$visit==2,]$Q8
data.clin1$Q8_3 = data.clin[data.clin$visit==3,]$Q8
data.clin1$Q8_4 = data.clin[data.clin$visit==4,]$Q8

data.clin1$Q9_1 = data.clin[data.clin$visit==1,]$Q9
data.clin1$Q9_2 = data.clin[data.clin$visit==2,]$Q9
data.clin1$Q9_3 = data.clin[data.clin$visit==3,]$Q9
data.clin1$Q9_4 = data.clin[data.clin$visit==4,]$Q9

data.clin1$Q10_1 = data.clin[data.clin$visit==1,]$Q10
data.clin1$Q10_2 = data.clin[data.clin$visit==2,]$Q10
data.clin1$Q10_3 = data.clin[data.clin$visit==3,]$Q10
data.clin1$Q10_4 = data.clin[data.clin$visit==4,]$Q10

data.clin2 = data.clin1[,-c(2:12)]
head(data.clin2)
str(data.clin2)

2-1번.

  • 본격적으로 melt()cast()를 쓰는 문제
  • 수업시간에 해당 부분을 집중해서 듣지 않으면 절대 못 푸는 유형.
r
### 2-1. data.clin.mean 만들기
x = melt(data.clin, id=c("ID", "visit"))
head(x)
data.clin.mean = cast(x, ID~variable, mean)

2-2번.

  • 행렬이 너무 크다보니 조금씩 쪼개며 상관관계를 보고자 했음.

  • 의미는 대충 저렇게 썼으나 좀 더 좋은 해석이 나올 수 있지 않을까 생각함.

    (실제 시험 점수로 유추해 보았을 때 일부 감점을 당한 것으로 추정)

r
### 2-2. correlation 구하기
cor(data.clin2[, -c(1)])
cormat = as.matrix(cor(data.clin2[, -c(1)]))

## 행렬 일부 시각화 적용
names(data.clin2)
pairs(data.clin2[,c(2:11)]) 
pairs(data.clin2[,c(12:21)]) 
pairs(data.clin2[,c(22:31)]) 
pairs(data.clin2[,c(32:41)])

## <의미> 대각원소 근처의 경우 상관관계가 뚜렷하나, 
## 대각원소에서 떨어진 경우 상관관계가 뚜렷하지 않다.

3번

  • merge() 사용법을 모르면 아예 풀 수 없는 문제
  • 두 데이터프레임을 합치는 연습이 꼭 필요
r
data.svy = read.csv("data_svy.csv")
merged_1 = merge(data.clin, data.svy, by="ID")
merged_2 = merge(data.clin2, data.svy, by="ID")
merged_3 = merge(data.clin.mean, data.svy, by="ID")

4-1번.

  • 좋은 클러스터링을 위한 데이터를 고르고, 이를 왜 골랐는지 쓰는 문제
  • 하단의 예시는 완벽한 답안이 아니며, 참고용으로 생각할 것.
r
### 4-1 : 좋은 클러스터링 고르기

## data.clin1의 경우 visit이라는 변수를
## 제대로 반영하고 있지 않기에
## 좋은 선택이라고 할 수 없다.

## 또한 3번에서 보여진 바와 같이 data.clin2는 
## 각 변수별 상관관계가 뚜렷하지 않기 떄문에 
## 좋은 선택이라고 할 수 없다.

## 따라서 방문횟수(visit)의 효과를 최대한
## 뽑아내며 평균으로 차원을 축소한
## data.clin.mean이 가장 좋은 선택이다.

## 결과적으로, merged_3을 선택했다.

4-2번.

  • hclust()를 이용해 클러스터 갯수를 고르는 문제
  • 히트맵 등을 잘 사용하면 좋을 것 같다.
r
# 4-2 : 클러스터 갯수 고르기
hc = hclust(dist(merged_3, method = "manhattan"), method = "complete")

hc_2 = cutree(hc, k=2)
hc_3 = cutree(hc, k=3)
hc_4 = cutree(hc, k=4)
hc_5 = cutree(hc, k=5)

library(gplots)
heatmap.2(as.matrix(merged_3), density.info='none')

hist(merged_3$Q5)
summary(merged_3$Q5)
quantile(merged_3$Q5, c(0.25, 0.5, 0.75, 1))

merged_3$Q5_1[merged_3$Q5 < -0.316] = 1
merged_3$Q5_1[merged_3$Q5 >= -0.316 & merged_3$Q5 < 0.2135 ] = 2
merged_3$Q5_1[merged_3$Q5 >= 0.2135 & merged_3$Q5 < 0.6001] = 3
merged_3$Q5_1[merged_3$Q5 >= 0.6001 ] = 4

table(hc_4, merged_3$Q5_1)

# 우선 히트맵을 그려보면, id에 따른 분류와 관련 있는 것이 Q5이므로, Q5가 중요한 역할을 한다.
# Q5의 histogram을 그려보면 정규분포로 나뉘므로, 계층적 클러스터링 나무를 4개로 쪼개는 것이 가장 적합하다.

전체코드

r
## Title : Midterm Exam 2 ###
## PID : "2018111373"     ### 
set.seed(100)
your.PID = "2018111373"

## Problem # 1 ##
rm(list=ls())
getwd()
setwd("C:/Users/dlsfu/Desktop/EDA_rawData")

data.clin = read.csv("data_clin.csv")
head(data.clin)
str(data.clin)
summary(data.clin$visit)

library(reshape)
data.clin1 = data.clin
data.clin1$Q1_1 = data.clin[data.clin$visit==1,]$Q1
data.clin1$Q1_2 = data.clin[data.clin$visit==2,]$Q1
data.clin1$Q1_3 = data.clin[data.clin$visit==3,]$Q1
data.clin1$Q1_4 = data.clin[data.clin$visit==4,]$Q1

data.clin1$Q2_1 = data.clin[data.clin$visit==1,]$Q2
data.clin1$Q2_2 = data.clin[data.clin$visit==2,]$Q2
data.clin1$Q2_3 = data.clin[data.clin$visit==3,]$Q2
data.clin1$Q2_4 = data.clin[data.clin$visit==4,]$Q2

data.clin1$Q3_1 = data.clin[data.clin$visit==1,]$Q3
data.clin1$Q3_2 = data.clin[data.clin$visit==2,]$Q3
data.clin1$Q3_3 = data.clin[data.clin$visit==3,]$Q3
data.clin1$Q3_4 = data.clin[data.clin$visit==4,]$Q3

data.clin1$Q4_1 = data.clin[data.clin$visit==1,]$Q4
data.clin1$Q4_2 = data.clin[data.clin$visit==2,]$Q4
data.clin1$Q4_3 = data.clin[data.clin$visit==3,]$Q4
data.clin1$Q4_4 = data.clin[data.clin$visit==4,]$Q4

data.clin1$Q5_1 = data.clin[data.clin$visit==1,]$Q5
data.clin1$Q5_2 = data.clin[data.clin$visit==2,]$Q5
data.clin1$Q5_3 = data.clin[data.clin$visit==3,]$Q5
data.clin1$Q5_4 = data.clin[data.clin$visit==4,]$Q5

data.clin1$Q6_1 = data.clin[data.clin$visit==1,]$Q6
data.clin1$Q6_2 = data.clin[data.clin$visit==2,]$Q6
data.clin1$Q6_3 = data.clin[data.clin$visit==3,]$Q6
data.clin1$Q6_4 = data.clin[data.clin$visit==4,]$Q6

data.clin1$Q7_1 = data.clin[data.clin$visit==1,]$Q7
data.clin1$Q7_2 = data.clin[data.clin$visit==2,]$Q7
data.clin1$Q7_3 = data.clin[data.clin$visit==3,]$Q7
data.clin1$Q7_4 = data.clin[data.clin$visit==4,]$Q7

data.clin1$Q8_1 = data.clin[data.clin$visit==1,]$Q8
data.clin1$Q8_2 = data.clin[data.clin$visit==2,]$Q8
data.clin1$Q8_3 = data.clin[data.clin$visit==3,]$Q8
data.clin1$Q8_4 = data.clin[data.clin$visit==4,]$Q8

data.clin1$Q9_1 = data.clin[data.clin$visit==1,]$Q9
data.clin1$Q9_2 = data.clin[data.clin$visit==2,]$Q9
data.clin1$Q9_3 = data.clin[data.clin$visit==3,]$Q9
data.clin1$Q9_4 = data.clin[data.clin$visit==4,]$Q9

data.clin1$Q10_1 = data.clin[data.clin$visit==1,]$Q10
data.clin1$Q10_2 = data.clin[data.clin$visit==2,]$Q10
data.clin1$Q10_3 = data.clin[data.clin$visit==3,]$Q10
data.clin1$Q10_4 = data.clin[data.clin$visit==4,]$Q10

data.clin2 = data.clin1[,-c(2:12)]
head(data.clin2)
str(data.clin2)

## Problem # 2 ##
### 2-1. data.clin.mean 만들기
x = melt(data.clin, id=c("ID", "visit"))
head(x)
data.clin.mean = cast(x, ID~variable, mean)

### 2-2. correlation 구하기
cor(data.clin2[, -c(1)])
cormat = as.matrix(cor(data.clin2[, -c(1)]))

## 행렬 일부 시각화 적용
names(data.clin2)
pairs(data.clin2[,c(2:11)]) 
pairs(data.clin2[,c(12:21)]) 
pairs(data.clin2[,c(22:31)]) 
pairs(data.clin2[,c(32:41)])


## 대각원소 근처의 경우 상관관계가 뚜렷하나,
## 대각원소에서 떨어진 경우 상관관계가 뚜렷하지 않다.

## Problem # 3 ##
data.svy = read.csv("data_svy.csv")
merged_1 = merge(data.clin, data.svy, by="ID")
merged_2 = merge(data.clin2, data.svy, by="ID")
merged_3 = merge(data.clin.mean, data.svy, by="ID")


## Problem # 4 ##
### 4-1 : 좋은 클러스터링 고르기

## data.clin1의 경우 visit이라는 변수를
## 제대로 반영하고 있지 않기에
## 좋은 선택이라고 할 수 없다.

## 또한 3번에서 보여진 바와 같이 data.clin2는 
## 각 변수별 상관관계가 뚜렷하지 않기 떄문에 
## 좋은 선택이라고 할 수 없다.

## 따라서 방문횟수(visit)의 효과를 최대한
## 뽑아내며 평균으로 차원을 축소한
## data.clin.mean이 가장 좋은 선택이다.

## 결과적으로, merged_3을 선택했다.


# 4-2 : 클러스터 갯수 고르기
hc = hclust(dist(merged_3, method = "manhattan"), method = "complete")

hc_2 = cutree(hc, k=2)
hc_3 = cutree(hc, k=3)
hc_4 = cutree(hc, k=4)
hc_5 = cutree(hc, k=5)

library(gplots)
heatmap.2(as.matrix(merged_3), density.info='none')

hist(merged_3$Q5)
summary(merged_3$Q5)
quantile(merged_3$Q5, c(0.25, 0.5, 0.75, 1))

merged_3$Q5_1[merged_3$Q5 < -0.316] = 1
merged_3$Q5_1[merged_3$Q5 >= -0.316 & merged_3$Q5 < 0.2135 ] = 2
merged_3$Q5_1[merged_3$Q5 >= 0.2135 & merged_3$Q5 < 0.6001] = 3
merged_3$Q5_1[merged_3$Q5 >= 0.6001 ] = 4

table(hc_4, merged_3$Q5_1)

# 우선 히트맵을 그려보면, id에 따른 분류와 관련 있는 것이 Q5이므로, Q5가 중요한 역할을 한다.
# Q5의 histogram을 그려보면 정규분포로 나뉘므로, 계층적 클러스터링 나무를 4개로 쪼개는 것이 가장 적합하다.