Kelompok 13

Anggota Kelompok:

  1. Santi Laelatul Mu’azaroh (24031554004)

  2. Christine Aprilia Putri (24031554046)

  3. Nadia Kaila (24031554109)

  4. Fridania Nisa Calita (24031554208)

Tautan Dataset: Human Age Prediction Synthetic Dataset

Persiapan Data

# install.packages(c("car", "heplots", "pingouin", "visreg"))

library(readr)
## Warning: package 'readr' was built under R version 4.5.3
library(car)
## Loading required package: carData
library(heplots)
## Warning: package 'heplots' was built under R version 4.5.3
## Loading required package: broom
library(psych)
## 
## Attaching package: 'psych'
## The following object is masked from 'package:car':
## 
##     logit
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following object is masked from 'package:car':
## 
##     recode
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(ggplot2)
## 
## Attaching package: 'ggplot2'
## The following objects are masked from 'package:psych':
## 
##     %+%, alpha
library(MVN)
## Warning: package 'MVN' was built under R version 4.5.3
## 
## Attaching package: 'MVN'
## The following object is masked from 'package:psych':
## 
##     mardia
df <- read_csv("Train (1).csv")
## Rows: 3000 Columns: 26
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (13): Gender, Blood Pressure (s/d), Physical Activity Level, Smoking Sta...
## dbl (13): Height (cm), Weight (kg), Cholesterol Level (mg/dL), BMI, Blood Gl...
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
names(df) <- make.names(names(df))

df$Smoking_Status_Num <- as.numeric(as.factor(df$Smoking.Status)) 
df$Smoking_Status <- as.factor(df$Smoking.Status)

df_clean <- df %>%
  select(
    Smoking_Status, 
    Smoking_Status_Num,
    Age = Age..years.,
    Cholesterol = Cholesterol.Level..mg.dL.,
    Glucose = Blood.Glucose.Level..mg.dL.
  ) %>%
  na.omit()

Pada tahap awal, data Train.csv berhasil dimuat dengan jumlah 3.000 baris. Nama kolom kemudian dirapikan menggunakan make.names agar tidak ada spasi atau tanda khusus, sehingga lebih mudah digunakan dalam pemanggilan variabel. Variabel Smoking Status diubah menjadi tipe factor untuk menunjukkan kelompok data. Hasil akhirnya adalah dataset df_clean yang berisi variabel utama, yaitu 1 faktor (Smoking Status), 1 kovariat (Age), dan 2 variabel dependen (Cholesterol dan Glucose).

df_clean
## # A tibble: 3,000 × 5
##    Smoking_Status Smoking_Status_Num   Age Cholesterol Glucose
##    <fct>                       <dbl> <dbl>       <dbl>   <dbl>
##  1 Former                          2    89        259.    158.
##  2 Current                         1    77        264.    119.
##  3 Never                           3    70        208.    144.
##  4 Never                           3    52        253.    137.
##  5 Former                          2    79        236.    145.
##  6 Current                         1    29        199.    101.
##  7 Current                         1    76        246.    130.
##  8 Never                           3    26        222.    117.
##  9 Former                          2    50        204.    137.
## 10 Former                          2    77        269.    130.
## # ℹ 2,990 more rows

EDA

  1. Statistik Deskriptif per Status Merokok
print(describeBy(df_clean[, c("Cholesterol", "Glucose", "Age")], 
                 group = df_clean$Smoking_Status, mat = TRUE))
##              item  group1 vars    n      mean       sd   median   trimmed
## Cholesterol1    1 Current    1  793 235.01772 23.56893 235.1830 234.71797
## Cholesterol2    2  Former    1 1181 235.71566 24.67547 236.1199 235.79398
## Cholesterol3    3   Never    1 1026 231.32567 24.85547 231.5397 231.14248
## Glucose1        4 Current    2  793 127.48342 18.21799 126.9917 127.29043
## Glucose2        5  Former    2 1181 128.00814 17.94511 128.3495 128.03424
## Glucose3        6   Never    2 1026 124.45395 18.36520 124.6619 124.54039
## Age1            7 Current    3  793  57.07945 18.86843  57.0000  57.26142
## Age2            8  Former    3 1181  55.80864 19.73332  56.0000  56.00212
## Age3            9   Never    3 1026  48.03411 21.64782  46.0000  47.02311
##                   mad       min      max    range         skew    kurtosis
## Cholesterol1 24.34295 162.79104 331.3006 168.5095  0.181177210  0.20284480
## Cholesterol2 24.74826 164.07831 307.9204 143.8421 -0.025313498 -0.04334136
## Cholesterol3 25.62080 148.81151 303.1247 154.3131  0.050436506 -0.18210934
## Glucose1     18.67773  78.75352 184.9938 106.2402  0.124310053 -0.16523758
## Glucose2     18.34126  73.93323 185.7361 111.8029  0.001358811 -0.21565543
## Glucose3     18.02917  69.86688 180.9044 111.0375 -0.032548816 -0.17330628
## Age1         23.72160  18.00000  89.0000  71.0000 -0.057112336 -1.09671133
## Age2         25.20420  18.00000  89.0000  71.0000 -0.042531114 -1.14310053
## Age3         28.16940  18.00000  89.0000  71.0000  0.294195602 -1.22160087
##                     se
## Cholesterol1 0.8369571
## Cholesterol2 0.7180266
## Cholesterol3 0.7759761
## Glucose1     0.6469397
## Glucose2     0.5221812
## Glucose3     0.5733529
## Age1         0.6700376
## Age2         0.5742160
## Age3         0.6758347

Hasil menunjukkan bahwa rata-rata kadar kolesterol berada di sekitar 231–235 mg/dL dan gula darah di sekitar 124–128 mg/dL untuk semua kelompok. Nilai skewness dan kurtosis yang mendekati nol menunjukkan bahwa data cenderung simetris, sehingga menjadi tanda awal bahwa data berdistribusi normal.

  1. Boxplot
par(mfrow=c(1,2))
boxplot(Cholesterol ~ Smoking_Status, data = df_clean, col = "skyblue", 
        main = "Boxplot Kolesterol", xlab = "Status Merokok")
boxplot(Glucose ~ Smoking_Status, data = df_clean, col = "salmon", 
        main = "Boxplot Gula Darah", xlab = "Status Merokok")

par(mfrow=c(1,1))

Visualisasi boxplot menunjukkan bahwa distribusi kadar kolesterol dan gula darah pada ketiga kelompok status merokok terlihat cukup mirip, namun tetap ada beberapa hal penting yang perlu diperhatikan. Pada variabel kolesterol (warna biru), garis median dari ketiga kelompok berada pada posisi yang hampir sama, yaitu di sekitar 231 hingga 235 mg/dL. Hal ini menunjukkan bahwa tidak ada perbedaan nilai tengah yang mencolok antar kelompok. Selain itu, ukuran kotak atau Rentang Interkuartil (IQR) yang hampir sama pada kelompok Current, Former, dan Never juga menunjukkan bahwa variasi data antar kelompok cenderung seragam, sehingga asumsi homogenitas varians kemungkinan besar terpenuhi.

Pada variabel gula darah (warna salmon), pola distribusinya terlihat cukup simetris karena garis median berada di tengah kotak. Hal ini mendukung hasil uji normalitas Shapiro-Wilk sebelumnya. Meskipun nilai median antar kelompok hampir sama, terlihat bahwa kelompok perokok (Current) dan mantan perokok (Former) sedikit lebih tinggi dibandingkan kelompok yang tidak pernah merokok. Ini bisa menjadi tanda awal bahwa status merokok mungkin berpengaruh terhadap kadar gula darah, sehingga perlu diuji lebih lanjut pada analisis berikutnya.

Selain itu, adanya beberapa titik di luar garis whisker pada kedua variabel menunjukkan adanya data pencilan (outlier). Hal ini mendukung langkah pembersihan data menggunakan metode Mahalanobis Distance yang telah dilakukan sebelumnya. Outlier tersebut perlu ditangani agar tidak memengaruhi hasil analisis. Secara keseluruhan, boxplot ini menunjukkan bahwa data sudah cukup siap untuk dianalisis lebih lanjut karena distribusinya cenderung simetris, variansnya seragam, dan outlier sudah teridentifikasi dengan baik.

  1. Cek Korelasi antar Variabel Dependen
print(cor(df_clean[, c("Cholesterol", "Glucose")]))
##             Cholesterol   Glucose
## Cholesterol   1.0000000 0.1895891
## Glucose       0.1895891 1.0000000

Nilai korelasi sebesar 0.189 menunjukkan adanya hubungan positif yang lemah antara kolesterol dan gula darah. Dalam analisis MANOVA, variabel dependen memang sebaiknya memiliki hubungan, tidak boleh nol tetapi juga tidak boleh terlalu tinggi agar tidak terjadi multikolinearitas dan analisis tetap efektif.

Pengujian Asumsi

  1. Uji Normalitas Univariat Shapiro-Wilk
print(shapiro.test(df_clean$Cholesterol))
## 
##  Shapiro-Wilk normality test
## 
## data:  df_clean$Cholesterol
## W = 0.9995, p-value = 0.6622
print(shapiro.test(df_clean$Glucose))
## 
##  Shapiro-Wilk normality test
## 
## data:  df_clean$Glucose
## W = 0.99917, p-value = 0.1804

Kolesterol (p = 0.6622) dan gula darah (p = 0.1804) sama-sama memiliki nilai p lebih dari 0.05. Artinya, secara masing-masing, kedua variabel dependen sudah memenuhi asumsi normalitas.

  1. Uji Normalitas Multivariat Mardia Test
mardia(df_clean[, c("Cholesterol", "Glucose")])
##              Test Statistic   p.value     Method
## 1 Mardia Skewness  1.947703 0.7453773 asymptotic
## 2 Mardia Kurtosis -1.157075 0.2472418 asymptotic

Hasil uji menunjukkan bahwa nilai p untuk skewness (0.745) dan kurtosis (0.247) lebih dari 0.05. Hal ini menunjukkan bahwa data sudah memenuhi asumsi normalitas multivariat, sehingga analisis MANOVA/MANCOVA dapat dilanjutkan.

  1. Uji Outlier Multivariat dengan Mahalanobis Distance
m_dist <- mahalanobis(df_clean[, c("Cholesterol", "Glucose")], 
                      colMeans(df_clean[, c("Cholesterol", "Glucose")]), 
                      cov(df_clean[, c("Cholesterol", "Glucose")]))
cutoff <- qchisq(1-0.001, df=2)
outliers <- which(m_dist > cutoff)
cat("Ditemukan", length(outliers), "baris outlier.\n")
## Ditemukan 2 baris outlier.

Menghapus outlier

if(length(outliers) > 0) {
  df_final <- df_clean[-outliers, ]
} else {
  df_final <- df_clean
}

Berdasarkan batas nilai Chi-Square, ditemukan 2 data yang termasuk outlier multivariat. Data tersebut kemudian dihapus untuk membentuk df_final, agar hasil analisis selanjutnya tidak dipengaruhi oleh nilai yang terlalu ekstrem.

Uji Homogenitas

  1. Uji Levene (Homogenitas Varians)
print(leveneTest(Cholesterol ~ Smoking_Status, data = df_final))
## Levene's Test for Homogeneity of Variance (center = median)
##         Df F value Pr(>F)
## group    2  1.9153 0.1475
##       2995
print(leveneTest(Glucose ~ Smoking_Status, data = df_final))
## Levene's Test for Homogeneity of Variance (center = median)
##         Df F value Pr(>F)
## group    2  0.0944 0.9099
##       2995

Variabel kolesterol (p = 0.1475) dan gula darah (p = 0.9099) sama-sama memiliki nilai p lebih dari 0.05. Artinya, varians antar kelompok pada masing-masing variabel adalah sama atau homogen.

  1. Uji Box’s M (Homogenitas Matriks Kovarians)
res_boxm <- boxM(cbind(df_final$Cholesterol, df_final$Glucose), df_final$Smoking_Status)
print(res_boxm)
## 
##  Box's M-test for Homogeneity of Covariance Matrices 
## 
## data:  cbind(df_final$Cholesterol, df_final$Glucose) by df_final$Smoking_Status 
## Chi-Sq (approx.) = 5.1235, df = 6, p-value = 0.5281

Nilai p = 0.5281 (lebih dari 0.05) menunjukkan bahwa matriks kovarians antar kelompok adalah sama atau homogen. Hal ini menunjukkan bahwa salah satu asumsi dalam MANCOVA sudah terpenuhi, sehingga penggunaan statistik Wilks’ Lambda nantinya dapat dianggap valid.

  1. Uji Homogenitas Slope Univariat (ANCOVA)
# Cholesterol
model_slope_chol <- lm(Cholesterol ~ Smoking_Status * Age, data = df_final)
anova(model_slope_chol)
## Analysis of Variance Table
## 
## Response: Cholesterol
##                      Df  Sum Sq Mean Sq  F value    Pr(>F)    
## Smoking_Status        2   11518    5759  11.8527 7.459e-06 ***
## Age                   1  326866  326866 672.7066 < 2.2e-16 ***
## Smoking_Status:Age    2     302     151   0.3108    0.7329    
## Residuals          2992 1453803     486                       
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Hasil uji untuk variabel kolesterol, diperoleh nilai p-value antara Smoking_Status:Age adalah 0,7329 (> 0,05) menunjukkan bahwa tidak terdapat interaksi yang signifikan antara kedua variabel tersebut. Pengaruh usia terhadap kadar kolesterol bersifat konsisten di seluruh kelompok status merokok. Artinya, kemiringan garis regresi (slope) antar kelompok dapat dianggap sejajar. Oleh karena itu, asumsi homogenitas slope pada analisis ANCOVA untuk variabel kolesterol terpenuhi, sehingga model dapat digunakan secara valid.

#Glucose
model_slope_gluc <- lm(Glucose ~ Smoking_Status * Age, data = df_final)
anova(model_slope_gluc)
## Analysis of Variance Table
## 
## Response: Glucose
##                      Df Sum Sq Mean Sq  F value    Pr(>F)    
## Smoking_Status        2   7599    3799  14.0325 8.594e-07 ***
## Age                   1 174968  174968 646.2178 < 2.2e-16 ***
## Smoking_Status:Age    2     88      44   0.1628    0.8498    
## Residuals          2992 810103     271                       
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Hasil uji untuk variabel gula darah menunjukkan bahwa nilai p-value sebesar 0,8498 (> 0,05) yang mengindikasikan bahwa tidak terdapat interaksi signifikan antara kovariat usia dan faktor status merokok dalam memengaruhi kadar gula darah. Hubungan antara usia dan kadar gula darah bersifat seragam di semua kelompok, menunjukkan bahwa kemiringan garis regresi antar kelompok adalah homogen. Oleh karena itu, asumsi homogenitas slope untuk variabel gula darah terpenuhi dan analisis ANCOVA dapat dilakukan secara sah.

Multivariat (MANCOVA)

model_mancova_interaksi <- manova(
  cbind(Cholesterol, Glucose) ~ Smoking_Status * Age,
  data = df_final
)

summary(model_mancova_interaksi, test = "Wilks")
##                      Df   Wilks approx F num Df den Df    Pr(>F)    
## Smoking_Status        2 0.98312    12.78      4   5982 2.315e-10 ***
## Age                   1 0.69571   654.11      2   2991 < 2.2e-16 ***
## Smoking_Status:Age    2 0.99969     0.24      4   5982    0.9185    
## Residuals          2992                                             
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Hasil uji menghasilkan nilai p-value sebesar 0,9185 (> 0,05) berdasarkan statistik Wilks’ Lambda, yang menunjukkan bahwa tidak terdapat interaksi signifikan secara simultan antara kovariat dan faktor terhadap kombinasi variabel dependen (kolesterol dan gula darah). Hal ini berarti pengaruh usia terhadap kedua variabel dependen bersifat konsisten di seluruh kelompok status merokok. Dengan demikian, asumsi homogenitas slope dalam kerangka multivariat terpenuhi, sehingga model MANCOVA dapat digunakan secara valid untuk analisis lanjutan.

Linieritas Kovariat

print(ggplot(df_final, aes(x = Age, y = Cholesterol, color = Smoking_Status)) +
  geom_point(alpha = 0.2) + geom_smooth(method = "lm", se = FALSE) +
  labs(title = "Uji Linieritas: Age vs Cholesterol", x = "Usia", y = "Kolesterol") +
  theme_minimal())
## `geom_smooth()` using formula = 'y ~ x'

Visualisasi uji linearitas ini digunakan untuk melihat hubungan antara variabel kontrol (usia) dan variabel dependen (kolesterol) pada setiap kelompok status merokok. Dari grafik scatter plot, terlihat bahwa data tersebar cukup luas tetapi tetap mengikuti pola tertentu yang ditunjukkan oleh garis regresi pada masing-masing kelompok (Current, Former, dan Never). Ketiga garis tersebut menunjukkan tren linear positif, artinya kadar kolesterol cenderung meningkat seiring bertambahnya usia, tanpa dipengaruhi oleh status merokok.

Hal penting dalam asumsi MANCOVA adalah adanya hubungan linear dan arah hubungan yang serupa antar kelompok. Pada grafik ini, terlihat bahwa ketiga garis regresi memiliki kemiringan yang hampir sama (sejajar) dan tidak saling berpotongan secara mencolok. Ini menunjukkan bahwa tidak ada interaksi yang signifikan antara usia dan status merokok terhadap kadar kolesterol. Dengan kata lain, pengaruh usia terhadap kolesterol konsisten di semua kelompok.

Secara keseluruhan, grafik ini menunjukkan bahwa variabel usia layak digunakan sebagai kovariat dalam model MANCOVA. Hubungan linear yang stabil ini memastikan bahwa pengaruh usia dapat dikontrol dengan baik, sehingga perbedaan kadar kolesterol akibat status merokok dapat terlihat lebih jelas tanpa dipengaruhi oleh perbedaan usia.

Univariate Analysis

Kita telah mengetahui bahwa usia memengaruhi kolesterol, jadi kita ingin “menyamakan” usia semua orang secara statistik agar perbandingan status merokok menjadi lebih adil.

  1. ANOVA (Analysis of Variance)

Uji untuk melihat apakah ada perbedaan rata-rata kadar (Kolesterol/Gula Darah) yang signifikan di antara kelompok status merokok tanpa memperhitungkan faktor lain.

  1. Analisis Pengaruh Smoking_Status terhadap Cholesterol

Menguji apakah ada perbedaan rata-rata kadar kolesterol antar kelompok perokok tanpa mempertimbangkan faktor usia.

# Membuat model ANOVA untuk Kolesterol
anova_chol <- aov(Cholesterol ~ Smoking_Status, data = df_final)

# Menampilkan hasil utama (P-value)
summary(anova_chol)
##                  Df  Sum Sq Mean Sq F value   Pr(>F)    
## Smoking_Status    2   11518    5759   9.685 6.42e-05 ***
## Residuals      2995 1780971     595                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Mendapatkan nilai baseline R-Squared
summary.lm(anova_chol)$r.squared
## [1] 0.006425932

Berdasarkan hasil pengujian ANOVA, diperoleh nilai signifikansi statistik (\(P\)-value) sebesar \(6,42 \times 10^{-5}\) atau \(0,0000642\). Nilai tersebut jauh berada di bawah ambang batas signifikansi \(0,05\), yang mengindikasikan bahwa hasil pengujian ini bersifat sangat signifikan. Hal ini menunjukkan bahwa secara statistik, terdapat perbedaan rata-rata kadar kolesterol yang nyata di antara kelompok status merokok, bahkan sebelum variabel kontrol seperti usia diperhitungkan dalam model.

Selain itu, hasil pengujian menunjukkan nilai \(F\)-hitung sebesar \(9,685\). Besarnya nilai \(F\) ini mencerminkan bahwa variabilitas atau perbedaan kadar kolesterol antar kelompok status merokok (Current, Former, Never) jauh lebih dominan dibandingkan dengan variabilitas yang terjadi di dalam masing-masing kelompok itu sendiri. Dengan kata lain, pengelompokan berdasarkan status merokok merupakan faktor yang cukup kuat dalam membedakan distribusi data kolesterol pada dataset ini.

Dilihat dari sisi kemampuan model dalam menjelaskan data, nilai \(R\)-Squared yang diperoleh adalah \(0,006425\) atau sekitar \(0,64\%\). Angka ini berperan sebagai nilai baseline yang menunjukkan bahwa variabel status merokok secara mandiri hanya mampu menjelaskan \(0,64\%\) dari total variasi kadar kolesterol subjek. Nilai yang relatif kecil ini memberikan indikasi kuat bahwa terdapat variabel lain yang belum masuk ke dalam model, seperti usia, yang diprediksi memiliki pengaruh lebih besar terhadap perubahan kolesterol. Oleh karena itu, analisis perlu dilanjutkan ke tahap ANCOVA untuk melihat peningkatan daya jelaskan model setelah variabel usia dikontrol.

  1. Analisis Pengaruh Smoking_Status terhadap Glucose

Menguji apakah status merokok secara mandiri memengaruhi kadar gula darah.

# Membuat model ANOVA untuk Gula Darah
anova_gluc <- aov(Glucose ~ Smoking_Status, data = df_final)

# Menampilkan hasil utama (P-value)
summary(anova_gluc)
##                  Df Sum Sq Mean Sq F value   Pr(>F)    
## Smoking_Status    2   7599    3799   11.55 1.01e-05 ***
## Residuals      2995 985159     329                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Mendapatkan nilai baseline R-Squared
summary.lm(anova_gluc)$r.squared
## [1] 0.007654191

Hasil uji ANOVA pada variabel gula darah menunjukkan nilai signifikansi (\(P\)-value) sebesar \(1,01 \times 10^{-5}\) atau \(0,0000101\). Nilai ini berada jauh di bawah kriteria signifikansi \(0,05\), sehingga dapat disimpulkan bahwa terdapat perbedaan kadar gula darah yang signifikan secara statistik di antara kelompok status merokok. Temuan ini menegaskan bahwa pada tahap awal analisis, status merokok diidentifikasi sebagai faktor yang membedakan profil gula darah subjek penelitian.

Kemudian, diperoleh nilai \(F\)-hitung sebesar \(11,55\), yang menunjukkan rasio variabilitas antar kelompok yang cukup tinggi. Besarnya nilai \(F\) ini mengindikasikan bahwa perbedaan rata-rata kadar gula darah antara kelompok Current, Former, dan Never sangat nyata. Konsistensi nilai \(F\) yang tinggi pada variabel gula darah ini memberikan dasar yang kuat untuk pengujian lebih lanjut guna melihat apakah signifikansi ini tetap bertahan setelah variabel usia dikontrol.

Model ANOVA awal untuk variabel gula darah menghasilkan nilai \(R\)-Squared sebesar \(0,007654\) atau \(0,77\%\). Hal ini berarti variabel status merokok hanya mampu menjelaskan sebagian kecil dari variabilitas kadar gula darah. Rendahnya nilai \(R\)-Squared baseline ini menunjukkan bahwa model univariat sederhana belum cukup kuat untuk merepresentasikan faktor-faktor yang memengaruhi gula darah secara menyeluruh. Oleh karena itu, penggunaan analisis ANCOVA dengan menyertakan variabel usia (Age) sebagai kovariat menjadi sangat krusial untuk meningkatkan kekuatan prediksi model.

  1. ANCOVA (Analysis of Covariance)

Tujuannya adalah untuk “menghilangkan” pengaruh usia, sehingga kamu bisa melihat apakah status merokok benar-benar berpengaruh murni terhadap kesehatan seseorang.

  1. Analisis Pengaruh Smoking_Status terhadap Cholesterol

Menguji apakah terdapat perbedaan rata-rata kadar kolesterol yang signifikan di antara kelompok status merokok, setelah melakukan kontrol statistik terhadap variabel usia (Age) sebagai kovariat.

# Menghitung pengaruh Smoking_Status setelah dikontrol oleh Age
ancova_chol <- aov(Cholesterol ~ Age + Smoking_Status, data = df_final)
summary(ancova_chol)
##                  Df  Sum Sq Mean Sq F value Pr(>F)    
## Age               1  337416  337416 694.740 <2e-16 ***
## Smoking_Status    2     968     484   0.996  0.369    
## Residuals      2994 1454105     486                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Mendapatkan nilai R-Squared ANCOVA Kolesterol
cat("R-Squared ANCOVA Kolesterol:", summary.lm(ancova_chol)$r.squared, "\n")
## R-Squared ANCOVA Kolesterol: 0.188779

Dari hasil tersebut, ditemukan bahwa usia memiliki pengaruh yang sangat signifikan terhadap kadar kolesterol (\(F=694,74, p < 0,001\)). Namun, temuan terpenting adalah pada variabel utama, yakni status merokok. Hasil uji ANCOVA menunjukkan bahwa pengaruh status merokok terhadap kadar kolesterol menjadi tidak signifikan (\(F=0,996, p=0,369\)).Hal ini memberikan temuan kritis bahwa perbedaan kadar kolesterol yang sebelumnya terdeteksi pada uji ANOVA awal sebenarnya lebih banyak dipengaruhi oleh distribusi usia subjek, bukan oleh perilaku merokok itu sendiri. Meskipun signifikansi variabel utama menurun, model ANCOVA ini memberikan gambaran yang jauh lebih akurat dengan kenaikan nilai \(R\)-Squared yang signifikan, yaitu dari \(0,64\%\) menjadi \(18,87\%\). Hal ini membuktikan bahwa faktor usia merupakan kontributor yang lebih dominan dalam menentukan kadar kolesterol dibandingkan status merokok dalam studi kasus ini.

  1. Analisis Pengaruh Smoking_Status terhadap Glucose

Menguji apakah status merokok memberikan pengaruh yang signifikan terhadap kadar gula darah secara mandiri, dengan mengeliminasi pengaruh gangguan yang mungkin ditimbulkan oleh variabel usia (Age).

# Menghitung pengaruh Smoking_Status setelah dikontrol oleh Age
ancova_gluc <- aov(Glucose ~ Age + Smoking_Status, data = df_final)
summary(ancova_gluc)
##                  Df Sum Sq Mean Sq F value Pr(>F)    
## Age               1 182017  182017 672.630 <2e-16 ***
## Smoking_Status    2    549     275   1.015  0.362    
## Residuals      2994 810191     271                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Mendapatkan nilai R-Squared ANCOVA Gula Darah
cat("R-Squared ANCOVA Gula Darah:", summary.lm(ancova_gluc)$r.squared, "\n")
## R-Squared ANCOVA Gula Darah: 0.1838982

Sama halnya dengan variabel kolesterol, hasil pengujian ANCOVA pada kadar gula darah menunjukkan bahwa variabel usia (Age) memegang peranan yang sangat signifikan sebagai kovariat (\(F=672,63, p < 0,001\)). Setelah pengaruh usia dikontrol, variabel status merokok menunjukkan hasil yang tidak signifikan secara statistik (\(F=1,015, p=0,362\)). Temuan ini mengindikasikan bahwa signifikansi yang ditemukan pada uji univariat awal (ANOVA) lebih disebabkan oleh kontribusi usia subjek daripada perilaku merokok itu sendiri. Penambahan variabel kontrol ini terbukti meningkatkan kualitas model secara signifikan, terlihat dari lonjakan nilai \(R\)-Squared yang semula hanya sebesar \(0,77\%\) menjadi \(18,38\%\). Hal ini menegaskan bahwa dalam konteks penelitian ini, usia merupakan faktor pengganggu (confounding factor) yang harus diperhitungkan untuk mendapatkan simpulan yang akurat mengenai pengaruh status merokok terhadap kesehatan metabolisme.

  1. Perbandingan Perbandingan Model
# 1. Membuat fungsi kecil untuk mengambil P-value dari model ANOVA/ANCOVA
get_p <- function(model, row_index) {
  summary_mod <- summary(model)
  return(summary_mod[[1]][["Pr(>F)"]][row_index])
}

# 2. Menyusun Data ke dalam Tabel (Data Frame)
tabel_banding <- data.frame(
  Variabel = c("Kolesterol", "Kolesterol", "Gula Darah", "Gula Darah"),
  Metode = c("ANOVA (Tanpa Age)", "ANCOVA (Dengan Age)", "ANOVA (Tanpa Age)", "ANCOVA (Dengan Age)"),
  P_Value_Smoking = c(
    get_p(anova_chol, 1), 
    get_p(ancova_chol, 2), 
    get_p(anova_gluc, 1), 
    get_p(ancova_gluc, 2)
  ),
  R_Squared = c(
    summary.lm(anova_chol)$r.squared,
    summary.lm(ancova_chol)$r.squared,
    summary.lm(anova_gluc)$r.squared,
    summary.lm(ancova_gluc)$r.squared
  )
)

# 3. Menampilkan Tabel
print(tabel_banding)
##     Variabel              Metode P_Value_Smoking   R_Squared
## 1 Kolesterol   ANOVA (Tanpa Age)    6.417582e-05 0.006425932
## 2 Kolesterol ANCOVA (Dengan Age)    3.693121e-01 0.188779007
## 3 Gula Darah   ANOVA (Tanpa Age)    1.006705e-05 0.007654191
## 4 Gula Darah ANCOVA (Dengan Age)    3.624776e-01 0.183898225

Multivariate Analyst (MANOVA & MANCOVA)

Kita telah mengetahui dari analisis univariat bahwa usia (Age) memiliki pengaruh yang signifikan terhadap kadar kolesterol dan gula darah. Oleh karena itu, untuk mendapatkan perbandingan yang lebih adil terkait pengaruh status merokok, kita perlu mengontrol variabel usia.

Selain itu, karena variabel dependen yang dianalisis lebih dari satu (Cholesterol dan Glucose), maka digunakan pendekatan multivariat agar pengaruh status merokok dapat dilihat secara bersamaan terhadap kedua indikator kesehatan tersebut.

  1. MANOVA (Multivariate Analysis of Variance)

Uji ini digunakan untuk melihat apakah terdapat perbedaan rata-rata secara simultan pada variabel Cholesterol dan Glucose antar kelompok status merokok tanpa mempertimbangkan faktor usia.

  1. Analisis Pengaruh Smoking_Status terhadap Cholesterol & Glucose
# Membuat model MANOVA
manova_model <- manova(cbind(Cholesterol, Glucose) ~ Smoking_Status, data = df_final)

# Menampilkan hasil utama (multivariate test)
summary(manova_model, test = "Wilks")
##                  Df   Wilks approx F num Df den Df   Pr(>F)    
## Smoking_Status    2 0.98818   8.9231      4   5988 3.51e-07 ***
## Residuals      2995                                            
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
summary(manova_model, test = "Pillai")
##                  Df   Pillai approx F num Df den Df    Pr(>F)    
## Smoking_Status    2 0.011816   8.8995      4   5990 3.669e-07 ***
## Residuals      2995                                              
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
summary(manova_model, test = "Hotelling-Lawley")
##                  Df Hotelling-Lawley approx F num Df den Df    Pr(>F)    
## Smoking_Status    2         0.011957   8.9467      4   5986 3.357e-07 ***
## Residuals      2995                                                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Berdasarkan hasil uji MANOVA, diperoleh nilai signifikansi dari berbagai statistik multivariat sebagai berikut:

Wilks’ Lambda = 0,98818, dengan \(p\)-value = \(3,51 \times 10^{-7}\) Pillai’s Trace = 0,011816, dengan \(p\)-value = \(3,669 \times 10^{-7}\) Hotelling’s Trace = 0,011957, dengan \(p\)-value = \(3,357 \times 10^{-7}\)

Seluruh nilai \(p\)-value berada jauh di bawah batas signifikansi \(0,05\), sehingga dapat disimpulkan bahwa hasil pengujian ini sangat signifikan secara statistik.

Hal ini menunjukkan bahwa secara simultan terdapat perbedaan yang nyata pada kombinasi variabel Cholesterol dan Glucose antar kelompok status merokok. Dengan kata lain, jika kedua indikator kesehatan dianalisis secara bersamaan, maka status merokok tampak memiliki pengaruh terhadap kondisi kesehatan responden.

Namun, nilai Wilks’ Lambda yang mendekati 1 (0,98818) mengindikasikan bahwa meskipun perbedaan tersebut signifikan, besar efeknya relatif kecil. Artinya, kontribusi status merokok dalam menjelaskan variasi data secara keseluruhan masih terbatas.

Temuan ini konsisten dengan hasil analisis univariat (ANOVA) sebelumnya, di mana status merokok menunjukkan pengaruh signifikan sebelum variabel usia dikontrol

  1. MANCOVA (Multivariate Analysis of Covariance)

Bertujuan untuk “menghilangkan” pengaruh usia (Age), sehingga dapat diketahui apakah status merokok benar-benar berpengaruh terhadap kondisi kesehatan secara keseluruhan.

  1. Analisis Pengaruh Smoking_Status terhadap Cholesterol & Glucose dengan kontrol Age
# Membuat model MANCOVA
mancova_model <- manova(cbind(Cholesterol, Glucose) ~ Age + Smoking_Status, data = df_final)

# Menampilkan hasil utama
summary(mancova_model, test = "Wilks")
##                  Df   Wilks approx F num Df den Df Pr(>F)    
## Age               1 0.68818   678.07      2   2993 <2e-16 ***
## Smoking_Status    2 0.99867     1.00      4   5986 0.4073    
## Residuals      2994                                          
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
summary(mancova_model, test = "Pillai")
##                  Df   Pillai approx F num Df den Df Pr(>F)    
## Age               1 0.311817   678.07      2   2993 <2e-16 ***
## Smoking_Status    2 0.001332     1.00      4   5988 0.4073    
## Residuals      2994                                           
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
summary(mancova_model, test = "Hotelling-Lawley")
##                  Df Hotelling-Lawley approx F num Df den Df Pr(>F)    
## Age               1          0.45310   678.07      2   2993 <2e-16 ***
## Smoking_Status    2          0.00133     1.00      4   5984 0.4073    
## Residuals      2994                                                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Pada analisis MANCOVA, variabel usia (Age) dimasukkan sebagai kovariat untuk mengontrol pengaruhnya terhadap variabel dependen. Hasil uji menunjukkan bahwa:

Menunjukkan bahwa usia memiliki pengaruh yang sangat signifikan terhadap kombinasi variabel Cholesterol dan Glucose.

Nilai \(p\)-value berada di atas \(0,05\), sehingga tidak signifikan secara statistik.

Hasil ini menunjukkan bahwa setelah pengaruh usia dikontrol, status merokok tidak lagi memiliki pengaruh yang signifikan terhadap kombinasi variabel dependen. Dengan demikian, perbedaan yang sebelumnya terdeteksi pada analisis MANOVA sebenarnya lebih banyak disebabkan oleh faktor usia, bukan oleh status merokok itu sendiri. Usia dalam hal ini berperan sebagai variabel pengganggu (confounding variable) yang kuat.

  1. Uji Efek antar Subjek

Digunakan untuk melihat variabel dependen mana yang paling dipengaruhi oleh status merokok dalam analisis multivariat.

# Efek antar-subjek dari MANOVA
summary.aov(manova_model)
##  Response Cholesterol :
##                  Df  Sum Sq Mean Sq F value    Pr(>F)    
## Smoking_Status    2   11518  5759.2  9.6851 6.418e-05 ***
## Residuals      2995 1780971   594.6                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
##  Response Glucose :
##                  Df Sum Sq Mean Sq F value    Pr(>F)    
## Smoking_Status    2   7599  3799.4  11.551 1.007e-05 ***
## Residuals      2995 985159   328.9                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Efek antar-subjek dari MANCOVA
summary.aov(mancova_model)
##  Response Cholesterol :
##                  Df  Sum Sq Mean Sq  F value Pr(>F)    
## Age               1  337416  337416 694.7400 <2e-16 ***
## Smoking_Status    2     968     484   0.9964 0.3693    
## Residuals      2994 1454105     486                    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
##  Response Glucose :
##                  Df Sum Sq Mean Sq  F value Pr(>F)    
## Age               1 182017  182017 672.6298 <2e-16 ***
## Smoking_Status    2    549     275   1.0151 0.3625    
## Residuals      2994 810191     271                    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Menunjukkan bahwa secara terpisah, kedua variabel dependen dipengaruhi oleh status merokok.

Hasil uji efek antar-subjek menunjukkan bahwa pada awalnya (tanpa kontrol usia), status merokok berpengaruh signifikan terhadap kedua variabel dependen.

Namun, setelah variabel usia dikontrol, pengaruh tersebut menjadi tidak signifikan. Sebaliknya, usia menunjukkan pengaruh yang sangat kuat terhadap baik Cholesterol maupun Glucose. Hal ini memperkuat bahwa usia merupakan faktor dominan dalam menjelaskan variasi kedua indikator kesehatan tersebut.

  1. Perbandingan Model (MANOVA vs MANCOVA)
# Fungsi ambil p-value Wilks
get_p_multi <- function(model) {
  summary(model, test = "Wilks")$stats[1, "Pr(>F)"]
}

# Tabel perbandingan
tabel_multi <- data.frame(
  Model = c("MANOVA (Tanpa Age)", "MANCOVA (Dengan Age)"),
  P_Value = c(
    get_p_multi(manova_model),
    get_p_multi(mancova_model)
  )
)

print(tabel_multi)
##                  Model       P_Value
## 1   MANOVA (Tanpa Age)  3.509569e-07
## 2 MANCOVA (Dengan Age) 1.331197e-243

Perbandingan kedua model menunjukkan bahwa pada MANOVA, status merokok tampak berpengaruh signifikan terhadap kombinasi variabel dependen. Namun, pada MANCOVA, signifikansi tersebut hilang setelah variabel usia dimasukkan ke dalam model.

Walaupun model MANCOVA tetap signifikan secara keseluruhan, hal ini disebabkan oleh kontribusi variabel usia, bukan oleh status merokok.

Secara keseluruhan, hasil analisis multivariat menunjukkan bahwa status merokok tampak berpengaruh terhadap kondisi kesehatan jika dilihat tanpa kontrol variabel. Namun, setelah usia dikontrol, pengaruh tersebut menjadi tidak signifikan baik secara simultan (MANOVA vs MANCOVA) maupun secara parsial (uji antar-subjek). Hasil ini konsisten dengan analisis univariat sebelumnya, dan menegaskan bahwa usia merupakan faktor utama (confounding variable) yang memengaruhi kadar kolesterol dan gula darah dalam penelitian ini.