Biaya pengeluaran medis adalah biaya yang dikeluarkan oleh seseorang untuk mendapatkan layanan kesehatan. Umumnya, biaya ini dikeluarkan tidak secara rutin, hanya pada saat-saat tertentu saja, misalkan saat orang yang bersangkutan sakit dan perlu berobat. Besaran biaya yang dikeluarkan pun bervariasi bergantung pada beberapa faktor, diantaranya usia, gender, riwayat penyakit, dan banyak lagi.
Dataset terkait besaran biaya pengeluaran medis yang akan saya pakai diunduh dari kaggle.com yang sumber referensi utamanya adalah buku Machine Learning with R karya Brett Lantz.
Apakah seorang perokok memiliki biaya pengeluaran medis lebih tinggi dibandingkan yang bukan perokok?
1. Mengakses Library pada R
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(plotly)
## Loading required package: ggplot2
##
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
##
## last_plot
## The following object is masked from 'package:stats':
##
## filter
## The following object is masked from 'package:graphics':
##
## layout
2. Membaca dan Mengimpor Dataset ke R
mc <- read.csv(file.choose(), header = T)
mc[1:5,] # Mengakses tabel mc dari baris satu sampai 5 (hanya sample untuk dilihat, agar tidak terlalu panjang outputnya)
## age sex bmi children smoker region charges
## 1 19 female 27.900 0 yes southwest 16884.924
## 2 18 male 33.770 1 no southeast 1725.552
## 3 28 male 33.000 3 no southeast 4449.462
## 4 33 male 22.705 0 no northwest 21984.471
## 5 32 male 28.880 0 no northwest 3866.855
3. Melihat Dimensi Data
dim(mc)
## [1] 1338 7
Melihat tipe dari data
str(mc)
## '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 : chr "yes" "no" "no" "no" ...
## $ region : chr "southwest" "southeast" "southeast" "northwest" ...
## $ charges : num 16885 1726 4449 21984 3867 ...
4. Melihat Variabel pada Dataset
colnames(mc)
## [1] "age" "sex" "bmi" "children" "smoker" "region" "charges"
Variabel pada dataset yang saya ambil ada 7, yaitu: + age = Usia + sex = Jenis kelamin + bmi = Body mass index atau perbandingan antara tinggi dan berat badan + children = Jumlah anak dalam tanggungan + smoker = Perokok (ya/tidak) + region = Wilayah tempat tingga; (US, Northeast, Southeast, Southwest, dan Northwest) + charges = biaya yang dikeluarkan untuk mendapatkan pelayanan kesehatan
5. Melihat Statistik Data
summary(mc)
## age sex bmi children
## Min. :18.00 Length:1338 Min. :15.96 Min. :0.000
## 1st Qu.:27.00 Class :character 1st Qu.:26.30 1st Qu.:0.000
## Median :39.00 Mode :character Median :30.40 Median :1.000
## Mean :39.21 Mean :30.66 Mean :1.095
## 3rd Qu.:51.00 3rd Qu.:34.69 3rd Qu.:2.000
## Max. :64.00 Max. :53.13 Max. :5.000
## smoker region charges
## Length:1338 Length:1338 Min. : 1122
## Class :character Class :character 1st Qu.: 4740
## Mode :character Mode :character Median : 9382
## Mean :13270
## 3rd Qu.:16640
## Max. :63770
Dengan menggunakan perintah summary() kita dapat sekaligus menemukan missing datanya. Missing data tersebut dapat dilihat pada bagian NA’S. Di dataset ini, tidak terdapat missing data.
6. Mengecek Missing Data
sum(is.na(mc)) # Mengecek ulang missing value
## [1] 0
7. Mengecek Outlier Untuk mengecek outlier, kita hanya bisa menggunakan variabel dengan tipe data numerik saja. Sebelumnya sudah dilihat pada tipe-tipe data, variabel dengan data numerik hanya ada pada kolom age, bmi, children, dan charges.
# LIST OUTLIER SECARA NUMERIK
boxplot(mc$age, plot = FALSE)$out
## numeric(0)
boxplot(mc$bmi, plot = FALSE)$out
## [1] 49.06 48.07 47.52 47.41 50.38 47.60 52.58 47.74 53.13
boxplot(mc$children, plot = FALSE)$out
## numeric(0)
boxplot(mc$charges, plot = FALSE)$out
## [1] 39611.76 36837.47 37701.88 38711.00 35585.58 51194.56 39774.28 48173.36
## [9] 38709.18 37742.58 47496.49 37165.16 39836.52 43578.94 47291.06 47055.53
## [17] 39556.49 40720.55 36950.26 36149.48 48824.45 43753.34 37133.90 34779.61
## [25] 38511.63 35160.13 47305.31 44260.75 41097.16 43921.18 36219.41 46151.12
## [33] 42856.84 48549.18 47896.79 42112.24 38746.36 42124.52 34838.87 35491.64
## [41] 42760.50 47928.03 48517.56 41919.10 36085.22 38126.25 42303.69 46889.26
## [49] 46599.11 39125.33 37079.37 35147.53 48885.14 36197.70 38245.59 48675.52
## [57] 63770.43 45863.21 39983.43 45702.02 58571.07 43943.88 39241.44 42969.85
## [65] 40182.25 34617.84 42983.46 42560.43 40003.33 45710.21 46200.99 46130.53
## [73] 40103.89 34806.47 40273.65 44400.41 40932.43 40419.02 36189.10 44585.46
## [81] 43254.42 36307.80 38792.69 55135.40 43813.87 39597.41 36021.01 45008.96
## [89] 37270.15 42111.66 40974.16 46113.51 46255.11 44202.65 48673.56 35069.37
## [97] 39047.29 47462.89 38998.55 41999.52 41034.22 36580.28 35595.59 42211.14
## [105] 44423.80 37484.45 39725.52 44501.40 39727.61 48970.25 39871.70 34672.15
## [113] 41676.08 44641.20 41949.24 36124.57 38282.75 46661.44 40904.20 36898.73
## [121] 52590.83 40941.29 39722.75 37465.34 36910.61 38415.47 41661.60 60021.40
## [129] 47269.85 49577.66 37607.53 47403.88 38344.57 34828.65 62592.87 46718.16
## [137] 37829.72 36397.58 43896.38
# GRAFIK DATASET
mcx <- read.csv(file.choose(), header = T) # mengakses dataset yang sudah di filter menggunakan MySQL
boxplot(mcx)
Dari boxplot diatas, dapat dilihat bahwa kolom numerik yang memiliki outlier atau pencilan yaitu kolom bmi dan charges
7. Melihat Korelasi Data
library(psych)
##
## Attaching package: 'psych'
## The following objects are masked from 'package:ggplot2':
##
## %+%, alpha
corPlot(mcx,
cex = 1) # Mengubah ukuran teks
8. Melihat Plot Distribusi Data Numerik
qqnorm(mc$age)
qqline(mc$age) # Melihat secara visual apakah data berdistribusi normal atau tidak
qqnorm(mc$bmi)
qqline(mc$bmi)
qqnorm(mc$children)
qqline(mc$children)
qqnorm(mc$charges)
qqline(mc$charges)
# Apabila data cenderung berada pada garis berarti data berdistribusi normal
# Namun apabila sebagian besar berada di bawah garis, maka data tidak berdistribusi normal
1. Seleksi Kolom
Seleksi kolom ini untuk menghapus data atau kolom yang tidak diperlukan, yaitu kolom bmi, children, dan region.
mc1 <- mc[, -3] # Menghapus kolom ke-3 dari tabel mc, yaitu kolom bmi
mc1 <- mc1[, -3] # Menghapus kolom ke-3 dari tabel mc1, yaitu tabel children
mc1 <- mc1[, -4] # Mengahapus kolom ke-4 dari tabel mc1, yaitu tabel region
mc1[1:5,] # Mengakses tabel mc1 dari baris ke satu sampai 5 (hanya sample saja untuk dilihat)
## age sex smoker charges
## 1 19 female yes 16884.924
## 2 18 male no 1725.552
## 3 28 male no 4449.462
## 4 33 male no 21984.471
## 5 32 male no 3866.855
2. Menghapus Outlier Pada analisis outlier sebelumnya, ditemukan outlier pada kolom numerik untuk variabel bmi dan charges. Namun, variabel bmi tidak diperlukan lagi dan sudah dihapus. Sehingga hanya variabel charges saja yang dihapus outliernya.
# Berikut sintaks untuk menghapus outlier pada charges
Q = quantile(mc1$charges, probs = c(.25, .75), na.rm = FALSE) # Mencari kuartil ke-1(kuartil bawah) dan ke-3(kuartil atas) dari kolom charges
IQR <- IQR(mc1$charges) # Mencari jangkauan interkuartil dari kolom charges
Q # Menampilkan nilai kuartil ke-1 dan ke-3
IQR # Menampilkan nilai jangkauan interkuartil
batas_atas <- Q[2] + 1.5*IQR
batas_bawah <- Q[1] - 1.5*IQR
mc1 <- subset(mc1, mc1$charges > 7030.798 & mc1$charges < 11862.085 ) # Menghapus outlier pada kolom charges
mc1
Namun, setelah saya coba penghapusan outlier pada kolom charges ini memengaruhi dataset di akhir. Jadi saya putuskan untuk tidak menghapus outlier nya.
3. Normalisasi Data
normal_data <- distinct(mc1)
4. Membagi data menjadi data training dan data testing
library(dplyr)
set.seed(123)
label <- sample(x = 2, size=(nrow(mc1)), replace= TRUE, prob=c(0.8,0.2)) # Membagi dataset menjadi dua bagian
train <- mc1[label == 1,]
test <- mc1[label == 2,]
size <- floor(0.75 * nrow(mc1))
set.seed(123)
training <- sample(seq_len(nrow(mc1)), size = size)
trainingset <- mc1[training,]
testset <- mc1[-training,]
# Membuat scatter plot untuk memvisualisasikan data
library(plotly) # Mengakses library plotly
sc <- plot_ly(data = mc1, # Dataframe
x = ~age, # Sumbu x
y = ~charges, # Sumbu y
color = ~smoker) # Kategori atau perbedaan warna
sc <- sc %>% layout(title = 'Medical Cost For Smoker', # Judul Plot
xaxis = list(title = 'smoker', # Label sumbu x
zeroline = TRUE),
yaxis = list(title = 'charges')) # Label sumbu y
sc # Menampilkan hasil visualisasi
## No trace type specified:
## Based on info supplied, a 'scatter' trace seems appropriate.
## Read more about this trace type -> https://plotly.com/r/reference/#scatter
## No scatter mode specifed:
## Setting the mode to markers
## Read more about this attribute -> https://plotly.com/r/reference/#scatter-mode
## Warning in RColorBrewer::brewer.pal(N, "Set2"): minimal value for n is 3, returning requested palette with 3 different levels
## Warning in RColorBrewer::brewer.pal(N, "Set2"): minimal value for n is 3, returning requested palette with 3 different levels
Dari plot diatas, dapat terlihat bahwa seorang perokok (smoker) memiliki biaya pengeluaran medis yang lebih besar dibandingkan yang bukan perokok baik dari kalangan usia manapun.