빅데이터 분석기사 실기를 준비하는 사람들에게 드리는 팁(3회 이후)

 

이번 3회 예비?합격자입니다

 

가끔 카페를 보는 정도만으로 이용하는데

 

시험이 시행된지 얼마 되지도 않았고 공부 어떻게 해야할지 모르시는 분들이 많아 몇가지 팁을 드리고자 합니다.

 

본인은 R을 사용하다가 Pyhon으로 넘어온 사람이라 Python위주로 설명되어 있습니다.

 

 

1. 깔끔한 시험이 아니기 때문에 확실하게 대비할 필요가 있다.

 

ADsP나 SQLD를 보신 분들이라면 여기서 출제하는 시험이 국가공인시험이 맞는지 의심이 될 정도로

 

생각보다 깔끔한 시험이 아닙니다.

 

애초에 문제가 이상한 것 같다고 질문하면 답변도 안해줍니다.

 

제가 쓴 단답형이 다 맞다고도 생각하는데 뭐가 틀렸는지 잘 모르겠네요

 

그 외에도 자신의 능력과 무관하게 어떤 변수가 생길 수 있기 때문에 철저한 대비가 필요합니다.

 

 

 

2. 단답형은 필기시험에서 공부한 굵직한 용어들 위주로 공부하면 좋다

 

필기시험을 잘 준비했다면 사실 뭐가 나올지 충분히 예상 가능한 범주에서 나온다고 생각하면 됩니다

 

지지도&신뢰도&향상도

 

통계모델(의사결정나무, 로지스틱회귀분석, 서포트벡터머신의 정의 등)

 

결측치&이상치 처리기법

 

스케일링 기법

 

정밀도&정확도&f1 score같은 혼동행렬의 용어

 

통계량(변동계수, 표준편차, 분산 등)

 

그 외에도 용어를 정확하게 알고 가야합니다. 최소-최대 정규화를 min-max scaler라고 쓰면 틀릴 수 있습니다

 

 

 

3. 애매하게 알고있으면 아는 문제도 틀릴 수가 있다.

 

향상도 같은 경우 연관성 분석에서 우연성을 판단하는 측도로 1보다 크면 양의 상관, 1이면 서로 독립, 1보다 작으면 음의 상관이 있는데 이것을 몰라 향상도를 아는데도 생각하지 못할 수 있습니다.

 

최소-최대 정규화의 경우 공식만 알고 데이터의 최솟값을 0, 최댓값을 1로 변환한다는 사실을 모른다면 최소 최대 정규화가 뭔지 아는데도 생각하지 못할 수 있습니다.

 

 

 

4. 일반적인 용어가 나올 수 있다

 

두 집단이 왜 차이가 있는지 물어본 문제가 있었는데 '분포'가 정답으로 추측되고 있습니다.

 

쉬운 단어지만 생각하기 어려운 일반적인 용어죠

 

 

 

5. 자기가 선택한 프로그래밍 언어의 기본 문법은 익히고 있어야한다

 

 

작업형 1유형은 데이터프레임을 조작하여

 

크기 순으로 정렬해라, 일부의 행들만 출력해라,

 

특정 조건을 만족하는 칼럼을 출력해라,

 

칼럼의 통계량을 산출해라, 결측치나 이상치를 처리해라,

 

그룹별로 집계해라, 데이터를 스케일링 해라 등등의 문제가 출제됩니다.

 

그러나 어떤 문제가 나올지는 사실 아무도 모릅니다.

 

그래서 자기가 선택한 R이나 Pyhon의 기본 문법은 정확하게 익히고 익숙해질 필요가 있습니다.

 

데이터프레임을 조작하는 라이브러리에 대해서 익숙해질 필요가 있습니다.

 

그러면 어떤 문제가 나와도 굳이 공부하지 않아도 다 맞출 수 있을 정도로 문제가 쉽습니다.

 

R의 경우에는 dplyr?

 

Python의 경우에는 numpy, pandas 등

 

 

 

6. 문제를 잘 읽고 웬만하면 시키는대로 하자.

 

이미 언급하긴 했지만 문제가 깔끔하지 않을 수 있고 문제에 대해서 물어봐도 답을 해주지 않습니다.

 

시험보는 사람은 억울하지만 철저한 을의 입장이기 때문에

 

웬만하면 문제에 나와있는 그대로, 시키는대로, 문제의도를 눈치챌 수 있다면 문제 의도대로 하는게 제일 좋습니다.

 

3회에 나온 이슈중에 몇가지를 이야기해보면 사실 프로그래밍에 대해 익히고 있으면 문제가 될 부분은 아닙니다.

 

 

6-1) '정수'로 출력?

 

'~~~ 제1사분위수를 정수로 출력하세요' 이런 식의 문제가 나왔습니다.

 

명확하게 낼려면 '정수형으로 출력하세요'라고 쓰는게 맞긴하지만 이 부분을 이야기하면 끝도 없어서 넘어가고

 

프로그래밍의 기본에 대해 익히고 있다면 문제 의도는 정수형으로 출력하라는 문제였을겁니다.

 

소수점이 포함되면 수학적으로는 정수더라도 프로그래밍 언어에서는 정수라고 안합니다.

 

예를 들어 내가 푼 문제 정답이 19.0으로 나와서...

 

19.0으로 출력하면

 

나는 정수로 출력하라해서 19.0은 정수니까 19.0으로 출력했는데?

 

이미 언급했지만 이것이 애매하다고 생각해서 시험 당일날 물어보면 답변을 안해줍니다

 

하지만 내가 프로그래밍에 대해 잘 알고있다면 19.0으로 출력하지 않고 int함수를 사용해서 19로 만들어서 출력했을 겁니다.

 

그러면 굳이 걱정할 필요도 없이 맞추고 가는겁니다.

 

 

6-2) print('Age')로 하면 정답??

 

'결측치 비율이 제일 많은 칼럼을 출력하세요' 이런 문제가 나왔는데

 

문제 의도는 코딩을 통해 결측치 비율이 제일 많은 칼럼을 프로그래밍 언어로 추출할 수 있느냐를 물을 가능성이 높습니다.

 

그러면 사실 print('Age')보다는 코딩을 통해 'Age'라는 value(값)을 저장한 어떤 변수 , 예를 들어 a='Age'라고 한다면 print(a)로 답을 내는게 깔끔합니다.

 

코딩을 통해 데이터를 확인해서 결측치 비율이 제일 많은 칼럼이 'Age'라는 것을 내 눈으로 확인했으니까

 

print('Age')로 답을 써버리면 사실 오답처리를 할 가능성이 상당히 높습니다.

 

 

문제 자체에 코드를 통한 부분점수는 없고 임의의 값을 대입하지 마라고 했습니다.

 

또한 문제에서 '변수'로 출력하라고 명시하고 있습니다.

 

프로그래밍 언어의 기본을 익혀서 '변수'가 뭔지 알고있다면 깔끔하게 해결할 수 있었을 것입니다.

 

애초에 코드를 통한 부분점수가 없다고 하여 코드를 보지 않을 가능성이 높습니다.

 

그 말은 풀이과정은 보지 않고 답만 보겠다는 뜻입니다.

 

임의의 값을 대입하지 마라는 지시사항에서 print('Age')로 쓰지 마라는 이야기가 됩니다.

 

 

이번 3회에서는 이것을 맞게 한것으로 본 것 같지만 4회부터는 명확하게 출제하여 용납하지 않을 것으로 생각합니다.

 

 

7. 코딩을 하면서 중간중간 print()를 통해 결과를 확인하자

 

일반적인 작업환경과는 다르게 코드를 작성하고 모든 코드가 한번에 수행됩니다.

 

그렇기 때문에 중간 결과를 알기 어려운데

 

중간중간 내가 코딩을 잘 하고 있는지, 원하는 부분의 결과가 잘 나오는지 알려면 중간 변수들에 print()문을 사용하여

 

'제출'말고 '실행'을 눌러보면 코드를 잠깐 수행할 수 있습니다.

 

또한 '구름'환경이 어디가 틀렸는지 친절하게 가르쳐주지 않기 때문에 섬세한 코딩이 필요합니다.

 

평소에 연습자체도 한줄한줄 실행하기보다는 하나의 블록에 모든 코드를 작성하여 수행하는 실전과 같은 연습이 필요합니다.

 

또한 1분안에 수행되어야한다고 나오는데 어차피 코드를 직접 제출할 때 1분이 넘어가면 알아서 에러가 나기 때문에 시험전에 신경쓸 부분은 아닙니다.

 

 

8. 작업형 제2유형은 알고보면 '약점'이 있다

 

마지막 작업형 제2유형은 40점짜리 문제로 합/불을 결정짓는 중요한 문제인데

 

제한사항을 살펴보면 '약점'이 있습니다.

 

-1분안에 코드가 수행되어야 한다

 

-시각화는 불가능하다

 

그렇다면 어려운 분석 문제는 출제가 되지 않는다는 말이 됩니다.

 

비정형데이터는 1분이 넘어갈 가능성이 높아서 출제되지 않을 가능성이 높고

 

classification이나 regression같은 쉬운 분석 문제가 나올 가능성이 매우 높습니다.

 

또한 이러한 사실을 통해서 되게 간단한 데이터 분석 파이프라인이 도출됩니다.

 

 

1. 주어진 데이터를 확인

 

pd.read_csv()

 

df.head()

 

2. 데이터 전처리

 

-결측치가 존재하는지 > 존재한다면 결측치 처리(결측치가 너무 많다면 변수 삭제, 적당하면 평균대체 등)

 

df.isnull.sum()

 

-연속형변수들의 통계량 산출 > 변수들의 최대-최소 분포가 차이가 많이 나는가? 그렇지 않은가? >차이가 많이 난다면 스케일링 필요

 

df.describe()

 

scaler = MinMaxScaler()

 

scaled_data = scaler.fit_transform()

 

sclaed_df = pd.DataFrame(scaled_data,columns=df.columns)

 

-이산형변수는 one-hot encoding이나 label encoding 등을 수행

 

pd.get_dummies

 

encoder = LabelEncoder

 

encoded_data = encoder.fit_transform()

 

-target변수와 설명변수 사이 상관성 파악 > 시각화 없이도 상관계수나 범주형변수의 count를 통해 상관성을 파악할 수 있음 > 상관성이 떨어지는 변수는 제거하는게 좋을수도?

 

df.corr()

 

-파생변수를 만들면 좋을지> 년/월/일/시/분/초 변수는 년, 월, 일, 시, 분, 초로 6개의 변수 분리하면 성능이 더 좋아질 수 있음, 형제자매수, 부모수 2개의 변수는 가족수=형제자매수+부모수로 변환하면 성능이 좋아질 수 있음

 

3. 모델링

 

4. 예측

 

- 모델들이 아주 약간의 차이만 있을 뿐 사용법이 전부 유사함

 

model = XGClassifier()

 

model.fit()

 

prediction = model.predict_proba()

 

5. 평가

 

score = roc_auc_score()

 

6. 제출파일 생성

 

df.to_csv()

 

 

9. 모델의 선택은 xgboost가 제일 무난하다.

 

정형데이터 분석에서 일반적으로 성능이 좋다고 알려진 모델은 xgboost라서 이 모델을 선택하는 것이 일반적으로 좋습니다.

 

일반적으로 좋다는 뜻은 데이터에 따라서 의외로 간단한 decision tree나 logistic regression 등이 더 좋을 수도 있다는 뜻이지 반드시 좋다는 뜻이 아닙니다.

 

 

 

10. 평가지표를 통해서 최상의 모델을 제출하는 것이 유리하다.

 

문제를 보면 어떤 평가지표로 평가를 할지 제시를 해줍니다.

 

이번 3회에서는 ROC-AUC로 평가한다고 나왔습니다.

 

그렇지만 ROC-AUC가 어떤 구간에 속하는지에 따라 점수가 달라진다고만 나올 뿐 얼마나 좋아야하는지는 알려주지 않습니다.

 

그래서 높은 점수를 받기 위해서는 최상의 모델을 제출할 필요가 있습니다.

 

cross validation이 좋지만 1분이 넘어갈 가능성이 높아서 holdout validation만 수행해도 충분하다고 생각합니다.

 

Python에서 train_test_split()함수가 train dataset과 validation dataset으로 랜덤하게 나눠줍니다.

 

문제에서 주어진 train dataset을 train_test_split()을 통해 80%는 train set으로 20%는 validation set으로 나눠서 80%만 모델을 학습시켜보고 20%의 validation set으로 평가지표를 산출해볼 필요가 있습니다.

 

여기서 나온 평가지표가 실제 문제의 test set의 평가지표와 거의 유사하다고 보면 편합니다.

 

사실 하지 않아도 되는데(하지 않았을 때 많은 데이터를 학습하기 때문에 오히려 더 좋을수도 있음) 이 과정을 수행하지 않으면 몇점이 나올지 몰라서 결과발표날까지 조마조마해집니다.

 

 

 

11. 앙상블을 통해 점수를 끌어올릴 수 있다.

 

여러가지 모델의 prediction을 구한 다음에 이들을 앙상블하면 일반적으로 성능이 좋아집니다.

 

앙상블하는 방법은 생각보다 간단합니다.

 

1. decision tree

 

2. logistic regression

 

3. svm

 

4. xgboost

 

본인은 위 4가지 모델의 predicion을 구해 앙상블을 했습니다.

 

각 모델의 predict_proba1, predict_proba2, predict_proba3, predict_proba4를 구한다음에

 

그냥 더하고 4로 나누면 앙상블한 것이 됩니다.

 

predict_proba = (predict_proba1+predict_proba2+predict_proba4+predict_proba4)/4

 

 

 

12. 간단한 hyperparameter tuning을 통해 점수를 더욱 올릴 수 있다.

 

사실 하지 않아도 합격할 수 있는데 확실하게 합격하고 싶으면 최대한 점수를 끌어올리는게 중요합니다.

 

모델들은 각자 고유한 hyperparameter들을 가지는데 hyperparameter에 따라 성능이 달라집니다.

 

1분안에 수행되어야하기 때문에 고급기법은 사용하기 어렵고 일일이 hyperparameter 하나씩 반복문을 통해 성능을 확인해서 최대성능을 가지는 hyperparameter를 선택할 수 있습니다.

 

대표적인 hyperparameter가 바로 random_state입니다.

 

random_state가 작용할 수 있는 부분이

 

1. train_test_split()

 

2. 모델링에 사용한 모델들

 

예를 들어 다음과 같이

 

roc_list = []

 

for a in range(0,50):

 

train, test, ..... = train_test_split(train,test, random_state = a)

 

prediction = predict_proba(.........)

 

roc_auc = roc_auc_score(...........)

 

roc_list.append((a,roc_auc))

 

roc_list.sort()

 

print(roc_list[0])

 

이런식으로 random state값을 0부터 49까지 넣어보면서 train_test_split()을 수행해본다음에 모델을 평가해보고 산출한 roc_auc값 49개를 비교하여 최댓값을 가지는 random state값을 집어넣고 최종 제출하면 유리합니다.

 

여기서 더 욕심이 난다면

 

for a in range(0,50):을 for a in range(50,100):으로 50부터 99까지 또 확인해서 더 큰 지표 값을 가지는 random state를 찾아볼 수 있겠죠

 

이런식으로 0.7점대였던 모델 평가지표를 0.9점까지 끌어올렸습니다.

 

 

그리고 이 random_state가 왜 중요하냐면

 

이 값을 설정하지 않으면 예상하지 못한 점수가 나올 가능성이 높습니다.

 

내가 시험장에서 평가한 지표는 0.8로 못해도 30점은 나오겠지? 했는데 실제 시험결과는 10점?

 

random state를 설정하지 않으면 코드를 수행할때마다 결과가 달라집니다.

 

진흥원에서 제출한 코드를 수행해보고 나온 파일과

 

내가 시험장에서 코드를 수행해서 얻은 파일은 다를 수 있습니다.

 

그러면 평가 결과가 상이해지는 것입니다.

 

random_state하나로 0.7~0.9까지 왔다갔다 하는거죠.

 

이 사실도 되게 중요한데

 

어떤 분이 내가 df.to_csv()로 파일을 저장해놓고

 

파일을 저장했으니까 df.to_csv() 코드는 굳이 필요없겠지? 하고 지운다음에 저장된 파일을 읽어볼려고 코드를 다시 수행하면 에러가 난다는 글을 본적이 있습니다.

 

이게 시험환경이 코드를 한번 수행하면 파일을 영구 저장해놓는 것이 아니라 코드를 한번 수행하면 임시 저장해놓는다는 사실을 의미합니다.

 

코드를 수행할 때마다 파일을 지우고 다시 수행한다는 의미죠

 

 

 

 

13. 마지막까지 방심하지 말기

 

180분이라 시간이 많아보일 수 있는데 최대한 시간을 활용하여 높은 성능의 모델을 만들고

 

마지막제출까지 확실하게 확인하도록 합시다.

 

주어진 예시 양식에 맞춰서 내라고 명시를 하기 때문에 그렇지 않으면 오답처리를 합니다.

 

코드에 대한 부분점수가 없기때문에 마지막까지 실수하지 않도록 합니다.

 

예를 들어 확률로 내라 했는데 predict_proba에 대해 몰라서 0,1같은 encoding된 값을 내는 경우 >> 평가지표가 산출될 수는 있지만 재수없으면 0점 받을지도

 

컬럼명을 맞춰서 냈는지?

 

1이 될 확률을 냈는지? 0이 될 확률을 냈는지?

 

3회에 index 칼럼에 대해 논란이 많았는데 시험당일에 이에 대해 질문을 해도 답변을 해주지 않습니다

 

사실 가장 좋은 방법은 그냥 제시된 예시 양식대로 제출하는게 깔끔합니다.

 

데이터프레임은 index 칼럼과 feature 칼럼으로 나뉘는데

 

index 칼럼은 데이터프레임의 맨 왼쪽에 있는데 index 칼럼은 칼럼명이 (있을 수도 있지만) 보통은 없습니다.

 

csv로 저장된 데이터를 불러올때 index에 대해 설정하지 않고 불러오면 데이터파일의 index 칼럼을 Unnamed : 0로 불러오고 0부터 순서대로 파이썬에서 index를 씁니다.

 

또한 index가 0부터 순서대로 안될 수 있습니다

 

예측해서 제출파일을 만들때는 주어진 test dataset의 row 순서대로 예측을 해서 만들어야지,

 

자기 마음대로 정렬을 해서 예측해서 제출하면 오답처리될 수 있습니다.

 

 

이 글을 읽으시는 모든 분들이 앞으로 시험에서 합격하시기를 기원합니다.

 

TAGS.

Comments