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.
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.
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 :
Histogram Health Score menunjukkan bahwa sebagian besar nilai berada pada rentang tinggi (di atas 70), yang menandakan mayoritas responden memiliki tingkat kesehatan yang baik.
Histogram Diet Quality memperlihatkan distribusi yang relatif simetris dengan pusat di sekitar nilai 70, sehingga dapat dikatakan distribusi mendekati normal.
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.
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.
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.
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.
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:
Diet_Quality tidak berpengaruh signifikan (p = 0.4767)
Health_Score berpengaruh signifikan (p = 1.57e-11)
Sehingga dapat disimpulkan bahwa pengaruh utama terdapat pada Health_Score.
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:
Exercise_Frequency berpengaruh signifikan (p < 2.2e-16)
Age juga berpengaruh signifikan (p = 5.523e-16)
Namun, hasil uji univariat menunjukkan bahwa:
Diet_Quality tidak dipengaruhi secara signifikan oleh Exercise_Frequency maupun Age
Health_Score dipengaruhi secara signifikan oleh Exercise_Frequency (p = 5.215e-12) dan Age (p = 4.428e-10)
Hal ini menunjukkan bahwa faktor usia dan frekuensi olahraga lebih berpengaruh terhadap kesehatan dibandingkan kualitas diet.
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.
# 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.
# 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.
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.
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).