YOGYUI

제2회 빅데이터 분석기사 실기시험 후기 본문

Study/자격증

제2회 빅데이터 분석기사 실기시험 후기

요겨 2021. 6. 20. 12:34
반응형

오랜만에 서울 간 김에 하루 찐하게 놀다가 이제서야 부랴부랴 후기를 작성해본다

 

시험은 서울시 금천구 가산동에 위치한 한국소프트웨어인재개발원에서 치렀다

14 고사실이었나? 기억이 벌써 가물가물

(ADP 실기도 동일 고사장에서 쳤었는데, 신기하게 ADP 실기때랑 같은 교실에서 쳤다... 인연인가)

 

응시자가 생각했던 것보다 많아 꽤 놀랐다

데이터 분석이라는 직업군이 여전히 HOT하다는 걸 방증하는게 아닐려나?

(물론 이 자격증 땄다고 해당 직업군에 종사한다는 말은 아니지만...)

 

9시 40분쯤에 입실해서 남는 시간동안 크롬 방문 히스토리를 살펴보니 ADP 실기로 구름(goorm) IDE로 치른 이력이 남아있었다... ADP도 이제 클라우드 환경에서 치르나? 내가 칠 땐 R Studio Server로 했었는데 ㅎㅎ (python은 주피터)

 

11시 30분부터 퇴실 가능했는데, 시간되자마자 나가는 사람이 2명 있었다

나가는 발걸음이 가벼운 걸로 봐서는 여유롭게 다 푼것 같았다 ㅋㅋ

나도 대충 마무리하고 11시 50분쯤 퇴실했다

 

데이터 불러오기 및 저장하기는 미리 템플릿으로 작성되어 있어서 고민할 필요가 없었다

a <- read.csv('/data/data.csv')
# write.csv(data.frame(ID=..., VAR=...), '수험번호.csv', row.names = F)

이런 느낌으로 코드에 이미 작성이 되어 있었다

"데이터 불러오기가 안돼요~, 저장하기가 안돼요~" 뭐 이런 문의사항은 사전에 차단해버렸다고나 할까...

수험자 입장에서는 맘편하지만 시험의 의미가 약간 퇴색해버렸다는 생각이 들었다

 

문제를 복원해서 게시하거나 공유하면 형사처벌을 받을 수 있다고 하니 두루뭉술하게 적어봐야겠다

어차피 기억도 잘 안난다

1. 단답형

데이터 전처리 관련된 문제 - 2문항 출제

- 이상치(outlier) 정의, 결측값 (missing value, NA) 처리 방식 (대치법, Imputation의 종류)

 

앙상블 학습과 관련된 문제 -  2문항 출제

- 부스팅 정의, Gradient Boosting Machine (GBM) 정의
  ('경사하강법'이 문제에 명시되어 있으므로 GBM이 맞는듯)

- 앙상블 학습은 출제할 수 있는 개념이 많으니 향후 응시자들은 개념을 유념해서 공부해두는게 좋을 듯

  (배깅, 부스팅, 랜덤포레스트, GBM, Adaboost 등등)

 

인공신경망 출력값 계산 - 1문항 출제

- 은닉층 노드값과 weight 및 bias 값을 실수형으로 준 뒤 RELU activation function의 최종 출력값 계산

- 간단한 수학 계산, 일반적인 RELU랑 약간 다르게 정의한게 특징이랄까?
  어차피 sigmoid나 tanh 활성화 함수는 공학용 계산기 주지 않는 이상 풀지도 못하니..

 

지도학습/비지도학습 구분 문제 - 1문항 출제

ROC Curve 정의 문제 - 1문항 출제

하이퍼파라미터 정의 문제 - 1문항 출제

 

나머지 2문제는 완전히 기억에서 지워져버렸다...

시험 끝나고 나오자마자 메모 좀 해둘걸 ㅠㅠ

다른 응시자 후기도 살펴보시길...

변수 선택법 (전진선택/후진제거/stepwise) 정의 - 1문제

과적합(overfitting) 정의 - 1문제

2. 제1유형

통계분석 문제도 한문제 정도 나오지 않을까하는 예상은 보기좋게 빗나갔다

모두 데이터 전처리와 관련된 문제였고, 별다른 패키지 활용 없이 모두 인덱싱만으로 해결 가능했다

2.1. 특정 변수의 값을 토대로 sorting한 후 10번째 값보다 큰 값들은 10번째값으로 치환한 후 평균 산출

sorted <- sort(data$var, decreasing = TRUE)
value <- sorted[10]
data$var[data$var > value] <- value
print(mean(data$var))

대충 이런식으로 풀었던 것 같다 

2.2. 이상치 판별 후 이상치들의 합 산출

이상치 판별 기준은 문제에 주어진다 (평균으로부터 얼마나 떨어져있는지)

val_mean <- mean(data$var)
val_sd <- sd(data$var)
lower <- val_mean - 1.5 * val_sd
upper <- val_mean + 1.5 * val_sd
outliers <- data[data$var < lower | data$var > upper, ]
print(sum(outliers$var))

※ 실제 문제는 추출 후 다른 변수의 합산을 구하라고 했던 것 같다

2.3. 결측치 대체 후 표준편차 차이 산출

데이터 중 선행 80%를 추출해서 결측치를 특정값으로 대체 후 전후 통계량 차이 계산

n1 <- nrow(data)
n2 <- n1 * 0.8
data2 <- data[1:n2, ]

sd_prev <- sd(data2$var, na.rm = T)
data2$var[is.na(data2$var)] <- median(data2$var, na.rm = T)
sd_next <- sd(data2$var, na.rm = T)

print(sd_next - sd_prev)

문제가 기억이 안나서 2번이랑 3번이 서로 섞였을 수도 있다 ㅋㅋㅋ

대충 어떤 형식으로 출제되는지만 파악하면 될 듯

3. 제2유형

택배(?) 상품이 정시에 배송된 경우를 분류하는 문제로, 정시에 분류될 '확률'을 csv 파일로 생성하여 제출하는 문제

예시에서 나왔던 케이스랑 별반 다르지 않다

 

주최측이 나름 대형 사고를 쳤다 

문제에는 '0'이 정시 도착, '1'이 정시 미도착이라고 기재되어 있는데, 시험 시작 후 30분? 쯤 지났을 때 클라우드 공지로 라벨링이 반대가 되었다고 알림이 떴다...

나름 빨리 수정해줬다고는 하지만 그래도 문제 검토를 충분히 하지 않은 것 같아보여 주최측이 이 시험에 얼마나 진심인지를 의심하게 만들기 충분했다

 

어차피 데이터셋에서 해당 라벨은 0, 1 수치형으로 되어 있어 factor형으로 바꿔줘야 하기에 큰 문제는 없었다

data$label <- factor(data$lavel)
# levels(data$label) <- c("Y", "N") # 수정 공지 전
levels(data$label) <- c("N", "Y") # 수정 공지 후

별다른 전처리 없이 정규화, 표준화만 진행하고 훈련데이터를 홀드아웃해서 glm, randomForest, rpart, svm 등 모델을 구축해서 ROC-AUC랑 혼동행렬 작성 후 accuracy만 측정해서 제일 좋은 모델을 골라서 제출했다

 

EDA 과정에서

- 변수간 상관계수는 모두 절대값 0.5 이하로 약한 상관관계였다

- near Zero Variance 변수는 없었다

아무래도 시각화가 제공되지 않다보니 EDA 과정에서 통찰을 얻어내기는 불가능에 가까웠다...

진짜 고수라면 숫자만 보고 뭔가 중요한 걸 캐치할 수 있지 않았을까?

 

randomForest 학습할 때 문제가 있었는데, 뭔 수를 써도 자꾸 IDE가 죽어버렸다

뭔일인가 싶어 ntree 값을 낮추니 정상적으로 동작했다 (ntree default는 500)

구문 하나 돌리는데 일정시간 이상 소요되면 죽여버리는 거 아닌가? 싶은 생각이 들었다

(코드 전체 수행 시간도 1분으로 제한되어 있어, 모델 여러개를 학습한 뒤 vote 등 앙상블 처리하는 건 꿈도 못꿨다)

- 클라우드 특성상 tree 500개 다 돌리기엔 리소스가 부족하다고 한다

 

시각화가 안되니 OOB(out-of-bag) 감소량을 눈으로 확인할 수 없어 do.trace 옵션도 켜줬다

model_rf <- randomForest(label ~ .-ID, data, ntree = 300, do.trace = T)

대충 100개 넘어가면 OOB 감소량이 saturation되는 것 같아 ntree=200으로 고정했다

 

idx <- caret::createDataPartition(data$label, p = 0.8)
train <- data[idx$Resample1, ]
validation <- data[-idx$Resample1, ]

model <- randomForest(label ~ .-ID, data = train, ntree = 200, do.trace = T)
yhat_resp <- predict(model, newdata = validation, type = 'response')
caret::confusionMatrix(validation$label, yhat_resp)

훈련데이터 홀드아웃 후 검증 데이터에서의 분류 결과 대부분 모델들이 accuracy는 대충 56% ~ 60% 수준으로 굉장히 낮게 나와 당황스러웠다

이리저리 데이터를 조작해봐도 결과가 크게 좋아지지 않아 그냥 포기하고 그 중에 제일 분류 성능이 좋은 randomForest를 선정해 전체 데이터를 다시 학습하고 결과물을 제출했다

 

단답형에서 20점이상 획득하고, 제1유형을 다 맞췄다는 건방진 가정 하에 제 2유형에서 최소한 10점만 먹어도 합격이라는 생각에 크게 고민하지 말자는 생각을 했다 ㅋㅋ (랜덤하게 제출하지만 않으면 0점 처리는 안하겠지!)

개인적으로 시각화가 되지 않으면 많은 걸 할 수가 없다...ㅠㅠ

4. 총평

코드 자동완성이 되지 않는 건 크게 문제가 되지 않았다

어차피 R은 파이썬이랑 달리 문법 자체도 크게 어렵지 않고 함수명도 직관적이라 필요한 함수 몇개만 외워가면 OK

 

메모장을 쓸 수 있다고 해서 꽤나 유용하게 사용했다

(수험번호를 적어두거나, 코드 디버깅할 때 메모장에 붙여넣은 후 한줄씩 뭐가 잘못됐는지 판단하는 용도로 활용)

- 다른 응시자분들 후기를 보니 부정행위 용도로 사용하는 걸 목격했다는 분들도 있다 ㅋㅋㅋ (시험 시작 전에 이것저것 미리 적어두는 용도?? 양심적으로 응시하는 사람들을 위해 조치가 있어야 할 듯 하다)

 

시각화가 제공되지 않기 때문에 EDA에 한계가 있다

애초에 빅데이터 분석의 핵심 역량 중 하나가 시각화 및 결과물 해석을 통한 통찰인데 그 과정이 통째로 빠져있으니 "이제 진짜 데이터 분석하는 사람에게 주는 자격증이 맞나?"하는 의구심이 들었다

 

클라우드 IDE의 한계가 너무 절실히 와닿았다

시각화도 안되고... 수행 시간 한계도 있고... 디버깅도 불가능하고... 라인 단위 수행도 안되고...

대개 코딩 테스트용으로 쓰는 툴인데, 이걸 데이터 분석에도 적용하는게 맞나? 하는 의구심만 증폭해버렸다 ㅎㅎ...

 

단답형 개념만 충실히 공부해두면 (어차피 필기 때문에 해야 하는게 맞지만...) 시험 시간이 부족할 일은 없을 것 같다

 

합격은 무난히 할 것 같은 자신감이 있어 이렇게 글을 적긴 하는데 떨어지면 어떡하지? ㅋㅋㅋ 엄청 쪽팔릴 것 같다

합격자 발표는 7월 16일(금)로 예정되어 있다

 

그동안 다음 시험은 뭘 칠지 고민해봐야겠다

(SQL 전문가 시험은 42회차가 9월 5일에 치러진다)

반응형
Comments