ㅇ머신러닝을 사용한 데이터 분석 (R과 파이썬)
> 기계에게 데이터를 학습시키는 것
(목적 : 기계가 데이터에서 패턴을 스스로 발견해 데이터를 분류하거나 수치예측 하는 것)
1. 지도학습 : 정답이 있는 데이터로 기계를 학습 시키는 것
- 분류 : knn(학습데이터가 전부 숫자), naivebayes(전부 문자), desicion tree(문자+숫자), oneR, Riper
- 수치예측 : 회귀분석
- 단순회귀분석
- 다중회귀분석
- 로지스틱 회귀분석
단순회귀분석 -> 상관관계분석 -> 다중회귀
ㄴ 독립변수들기리 다중공선성 문제가 있는지 확인
cf. 상관관계분석은 두 변수 사이에 어떤게 원인이고 어떤게 결과인지 모를 때 사용함
= 두 변수 사이의 연관성을 분석
반면, 회귀분석은 여러개의 변수 중 종속변수에 영향을 주는게 무엇인지 찾는 것. 인과관계.
2. 비지도학습 : 정답이 없는 데이터로 기계를 학습 시키는 것
3. 강화학습 : 기계가 처해진 환경을 스스로 이해하면서 데이터를 쌓아가며 학습하는 것
p.264에서 다중회귀분석에서 종속변수에 미치는 독립변수에 영향력을 확인하기 위한 기울기 구하는 수학식을 R로 구현했음
reg <- function(y,x){
x <- as.matrix(x) # x에 들어오는 값들을 행렬로 변환하는 코드
x <- cbind(intercept = 1,x) #intercept는 컬럼명을 붙여준 것임. 그냥 1만 써도 됨, 절편+독립변수 행렬
beta <- solve(t(x) %*% x) %*% t(x) %*% y # 기울기 구하는 수학식
colnames(beta) <- "estimate" #수치예측이라는 컬럼명 지정
print(beta)
}
문제305. 위의 코드를 파이썬으로 구현하시오.
#python
import pandas as pd
import numpy as np
smart = pd.read_csv("c:\\data\\multi_hg.csv", encoding = 'euckr')
def reg(y,x):
x['intercept'] = 1
x_c = x.columns
x = x.to_numpy()
B = np.dot(np.linalg.inv(np.dot(x.T,x)),np.dot(x.T,y))
for i in range(len(x_c)):
print(x_c[i],B[i])
reg(smart['만족감'],smart.iloc[:,:-1])
문제306. 우주왕복선 데이터를 가지고 o형링 파손에 가장 영향을 많이 미치는게 온도, 압력, 비행기 번호인지를 위의 함수를 이용해서 출력하시오.
import pandas as pd
import numpy as np
cha = pd.read_csv("c:\\data\\challenger.csv")
def reg(y,x):
x['intercept'] = 1
x_c = x.columns
x = x.to_numpy()
B = np.dot(np.linalg.inv(np.dot(x.T,x)),np.dot(x.T,y))
for i in range(len(x_c)):
print(x_c[i],B[i])
cha.head()
reg(cha['distress_ct'],cha.iloc[:,1:])
temperature -0.051385939850773554
field_check_pressure 0.001757008968537803
flight_num 0.014292842591640154
intercept 3.5270933833070686
ㅇ분류할때 정규화하고 모델 학습 시킴. 그렇다면 회귀분석에서도 정규화를 해야하는가?
ex. 미국 보험회사에서 미국 국민의 의료비를 가지고 보험 비용을 산정하는 예 (책 예제 참고)
종속변수 : 의료비
독립변수 : 부양가족수, 비만여부, 흡연여부, 나이, 거주지
1. 정규화하는 경우
보험비용에 가장 영향을 크게 미치는 변수가 무엇인지 확인할 때
2. 정규화 하지 않는 경우
- 나이가 한살 늘어날 때마다 매년 의료비가 얼마나 인상되어야하는지 예측해야 할 때
- 부양가족이 한명 늘어날 때마다 매년 의료비가 얼마나 인상되는지 예측해야 할 때
ex. 부양가족이 한 명 늘어나면 의료비가 연간 55만원 더 늘어날거라 예측된다.
ㅇ표준화와 정규화의 차이점 비교 설명
1. 표준화 : 평균이 0이고 표준편차가 1인 데이터 분포로 데이터를 구성하는 것
ex. R -> scale 함수(내장함수)
python -> from sklearn.preprocessing import StandardScaler
2. 정규화 : min/max 정규화인데 데이터를 0~1사이의 숫자로 변환하는 것
ex. R -> 함수를 직접 만들어서 사용해야함
python -> from sklearn.preprocessing import MinMaxScaler
기계학습 시에는 경험상 표준화와 정규화 중 정규화가 훨씬 더 결과가 좋게 나옴.
예제1. 미국 대학교 입학에 가장 크게 영향을 미치는 과목이 무엇인지 알아내시오.(정규화x)
데이터 : sports.csv
컬럼설명 : academic(학과점수), sports(체육점수),music(음악점수),acceptance(입학기준점수)
# R
reg <- function(y,x){
x <- as.matrix(x) # x에 들어오는 값들을 행렬로 변환하는 코드
x <- cbind(intercept = 1,x) #intercept는 컬럼명을 붙여준 것임. 그냥 1만 써도 됨, 절편+독립변수 행렬
beta <- solve(t(x) %*% x) %*% t(x) %*% y # 기울기 구하는 수학식
colnames(beta) <- "estimate" #수치예측이라는 컬럼명 지정
print(beta)
}
uni <- read.csv("c:\\data\\sports.csv")
head(uni)
reg(uni$acceptance,uni[,c(2:4)])
estimate
intercept 11.4902799
academic 0.1557737
sports 0.5726859
music 0.1046008
> 정규화를 하지 않았을 때 sports가 가장 영향력이 크게 나왔음.
예제2. 위의 예제를 정규화를 하고 수행하겠음.
reg <- function(y,x){
x <- as.matrix(x) # x에 들어오는 값들을 행렬로 변환하는 코드
x <- cbind(intercept = 1,x) #intercept는 컬럼명을 붙여준 것임. 그냥 1만 써도 됨, 절편+독립변수 행렬
beta <- solve(t(x) %*% x) %*% t(x) %*% y # 기울기 구하는 수학식
colnames(beta) <- "estimate" #수치예측이라는 컬럼명 지정
print(beta)
}
uni <- read.csv("c:\\data\\sports.csv")
normalize <- function(x){
return ( (x - min(x)) / (max(x) - min(x)))
} # 정규화 함수
uni_n <- as.data.frame(lapply(uni[,c(2:5)],normalize)) #정규화 적용
head(uni_n)
summary(uni_n) # 정규화 확인
reg(uni_n$acceptance, uni_n[,-4])
estimate
intercept 0.06121748
academic 0.48963854
sports 0.30194528
music 0.11432339
> 정규화를 하면 학과점수가 가장 높은 기울기가 출력됨. 이처럼 종속변수에 영향도가 가장 큰 독립변수가 무엇인지 알아내려면 정규화해야함.
예제3. R함수인 scale 함수를 이용해서 표준화를 하고 기울기를 확인하시오.
reg <- function(y,x){
x <- as.matrix(x) # x에 들어오는 값들을 행렬로 변환하는 코드
x <- cbind(intercept = 1,x) #intercept는 컬럼명을 붙여준 것임. 그냥 1만 써도 됨, 절편+독립변수 행렬
beta <- solve(t(x) %*% x) %*% t(x) %*% y # 기울기 구하는 수학식
colnames(beta) <- "estimate" #수치예측이라는 컬럼명 지정
print(beta)
}
uni <- read.csv("c:\\data\\sports.csv")
uni_st <- as.data.frame(lapply(uni[,c(2:5)],scale))
head(uni_st)
summary(uni_st)
reg(uni_st$acceptance,uni_st[,-4])
estimate
intercept -1.183949e-16
academic 6.920873e-01
sports 4.400019e-01
music 1.511278e-01
> 표준화를 하면 학과점수가 가장 큰 영향력을 가짐.
문제307. 위의 작업을 파이썬으로 수행하시오.
정규화 : from sklearn.preprocessing import MinMaxScaler
표준화 : from sklearn.preprocessing import StandardScaler
import pandas as pd
from sklearn.preprocessing import StandardScaler
uni = pd.read_csv("c:\\data\\sports.csv")
uni.head()
x = uni.iloc[:,1:4]
y = uni.iloc[:,-1]
# 표준화 작업
scaler = StandardScaler()
scaler.fit(x)
uni_n = scaler.transform(x)
df = pd.DataFrame(uni_n)
df.columns = uni.columns[1:4] # 컬럼명 가져와서 저장
def reg(y,x):
x['intercept'] = 1
x_c = x.columns
x = x.to_numpy()
B = np.dot(np.linalg.inv(np.dot(x.T,x)),np.dot(x.T,y))
for i in range(len(x_c)):
print(x_c[i],B[i])
reg(y,df)
academic 13.340358187222847
sports 8.481275781793261
music 2.913071056283956
intercept 51.93518518518615
> R과 결과가 다름. 종속변수에 대한 표준화를 진행하지 않아서 그럼
문제308. R과 같이 종속변수도 표준화를 진행하고 결과를 확인하시오.
import pandas as pd
from sklearn.preprocessing import StandardScaler
uni = pd.read_csv("c:\\data\\sports.csv")
uni.head()
# x = uni.iloc[:,1:4]
# y = uni.iloc[:,-1]
# 표준화 작업
scaler = StandardScaler()
scaler.fit(uni.iloc[:,1:])
uni_st = scaler.transform(uni.iloc[:,1:])
df = pd.DataFrame(uni_st)
df.columns = uni.columns[1:] # 컬럼명 가져와서 저장
def reg(y,x):
x['intercept'] = 1
x_c = x.columns
x = x.to_numpy()
B = np.dot(np.linalg.inv(np.dot(x.T,x)),np.dot(x.T,y))
for i in range(len(x_c)):
print(x_c[i],B[i])
reg(df['acceptance'],df.iloc[:,:-1])
academic 0.6920872873493044
sports 0.4400019149939032
music 0.1511278345682141
intercept 7.419647948346256e-17
57 다중회귀분석 모델을 R 로 구현 - p.268
목표 : 보험회사의 보험비 산정을 위해 의료비 데이터를 가지고 다중회귀 분석 모델을 생성
귀무가설 : 독립변수(성별, 나이, 체질량 비만지수, 부양가족수, 흡연여부, 거주지)는 종속변수(의료비)와 연관(관계)이 없다.
대립가설 : 독립변수(성별, 나이, 체질량 비만지수, 부양가족수, 흡연여부, 거주지)는 종속변수(의료비)와 연관(관계)이 있다.
데이터 : insurance
미국 환자의 가상 의료비가 들어있는 모의 데이터셋. 이 데이터를 미국 통계국의 인구 통계를 이용해 생성되었으며 대게 실제 질병을 반영함. 의료보험에 등록된 1338명의 수익자 예시가 들어있으며 각 계시는 환자의 특성과 해당 연도에 의료보험에 청구된 전체 의료비를 나타내는 특징으로 구성되어 있음.
#1. 데이터로드
#2. 결측치 확인
#3. 종속변수가 정규분포형태를 보이는지 확인
#4. 독립변수들과 종속변수간의 상관관계가 있는지 확인
#5. 다중회귀분석 모델 생성
#6. 회귀분석 결과 해석
#7. 회귀분석 모델 설명력(결정계수) 확인
#8. 회귀분석 모델의 성능 높이기
#1. 데이터로드
insurance <- read.csv("c:\\data\\insurance.csv")
head(insurance)
#2. 결측치 확인
colSums(is.na(insurance))
#3. 종속변수가 정규분포형태를 보이는지 확인
hist(insurance$expenses)
설명 : 왜도가 0보다 큰 오른쪽으로 꼬리가 긴 분포를 보여줌. 대다수 사람들의 의료비는 0 ~ $15,000달러 사이에 있음. 이 분포는 선형회귀에서는 이상적이지 않지만 미리 약점을 알고 있으면 나중에 모델을 설계할 때 도움이 된다.(p.271)
#4. 독립변수들과 종속변수간의 상관관계가 있는지 확인
cor( insurance[ ,c("age","bmi","children","expenses")])
age bmi children expenses
age 1.0000000 0.10934101 0.04246900 0.29900819
bmi 0.1093410 1.00000000 0.01264471 0.19857626
children 0.0424690 0.01264471 1.00000000 0.06799823
expenses 0.2990082 0.19857626 0.06799823 1.00000000
> 눈에 띄게 아주 강한 상관관계를 보이는 것은 없지만 일부 눈에 띄는 연관성이 있음.
예를들어 age와 bmi는 약한 양의 상관관계가 있어서 나이가 들수록 몸무게가 증가하는 경향이 있음. age와 expenses를 보면 양의 상관관계를 보이고 있어서 나이가 들수록 의료비가 증가하는 경향이 있음. bmi와 expenses와 양의 상관관계를 보이고 있어서 비만일수록 의료비가 증가하는 경향이 있음.
문제309. (점심시간 문제) 독립변수들끼리 아주 강한 상관관계를 보이고 있지는 않지만 다중공선성 문제가 있는 컬럼들이 있는지 확인하시오.
# 다중공선성 확인
model <- lm(expenses ~ age+bmi+children, data = insurance)
library(car)
vif(model) > 10
age bmi children
FALSE FALSE FALSE
# 상관관계 시각화
library(psych)
pairs.panels(insurance[,c('age','bmi','children','expenses')])
> 산포도에 있는 달걀모양의 객체는 상관관계 타원형으로 상관관계 강도를 시각화 한 것.
1. 타원이 늘어질수록 > 강한 상관관계
2. 타원이 둥근 모양 > 약한 상관관계
> 상관관계 결과 분석
- 나이가 많을수록 의료비가 더 많이 든다.
- 나이가 많을수록 비만지수가 더 높다
- 중년 무렵부터 부양가족수가 최고점이 된다.
(>책 p.274 참고)
산포토 그래프 쪽에 있는 빨간색 선을 뢰스 곡선이라고 하는데 x축(age)와 y축 변수 사이에 일반적인 관계를 나타내는 선. age와 children의 경우 나이가 중년에 다다르면 의료보험에서 보장하는 자녀수가 많고 젊은이와 고령은 의료보험에서 보장하는 자녀수가 적다는 것을 확인할 수 있음.
ㅇ다중회귀분석에 앞서 상관관계 분석을 하는 이유?
- 독립변수들간의 강한 상관관계를 보이게 되는 다중공선성 여부를 확인해야 회귀분석 결과에 가장 중요한 결정계수(설명력)에 대한 신임할 수 있기 때문
- 상관관계 분석으로 데이터에 대한 설명을 하기 위함.
#5. 다중회귀분석 모델 생성
model <- lm(expenses ~ ., data = insurance)
lm(종속변수 ~ 독립변수들, data = 데이터프레임명)으로 써도 가능함.
model <- lm(expenses ~ age + children + bmi + sex + smoker + region, data = insurance)
또는 이처럼 모든 독립변수를 나열하여 +로 연결해서 쓰는 경우가 있음
ex.bmi30*smoker = 그냥 비만인 사람보다 비만이면서 흡연을 하는 사람이 더 의료비가 많이 드는지 분석할 수 있게 됨.
#6. 회귀분석 결과 해석
model
Coefficients:
(Intercept) id age sexmale bmi children
-1.209e+04 2.047e-01 2.570e+02 -1.320e+02 3.397e+02 4.740e+02
smokeryes regionnorthwest regionsoutheast regionsouthwest
2.385e+04 -3.563e+02 -1.035e+03 -9.615e+02
> 나이가 1년씩 더해질 때마다 평균적으로 의료비가 256.8달러 증가될 것으로 예상됨.
> 자녀가 한명씩 추가될 때마다 475.7달러가 추가될 것으로 예상됨.
> 비만지수(bmi)의 단위가 증가할 때마다 연간 의료비가 339.3달러 증가될 것으로 예상됨.
> 더미변수를 자동으로 추가해서 변수 값의 상대적 추정을 했는데 결과는 다음과 같음.
sexmale -131.4 -> 남성은 여성에 비해 매년 의료비가 131.4달러 적게 든다고 예상하고 있음
smokeryes 23847.5 -> 흡연자는 비흡연자에 비해서 매년 평균 의료비가 23,847.5달러의 비용이 더 듦.
northeast에 비해서 northwest는 의료비가 연간 평균 352.8달러 덜 들고, southeast는 연간 평균 1035.6달러 덜 들고, southwest는 연간 평균 959.3달러 덜 듦.
=> 문자형 데이터들은 더미변수를 생성해서 기울기를 출력하고 있음.
#7. 회귀분석 모델 설명력(결정계수) 확인
summary(model)
앞에서 분류할 때는 모델의 성능 평가는 "정확도"로 했었음.
회귀분석일 때는 "결정계수"로 성능을 평가함.
결정계수가 1에 가까운 값이 나오면 이 회귀모델의 설명력이 높다고 말할 수 있음.
Multiple R-squared: 0.751
>결정계수 : 데이터에 대한 회귀모델의 설명력을 나타내는 척도
#8. 회귀분석 모델의 성능을 높임.
성능을 높이기 위한 파생변수 추가 1:
-> 기계가 잘 학습할 수 있도록 좋은 데이터(새로운 컬럼)
- 상관관계 결과를 분석
1. 나이가 많을수록 의료비가 더 많이 든다
나이가 들면 의료비가 많이드는 것을 상관관계분석을 통해서 확인했는데 나이 데이터를 더 크게 만들어서 파생변수를 생성하면 결정계수가 올라갈까?
insurance$age2 <- insurance$age^2
head(insurance)
model2 <- lm(expenses ~., data = insurance)
summary(model2) #Multiple R-squared: 0.7538
결정계수가 0.751에서 0.7537로 상승했음.
성능을 높이기 위한 파생변수 추가2:
비만인 사람(bmi가 30이상)이 의료비가 더 많이 들거라고 예상하고 비만인 사람과 비만이 아닌 사람에 대한 파생변수를 추가하면 결정계수가 더 올라가는지 확인
insurance$bmi30 <- ifelse(insurance$bmi >= 30, 1, 0)
head(insurance)
model3 <- lm(expenses ~ ., data = insurance)
summary(model3) #Multiple R-squared: 0.7583
결정계수가 0.7583으로 올라감.
성능을 높이기 위한 파생변수 추가3 : 비만인 사람이 담배까지 피게 되면 의료비가 더 증가할 것으로 예측되는지 파생변수를 추가해서 확인
insurance$smokeryes_bmi30 <- ifelse(insurance$smoker == 'yes'& insurance$bmi >= 30, 1,0)
head(insurance)
table(insurance$smokeryes_bmi30) # 145명이 해당
model4 <- lm(expenses ~ ., data = insurance)
summary(model4) #Multiple R-squared: 0.8665
결정계수가 0.8665로 증가함.
smokeryes 13404.5952 439.9591 30.468 < 2e-16 ***
bmi30 -997.9355 422.9607 -2.359 0.018449 *
smokeryes_bmi30 19810.1534 604.6769 32.762 < 2e-16 ***
> 담배만 피는 사람들에 비해 담배도 피면서 비만인 사람들의 의료비가 더 드는 것을 확인할 수 있음.
Residuals : 잔차? 표본에서 나오 ㄴ관측값이 회귀선과 비교했을 때 나타나는 차이
Residuals:
Min 1Q Median 3Q Max
-17297.1 -1656.0 -1262.7 -727.8 24161.6
위의 결과는 잔차에 대한 요약통계
1. 모델이 최소 하나의 관측치에 대해 거의 24161.6 달러의 비용을 낮게 예측
2. 잔차의 사분위수 범위에 해당하는 50%는 -1656.0 ~ -727.8 달러 사이에 있음.
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 139.0053 1363.1359 0.102 0.918792
age -32.6181 59.8250 -0.545 0.585690
sexmale -496.7690 244.3713 -2.033 0.042267 *
bmi 119.7715 34.2796 3.494 0.000492 ***
children 678.6017 105.8855 6.409 2.03e-10 ***
smokeryes 13404.5952 439.9591 30.468 < 2e-16 ***
regionnorthwest -279.1661 349.2826 -0.799 0.424285
regionsoutheast -828.0345 351.6484 -2.355 0.018682 *
regionsouthwest -1222.1619 350.5314 -3.487 0.000505 ***
age2 3.7307 0.7463 4.999 6.54e-07 ***
bmi30 -997.9355 422.9607 -2.359 0.018449 *
smokeryes_bmi30 19810.1534 604.6769 32.762 < 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
추정된 회귀 계수별로 표시된 p값은 추정된 계수가 실제 0일 확률 추정치. p값이 작은 경우 실제계수가 0 이 아닐 가능성이 높다는 것을 말하며 특징이 종속변수와 관계가 없을 가능성이 아주 낮다는 것을 의미함.
유의수준보다 낮은 p값은 통계적으로 유의한 것으로 간주됨. p값이 0.05 미만으로 나온 독립변수가 유의한 변수들임.
- p-values? 귀무가설에서 얻은 검정 통계량의 값 이상으로 대립가설에서 유리한 데이터를 얻을 수 있는 확률
p값 > 유의수준 ----------------> 귀무가설을 기각할 수 없다.
p값 < 유의수준 ----------------> 대립가설을 채택할 충분한 근거가 있다.
위에 독립변수들 옆에 나온 별(*)이 추정치로 충족되는 유의수준을 나타내는 각주에 해당
위에 나온 smokeryes_bmi30으로 예를 들면
smokeryes_bmi30 19810.1534 604.6769 32.762 < 2e-16 ***
귀무가설 : 비만인 사람이 흡연까지 하는 것은 의료비 상승과 관련이 없다.
대립가설 : 비만인 사람이 흡연까지 하는 것은 의료비 상승과 관련이 있다.
p-value가 2e-16이므로 유의수준이 0.001qhek gnjfTls wkrek.
p값 < 유의수준보다 작으므로 귀무가설 기각. 대립가설을 채택할 충분한 근거가 있음.
ㅇ Adjusted R-squared?
summary(model4) 했을 때의 결과중에 Adjusted R-squared이 나옴
Multiple R-squared: 0.8664, Adjusted R-squared: 0.8653
좋은 회귀 모형에는 두가지 조건이 있음.
1. 데이터를 잘 설명한다
2. 간단하다
독립변수가 많은 회귀모형의 경우에는 (복잡한 회귀모형) 위의 첫번째 조건을 만족함.
그러나 두번째 조건에서는 탈락이라고 볼 수 있음.
아무리 설명력이 좋아도 복잡하다면 그다지 좋은 모형은 아님.
독립변수가 많으면 결정계수가 높아지는데 결정계수가 모형의 설명력을 측정하기 좋은 척도라는 것은 사실이지만 너무 복잡하면 좋은 회귀모형은 아님. 그래서 위의 단점을 보완하기 위해서 보안된 척도가 있는데 그게 바로 "조정된 결정계수(Adjusted R-squared)" 입니다.
만약 Multiple R-squared와 Adjusted R-squared의 차이가 크다면 불필요한 변수가 있을 것이라고 예상할 수 있음. 이 둘의 차이가 작아야 좋은 모형이라고 이야기 할 수 있음.
> 책에 나온 방법으로 파생변수를 생성해서 결정계수 올리기(p285)
bmi30 * smoker = 비만이면서 담배 피는 사람의 데이터를 표현
#1. 데이터 로드
insurance <- read.csv("c:\\data\\insurance.csv")
#2. age2 파생변수 추가
insurance$age2 <- insurance$age^2
#3. bmi30 변수 생성
insurance$bmi30 <- ifelse(insurance$bmi >= 30, 1, 0)
head(insurance)
#4. 모델생성하기
model7 <- lm(expenses ~ age+age2+children+bmi+sex+bmi30*smoker+region, data = insurance)
#5. 결과해석
summary(model7)
bmi30:smokeryes 19810.1534 604.6769 32.762 < 2e-16 ***
> 비만이면서 흡연을 하는 것은 의료비 상승과 연관이 있다.
비만이면서 흡연을 하는 사람에 대한 데이터를 ifelse로 만들지 않고 그냥 편하게 bmi30*smoker로 모델 생성할 때 지정했음.
Multiple R-squared: 0.8664, Adjusted R-squared: 0.8653
> 두 결정계수의 차이가 작음.
문제310. 남자이면서 흡연을 하는 경우와 여자이면서 흡연을 하는 경우 둘중 어느쪽이 더 의료비가 많이 드는지 다음의 두개의 파생변수를 추가해서 모델을 생성하고 해석하시오.
#1. 데이터 로드
insurance <- read.csv("c:\\data\\insurance.csv")
#2. age2 파생변수 추가
insurance$age2 <- insurance$age^2
#3. bmi30 변수 생성
insurance$bmi30 <- ifelse(insurance$bmi >= 30, 1, 0)
#4. 성별별 흡연 여부에 대한 다음 2개의 파생변수를 추가
insurance$man_smokers <- ifelse(insurance$smoker == 'yes'& insurance$sex == 'male', 1,0)
insurance$woman_smokers <- ifelse(insurance$smoker == 'yes'& insurance$sex == 'female', 1,0)
#4. 모델생성하기
model8 <- lm(expenses ~ age+age2+children+bmi+bmi30+sex+region+man_smokers+woman_smokers, data = insurance)
#5. 결과해석
summary(model8)
man_smokers 24903.644 542.120 45.938 < 2e-16 ***
woman_smokers 22518.468 613.068 36.731 < 2e-16 ***
남자가 흡연을 했을 때 여자가 흡연을 했을때보다 좀 더 의료비가 높게 나타나고 있습니다.
문제311. 남자가 비만이었을대 의료비가 더 드는지 여자가 비만이었을 때
#1. 데이터 로드
insurance <- read.csv("c:\\data\\insurance.csv")
#2. age2 파생변수 추가
insurance$age2 <- insurance$age^2
#3. bmi30 변수 생성
insurance$bmi30 <- ifelse(insurance$bmi >= 30, 1, 0)
#4. 성별별 흡연 여부에 대한 다음 2개의 파생변수를 추가
insurance$man_bmi <- ifelse(insurance$bmi30 == 1& insurance$sex == 'male', 1,0)
insurance$woman_bmi <- ifelse(insurance$bmi30 == 1& insurance$sex == 'female', 1,0)
#5. 모델생성
model9 <- lm(expenses ~age+age2+children+smoker+bmi+region+man_bmi+woman_bmi, data = insurance)
summary(model9)
설명 : bmi30의 경우 man_bmi, woman_bmi와 높은 상관관계를 보이는 컬럼들임. 이렇게 독립변수들끼리 높은 상관관계를 보이게 되면 회귀분석 결과가 불안정해짐. 그래서 bmi30을 빼고 회귀분석을 돌려야함.
문제312. (오늘의 마지막 문제) 다음의 모델을 생성하고 책 288페이지에 나오는 방법을 이용해서 아래에 해당하는 사람의 연간 의료비를 예측하시오.
sample
age = 30, age2 = 30^2, children = 2, bmi = 30, sex = male, smoker = no, region = northwest
#1. 데이터 로드
insurance <- read.csv("c:\\data\\insurance.csv")
#2. age2 파생변수 추가
insurance$age2 <- insurance$age^2
#3. bmi30 변수 생성
insurance$bmi30 <- ifelse(insurance$bmi >= 30, 1, 0)
#4. 모델 생성
model7 <- lm(expenses ~ age+age2+children+bmi+sex+bmi30*smoker+region, data = insurance)
result <- predict(model7, data.frame(age = 30, age2 = 30^2, children = 2, bmi = 30, bmi30 = 1, sex = 'male', smoker = 'no', region = 'northwest' ))
result
5694.608
'Study > class note' 카테고리의 다른 글
머신러닝 / 회귀트리 (0) | 2022.02.15 |
---|---|
머신러닝 / 다중공선성 실험하기(R 과 파이썬), 다중회귀분석 모델을 파이썬을 구현 (0) | 2022.02.15 |
머신러닝 / 다중 회귀분석 이론 (0) | 2022.02.11 |
머신러닝 / 다중 공선성, 상관관계 분석, 단순회귀분석 모델 구현(R, 파이썬) (0) | 2022.02.11 |
머신러닝 / 회귀분석(수치예측) (0) | 2022.02.10 |