a.)
# Load data
df <- read.csv("C:\\Users\\Asus\\Downloads\\heart data.csv")
# 1. Cek Missing Values (Nilai yang Hilang)
# Menghitung jumlah nilai yang hilang per kolom
missing_values <- sapply(df, function(x) sum(is.na(x)))
# Menampilkan jumlah missing values per kolom
cat("Jumlah Missing Values per Kolom:\n")
## Jumlah Missing Values per Kolom:
print(missing_values)
## age.sex.cp.trestbps.chol.fbs.restecg.thalach.exang.oldpeak.slope.ca.thal.target
## 0
# 2. Cek Data Duplikat (Duplicate Records)
# Menghitung jumlah duplikat
duplicate_count <- sum(duplicated(df))
# Menampilkan jumlah duplikat
cat("\nJumlah Data Duplikat:", duplicate_count, "\n")
##
## Jumlah Data Duplikat: 1
# Load data
df <- read.csv("C:\\Users\\Asus\\Downloads\\heart data.csv")
# Pilih kolom numerik
numeric_cols <- sapply(df, is.numeric)
numeric_data <- df[, numeric_cols]
# Fungsi untuk mendeteksi outlier menggunakan metode IQR
remove_outliers <- function(x) {
Q1 <- quantile(x, 0.25, na.rm = TRUE)
Q3 <- quantile(x, 0.75, na.rm = TRUE)
IQR <- Q3 - Q1
# Menentukan outlier jika berada di luar rentang IQR
outliers <- x < (Q1 - 1.5 * IQR) | x > (Q3 + 1.5 * IQR)
return(outliers)
}
# Terapkan fungsi untuk mendeteksi outlier pada kolom numerik
outliers <- sapply(numeric_data, remove_outliers)
# Menampilkan jumlah outlier per kolom
cat("\nJumlah outlier per kolom numerik:\n")
##
## Jumlah outlier per kolom numerik:
# Menyaring data untuk menghapus outliers jika diinginkan
df_no_outliers <- df
df_no_outliers[, numeric_cols] <- sapply(df[, numeric_cols], function(x) {
Q1 <- quantile(x, 0.25, na.rm = TRUE)
Q3 <- quantile(x, 0.75, na.rm = TRUE)
IQR <- Q3 - Q1
x[x < (Q1 - 1.5 * IQR) | x > (Q3 + 1.5 * IQR)] <- NA
return(x)
})
# Menampilkan jumlah nilai NA setelah mengganti outlier
cat("\nJumlah nilai NA setelah mengganti outlier dengan NA:\n")
##
## Jumlah nilai NA setelah mengganti outlier dengan NA:
print(sapply(df_no_outliers, function(x) sum(is.na(x)))) #
## age.sex.cp.trestbps.chol.fbs.restecg.thalach.exang.oldpeak.slope.ca.thal.target
## 0
penjelassan : Hasil analisis menunjukkan bahwa tidak ada nilai yang hilang (missing values) pada kolom numerik dan kategorikal setelah dilakukan pengecekan. Terdapat 1 baris data duplikat yang ditemukan dan telah dihapus. Setelah mengganti nilai outlier dengan NA, tidak ada nilai NA yang tersisa pada kolom numerik maupun kategorikal.
b.)
# Load library
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.4.3
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.4.3
##
## 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
# Load data
df <- read.csv("C:\\Users\\Asus\\Downloads\\heart data.csv", sep = ";")
# Pastikan kolom 'target' dan 'sex' adalah faktor
df$target <- factor(df$target, levels = c(0, 1), labels = c("Tidak", "Ya"))
df$sex <- factor(df$sex, levels = c(0, 1), labels = c("Perempuan", "Laki-laki"))
# 1. Visualisasi jenis kelamin yang paling banyak mengalami penyakit jantung
ggplot(df, aes(x = sex, fill = target)) +
geom_bar(position = "dodge") +
labs(
title = "Jenis Kelamin yang Paling Banyak Mengalami Penyakit Jantung",
x = "Jenis Kelamin",
y = "Jumlah",
fill = "Penyakit Jantung"
) +
theme_minimal()
# 3. Visualisasi usia dengan kadar gula darah lebih dari 120 mg/dl
ggplot(df[df$fbs == 1, ], aes(x = age)) +
geom_histogram(binwidth = 1, fill = "lightgreen", color = "black") +
labs(
title = "Distribusi Usia dengan Kadar Gula Darah Lebih dari 120 mg/dl",
x = "Usia",
y = "Jumlah",
fill = "Gula Darah > 120"
) +
theme_minimal()
Interpretasi : Interpretasi Visualisasi 1 (Jenis Kelamin yang Paling
Banyak Mengalami Penyakit Jantung): Grafik menunjukkan bahwa laki-laki
lebih banyak mengalami penyakit jantung dibandingkan dengan perempuan.
Proporsi penyakit jantung pada laki-laki lebih tinggi, meskipun jumlah
perempuan yang tidak mengalami penyakit jantung juga lebih banyak.
Interpretasi Visualisasi 2 (Distribusi Usia dengan Kadar Gula Darah Lebih dari 120 mg/dl): Grafik menunjukkan distribusi usia pada pasien dengan kadar gula darah lebih dari 120 mg/dl. Kelompok usia 50-55 tahun memiliki jumlah pasien terbanyak dengan kadar gula darah tinggi, diikuti oleh kelompok usia lainnya yang juga menunjukkan penyebaran yang merata di rentang usia 40-70 tahun.
c.)
# Load library
library(dplyr)
# Load data
df <- read.csv("C:\\Users\\Asus\\Downloads\\heart data.csv", sep = ";")
# Pastikan kolom 'target' adalah faktor
df$target <- factor(df$target, levels = c(0, 1), labels = c("Tidak", "Ya"))
# 1. Membagi data berdasarkan kadar gula darah lebih dari 120 vs 120 atau kurang
df$glucose_category <- ifelse(df$fbs > 120, "FBS > 120", "FBS <= 120")
# 2. Membuat tabel kontingensi untuk melihat hubungan antara kadar gula darah dan penyakit jantung
contingency_table <- table(df$glucose_category, df$target)
# Menampilkan tabel kontingensi
cat("Tabel Kontingensi:\n")
## Tabel Kontingensi:
print(contingency_table)
##
## Tidak Ya
## FBS <= 120 138 165
# 3. Uji Chi-Square untuk melihat apakah ada hubungan signifikan antara kadar gula darah dan penyakit jantung
chi_square_test <- chisq.test(contingency_table)
# Menampilkan hasil uji Chi-Square
cat("\nHasil Uji Chi-Square:\n")
##
## Hasil Uji Chi-Square:
print(chi_square_test)
##
## Chi-squared test for given probabilities
##
## data: contingency_table
## X-squared = 2.4059, df = 1, p-value = 0.1209
# Menyimpulkan apakah kadar gula darah lebih dari 120 berkaitan dengan penyakit jantung
if (chi_square_test$p.value < 0.05) {
cat("\nHasil uji Chi-Square menunjukkan bahwa terdapat hubungan yang signifikan antara kadar gula darah lebih dari 120 dengan penyakit jantung.\n")
} else {
cat("\nHasil uji Chi-Square menunjukkan bahwa tidak ada hubungan yang signifikan antara kadar gula darah lebih dari 120 dengan penyakit jantung.\n")
}
##
## Hasil uji Chi-Square menunjukkan bahwa tidak ada hubungan yang signifikan antara kadar gula darah lebih dari 120 dengan penyakit jantung.
penjelasan : Tabel Kontingensi menunjukkan jumlah pasien dengan kadar gula darah ≤ 120 mg/dl yang terbagi menjadi 138 orang tidak mengalami penyakit jantung dan 165 orang mengalami penyakit jantung.
Hasil Uji Chi-Square menunjukkan nilai X-squared = 2.4059, p-value = 0.1209, yang lebih besar dari 0.05, berarti tidak ada hubungan signifikan antara kadar gula darah lebih dari 120 mg/dl dan penyakit jantung.
d.)
# Load library
library(dplyr)
library(ggplot2)
# Load data
df <- read.csv("C:\\Users\\Asus\\Downloads\\heart data.csv", sep = ";")
# Pastikan kolom 'target' dan 'cp' adalah faktor
df$target <- factor(df$target, levels = c(0, 1), labels = c("Tidak", "Ya"))
df$cp <- factor(df$cp, levels = c(0, 1, 2, 3), labels = c("Tidak ada nyeri", "Nyeri ringan", "Nyeri sedang", "Nyeri berat"))
# Filter data untuk pasien dengan penyakit jantung
df_heart_disease <- df %>% filter(target == "Ya")
# Hitung jumlah setiap jenis nyeri dada pada pasien yang memiliki penyakit jantung
chest_pain_count <- table(df_heart_disease$cp)
# Menampilkan hasil tabel
cat("Jumlah setiap jenis nyeri dada pada pasien dengan penyakit jantung:\n")
## Jumlah setiap jenis nyeri dada pada pasien dengan penyakit jantung:
print(chest_pain_count)
##
## Tidak ada nyeri Nyeri ringan Nyeri sedang Nyeri berat
## 39 41 69 16
# Visualisasi jenis nyeri dada pada pasien yang mengalami penyakit jantung
ggplot(df_heart_disease, aes(x = cp, fill = cp)) +
geom_bar() +
labs(
title = "Jenis Nyeri Dada pada Pasien dengan Penyakit Jantung",
x = "Jenis Nyeri Dada",
y = "Jumlah",
fill = "Jenis Nyeri"
) +
theme_minimal()
Visualisasi menunjukkan distribusi jenis nyeri dada pada pasien yang
mengalami penyakit jantung. Nyeri sedang merupakan jenis nyeri dada yang
paling banyak dialami oleh pasien, diikuti oleh nyeri ringan dan nyeri
berat yang lebih sedikit. Tidak ada nyeri adalah kategori dengan jumlah
paling rendah, menunjukkan bahwa sebagian besar pasien mengalami
beberapa tingkat nyeri dada.
e.)
# Load library
library(ggplot2)
library(dplyr)
# Load data
df <- read.csv("C:\\Users\\Asus\\Downloads\\heart data.csv", sep = ";")
# Pastikan kolom target dan variabel kategorikal lainnya adalah faktor
df$target <- factor(df$target, levels = c(0, 1), labels = c("Tidak", "Ya"))
df$cp <- factor(df$cp, levels = c(0, 1, 2, 3), labels = c("Tidak ada nyeri", "Nyeri ringan", "Nyeri sedang", "Nyeri berat"))
df$ca <- factor(df$ca, levels = c(0, 1, 2, 3, 4), labels = c("0 Vaskular", "1 Vaskular", "2 Vaskular", "3 Vaskular", "4 Vaskular"))
df$thal <- factor(df$thal, levels = c(1, 2, 3), labels = c("Normal", "Defek", "Terbalik"))
# Fungsi untuk membuat bar plot proporsi heart disease berdasarkan variabel kategorikal dengan warna hijau dan biru
plot_prop <- function(var) {
df %>%
group_by(!!sym(var), target) %>%
summarise(count = n(), .groups = "drop") %>%
group_by(!!sym(var)) %>%
mutate(prop = count / sum(count)) %>%
ggplot(aes_string(x = var, y = "prop", fill = "target")) +
geom_bar(stat = "identity", position = "fill") +
scale_y_continuous(labels = scales::percent) +
scale_fill_manual(values = c("blue", "green")) +
labs(
title = paste("Proporsi Penyakit Jantung berdasarkan", var),
x = var,
y = "Proporsi (%)",
fill = "Penyakit Jantung"
) +
theme_minimal()
}
# Plot untuk masing-masing variabel
plot_prop("cp")
## Warning: `aes_string()` was deprecated in ggplot2 3.0.0.
## ℹ Please use tidy evaluation idioms with `aes()`.
## ℹ See also `vignette("ggplot2-in-packages")` for more information.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
plot_prop("ca")
plot_prop("thal")
Interpretasi Visualisasi 1 (Proposi Penyakit Jantung Berdasarkan Jenis
Nyeri Dada - cp): Grafik menunjukkan bahwa pasien dengan nyeri dada
sedang (cp = 2) memiliki proporsi yang lebih tinggi untuk mengalami
penyakit jantung (warna hijau), sementara pasien dengan nyeri ringan (cp
= 1) dan tidak ada nyeri (cp = 0) menunjukkan proporsi yang lebih rendah
untuk penyakit jantung.
Interpretasi Visualisasi 2 (Proposi Penyakit Jantung Berdasarkan Jumlah Vaskular - ca): Pada grafik ini, terlihat bahwa proporsi pasien yang mengalami penyakit jantung meningkat seiring dengan peningkatan jumlah vaskular (ca), meskipun ada beberapa variasi dalam proporsi penyakit jantung pada kategori 1 hingga 4 vaskular.
Interpretasi Visualisasi 3 (Proposi Penyakit Jantung Berdasarkan Status Thalassemia - thal): Grafik ini menunjukkan bahwa pasien dengan status thalassemia “Defek” (cp = 1) memiliki proporsi yang lebih tinggi mengalami penyakit jantung dibandingkan dengan pasien yang memiliki status “Normal” atau “Terbalik”. Status “NA” menunjukkan variasi yang lebih luas dalam proporsi penyakit jantung.
f.)
# Load library
library(ggplot2)
# Load data
df <- read.csv("C:\\Users\\Asus\\Downloads\\heart data.csv", sep = ";")
# Pastikan kolom target adalah faktor
df$target <- factor(df$target, levels = c(0, 1), labels = c("Tidak", "Ya"))
# Visualisasi hubungan antara 'age' dan 'thalach' untuk yang memiliki penyakit jantung (target = 1) dan tidak (target = 0)
ggplot(df, aes(x = age, y = thalach, color = target)) +
geom_point(alpha = 0.6) +
geom_smooth(method = "lm", se = FALSE, color = "blue", linetype = "solid") + # Garis regresi linier
geom_smooth(method = "loess", se = FALSE, color = "green", linetype = "dashed") + # Garis LOESS (non-linear)
labs(
title = "Hubungan Usia dan Denyut Jantung Maksimum berdasarkan Penyakit Jantung",
x = "Usia",
y = "Denyut Jantung Maksimum (Thalach)",
color = "Penyakit Jantung"
) +
theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'
## `geom_smooth()` using formula = 'y ~ x'
# Regresi linier untuk melihat hubungan linear
lm_model <- lm(thalach ~ age + target, data = df)
summary(lm_model)
##
## Call:
## lm(formula = thalach ~ age + target, data = df)
##
## Residuals:
## Min 1Q Median 3Q Max
## -59.72 -11.79 2.52 12.95 53.80
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 184.7374 7.3937 24.986 < 2e-16 ***
## age -0.8063 0.1273 -6.335 8.66e-10 ***
## targetYa 16.0559 2.3171 6.929 2.59e-11 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 19.57 on 300 degrees of freedom
## Multiple R-squared: 0.2749, Adjusted R-squared: 0.27
## F-statistic: 56.86 on 2 and 300 DF, p-value: < 2.2e-16
# Mengevaluasi model regresi linier dan LOESS
interpretassi : Grafik menunjukkan hubungan negatif antara usia dan denyut jantung maksimum. Semakin tua usia, semakin rendah denyut jantung maksimum. Pasien yang mengalami penyakit jantung (warna biru) cenderung memiliki denyut jantung lebih rendah pada usia lebih tinggi dibandingkan dengan pasien yang tidak mengalami penyakit jantung (warna merah). Berdasarkan grafik dan garis regresi yang terlihat, hubungan usia dan denyut jantung maksimum terlihat linier caranya melihat garis regresi
g.)
# Load library
library(ggplot2)
library(corrplot)
## Warning: package 'corrplot' was built under R version 4.4.3
## corrplot 0.95 loaded
# Load data
df <- read.csv("C:\\Users\\Asus\\Downloads\\heart data.csv", sep = ";") # Gantilah dengan path file yang sesuai
# Pilih kolom numerik
numeric_cols <- c('age', 'trestbps', 'chol', 'fbs', 'thalach', 'oldpeak', 'ca', 'thal')
# Menghitung matriks korelasi antar variabel numerik
correlation_matrix <- cor(df[, numeric_cols])
# Membuat heatmap untuk visualisasi korelasi
corrplot(correlation_matrix, method = "color",
col = colorRampPalette(c("blue", "white", "green"))(200),
type = "upper",
order = "hclust",
tl.cex = 0.8, # Ukuran teks label
tl.col = "black", # Warna teks label
addCoef.col = "black", # Menambahkan nilai korelasi di dalam kotak
title = "Heatmap Korelasi Antar Variabel Numerik")
interpretasi : Heatmap menunjukkan korelasi antar variabel numerik dalam
dataset. Korelasi positif terlihat antara thal dan oldpeak (0.21) serta
age dan thal (0.28). Korelasi negatif terlihat antara age dan thalach
(-0.40) serta thalach dan oldpeak (-0.34). Variabel lain seperti ca,
chol, fbs, dan trestbps memiliki korelasi yang relatif lemah dengan
variabel lainnya.
h.) Hubungan Linear atau Non-Linear: Berdasarkan visualisasi dan regresi, hubungan antara age dan thalach dapat dikategorikan sebagai non-linier jika model LOESS menunjukkan kelengkungan yang lebih baik daripada garis linier. Namun, hubungan linier tetap dapat dilihat dalam beberapa kasus tertentu.
Kadar Gula Darah dan Penyakit Jantung: Hasil uji Chi-Square menunjukkan apakah kadar gula darah lebih dari 120 mg/dl berhubungan secara signifikan dengan peningkatan kejadian penyakit jantung. Jika nilai p < 0.05, kita dapat menyimpulkan adanya hubungan signifikan.
Proporsi Penyakit Jantung: Bar plot proporsi untuk variabel cp, ca, dan thal memberikan informasi visual tentang faktor-faktor yang berhubungan dengan peningkatan risiko penyakit jantung.
Korelasi antar Variabel: Heatmap korelasi mengungkapkan hubungan antar variabel numerik, yang dapat membantu dalam memahami bagaimana faktor-faktor seperti usia, tekanan darah, dan kolesterol saling berinteraksi dalam konteks penyakit jantung.
Penyakit jantung dapat dicegah dengan menerapkan gaya hidup sehat, seperti menjaga pola makan yang seimbang, berolahraga secara teratur, mengelola stres, dan tidak merokok. Selain itu, pengendalian faktor risiko seperti tekanan darah tinggi, kadar kolesterol tinggi, dan diabetes sangat penting. Aspek yang menjadi indikasi penyakit jantung meliputi adanya nyeri dada (terutama yang berat dan teratur), sesak napas, kelelahan berlebihan, dan palpitasi (detak jantung yang tidak teratur). Faktor-faktor risiko lainnya termasuk usia, riwayat keluarga, obesitas, serta kebiasaan tidak sehat seperti pola makan buruk dan kurangnya aktivitas fisik
Nomor 2
# Load library
library(ggplot2)
# Misalnya data yang sudah dimuat sebelumnya
data <- data.frame(
Konsumsi_GWh = c(10, 20, 30, 50, 60, 90, 100, 200, 300, 400, 500, 600, 700, 800, 1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000, 10000),
Biaya_per_kWh = c(1500, 1450, 1400, 1350, 1250, 1200, 1150, 1050, 1000, 950, 900, 850, 800, 750, 700, 650, 600, 550, 500, 450, 400, 350, 300, 250),
Konsumen = c('Rumah Tangga', 'Rumah Tangga', 'Rumah Tangga', 'Rumah Tangga', 'Rumah Tangga', 'Rumah Tangga',
'Industri', 'Industri', 'Industri', 'Industri', 'Industri', 'Industri',
'Kantor Pemerintah', 'Kantor Pemerintah', 'Kantor Pemerintah', 'Kantor Pemerintah',
'UMKM', 'UMKM', 'UMKM', 'UMKM', 'UMKM', 'UMKM', 'UMKM', 'UMKM')
)
# Membuat plot dengan memastikan nama kolom yang benar
ggplot(data, aes(x = Konsumsi_GWh, y = Biaya_per_kWh, color = Konsumen)) +
geom_point() + # Titik-titik data
geom_smooth(method = "lm", se = FALSE) + # Garis regresi tanpa area kepercayaan
labs(
title = "Biaya Listrik per kWh Menurun Seiring Kenaikan Konsumsi",
x = "Total Konsumsi Listrik (GWh)",
y = "Biaya per kWh (Rupiah)",
caption = "Data simulasi untuk keperluan edukasi"
) +
theme_minimal() # Menggunakan tema minimal untuk plot
## `geom_smooth()` using formula = 'y ~ x'
Grafik menunjukkan bahwa biaya per kWh menurun seiring dengan
peningkatan konsumsi listrik untuk semua jenis konsumen. Industri
memiliki penurunan biaya yang paling tajam, diikuti oleh Kantor
Pemerintah dan Rumah Tangga, sementara UMKM memiliki biaya yang lebih
rendah pada setiap tingkat konsumsi.
library(ggplot2): Memuat paket ggplot2 untuk membuat visualisasi grafik di R.
Membuat Data dengan data.frame: Membuat data frame yang berisi data simulasi tentang konsumsi listrik, biaya per kWh, dan jenis konsumen.
ggplot(data, aes(x = Konsumsi_GWh, y = Biaya_per_kWh, color = Konsumen)): Membuat plot dengan data yang telah dibuat, dengan sumbu X untuk konsumsi listrik dan sumbu Y untuk biaya per kWh, serta membedakan warna berdasarkan jenis konsumen.
geom_point(): Menambahkan titik data pada plot untuk menunjukkan hubungan antara konsumsi listrik dan biaya per kWh.
geom_smooth(method = “lm”, se = FALSE): Menambahkan garis regresi linier pada plot tanpa area kepercayaan.
labs(): Menambahkan judul, label sumbu X dan Y, serta caption pada plot.
theme_minimal(): Menggunakan tema minimal untuk tampilan plot yang lebih bersih dan sederhana.