이번 포스팅을 기점으로 연구학점제에서 했던 내용들과, 그동안 도전했던 공모전에 대해 정리하려고한다. 제일 먼저 하고 싶은건, 이전에 실패했던 모델 구현에 재도전하는 것이다. 1년전, 학부 2학년 2학기 때 전공 수업에서 엑셀을 이용하여 신용카드 연체 예측 데이터를 분석했다. 엑셀 함수를 활용해 숫자로 의미있는 정보를 만드는 과정을 겪은 후, 데이터 분석가라는 목표가 세워졌다고 생각한다.
종강 이후 수업 전공 교수님께 데이터 출처를 여쭤봤고, 교수님께서는 데이콘의 신용카드 사용자 연체 예측 대회 데이터를 이용하라고 말씀하셨다. 그리고 방학 동안 머신러닝 기법을 이용하여 분류 모델을 만들어보면 직접적인 데이터 분석 과정을 체험하게 되어 더욱 의미 있는 결과를 얻을 수 있을 것이라는 조언을 주셨다.
하지만, 당시에는 이론적인 지식을 실제로 구현할 능력이 부족하여 제대로 된 결과를 얻지 못했다. 지난 1년 동안 연구학점제에서 선행 연구를 분석하고, python과 데이터 분석 플랫폼 KNIME을 활용하여 모델을 만들어보며 실력을 키웠다. 또한 빅데이터 경진대회에 참여하면서 실전 경험도 쌓을 수 있었다. 기술 블로그의 첫 글로, 이전에 실패했던 모델을 다시 구현해보자. 전체 프로세스는 KNIME을 기반으로 하고, 필요한 부분은 Python을 활용했다.
EDA

Workflow에서 EDA 부분만 캡쳐했다. 하나씩 feature를 확인해보자. 전체 feature 정보는 다음과 같다.
gender : 성별
car : 차량 소유 여부
reality : 부동산 소유 여부
child_num : 자녀 수
income_total : 연간 소득
income_type : 소득 분류
['Commercial associate', 'Working', 'State servant', 'Pensioner', 'Student']
edu_type : 교육 수준
['Higher education' ,'Secondary / secondary special', 'Incomplete higher', 'Lower secondary', 'Academic degree']
family_type : 결혼 여부
['Married', 'Civil marriage', 'Separated', 'Single / not married', 'Widow']
house_type : 생활 방식
['Municipal apartment', 'House / apartment', 'With parents', 'Co-op apartment', 'Rented apartment', 'Office apartment']
DAYS_BIRTH : 출생일로, 데이터 수집 당시 (0)부터 역으로 센다. 즉, -1은 데이터 수집일 하루 전에 태어났음을 의미한다.
DAYS_EMPLOYED : 업무 시작일로, 데이터 수집 당시 (0)부터 역으로 센다. 즉, -1은 데이터 수집일 하루 전부터 일을 시작함을 의미한다.
FLAG_MOBIL : 핸드폰 소유 여부
work_phone : 업무용 전화 소유 여부
phone : 전화 소유 여부
email : 이메일 소유 여부
occyp_type : 직업 유형
family_size : 가족 규모
begin_month : 신용카드 발급 월로, 데이터 수집 당시 (0)부터 역으로 센다. 즉, -1은 데이터 수집일 한 달 전에 신용카드를 발급함을 의미한다.
credit : 사용자의 신용카드 대금 연체를 기준으로 한 신용도로, 낮을 수록 높은 신용의 신용카드 사용자를 의미한다. 분류 모델의 Target feature이다.
<income_type>
| 소득 | 수 |
| Working | 13645 |
| Commercial associate | 6202 |
| Pensioner | 4449 |
| State servant | 2154 |
| Student | 7 |
학생의 수가 제일 작고, 회사원이 제일 많음을 확인할 수 있다.
<edu_type>
| 소득 | 수 |
| Secondary / secondary special | 17995 |
| Higher education | 7162 |
| Incomplete higher | 1020 |
| Lower secondary | 257 |
| Academic degree | 23 |
전체 데이터에서 중학교 혹은 고등학교까지 졸업한 사람이 다수를 차지하고 있다.
<family_type>
| 소득 | 수 |
| Married | 18196 |
| Single / not married | 3496 |
| Civil marriage | 2123 |
| Separated | 1539 |
| Widow | 1103 |
미혼에 비해 기혼자의 신용카드 발급 수가 많음을 확인할 수 있다.
<house_type>
| 소득 | 수 |
| House / apartment | 23653 |
| With parents | 1257 |
| Municipal apartment | 818 |
| Rented apartment | 429 |
| Office apartment | 190 |
| Co-op apartment | 110 |
사용자 다수가 자가 혹은 아파트에 거주하고 있음을 확인할 수 있다.
<child_num>

자녀의 수에 이상치(Outlier)가 있음을 확인했다. 전처리 과정에서 자녀의 수가 5보다 큰 6개의 데이터를 제거했다.
<family_size>

가족의 수도 자녀의 수와 직접적으로 연관이 있을 수 있다. 전처리 과정에서 7보다 큰 9개의 데이터를 제거했다.
<income_total>

다른 수치형 feature에 비해 값이 많이 높다. 편향을 막기 위해, log 변환을 진행했다. 수치형 데이터를 살펴봤으니, 이제 범주형 데이터도 확인해보았다.
<gender>

성별은 여성이 남성의 2배인 것을 확인했다.
<gender>

차량을 소유하지 않은 경우가 그렇지 않은 경우보다 많음을 확인했다.
<Reality>

차량과 달리 부동산은 소유한 사람이 더 많았는데, house_type data와 묶어서 해석해보면 자가를 가진 사람이 많다고 추측할 수 있다.
<Credit>

Target 변수의 값을 보면, 전반적으로 신용도가 낮은 사람이 많음을 확인할 수 있다.
전처리

전처리 과정은 다음과 같다.
1. 메타 데이터 설명에 따라, 경력이 0보다 큰 데이터를 0으로 처리
2. Days_birth feature에 abs와 floor 함수를 사용해 age 파생변수 생성
3. Days_employed feature도 2번과 동일한 과정 진행
4. begin_month feature에 abs 함수를 사용해서 양수처리
5. occup_type feature의 결측치를 무직자로 간주, no_work 삽입
6. 파생변수 생성에 활용한 Days_birth, Days_employed를 제거하고, 모든 값이 1인 Flag_mobil도 제거
7. 다른 수치형 feature에 비해 값의 범위가 넓은 income_total을 log 변환
8. 범주형 데이터를 숫자로 변환
9. child_num. family_size의 이상치 제거

전처리를 마치니 26,442행의 데이터를 확인할 수 있었다. 이제 분류 모델을 만들어보자.
모델링

모델을 사용하기 이전, feature가 많기 때문에 후진제거법으로 error 값을 최소화하는 feature를 추출했다. Random forest 모델을 사용한 결과는 다음과 같다.

최적의 feature 조합을 추출했으니, 이제 다양한 분류 모델을 사용하고 결과를 비교해보자.


모델링 결과는 다음과 같다. KNIME에서 제공하는 분류 모델과 대회 우승자가 활용한 Catboost 모델을 사용했다. 결과는 Tree Ensemble 모델이 제일 좋은데, 별도의 튜닝 과정을 거치지 않아 Catboost의 성능이 낮다고 추정된다. 이제 Test data를 불러와서 전처리를 진행하고, Tree ensemble 모델로 예측한 결과를 확인해보자.

이미 대회가 종료되었기 때문에, 부담없이 결과를 제출할 수 있었다. 평가 산식은 logloss로, 점수는 0.837점이 나왔다. 좋은 결과는 아니지만, 1년전에 실패했던 모델 구현에 성공하니 이전과 비교하여 실력이 많이 늘었고, 또 하나의 도전에 성공했다는 생각이 들었다. 앞으로는 연구학점제를 하면서 배웠던 내용을 정리해서 포스팅하며 나만의 포트폴리오를 만들어 갈 예정이다.
'Dacon' 카테고리의 다른 글
| [NLP] 뉴스 기사 레이블 복구 해커톤 (0) | 2023.09.25 |
|---|---|
| [금융] 제1회 KRX 금융 빅데이터 활용 아이디어 경진대회 (0) | 2023.09.17 |