YOGYUI

빅데이터분석기사 실기 제2유형 문제 풀이 예시 (1) 본문

Study/자격증

빅데이터분석기사 실기 제2유형 문제 풀이 예시 (1)

요겨 2021. 6. 11. 11:02
반응형

빅데이터분석기사 실기시험(06/19)이 일주일 앞으로 다가왔다

예시문제의 제2유형을 내 나름대로 풀어보면서 관련 코드를 정리해보자는 생각이 들었다

(원래는 귀찮아서 포스팅 안하려고 했는데 ㅎㅎ... 게시글 수도 올릴겸, 방문자 수도 올릴겸... 겸사겸사)

 

현업에서는 특별한 경우가 아니면 대부분 파이썬 (아니면 C++, Java)으로 업무를 진행하는데, 구글링이나 쿡북 없이 모든 코드를 작성할 정도로 머리가 비상하지는 않아서 (ㅠㅠ) 시험은 그냥 R로 치르기로 결심했다 (R도 평소에 조금씩 써야겠다...)

시험이 오픈북이 아니다보니 필요한 함수들을 외워가야 되는데 R은 함수명, 사용법이 대개 심플해서 마음편히 준비해갈 수 있다


각설하고, 제2유형 '모형 구축 및 평가' 예시문제의 데이터는 백화점 고객의 1년간 구매 데이터로, 데이터가 csv 형식으로 3개 주어진다

  1. X_train.csv: 학습용, 고객의 상품구매 속성
  2. y_train.csv: 학습용, 고객의 성별
  3. 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)

내점일수 Density Plot

내점일수는 남성의 경우 하루 혹은 이틀인 비율이 여성에 비해 압도적으로 큰 것을 알 수 있다

(나도 1년에 백화점은 많으면 3~4번 가는 정도니 ㅎㅎ)

즉, 데이터의 내점 일수가 1일 혹은 2일이면 남성일 확률이 여성일 확률보다 높다고 할 수 있다 (density plot만으로는 확률의 수치를 계산할 수는 없다)

 

X_train %>% ggplot(aes(구매주기, fill=y_train$genfac)) + geom_density(alpha=.5)

구매주기 Density Plot

'구매주기'가 뭘 뜻하는지는 모르겠는데 (방문과 방문 사이의 Gap Date를 말하나?), 남자와 여자간 밀도 차이는 크지 않다고 봐도 무방한 것 같다. 추후 변수 선택 시 제거될 것으로 생각한다

 

X_train %>% ggplot(aes(주말방문비율, fill=y_train$genfac)) + geom_density(alpha=.5)

주말방문비율 Density Plot

주말방문비율은 남성과 여성이 약간의 차이를 보인다고 할 수 있다

(남성은 여성에 비해 주말에 백화점을 찾는 경우가 더 많다)

 

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가 된다)

ROC 커브

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유형 문제 풀이 예시 (2)

빅데이터분석기사 실기 제2유형 문제 풀이 예시 (3)

빅데이터분석기사 실기 제2유형 문제 풀이 예시 Final

 

반응형
Comments