의료비 예측하기
선형 회귀
미국의 환자 의료비를 포함한 가상의 데이터셋
1,338개의 관측치와 7개의 변수로 구성되어 있음
- age : 제 1순위 보험금 수령인의 나이를 나타내는 정수
- sex : 성별
- bmi : 체질량 지수
- children : 보험에서 보장하는 아이들의 수
- smoker : 흡연 여부에 따라 yes, no
- region : 미국 내 약관자의 거주지 4개 지역 (northeast, southeast, southwest, northwest)
1. 데이터 준비와 탐구
> insurance = read.csv("C:/R/insurance.csv", stringsAsFactors = T)
> str(insurance)
'data.frame': 1338 obs. of 7 variables:
$ age : int 19 18 28 33 32 31 46 37 37 60 ...
$ sex : Factor w/ 2 levels "female","male": 1 2 2 2 2 1 1 1 2 1 ...
$ bmi : num 27.9 33.8 33 22.7 28.9 ...
$ children: int 0 1 3 0 0 0 1 3 2 0 ...
$ smoker : Factor w/ 2 levels "no","yes": 2 1 1 1 1 1 1 1 1 1 ...
$ region : Factor w/ 4 levels "northeast","northwest",..: 4 3 3 2 2 3 3 2 1 2 ...
$ charges : num 16885 1726 4449 21984 3867 ...
변수들 중 의료비에 대해 확인해보면
> summary(insurance$charges)
Min. 1st Qu. Median Mean 3rd Qu. Max.
1122 4740 9382 13270 16640 63770
> hist(insurance$charges) #의료비 분포 확인
- 의료비는 0달러에서 15,000달러 사이에 많이 분포하는 것으로 보인다.
- 선형 회귀는 종속변수에 대해 정규 분포라고 가정하므로 이 분포는 이상적이지 않다.
① 속성 간의 관계 살펴보기 : 상관관계
데이터에 회귀 모델을 적합화하기 전에 독립변수와 종속변수 관계를 확인하는 것이 필요하다.
> ins = insurance[c("age", "bmi", "children", "charges")] # 수치형 데이터
> cor(ins) # 상관관계 확인
age bmi children charges
age 1.0000000 0.1092719 0.04246900 0.29900819
bmi 0.1092719 1.0000000 0.01275890 0.19834097
children 0.0424690 0.0127589 1.00000000 0.06799823
charges 0.2990082 0.1983410 0.06799823 1.00000000
- 수치형 변수에 대해 상관관계를 확인해보았다.
- age와 charges / bmi와 charges 사이에 약한 양의 상관관계가 있는 것으로 보인다.
② 속성 간의 관계 시각화 : 산포도 매트릭스
산포도는 속성 간의 관계를 시각화 하는데 매우 유용하다.
> pairs(ins) # 산포도 매트릭스
- age와 charges의 관계는 상대적인 직선을 갖는 것으로 보인다.
- bim와 charges는 두 개의 구별되는 그룹을 갖는 것으로 보인다.
산포도에 추가 정보를 넣을 수도 있다 ( psych 패키지의 pairs.panels() 함수 사용 )
> library(psych)
> pairs.panels(ins)
- 상관관계 타원은 변수가 얼마나 강하게 관련되어 있는지를 시각적으로 표현한다. ( 모양이 늘어지면 상관관계가 점점 강해지는 것)
2. 데이터로 모델 훈련
의료비와 6개의 변수 간의 관계를 선형 회귀 모델로 적합해보자
> ins_model = lm(charges ~ age + children + bmi + sex + smoker + region, data=insurance)
> ins_model
Call:
lm(formula = charges ~ age + children + bmi + sex + smoker +
region, data = insurance)
Coefficients:
(Intercept) age children
-11938.5 256.9 475.5
bmi sexmale smokeryes
339.2 -131.3 23848.5
regionnorthwest regionsoutheast regionsouthwest
-353.0 -1035.0 -960.1
- age가 1년 증가할 때 charges는 256.9 달러 증가
- children이 1명 증가할 때 charges는 475.5 달러 증가 등등
- lm() 함수가 모델에 포함된 각 타입에 대해 자동으로 dummy codin을 적용해 계수가 총 8개이다.
- smokeryes는 흡연자가 비흡연자보다 평균 23848.5 달러의 의료비를 더 지불한다는 것
3. 모델 성능 평가
> summary(ins_model)
Call:
lm(formula = charges ~ age + children + bmi + sex + smoker +
region, data = insurance)
Residuals:
Min 1Q Median 3Q Max
-11304.9 -2848.1 -982.1 1393.9 29992.8
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -11938.5 987.8 -12.086 < 2e-16 ***
age 256.9 11.9 21.587 < 2e-16 ***
children 475.5 137.8 3.451 0.000577 ***
bmi 339.2 28.6 11.860 < 2e-16 ***
sexmale -131.3 332.9 -0.394 0.693348
smokeryes 23848.5 413.1 57.723 < 2e-16 ***
regionnorthwest -353.0 476.3 -0.741 0.458769
regionsoutheast -1035.0 478.7 -2.162 0.030782 *
regionsouthwest -960.0 477.9 -2.009 0.044765 *
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 6062 on 1329 degrees of freedom
Multiple R-squared: 0.7509, Adjusted R-squared: 0.7494
F-statistic: 500.8 on 8 and 1329 DF, p-value: < 2.2e-16
- 이 모델의 설명력이 약 75.09%임을 확인할 수 있다.
4. 모델 성능 향상
① 비선형 관계 추가
회귀식에 나이에 대한 제곱 항을 추가해보자
> insurance$age2 = insurance$age^2
② 수치 변수를 binary indicator로 변환
비만 (BMI > 30)인 경우에 더 많은 의료비가 발생하므로 BMI가 30 이상이면 1, 그렇지 않으면 0인 binary indicator를 만들어주자
> insurance$bmi30 = ifelse(insurance$bmi >= 30, 1, 0)
③ 상호 작용 효과 추가
두 속성이 혼합된 효과를 상호작용이라 한다.
예를 들어 charges~bmi30 * smoker 은 charges~bmi30 + smokeryes+bmi30:smokeryes 모델을 나타낸다.
이제 이 세 가지를 모두 적용해 회귀 모델을 향상시켜볼 것이다.
> ins_model2 = lm(charges ~ age + age2 + children + bmi + sex + bmi30*smoker + region, data=insurance)
> summary(ins_model2)
Call:
lm(formula = charges ~ age + age2 + children + bmi + sex + bmi30 *
smoker + region, data = insurance)
Residuals:
Min 1Q Median 3Q Max
-17296.4 -1656.0 -1263.3 -722.1 24160.2
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 134.2509 1362.7511 0.099 0.921539
age -32.6851 59.8242 -0.546 0.584915
age2 3.7316 0.7463 5.000 6.50e-07 ***
children 678.5612 105.8831 6.409 2.04e-10 ***
bmi 120.0196 34.2660 3.503 0.000476 ***
sexmale -496.8245 244.3659 -2.033 0.042240 *
bmi30 -1000.1403 422.8402 -2.365 0.018159 *
smokeryes 13404.6866 439.9491 30.469 < 2e-16 ***
regionnorthwest -279.2038 349.2746 -0.799 0.424212
regionsoutheast -828.5467 351.6352 -2.356 0.018604 *
regionsouthwest -1222.6437 350.5285 -3.488 0.000503 ***
bmi30:smokeryes 19810.7533 604.6567 32.764 < 2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 4445 on 1326 degrees of freedom
Multiple R-squared: 0.8664, Adjusted R-squared: 0.8653
F-statistic: 781.7 on 11 and 1326 DF, p-value: < 2.2e-16
- 이 모델의 설명력은 약 86.64%로 아까보다 향상된 것을 확인할 수 있다.
- 흡연 요소는 13,404 달러 만큼의 비용이 증가한다.
- 비만인 흡연자는 매년 19,810 달러를 더 지출하는 것으로 보인다.
'R > ML & DL 공부' 카테고리의 다른 글
[R] 콘크리트 내구성 예측 - 인공신경망 (0) | 2022.06.03 |
---|---|
[R] 와인 등급 예측 - 회귀트리, 모델트리 (0) | 2022.04.22 |
[R] 휴대폰 스팸 분류 - Naive bayes (0) | 2022.04.20 |
[R] 독버섯 분류 - 분류 규칙 (OneR, Ripper) (0) | 2022.04.19 |
[R] 은행 대출 채무 여부 분류 - 의사결정트리 (0) | 2022.04.15 |