ANALISIS DATA CKD (Chronic Kidney Disease) - R Studio

Data: CKD.xlsx (50 observasi, 19 variabel)

==========================================================

1. IMPOR DATA KE R STUDIO

==========================================================

Jalankan sekali saja untuk memasang paket:

install.packages(c(“readxl”, “nortest”))

library(readxl) # membaca file Excel library(nortest) # uji Lilliefors

Cara A: pilih file lewat jendela dialog

data <- read_excel(file.choose(), sheet = 1)

Cara B: tulis lokasi file (pakai tanda / atau \ , bukan )

data <- read_excel(“C:/Users/NamaAnda/Documents/CKD.xlsx”, sheet = 1)

Cara C (tanpa kode): menu File > Import Dataset > From Excel…

data <- as.data.frame(data) # ubah dari tibble ke data.frame biasa

Ganti nama kolom agar singkat dan mudah dipanggil

names(data) <- c(“Umur”, “TekananDarah”, “RBC_Urin”, “Bakteri_Urin”, “UreaDarah”, “KreatininSerum”, “Hemoglobin”, “Hipertensi”, “Diabetes”, “PenyakitJantungKoroner”, “Anemia”, “RasioProteinKreatinin”, “OutputUrin”, “Kolesterol”, “RiwayatKeluarga”, “Merokok”, “BMI”, “AktivitasFisik”, “StatusCKD”)

head(data) # 6 baris pertama View(data) # tampilan tabel di R Studio

==========================================================

2. STRUKTUR DATA

==========================================================

Ubah variabel teks (character) menjadi factor (kategorik)

kolom_teks <- sapply(data, is.character) data[kolom_teks] <- lapply(data[kolom_teks], as.factor) data\(AktivitasFisik <- factor(data\)AktivitasFisik, levels = c(“low”, “moderate”, “high”), ordered = TRUE)

dim(data) # jumlah baris dan kolom str(data) # struktur: tipe tiap variabel + contoh isinya summary(data) # ringkasan tiap variabel sapply(data, class) # tipe data tiap variabel colSums(is.na(data)) # cek missing value

num_vars <- names(data)[sapply(data, is.numeric)] # variabel numerik kat_vars <- names(data)[sapply(data, is.factor)] # variabel kategorik num_vars kat_vars lapply(data[kat_vars], levels) # kategori tiap variabel kategorik

==========================================================

3. VISUALISASI DATA

==========================================================

3a. Histogram + kurva density (variabel numerik)

par(mfrow = c(3, 3)) for (v in num_vars) { hist(data[[v]], freq = FALSE, main = paste(“Histogram”, v), xlab = v, col = “skyblue”, border = “white”) lines(density(data[[v]]), col = “red”, lwd = 2) } par(mfrow = c(1, 1))

3b. Boxplot (variabel numerik) -> melihat sebaran dan outlier

par(mfrow = c(3, 3)) for (v in num_vars) { boxplot(data[[v]], horizontal = TRUE, main = paste(“Boxplot”, v), xlab = v, col = “lightgreen”) } par(mfrow = c(1, 1))

3c. Diagram batang (variabel kategorik)

par(mfrow = c(2, 5)) for (v in kat_vars) { barplot(table(data[[v]]), main = v, col = “orange”, ylab = “Frekuensi”, las = 1) } par(mfrow = c(1, 1))

3d. Boxplot variabel numerik menurut Status CKD

par(mfrow = c(3, 3)) for (v in num_vars) { boxplot(data[[v]] ~ data$StatusCKD, main = v, xlab = “Status CKD”, ylab = v, col = c(“lightblue”, “salmon”)) } par(mfrow = c(1, 1))

3e. Hubungan antar variabel numerik

pairs(data[num_vars], pch = 19, col = “steelblue”) round(cor(data[num_vars]), 2) # matriks korelasi

==========================================================

4. STATISTIK DESKRIPTIF

==========================================================

skew <- function(x) { m <- mean(x); mean((x - m)^3) / (mean((x - m)2))1.5 } kurt <- function(x) { m <- mean(x); mean((x - m)^4) / (mean((x - m)2))2 - 3 }

desk <- function(x) { c(N = length(x), Mean = mean(x), Median = median(x), SD = sd(x), Varians = var(x), Min = min(x), Q1 = unname(quantile(x, 0.25)), Q3 = unname(quantile(x, 0.75)), Max = max(x), Range = max(x) - min(x), IQR = IQR(x), KV_persen = sd(x) / mean(x) * 100, Skewness = skew(x), Kurtosis_excess = kurt(x)) }

hasil_desk <- t(sapply(data[num_vars], desk)) round(hasil_desk, 3)

Variabel kategorik: frekuensi dan persentase

for (v in kat_vars) { cat(“==”, v, “==”) print(table(data[[v]])) print(round(prop.table(table(data[[v]])) * 100, 1)) }

Rata-rata variabel numerik menurut Status CKD

aggregate(. ~ StatusCKD, data = data[c(num_vars, “StatusCKD”)], FUN = mean)

==========================================================

5. DISTRIBUSI DATA

==========================================================

5a. Plot: histogram vs. kurva normal (biru) vs. kurva uniform (hijau)

par(mfrow = c(3, 3)) for (v in num_vars) { y <- data[[v]] hist(y, freq = FALSE, main = v, xlab = v, col = “grey90”, border = “white”) lines(density(y), col = “red”, lwd = 2) curve(dnorm(x, mean(y), sd(y)), add = TRUE, col = “blue”, lwd = 2) curve(dunif(x, min(y), max(y)), add = TRUE, col = “darkgreen”, lwd = 2) } par(mfrow = c(1, 1))

5b. Q-Q plot terhadap distribusi normal

par(mfrow = c(3, 3)) for (v in num_vars) { qqnorm(data[[v]], main = paste(“Q-Q Plot”, v), pch = 19) qqline(data[[v]], col = “red”, lwd = 2) } par(mfrow = c(1, 1))

5c. Uji formal (alpha = 0.05)

H0: data berdistribusi normal (Shapiro-Wilk, Lilliefors)

H0: data berdistribusi uniform(min, max) (Kolmogorov-Smirnov)

uji <- data.frame(Variabel = num_vars, W_Shapiro = NA, p_Shapiro = NA, p_Lilliefors = NA, p_KS_Uniform = NA) for (i in seq_along(num_vars)) { y <- data[[num_vars[i]]] sw <- shapiro.test(y) li <- lillie.test(y) un <- suppressWarnings(ks.test(y, “punif”, min(y), max(y))) uji[i, 2:5] <- c(sw\(statistic, sw\)p.value, li\(p.value, un\)p.value) } uji\(Normal_Shapiro <- ifelse(uji\)p_Shapiro < 0.05, “Tolak H0 (tidak normal)”, “Gagal tolak H0 (normal)”) uji\(Uniform_KS <- ifelse(uji\)p_KS_Uniform < 0.05, “Tolak H0 (bukan uniform)”, “Gagal tolak H0 (uniform)”) print(uji, digits = 4)

5d. Variabel kategorik biner -> Bernoulli/Binomial

Contoh: proporsi pasien CKD = “Yes”

n_yes <- sum(data$StatusCKD == “Yes”) n_yes / nrow(data) # estimasi p binom.test(n_yes, nrow(data), p = 0.5)

NO. 6 - MATRIKS KORELASI + HEATMAP (berdiri sendiri)

library(readxl) # install.packages(“readxl”) jika belum ada graphics.off()

ckd <- as.data.frame(read_excel(file.choose())) # pilih file CKD.xlsx num <- ckd[sapply(ckd, is.numeric)] # ambil kolom numerik saja mat_kor <- cor(num) # matriks korelasi Pearson print(round(mat_kor, 2))

n <- ncol(mat_kor) warna <- colorRampPalette(c(“blue”, “white”, “red”))(100) z <- t(mat_kor[n:1, ])

par(mar = c(9, 9, 3, 1)) image(1:n, 1:n, z, col = warna, zlim = c(-1, 1), axes = FALSE, xlab = ““, ylab =”“, main =”Heatmap Matriks Korelasi Variabel Numerik CKD”) axis(1, at = 1:n, labels = colnames(mat_kor), las = 2, cex.axis = 0.7) axis(2, at = 1:n, labels = rev(colnames(mat_kor)), las = 1, cex.axis = 0.7) pos <- expand.grid(x = 1:n, y = 1:n) text(pos\(x, pos\)y, labels = sprintf(“%.2f”, as.vector(z)), cex = 0.8) box()