
제 1 유형
- 데이터셋 : HR-Employee-Attrition.csv
주어지는 데이터는 IBM의 근무자에 대한 직무정보와 퇴사여부를 정리한 것이다.
| 주요 컬럼 | 설명 |
| Attrition | Yes : 퇴사 , No : 퇴사하지 않음 |
1. 데이터에서 'Attrition'은 퇴사여부에 대한 종속변수에 해당한다.
종속변수의 값을 다음과 같이 수치로 변환하고 각 범주별 레코드 수를 계산하시오. (Yes → 1, No → 0)
# 1번
df <- read.csv("./sample_data/HR-Employee-Attrition.csv")
df$Attrition <- ifelse(df$Attrition =="Yes",1,0)
table(df$Attrition) # 각 범주별 레코드 수 계산

2. 데이터셋의 데이터타입별 컬럼 개수를 계산하고, 범주형 변수 중 유일한 값 1개만 가지고 있는 컬럼을 찾아내어
그 변수를 데이터에서 제거하시오.
# 2번
col <- c()
for(i in 1:ncol(df)){
if(mode(df[,i])=="character"){
col<- append(col,'chr')} else{
col <- append(col,'num')
}
}
table(col) # 데이터타입별 컬럼 개수
str(df) # 유일한 1개의 값을 가지는 범주형 변수 찾기 -> Over18
table(df$Over18)
df_new <- subset(df, select= -c(Over18)) # 값을 한개만 가지는 범주형 변수 제거 ; subset() 함수 사용
dim(df_new)


- 컬럼명을 이용해서 삭제하기 위해서는 subset() 함수를 사용한다.
- 컬럼번호를 이용해 삭제하는 방법도 있다. (df_new <- df[,-c(22)])
3. 원래 데이터에서 숫자형인 컬럼만 추출하여 새로운 데이터프레임을 생성하고,
각 변수간의 상관계수를 구하고 상관계수가 0.9 이상인 두 개의 컬럼을 찾아내어 그 변수 중 하나를 제거하시오.
| * dataset 의 var 에서 결측치를 찾아내고 해당 결측치를 new_value 로 대체하는 코드 - dataset$var[is.na(dataset$var)] <- new_value |
# 3번
n <- c() # ★
for(i in 1:ncol(df_new)){
if(mode(df_new[,i])!="character"){
n <- append(n,i)
}
}
df_number <- df_new[,n]
str(df_number) # 27 개의 행
result = cor(df_number,method="pearson") # 결측값 존재 -> 0 으로 대치
result[is.na(result)] <- 0
for(i in 1:27){
for(j in 1:27){
if((result[i,j]>=0.9) & (i != j)){
cat(colnames(df_number[i]),",",colnames(df_number[j]),":",result[i,j],"\n")
}
}
}

제 2 유형
- 데이터셋 : iris (R data set)
R의 iris 데이터셋을 이용하여 각 데이터에 따른 종의 분류를 시행해보고 이해 대한 결과에 대해서
(a) K=10 일 때 혼동행렬 이용 정확도 및 결과
(b) K=60 일 때 혼동행렬 이용 정확도 및 결과 를 보이시오.
| * 분석조건 - 데이터는 기존의 데이터를 무작위화(randomizing) 하여 사용 (무작위화 결과화면 명시) - 총 150 개 데이터 중 130 개를 학습에 사용. 나머지 20 개를 이용해 테스트한 결과를 나타냄 - 분석 전에 모든 숫자 컬럼에 대한 Min-Max 정규화를 수행 |
library(dplyr)
library(ggplot2)
# install.packages("caret")
library(caret) # ★ caret : 혼동행렬을 사용하기 위한 라이브러리
library(class) # knn 을 사용하기 위한 라이브러리
data(iris)
df<- iris
summary(iris)
# 데이터 무작위화
set.seed(123)
index <- runif(nrow(df))
df_random <- df[order(index),] # ★ df[order()]
# Min-Max 정규화
normal <- function(x){
return((x-min(x))/(max(x)-min(x)))
}
df_new <- as.data.frame(lapply(df_random[,-5],normal)) # species 열 제외 후 정규화 적용
summary(df_new) # 종속변수가 제거된 데이터
# train, test 분리
train <- df_new[1:130,]
Y_train <- df_random[1:130,5]
test <- df_new[131:150,]
Y_test <- df_random[131:150,5]
# KNN 적합 (K=10)
model1 <- knn(train=train, test=test, cl=Y_train, k=10)
table(factor(model1)) # 분류결과 확인 table(factor(model) ★
cm10 <- confusionMatrix(Y_test,model1)
cm10
acc10 <- cm10$overall[1]
# KNN 적합 (K=60)
model2 <- knn(train=train, test=test, cl=Y_train, k=60)
cm60 <- confusionMatrix(Y_test,model2)
cm60
acc60 <- cm60$overall[1]



- caret : 혼동행렬을 사용하기 위한 라이브러리
- class : knn 을 사용하기 위한 라이브러리
1. 난수함수를 통한 df_random 생성
2. df_random에 Min-Max 정규화 수행한 df_new 데이터셋 생성 (종속변수 없는 데이터셋) -> 여기서 train / test 분리
3. Y_train, Y_test 값은 df_random 에서 생성 (종속변수 있는 데이터셋)
'자격증 > 빅데이터 분석기사' 카테고리의 다른 글
| 로지스틱회귀(분류) in R (0) | 2022.11.25 |
|---|---|
| SVM in R (0) | 2022.11.25 |
| KNN in R (0) | 2022.11.25 |
| 의사결정나무 in R (1) | 2022.11.25 |
| 모의고사 1 (0) | 2022.11.24 |