Dataset ini memberikan profil kesehatan individu di Indonesia secara rinci, dengan fokus pada prediksi serangan jantung. Data ini mencakup faktor demografi, klinis, gaya hidup, dan lingkungan yang terkait dengan risiko kardiovaskular. Dataset ini mencerminkan tren kesehatan dunia nyata di Indonesia, dengan mempertimbangkan faktor-faktor seperti hipertensi, diabetes, obesitas, merokok, dan paparan polusi.
Serangan jantung merupakan salah satu penyebab utama kematian di dunia. Faktor resiko seperti usia dan gender memainkan peran penting dalam menentukan kemungkinan seseorang mengalami serangan jantung.
Analisis usia dan gender dalam data prediksi serangan jantung di indonesia diperlukan karena:
Usia kemungkinan merupakan faktor utama, jika seseorangan semakin tua, semakin tinggi pula risikonya terkena penyakit kardiovaskular
Gender juga kemungkinan memiliki pengaruh, beberapa penelitian mengatakan bahwa pria memiliki risiko lebih tinggi terkena serangan jantung dibandingkan dengan wanita.
sumber data: https://www.kaggle.com/datasets/ankushpanday2/heart-attack-prediction-in-indonesia
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(ggplot2)
data <- read.csv("/cloud/project/heart_attack_prediction_indonesia.csv")
summary(data)
## age gender region income_level
## Min. :25.00 Length:158355 Length:158355 Length:158355
## 1st Qu.:46.00 Class :character Class :character Class :character
## Median :55.00 Mode :character Mode :character Mode :character
## Mean :54.54
## 3rd Qu.:63.00
## Max. :90.00
## hypertension diabetes cholesterol_level obesity
## Min. :0.0000 Min. :0.0000 Min. :100.0 Min. :0.0000
## 1st Qu.:0.0000 1st Qu.:0.0000 1st Qu.:172.0 1st Qu.:0.0000
## Median :0.0000 Median :0.0000 Median :199.0 Median :0.0000
## Mean :0.2991 Mean :0.1998 Mean :199.5 Mean :0.2499
## 3rd Qu.:1.0000 3rd Qu.:0.0000 3rd Qu.:226.0 3rd Qu.:0.0000
## Max. :1.0000 Max. :1.0000 Max. :350.0 Max. :1.0000
## waist_circumference family_history smoking_status alcohol_consumption
## Min. : 20.00 Min. :0.0000 Length:158355 Length:158355
## 1st Qu.: 82.00 1st Qu.:0.0000 Class :character Class :character
## Median : 93.00 Median :0.0000 Mode :character Mode :character
## Mean : 93.27 Mean :0.3002
## 3rd Qu.:104.00 3rd Qu.:1.0000
## Max. :173.00 Max. :1.0000
## physical_activity dietary_habits air_pollution_exposure
## Length:158355 Length:158355 Length:158355
## Class :character Class :character Class :character
## Mode :character Mode :character Mode :character
##
##
##
## stress_level sleep_hours blood_pressure_systolic
## Length:158355 Min. :3.000 Min. : 61.0
## Class :character 1st Qu.:5.493 1st Qu.:119.0
## Mode :character Median :6.507 Median :130.0
## Mean :6.480 Mean :129.5
## 3rd Qu.:7.521 3rd Qu.:140.0
## Max. :9.000 Max. :199.0
## blood_pressure_diastolic fasting_blood_sugar cholesterol_hdl cholesterol_ldl
## Min. : 37.00 Min. : 70.0 Min. : 8.00 Min. :-19.0
## 1st Qu.: 73.00 1st Qu.: 89.0 1st Qu.:43.00 1st Qu.:106.0
## Median : 80.00 Median :109.0 Median :49.00 Median :130.0
## Mean : 79.49 Mean :110.7 Mean :49.49 Mean :129.6
## 3rd Qu.: 86.00 3rd Qu.:130.0 3rd Qu.:56.00 3rd Qu.:153.0
## Max. :127.00 Max. :230.0 Max. :93.00 Max. :282.0
## triglycerides EKG_results previous_heart_disease medication_usage
## Min. : 50.0 Length:158355 Min. :0.0000 Min. :0.0000
## 1st Qu.:116.0 Class :character 1st Qu.:0.0000 1st Qu.:0.0000
## Median :149.0 Mode :character Median :0.0000 Median :0.0000
## Mean :149.7 Mean :0.2006 Mean :0.4998
## 3rd Qu.:183.0 3rd Qu.:0.0000 3rd Qu.:1.0000
## Max. :380.0 Max. :1.0000 Max. :1.0000
## participated_in_free_screening heart_attack
## Min. :0.000 Min. :0.000
## 1st Qu.:0.000 1st Qu.:0.000
## Median :1.000 Median :0.000
## Mean :0.601 Mean :0.401
## 3rd Qu.:1.000 3rd Qu.:1.000
## Max. :1.000 Max. :1.000
str(data)
## 'data.frame': 158355 obs. of 28 variables:
## $ age : int 60 53 62 73 52 52 73 64 49 61 ...
## $ gender : chr "Male" "Female" "Female" "Male" ...
## $ region : chr "Rural" "Urban" "Urban" "Urban" ...
## $ income_level : chr "Middle" "Low" "Low" "Low" ...
## $ hypertension : int 0 0 0 1 1 0 0 0 0 0 ...
## $ diabetes : int 1 0 0 0 0 0 0 1 0 0 ...
## $ cholesterol_level : int 211 208 231 202 232 231 238 165 186 121 ...
## $ obesity : int 0 0 1 0 0 1 1 0 0 1 ...
## $ waist_circumference : int 83 106 112 82 89 81 91 72 115 88 ...
## $ family_history : int 0 1 1 1 0 1 0 1 0 1 ...
## $ smoking_status : chr "Never" "Past" "Past" "Never" ...
## $ alcohol_consumption : chr "None" "None" "Moderate" "Moderate" ...
## $ physical_activity : chr "High" "Moderate" "Moderate" "Moderate" ...
## $ dietary_habits : chr "Unhealthy" "Healthy" "Healthy" "Unhealthy" ...
## $ air_pollution_exposure : chr "Moderate" "High" "Low" "Low" ...
## $ stress_level : chr "Moderate" "High" "Low" "High" ...
## $ sleep_hours : num 5.97 5.64 6.34 7.91 3.25 ...
## $ blood_pressure_systolic : int 113 132 116 136 127 131 128 109 150 142 ...
## $ blood_pressure_diastolic : int 62 76 74 65 75 71 97 83 87 87 ...
## $ fasting_blood_sugar : int 173 70 118 98 104 129 88 112 147 79 ...
## $ cholesterol_hdl : int 48 58 69 52 59 34 40 47 46 34 ...
## $ cholesterol_ldl : int 121 83 130 85 127 148 128 100 157 93 ...
## $ triglycerides : int 101 138 171 146 139 191 167 50 198 164 ...
## $ EKG_results : chr "Normal" "Normal" "Abnormal" "Normal" ...
## $ previous_heart_disease : int 0 1 0 0 1 0 0 0 0 0 ...
## $ medication_usage : int 0 0 1 1 0 1 1 0 1 0 ...
## $ participated_in_free_screening: int 0 1 0 1 1 1 1 1 0 0 ...
## $ heart_attack : int 0 0 1 0 1 0 0 1 0 1 ...
A/B testing adalah metode yang digunakan untuk membandingkan dua kelompok dalam kasus ini metode A/B testing digunakan untuk mengetahui apakah ada perbedaan rata-rata usia antara dua kelompok berdasarkan gender.
Wilcoxon Test merupakan salah satu uji non-parametrik yang digunakan untuk membandingkan dua kelompok independen, karena ukuran sampelnya kecil (<30) dan distribusi normal sulit dipastikan itu sebabnya metode uji non-parametrik ini digunakan.
data_A <- filter(data, gender == "Male" & age >= 50)
data_B <- filter(data, gender == "Female" & age >= 50)
summary(data_A$age)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 50.00 55.00 60.00 61.15 66.00 90.00
summary(data_B$age)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 50.00 55.00 60.00 61.13 66.00 90.00
data_A_clean <- na.omit(data_A$age)
data_B_clean <- na.omit(data_B$age)
data_A_clean <- as.numeric(unlist(data_A_clean))
data_B_clean <- as.numeric(unlist(data_B_clean))
print(class(data_A_clean))
## [1] "numeric"
print(class(data_B_clean))
## [1] "numeric"
n_A <- length(data_A)
n_B <- length(data_B)
n_A
## [1] 28
n_B
## [1] 28
if (n_A > 30 & n_B > 30) {
test_result <- t.test(data_A_clean, data_B_clean, var.equal = TRUE)
} else {
test_result <- wilcox.test(data_A_clean, data_B_clean)
}
test_result
##
## Wilcoxon rank sum test with continuity correction
##
## data: data_A_clean and data_B_clean
## W = 1373265422, p-value = 0.9752
## alternative hypothesis: true location shift is not equal to 0
Karena p-value bernilai 0.9752 yang dimana p-value > 0.05 sehingga hipotesis H₀ diterima yang berarti tidak ada perbedaan signifikan dalam data pria dengan usia >= 50 yang mengalami serangan jantung dan data wanita dengan usia >= 50 yang mengalami serangan jantung.
Uji hipotesis merupakan metode statistik untuk menguji suatu asumsi tentang suatu populasi berdasarkan data sampel, uji hipotesis memiliki tujuan untuk mengetahui apakah usia rata-rata penderita serangan jantung berbeda antara wanita dan pria.
Hipotesis: H₀: Tidak ada perbedaan signifikan antara data penderita serangan jantung wanita dengan usia >= 50 dan penderita serangan jantung pria dengan usia >= 50
H₁: Ada perbedaan signifikan antara data penderita serangan jantung wanita dengan usia >= 50 dan penderita serangan jantung pria dengan usia >= 50
alpha <- 0.05
if (n_A > 30 & n_B > 30) {
test_result <- t.test(data_A_clean, data_B_clean, var.equal = TRUE)
test_type <- "T-Test"
} else {
test_result <- wilcox.test(data_A_clean, data_B_clean)
test_type <- "Wilcoxon Rank-Sum Test"
}
test_result
##
## Wilcoxon rank sum test with continuity correction
##
## data: data_A_clean and data_B_clean
## W = 1373265422, p-value = 0.9752
## alternative hypothesis: true location shift is not equal to 0
if (test_result$p.value < alpha) {
conclusion <- paste("Hasil", test_type, ": p-value =", round(test_result$p.value, 4),
"\nKarena p-value < alpha (0.05), TOLAK Hipotesis Nol.",
"\nAda perbedaan signifikan antara data penderita serangan jantung wanita dengan usia >= 50 dan penderita serangan jantung pria dengan usia >= 50
")
} else {
conclusion <- paste("Hasil", test_type, ": p-value =", round(test_result$p.value, 4),
"\nKarena p-value >= alpha (0.05), TERIMA Hipotesis Nol.",
"\nTidak ada perbedaan signifikan antara data penderita serangan jantung wanita dengan usia >= 50 dan penderita serangan jantung pria dengan usia >= 50
")
}
cat(conclusion)
## Hasil Wilcoxon Rank-Sum Test : p-value = 0.9752
## Karena p-value >= alpha (0.05), TERIMA Hipotesis Nol.
## Tidak ada perbedaan signifikan antara data penderita serangan jantung wanita dengan usia >= 50 dan penderita serangan jantung pria dengan usia >= 50
Karena P-value 0.9752 > 0.05 maka tidak memiliki cukup bukti bahwa ada perbedaan yang signifikan antara data penderita serangan jantung wanita dengan usia >= 50 dan penderita serangan jantung pria dengan usia >= 50, sehingga hipotesis H₀ diterima.
Resampling adalah teknik yang digunakan untuk menggunakan kembali data yang ada untuk memperkirakan karakteristik dari suatu populasi. Resampling dilakukan bertujuan untuk memriksa apakah ada perbedaan nyata antara dua kelompok berdasarkan estimasi distribusi perbedaan mean dan mengatasi keterbatasan jumlah sampel.
set.seed(123)
B <- 5000
mean_diff <- numeric(B)
for (i in 1:B) {
sample_A <- sample(data_A_clean, replace = TRUE)
sample_B <- sample(data_B_clean, replace = TRUE)
mean_diff[i] <- mean(sample_A) - mean(sample_B)
}
summary(mean_diff)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## -0.135016 -0.006221 0.027023 0.027587 0.060854 0.218358
ggplot(data.frame(mean_diff), aes(x = mean_diff)) +
geom_histogram(binwidth = 0.01, fill = "blue", alpha = 0.7, color = "black") +
geom_vline(xintercept = mean(mean_diff), color = "red", linetype = "dashed", size = 1) +
theme_minimal() +
labs(title = "Distribusi Bootstrapping Perbedaan Mean",
x = "Perbedaan Rata-rata (Grup A - Grup B)",
y = "Frekuensi")
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
catatan: Grup A: Penderita serangan jantung wanita dengan usia >= 50
Grup B: Penderita serangan jantung Pria dengan usia >= 50
CI <- quantile(mean_diff, probs = c(0.025, 0.975))
cat("Interval Kepercayaan 95%: [", round(CI[1], 2), ",", round(CI[2], 2), "]\n")
## Interval Kepercayaan 95%: [ -0.07 , 0.13 ]
if (CI[1] > 0 | CI[2] < 0) {
cat("Karena interval kepercayaan tidak melewati nol, perbedaan antar grup signifikan.\n")
} else {
cat("Karena interval kepercayaan mencakup nol, tidak cukup bukti adanya perbedaan signifikan.\n")
}
## Karena interval kepercayaan mencakup nol, tidak cukup bukti adanya perbedaan signifikan.
Hasil bootsrapping menunjukan bahwa rata-rata perbedaan antara penderita serangan jantung wanita dengan usia >= 50 dan penderita serangan jantung pria dengan usia >= 50 adalah sekitar 0.0276 dengan interval kepercayaan 95%: [-0.07, 0.13].
Statistican Significan atau signifikansi statistik digunakan untuk menentukan apakah hasil yang diperoleh dalam analisis data terjadi secara kebetulan atau memiliki makna yang nyata dalam sebuah populasi
wilcox_test <- wilcox.test(data_A_clean, data_B_clean)
wilcox_p_value <- wilcox_test$p.value
cat("P-Value dari Wilcoxon Test:", wilcox_p_value, "\n")
## P-Value dari Wilcoxon Test: 0.9752232
if (wilcox_p_value < 0.05) {
cat("Hasil: Perbedaan antara penderita serangan jantung wanita dengan usia >= 50 dan penderita serangan jantung pria dengan usia >= 50 signifikan secara statistik")
cat("Hasil: Tidak ada bukti kuat untuk perbedaan signifikan (p ≥ 0.05)\n")
}
p_value_boot <- mean(abs(mean_diff) <= 0)
cat("P-Value dari Bootstrapping:", p_value_boot, "\n")
## P-Value dari Bootstrapping: 0
if (p_value_boot < 0.05) {
cat("Hasil: Perbedaan antara penderita serangan jantung wanita dengan usia >= 50 dan penderita serangan jantung pria dengan usia >= 50 signifikan secara statistik berdasarkan bootstrapping (p < 0.05)\n")
} else {
cat("Hasil: Tidak ada bukti kuat untuk perbedaan signifikan berdasarkan bootstrapping (p ≥ 0.05)\n")
}
## Hasil: Perbedaan antara penderita serangan jantung wanita dengan usia >= 50 dan penderita serangan jantung pria dengan usia >= 50 signifikan secara statistik berdasarkan bootstrapping (p < 0.05)
Wilcoxon Test: p-value 0.9752 (tidak signifikan, tidak ada perbedaan nyata).
Bootstrapping: Interval kepercayaan [-0.07, 0.13] mencakup nol berarti tidak cukup bukti bahwa perbedaan mean signifikan.
Kesimpulan akhir: Tidak ada perbedaan signifikan antara penderita serangan jantung wanita dengan usia >= 50 dan penderita serangan jantung pria dengan usia >= 50 dalam dataset ini.
T-test adalah uji statistik yang digunakan untuk membandingkan rata-rata dua kelompok dan menentukan apakah perbedaannya signifikan secara statistik.
var_test <- var.test(data_A_clean, data_B_clean)
var_p_value <- var_test$p.value
cat("P-Value dari Uji Varians (F-Test):", var_p_value, "\n")
## P-Value dari Uji Varians (F-Test): 0.07007095
if (var_p_value < 0.05) {
cat("Varians berbeda secara signifikan, gunakan Welch's T-Test.\n")
equal_var <- FALSE
} else {
cat("Varians tidak berbeda signifikan, gunakan T-Test biasa.\n")
equal_var <- TRUE
}
## Varians tidak berbeda signifikan, gunakan T-Test biasa.
t_test <- t.test(data_A_clean, data_B_clean, var.equal = equal_var)
t_test_p_value <- t_test$p.value
cat("\nP-Value dari T-Test:", t_test_p_value, "\n")
##
## P-Value dari T-Test: 0.5977138
if (t_test_p_value < 0.05) {
cat("Hasil: Perbedaan antara penderita serangan jantung wanita dengan usia >= 50 dan penderita serangan jantung pria dengan usia >= 50 signifikan secara statistik (p < 0.05)\n")
} else {
cat("Hasil: Tidak ada bukti kuat untuk perbedaan signifikan (p ≥ 0.05)\n")
}
## Hasil: Tidak ada bukti kuat untuk perbedaan signifikan (p ≥ 0.05)
saat melakukan uji varians (f-test) varians kedua kelompok tidak berbeda signifikan sehingga digunakan uji t-test dan menghasilkan p-value = 0.5977 yang artinya tidak ada perbedaan signifikan dalam mean kedua kelompok.
Multiple Testing atau pengujian ganda terjadi ketika melakukan lebih ari satu uji statistik dalam satu analisis.
p_values <- c(t_test_p_value, wilcox_p_value, p_value_boot, var_p_value)
p_bonferroni <- p.adjust(p_values, method = "bonferroni")
p_bh <- p.adjust(p_values, method = "BH")
p_adjusted_results <- data.frame(
Test = c("T-Test", "Wilcoxon", "Bootstrap", "Variance Test"),
P_Value = p_values,
P_Bonferroni = p_bonferroni,
P_BH = p_bh
)
print(p_adjusted_results)
## Test P_Value P_Bonferroni P_BH
## 1 T-Test 0.59771384 1.0000000 0.7969518
## 2 Wilcoxon 0.97522320 1.0000000 0.9752232
## 3 Bootstrap 0.00000000 0.0000000 0.0000000
## 4 Variance Test 0.07007095 0.2802838 0.1401419
cat("\nInterpretasi setelah Multiple Testing Correction:\n")
##
## Interpretasi setelah Multiple Testing Correction:
if (any(p_bonferroni < 0.05)) {
cat("Dengan Bonferroni Correction, ada perbedaan signifikan antara grup (p < 0.05).\n")
} else {
cat("Dengan Bonferroni Correction, tidak ada perbedaan signifikan (p ≥ 0.05).\n")
}
## Dengan Bonferroni Correction, ada perbedaan signifikan antara grup (p < 0.05).
if (any(p_bh < 0.05)) {
cat("Dengan Benjamini-Hochberg Correction, ada perbedaan signifikan antara grup (p < 0.05).\n")
} else {
cat("Dengan Benjamini-Hochberg Correction, tidak ada perbedaan signifikan (p ≥ 0.05).\n")
}
## Dengan Benjamini-Hochberg Correction, ada perbedaan signifikan antara grup (p < 0.05).
Df atau Degrees of Freedom atau bisa disebut derajat kebebasan adalah jumlah nilai independen dalam perhitungan statistik yang bebas, dalam uji statistik seperti T-test atau ANOVA derajat kebebasan digunakan untuk menentukan distribusi probabilitas yang sesuai.
n_A <- length(data_A_clean)
n_B <- length(data_B_clean)
s2_A <- var(data_A_clean)
s2_B <- var(data_B_clean)
if (equal_var) {
df <- n_A + n_B - 2 # Equal Variance T-Test
cat("Degrees of Freedom (Equal Variance):", df, "\n")
} else {
df <- ( (s2_A / n_A + s2_B / n_B)^2 ) /
( ( (s2_A / n_A)^2 / (n_A - 1) ) + ( (s2_B / n_B)^2 / (n_B - 1) ) ) # Welch's T-Test
cat("Degrees of Freedom (Welch's T-Test):", df, "\n")
}
## Degrees of Freedom (Equal Variance): 104893
104893 adalah jumlah degrees of freedom yang dihitung dari jumlah sampel kedua grup dengan asumsi varians yang sama.Df yang besar menunjukkan dataset yang besar, sehingga hasil uji T-Test menjadi lebih stabil dan kurang terpengaruh oleh outlier.
ANOVA (Analysis of Variance) merupakan uji statistik yang digunakan untuk membandingkan lebih dari dua kelompok berdasarkan perbedaan rata-rata. ANOVA digunakan saat ada lebih dari dua kelompok yang akan dibandingkan.
if (!require(ggplot2)) install.packages("ggplot2", dependencies=TRUE)
data <- read.csv("/cloud/project/heart_attack_prediction_indonesia.csv")
anova_result <- aov(age ~ gender, data = data)
summary(anova_result)
## Df Sum Sq Mean Sq F value Pr(>F)
## gender 1 105 104.9 0.739 0.39
## Residuals 158353 22465492 141.9
Tidak ada perbedaan signifikan antara kelompok gender dalam dataset, variasi dalam data lebi banyak disebabkan oleh faktor lain, bukan hanya dari gender. hasil ini menunjukkan bahwa gender bukan faktor utama dalam memprediksi kemungkinan serangan jantung.
Uji chi-square digunakan untuk menguji hubungan antara dua variabel kategori dalam dataset. analisis ini berutjuan untuk mengetahui apakah gender berhubungan dengan kemungkinan serangan jantung.
hipotesis: H₀: Tidak ada hubungan antara gender dan kemungkinan serangan jantung H₁: Ada hubungan antara gender dan kemungkinan serangan jantung
data$gender <- as.factor(data$gender)
data$heart_attack <- as.factor(data$heart_attack)
table_chi <- table(data$gender, data$heart_attack)
chi_result <- chisq.test(table_chi)
print(chi_result)
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: table_chi
## X-squared = 1.9274, df = 1, p-value = 0.165
Karena P-value = 0.165 > 0.05 maka hipotesis H₀ diterima karena tidak ada bukti yang cukup untuk menyimpulkan bawa gender memiliki hubungan signifikan dengan serangan jantung dalam dataset.
Berdasarkan seluruh analisis yang telah dilakukan pada dataset Heart attack prediction in Indonesia bahwa tidak ada bukti dari uji statistik yang cukup kuat untuk menyatakan bahwa gender berpengaruh secara signifikan terhadap kemungkinan serangan jantung. Usia mungkin memiliki peran, tapi memerlukan analisis lebih lanjut dengan variabel lain seperti gaya hidup, kolesterol, teknana darah dan lainnya. resampling dengan metode bootstrapping menunjukkan bahwa perbedaan anatara kelompok penderita serangan jantung wanita dengan usia >= 50 dan penderita serangan jantung pria dengan usia >= 50 tidak signifikan secara statistik.