Analisis Asuransi Kesehatan
1. Input Library
## Warning: package 'psych' was built under R version 4.4.1
##
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
##
## date, intersect, setdiff, union
##
## 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
2. Read Data
insurance <- read.csv("insurance data.csv", stringsAsFactors = TRUE)
rmarkdown::paged_table(insurance)Description - age : umur nasabah - sex : jenis kelamin nasabah - bmi : index massa tubuh - children : jumlah tanggungan anak nasabah - smoker : apakah nasabah perokok atau tidak - Claim Amount : - Past Consultations : - Num of steps: - Hospital Expenditure : - Number of past Hospitalizations : - Anual Salary - region : region tempat tinggal ansabah - charges : biaya pengobatan (medical cost) yang ditanggung oleh pihak asuransi terhadap nasabah
3. Data Wraling
Inspeksi missing value
## age sex
## 9 0
## bmi children
## 3 5
## smoker Claim_Amount
## 0 14
## past_consultations num_of_steps
## 6 3
## Hospital_expenditure NUmber_of_past_hospitalizations
## 4 2
## Anual_Salary region
## 6 0
## charges
## 0
Menghapus baris yang mengandung NA
# Menentukan kolom mana yang tidak memiliki nilai NA
complete_columns <- colSums(is.na(insurance)) == 0
# Subset dataframe hanya dengan kolom-kolom yang tidak memiliki NA
insurance_clean <- subset(insurance, select = complete_columns)
# Menampilkan struktur dataframe baru
str(insurance_clean)## 'data.frame': 1334 obs. of 4 variables:
## $ sex : Factor w/ 2 levels "female","male": 2 2 1 2 1 2 1 1 1 1 ...
## $ smoker : Factor w/ 2 levels "no","yes": 1 1 1 1 1 1 1 1 1 1 ...
## $ region : Factor w/ 4 levels "northeast","northwest",..: 4 4 2 1 2 3 4 2 4 3 ...
## $ charges: num 8028 13823 2131 6749 2709 ...
4. Summary Data
## age sex bmi children smoker
## Min. :18.00 female:660 Min. :15.96 Min. :0.000 no :1062
## 1st Qu.:27.00 male :674 1st Qu.:26.25 1st Qu.:0.000 yes: 272
## Median :39.00 Median :30.36 Median :1.000
## Mean :39.26 Mean :30.65 Mean :1.091
## 3rd Qu.:51.00 3rd Qu.:34.60 3rd Qu.:2.000
## Max. :64.00 Max. :53.13 Max. :5.000
## NA's :9 NA's :3 NA's :5
## Claim_Amount past_consultations num_of_steps Hospital_expenditure
## Min. : 1920 Min. : 1.00 Min. : 695430 Min. : 29453
## 1st Qu.:20715 1st Qu.: 9.00 1st Qu.: 847017 1st Qu.: 4062837
## Median :33670 Median :15.00 Median : 913998 Median : 7475057
## Mean :33302 Mean :15.19 Mean : 909599 Mean : 15701180
## 3rd Qu.:45034 3rd Qu.:20.00 3rd Qu.: 970836 3rd Qu.: 10802988
## Max. :77278 Max. :40.00 Max. :1107872 Max. :261631699
## NA's :14 NA's :6 NA's :3 NA's :4
## NUmber_of_past_hospitalizations Anual_Salary region
## Min. :0.000 Min. :2.747e+06 northeast:323
## 1st Qu.:1.000 1st Qu.:7.699e+07 northwest:324
## Median :1.000 Median :1.414e+08 southeast:363
## Mean :1.058 Mean :3.665e+08 southwest:324
## 3rd Qu.:1.000 3rd Qu.:3.205e+08
## Max. :3.000 Max. :4.117e+09
## NA's :2 NA's :6
## charges
## Min. : 1122
## 1st Qu.: 4724
## Median : 9333
## Mean :13200
## 3rd Qu.:16455
## Max. :63770
##
5. Exploratory Data
Cek persebaran data numerik pada dataset
Plot di atas menunjukkan visualisasi secara garis besar persebaran data seluruh variabel numerik pada dataset insurance. Mari kita bedah satu per satu sebagai berikut.
## [1] 18 64
💡 Insight: * Pihak asuransi memiliki nasabah dengan rentang umur 18 - 64 tahun, dan didominasi oleh nasabah yang berumur < 20 tahun
## [1] 15.96 53.13
💡 Insight: * Nilai bmi nasabah berada pada rentang 15.96 - 53.13, dimana bmi 25 - 35 adalah yang dominan. Berdasarkan klasifikasi obesitas, rentang bmi 25 - 35 masuk ke dalam kelas overweight hingga obesitas level 1
## [1] 1121.874 63770.428
💡 Insight: * Biaya pengobatan yang dikeluarkan oleh pihak asuransi berada pada rentang 1121.874 - 63770.428, dimana nilai yang dominan ada di < 15000an
boxplot(insurance$charges, horizontal = TRUE, col = "#ffdab9", main = "Boxplot of Insurance Charges")💡 Insight: * Variabel charges memiliki outlier atas (outlier di nilai yang besar) * Persebaran data kita ada di nilai kecil (0-30000an)
Melihat persebaran data charges nasabah yang memiliki nilai bmi
# subset data dengan bmi<30
bmi_less30 <- insurance[insurance$bmi<30,]
hist(bmi_less30$charges, col = "#BDB76B", main = "Histogram of Charges for BMI < 30")💡 Insight: * Persebaran data charges pada nasabah dengan bmi < 30 cukup stabil
# subset data dengan bmi < 30
bmi_more30 <- insurance[insurance$bmi>30,]
hist(bmi_more30$charges, col = "#20B2AA", main = "Histogram of Charges for BMI > 30")💡 Insight: * Persebaran data charges pada nasabah dengan bmi > 30 cenderung fluktuatif
# subset data dengan bmi 25-35
bmi_range <- insurance[insurance$bmi>25 & insurance$bmi<35,]
hist(bmi_range$charges, col = "#BC8F8F", main = "Histogram of Charges for BMI 25-35")💡 Insight: * Persebaran data charges pada nasabah dengan bmi 25-35 cukup stabil namun sedikit fluktuatif
Melihat persebaran data smoker terhadap biaya (charges)
plot(insurance$smoker, insurance$charges,
col = ifelse(insurance$smoker == "yes", "#F08080", "#B0C4DE"),
pch = 19, xlab = "Smoker Status", ylab = "Charges",
main = "Scatter Plot of Charges vs Smoker Status",
xlim = c(0.8, 2.2),
ylim = c(0, 80000))💡 Insight: * Nasabah perokok memiliki range charges yang lebih tinggi yaitu 12000-60000an dibandingkan bukan perokok yakni 0-20000an
Melihat persebaran data age terhadap biaya (charges)
insurance$smoker <- factor(insurance$smoker, levels = c("no", "yes"))
# Define colors based on smoker status
colors <- ifelse(insurance$smoker == "yes", "#F08080", "#B0C4DE")
# Plotting with color
plot(insurance$age, insurance$charges, col = colors,
pch = 19, xlab = "Age", ylab = "Charges",
main = "Scatter Plot of Charges vs Age",
ylim = c(0, 80000))💡 Insight: * Dari hasil plot di atas, diperoleh informasi yang menarik bahwa bertambahnya umur nasabah, maka nilai charges nya juga bertambah tinggi.
Melihat persebaran data sex terhadap biaya (charges)
💡 Insight: * Dari plot di atas, diperoleh informasi bahwa pada dataset kita terdapat jumlah nasabah pria yang lebih banyak dibandingkan wanita, dimana nasabah pria memiliki charges yang lebih tinggi dibandingkan wanita yaitu 0-40000an terhadap 0-20000an, meskipun ada outlier biaya charges pada wanita lebih tinggi dibandingkan pria. Namun, kita perlu fokus terhadap range boxplot data yang menjadi kumpulan data terbanyak.
Melihat persebaran data region terhadap biaya (charges)
💡 Insight: * Kita dapat melihat bahwa data terbanyak terdapat pada nasabah yang tinggal di region southeast dengan biaya charges berada pada rentang 0-40000an. Sementara, data paling sedikit terdapat pada nasabah yang tinggal di region southwest dengan biaya charges berada pada rentang 0 - 20000an.