본문 바로가기
Certificates

[2021.12.04] 빅데이터 분석기사 3회 실기 후기(탈락 예정...에서 합격!!)

by Rosmary 2021. 12. 5.
728x90
반응형

 

 

 

 

 

 

어제 3회차 빅데이터 분석기사 실기 시험을 치렀다. 원래 어제 시험이 끝나 귀가하고 후기 포스팅을 바로 쓰려 했으나, 필자가 시험 전날 밤 일을 마치고 꼬박 날밤을 샌 뒤 시험장에 들어간 탓에, 시험 끝나고 집에 오자마자 뻗어버렸다. 

 

필자는 필기 시험을 2회차(실상 1회차)에 통과하긴 했지만 업무가 너무 바빠 실기를 준비할 시간도 없었던 것에 더해 - 사실 필기도 정말 어렵게 통과했다. 후기는 여기로 -  2회차 시험의 실기 경향이나 한 번 확인하고 갈 겸해서 2회차 실기를 바로 응시하지 않았다. 준비 기간을 길게 잡아 이번 12월 3회차 실기를 준비하려했으나, 9월부터 업무가 다시 미친듯이 몰려들어 준비를 제대로 못해 내년으로 미룰까 하다가, 내년에도 똑같은 상황이 반복될 듯 해서 올해 시험에서 떨어지더라도 시험장 분위기나 한 번 확인해보자는 의도로 시험을 신청하게 되었다. 

 

다행히 단답식을 제외한 작업형은, 반복적으로 코딩 연습을 했다면 크게 어려운 시험은 아니기 때문에, 시간을 길게 두고 실기 준비를 하시는 분들이라면 큰 어려움 없이 통과할 수 있는 시험이라는 것이 필자의 소견이다. 아, 그렇다고 필자가 이번 시험의 통과를 자신있게 말하지는 못하겠는것이, 밤을 새서 원체 비몽사몽이었던데다, 작업형 문제에서 코딩 에러가 뜬 것을 약 30분 정도 처리하지 못해 당황한 상태로 문제를 제대로 마무리하지 못하고 제출해버렸기 때문이다... 우는 소리 하기 싫지만 필자가 이번 시험을 통과 못 할 가능성도 적지는 않다는 생각 때문에 최대한 기억이 살아있을 때, 시험 후기를 포스팅으로 남기려 한다.

 

 

 

1. 빅데이터 분석기사 실기 시험 문제 유형

 

빅데이터 분석기사의 실기 시험은 크게 2가지 문제로 분류할 수 있다. 주관식으로 답을 작성하는 단답형 10문제와 Python과 R로 코딩한 결과를 제출하는 작업형 4문제로 나뉜다. 작업형은 다시 1유형 3문제, 2유형 1문제로 나뉜다.

 

 

(1) 단답형

 

먼저 단답형 10문제. 빅데이터 분석과 관련된 통계 내용과 머신러닝 관련 용어에 대해 물어보는 주관식 문제로, 전체 100점 중 30점이 배정되어 있다. 국가자격증은 전체 점수의 60% 이상만 득점하면 통과되기 때문에, 사실상 단답형을 제외한 나머지 문항을 모두 맞아도 통과되긴 한다. 하지만, 작업형 문제 중 40점이 배정된 2유형 문제의 경우 명확한 채점 기준이 공개되지 않아 결과가 제대로 출력되어도 만점을 받을 수 있다는 확신이 들기 어렵다는 특성으로 인해 어느 정도 통계 및 머신러닝 관련 용어들에 대한 개념은 정리하고 준비해야한다.

 

개정 전의 정보처리기사 실기 시험도 동일한 유형의 단답형 문제가 출제되었는데, 이러한 유형의 문제는 어떤 문제가 출제될지도 알 수 없기 때문에 준비가 상당히 어렵다. 따라서 직접 본 시험에 들어가기 전에도 필자는 단답형 때문에 약간의 스트레스를 받았는데, 정말 다행히도 개정 전 정보처리기사처럼 광범위한 범위에서 문제가 출제되는 것이 아니라 필기 시험 정도의 범위 내에서 용어들이 출제되었기 때문에 필기 직후 바로 실기를 응시하는 분들이라면 큰 어려움은 없을 듯 하다. 

 

 

(2) 작업형

 

작업형은 총 4문제다. 4문제 중 3문제는 작업형 1유형, 나머지 한 문제는 작업형 2유형이다. 작업형 1유형의 3문제는 30점이, 작업형 2유형은 40점이 배정되어 있다. 

 

작업형 1유형은, Python을 기준으로 설명하자면, 통계분석 패키지인 pandas를 얼마나 능숙하게 사용할 수 있느냐에 따라 정답 제출의 성공 여부가 갈린다고 보면 된다. 특히 DataFrame 및 Series를 다루는 부분에 있어 능숙해진다면, "어?? 이렇게 쉬운 문제가 국가 기술 시험에 나와도 되는건가??"라는 시덥지 않은 의문을 가지고 문제를 풀 수 있다.  

 

작업형 2유형은 여러 분석 모델을 적용하여, 특정 특성치 데이터를 토대로 결과를 예측하는 문제다. 시험 주관기관인 데이터진흥원의 시험 소개자료를 보면, 실기에서 데이터의 수집, 전처리, 모형 구축, 모형 평가를 평가 과목 세부항목으로 지정해놓았다. 따라서 데이터의 수집, 전처리, 모형 구축, 평가와 관련된 내용이 평가 대상으로 포함되지는 않더라도 저 절차와 관련된 코드를 능숙하게 사용하는 것이 매우 중요하다. 작업 1유형과 달리 pandas 뿐만 아니라 데이터 전처리, 모델링과 관련된 Scikit Learn 패키지의 사용법도 알아야하며, 필요하다면 numpy도 사용할 수 있어야 한다. 

 

 

 

(3) 시험 시간

 

시험 시간은 총 3 시간이다. 14문제 중 10문제는 단답형이니 3시간이라는 시간이 굉장히 길게 느껴질 수 있는데, 만에 하나 코딩하다가 에러 하나 해결 못해서 20분~30분이 지체되는 순간 이 시험이 나가리될 가능성이 굉장히 높아진다(필자도 이 때문에 나가리 될 뻔했다...). 따라서 필자가 추천하는 시험 시간 배분은, 최대한 빠르게 단답형을 마무리하고 작업형 1유형은 문제 당 약 30분, 나머지 시간에 작업형 2유형 문제에 투자하는 것이다. 단답형의 경우 문제를 봐서 답이 안떠오르면 풀 수 없기 때문에 괜히 시간 낭비 하지말고 빨리 넘어가는 것이 좋다.

 

 

 

 

 

2. 시험 준비

 

(1) 시험 준비 계획

 

시험 준비는 9월 말 무렵에 계획이 끝나 있었다. 지난 필기 시험처럼 밤에 잠을 3시간만 자면서 준비하기 싫었기 때문에 8월에 2차 시험 내용을 대략적으로 확인한 뒤 계획을 끝내고 9월부터 시작하려 했으나... 먹고 살려면 일은 열심히 해야되니 일에 치여 계획을 못 세우고 있다가 추석 연휴 찬스를 사용하여 계획을 마무리했다. 

 

처음 세웠던 계획은 다음과 같다. 먼저 10월 한 달 간 pandas 패키지에 대해 학습하고 최대한 능숙하게 다룰 수 있도록 연습을 많이 하는 것이다. 이렇게 pandas에 익숙해진다면 11월 2째 주 무렵부터 데이터 모델링과 관련있는 Scikit Learn과 numpy, scipy등의 연관 패키지에 대해 학습하고 연습하는 것을 다음 목표로 잡았다. 작업 유형은 위와 같이 준비하되, 단답형은 틈틈히 필기 책에서 주요 개념을 재정리 하는 것으로 계획을 세웠다..............만......

 

 

 

(2) 실제 시험 준비 과정

 

10월 초부터 고객사들의 서버가 연달아 뻗어버리는 바람에 외근과 야근이 부쩍 늘어났고, 이 와중에 팀원 1명이 줄어들어 일이 곱절로 늘어버렸다. 하하하하ㅏㅏㅏㅏㅏ 시험 준비를 하라는 건지 말라는 건지 원.... 

 

결국 어느 정도 급한 불을 끝 11월부터 pandas 패키지에 대해 본격적으로 공부를 시작할 수 있었다. 시중에 pandas 관련 서적들이 존재하기는 하지만 대부분이 시각화와 관련된 내용이라 데이터의 편집 및 수정과 관련된 내용이 명시된 서적이 적지 않아 서적은 큰 도움이 되지 않는다. 대신, 필자는 pandas의 공식 documentation과 유투브의 pandas 관련 영상 일부를 참고하여 학습을 진행했다. 

 


pandas 공식 Documentation 페이지

YouTube 참고 영상 

-> 나도코딩님의 데이터 분석 관련 pandas 영상이다. 16회차의 데이터 수정 관련 코드까지 능숙하게 작성할 수 있다면 작업형 1유형은 어려움 없이 풀어나갈 수 있다.

*  필자가 pandas를 공부하며 사용했던 DataFrame 샘플 자료(csv)

100Records.csv
0.03MB


 

원래 계획했던 일정 중 한 달이 통째로 사라졌기 때문에 별 수 없이 야근이 끝나고 돌아오더라도 새벽에 공부를 진행할 수 밖에 없었다. 다행히, 천만 다행히도, 필자의 주력 언어가 Bash와 Python인데다 개발자는 아니더라도 Python의 기본 기능은 눈을 감고 사용할 정도는 되었기 때문에, 시간이 없는 와중에도 시험 일주일을 남긴 시점에서 pandas를 어느 정도 사용할 수 있는 수준이 되었다. 

 

시험이 일주일 앞으로 다가온 11월 29일 금요일부터, 본격적으로 데이터 전처리, 모델링과 관련된 내용을 학습하려 했는데... 그 전 화요일에 갑자기 금요일날 지방 출장을 가달라는 연락을 받았다. 그 다음주 월,화도 같은 곳으로 지방 출장이 잡혔다. 무려 380km나 떨어진 곳이다. 별 수 없이 화요일에 전화를 받자마자 서점에 가서 빠르게 실기 시험을 준비할 수 있는 책을 하나 구매하여 금요일 출장 이후 일요일 하루(토요일은 김장을 했다...)동안 구입한 책을 붙잡고 미친듯이 전처리와 모델링 절차를 무작정 반복연습했다.  

 

필자가 구입한 실기 수험서다. 원래 수험서 사는 것을 좋아하지 않는데, 시간이 영 없어서 구매할 수 밖에 없었다.

 

다행히 필자가 구입한 수험서는 필자가 학습하지 못했던 데이터 전처리와 모델링 관련 부분이 명쾌하게 설명이 잘 되어 있어, 일요일 하루 동안 Logistic 분석 모델 하나만을 사용하여 전처리, 모델링, 평가 등을 나름대로 흉내낼 수 있을 정도까지 되었다. 

 

마지막 주 주중에는 여러 모델링에 대한 개념과 코딩 연습을 진행하려 했으나... 수요일까지 바쁘다가 목요일 저녁이 되어서야 공부할 시간이 났다. "하... 젠장 시험 포기할까..."라는 생각을 하다가 그래도 끝까지 해보는게 낫겠다 싶어, 목요일 저녁 하루동안 일요일에 연습했던 분석과정을 확실하게 복습하고, 금요일 저녁에 밤을 새워 모델링 개념학습과 연습을 진행한 뒤, 시험장에 들어가기로 결정했다(단답형 준비는 그냥 던져버렸다). 다행히 그 이틀 동안은 저녁에 아무 일도 일어나지 않아 필자가 오롯이 시험에만 몰두할 수 있었다. 

 

정리하자면, 필자가 이번 실기 시험을 준비한 순수 시간은 약 100시간 정도이며, 이 중 85시간만 pandas의 기본 기능을 익히는데 할애했다. 단답형은 아예 준비도 못했기 때문에 시험장에 들어가기 전만 하더라도 이번 시험 결과에 대한 기대가 크지 않을 수 밖에 없었던 상황이었다.

 

 

 

 

3. 시험 당일

 

시험 당일의 아침 해가 뜨기 시작하면서, 필자도 슬슬 졸음이 몰려오기 시작했다. 하긴, 그 전날도 외근 나갔다가 끝나고 카페에서 12시까지 시험준비하고 들어왔지, 집에 돌아와서도 계속 시험 준비를 했지, 그러니 피곤할 수 밖에 없었다. 한 30분만 잠깐 눈을 붙이고 일어나기로 한다. 

 

일어나니 핸드폰 알람이 미친듯이 울고있는 중이었고, 시계를 보니 집을 떠나야 하는 시간이 10분 정도 밖에 남지 않았다. 남은 10분동안 초스피드로 나갈 준비를 하고 시험장으로 빠쁘게 이동한다. 

 

시험장은 강남 어느 곳이었는데, 교통이 좋은 곳에 위치한 시험장이라 그런지 다행히 늦지 않게 도착할 수 있었다. 필자는 시험 주관기관에서 공지한 도착 권장 시간인 9시 30분이 약간 넘은 시점에서 필자의 시험 자리에 앉을 수 있었다. 

 

밤을 샌 것과 더불어, 아침에도 우당탕탕 뛰어나왔고, 시험장은 따뜻하니 정신이 없는데 졸음을 쏟아진다. 시험까지 30분이 남았는데 책도 안들고 왔다. 시험 페이지에 접속만 한 채로 시험 시작 전까지 간간히 졸면서 피로를 회복해보려 했다. 

 

시험 시작 3분 정도를 남기고 슬슬 정신을 챙겨본다. 그리고 시험 시작.

 

 

 

(1) 단답식

 

단답식은 영문 또는 한글로 띄워쓰기 없이 작성하면 된다고 안내에 명시되어 있다.

 

- 단답식 첫 문제... 첫 문제부터 모르는 것이 나온다. 이건 뭔 소리야??? 몰라, 패스.

 

- 두 번 째 문제. "서로 다른 데이터의 정규화가 필요한 이유에 대해 설명하는 문장이 있고, 정규화를 하는 이유는 두 그래프의 (   )가 다르기 때문이다"라는 취지로 문제가 나왔다. 필자의 답은 분산. 분포라고 적었는지 분산이라 적었는지 헷갈린다.

 

- 세 번 째 문제는 월, 일이 어쩌구 저쩌구라는 문제였던 것으로 기억하는데 이것도 몰라. 패스.

 

- 네 번 째 문제. 이것도 문제 자체가 기억이 안난다. 패스.

 

- 다섯 번 째 문제. "서로 다른 모델을 사용하여 분석하는 분석 기법은?"의 취지로 문제가 나왔다. 필자의 답은 앙상블.

 

- 여섯 번 째 문제. "정규화인데 0~1사이 값으로 정규화하는 것은??" 필자의 답은 최소최대척도.

 

- 일곱 번 째 문제. "데이터 집단의 거리를 최대한 멀리 떨어뜨려 분석하는 모델은 무엇인가?"라는 취지의 문제였다. 필자의 답은 서포트벡터머신

 

- 여덟 번 째 문제. 데이터 간의 직선 거리를 구할 때 사용하는 방식 중 하나를 묻는 문제였다. 필자가 당시 기억하는 거리라고는 유클라디언과 맨하튼밖에 없었는데, 두 점 간의 직선 거리를 구하는 것이라 해서 기본인 유클라디언을 답으로 작성했다.

 

- 아홉 번 째 문제. 은닉층, 노드의 수를 통해 무언가 값을 구하는 문제였다. 몰라 패스.

 

- 열 번 째 문제, "데이터 척도 중 순위를 나타내는 척도가 서열 척도인데, 서열없이 단순히 나누어 놓은 데이터를 (  )척도라 한다"라는 취지의 문제나 나왔다. 필자의 답은 명목

 

 

 

뭐... 일단 절반은 풀었다. 맞는지 아닌지는 모르겠지만 말이다. 시험 시간은 전반 8분을 막 지나고 있었다. 

 

 

 

 

(2) 작업 1유형

 

작업 1유형은 단순히 pandas를 사용하여 데이터를 얼마나 자유자재로 활용할 수 있는지를 확인하는 문제가 전부였다. 정답의 제출은 답만 출력되면 끝나는 것이지만 필자도 문제를 정리하면서 푸는 것과 동시에 만일의 사태에 대비하여 코딩창에 주석을 달면서 하나씩 코딩을 진행했다(그래서 한 문제를 푸는데 약 20~30분 정도 걸렸다).

 

 

[ 제 1문제 ]

" 해당 데이터에서 결측치가 존재하는 데이터를 제외한 뒤, 상위 70% 데이터 중, 특정 컬럼의 1사분위 수를 정수로 구하라."

 

필자는 해당 문제의 풀이 절차를 메모장에 아래와 같이 작성했다.

--------------------------------------------

1. 결측치 제거

2. 상위 70%

3. 1사분위 값 정수형(int) 구하기

--------------------------------------------

 

이에 따른 코딩창의 코딩 중 주요 내용은 아래와 같이 작성했다.

----------------------------------------------------------------------------------------

1. 결측치 제거   - DataFrame.dropna(inplace = True)

2. 상위 70%      - DataFrame.head( 70% 행 수)

3. 1사분위 값 정수형(int) 구하기 - int(Series.quantile(0.25))

-----------------------------------------------------------------------------------------

 

70% 행 수는 dropna로 편집된 전체 데이터 index 수의 0.7 값을 round 함수를 적용한 값으로 대체하여 사용했다.

print(answer)의 결과로 정답은 19가 나왔다.

 

* 참고로 print(19) 또는 print("19")는 오답으로 간주한다.

 

 

[ 제 2 문제 ]

"다음은 각 국가의 년도별 결핵 발병률에 대한 자료이다. 2000년대의 발병률 중, 2000년대 평균치보다 발병률이 높은 국가의 수를 출력하라"

 

제 1문제와 마찬가지로 필자는 해당 문제의 풀이 절차를 메모장에 아래와 같이 작성했다.

--------------------------------------------

1. 2000년대 발병률 데이터 별도 추출

2. 추출 데이터 평균 구하기

3. 평균 이상의 국가 수 구하기

--------------------------------------------

 

이에 따른 코딩창의 코딩 중 주요 내용은 아래와 같이 작성했다.

----------------------------------------------------------------------------------------

1. 2000년대 발병률 데이터 별도 추출  -  DataFrame.loc[2000]

2. 추출 데이터 평균 구하기               -  DataFrame.loc[2000].mean()

3. 평균 이상의 국가 수 구하기           - DataFrame[DataFrame > DataFrame.loc[2000].mean()].count()

-----------------------------------------------------------------------------------------

 

print(answer)의 결과로 71이 나왔다.

 

 

[ 제 3 문제 ]

그 유명하다는 타이타닉 승객 정보 데이터가 문제로 나왔다. 하지만 문제에서 요구하는 내용은 김이 빠질 정도로 쉬운 문제였다. 

 

"해당 승객 데이터 컬럼 중, 결측치 비율이 가장 높은 컬럼의 이름을 출력하라"

 

해당 문제의 풀이 절차를 메모장에 아래와 같이 작성했다.

--------------------------------------------

1. 각 컬럼의 전체 수 및 결측치 수를 통해 결측 비율 구하기

2. 컬럼명: 결측 비율을 별도의 dictionary로 저장

3. dictionary value 중 가장 높은 값을 가지는 key를 정답으로 출력

--------------------------------------------

 

이에 따른 코딩창의 코딩 중 주요 내용은 아래와 같이 작성했다.

----------------------------------------------------------------------------------------

1. 각 컬럼의 전체 수 및 결측치 수를 통해 결측 비율 구하기  -  DataFrame["column명"][DataFrame.isnull() == True].count() / DataFrame["column명"].count()

2. 컬럼명: 결측 비율을 별도의 dictionary로 저장               -  dictionary["column명"] = 결측비율

3. dictionary value 중 가장 높은 값을 가지는 key를 정답으로 출력     -  for a in dictionary.keys() 문으로 max value값 추출 후 max value key 값을 answer 변수에 지정.

-----------------------------------------------------------------------------------------

 

print(answer)의 결과로 Age가 나왔다.

 

* 이 문제에서 유독 Age만 결측치가 많이 나와 의아해서 raw 데이터를 일일히 확인해보기도 했다. 여기서도 시간이 조금 많이 잡아먹혔다..

 

 

 

정신없이 졸리고 멍한 상태였지만, 문제를 풀어나감에 있어 큰 어려움은 없었던 작업 1유형 문제들이었다. 30점은 일단 기본 획득한 것으로 간주하고, 다음 문제로 넘어간다. 남은 시간은 약 90분.

 

 

 

 

 

 

(3) 작업 2유형

 

작업 2 유형은 훈련/검증 척도 데이터와 결과 데이터가 a라는 이름으로, 테스트 데이터 척도 데이터가 b라는 이름으로 지정되어 있었다. 이 데이터는 각 인물들의 여행 빈도, 가족 수 등등이 있었는데, 결과 데이터로 여행 보험의 가입 여부가 지정되어 있었다. 

 

즉, a 데이터의 훈련/검증 척도와 결과 데이터를 사용하여 학습 모델을 만들고, 만든 학습 모델로 b에 기록된 사람들이 여행 보험을 가입(1)할 확률을 csv로 저장하라는 문제였다. 이 문제는 가장 높은 ROC 값을 보이는 모델을 사용하여 제출한 결과에 높은 점수가 부여된다. 

 

문제를 자세히 보니,

 

- a 데이터는 "훈련/검증 데이터"라는 말이 명시되어 있었고,

- 각 척도(가족 수, 비행기 이용 횟수, 여행 횟수, 학력 등등등)가 수치형인지, 범주형인지

 

에 대한 내용도 정리가 되어 있었다.

 

따라서 필자는 아래와 같이 계획을 세웠다.

 

1. 척도 데이터의 범주형 데이터를 전부 OneHotEncoding으로 변환한 뒤, a 데이터를 다시 만들고

2. 만든 데이터에서 훈련/검증 데이터를 train_test_split으로 나눈다(검증 데이터는 모델 평가 점수 확인에 사용한다.)

3. 훈련/검증 데이터 중 척도들은 MinMaxScale로 정규화를 진행하며(결측치는 제거하지 않았다),

4. 가입 여부(Y/N)에 대한 예측 모형이므로 분류 모형 3~4가지를 지정해 VotingEnsemble 방식으로 각 모델의 설명도 점수를 측정한다.

5. 가장 좋은 점수를 가진 모델을 선정한 뒤,

6. 해당 모델의 하이퍼파라미터 값을 지정하여 튜닝한 뒤

7. 튜닝된 모델에 b 데이터를 돌려 여행보험 가입 여부의 확률을 구한다.

8. 구해진 결과는 DataFrame으로 변환한 뒤, csv로 저장하고 제출한다.

 

 

[ One Hot Encoding ]

 

먼저 a 데이터의 범주형 척도들을 전부 OneHotEncoding을 적용하여 데이터를 다시 만들었다. 범주형 컬럼만 별도 추출하여 아래의 코드를 돌렸다.

 

a_column명 = pd.get_dummies(a["column명"], prefix = "column명")

 

다음으로, 범주형 컬럼들을, OneHotEncoding이 적용된 DataFrame으로 대체했다. 대체 방법은 별 것 없고, 수치형 Column과 변환 DataFrame을 아래의 코드로 지정했다.

 

a_new = pandas.concat([수치형 컬럼, 변환 DataFrame1, 변환 DataFrame2... , a_결과데이터], axis = 1)

 

 

 

 

 

[ a의 훈련/검증 데이터 및 결과 데이터 분류 및 정규화, 훈련/검증 데이터 분류 ]

 

다음으로 필자는 척도 데이터와 결과 데이터를 분류하는 작업을 진행했다. 척도 데이터는 X, 결과 데이터는 Y로 지정했다. 여기서 필자가 한 가지 실수를 하게 되었는데, 바로 위의 OneHotEncoding에서 빨간 글씨로 적힌 a_결과데이터를 a_new에 포함시키지 않아, 추후 에러가 발생하게 된다. 즉,

 

X = a_new.iloc[:, :-1]

Y = a_new.iloc[:, -1]

 

로 작성해야 했으나, 

 

X = a_new

Y = a.iloc[:,-1]

 

로 지정해서 문제를 풀게 되었다. 당연히 같은 DataFrame에서 갈라져나온 데이터가 아니기 때문에 모델 훈련 시, 에러가 발생할 수 밖에 없었던 것이다. 추후 코딩을 진행하다 발생한 에러의 원인이 이것이며, 이 때문에 무려 30분이나 되는 시간을 허비하게 되었다.

 

다음으로 분류한 X 데이터에 대해 MinMaxScaler를 적용했다. 주요 코드는 아래와 같다.

 

from sklearn.preprocessing import MinMaxScaler

X_train_minmax = MinMaxScaler().fit(X_train).trasform(X_train)

 

사실 필자가 이 X_train_minmax 값으로 훈련/검증 데이터를 나누려했는데, 너무 졸렸던 탓인지 이 데이터를 분류해야 했음에도 불구하고 패키지 Import만 하고 분류를 진행하지 못했다...

 

from sklearn.model_selection import train_test_split.

X_train_minmax, X_valid_minmax, Y_train, Y_test = train_test_split(X_train_minmax, Y, strafity = Y, random_state = 50)

 

 

 

 

[ 모델 선정 및 VotingEnsemble 적용 ]

 

다음으로 모델을 선정해야 했다. 문제의 특성 상, 분류 모델을 사용해야 했는데, 연습 중에 분류 모델 중 SVM은 처리 결과가 지독하게 오래 걸림을 확인했던 기억이 있어 배제했고(코드 실행 결과가 1분 내로 마무리되어야 한다), 의사결정나무는 학습데이터에 대한 과대적합의 가능성이 너무 높다는 것을 확인해서 역시 배재했다. 따라서 필자는 분류 모델 중 아래의 세 가지 모델을 선정했다.

 

-  Logistic 회귀모델(sklearn.linear_model.LogisticRegression)

-  KNN 회귀모델(sklearn.neighbors.KNeighborClassifier)

-  Naive-bayes회귀모델(sklearn.naive_bayes.GaussianNB)

 

그리고 투표 앙상블을 사용하여, 세 모델의 학습을 진행한다.

 

-  VotingEnsemble 모델 (sklearn.ensemble.VotingClassifier)

 

투표 앙상블을 사용하여, 세 모델에 대한 학습을 진행하고, 각각의 모델에 대해 fit(X_train, Y_train) 함수를 적용하여 학습을 진행했다. 그리고 결과 확인을 위해 "실행" 버튼을 클릭하자, 결과화면에 에러가 떡 하니 뜬다.

 

응?? 뭐지?? Y Decision 어쩌구저쩌구 하는 것은 X와 Y의 숫자가 일치하지 않는 경우에 나타나는 것으로만 봐왔던 필자로써는 해당 에러가 나타난 원인을 찾기 위해 그 때까지 작성한 코드를 주석처리하면서 하나씩 확인하고 있었다. 분명 투표 앙상블까지는 아무 문제가 없는데, fitting 과정에서만 에러가 나 크게 당황하기 시작했다. 그러는 사이 시간은 흐르고 흘러 20분도 채 남지 않은 상황.

 

별 수 없이 작성한 코드를 처음부터 하나씩 다시 뜯어보기 시작했다. 아!!!!! 다행스럽게도 코드의 초반에 원인을 바로 찾을 수 있었는데, 비몽사몽하면서 작성한 a_new 코드를 보니, 결과 데이터만 쏙 빼어놓고 데이터를 재생성한 것이 눈에 띄었다. 다행히 코드 상으로 크게 손 댈 것이 없이 해당 데이터를 추가하고, Y 값을 a.iloc[:,-1]에서 a_new.iloc[:,-1]로 바꾸는 작업만으로도 fitting함수가 정상 동작함을 확인할 수 있었다. 또한 fit 함수에 X_train이라는 정규화되지 않은 데이터를 사용했던 것도 발견하여 해당 부분도 X_train_minmax 값으로 변경했다.

 

fit(X_train_minmax, Y_train)

 

각 모델의 학습 스코어를 확인해보니, 세 모델 중 Logistic 모델이 약 83%로 가장 높은 적중률을 보이고 있었다. 아마 전처리 과정 전에 OneHotEncoding을 적용했던 것이 주요한 듯 했다. 물론, 검증 이터를 분류하지 않았음을 그때서야 깨달았지만... 이미 시간이 10분도 채 남지 않아 검증 없이 바로 진행하기로 했다. Logistic 모델의 경우 과대적합이 의사결정나무모델만큼 극단적으로 나지 않음을 반복 코딩으로 확인했었기에 과감히 코드 수정없이 진행하기로 했다.

 

 

[ Logistic 회귀모델 튜닝 ]

 

다음으로 선정한 Logistic 회귀모델의 튜닝을 진행했다. 튜닝을 위한 파라미터가 C 뿐인 Logistic 회귀모델이었으므로, 필자는 GridSearch 방식으로 회귀모델의 튜닝을 진행하기로 했다. 주요 코드는 아래와 같다.

 

from sklearn.model_selection import GridSearchCV

 

param_grid = {"C": [0.001, 0.01, 0.1, 1, 10, 100]}

grid_search = GridSearchCV(LogisticRegression(), param_grid, cv = 10)

grid_search.fit(X_train_minmax, Y_train)

print(grid_search.best_param_, grid_search.best_score_)

 

이 결과 C 값이 0.1일 때, 정확도가 약 86% 정도 나타났던 것으로 기억한다. 따라서 해당 하이퍼파라미터를 다시 모델에 적용하고 결과를 구한다. 주요 코드는 아래와 같다.

 

lgs_model = LogisticRegression(C= 0.1)

lgs_model.fit(X_train_minmax, Y_train)

result = pd.DataFrame(lgs_model.predict_proba(X_train_minmax))

 

result를 출력해보니, 여행 보험 상품에 가입하지 않을(0) 확률과, 가입할 확률(1)이 DataFrame 포맷으로 출력된다. 이 중 필자가 필요한 부분은 가입할 확률이므로, result를 아래와 같이 고친다.

 

result = pd.DataFrame(lgs_model.predict_proba(X_train_minmax))[1]

result.to_csv("필자수험번호.csv")

 

다행히 결과는 문제에서 제시한것과 동일한 포맷으로 나타난다(결과가 완전히 동일할 수는 없다). 우선 풀어놓은 코드를 제출한 뒤, 마지막으로 필자가 풀이를 점검한다. 천만 다행히도, 필자가 predict_proba의 인자로 넣은 값이 학습 데이터 척도였음을 금새 알아차려서(와... 이 때 진짜 잠이 확 깼다), 저 값만 X_test_minmax로 변경하고 다시 결과를 출력하여 확인했다. 이전과 동일한 포맷으로 출력되는 것을 확인하여 아래와 같이 변경된 코드를 마지막으로 제출한다. 

 

result = pd.DataFrame(lgs_model.predict_proba(X_test_minmax))[1]

result.to_csv("필자수험번호.csv")

 

모든 문제를 다 풀고 나니, 남은 시간이 4분 30초다. 감독관에게 손을 들어 시험이 끝났다고 말하니, 정리하고 가도 된다는 제스쳐를 취한다. 시험 종료 버튼을 누르고 정리한 뒤 시험장을 나온다. 

 

시험이 끝나면 굉장히 잠이 많이 올 것이라 생각했는데, 앞서 나타났던 실수 때문인지 놀란 가슴이 진정되지가 않는다. 시험 초반에 이런 상황이 있었더라면 조금 더 나았을텐데...

 

 

 

 

 

4. 시험 후기

 

(1) 코딩은 반복 연습하되, 다양한 데이터 샘플로 연습하여 오류에 대한 해결 능력을 키울 것.

 

생각보다 작업형 문제는 어렵지는 않았다. 우선 데이터진흥원에서 제공한 응시 환경에 나타난 것과 동일한 유형의 문제가 2회차까지 변함없이 나왔기 때문에 응시 환경에서 연습을 많이 하셨던 분들이라면 문제 풀이 자체는 크게 어려움이 없을 듯 하다. 또한 Python으로 응시할 분들이라면 필자가 위에서 언급했던 수험서(물론 광고가 아니라 몇몇 정보는 가려놓았다)가 데이터 전처리와 모델링 관련 내용이 이해하기 쉽게 설명되어 있어 도움이 많이 된다.

 

시험 중 가장 주의해야 할 것은 오류가 발생하지 않도록 - 똑바로 정신을 차리고 - 코딩을 해야한다는 것과, 코딩 에러의 트러블 슈팅을 빠르게 해결할 수 있어야 한다는 것, 그리고 잘못된 변수명을 사용하지 않도록 주의해야 한다는 점이다. 

 

코딩과 변수 사용 관련 부분이야 시험 보는 당사자가 집중해야 할 부분이지만, 저 오류 발생 시 트러블 슈팅은 시험장에서 맞닥드리고 오랜 시간 동안 해결되지 않으니 기가 쫙 빨리는 기분이다. 따라서 필자는, 단순히 반복코딩으로 연습만 할 것이 아니라, 인터넷에서 다양한 데이터 샘플로부터 자료를 뽑아 자기만의 방식으로 모델 생성과 분석을 진행하는 학습 방법이 가장 좋을 것 같다는 생각이 든다. 그래야 다양한 오류에 대처 노하우가 쌓일 것이니 말이다. 이렇게 학습할 경우, 대략 두 달 정도 온전히 자기 시간이 있어야 충분한 학습이 될 것이라 생각하며, 직장인이라면... 조금 더 일찍 시작해야 할 듯 하다. 아니면 필자처럼 벼락치기 후 시험장에서 트러블 슈팅하다가 애를 먹는다.

 

 

(2) 가능하다면 필기와 실기는 동시에 준비하는 것이 가장 좋다

 

실기 시험에서 단답형은... 사실 답이 없다. 필기 시험에 나온 개념들을 다시 정리하는 방법밖에는 말이다. 하지만 필기를 보고 실기를 보기까지 약 두 달 간의 시간 텀이 있는데, 기존에 데이터 분석 분야에서 일하시던 분들이 아니라면 이 개념들을 별도로 정리하지 않은 이상 금새 잊어버릴 수 밖에 없다. 

 

또한 필기에서 모델링과 관련된 부분은 각 모델에 대한 개념적인 이해를 단순 읽기와 암기만으로 이해하기에는 한계점이 너무나도 명확하다(필자가 그래서 필기 3과목 문제를 풀 때 너무 힘들었다). 아이러니하게도 필자는 직접 각각의 모델을 코딩하면서 각 모델의 특성과 개념을 잡는 과정이 필기 수험서를 달달 외우는 방식보다 훨씬 도움이 되었다. 

 

즉, 필기 1, 4과목은 필기 수험서의 암기로도 충분히 커버가 되지만, 2과목은 기본 통계학을, 3과목은 직접 모델 코딩 및 위의 실기 수험서(오타는 많지만 깔끔하게 정리가 잘 되어 있다)를 추가로 참고하여 준비한다면 필기/실기를 동시에 준비함에 있어 가장 효율적일 것이라는 생각이 든다. 또한 필기를 준비하면서 기본적인 개념들은 별도의 노트에 작성해놓는다면 추후 실기 단답형 시험에서도 크게 도움이 될 것이라 생각한다.

 

 

 

 

5. 기타

 

참고로 필자가 pandas와 데이터 분석 관련 학습 내용을 비공개 포스팅으로 진행하고 있었다. 시험에 합격한다면 해당 내용은 바로 공개 전환이 될 예정이며, 해당 카테고리에 대한 링크도 첨부할 예정이다. 물론, 아직 포스팅이 완전하게 완성된 것은 아니지만, 시험 준비하는 분들에게 어느정도 도움이 되지 않을까 싶다.

 

시험 결과는 12월 31일에 발표된다. 사실 필자가 시험 준비를 이렇게 대책없이 하는 스타일이 아닌데도 불구하고 먹고사는 문제로 인해 이번에는 우당탕탕 시험 준비를 하게 되었다. 작업 2유형에서 필자의 실수가 있어서 결과를 장담할 수 없는 상황이기는 한데(제발 과대적합되지 않기만을 바랄 뿐이다), 그래도 이전의 다른 자격증 시험과 마찬가지고 결과가 나타나면 합/불 여부 상관없이 바로 추가 포스팅을 진행할 예정이다.

 

 

 

 

 

 

 

< 2021.12.26 시험 결과 사전 확인 >

 

시험 결과 공식 발표일 전에 사전 점수 확인 기회가 제공되어 사이트를 들어가 결과를 확인해보았다. 

아무래도 지난 회차 시험에서 발생한 실기시험 0점 사태 때문에 사전 확인 기간을 두지 않았나 싶다.

?????????????????????????????????????

 

사전 확인 기간 내에 점수를 확인한 결과 작업 2유형이 0점 처리가 되었다. 바로 실기시험 관련 카페 및 여러 사이트에서 해당 이슈에 대해 확인해보았다.

 

2회차 실기 시험에서 작업형 제 2유형 0점 처리 사태가 벌어져 한창 홍역을 치른 것으로 알고 있는데, 이번 회차도 조금은 어이없는 이유로 0점 처리된 사람들이 많은 듯 하다.

 

한국데이터 진흥원의 작업형 제 2유형 채점 기준 중 0점 부여 기준은 아래와 같다.

필자는 분명 CSV 파일을 정확한 필자 수험 번호로 제출했고, 데이터 사이즈도 마지막에 학습 데이터에서 테스트 데이터로 변경했기 때문에 문제가 되지 않는다. 그렇다면 남은 것은 y_pred 컬럼명 불일치다.

 

CSV로 결과 제출 시, predict_proba의 컬럼명을 "y_pred"로 지정해야한다는 것이 한국데이터진흥원에서 요규하는 사항인데, 0점 처리받은 분들의 의견을 모아보면 index, y_pred 라는 컬럼명으로 출력 결과 샘플 파일을 문제상에 예시라고만 표시했지, 컬럼명을 y_pred라고 정확하게 명시하라는 내용이 없었고, 실시간 시험 상담 채팅에서도 이 부분에 대해 모호한 답변만 받았다는 분들이 보인다.

 

 

이 때문에 22일 사전 점수 발표 이후 전화로 한국데이터진흥원에 유선 문의를 하신 분들도 간간히 보이는데, 유선 문의를 진행하신 분들 역시 하나같이 성의없는 응대로 해당 이슈를 무마시키려한다는 느낌이 든다는 분들도 보인다.

 

 

 

뭐... 이것 말고도 필자 역시 납득할 수 없는 채점 결과가 더 있는데, 이 부분까지 포스팅으로 다룰 만한 상황은 아니니 논외로 치고...

 

사실 시험을 치른 필자 입장에서도, 데이터 분석 절차도 큰 문제가 없었고 결과마저도 어느 정도 잘 나타난 상황에서, 답안으로 제출한 내용 중 컬럼명이 y_pred가 아니라는 이유로 이렇게 어처구니없이 0점을 받으니 조금 심란하기는 하다.(QnA로 이의신청을 한 상태이기 떄문에 상황을 조금 더 지켜봐야 하지만 0점 처리되어 직접 문의를 하신 분들의 글을 모아보면 이 부분이 공론화가 크게 되지 않는 이상 번복이 될 가능성이 크지 않은 듯 하다). 데이터 분석을 잘못해서 이런 결과가 나왔다면 납득이라도 하지만 단순히 컬럼명 하나가 틀렸다는 이유로 이렇게 0점을 받으니... 뭐라 할 말은 없다.

 

우선, 필자는 마음을 최대한 비우고 다음 시험을 준비하려 한다. 이번 시험을 통해 작업형 결과 제출 시, 문제에 제시한 결과 샘플과 컬럼명까지 완전히 동일한 형태로 제출을 해야 이런 0점 사태의 희생양이 되지 않으리라는 것을 알았으니, 시험 응시료가 아깝더라도 다음 시험에서는 좋은 결과를 내보려 한다.

 

물론, 가장 좋은 것은 공식 발표일에 채점 결과가 번복되어 지금 통과하는 것이긴 하지만 말이다.

 

 

 

< 2021.12.31 시험 결과 공식 발표 >

 

JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

 

야ㅑㅑㅑㅑㅑㅑㅑㅑㅑㅑㅑㅑㅑㅑㅑㅑㅑㅑㅑㅑㅑㅑㅑㅑㅑㅑㅑㅑㅑㅑㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏ!!!!

 

기분 째진다. 사실 당연히 탈락이라 생각해서 아무 생각없이 있다가 새해를 6분 앞둔 이제서야 확인했는데, 

작업 2유형이 말이 많아서 그런지 점수 변동이 있었고, 부분점수를 딱 시험 통과할 만큼 얻어 합격을 하게 되었다!!

 

사실 20점이라는 반타작 점수는 납득이 간다. 학습/검증 데이터 분류도 없었고, UAC 곡선 평가도 빠뜨렸으니 말이다.

 

그래도 통과했으니...^^

2021년 마무리가 너무 좋다.

 

 

 

Fin.

 

반응형

댓글