Email: theodoraputrina@gmail.com
RPubs: https://rpubs.com/Theodora
Asuransi kesehatan adalah produk asuransi yang menangani masalah kesehatan tertanggung karena suatu penyakit serta menanggung biaya proses perawatan. Sedangkan dikututip dari Investopedia (2019), asuransi kesehatan adalah jenis pertanggungan asuransi yanag membayar biaya medis, bedah, ataupun terkait biaya perawatan kesehatan seperti yang disebutkan dalam polis asuransi. Umumnya, penyebab sakit tertanggung yang bayanya dapat ditanggung oleh perusahaan asuransi adalah cedera, cacat, sakit, hingga kematian karena kecelakaan.
Sebelum kita melangkah lebih jauh dalam proses pengolahan data, sejatinya pada saat kita ingin menggunakan R (atau bahasa pemograman lainnya), diperlukan beberapa packages untuk memudahkan kita dalam bekerja. Berikut adalah beberapa packages yang harus diinstall terlebih dahulu.
Data yang digunakan dalam project ini adalah data “insurance”, silahkan kunjungi laman ini : https://www.kaggle.com/search?q=insurance+in%3Adatasets untuk mendownload data.
# memasukan data
insurance <- read.csv("insurancee.csv")
datatable(insurance, colnames = c('Age', 'Sex', 'BMI', 'Children', 'Smoker', 'Region', 'Charges'))## [1] "age" "sex" "bmi" "children" "smoker" "region" "charges"
Dataset ini memiliki 7 variabel:
Age: age of primary beneficiary.
Sex: insurance contractor gender, female, male.
BMI: Body mass index, providing an understanding of body, weights that are relatively high or low relative to height, objective index of body weight \((kg/m^2)\) using the ratio of height to weight, ideally 18.5 to 24.9.
Children: Number of children covered by health insurance/Number of dependents.
Smoker: Is the person a smoker or not.
Region : the beneficiary’s residential area in the US, northeast, southeast, southwest, northwest.
Charges: Individual medical costs billed by health insurance.
Kemudian kita harus melihat struktur dari dataset kita, apakah strukturnya sudah benar atau belum. Berikut ini adalah struktur dari dataset:
dikarenakan struktur data yang saya miliki masih berantakan, maka kita harus merapikannya sesuai dnegan identiats setiap variabel, apakah data tersebut numeric atau character. Sehingga data bisa diolah dengan baik.
insurance$smoker <- as.factor(insurance$smoker)
insurance$region <- as.factor(insurance$region)
str(insurance)## 'data.frame': 1338 obs. of 7 variables:
## $ age : int 19 18 28 33 32 31 46 37 37 60 ...
## $ sex : chr "female" "male" "male" "male" ...
## $ 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 ...
Dalam setiap proses pengolahan data, sering kita melakuan keslaahan pemeriksaan data yang hilang (missing values) sebelum melakukan proses analisa. Secara sederhana dapat dilakukan pemeriksaan data NA dengan R, sebagai berikut:
## age sex bmi children smoker region charges
## 0 0 0 0 0 0 0
Ternyata dari hasil pemeriksaan diatas sangat memuaskan karena tidak ada data yang hilang (missing value) pada dataset tersebut.
Untuk mengecek agar tidak adanya data yang sama maka kita lakukan perintah ini
data.frame(
row_of_data = insurance %>% nrow (),
row_of_unique.data = insurance %>% distinct() %>% nrow()
)## row_of_data row_of_unique.data
## 1 1338 1337
Dikarenakan ada data yang sama, maka langkah selanjutnya adalah menghapus atau menghilangkan data yang sama dengan cara
Setelah itu kita cek kembali apakah datanya masih ada yang sama.
data.frame(
row_of_data = insurance %>% nrow (),
row_of_unique.data = insurance %>% distinct() %>% nrow()
)## row_of_data row_of_unique.data
## 1 1337 1337
Nah, karena sudah tidak ada lagi data yang bermasalah, selanjutnya data yang sudah dibersihkan disimpan untuk proses berikutnya.
Jika ingin melihat ringkasan dari dataset ini, maka kita lakukan.
## age sex bmi children smoker
## Min. :18.00 Length:1337 Min. :15.96 Min. :0.000 no :1063
## 1st Qu.:27.00 Class :character 1st Qu.:26.29 1st Qu.:0.000 yes: 274
## Median :39.00 Mode :character Median :30.40 Median :1.000
## Mean :39.22 Mean :30.66 Mean :1.096
## 3rd Qu.:51.00 3rd Qu.:34.70 3rd Qu.:2.000
## Max. :64.00 Max. :53.13 Max. :5.000
## region charges
## northeast:324 Min. : 1122
## northwest:324 1st Qu.: 4746
## southeast:364 Median : 9386
## southwest:325 Mean :13279
## 3rd Qu.:16658
## Max. :63770
Tujuan bab ini adalah untuk mengetahui perilaku anggota asuransi seperti: umur, jenis kelamin, wilayah, perokok.
age_group <- insurance %>%
group_by(age) %>%
summarise(total = n())
Agecut <- cut(age_group$age, c(seq(15, 65, by = 5), Inf), include.lowest = TRUE)
agegroup <- aggregate(total ~ Agecut, age_group, sum)
ggplot(insurance, aes(age)) +
geom_freqpoly(binwidth = 1, color = 'blue') +
geom_histogram(binwidth = 1, fill = 'purple', alpha = .5) +
theme_linedraw() + #buat tema
theme(panel.background = element_rect(fill = "gainsboro", colour = "white", size = 0.5, linetype = "solid"), #pengaturan panel tema
plot.background = element_rect(fill = "gainsboro"), #pengaturan panel tema
panel.grid.major = element_line(size = 0.5, linetype = 'solid', colour = "white"), #pengauran panel tema
panel.grid.minor = element_line(size = 0.25, linetype = 'solid', colour = "white"), #pengaturan panel tema
plot.title = element_text(hjust = 0, face = 'bold',color = 'black'), #pengaturan judul
plot.subtitle = element_text(face = "italic"), #pengaturan subtitle
plot.caption = element_text(size = 6, vjust = -1, face = "italic")) + #caption/credit settings
labs(x = 'Age', y = 'Frequency', title = "Member of Medical Cost Insurance", #judul dan axis
subtitle = "Medical insurance's member aggregated by age") +
guides(fill=FALSE) + #remove color legend
scale_y_continuous(limits = c(0,80), breaks = c(0,20,40,60,80)) #atur batas sumbuDistribusi usia anggota asuransi relatif sama, kecuali 18 dan 19 tahun anggota yang memiliki populasi lebih tinggi (di atas yang usia 60 tahun). Saya juga membuat kelompok usia anggota pada tabel di bawah ini.
## Agecut total
## 1 [15,20] 165
## 2 (20,25] 140
## 3 (25,30] 138
## 4 (30,35] 130
## 5 (35,40] 127
## 6 (40,45] 137
## 7 (45,50] 144
## 8 (50,55] 140
## 9 (55,60] 125
## 10 (60,65] 91
Nah dari hasil diatas juga melihatkan bahwa yang berusia diantara 15-20 totalnya 166 dan lebih banyak daripada yang berusia 60 tahun yang totalnya 91.
sex <- insurance %>%
group_by(sex) %>%
summarise(total = n()) %>%
mutate(percentage = paste0(round(100*total/sum(total),1), "%"))
plot_ly(sex, labels = ~sex, values = ~total, type = 'pie', #plotly package
textposition = 'inside',
textinfo = 'label+percent',
insidetextfont = list(color = '#FFFFFF'),
hoverinfo = 'text',
text = ~paste(total, 'people'),
marker = list(colors = colors,
line = list(color = '#FFFFFF', width = 1)), showlegend = FALSE) %>%
layout(title = 'Gender of Medical Insurance Member', titlefont = list(size = 18, color = 'black'),
xaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE),
yaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE))## Warning: The titlefont attribute is deprecated. Use title = list(font = ...)
## instead.
Jenis kelamin peserta asuransi hampir sama (laki-laki = 675 orang & perempuan = 662 orang).
reg <- insurance %>%
group_by(region) %>%
summarise(total = n()) %>%
mutate(percentage = paste0(round(100*total/sum(total),1), "%"))
plot_ly(reg, labels = ~region, values = ~total, type = 'pie', #plotly package
textposition = 'inside',
textinfo = 'label+percent',
insidetextfont = list(color = '#FFFFFF'),
hoverinfo = 'text',
text = ~paste(total, 'people'),
marker = list(colors = colors,
line = list(color = '#FFFFFF', width = 1)), showlegend = FALSE) %>%
layout(title = 'Region of Medical Insurance Member', titlefont = list(size = 18, color = 'black'),
xaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE),
yaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE))## Warning: The titlefont attribute is deprecated. Use title = list(font = ...)
## instead.
Wilayah tempat tinggal anggota asuransi tersebar merata.
insurance %>%
group_by(smoker) %>%
summarise(total = n()) %>%
mutate(percentage = paste0(round(100*total/sum(total),1), "%"),
annot = c("Non-Smoker","Smoker")) %>%
ggplot(aes(x=annot, y=total, label = percentage, fill = annot)) +
geom_bar(stat="identity") +
geom_text(hjust = 0.5, vjust = -1, color = "black", fontface = "italic", size = 5) + #label type
theme_linedraw() + #make a theme
theme(panel.background = element_rect(fill = "#FFFAFA", colour = "white", size = 0.5, linetype = "solid"), #theme panel settings
plot.background = element_rect(fill = "#FFFAFA"), #theme panel settings
legend.position = "none", #legend position
legend.title = element_blank(), #remove legend title
legend.background = element_rect(fill = "gainsboro", colour = "gainsboro", size = 0.5, linetype = "solid"), #change legend box color
panel.grid.major = element_line(size = 0.5, linetype = 'solid', colour = "white"), #theme panel settings
panel.grid.minor = element_line(size = 0.25, linetype = 'solid', colour = "white"), #theme panel settings
plot.title = element_text(hjust = 0, face = 'bold',color = 'black'), #title settings
plot.subtitle = element_text(face = "italic")) + #subtitle settings
labs(x = '', y = '', title = "Member of Medical Insurance", #name title and axis
subtitle = 'Banyaknya member asuransi yang merokok') + #name subtitle
scale_y_continuous(limits = c(0,1500), breaks = c(0,300,600,900,1200,1500)) #set axis limits and breakBanyak anggotanya bukan perokok (79,5% atau 1063 orang) dan sisanya sebanyak 274 orang adalah perokok.
child <- insurance %>%
group_by(children) %>%
summarise(total = n()) %>%
mutate(percentage = paste0(round(100*total/sum(total),1), "%"),
annot = c("Zero", "1 Child", "2 Children", "3 Children", "4 Children", "5 Children"))
plot_ly(child, labels = ~annot, values = ~total, type = 'pie', #plotly package
textposition = 'outside',
textinfo = 'label+percent',
insidetextfont = list(color = '#FFFFFF'),
hoverinfo = 'text',
text = ~paste(total, 'member'),
marker = list(colors = colors,
line = list(color = '#FFFFFF', width = 1)), showlegend = FALSE) %>%
layout(title = 'Number of Dependents From Medical Insurance Member', titlefont = list(size = 18, color = 'black'),
xaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE),
yaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE))## Warning: The titlefont attribute is deprecated. Use title = list(font = ...)
## instead.
ggplot(insurance, aes(bmi)) +
geom_histogram(binwidth = 1, fill = 'yellow', alpha = .5) +
theme_linedraw() + #make a theme
theme(panel.background = element_rect(fill = "gainsboro", colour = "white", size = 0.5, linetype = "solid"), #theme panel settings
plot.background = element_rect(fill = "gainsboro"), #theme panel settings
panel.grid.major = element_line(size = 0.5, linetype = 'solid', colour = "white"), #theme panel settings
panel.grid.minor = element_line(size = 0.25, linetype = 'solid', colour = "white"), #theme panel settings
plot.title = element_text(hjust = 0, face = 'bold',color = 'black'), #title settings
plot.subtitle = element_text(face = "italic"), #subtitle settings
plot.caption = element_text(size = 6, vjust = -1, face = "italic")) + #caption/credit settings
labs(x = 'Body Mass Index', y = 'Frequency', title = "Member of Medical Cost Insurance", #name title and axis
subtitle = "Body mass index of medical insurance's member") +
guides(fill=FALSE) + #remove color legend
scale_y_continuous(limits = c(0,120), breaks = c(0,20,40,60,80,100,120)) #set axis limits and breakIndeks massa tubuh anggota terdistribusi normal.
ggplot(insurance, aes(charges)) +
geom_histogram(binwidth = 2000, fill = 'medium purple', alpha = .5) +
theme_linedraw() + #make a theme
theme(panel.background = element_rect(fill = "snow", colour = "white", size = 0.5, linetype = "solid"), #theme panel settings
plot.background = element_rect(fill = "snow"), #theme panel settings
panel.grid.major = element_line(size = 0.5, linetype = 'solid', colour = "white"), #theme panel settings
panel.grid.minor = element_line(size = 0.25, linetype = 'solid', colour = "white"), #theme panel settings
plot.title = element_text(hjust = 0, face = 'bold',color = 'black'), #title settings
plot.subtitle = element_text(face = "italic"), #subtitle settings
plot.caption = element_text(size = 6, vjust = -1, face = "italic")) + #caption/credit settings
labs(x = 'Charges', y = 'Frequency', title = "Medical Cost Insurance", #name title and axis
subtitle = "Individual medical costs billed by health insurance") +
guides(fill=FALSE) + #remove color legend
scale_y_continuous(limits = c(0,250), breaks = c(0,50,100,150,200,250)) #set axis limits and breakDistribusi biaya medis individu yang ditagih oleh asuransi kesehatan memiliki kecenderungan positif.
Saya membuat analisis kepadatan ini untuk menemukan variabel-variabel yang mempengaruhi biaya medis. Dari analisis ini (Anda perlu melihat grafik kepadatan), saya mendapatkan beberapa wawasan:
Jenis kelamin tidak berdampak pada asuransi biaya pengobatan karena laki-laki dan perempuan memiliki distribusi / kepadatan yang sama terhadap pungutan (lihat Bagan 5.1).
Daerah tidak terlalu berpengaruh terhadap asuransi biaya kesehatan karena 4 daerah hampir memiliki distribusi / kepadatan yang sama terhadap retribusi (lihat Grafik 5.2).
Perokok dan bukan perokok mempengaruhi asuransi biaya pengobatan karena distribusi / kepadatannya sangat berbeda (lihat Grafik 5.3).
Jumlah anak / tanggungan memiliki kepadatan yang sama terhadap pungutan, kecuali jumlah anak nol. Jadi, jika Anda tidak memiliki anak maka akan berdampak pada asuransi biaya kesehatan (lihat Bagan 5.4).
Berdasarkan wawasan tersebut, saya dapat menyimpulkan bahwa Perokok, total tanggungan (anak), umur, dan BMI merupakan variabel yang digunakan untuk memprediksi asuransi biaya pengobatan.
Karena perokok, tanggungan total, dan IMT berpengaruh terhadap asuransi biaya kesehatan, saya mengelompokkan faktor-faktor tersebut ke dalam 8 kategori yang ditunjukkan pada sub-bab di bawah ini. Akhirnya, saya hanya memiliki usia atau dan BMI sebagai variabel input untuk persamaan prediksi saya. Persamaannya akan ditampilkan di sub-bab, jadi Anda perlu memeriksanya.
G1 : Smoker, have no dependent, BMI under 30.
G2 : Smoker, have no dependent, BMI over 30.
G3 : Smoker, have dependents, BMI under 30.
G4 : Smoker, have dependents, BMI over 30.
G5 : Non-smoker, have no dependent, BMI under 30.
G6 : Non-smoker, have no dependent, BMI over 30.
G7 : Non-smoker, have dependents, BMI under 30.
G8 : Non-smoker, have dependents, BMI over 30.
Perkokok, tidak memiliki tanggungan, BMI dibawah 30
Tampilan grafik Age vs Charges dapat didekati dengan menggunakan regresi linier.
BMI vs Charges terlihat memiliki korelasi yang tidak teratur.
##
## Call:
## lm(formula = charges ~ age, data = ins_smoker_nochild_under30)
##
## Residuals:
## Min 1Q Median 3Q Max
## -5740.7 -2372.9 -776.5 612.0 17119.6
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 11970.56 1454.78 8.228 5.55e-11 ***
## age 252.39 36.25 6.962 5.70e-09 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 4276 on 52 degrees of freedom
## Multiple R-squared: 0.4824, Adjusted R-squared: 0.4725
## F-statistic: 48.46 on 1 and 52 DF, p-value: 5.696e-09
##
## Call:
## lm(formula = charges ~ age + bmi, data = ins_smoker_nochild_under30)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2539.3 -1754.2 -1059.9 -203.1 15678.0
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -956.74 5104.29 -0.187 0.8521
## age 251.20 34.35 7.312 1.75e-09 ***
## bmi 505.18 192.06 2.630 0.0112 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 4051 on 51 degrees of freedom
## Multiple R-squared: 0.5442, Adjusted R-squared: 0.5264
## F-statistic: 30.45 on 2 and 51 DF, p-value: 1.985e-09
Dari kedua ringkasan tersebut, saya memutuskan untuk menggunakan regresi linier dengan 2 variabel (umur dan BMI) karena memiliki nilai R-Squared yang lebih baik.
Jadi persamaannya akan seperti ini:
-956.74 + (251.20 * AGE) + (505.18 * BMI)
Perokok, tidak memiliki tanggungan, BMI di atas 30.
Tampilan grafik Age vs Charges dapat didekati dengan menggunakan regresi linier.
BMI vs Charges terlihat memiliki korelasi yang tidak teratur.
##
## Call:
## lm(formula = charges ~ age, data = ins_smoker_nochild_over30)
##
## Residuals:
## Min 1Q Median 3Q Max
## -19722 -2239 -1235 786 19807
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 28983.17 1737.81 16.678 < 2e-16 ***
## age 306.74 43.38 7.071 2.05e-09 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 5361 on 59 degrees of freedom
## Multiple R-squared: 0.4587, Adjusted R-squared: 0.4495
## F-statistic: 50 on 1 and 59 DF, p-value: 2.05e-09
##
## Call:
## lm(formula = charges ~ age + bmi, data = ins_smoker_nochild_over30)
##
## Residuals:
## Min 1Q Median 3Q Max
## -16667.0 -1505.1 -737.2 47.9 22684.4
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 8120.10 5338.78 1.521 0.133702
## age 292.16 38.73 7.544 3.57e-10 ***
## bmi 614.01 150.40 4.082 0.000138 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 4766 on 58 degrees of freedom
## Multiple R-squared: 0.5795, Adjusted R-squared: 0.565
## F-statistic: 39.97 on 2 and 58 DF, p-value: 1.225e-11
Dari kedua ringkasan tersebut, saya memutuskan untuk menggunakan regresi linier dengan 2 variabel (umur dan BMI) karena memiliki nilai R-Squared yang lebih baik.
Jadi persamaannya akan seperti ini:
8120.10 + (292.16 * AGE) + (614.01 * BMI)
Perokok, Memiliki tanggungan, BMI dibawah 30.
Tampilan grafik Age vs Charges dapat didekati dengan menggunakan regresi linier.
BMI vs Charges terlihat memiliki korelasi yang tidak teratur.
##
## Call:
## lm(formula = charges ~ age, data = ins_smoker_child_under30)
##
## Residuals:
## Min 1Q Median 3Q Max
## -4651.4 -1487.2 -352.5 637.6 15865.3
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 10842.61 1332.43 8.137 7.77e-12 ***
## age 274.71 33.18 8.280 4.19e-12 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 3199 on 73 degrees of freedom
## Multiple R-squared: 0.4843, Adjusted R-squared: 0.4772
## F-statistic: 68.56 on 1 and 73 DF, p-value: 4.194e-12
##
## Call:
## lm(formula = charges ~ age + bmi, data = ins_smoker_child_under30)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2741.8 -1070.1 -608.8 -5.2 15619.8
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 2428.48 2769.81 0.877 0.3835
## age 259.48 31.33 8.282 4.56e-12 ***
## bmi 359.27 105.64 3.401 0.0011 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 2989 on 72 degrees of freedom
## Multiple R-squared: 0.5557, Adjusted R-squared: 0.5433
## F-statistic: 45.02 on 2 and 72 DF, p-value: 2.075e-13
Dari kedua ringkasan tersebut, saya memutuskan untuk menggunakan regresi linier dengan 2 variabel (umur dan BMI) karena memiliki nilai R-Squared yang lebih baik.
Jadi persamaannya akan seperti ini:
2428.48 + (259.48 * AGE) + (359.27 * BMI)
Perokok, Memiliki tanggungan, BMI diatas 30.
Tampilan grafik Age vs Charges dapat didekati dengan menggunakan regresi linier.
BMI vs Charges terlihat memiliki korelasi yang tidak teratur.
##
## Call:
## lm(formula = charges ~ age, data = ins_smoker_child_over30)
##
## Residuals:
## Min 1Q Median 3Q Max
## -4354.3 -2271.4 -859.3 1174.1 18445.4
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 32648.20 1361.98 23.971 < 2e-16 ***
## age 241.21 31.86 7.572 4.89e-11 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 3723 on 82 degrees of freedom
## Multiple R-squared: 0.4115, Adjusted R-squared: 0.4043
## F-statistic: 57.34 on 1 and 82 DF, p-value: 4.889e-11
##
## Call:
## lm(formula = charges ~ age + bmi, data = ins_smoker_child_over30)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2212.2 -1334.7 -653.6 40.7 17621.6
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 16021.03 3341.64 4.794 7.30e-06 ***
## age 253.72 27.69 9.162 3.81e-14 ***
## bmi 447.91 84.22 5.318 9.08e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 3225 on 81 degrees of freedom
## Multiple R-squared: 0.5638, Adjusted R-squared: 0.553
## F-statistic: 52.35 on 2 and 81 DF, p-value: 2.553e-15
Dari kedua ringkasan tersebut, saya memutuskan untuk menggunakan regresi linier dengan 2 variabel (umur dan BMI) karena memiliki nilai R-Squared yang lebih baik.
Jadi persamaannya akan seperti ini:
16021.03 + (253.72 * AGE) + (447.91 * BMI)
Bukan Perokok, tidak memiliki tanggunan, BMI dibawah 30.
Tampilan grafik Age vs Charges dapat didekati dengan menggunakan regresi linier.
BMI vs Charges terlihat memiliki korelasi yang tidak teratur.
##
## Call:
## lm(formula = charges ~ age, data = ins_nonsmoker_nochild_under30)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2428.1 -1440.0 -886.5 -391.6 21672.8
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -3239.15 687.81 -4.709 4.43e-06 ***
## age 277.00 16.79 16.495 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 3950 on 217 degrees of freedom
## Multiple R-squared: 0.5563, Adjusted R-squared: 0.5543
## F-statistic: 272.1 on 1 and 217 DF, p-value: < 2.2e-16
##
## Call:
## lm(formula = charges ~ age + bmi, data = ins_nonsmoker_nochild_under30)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2457.4 -1453.0 -852.6 -391.1 21715.4
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -3791.02 2191.60 -1.730 0.0851 .
## age 276.56 16.91 16.354 <2e-16 ***
## bmi 22.40 84.44 0.265 0.7911
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 3958 on 216 degrees of freedom
## Multiple R-squared: 0.5565, Adjusted R-squared: 0.5524
## F-statistic: 135.5 on 2 and 216 DF, p-value: < 2.2e-16
Dari kedua ringkasan tersebut, saya memutuskan untuk menggunakan regresi linier dengan 1 variabel (umur) karena memiliki nilai R-Squared yang lebih baik.
Jadi persamaannya akan seperti ini:
-3239.15 + (277.00 * AGE)
Bukan Perokok, tidak memilik tanggungan, BMI diatas 30.
Tampilan grafik Age vs Charges dapat didekati dengan menggunakan regresi linier.
BMI vs Charges terlihat memiliki korelasi yang tidak teratur.
##
## Call:
## lm(formula = charges ~ age, data = ins_nonsmoker_nochild_over30)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2601 -1680 -1101 -365 20402
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -2138.96 639.67 -3.344 0.00096 ***
## age 253.69 14.73 17.219 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 3868 on 237 degrees of freedom
## Multiple R-squared: 0.5558, Adjusted R-squared: 0.5539
## F-statistic: 296.5 on 1 and 237 DF, p-value: < 2.2e-16
##
## Call:
## lm(formula = charges ~ age + bmi, data = ins_nonsmoker_nochild_over30)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2825.0 -1641.6 -1087.4 -382.4 20308.3
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -392.10 2335.28 -0.168 0.867
## age 254.50 14.78 17.217 <2e-16 ***
## bmi -50.42 64.82 -0.778 0.437
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 3872 on 236 degrees of freedom
## Multiple R-squared: 0.5569, Adjusted R-squared: 0.5532
## F-statistic: 148.3 on 2 and 236 DF, p-value: < 2.2e-16
Dari kedua ringkasan tersebut, saya memutuskan untuk menggunakan regresi linier dengan 1 variabel (umur) karena memiliki nilai R-Squared yang lebih baik.
Jadi persamaannya akan seperti ini:
-2155.79 + (254.01 * AGE)
Bukan perokok, Memiliki tanggungan, BMI dibawah 30.
Tampilan grafik Age vs Charges dapat didekati dengan menggunakan regresi linier.
BMI vs Charges terlihat memiliki korelasi yang tidak teratur.
##
## Call:
## lm(formula = charges ~ age, data = ins_nonsmoker_child_under30)
##
## Residuals:
## Min 1Q Median 3Q Max
## -3050 -2080 -1578 -808 22413
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -884.08 1029.59 -0.859 0.391
## age 247.85 25.87 9.581 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 4975 on 281 degrees of freedom
## Multiple R-squared: 0.2462, Adjusted R-squared: 0.2436
## F-statistic: 91.8 on 1 and 281 DF, p-value: < 2.2e-16
##
## Call:
## lm(formula = charges ~ age + bmi, data = ins_nonsmoker_child_under30)
##
## Residuals:
## Min 1Q Median 3Q Max
## -3255.8 -2178.9 -1528.4 -664.9 22367.6
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -2835.49 2564.04 -1.106 0.270
## age 245.27 26.07 9.408 <2e-16 ***
## bmi 79.79 96.01 0.831 0.407
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 4978 on 280 degrees of freedom
## Multiple R-squared: 0.2481, Adjusted R-squared: 0.2427
## F-statistic: 46.19 on 2 and 280 DF, p-value: < 2.2e-16
Dari kedua ringkasan tersebut, saya memutuskan untuk menggunakan regresi linier dengan 1 variabel (umur) karena memiliki nilai R-Squared yang lebih baik.
Jadi persamaannya akan seperti ini:
-884.08 + (247.85 * AGE)
Bukan Perokok, Memilik tanggungan, BMI diatas 30.
Tampilan grafik Age vs Charges dapat didekati dengan menggunakan regresi linier.
BMI vs Charges terlihat memiliki korelasi yang tidak teratur.
##
## Call:
## lm(formula = charges ~ age, data = ins_nonsmoker_child_over30)
##
## Residuals:
## Min 1Q Median 3Q Max
## -3138.6 -2283.0 -1647.7 -746.8 24235.0
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -2161.36 1041.35 -2.076 0.0387 *
## age 282.54 24.23 11.660 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 5250 on 320 degrees of freedom
## Multiple R-squared: 0.2982, Adjusted R-squared: 0.296
## F-statistic: 136 on 1 and 320 DF, p-value: < 2.2e-16
##
## Call:
## lm(formula = charges ~ age + bmi, data = ins_nonsmoker_child_over30)
##
## Residuals:
## Min 1Q Median 3Q Max
## -3320.7 -2278.4 -1636.0 -711.3 24252.0
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -923.87 2648.40 -0.349 0.727
## age 283.07 24.28 11.658 <2e-16 ***
## bmi -35.83 70.50 -0.508 0.612
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 5256 on 319 degrees of freedom
## Multiple R-squared: 0.2988, Adjusted R-squared: 0.2944
## F-statistic: 67.95 on 2 and 319 DF, p-value: < 2.2e-16
Dari kedua ringkasan tersebut, saya memutuskan untuk menggunakan regresi linier dengan 1 variabel (umur) karena memiliki nilai R-Squared yang lebih baik.
Jadi persamaannya akan seperti ini:
-2161.36 + (282.54 * AGE)
Dari pengelompokan persamaan, saya membuat fungsi untuk memprediksi muatan. Fungsinya terlihat seperti:
predict <- function(x){
for(i in 1:nrow(x)){
if(x[i,"smoker"] == "yes" && x[i,"children"] == 0 && x[i,"bmi"] < 30){
x[i,"result"] = -956.74 + (251.20*x[i,"age"]) + (505.18*x[i,"bmi"])
} else if(x[i,"smoker"] == "yes" && x[i,"children"] == 0 && x[i,"bmi"] >= 30) {
x[i,"result"] = 8120.10 + (292.16*x[i,"age"]) + (614.01*x[i,"bmi"])
} else if(x[i,"smoker"] == "yes" && x[i,"children"] > 0 && x[i,"bmi"] < 30){
x[i,"result"] = 2428.48 + (259.48*x[i,"age"]) + (359.27*x[i,"bmi"])
} else if(x[i,"smoker"] == "yes" && x[i,"children"] > 0 && x[i,"bmi"] >= 30){
x[i,"result"] = 16021.03 + (253.72*x[i,"age"]) + (447.91*x[i,"bmi"])
} else if(x[i,"smoker"] == "no" && x[i,"children"] == 0 && x[i,"bmi"] < 30){
x[i,"result"] = -3239.15 + (277.00*x[i,"age"])
} else if(x[i,"smoker"] == "no" && x[i,"children"] == 0 && x[i,"bmi"] >= 30){
x[i,"result"] = -2155.79 + (254.01*x[i,"age"])
} else if(x[i,"smoker"] == "no" && x[i,"children"] > 0 && x[i,"bmi"] < 30){
x[i,"result"] = -884.08 + (247.85*x[i,"age"])
} else {
x[i,"result"] = -2161.36 + (282.54*x[i,"age"])
}
}
return(x)
}Dan hasil prediksi saya terlihat pada tabel di bawah ini
predcharges <- predict(insurance)
datatable(predcharges, colnames = c('Age', 'Sex', 'BMI', 'Children', 'Smoker', 'Region', 'Charges', 'Charges Prediction'))Root Mean Square Error yang saya prediksikan
## [1] 4439.137
Nilai kesalahan rata-rata dari prediksi saya adalah 4437.56
Kesalahan Persen Absolut Rata-rata yang diprediksi
## [1] 0.2669668
Rata-rata persentase kesalahan prediksi adalah 26.7%
Berapa biaya asuransi untuk orang-orang ini?
Dandi, 22 years old, 34.21 BMI, have no dependent, non - smoker, and living in northeast.
Ina, 23 years old, 27.54 BMI, 3 dependents, smoker, and living in southeast.
Sekarang kita bisa menjawab pertanya tersebut dengan fungsi ini:
predict_charge <- function(age, bmi, children, smoker){
if(smoker == "yes" && children == 0 && bmi < 30){
result = -956.74 + (251.20*age) + (505.18*bmi)
} else if(smoker == "yes" && children == 0 && bmi >= 30) {
result = 8120.10 + (292.16*age) + (614.01*bmi)
} else if(smoker == "yes" && children > 0 && bmi < 30){
result = 2428.48 + (259.48*age) + (359.27*bmi)
} else if(smoker == "yes" && children > 0 && bmi >= 30){
result = 16021.03 + (253.72*age) + (447.91*bmi)
} else if(smoker == "no" && children == 0 && bmi < 30){
result = -3239.15 + (277.00*age)
} else if(smoker == "no" && children == 0 && bmi >= 30){
result = -2155.79 + (254.01*age)
} else if(smoker == "no" && children > 0 && bmi < 30){
result = -884.08 + (247.85*age)
} else {
result = -2161.36 + (282.54*age)
}
return(result)
}Biaya Asuransi Kesehatan untuk Ian
## [1] 3432.43
Biaya Asuransi Kesehatan untuk Rin
## [1] 18290.82
Berdasarkan dataset dan pemodelan yang dilakukan dengan model linear regression, hasil dari prediksi biaya Rata-rata persentase kesalahan prediksinya adalah 26.7%, berarti sebesar 73.3% tingkat keakurasian data. Sehingga model cukup layak untuk diimplementasikan untuk memprediksi biaya asuransi kesehatan.