Pendahuluan

Studi ini menggunakan Health and Lifestyle Data for Regression dataset, yang dapat diakses secara publik melalui Kaggle di sini: Health and Lifestyle Data for Regression. Data set ini adalah data sintetis yang dirancang untuk digunakan dalam analisis regresi dan statistika multivariat. Dataset terdiri dari 10.000 observasi yang mencakup sepuluh variabel perilaku gaya hidup, seperti frekuensi olahraga, status merokok, kualitas tidur, dan indikator kesehatan, seperti indeks massa tubuh, tekanan darah, diet, dan skor kesehatan. Fokus dari studi kasus ini adalah hubungan antara perilaku olahraga dan hasil kesehatan pada populasi umum.

1. Import Data dan Eksplorasi

library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.5.3
data <- read.csv("synthetic_health_data.csv")
head(data)
##        Age      BMI Exercise_Frequency Diet_Quality Sleep_Hours Smoking_Status
## 1 45.96057 31.99678                  5     55.40327    7.300359              0
## 2 38.34083 29.62317                  6     41.83836    7.012419              1
## 3 47.77226 25.29815                  5     76.90495    6.028641              1
## 4 58.27636 21.76532                  2     49.75677    5.802714              1
## 5 37.19016 28.49112                  2     44.21874    7.912548              0
## 6 37.19036 26.96743                  2     89.12484    7.786489              1
##   Alcohol_Consumption Health_Score
## 1            2.834707     70.54212
## 2            7.199517     57.24464
## 3            4.097944     96.33372
## 4            3.649377     61.32178
## 5            2.839795     67.17589
## 6            1.593758    100.00000
str(data)
## 'data.frame':    1000 obs. of  8 variables:
##  $ Age                : num  46 38.3 47.8 58.3 37.2 ...
##  $ BMI                : num  32 29.6 25.3 21.8 28.5 ...
##  $ Exercise_Frequency : int  5 6 5 2 2 2 5 3 4 4 ...
##  $ Diet_Quality       : num  55.4 41.8 76.9 49.8 44.2 ...
##  $ Sleep_Hours        : num  7.3 7.01 6.03 5.8 7.91 ...
##  $ Smoking_Status     : int  0 1 1 1 0 1 0 0 1 0 ...
##  $ Alcohol_Consumption: num  2.83 7.2 4.1 3.65 2.84 ...
##  $ Health_Score       : num  70.5 57.2 96.3 61.3 67.2 ...
summary(data)
##       Age              BMI        Exercise_Frequency  Diet_Quality   
##  Min.   : 1.105   Min.   :10.30   Min.   :0.000      Min.   : 19.91  
##  1st Qu.:32.229   1st Qu.:21.97   1st Qu.:1.000      1st Qu.: 59.95  
##  Median :40.304   Median :25.32   Median :3.000      Median : 69.98  
##  Mean   :40.232   Mean   :25.35   Mean   :2.888      Mean   : 69.95  
##  3rd Qu.:47.775   3rd Qu.:28.64   3rd Qu.:5.000      3rd Qu.: 80.53  
##  Max.   :86.233   Max.   :40.97   Max.   :6.000      Max.   :110.27  
##   Sleep_Hours     Smoking_Status  Alcohol_Consumption  Health_Score   
##  Min.   : 2.431   Min.   :0.000   Min.   :-3.593      Min.   : 29.11  
##  1st Qu.: 5.903   1st Qu.:0.000   1st Qu.: 1.644      1st Qu.: 76.43  
##  Median : 6.991   Median :0.000   Median : 3.064      Median : 87.50  
##  Mean   : 6.973   Mean   :0.499   Mean   : 3.079      Mean   : 85.48  
##  3rd Qu.: 8.055   3rd Qu.:1.000   3rd Qu.: 4.489      3rd Qu.: 99.76  
##  Max.   :11.639   Max.   :1.000   Max.   :11.105      Max.   :100.00

Berdasarkan hasil eksplorasi, dataset terdiri dari 1000 observasi dan 8 variabel.

Rata-rata usia responden adalah 40.23 tahun, dengan nilai minimum sekitar 1.10 dan maksimum 86.23. Rata-rata BMI sebesar 25.35 yang menunjukkan kondisi rata-rata berada pada kategori normal hingga overweight.

Frekuensi olahraga memiliki rata-rata 2.88 kali per minggu, dengan rentang antara 0 hingga 6 kali. Sementara itu, rata-rata Diet Quality sebesar 69.95 dan Health Score sebesar 85.48, yang menunjukkan bahwa secara umum responden memiliki kualitas diet dan kesehatan yang cukup baik.

2. Visulisasi Distribusi

hist(data$Health_Score,
     main = "Distribution of Health Score",
     xlab = "Health Score",
     col = "lightblue",
     border = "black")

hist(data$Diet_Quality,
     main = "Distribution of Diet Quality",
     xlab = "Diet Quality",
     col = "pink",
     border = "black")

Interpretasi :

3. Transformasi Data

data$Exercise_Frequency <- as.factor(data$Exercise_Frequency)
data$Smoking_Status <- as.factor(data$Smoking_Status)
data$Smoking_Status <- factor(data$Smoking_Status,
                              levels = c(0, 1),
                              labels = c("Non-smoker", "Smoker"))

Note :

Variabel kategori diubah menjadi faktor agar dapat digunakan dalam analisis statistik seperti ANOVA dan MANOVA.

4. Uji Anova

anova_exercise <- aov(Health_Score ~ Exercise_Frequency, data = data)
summary(anova_exercise)
##                     Df Sum Sq Mean Sq F value   Pr(>F)    
## Exercise_Frequency   6  11262  1876.9   10.69 1.57e-11 ***
## Residuals          993 174434   175.7                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Interpretasi :

Hasil uji ANOVA menunjukkan bahwa variabel Exercise_Frequency berpengaruh signifikan terhadap Health Score dengan nilai F sebesar 10.69 dan p-value sebesar 1.57e-11 (< 0.001).
Hal ini berarti terdapat perbedaan rata-rata Health Score yang signifikan antar kelompok frekuensi olahraga.

5. Uji Normalitas

shapiro.test(residuals(anova_exercise))
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(anova_exercise)
## W = 0.94351, p-value < 2.2e-16

Note :

Hasil uji Shapiro-Wilk menghasilkan p-value < 2.2e-16, yang berarti residual tidak berdistribusi normal.


Namun, karena jumlah sampel cukup besar (n = 1000), pelanggaran asumsi normalitas ini masih dapat ditoleransi dalam analisis ANOVA.

6. Boxplot

boxplot(Health_Score ~ Exercise_Frequency,
        data = data,
        main = "Health Score by Exercise Frequency",
        xlab = "Exercise Frequency (days/week)",
        ylab = "Health Score")

Interpretasi :

Boxplot menunjukkan adanya variasi Health Score pada setiap kategori Exercise_Frequency.

Secara umum terlihat bahwa kelompok dengan frekuensi olahraga lebih tinggi cenderung memiliki nilai Health Score yang lebih tinggi, meskipun terdapat beberapa variasi dan outlier.

data$Exercise_Frequency <- as.factor(data$Exercise_Frequency)
data$Smoking_Status <- factor(data$Smoking_Status,
                              levels = c(0,1),
                              labels = c("Non-smoker", "Smoker"))

Note :

Transformasi ulang dilakukan untuk memastikan tipe data sudah sesuai sebelum dilakukan analisis lanjutan.

7. Manova

data$Exercise_Frequency <- as.factor(data$Exercise_Frequency)
model_manova <- manova(cbind(Diet_Quality, Health_Score) ~ Exercise_Frequency, data = data)
summary(model_manova, test = "Pillai")
##                     Df  Pillai approx F num Df den Df    Pr(>F)    
## Exercise_Frequency   6 0.13738   12.206     12   1986 < 2.2e-16 ***
## Residuals          993                                             
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
summary.aov(model_manova)
##  Response Diet_Quality :
##                     Df Sum Sq Mean Sq F value Pr(>F)
## Exercise_Frequency   6   1243  207.20  0.9239 0.4767
## Residuals          993 222695  224.26               
## 
##  Response Health_Score :
##                     Df Sum Sq Mean Sq F value   Pr(>F)    
## Exercise_Frequency   6  11262 1876.94  10.685 1.57e-11 ***
## Residuals          993 174434  175.66                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Interpretasi :

Hasil uji MANOVA menggunakan statistik Pillai menunjukkan nilai p-value < 2.2e-16, yang berarti Exercise_Frequency berpengaruh signifikan secara simultan terhadap Diet_Quality dan Health_Score.

Namun, berdasarkan uji lanjutan (ANOVA), diketahui bahwa:

Sehingga dapat disimpulkan bahwa pengaruh utama terdapat pada Health_Score.

8. Mancova

model_mancova <- manova(
  cbind(Diet_Quality, Health_Score) ~ Exercise_Frequency + Age,
  data = data
)

summary(model_mancova, test = "Pillai")
##                     Df   Pillai approx F num Df den Df    Pr(>F)    
## Exercise_Frequency   6 0.145571   12.978     12   1984 < 2.2e-16 ***
## Age                  1 0.068448   36.408      2    991 5.523e-16 ***
## Residuals          992                                              
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
summary.aov(model_mancova)
##  Response Diet_Quality :
##                     Df Sum Sq Mean Sq F value Pr(>F)
## Exercise_Frequency   6   1243 207.200  0.9233 0.4772
## Age                  1     67  67.406  0.3004 0.5838
## Residuals          992 222628 224.423               
## 
##  Response Health_Score :
##                     Df Sum Sq Mean Sq F value    Pr(>F)    
## Exercise_Frequency   6  11262  1876.9  11.101 5.215e-12 ***
## Age                  1   6714  6713.6  39.708 4.428e-10 ***
## Residuals          992 167721   169.1                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Interpretasi :

Hasil uji MANCOVA menunjukkan bahwa:

Namun, hasil uji univariat menunjukkan bahwa:

Hal ini menunjukkan bahwa faktor usia dan frekuensi olahraga lebih berpengaruh terhadap kesehatan dibandingkan kualitas diet.

9. Uji Asumsi (Visual)

anova_exercise <- aov(Health_Score ~ Exercise_Frequency, data = data)
par(mfrow = c(1,2))
hist(residuals(anova_exercise), main = "Histogram Residual ANOVA", xlab = "Residual")
qqnorm(residuals(anova_exercise))
qqline(residuals(anova_exercise), col = "red")

Interpretasi :

Histogram residual menunjukkan bahwa distribusi tidak sepenuhnya simetris dan masih terdapat sedikit kemencengan (skewness), sehingga tidak sepenuhnya mengikuti distribusi normal.

Pada Q-Q plot, terlihat bahwa beberapa titik menyimpang dari garis diagonal, terutama pada bagian ekor (tail). Hal ini menunjukkan adanya deviasi dari asumsi normalitas.
Temuan ini juga diperkuat oleh hasil uji Shapiro-Wilk yang menghasilkan p-value < 2.2e-16, sehingga secara statistik residual tidak berdistribusi normal.

Meskipun demikian, karena jumlah sampel cukup besar (n = 1000), pelanggaran asumsi normalitas ini masih dapat ditoleransi, sehingga hasil ANOVA tetap dapat digunakan sebagai pendekatan yang cukup robust.

10. Visualisasi Q-Q plot

# Q-Q plot untuk variabel Diet_Quality
qqnorm(residuals(lm(Diet_Quality ~ Exercise_Frequency, data = data)))
qqline(residuals(lm(Diet_Quality ~ Exercise_Frequency, data = data)), col = "red")
title(main = "Q-Q Diet_Quality")

# Q-Q plot untuk variabel Health_Score
qqnorm(residuals(lm(Health_Score ~ Exercise_Frequency, data = data)))
qqline(residuals(lm(Health_Score ~ Exercise_Frequency, data = data)), col = "red")
title(main = "Q-Q Health_Score")

Interpretasi :

Pada Q-Q plot untuk variabel Diet_Quality, terlihat bahwa sebagian besar titik mengikuti garis diagonal di bagian tengah, namun terdapat penyimpangan pada bagian ujung distribusi (tail). Hal ini menunjukkan bahwa distribusi residual mendekati normal, tetapi tidak sepenuhnya memenuhi asumsi normalitas. Sementara itu, pada Q-Q plot Health_Score, pola yang terbentuk juga menunjukkan kecenderungan yang serupa, di mana titik-titik cukup mengikuti garis diagonal, namun terdapat deviasi pada beberapa titik, khususnya di bagian ekstrem. Secara keseluruhan, kedua Q-Q plot menunjukkan bahwa asumsi normalitas tidak sepenuhnya terpenuhi, namun penyimpangan yang terjadi tidak terlalu ekstrem. Dengan jumlah sampel yang besar (n = 1000), kondisi ini masih dapat ditoleransi.

11. Scatterplot

# Scatterplot Age vs Diet_Quality
ggplot(data, aes(x = Age, y = Diet_Quality, color = Exercise_Frequency)) +
  geom_point(alpha = 0.5) +
  geom_smooth(method = "lm", se = FALSE, color = "red") +
  labs(title = "Age vs Diet_Quality")
## `geom_smooth()` using formula = 'y ~ x'

# Scatterplot Age vs Health_Score
ggplot(data, aes(x = Age, y = Health_Score, color = Exercise_Frequency)) +
  geom_point(alpha = 0.5) +
  geom_smooth(method = "lm", se = FALSE, color = "red") +
  labs(title = "Age vs Health_Score")
## `geom_smooth()` using formula = 'y ~ x'

Interpretasi :

Scatterplot antara Age dan Diet_Quality menunjukkan bahwa titik data tersebar secara acak tanpa pola yang jelas. Garis regresi yang terbentuk cenderung datar, sehingga menunjukkan bahwa tidak terdapat hubungan linear yang kuat antara usia dan kualitas diet.

Selain itu, warna berdasarkan Exercise_Frequency tidak menunjukkan pemisahan pola yang signifikan, yang berarti perbedaan frekuensi olahraga tidak secara jelas memengaruhi hubungan antara usia dan kualitas diet.

Pada scatterplot antara Age dan Health_Score, terlihat pola yang sedikit lebih terarah dibandingkan dengan Diet_Quality. Garis regresi menunjukkan kecenderungan hubungan, meskipun tidak terlalu kuat. Namun, sebaran data masih cukup luas dan tidak membentuk pola linear yang kuat, sehingga dapat disimpulkan bahwa pengaruh usia terhadap Health_Score cenderung lemah.

12. Uji Interkasi (Homogenitas Slope)

model_interaction <- lm(Diet_Quality ~ Exercise_Frequency * Age, data = data)
summary(model_interaction)
## 
## Call:
## lm(formula = Diet_Quality ~ Exercise_Frequency * Age, data = data)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -48.582 -10.148   0.364  10.318  41.217 
## 
## Coefficients:
##                         Estimate Std. Error t value Pr(>|t|)    
## (Intercept)             72.14531    4.34485  16.605   <2e-16 ***
## Exercise_Frequency1     -1.60726    6.15517  -0.261    0.794    
## Exercise_Frequency2      1.11961    6.26028   0.179    0.858    
## Exercise_Frequency3      0.01796    5.99641   0.003    0.998    
## Exercise_Frequency4      3.35390    6.39466   0.524    0.600    
## Exercise_Frequency5     -3.81053    6.57698  -0.579    0.562    
## Exercise_Frequency6     -8.96334    6.33303  -1.415    0.157    
## Age                     -0.02646    0.10215  -0.259    0.796    
## Exercise_Frequency1:Age -0.01568    0.14840  -0.106    0.916    
## Exercise_Frequency2:Age -0.06815    0.14822  -0.460    0.646    
## Exercise_Frequency3:Age -0.01958    0.14099  -0.139    0.890    
## Exercise_Frequency4:Age -0.06550    0.15216  -0.430    0.667    
## Exercise_Frequency5:Age  0.05389    0.15814   0.341    0.733    
## Exercise_Frequency6:Age  0.15260    0.14769   1.033    0.302    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 15 on 986 degrees of freedom
## Multiple R-squared:  0.008905,   Adjusted R-squared:  -0.004163 
## F-statistic: 0.6814 on 13 and 986 DF,  p-value: 0.7828

Note :

Hasil uji interaksi antara Exercise_Frequency dan Age terhadap Diet_Quality menunjukkan bahwa tidak terdapat interaksi yang signifikan, dengan p-value sebesar 0.7828 (> 0.05).

Hal ini menunjukkan bahwa pengaruh usia terhadap kualitas diet tidak bergantung pada tingkat frekuensi olahraga. Dengan kata lain, perubahan usia memiliki pola pengaruh yang relatif sama pada setiap kelompok Exercise_Frequency.

Selain itu, nilai R-squared sebesar 0.0089 menunjukkan bahwa model hanya mampu menjelaskan kurang dari 1% variasi pada Diet_Quality. Hal ini mengindikasikan bahwa variabel Age dan Exercise_Frequency, baik secara individu maupun interaksi, memiliki kontribusi yang sangat kecil terhadap perubahan kualitas diet.

Dengan demikian, asumsi homogenitas slope dalam analisis MANCOVA dapat dianggap terpenuhi.

Visualisasi Interaksi

ggplot(data, aes(x = Age, y = Diet_Quality, color = Exercise_Frequency)) +
  geom_point(alpha = 0.5) +
  geom_smooth(method = "lm", se = FALSE) +
  labs(title = "Interaction Plot: Age vs Diet_Quality by Exercise_Frequency")
## `geom_smooth()` using formula = 'y ~ x'

Interpretasi :

Visualisasi interaksi antara Age dan Diet_Quality berdasarkan Exercise_Frequency menunjukkan bahwa garis regresi untuk setiap kelompok cenderung sejajar dan tidak saling berpotongan secara signifikan.

Hal ini mengindikasikan bahwa tidak terdapat interaksi antara variabel Age dan Exercise_Frequency terhadap Diet_Quality. Dengan kata lain, pengaruh usia terhadap kualitas diet relatif konsisten pada setiap tingkat frekuensi olahraga.

Selain itu, kemiringan (slope) garis regresi pada masing-masing kelompok terlihat hampir sama, yang menunjukkan bahwa perubahan Diet_Quality terhadap Age tidak berbeda secara berarti antar kelompok Exercise_Frequency.

Ini sejalan dengan hasil uji interaksi sebelumnya yang menunjukkan bahwa tidak terdapat interaksi yang signifikan (p-value > 0.05).