library(readr)
library(dplyr)
library(ggplot2)
library(car)
Pada tahap awal, dilakukan pemanggilan beberapa library yang dibutuhkan dalam proses analisis data. Library readr digunakan untuk membaca dataset, dplyr untuk manipulasi data, ggplot2 untuk visualisasi, serta car untuk mendukung analisis statistik multivariat seperti MANOVA dan MANCOVA.
# Import dataset 
data <- read.csv("insurance.csv")

# Lihat struktur data
str(data)
## '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 ...
# Ringkasan data
summary(data)
##       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
Selanjutnya, dataset diimpor ke dalam R menggunakan fungsi read.csv(). Setelah data berhasil dimuat, dilakukan pengecekan struktur data menggunakan str() untuk mengetahui tipe masing-masing variabel, serta summary() untuk melihat ringkasan statistik awal dari data yang akan dianalisis.
# Mengubah variabel kategorik menjadi factor
data$sex <- as.factor(data$sex)
data$smoker <- as.factor(data$smoker)
data$region <- as.factor(data$region)

# Cek ulang struktur
str(data)
## '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 ...
Pada tahap ini dilakukan proses preprocessing dengan mengubah variabel kategorik seperti sex, smoker, dan region menjadi tipe factor. Hal ini penting karena analisis MANOVA membutuhkan variabel independen dalam bentuk kategori sebagai pembeda antar kelompok
summary(data[, c("charges", "bmi", "age")])
##     charges           bmi             age       
##  Min.   : 1122   Min.   :15.96   Min.   :18.00  
##  1st Qu.: 4740   1st Qu.:26.30   1st Qu.:27.00  
##  Median : 9382   Median :30.40   Median :39.00  
##  Mean   :13270   Mean   :30.66   Mean   :39.21  
##  3rd Qu.:16640   3rd Qu.:34.69   3rd Qu.:51.00  
##  Max.   :63770   Max.   :53.13   Max.   :64.00
Analisis statistik deskriptif dilakukan untuk mengetahui gambaran umum dari variabel utama, yaitu charges, bmi, dan age. Hasil ini memberikan informasi mengenai nilai minimum, maksimum, rata-rata, serta distribusi awal data.
# Histogram charges
ggplot(data, aes(x = charges)) +
  geom_histogram(bins = 30, fill = "red", alpha = 0.7)

# Histogram BMI
ggplot(data, aes(x = bmi)) +
  geom_histogram(bins = 30, fill = "green", alpha = 0.7)

# Boxplot charges berdasarkan smoker
ggplot(data, aes(x = smoker, y = charges)) +
  geom_boxplot(fill = "orange")

# Boxplot BMI berdasarkan region
ggplot(data, aes(x = region, y = bmi)) +
  geom_boxplot(fill = "blue")

Visualisasi data dilakukan untuk melihat pola distribusi dan perbedaan antar kelompok. Histogram digunakan untuk melihat distribusi variabel numerik seperti charges dan bmi, sedangkan boxplot digunakan untuk membandingkan distribusi data berdasarkan kelompok seperti smoker dan region.
shapiro.test(data$charges)
## 
##  Shapiro-Wilk normality test
## 
## data:  data$charges
## W = 0.81469, p-value < 2.2e-16
shapiro.test(data$bmi)
## 
##  Shapiro-Wilk normality test
## 
## data:  data$bmi
## W = 0.99389, p-value = 2.605e-05
cor(data$charges, data$bmi)
## [1] 0.198341
Pengujian asumsi dilakukan sebelum analisis utama. Uji normalitas menggunakan Shapiro-Wilk test bertujuan untuk mengetahui apakah data berdistribusi normal. Selain itu, dilakukan uji korelasi antar variabel dependen untuk memastikan tidak terjadi hubungan yang terlalu kuat yang dapat mempengaruhi hasil analisis MANOVA.
boxplot(charges ~ smoker, data = data)

boxplot(bmi ~ region, data = data)

# Model MANOVA
manova_model <- manova(cbind(charges, bmi) ~ smoker + region, data = data)

# Hasil MANOVA
summary(manova_model)
##             Df  Pillai approx F num Df den Df    Pr(>F)    
## smoker       1 0.64523  1211.29      2   1332 < 2.2e-16 ***
## region       3 0.08708    20.23      6   2666 < 2.2e-16 ***
## Residuals 1333                                             
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Hasil ANOVA per variabel
summary.aov(manova_model)
##  Response charges :
##               Df     Sum Sq    Mean Sq   F value Pr(>F)    
## smoker         1 1.2152e+11 1.2152e+11 2175.8631 <2e-16 ***
## region         3 1.0752e+08 3.5841e+07    0.6417 0.5882    
## Residuals   1333 7.4447e+10 5.5849e+07                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
##  Response bmi :
##               Df Sum Sq Mean Sq F value Pr(>F)    
## smoker         1      1    0.70  0.0204 0.8864    
## region         3   4064 1354.72 39.5537 <2e-16 ***
## Residuals   1333  45655   34.25                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Analisis MANOVA dilakukan untuk menguji pengaruh variabel independen, yaitu smoker dan region, terhadap dua variabel dependen secara simultan, yaitu charges dan bmi. Output yang dihasilkan digunakan untuk mengetahui apakah terdapat perbedaan yang signifikan antar kelompok.
# Model MANCOVA (dengan covariate age)
mancova_model <- manova(cbind(charges, bmi) ~ smoker + region + age, data = data)

# Hasil MANCOVA
summary(mancova_model)
##             Df  Pillai approx F num Df den Df    Pr(>F)    
## smoker       1 0.71114  1638.36      2   1331 < 2.2e-16 ***
## region       3 0.08738    20.28      6   2664 < 2.2e-16 ***
## age          1 0.27098   247.37      2   1331 < 2.2e-16 ***
## Residuals 1332                                             
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# ANOVA detail
summary.aov(mancova_model)
##  Response charges :
##               Df     Sum Sq    Mean Sq   F value Pr(>F)    
## smoker         1 1.2152e+11 1.2152e+11 2970.6621 <2e-16 ***
## region         3 1.0752e+08 3.5841e+07    0.8762 0.4528    
## age            1 1.9959e+10 1.9959e+10  487.9181 <2e-16 ***
## Residuals   1332 5.4488e+10 4.0907e+07                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
##  Response bmi :
##               Df Sum Sq Mean Sq F value    Pr(>F)    
## smoker         1      1    0.70  0.0207    0.8857    
## region         3   4064 1354.72 40.0669 < 2.2e-16 ***
## age            1    619  618.60 18.2955 2.027e-05 ***
## Residuals   1332  45037   33.81                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Analisis MANCOVA merupakan pengembangan dari MANOVA dengan menambahkan variabel age sebagai kovariat. Tujuannya adalah untuk mengontrol pengaruh usia terhadap variabel dependen, sehingga hasil analisis menjadi lebih akurat dan mencerminkan kondisi yang lebih nyata.
# Korelasi lengkap
cor(data[, c("charges", "bmi", "age")])
##           charges       bmi       age
## charges 1.0000000 0.1983410 0.2990082
## bmi     0.1983410 1.0000000 0.1092719
## age     0.2990082 0.1092719 1.0000000
# Rata-rata charges per smoker
aggregate(charges ~ smoker, data = data, mean)
##   smoker   charges
## 1     no  8434.268
## 2    yes 32050.232
# Rata-rata BMI per region
aggregate(bmi ~ region, data = data, mean)
##      region      bmi
## 1 northeast 29.17350
## 2 northwest 29.19978
## 3 southeast 33.35599
## 4 southwest 30.59662
Analisis tambahan dilakukan untuk melihat rata-rata nilai charges berdasarkan status merokok serta rata-rata bmi berdasarkan wilayah. Hasil ini membantu memperkuat interpretasi dalam pembahasan