일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 애플
- 나스닥
- MQTT
- 힐스테이트 광교산
- 월패드
- esp32
- 파이썬
- Python
- 공모주
- 티스토리챌린지
- matter
- Home Assistant
- 배당
- homebridge
- 오블완
- raspberry pi
- ConnectedHomeIP
- 미국주식
- 현대통신
- RS-485
- 해외주식
- SK텔레콤
- 코스피
- 국내주식
- 매터
- 홈네트워크
- Apple
- cluster
- Espressif
- Bestin
- Today
- Total
YOGYUI
빅데이터분석기사 실기 제2유형 문제 풀이 예시 (1) 본문
빅데이터분석기사 실기시험(06/19)이 일주일 앞으로 다가왔다
예시문제의 제2유형을 내 나름대로 풀어보면서 관련 코드를 정리해보자는 생각이 들었다
(원래는 귀찮아서 포스팅 안하려고 했는데 ㅎㅎ... 게시글 수도 올릴겸, 방문자 수도 올릴겸... 겸사겸사)
현업에서는 특별한 경우가 아니면 대부분 파이썬 (아니면 C++, Java)으로 업무를 진행하는데, 구글링이나 쿡북 없이 모든 코드를 작성할 정도로 머리가 비상하지는 않아서 (ㅠㅠ) 시험은 그냥 R로 치르기로 결심했다 (R도 평소에 조금씩 써야겠다...)
시험이 오픈북이 아니다보니 필요한 함수들을 외워가야 되는데 R은 함수명, 사용법이 대개 심플해서 마음편히 준비해갈 수 있다
각설하고, 제2유형 '모형 구축 및 평가' 예시문제의 데이터는 백화점 고객의 1년간 구매 데이터로, 데이터가 csv 형식으로 3개 주어진다
- X_train.csv: 학습용, 고객의 상품구매 속성
- y_train.csv: 학습용, 고객의 성별
- X_test.csv: 테스트용, 고객의 상품구매 속성
Train 데이터를 학습하는 모델을 구축한 뒤 Test 데이터의 구매 속성을 통해 고객의 성별을 분류하는 이진분류 유형의 문제다
고객 상품구매 속성 데이터는 총구매액, 최대구매액, 환불금액, 주구매상품 등 9개의 속성과 고객 ID로 구성되어 있으며, 성별 데이터는 0=여자, 1=남자로 기입되어 있다
정답제출방식이 독특한데, 내가 작성한 모델의 코드를 제출하는게 아니라, 구축 모델에 Test 데이터를 입력하여 분석된 결과물을 csv 파일로 생성해서 제출해야 하며 모델의 성능은 ROC-AUC 평가지표에 따라 채점한다고 한다
(이 문제에서는 Test 데이터의 각 고객이 '남자일 확률'을 결과물로 제출)
1문제에 40점이나 배정해놓고 분석 결과의 ROC-AUC 메트릭만으로 채점한다고?
아마 제출 결과 뿐만 아니라 중간 결과(작성된 코드)도 채점에 반영이 되지 않을까라는 생각이 드는게, 유의사항에 "성능이 우수한 예측모형을 구축하기 위해서는 적절한 데이터 전처리, Feature Engineering, 분류 알고리즘 사용, 초매개변수 최적화, 모형 앙상블등이 수반되어야 한다"고 명시되어 있다
채점기준이나 응시요령은 2회 시험이 종료되면 아마 자격증 시험 대비 기관이나 서적에서 많이 다룰 것 같으니, 나는 ADP 시험 준비했던 것과 똑같은 방식으로 준비해봐야겠다 (어차피 40점 만점 받는다고 별도로 인정해주진 않으니 합격 기준인 60점만 넘기는 걸 목표로!)
1. 데이터 불러오기 및 전처리
read.csv 함수로 csv 파일들을 data.frame으로 불러오기
X_train <- read.csv('./data/X_train.csv')
y_train <- read.csv('./data/y_train.csv')
X_test <- read.csv('./data/X_test.csv')
아마 시험에서는 argument 조정 없이 바로 로드되는 데이터를 제공할 것 같다
(separator가 탭이나 공백로 되어있다던가 등의 이슈는 없을 듯?)
summary 함수로 Train 데이터를 요약해보자
summary(X_train)
> cust_id 총구매액 최대구매액 환불금액 주구매상품 주구매지점 내점일수 내점당구매건수 주말방문비율 구매주기
Min. : 0.0 Min. : -52421520 Min. : -2992000 Min. : 5600 Length:3500 Length:3500 Min. : 1.00 Min. : 1.000 Min. :0.00000 Min. : 0.00
1st Qu.: 874.8 1st Qu.: 4747050 1st Qu.: 2875000 1st Qu.: 2259000 Class :character Class :character 1st Qu.: 2.00 1st Qu.: 1.667 1st Qu.:0.02729 1st Qu.: 4.00
Median :1749.5 Median : 28222700 Median : 9837000 Median : 7392000 Mode :character Mode :character Median : 8.00 Median : 2.333 Median :0.25641 Median : 13.00
Mean :1749.5 Mean : 91919252 Mean : 19664242 Mean : 24078216 Mean : 19.25 Mean : 2.835 Mean :0.30725 Mean : 20.96
3rd Qu.:2624.2 3rd Qu.: 106507930 3rd Qu.: 22962500 3rd Qu.: 24120000 3rd Qu.: 25.00 3rd Qu.: 3.375 3rd Qu.:0.44898 3rd Qu.: 28.00
Max. :3499.0 Max. :2323180070 Max. :706629000 Max. :563753000 Max. :285.00 Max. :22.083 Max. :1.00000 Max. :166.00
NA's :2295
(자료형)
- cust_id, 총구매액, 최대구매액, 환불금액, 내점일수, 내점당구매건수, 주말방문비율, 구매주기: numeric
- 주구매상품, 주구매지점: character
주구매상품과 주구매지점 속성은 read.csv에서 character를 factor로 변환하고자 하는 옵션을 넣지 않았으므로 자료형이 문자열인데, 데이터분석 시 character형은 factor형으로 변환해줘야 제대로 된 분석을 할 수 있다 (as.factor 사용)
방법은 (1) csv 파일을 로드할 때 옵션 명시 (stringsAsFactors), (2) factor형으로 변환 둘 중 편한 방법을 쓰면 된다
# (1) load 시 옵션 명시
X_train <- read.csv('./data/X_train.csv', stringsAsFactors = TRUE)
# (2) 형변환
X_train$주구매상품 <- as.factor(X_train$주구매상품)
X_train$주구매지점 <- as.factor(X_train$주구매지점)
summary(X_train)
> cust_id 총구매액 최대구매액 환불금액 주구매상품 주구매지점 내점일수 내점당구매건수 주말방문비율 구매주기
Min. : 0.0 Min. : -52421520 Min. : -2992000 Min. : 5600 기타 : 595 본 점 :1077 Min. : 1.00 Min. : 1.000 Min. :0.00000 Min. : 0.00
1st Qu.: 874.8 1st Qu.: 4747050 1st Qu.: 2875000 1st Qu.: 2259000 가공식품: 546 잠실점 : 474 1st Qu.: 2.00 1st Qu.: 1.667 1st Qu.:0.02729 1st Qu.: 4.00
Median :1749.5 Median : 28222700 Median : 9837000 Median : 7392000 농산물 : 339 분당점 : 436 Median : 8.00 Median : 2.333 Median :0.25641 Median : 13.00
Mean :1749.5 Mean : 91919252 Mean : 19664242 Mean : 24078216 화장품 : 264 부산본점: 245 Mean : 19.25 Mean : 2.835 Mean :0.30725 Mean : 20.96
3rd Qu.:2624.2 3rd Qu.: 106507930 3rd Qu.: 22962500 3rd Qu.: 24120000 시티웨어: 213 영등포점: 241 3rd Qu.: 25.00 3rd Qu.: 3.375 3rd Qu.:0.44898 3rd Qu.: 28.00
Max. :3499.0 Max. :2323180070 Max. :706629000 Max. :563753000 디자이너: 193 일산점 : 198 Max. :285.00 Max. :22.083 Max. :1.00000 Max. :166.00
NA's :2295 (Other) :1350 (Other) : 829
class(X_train$주구매지점)
> [1] "factor"
class(X_train$주구매상품)
> [1] "factor"
주구매상품과 주구매지점 모두 factor형으로 자료형이 지정된 것을 알 수 있다 (class 함수 사용)
(잡설: 주구매지점 중 '부산본점' 항목이 있는걸 보니 아무래도 롯데백화점같다 ㅋㅋ)
총구매액의 최소값이 -52421520인데, 구매액이 음수일 수가 있나? 싶어서 한번 필터링해봤다
# 방법 1: 데이터프레임 인덱싱
X_train[X_train$총구매액 < 0, ]
> cust_id 총구매액 최대구매액 환불금액 주구매상품 주구매지점 내점일수 내점당구매건수 주말방문비율 구매주기
1660 1659 -2992000 -2992000 2992000 디자이너 본 점 1 1.000000 0.0000000 0
3175 3174 -52421520 13616000 97222000 기타 본 점 18 4.444444 0.3375000 16
3489 3488 -18905600 82306000 529602320 디자이너 부산본점 31 1.064516 0.2424242 11
# 방법 2: dplyr 패키지 사용
X_train %>% filter(총구매액 < 0)
> cust_id 총구매액 최대구매액 환불금액 주구매상품 주구매지점 내점일수 내점당구매건수 주말방문비율 구매주기
1 1659 -2992000 -2992000 2992000 디자이너 본 점 1 1.000000 0.0000000 0
2 3174 -52421520 13616000 97222000 기타 본 점 18 4.444444 0.3375000 16
3 3488 -18905600 82306000 529602320 디자이너 부산본점 31 1.064516 0.2424242 11
데이터 핸들링 시 간단한 기능들은 조건부 인덱싱만으로 충분한데, 왠만하면 (시험을 위해서건, 현업을 위해서건) dplyr같은 데이터 조작 프레임워크는 익숙하게 사용할 수 있어야 한다고 생각한다
구매액이 음수인 경우는 환불금액이 구매총액보다 클 때 발생하는 것 같다
극단적으로 cust_id 1659인 고객은 구매는 아예 안하고 백화점에 와서 환불만 해 간 사례라고 할 수 있다
(구매 총액은 데이터에 나와있지 않고, '최대구매액'만 속성으로 나와 있다)
환불금액에 NA가 2295개 존재하는데, 기입되지 않은 환불금액은 0원으로 처리해도 되므로 다음과 같이 전처리해주자 (is.na 함수 및 인덱싱 활용)
X_train[is.na(X_train$환불금액),]$환불금액 <- 0
summary(X_train$환불금액)
> Min. 1st Qu. Median Mean 3rd Qu. Max.
0 0 0 8289786 2642250 563753000
정답 데이터 (혹은 라벨 데이터, y_train)의 gender는 수치형 데이터로 되어 있다
ifelse 활용해 문자열로 바꾼 뒤 범주형으로 변환 가능한데, 실제 분석 시는 그냥 0, 1 수치형 데이터를 그대로 써도 무방하다
summary(y_train)
> cust_id gender
Min. : 0.0 Min. :0.000
1st Qu.: 874.8 1st Qu.:0.000
Median :1749.5 Median :0.000
Mean :1749.5 Mean :0.376
3rd Qu.:2624.2 3rd Qu.:1.000
Max. :3499.0 Max. :1.000
y_train$genfac <- ifelse(y_train$gender == 1, "남자", "여자")
y_train$genfac <- as.factor(y_train$genfac)
str(y_train)
> 'data.frame': 3500 obs. of 3 variables:
$ cust_id: int 0 1 2 3 4 5 6 7 8 9 ...
$ gender : int 0 0 1 1 0 0 0 0 0 1 ...
$ genfac : Factor w/ 2 levels "남자","여자": 2 2 1 1 2 2 2 2 2 1 ...
2. EDA (탐색적 데이터 분석)
table(y_train$genfac)
> 남자 여자
1316 2184
table 함수로 성별 분포를 보면 남자가 1316명, 여자가 2184명으로 여성의 데이터가 약 1.6배 많다
이 데이터셋은 분석모델없이 1316/3500 = 0.376, 즉 무조건 남자라고 분석하는 모델을 세우면 37.6%의 정확도를 갖게 된다 (반대로 여성이라고 분석하는 문제의 경우 62.4%의 정확도를 가지게 된다)
훈련데이터의 클래스 불균형(class imbalance)이 존재하는데, 분류 성능을 향상시키기 위해서는 분석 모델 구현 시 '남성 데이터의 업샘플링', '여성 데이터의 다운샘플링', SMOTE 등 불균형 해소 처리를 고려해봐야 할 것 같다
시험에서 사용하는 클라우드 IDE가 plot 기능을 어디 수준까지 지원하는지 모르기때문에, 시각화는 간단한 것 몇개만 준비해가도록 하자 (EDA와 관련된 채점 항목은 전혀 없다... 중간과정은 모르겠고 분석 성능만 높으면 장땡! 이라는게 시험 취지)
상식적인 수준에서 몇개만 plotting해보도록 하자
library(ggplot2)
X_train %>% ggplot(aes(내점일수, fill=y_train$genfac)) + geom_density(alpha=.5)
내점일수는 남성의 경우 하루 혹은 이틀인 비율이 여성에 비해 압도적으로 큰 것을 알 수 있다
(나도 1년에 백화점은 많으면 3~4번 가는 정도니 ㅎㅎ)
즉, 데이터의 내점 일수가 1일 혹은 2일이면 남성일 확률이 여성일 확률보다 높다고 할 수 있다 (density plot만으로는 확률의 수치를 계산할 수는 없다)
X_train %>% ggplot(aes(구매주기, fill=y_train$genfac)) + geom_density(alpha=.5)
'구매주기'가 뭘 뜻하는지는 모르겠는데 (방문과 방문 사이의 Gap Date를 말하나?), 남자와 여자간 밀도 차이는 크지 않다고 봐도 무방한 것 같다. 추후 변수 선택 시 제거될 것으로 생각한다
X_train %>% ggplot(aes(주말방문비율, fill=y_train$genfac)) + geom_density(alpha=.5)
주말방문비율은 남성과 여성이 약간의 차이를 보인다고 할 수 있다
(남성은 여성에 비해 주말에 백화점을 찾는 경우가 더 많다)
Train <- X_train
Train$gender <- y_train$genfac
Train %>%
filter(주구매상품 == '화장품') %>%
ggplot(aes(gender)) + geom_bar()
주구매상품이 화장품일 경우 여성의 비율이 남성의 비율보다 압도적으로 높은 것을 알 수 있다 (약 3배차)
이런 느낌으로 시간이 남아돈다면 여유롭게 EDA를 통해 데이터를 눈으로 느껴보는 것도 괜찮다만... 시험때는 오픈북이 아니니깐 우여곡절이 굉장히 많을 것으로 생각되니 전처리 후에 summary 수준에서 눈으로 대충 확인한 뒤 바로 분석 모델 구현에 시간 대다수를 할애해야 할 것 같다
3. 로지스틱 회귀분석
수치형 데이터 표준화/정규화나 아웃라이어 제거 없이 앞서서 기본적인 전처리만 된 데이터를 통째로 로지스틱 회귀분석 모델에 집어넣어 보자
이진분류를 위한 Generalized Linear Model (일반화 선형 모델)은 glm 함수로 구축할 수 있다 (family 인자로 binomial을 입력해야 이항분포 분류 모델이 동작한다)
model_glm <- glm(y_train$gender ~ .-cust_id, data=X_train, family='binomial')
고객 아이디는 분류 속성에서 제외해야 하므로 .-cust_id 구문 사용
summary(model_glm)
>
Call:
glm(formula = y_train$gender ~ . - cust_id, family = "binomial",
data = X_train)
Deviance Residuals:
Min 1Q Median 3Q Max
-2.7854 -1.1944 0.6875 0.9717 2.0225
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) 6.488e-01 2.418e-01 2.683 0.007293 **
총구매액 8.846e-10 5.638e-10 1.569 0.116646
최대구매액 2.267e-09 2.139e-09 1.060 0.289188
환불금액 4.938e-09 2.476e-09 1.994 0.046144 *
주구매상품가구 -3.966e-02 6.470e-01 -0.061 0.951125
주구매상품건강식품 -1.974e-01 3.147e-01 -0.627 0.530368
주구매상품골프 -4.409e-01 2.513e-01 -1.754 0.079383 .
주구매상품구두 -1.732e-01 2.945e-01 -0.588 0.556564
주구매상품기타 9.539e-02 1.268e-01 0.752 0.451946
주구매상품남성 캐주얼 -1.304e+00 3.384e-01 -3.855 0.000116 ***
주구매상품남성 트랜디 -3.716e-01 1.478e+00 -0.251 0.801443
주구매상품남성정장 -1.476e+00 5.701e-01 -2.589 0.009626 **
주구매상품농산물 4.936e-01 1.573e-01 3.139 0.001697 **
주구매상품대형가전 -4.207e-01 7.382e-01 -0.570 0.568709
주구매상품디자이너 1.333e+00 2.435e-01 5.474 4.39e-08 ***
주구매상품란제리/내의 9.459e-01 8.281e-01 1.142 0.253339
주구매상품명품 -1.399e-02 2.380e-01 -0.059 0.953134
주구매상품모피/피혁 7.047e-01 3.092e-01 2.279 0.022675 *
주구매상품보석 5.397e-01 1.234e+00 0.437 0.661789
주구매상품생활잡화 -1.513e-02 5.332e-01 -0.028 0.977356
주구매상품섬유잡화 -1.098e-01 2.276e-01 -0.482 0.629564
주구매상품셔츠 -6.013e-01 3.969e-01 -1.515 0.129821
주구매상품소형가전 7.771e-02 1.442e+00 0.054 0.957021
주구매상품수산품 2.811e-01 1.922e-01 1.462 0.143620
주구매상품스포츠 -3.466e-01 2.651e-01 -1.308 0.191001
주구매상품시티웨어 1.142e+00 2.005e-01 5.696 1.22e-08 ***
주구매상품식기 -1.092e+00 8.600e-01 -1.270 0.204113
주구매상품아동 2.850e-01 3.578e-01 0.796 0.425813
주구매상품악기 -1.442e+01 6.177e+02 -0.023 0.981383
주구매상품액세서리 1.451e+00 1.134e+00 1.280 0.200554
주구매상품육류 7.083e-02 2.863e-01 0.247 0.804597
주구매상품일용잡화 5.107e-01 2.872e-01 1.778 0.075425 .
주구매상품젓갈/반찬 -2.359e-01 3.863e-01 -0.611 0.541348
주구매상품주류 -1.550e+00 6.650e-01 -2.330 0.019792 *
주구매상품주방가전 -9.655e-01 4.464e-01 -2.163 0.030554 *
주구매상품주방용품 2.066e-01 3.764e-01 0.549 0.583042
주구매상품차/커피 2.084e-01 3.264e-01 0.638 0.523172
주구매상품축산가공 -7.079e-02 3.601e-01 -0.197 0.844134
주구매상품침구/수예 1.446e+01 4.307e+02 0.034 0.973222
주구매상품캐주얼 1.326e-01 2.297e-01 0.577 0.563889
주구매상품커리어 4.698e-01 7.231e-01 0.650 0.515929
주구매상품통신/컴퓨터 -6.239e-01 1.271e+00 -0.491 0.623417
주구매상품트래디셔널 -5.767e-02 4.429e-01 -0.130 0.896388
주구매상품피혁잡화 7.230e-02 3.367e-01 0.215 0.829986
주구매상품화장품 8.184e-01 1.745e-01 4.689 2.75e-06 ***
주구매지점관악점 -7.553e-01 3.773e-01 -2.002 0.045314 *
주구매지점광주점 -8.751e-01 2.856e-01 -3.064 0.002182 **
주구매지점노원점 -2.747e-01 3.114e-01 -0.882 0.377735
주구매지점대구점 -1.903e+00 8.903e-01 -2.137 0.032559 *
주구매지점대전점 -6.418e-01 3.324e-01 -1.931 0.053534 .
주구매지점동래점 -5.255e-01 3.765e-01 -1.396 0.162728
주구매지점미아점 -8.175e-01 3.209e-01 -2.548 0.010843 *
주구매지점본 점 -6.841e-01 2.102e-01 -3.254 0.001137 **
주구매지점부산본점 -3.651e-01 2.460e-01 -1.484 0.137763
주구매지점부평점 -2.418e-01 3.621e-01 -0.668 0.504282
주구매지점분당점 -4.937e-01 2.245e-01 -2.199 0.027884 *
주구매지점상인점 1.195e+01 8.827e+02 0.014 0.989197
주구매지점센텀시티점 -9.588e-01 9.036e-01 -1.061 0.288655
주구매지점안양점 -1.053e+00 4.390e-01 -2.400 0.016396 *
주구매지점영등포점 -7.173e-01 2.447e-01 -2.931 0.003380 **
주구매지점울산점 -8.493e-01 9.343e-01 -0.909 0.363314
주구매지점인천점 -1.258e+00 4.197e-01 -2.997 0.002730 **
주구매지점일산점 -5.083e-01 2.528e-01 -2.010 0.044388 *
주구매지점잠실점 -4.101e-01 2.231e-01 -1.838 0.066027 .
주구매지점전주점 -1.517e+01 3.687e+02 -0.041 0.967188
주구매지점창원점 1.326e-01 1.201e+00 0.110 0.912140
주구매지점청량리점 -7.024e-01 3.045e-01 -2.306 0.021092 *
주구매지점포항점 -7.000e-01 6.742e-01 -1.038 0.299195
내점일수 6.712e-03 2.431e-03 2.761 0.005764 **
내점당구매건수 2.865e-02 2.278e-02 1.258 0.208402
주말방문비율 -4.309e-01 1.257e-01 -3.428 0.000608 ***
구매주기 6.120e-04 1.548e-03 0.395 0.692511
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 4634.5 on 3499 degrees of freedom
Residual deviance: 4242.3 on 3428 degrees of freedom
AIC: 4386.3
Number of Fisher Scoring iterations: 13
주말방문비율, 내점일수 속성은 EDA에서 확인한 것처럼 유의미한 변수가 된 것을 알 수 있다
또한 주구매상품 중 화장품과 시티웨어, 남성캐주얼, 디자이너 등이 분류 시 주요 변수로 활용되었다
AIC (Akaike Information Criterion)는 4386.3으로 측정되었으며, 다른 모델들과의 비교 시 상대척도로 활용할 수 있다
ROC 커브 작성 및 AUC를 계산해보자 (ROCR 패키지 사용)
※ ROCR은 시험장에서 기본으로 주어지지 않는다 ㅠ AUC를 다르게 계산하는 방법도 알아봐야겠다
library(ROCR)
y_pred_glm <- predict(model_glm, newdata=X_train, type='response')
pred_glm <- prediction(y_pred_glm, y_train$gender)
perf_glm <- performance(pred_glm, measure='tpr', x.measure='fpr')
plot(perf_glm)
abline(0, 1)
구축된 모델 model_glm을 통해 예측값 y_pred를 구한 뒤, 실제값 y_obs와의 차이를 바탕으로 plot
(가로축은 False-Positive Rate, 세로축은 True-Positive Rate로 하면 ROC Curve가 된다)
performance(pred_glm, "auc")@y.values[[1]]
> [1] 0.6952498
AUC는 0.6952498로 훈련 데이터에서도 분류 성능이 그다지 좋지 않은 모델이라고 할 수 있다
만약 더이상 모델 최적화할 시간적 여유가 없다면 모델을 토대로 답안을 작성하자
(성능이 아무리 좋아도 답안 제출하지 못하면 0점 처리될 듯)
y_test_glm <- predict(model_glm, newdata=X_test, type='response')
head(y_test_glm)
> 1 2 3 4 5 6
0.4452823 0.8638631 0.8148605 0.6521488 0.5695100 0.7698365
predict 함수에 모델과 테스트용 데이터, type='response' 인자로 수행하면 2482개 테스트 데이터에 대한 로지스틱 함수 출력값 (0 ~ 1)으로 반환한다
0은 여자, 1은 남자를 가리키므로 시험 문제에서 말하는 '고객의 성별 예측값(남자일 확률)'과 일맥상통하므로 별다른 후처리없이 바로 제출용 파일을 작성하면 된다
result <- as.data.frame(cbind(X_test$cust_id, y_test_glm))
names(result) <- c('cust_id', 'gender')
write.csv(result, '수험번호.csv', row.names=FALSE)
names 함수로 데이터프레임의 헤더명을 바꿀 수 있다
write.csv 함수로 데이터프레임을 csv 파일로 저장하는데, row.names=FALSE로 인덱스열을 제거하면 답안 출제 포맷에 맞출 수 있다
어느 정도 분석은 되는 것 같으니 이제 데이터 표준화/정규화, 변수 선택 등 기법을 적용해 분석 모델의 성능을 높여보고, 릿지/라쏘 회귀분석, 의사결정나무, 랜덤포레스트, SVM 등 다양한 모델을 구축해 모델간 분류 성능을 비교하고 앙상블도 구현해보자
(주말에 공부도 할 겸 포스팅해야겠다)
[시리즈]
빅데이터분석기사 실기 제2유형 문제 풀이 예시 (1)
빅데이터분석기사 실기 제2유형 문제 풀이 예시 Final
'Study > 자격증' 카테고리의 다른 글
빅데이터분석기사 실기 제2유형 문제 풀이 예시 (3) (8) | 2021.06.12 |
---|---|
빅데이터분석기사 실기 제2유형 문제 풀이 예시 (2) (0) | 2021.06.11 |
빅데이터분석기사 실기 예시문제 유형 분석 (0) | 2021.05.12 |
빅데이터분석기사 응시자격 심사 서류제출 (0) | 2021.05.11 |
빅데이터분석기사 필기(2회) 시험결과 발표 (0) | 2021.05.07 |