📚 보험 납부금 기반 의료비 예측 프로젝트
📌 프로젝트 개요
수행 기간 |
2022.09 |
사용 데이터 |
Kaggle 오픈 데이터 |
사용 프로그램 및 언어 |
Brightics Studio, Python |
📌 주제 선정 배경
- 여러 사람들이 접할 수 있으면서 많은 배경지식을 요구하지 않는 데이터였으면 좋겠다.
- 공공 데이터로 구현할 수 있어야한다.
- 모두가 접해보지 않았던 주제의 데이터였으면 좋겠다.
세 가지 주제 중 투표를 통해 보험 납부금에 기반해 의료비 예측 프로젝트를 진행하기로 했으며,
Kaggle의 https://www.kaggle.com/datasets/mirichoi0218/insurance 데이터를 활용하기로 결정했다.
📌 데이터 소개 & 프로젝트 목표
1. 데이터 소개
age
|
나이/numeric
|
smoker
|
흡연여부/string
|
sex
|
성별/string
|
region
|
거주지/string
|
bmi
|
비만도/numeric
|
charges
|
의료비/numeric
(종속변수)
|
children
|
출산경험수/numeric
|
이 데이터셋의 컬럼들은 개인의 사회적 ∙ 신체적 개인정보를 나타내고 있다.
그래서 우리 팀은 개인은 본인의 의료비를 직접 예측하여 과납을 막고,
그리고 보험회사는 보험료 변화 추세를 파악해 그에 따른 맞춤형 상품을 기획할 수 있도록
이 컬럼 정보를 기반으로 의료비 예측을 진행하기로 했다.
📑 프로젝트 보고서
1. 데이터 보기
'Dataset Info'를 보면 컬럼 수는 7개,
관측값(행 수)은 1338개,
결측치 0%,
총 메모리 크기는 73.2KIB,
변수 타입은 numeric이 4개,
Categorical(string)이 3개인 것을 확인할 수 있다.
feature(columns) 간 상관관계를 보여주는 히트맵 자료다.
종속변수인 charges와의 상관관계를 위주로 볼텐데,
(string인 'sex', 'smoker', 'region'은 포함되지 않았으며,
전체 변수의 correlation은 string을 numeric으로 변경한 뒤 한번 더 확인한다.)
전처리하지 않은 원본 데이터에서 Target과의 상관관계는 age>bmi>children 순으로 크다.
그리고 변수간 음의 상관관계를 갖는 쌍은 없는걸로 보인다.
2. EDA
2-1) 단순 EDA
18-20세에 해당하는 응답자의 비율이 압도적으로 많다.
나이대를 그룹으로 묶은 새 변수 age_group에 대한 히스토그램에서는 40대의 응답자가 가장 많은 것으로 나타났다.
여성과 남성의 비율이 비슷하고, 흡연자보다는 비흡연자가 더 많
south east에 거주하는 응답자가 많고 나머지는 약 320으로 비슷하다.
2-2) 복합적 EDA _bmi 기준
- bmi별 나이대에 따른 의료비 비용 산점도 : 비만도가 높고 나이가 많을수록 의료비가 높아짐.
- bmi별 성별에 따른 의료비 비용 산점도 : 의료비와 성별은 시각화자료로는 패턴 인식이 어렵다.
- bmi별 흡연유무에 따른 의료비 비용 산점도 : 비만도가 높고 흡연자일수록 의료비가 높아짐.
- bmi별 거주지에 따른 의료비 비용 산점도: 비만도가 높고 southeast에 거주할수록 의료비가 높아짐.
3. 데이터 전처리
3-1) 결측치 처리 : 결측치는 0%였으니 처리는 패쓰
3-2) 중복값 처리
전체 columns이 겹치는 행이 존재하기 때문에 Input Columns에 전체 컬럼을 넣어줬고
삭제된 행은 1개임을 output table로 알 수 있다.
3-3) 이상치 처리 (수치형 변수 대상)
나이는 17세부터 65세까지 분포하고 있는걸 확인할 수 있다.
Bmi는 15~54까지 분포하고 있다.
50 이상도 초고도비만으로 분류되어있기 때문에 이상치로 구분하지 않는다.
그래서 Bmi 변수에도 이상치가 없다.
전체 응답자의 출산경험수를 살펴보면 그 수는 0명에서 5명까지로 이상치가 없다.
그리고 자녀 수는 0명이 가장 많다.
연속형 변수로 table로 확인한다.
Charges를 내림차순/오름차순으로 정렬하니 최소값 1121, 최대값 63770으로 분석되었다.
하지만 다른 변수들과 같이 살펴보았을 때, 의료비가 낮을수록 나이가 어리면서 비흡연자이고,
의료비가 높을수록 나이가 많으면서 흡연자였기 때문에 상관관계가 있다고 판단해 이상치가 없다고 정의하고 진행했어요!
3-4) Label Encoder
성별과 흡연여부 컬럼에 라벨인코딩을 적용한다.
3-5) One-Hot Encoder
지역은 4개의 값으로 작성되어 있기 때문에 원핫인코딩을 적용한다.
4. 모델링
참고문헌
https://scikit-learn.org/stable/index.html
1. Decision Tree
- 분류와 회귀에 사용되는 비모수적인 지도학습 모델
- 데이터에서 추론되는 결정 규칙을 학습해서 종속변수의 값을 예측하는 모델
- 말 그대로 나무처럼 가지로 뻗어나가는 듯이 생긴 트리구조이면서, 트리가 깊을수록 결정 규칙이 복잡해지고 모델이 적합해진다는 것이 특징
- 장점 : 이해와 해석이 쉽고 수치형∙범주형 데이터를 모두 처리할 수 있습니다.
- 단점 : 과대적합이 자주 발생합니다.(해결방안 : 가지치기(pruning))
2. XGBoost Regression
- 'XGBoost'는 그레디언트 부스트 결정 트리(Gradient Boosted Decision Trees) 알고리즘의 오픈 소스 구현
- 분류와 회귀의 모델
- 일반적으로 단일 트리는 실제까지 적용시키에는 약하기 때문에 여러 트리의 예측을 결합하는 앙상블을 통해 강화시키곤 하는데, XGBoost가 이러한 모델 중 하나임
- 높은 성능을 나타내기 때문에 자주 사용되고, 파라미터 조절을 통해 최적의 모델을 만들기에 좋은 모델
4-1) 데이터 분할
Split Data 블록으로 각각의 데이터 프레임을 7:3 비율로 나누면서
동시에 seed를 123으로 고정해서
Train, Test 데이터셋을 준비하고 모델링 준비를 마친다.
4-2) Decision Tree
변수 중요도에서는 전체적으로 흡연여부의 중요도가 0.61로 가장 높고
그 다음으로는 bmi는 0.21, 나이 0.13으로 중요도가 높다.
부양 자녀수와 성별, 거주 지역은 0.02에서 0.00 사이로 중요도가 낮은 편에 속한다.
상관성의 관점에서 살펴볼 수 있는 r2_score는 높을수록,
거리의 관점에서 살펴보는 mean_absolute_error(MAE)와
mean_absolute_percentage_error(MAPE)는 작을수록 좋은 모델이다.
r2_score는 파라미터 조정 후 모델의 성능이 더 높고, MAE와 MAPE도 조정 후 모델의 성능이 더 좋은걸 볼 수 있다.
그럼 결론적으로는 튜닝 후 모델이 성능이 더 좋아진걸 알 수 있다.
4-3) XGBoost
BMI의 중요도가 0.39로 가장 높고, 다음으로는 나이, 부양자녀수, 흡연여부 순으로 중요도가 높다.
성별, 거주 지역은 0.04에서 0.00 사이로 중요도가 낮은 편에 속한다.
5. 그외 모델
6. 최종 결과물