penelitian ini dilakukan untuk menganalisis pengaruh faktor-faktor gaya hidup terhadap efisiensi kalori menggunakan beberapa metode analisis statistik, yaitu ANOVA, ANCOVA, MANOVA, dan MANCOVA. Analisis dilakukan secara bertahap untuk memahami hubungan antar variabel baik secara sederhana maupun multivariat. Tahapan penelitian meliputi preprocessing data, eksplorasi data (EDA), seleksi fitur, pengujian asumsi, hingga analisis inferensial.
Dalam penelitian ini, data yang digunakan diolah dan disederhanakan terlebih dahulu agar sesuai dengan kebutuhan analisis. Hal ini dilakukan untuk memastikan proses komputasi lebih efisien serta mempermudah interpretasi hasil tanpa mengurangi representativitas data. Oleh karena itu, hanya sebagian data yang digunakan sebagai sampel penelitian.
Dataset yang digunakan dalam penelitian ini berasal dari platform Kaggle, yaitu “Close to Realistic Calorie Efficiency Dataset” yang dapat diakses melalui tautan berikut: https://www.kaggle.com/datasets/parasharmanu/close-to-realistic-calorie-efficiency-dataset
Dataset ini berisi informasi terkait aktivitas fisik, kondisi tubuh, serta indikator kesehatan individu yang berhubungan dengan efisiensi pembakaran kalori. Variabel yang tersedia mencakup usia, jumlah langkah harian, durasi aktivitas, waktu tidur, tingkat hidrasi, indeks massa tubuh (BMI), hingga detak jantung.
Namun, karena jumlah data pada dataset asli sangat besar, dalam penelitian ini dilakukan pengambilan sampel sebanyak 110 data dari keseluruhan dataset. Pengambilan sampel ini bertujuan untuk:
install.packages("dplyr")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.5'
## (as 'lib' is unspecified)
install.packages("tidyr")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.5'
## (as 'lib' is unspecified)
install.packages("biotools")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.5'
## (as 'lib' is unspecified)
install.packages("rstatix")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.5'
## (as 'lib' is unspecified)
install.packages("knitr")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.5'
## (as 'lib' is unspecified)
install.packages("ggplot2")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.5'
## (as 'lib' is unspecified)
library(dplyr)
##
## 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
library(tidyr)
library(biotools)
## Loading required package: MASS
##
## Attaching package: 'MASS'
## The following object is masked from 'package:dplyr':
##
## select
## ---
## biotools version 4.3
library(rstatix)
##
## Attaching package: 'rstatix'
## The following object is masked from 'package:MASS':
##
## select
## The following object is masked from 'package:stats':
##
## filter
library(knitr)
library(ggplot2)
library(corrplot)
## corrplot 0.95 loaded
data <- read.csv("calorie_efficiency_dataset_kecil (2).csv")
str(data)
## 'data.frame': 110 obs. of 15 variables:
## $ age : int 59 37 45 49 36 33 57 34 63 20 ...
## $ steps_per_day : int 4631 4458 10597 1839 4963 4186 10449 10768 6461 10812 ...
## $ active_minutes : int 26 34 123 40 68 24 97 105 72 129 ...
## $ calories_burned : int 1500 1500 1500 1500 1500 1500 1500 1500 1500 1500 ...
## $ sleep_hours : num 7.63 6.98 7.61 7.13 4.61 5.24 5.68 5.59 7.02 6.51 ...
## $ hydration_liters : num 2.69 2.28 3.62 2.41 1.81 3.35 2.74 1.9 2.04 2.05 ...
## $ bmi : num 27.4 28.8 17.1 30.1 29.5 ...
## $ workouts_per_week : int 1 3 5 6 3 2 4 3 6 3 ...
## $ muscle_mass_ratio : num 0.353 0.538 0.289 0.2 0.317 0.359 0.252 0.426 0.2 0.316 ...
## $ body_fat_percentage : num 0.211 0.189 0.169 0.252 0.395 0.189 0.245 0.254 0.273 0.243 ...
## $ heart_rate_resting : num 69.9 75 58.6 77.8 68.1 71.2 56.1 61.8 66.1 57.2 ...
## $ heart_rate_avg : num 111.9 116.3 91.1 127.4 120.9 ...
## $ continuous_exercise_days: int 4 1 7 1 1 1 1 1 1 1 ...
## $ efficiency_score : num 1.349 1.077 0.868 1.86 0.415 ...
## $ calorie_efficiency : chr "Low Efficiency" "Low Efficiency" "Low Efficiency" "Low Efficiency" ...
head(data)
## age steps_per_day active_minutes calories_burned sleep_hours hydration_liters
## 1 59 4631 26 1500 7.63 2.69
## 2 37 4458 34 1500 6.98 2.28
## 3 45 10597 123 1500 7.61 3.62
## 4 49 1839 40 1500 7.13 2.41
## 5 36 4963 68 1500 4.61 1.81
## 6 33 4186 24 1500 5.24 3.35
## bmi workouts_per_week muscle_mass_ratio body_fat_percentage
## 1 27.36 1 0.353 0.211
## 2 28.78 3 0.538 0.189
## 3 17.10 5 0.289 0.169
## 4 30.15 6 0.200 0.252
## 5 29.53 3 0.317 0.395
## 6 29.13 2 0.359 0.189
## heart_rate_resting heart_rate_avg continuous_exercise_days efficiency_score
## 1 69.9 111.9 4 1.349
## 2 75.0 116.3 1 1.077
## 3 58.6 91.1 7 0.868
## 4 77.8 127.4 1 1.860
## 5 68.1 120.9 1 0.415
## 6 71.2 126.5 1 1.078
## calorie_efficiency
## 1 Low Efficiency
## 2 Low Efficiency
## 3 Low Efficiency
## 4 Low Efficiency
## 5 Low Efficiency
## 6 Low Efficiency
kable(head(data, 6), caption = "Preview Data")
| age | steps_per_day | active_minutes | calories_burned | sleep_hours | hydration_liters | bmi | workouts_per_week | muscle_mass_ratio | body_fat_percentage | heart_rate_resting | heart_rate_avg | continuous_exercise_days | efficiency_score | calorie_efficiency |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 59 | 4631 | 26 | 1500 | 7.63 | 2.69 | 27.36 | 1 | 0.353 | 0.211 | 69.9 | 111.9 | 4 | 1.349 | Low Efficiency |
| 37 | 4458 | 34 | 1500 | 6.98 | 2.28 | 28.78 | 3 | 0.538 | 0.189 | 75.0 | 116.3 | 1 | 1.077 | Low Efficiency |
| 45 | 10597 | 123 | 1500 | 7.61 | 3.62 | 17.10 | 5 | 0.289 | 0.169 | 58.6 | 91.1 | 7 | 0.868 | Low Efficiency |
| 49 | 1839 | 40 | 1500 | 7.13 | 2.41 | 30.15 | 6 | 0.200 | 0.252 | 77.8 | 127.4 | 1 | 1.860 | Low Efficiency |
| 36 | 4963 | 68 | 1500 | 4.61 | 1.81 | 29.53 | 3 | 0.317 | 0.395 | 68.1 | 120.9 | 1 | 0.415 | Low Efficiency |
| 33 | 4186 | 24 | 1500 | 5.24 | 3.35 | 29.13 | 2 | 0.359 | 0.189 | 71.2 | 126.5 | 1 | 1.078 | Low Efficiency |
df_clean <- data %>%
mutate(across(c(sleep_hours, hydration_liters, bmi, muscle_mass_ratio,
body_fat_percentage, heart_rate_resting, heart_rate_avg,
efficiency_score), as.numeric)) %>%
dplyr::select(-calories_burned) %>%
drop_na()
df_clean$calorie_efficiency <- as.factor(df_clean$calorie_efficiency)
df_clean <- df_clean %>%
group_by(calorie_efficiency) %>%
filter(n() >= 3) %>%
ungroup()
print(paste("Jumlah data setelah cleaning:", nrow(df_clean)))
## [1] "Jumlah data setelah cleaning: 108"
Pada tahap preprocessing, dilakukan pembersihan data dengan mengubah beberapa variabel menjadi tipe numerik serta menghapus variabel yang tidak digunakan, yaitu calories_burned. Selanjutnya, data dengan nilai kosong dihapus agar tidak memengaruhi analisis.
Variabel calorie_efficiency dikonversi menjadi faktor karena digunakan sebagai variabel kategorik. Selain itu, data difilter sehingga hanya kategori dengan minimal tiga observasi yang dipertahankan untuk menjaga validitas analisis.
summary(df_clean)
## age steps_per_day active_minutes sleep_hours
## Min. :18.00 Min. : 1000 Min. : 10.00 Min. : 3.330
## 1st Qu.:30.00 1st Qu.: 5294 1st Qu.: 46.00 1st Qu.: 5.643
## Median :37.50 Median : 7237 Median : 70.00 Median : 6.550
## Mean :39.94 Mean : 6930 Mean : 67.99 Mean : 6.440
## 3rd Qu.:52.00 3rd Qu.: 8826 3rd Qu.: 87.00 3rd Qu.: 7.140
## Max. :64.00 Max. :11689 Max. :134.00 Max. :10.000
## hydration_liters bmi workouts_per_week muscle_mass_ratio
## Min. :0.870 Min. :16.00 Min. :0.000 Min. :0.2000
## 1st Qu.:1.990 1st Qu.:21.00 1st Qu.:2.000 1st Qu.:0.3033
## Median :2.510 Median :24.30 Median :3.000 Median :0.3455
## Mean :2.513 Mean :24.57 Mean :2.926 Mean :0.3477
## 3rd Qu.:2.945 3rd Qu.:27.94 3rd Qu.:4.000 3rd Qu.:0.3935
## Max. :4.400 Max. :37.45 Max. :7.000 Max. :0.5380
## body_fat_percentage heart_rate_resting heart_rate_avg
## Min. :0.0500 Min. :51.70 Min. : 80.0
## 1st Qu.:0.1890 1st Qu.:62.08 1st Qu.:100.2
## Median :0.2540 Median :65.15 Median :107.7
## Mean :0.2552 Mean :66.13 Mean :107.9
## 3rd Qu.:0.3095 3rd Qu.:69.72 3rd Qu.:115.6
## Max. :0.4690 Max. :84.40 Max. :137.2
## continuous_exercise_days efficiency_score calorie_efficiency
## Min. :1.000 Min. :0.289 High Efficiency: 0
## 1st Qu.:1.000 1st Qu.:0.541 Low Efficiency :103
## Median :2.000 Median :0.690 Moderate : 5
## Mean :2.463 Mean :0.876
## 3rd Qu.:3.000 3rd Qu.:1.012
## Max. :7.000 Max. :4.564
df_clean %>%
dplyr::select(where(is.numeric)) %>%
tidyr::pivot_longer(cols = everything(),
names_to = "variable",
values_to = "value") %>%
ggplot(aes(x = variable, y = value)) +
geom_boxplot(fill = "skyblue") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
labs(title = "Boxplot Variabel Numerik")
Berdasarkan boxplot, sebagian besar variabel memiliki rentang nilai kecil dan terpusat, sedangkan steps_per_day memiliki rentang jauh lebih besar sehingga mendominasi grafik dan membuat variabel lain tampak kecil.
Selain itu, terlihat adanya outlier pada beberapa variabel seperti active_minutes, continuous_exercise_days, dan heart_rate yang menunjukkan adanya data ekstrem. Secara keseluruhan, perbedaan skala antar variabel cukup besar sehingga diperlukan transformasi atau standarisasi sebelum analisis lanjutan.
ggplot(df_clean, aes(x = calorie_efficiency, y = active_minutes, fill = calorie_efficiency)) +
geom_boxplot() +
theme_minimal() +
labs(title = "Distribusi Menit Aktif berdasarkan Efisiensi Kalori",
x = "Calorie Efficiency", y = "Active Minutes")
Berdasarkan boxplot, distribusi active_minutes pada kategori Low Efficiency cenderung lebih stabil dengan median yang lebih tinggi dibandingkan Moderate. Sementara itu, kategori Moderate memiliki variasi yang lebih besar, terlihat dari rentang data yang lebih lebar. Hal ini menunjukkan bahwa kelompok Moderate memiliki pola aktivitas yang lebih beragam dibandingkan Low Efficiency.
df_num <- df_clean %>%
dplyr::select(where(is.numeric))
corr_matrix <- cor(df_num)
corrplot::corrplot(corr_matrix, tl.col = "black", type = "full", tl.srt = 40, tl.cex = 0.5)
Berdasarkan corrplot, terlihat bahwa beberapa variabel memiliki hubungan yang cukup kuat, baik positif maupun negatif. Variabel steps_per_day dan active_minutes menunjukkan korelasi positif yang kuat, yang berarti semakin banyak langkah per hari, semakin tinggi menit aktivitas. Sebaliknya, terdapat korelasi negatif antara beberapa variabel seperti bmi dengan steps_per_day dan active_minutes, yang menunjukkan bahwa semakin tinggi BMI, aktivitas cenderung lebih rendah.
Selain itu, efficiency_score terlihat memiliki hubungan dengan beberapa variabel seperti heart_rate dan continuous_exercise_days, meskipun tidak semuanya kuat. Secara keseluruhan, sebagian besar variabel memiliki korelasi yang rendah hingga sedang, sehingga menunjukkan tidak adanya multikolinearitas yang tinggi dalam data.
model_fs <- lm(efficiency_score ~ ., data = df_clean)
summary(model_fs)
##
## Call:
## lm(formula = efficiency_score ~ ., data = df_clean)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.13021 -0.16451 -0.03807 0.13325 1.50437
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 3.349e+00 1.201e+00 2.790 0.006385 **
## age 2.143e-03 2.719e-03 0.788 0.432482
## steps_per_day -1.732e-04 4.295e-05 -4.033 0.000112 ***
## active_minutes -5.048e-03 2.482e-03 -2.034 0.044787 *
## sleep_hours 9.803e-02 3.076e-02 3.187 0.001952 **
## hydration_liters 4.660e-02 4.591e-02 1.015 0.312700
## bmi -1.266e-02 1.298e-02 -0.975 0.332169
## workouts_per_week -3.676e-02 2.282e-02 -1.611 0.110474
## muscle_mass_ratio -5.597e-01 5.219e-01 -1.072 0.286343
## body_fat_percentage -2.493e-01 3.716e-01 -0.671 0.503891
## heart_rate_resting -5.165e-03 1.235e-02 -0.418 0.676799
## heart_rate_avg -8.239e-03 3.763e-03 -2.190 0.031015 *
## continuous_exercise_days 3.695e-02 2.249e-02 1.643 0.103724
## calorie_efficiencyModerate 1.137e+00 1.770e-01 6.420 5.51e-09 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.3514 on 94 degrees of freedom
## Multiple R-squared: 0.7372, Adjusted R-squared: 0.7009
## F-statistic: 20.28 on 13 and 94 DF, p-value: < 2.2e-16
df_selected <- df_clean %>%
dplyr::select(
efficiency_score,
calorie_efficiency,
sleep_hours,
hydration_liters,
bmi,
heart_rate_avg,
heart_rate_resting,
muscle_mass_ratio,
continuous_exercise_days,
active_minutes,
steps_per_day
)
Pemodelan regresi digunakan sebagai tahap feature selection untuk mengidentifikasi variabel yang memiliki pengaruh signifikan terhadap efficiency_score. Berdasarkan hasil tersebut, dipilih beberapa variabel yang dianggap relevan untuk digunakan dalam analisis lanjutan.
Selanjutnya, dilakukan pemilihan fitur dengan mengambil 10 variabel utama, yaitu efficiency_score, calorie_efficiency, sleep_hours, hydration_liters, bmi, heart_rate_avg, heart_rate_resting, muscle_mass_ratio, continuous_exercise_days, active_minutes, dan steps_per_day. Pemilihan ini bertujuan untuk menyederhanakan model sekaligus mempertahankan variabel yang paling representatif dalam menjelaskan efisiensi kalori.
Y_vars <- df_selected[, c("active_minutes", "steps_per_day")]
mshapiro_test(as.matrix(Y_vars))
## # A tibble: 1 × 2
## statistic p.value
## <dbl> <dbl>
## 1 0.982 0.162
Hasil uji normalitas menunjukkan nilai p-value sebesar 0,162 (> 0,05), sehingga data dapat dianggap berdistribusi normal.
korelasi <- cor.test(df_selected$active_minutes, df_selected$steps_per_day)
print(korelasi)
##
## Pearson's product-moment correlation
##
## data: df_selected$active_minutes and df_selected$steps_per_day
## t = 17.724, df = 106, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.8077060 0.9056781
## sample estimates:
## cor
## 0.8646966
Hasil uji korelasi Pearson menunjukkan nilai korelasi sebesar 0,8647, yang berarti terdapat hubungan positif yang sangat kuat antara active_minutes dan steps_per_day. Nilai p-value yang sangat kecil (< 0,05) menunjukkan bahwa hubungan tersebut signifikan secara statistik. Selain itu, interval kepercayaan 95% berada pada rentang 0,8077 hingga 0,9057, yang semakin memperkuat bahwa korelasi antara kedua variabel tersebut tinggi dan konsisten.
res_boxm <- boxM(data = Y_vars, group = df_selected$calorie_efficiency)
print(res_boxm)
##
## Box's M-test for Homogeneity of Covariance Matrices
##
## data: Y_vars
## Chi-Sq (approx.) = 6.4277, df = 3, p-value = 0.09256
Hasil uji Box’s M menunjukkan nilai p-value sebesar 0,09256 (> 0,05), sehingga tidak terdapat perbedaan matriks kovarians antar kelompok. Asumsi terpenuhi
manova_model <- manova(
cbind(active_minutes, steps_per_day) ~ calorie_efficiency,
data = df_selected
)
summary(manova_model)
## Df Pillai approx F num Df den Df Pr(>F)
## calorie_efficiency 1 0.036607 1.9949 2 105 0.1411
## Residuals 106
Hasil MANOVA menunjukkan bahwa variabel calorie_efficiency tidak memiliki pengaruh yang signifikan terhadap variabel dependen secara simultan, dengan nilai p-value sebesar 0,1411 (> 0,05). Hal ini berarti tidak terdapat perbedaan yang signifikan antar kelompok calorie_efficiency terhadap kombinasi variabel dependen.
mancova_model <- manova(
cbind(active_minutes, steps_per_day) ~ calorie_efficiency + bmi,
data = df_selected
)
summary(mancova_model)
## Df Pillai approx F num Df den Df Pr(>F)
## calorie_efficiency 1 0.08826 5.034 2 104 0.008188 **
## bmi 1 0.71443 130.094 2 104 < 2.2e-16 ***
## Residuals 105
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Hasil MANCOVA menunjukkan bahwa variabel calorie_efficiency dan bmi berpengaruh signifikan terhadap variabel dependen secara simultan, dengan p-value masing-masing 0,008 (< 0,05) dan < 2,2e-16. Hal ini berarti terdapat perbedaan yang signifikan antar kategori calorie_efficiency setelah mengontrol variabel bmi. Selain itu, bmi memiliki pengaruh yang sangat kuat terhadap variabel dependen dalam model.
summary.aov(manova_model)
## Response active_minutes :
## Df Sum Sq Mean Sq F value Pr(>F)
## calorie_efficiency 1 462 462.33 0.5672 0.453
## Residuals 106 86403 815.12
##
## Response steps_per_day :
## Df Sum Sq Mean Sq F value Pr(>F)
## calorie_efficiency 1 14732561 14732561 2.5045 0.1165
## Residuals 106 623537161 5882426
Hasil ANOVA menunjukkan bahwa variabel calorie_efficiency tidak berpengaruh signifikan terhadap active_minutes maupun steps_per_day. Hal ini terlihat dari nilai p-value masing-masing sebesar 0,453 dan 0,1165 yang lebih besar dari 0,05. Dengan demikian, tidak terdapat perbedaan yang signifikan rata-rata active_minutes dan steps_per_day antar kategori calorie_efficiency.
ancova_model <- aov(
efficiency_score ~ calorie_efficiency + sleep_hours + bmi,
data = df_selected
)
summary(ancova_model)
## Df Sum Sq Mean Sq F value Pr(>F)
## calorie_efficiency 1 8.598 8.598 43.47 1.83e-09 ***
## sleep_hours 1 2.324 2.324 11.75 0.000872 ***
## bmi 1 12.665 12.665 64.03 1.82e-12 ***
## Residuals 104 20.572 0.198
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Hasil ANCOVA menunjukkan bahwa variabel calorie_efficiency, sleep_hours, dan bmi berpengaruh signifikan terhadap efficiency_score (p-value < 0,05). Variabel bmi memiliki pengaruh paling kuat, diikuti oleh calorie_efficiency dan sleep_hours. Hal ini berarti terdapat perbedaan yang signifikan antar kategori calorie_efficiency setelah mengontrol variabel sleep_hours dan bmi.