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