#PROJECT UTS PSD #DIBERIKAN DATA DARI KAGGLE SEPERTI BERIKUT : #https://www.kaggle.com/code/farzadnekouei/heart-disease-prediction/input

chooseCRANmirror(graphics = FALSE, ind = 1)  
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.3.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
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.3.3
library(tidyr)
## Warning: package 'tidyr' was built under R version 4.3.3
library(ggcorrplot)
## Warning: package 'ggcorrplot' was built under R version 4.3.3
library(corrplot)
## Warning: package 'corrplot' was built under R version 4.3.3
## corrplot 0.95 loaded
library(pheatmap)
## Warning: package 'pheatmap' was built under R version 4.3.3
library(reshape2)
## Warning: package 'reshape2' was built under R version 4.3.3
## 
## Attaching package: 'reshape2'
## The following object is masked from 'package:tidyr':
## 
##     smiths

NO 1. Pada data heart desease yang terdapat di link berikut : https://www.kaggle.com/code/farzadnekouei/heart-disease-prediction/input. Lakukan visualisasi yang efektif untuk menjawab pertanyaan berikut tuliskan informasi tentang variabel (pengertian dari variabel tersebut, skala data variabel), sintag, output yang dihasilkan serta interpretasi.

data <- read.csv("C:/Users/AJENG/OneDrive/Dokumen/FILE KULIAH/SEMESTER 4/PENGANTAR SAINS DATA/UTS PSD/Data heart.csv")
head(data)
##   age sex cp trestbps chol fbs restecg thalach exang oldpeak slope ca thal
## 1  63   1  3      145  233   1       0     150     0     2.3     0  0    1
## 2  37   1  2      130  250   0       1     187     0     3.5     0  0    2
## 3  41   0  1      130  204   0       0     172     0     1.4     2  0    2
## 4  56   1  1      120  236   0       1     178     0     0.8     2  0    2
## 5  57   0  0      120  354   0       1     163     1     0.6     2  0    2
## 6  57   1  0      140  192   0       1     148     0     0.4     1  0    1
##   target
## 1      1
## 2      1
## 3      1
## 4      1
## 5      1
## 6      1
str(data)
## 'data.frame':    303 obs. of  14 variables:
##  $ age     : int  63 37 41 56 57 57 56 44 52 57 ...
##  $ sex     : int  1 1 0 1 0 1 0 1 1 1 ...
##  $ cp      : int  3 2 1 1 0 0 1 1 2 2 ...
##  $ trestbps: int  145 130 130 120 120 140 140 120 172 150 ...
##  $ chol    : int  233 250 204 236 354 192 294 263 199 168 ...
##  $ fbs     : int  1 0 0 0 0 0 0 0 1 0 ...
##  $ restecg : int  0 1 0 1 1 1 0 1 1 1 ...
##  $ thalach : int  150 187 172 178 163 148 153 173 162 174 ...
##  $ exang   : int  0 0 0 0 1 0 0 0 0 0 ...
##  $ oldpeak : num  2.3 3.5 1.4 0.8 0.6 0.4 1.3 0 0.5 1.6 ...
##  $ slope   : int  0 0 2 2 2 1 1 2 2 2 ...
##  $ ca      : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ thal    : int  1 2 2 2 2 1 2 3 3 2 ...
##  $ target  : int  1 1 1 1 1 1 1 1 1 1 ...

###JAWABAN### A. Lakukan pengecekan apakah terdapat :. - Nilai yang hilang (missing values)

colSums(is.na(data))
##      age      sex       cp trestbps     chol      fbs  restecg  thalach 
##        0        0        0        0        0        0        0        0 
##    exang  oldpeak    slope       ca     thal   target 
##        0        0        0        0        0        0

- Data yang tercatat ganda (duplicate records)

sum(duplicated(data))
## [1] 1
#Menghapus data ganda
data <- data[!duplicated(data), ]

- Nilai ekstrim (outlier) pada variabel numerik

check_outliers <- function(x) {
  Q1 <- quantile(x, 0.25)
  Q3 <- quantile(x, 0.75)
  IQR <- Q3 - Q1
  lower <- Q1 - 1.5 * IQR
  upper <- Q3 + 1.5 * IQR
  sum(x < lower | x > upper)
}

sapply(data[, sapply(data, is.numeric)], check_outliers)
##      age      sex       cp trestbps     chol      fbs  restecg  thalach 
##        0        0        0        9        5       45        0        1 
##    exang  oldpeak    slope       ca     thal   target 
##        0        5        0       24        2        0
summary(data)
##       age             sex               cp            trestbps    
##  Min.   :29.00   Min.   :0.0000   Min.   :0.0000   Min.   : 94.0  
##  1st Qu.:48.00   1st Qu.:0.0000   1st Qu.:0.0000   1st Qu.:120.0  
##  Median :55.50   Median :1.0000   Median :1.0000   Median :130.0  
##  Mean   :54.42   Mean   :0.6821   Mean   :0.9636   Mean   :131.6  
##  3rd Qu.:61.00   3rd Qu.:1.0000   3rd Qu.:2.0000   3rd Qu.:140.0  
##  Max.   :77.00   Max.   :1.0000   Max.   :3.0000   Max.   :200.0  
##       chol            fbs           restecg          thalach     
##  Min.   :126.0   Min.   :0.000   Min.   :0.0000   Min.   : 71.0  
##  1st Qu.:211.0   1st Qu.:0.000   1st Qu.:0.0000   1st Qu.:133.2  
##  Median :240.5   Median :0.000   Median :1.0000   Median :152.5  
##  Mean   :246.5   Mean   :0.149   Mean   :0.5265   Mean   :149.6  
##  3rd Qu.:274.8   3rd Qu.:0.000   3rd Qu.:1.0000   3rd Qu.:166.0  
##  Max.   :564.0   Max.   :1.000   Max.   :2.0000   Max.   :202.0  
##      exang           oldpeak          slope             ca        
##  Min.   :0.0000   Min.   :0.000   Min.   :0.000   Min.   :0.0000  
##  1st Qu.:0.0000   1st Qu.:0.000   1st Qu.:1.000   1st Qu.:0.0000  
##  Median :0.0000   Median :0.800   Median :1.000   Median :0.0000  
##  Mean   :0.3278   Mean   :1.043   Mean   :1.397   Mean   :0.7185  
##  3rd Qu.:1.0000   3rd Qu.:1.600   3rd Qu.:2.000   3rd Qu.:1.0000  
##  Max.   :1.0000   Max.   :6.200   Max.   :2.000   Max.   :4.0000  
##       thal           target     
##  Min.   :0.000   Min.   :0.000  
##  1st Qu.:2.000   1st Qu.:0.000  
##  Median :2.000   Median :1.000  
##  Mean   :2.315   Mean   :0.543  
##  3rd Qu.:3.000   3rd Qu.:1.000  
##  Max.   :3.000   Max.   :1.000

PENJELASAN MENGAPA MENGGUNAKAN PENANGANAN SEPERTI CARA DIATAS

Langkah pertama dalam proses pembersihan data adalah memeriksa apakah terdapat nilai yang hilang (missing values). Pengecekan dilakukan menggunakan fungsi colSums(is.na(data)), dan hasilnya menunjukkan bahwa tidak ada nilai yang hilang di seluruh kolom. Karena tidak ditemukan missing values, maka tidak diperlukan penanganan lanjutan seperti imputasi atau penghapusan baris. Hal ini penting untuk memastikan bahwa data yang dianalisis memiliki kelengkapan yang baik dan tidak mengandung kekosongan yang dapat mempengaruhi hasil analisis.

Selanjutnya, dilakukan pengecekan terhadap data ganda (duplicate records). Ditemukan satu data yang tercatat lebih dari satu kali, dan data ini dihapus dengan menggunakan perintah data <- data[!duplicated(data), ]. Penghapusan data duplikat penting dilakukan karena data yang berulang dapat memberikan bobot lebih pada informasi yang sama, sehingga dapat menyebabkan bias dalam hasil analisis statistik dan model prediktif yang dibuat. Dengan memastikan bahwa setiap observasi dalam data adalah unik, maka integritas data dapat terjaga.

Pengecekan nilai ekstrem (outlier) dilakukan pada semua variabel numerik menggunakan metode IQR (Interquartile Range). Metode ini dipilih karena cukup andal dalam mendeteksi nilai-nilai yang berada jauh dari sebaran umum data tanpa terpengaruh oleh nilai ekstrem itu sendiri. Hasilnya menunjukkan beberapa variabel memiliki outlier, seperti fbs, ca, dan trestbps. Namun, dalam tahap ini tidak langsung dilakukan penghapusan terhadap outlier karena nilai-nilai tersebut bisa saja memiliki makna penting secara kontekstual, terutama dalam data kesehatan. Oleh karena itu, perlu dipertimbangkan lebih lanjut pada tahap analisis lanjutan atau modeling.

Setelah proses pembersihan selesai, dilakukan analisis statistika deskriptif menggunakan fungsi summary(data) untuk memberikan gambaran umum mengenai distribusi masing-masing variabel numerik. Statistik seperti nilai minimum, maksimum, median, rata-rata, dan kuartil digunakan untuk memahami karakteristik data. Informasi ini penting sebagai dasar dalam pengambilan keputusan analisis selanjutnya serta untuk mengidentifikasi kemungkinan distribusi data yang miring atau tidak normal. Statistik deskriptif juga membantu melihat persebaran data serta potensi perbedaan antar kelompok dalam variabel target.

B. Lakukan visualisasi untuk menunjukkan jenis kelamin apa yang paling banyak mengalami Heart desease, dan usia berapa yang paling banyak mengalami heart desease, dan usia berapa yang memiliki gula darah lebih besar dari 120 mg/dl.

library(ggplot2)
# Visualisasi jumlah penderita heart disease berdasarkan jenis kelamin
#Konversi kolom sex & target menjadi faktor
data$sex <- factor(data$sex, labels = c("Female", "Male"))
data$target <- factor(data$target, labels = c("No Disease", "Disease"))

#Visualisasi untuk menunjukkan jenis kelamin apa yang paling banyak mengalami heart disease.
ggplot(data[data$target == "Disease", ], aes(x = sex)) +
  geom_bar(fill = "maroon") +
  labs(title = "Jenis Kelamin yang Mengalami Heart Disease", x = "Jenis Kelamin (0=Perempuan , 1=Pria)", y = "Jumlah") +
  theme_minimal()

INTEPRETASI

Dari grafik diatas dapat dilihat bahwa perbandingan jumlah penderita heart disease berdasarkan jenis kelamin. Dari grafik terlihat bahwa jumlah penderita laki-laki lebih tinggi dibandingkan perempuan. Hal ini menunjukkan bahwa laki-laki memiliki risiko lebih besar terkena penyakit jantung dibandingkan perempuan dalam dataset ini.

#Visualisasi untuk usia berapa yang paling banyak mengalami heart disease.
ggplot(data[data$target == "Disease", ], aes(x = age)) +
  geom_histogram(binwidth = 1, fill = "yellow", color = "black") +
  labs(title = "Distribusi Usia Pasien dengan Heart Disease", x = "Usia", y = "Jumlah") +
  theme_minimal()

INTEPRETASI

Dapat dilihat grafik histogram diatas menggambarkan distribusi usia pasien yang mengalami heart disease. Usia pasien yang paling banyak terkena penyakit jantung berada pada rentang sekitar 40 hingga 60 tahun, dengan puncak pada sekitar usia 50-an. Hal ini menunjukkan bahwa heart disease cenderung lebih sering terjadi pada usia paruh baya hingga lanjut usia.

#Visualisasi untuk usia berapa yang memiliki gula darah yang lebih besar daripada 120 mg/dl.
ggplot(data[data$fbs == 1, ], aes(x = age)) +
  geom_histogram(binwidth = 1, fill = "purple", color = "black") +
  labs(title = "Distribusi Usia dengan Gula Darah > 120 mg/dl", x = "Usia", y = "Jumlah") +
 theme_minimal()

INTEPRETASI

Dari gamba diatas dapat dilihat bahwa grafik menampilkan distribusi usia pasien yang memiliki kadar gula darah puasa (fbs) lebih dari 120 mg/dl. Mayoritas pasien dengan kadar gula tinggi berada pada rentang usia 50 hingga 65 tahun. Kondisi ini bisa mengindikasikan bahwa semakin bertambah usia, risiko memiliki kadar gula tinggi juga meningkat, yang berpotensi menjadi faktor risiko tambahan bagi heart disease.

C. Lakukan analisis untuk mengetahui, apakah kadar gula darah seseorang yang lebih besar dari 120 paling banyak mengalami Heart desease?

library(ggplot2)

# Apakah kadar gula darah > 120 mg/dl
data$fbs_status <- ifelse(data$fbs == 1, "Gula > 120", "Gula ≤ 120")

# Ubah target menjadi faktor dengan label
data$target <- factor(data$target, labels = c("Tidak", "Ya"))

# Jumlah penderita heart disease berdasarkan status gula darah
table_result <- table(data$fbs_status, data$target)
colnames(table_result) <- c("Tidak Sakit Jantung", "Sakit Jantung")
print(table_result)
##             
##              Tidak Sakit Jantung Sakit Jantung
##   Gula > 120                  22            23
##   Gula ≤ 120                 116           141
# Proporsi penderita heart disease di tiap kelompok
prop_result <- prop.table(table_result, margin = 1)
print(round(prop_result, 2))  # ditampilkan dalam bentuk proporsi
##             
##              Tidak Sakit Jantung Sakit Jantung
##   Gula > 120                0.49          0.51
##   Gula ≤ 120                0.45          0.55
# Visualisasi 
ggplot(data, aes(x = fbs_status, fill = target)) +
  geom_bar(stat = "count") +
  scale_fill_manual(values = c("Tidak" = "#D8A7B1", "Ya" = "#800000")) +
  labs(
    title = "Jumlah Penderita Heart Disease Berdasarkan Status Gula Darah",
    x = "Status Gula Darah",
    y = "Jumlah",
    fill = "Heart Disease"
  ) +
  theme_minimal()

INTEPRETASI

Gambar diatas menunjukkan perbandingan jumlah penderita heart disease berdasarkan kadar gula darah, yang dibagi menjadi dua kategori: gula > 120 mg/dl dan gula ≤ 120 mg/dl. Terlihat bahwa jumlah penderita heart disease paling banyak berasal dari kelompok dengan kadar gula darah ≤ 120 mg/dl. Namun demikian, meskipun jumlah total pasien dengan gula darah rendah lebih banyak, proporsi penderita heart disease terhadap total pada kategori gula darah > 120 mg/dl terlihat cukup signifikan. Ini menunjukkan bahwa meskipun gula darah tinggi bukan satu-satunya faktor, orang dengan kadar gula darah tinggi tetap memiliki risiko yang cukup besar untuk mengalami heart disease.

D. Lakukan identifikasi untuk mengetahui jenis nyeri dada yang paling banyak terjadi pada seseorang mengalami Heart desease

data <- read.csv("C:/Users/AJENG/OneDrive/Dokumen/FILE KULIAH/SEMESTER 4/PENGANTAR SAINS DATA/UTS PSD/Data heart.csv")

# Ubah cp menjadi faktor dengan label
data$cp <- factor(data$cp, 
                        levels = 0:3,
                        labels = c("Typical Angina", "Atypical Angina", "Non-anginal Pain", "Asymptomatic"))

# Filter data penderita heart disease
penderita_hd <- subset(data, target == 1)

# Buat tabel frekuensi jenis nyeri dada
table_cp <- table(penderita_hd$cp)

# Visualisasi
library(ggplot2)
ggplot(penderita_hd, aes(x = cp)) +
  geom_bar(fill = "pink", color = "maroon") +
  labs(title = "Jenis Nyeri Dada pada Penderita Heart Disease", 
       x = "Jenis Nyeri Dada", 
       y = "Jumlah") +
  theme_minimal()

INTEPRETASI

Gambar diatas menggambarkan distribusi jenis nyeri dada (chest pain) yang dialami oleh pasien yang teridentifikasi memiliki heart disease. Dari grafik tersebut, terlihat bahwa jenis nyeri dada yang paling sering dialami oleh penderita adalah Non-anginal pain, diikuti oleh Atypical angina dan Typical angina. Sementara itu, jumlah penderita heart disease yang tidak menunjukkan gejala nyeri dada (Asymptomatic) relatif paling sedikit. Hal ini menunjukkan bahwa gejala nyeri dada yang tidak khas atau bahkan bukan angina masih bisa menjadi indikasi adanya risiko penyakit jantung, dan penting untuk tetap dilakukan pemeriksaan lebih lanjut meskipun gejala tidak spesifik.

E. Buat visualisasi Bar plot proporsi heart desease terhadap variabel kategorikal cp, ca, dan thal. Interpretasikan.

library(ggplot2)

# Ubah target menjadi faktor dengan label
data$target <- factor(data$target, labels = c("Tidak", "Ya"))

# Plot 1: cp vs target
ggplot(data, aes(x = factor(cp), fill = target)) +
  geom_bar(position = "fill", color = "maroon") +
  scale_y_continuous(labels = scales::percent) +
  scale_fill_manual(values = c("Tidak" = "lightpink", "Ya" = "deeppink")) +
  labs(title = "Proporsi Heart Disease berdasarkan Jenis Nyeri Dada (cp)",
       x = "Tipe Nyeri Dada (cp)", y = "Proporsi", fill = "Heart Disease") +
  theme_minimal()

INTEPRETASI

Gambar diatas menunjukkan bahwa proporsi penderita penyakit jantung (Heart Disease) bervariasi tergantung pada jenis nyeri dada yang dialami. Pasien dengan jenis nyeri dada Atypical Angina dan Non-anginal Pain memiliki proporsi tertinggi menderita penyakit jantung, masing-masing lebih dari 80%. Sementara itu, pada pasien dengan nyeri dada Typical Angina, sebagian besar justru tidak menderita penyakit jantung, dengan proporsi penderita hanya sekitar 30%. Hal ini menunjukkan bahwa jenis nyeri dada dapat menjadi indikator penting dalam mendeteksi risiko penyakit jantung.

# Plot 2: ca vs target
ggplot(data, aes(x = factor(ca), fill = target)) +
  geom_bar(position = "fill", color = "deeppink") +
  scale_y_continuous(labels = scales::percent) +
  scale_fill_manual(values = c("Tidak" = "maroon", "Ya" = "lightpink")) +
  labs(title = "Proporsi Heart Disease berdasarkan Jumlah Pembuluh Darah (ca)",
       x = "Jumlah Pembuluh Darah (ca)", y = "Proporsi", fill = "Heart Disease") +
  theme_minimal()

INTEPRETASI

Gambar diatas menunjukkan hubungan antara jumlah pembuluh darah yang terlihat (ca) dengan keberadaan penyakit jantung. Pasien dengan jumlah pembuluh darah 0 dan 4 menunjukkan proporsi penderita penyakit jantung yang lebih rendah dibandingkan dengan jumlah pembuluh darah 1 hingga 3. Secara khusus, pasien dengan 2 pembuluh darah memiliki proporsi penderita penyakit jantung paling tinggi, yang dapat menunjukkan bahwa keberadaan sejumlah pembuluh darah tertentu berkorelasi dengan tingkat keparahan atau diagnosis penyakit jantung.

# Plot 3: thal vs target
ggplot(data, aes(x = factor(thal), fill = target)) +
  geom_bar(position = "fill", color = "lightpink") +
  scale_y_continuous(labels = scales::percent) +
  scale_fill_manual(values = c("Tidak" = "deeppink", "Ya" = "maroon")) +
  labs(title = "Proporsi Heart Disease berdasarkan Kondisi Thalassemia (thal)",
       x = "Tipe Thal (thal)", y = "Proporsi", fill = "Heart Disease") +
  theme_minimal()

INTEPRETASI

Gambar diatas menunjukkan distribusi penderita penyakit jantung berdasarkan tipe thalassemia. Pasien dengan tipe thalassemia 3 memiliki proporsi tertinggi menderita penyakit jantung, mendekati 100%, diikuti oleh tipe 1. Sebaliknya, pasien dengan tipe thalassemia 2 menunjukkan proporsi paling rendah sebagai penderita penyakit jantung, artinya sebagian besar pasien dengan tipe ini tidak mengidap penyakit jantung. Tipe 0 memperlihatkan distribusi yang hampir seimbang antara penderita dan bukan penderita. Dengan demikian, kondisi thalassemia juga tampak memiliki hubungan yang cukup kuat terhadap kemungkinan seseorang menderita penyakit jantung.

F. Lakukan eksplorasi untuk mengetahui arah hubungan antara variabel age dan thalach yang dibedakan untuk seseorang yang memiliki penyakit jantung dan tidak. Apakah hubungan itu linear atau non-linear? Bagaimana cara mengetahuinya?

# Melihat struktur data
str(data)
## 'data.frame':    303 obs. of  14 variables:
##  $ age     : int  63 37 41 56 57 57 56 44 52 57 ...
##  $ sex     : int  1 1 0 1 0 1 0 1 1 1 ...
##  $ cp      : Factor w/ 4 levels "Typical Angina",..: 4 3 2 2 1 1 2 2 3 3 ...
##  $ trestbps: int  145 130 130 120 120 140 140 120 172 150 ...
##  $ chol    : int  233 250 204 236 354 192 294 263 199 168 ...
##  $ fbs     : int  1 0 0 0 0 0 0 0 1 0 ...
##  $ restecg : int  0 1 0 1 1 1 0 1 1 1 ...
##  $ thalach : int  150 187 172 178 163 148 153 173 162 174 ...
##  $ exang   : int  0 0 0 0 1 0 0 0 0 0 ...
##  $ oldpeak : num  2.3 3.5 1.4 0.8 0.6 0.4 1.3 0 0.5 1.6 ...
##  $ slope   : int  0 0 2 2 2 1 1 2 2 2 ...
##  $ ca      : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ thal    : int  1 2 2 2 2 1 2 3 3 2 ...
##  $ target  : Factor w/ 2 levels "Tidak","Ya": 2 2 2 2 2 2 2 2 2 2 ...
# Ubah variabel target menjadi faktor (untuk membedakan penderita dan non-penderita)
data$target <- factor(data$target, labels = c("Tidak", "Ya"))

# Plot scatter plot dengan warna maroon & dusty pink
ggplot(data, aes(x = age, y = thalach, color = target)) +
  geom_point(alpha = 0.6) +
  geom_smooth(method = "lm", se = FALSE, linetype = "dashed") +
  geom_smooth(method = "loess", se = FALSE, linetype = "solid") +
  scale_color_manual(values = c("Tidak" = "#D8A7B1",  
                                "Ya" = "#800000")) + 
  labs(title = "Hubungan Age dan Thalach berdasarkan Status Penyakit Jantung",
       x = "Age",
       y = "Thalach (Maximum Heart Rate)",
       color = "Penyakit Jantung") +
  theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'
## `geom_smooth()` using formula = 'y ~ x'

INTEPRETASI

Eksplorasi hubungan antara variabel usia (age) dan detak jantung maksimum (thalach) yang dibedakan berdasarkan status penyakit jantung menunjukkan adanya pola hubungan yang non-linear. Pada gambar di atas, kita melihat bahwa untuk kedua kelompok baik penderita penyakit jantung (Ya) maupun yang tidak (Tidak) nilai thalach cenderung menurun seiring bertambahnya usia. Namun, pola penurunannya tidak membentuk garis lurus, melainkan mengikuti kurva yang mengindikasikan adanya hubungan non linear. Hal ini dapat diketahui dengan melihat garis smoothing (loess curve) pada visualisasi, yang memperlihatkan perubahan gradual yang tidak konstan dalam tren data. Dengan demikian, untuk menganalisis hubungan ini secara lebih akurat, metode analisis yang mempertimbangkan hubungan non-linear akan lebih sesuai.

G. Buat heatmap korelasi antar variabel yang berskala interval atau rasio kemudian interpretasukan hasil yang didapat

library(corrplot)

#Pilih hanya variabel numerik
numeric_vars <- data %>% select_if(is.numeric)

#Hitung matriks korelasi
cor_matrix <- cor(numeric_vars, use = "complete.obs")

#Visualisasi heatmap korelasi
corrplot(cor_matrix, method = "color", type = "upper", 
         tl.col = "black", tl.srt = 45, addCoef.col = "black", 
         number.cex = 0.7, col = colorRampPalette(c("red", "pink", "blue"))(200))

INTEPRETASI

Dari Heatmap diatas diperoleh beberapa hal yang dapat dilihat, yaitu :

H. Buat summary hasil analisis yang telah dilakukan. Menurut kalian apa apa saja hal-hal yang dapat mencegah penyakit jantung dan aspek apa saja yang merupakan indikasi penyakit jantung.

Ringkasan Hasil Analisis Data Kesehatan Jantung

Dari hasil eksplorasi terhadap data kesehatan jantung, diperoleh beberapa temuan penting sebagai berikut:

1.Pembersihan Data: Data tidak mengandung nilai yang hilang, dan duplikasi berhasil dihapus. Beberapa outlier terdeteksi, namun belum dihapus karena masih membutuhkan pertimbangan lebih lanjut.

2.Distribusi Jenis Kelamin: Penderita penyakit jantung didominasi oleh laki-laki dibandingkan perempuan.

3.Rentang Usia: Usia 50–60 tahun merupakan kelompok yang paling banyak mengalami penyakit jantung, sekaligus memiliki proporsi kadar gula darah >120 mg/dL yang lebih tinggi.

4.Kadar Gula Darah: Sebagian besar pasien jantung justru memiliki kadar gula darah ≤120 mg/dL, sehingga gula darah tinggi tidak tampak sebagai faktor dominan dalam dataset ini.

5.Jenis Nyeri Dada (cp): Mayoritas penderita berada pada kategori Asymptomatic, yang menunjukkan bahwa penyakit jantung dapat terjadi tanpa gejala khas seperti nyeri dada.

6.Jumlah Pembuluh Darah (ca): Proporsi penderita meningkat pada mereka dengan jumlah pembuluh darah yang terlihat lebih sedikit (khususnya ca = 0).

7.Kondisi Thalassemia (thal): Jenis Reversible Defect paling sering ditemukan pada penderita heart disease.

8.Korelasi Usia dan Thalach: Ditemukan hubungan negatif yang jelas antara usia dan denyut jantung maksimum—semakin tua seseorang, semakin rendah nilai thalach-nya.

9.Korelasi Variabel: Melalui visualisasi korelasi (heatmap), tampak adanya hubungan signifikan, seperti korelasi negatif antara usia dan thalach, serta korelasi positif antara nyeri dada dan thalach.

Rekomendasi Pencegahan Penyakit Jantung Berdasarkan hasil analisis di atas, berikut beberapa upaya pencegahan yang disarankan:

NO. 2 Dari data berikut, Buat diagram yang sama dengan contoh. Serta jelaskan maksud setiap dari bagian sintag tersebut. Kemudian interpretasikan

library(ggplot2)
library(scales)
## Warning: package 'scales' was built under R version 4.3.3
#Input Data
data <- data.frame(
  Konsumsi_GWh = c(10, 20, 30, 50, 70, 90, 40, 80, 120, 200, 300, 400,
                   15, 25, 35, 50, 70, 5, 10, 15, 20, 25, 30, 40),
  Biaya_per_kWh = c(1500, 1450, 1400, 1350, 1300, 1250, 1300, 1250, 1200, 1150, 1100, 1050,
                    1600, 1550, 1500, 1450, 1400, 1700, 1600, 1550, 1500, 1450, 1400, 1350),

  Konsumen = c(rep("Rumah Tangga", 6),
               rep("Industri", 6),
               rep("Kantor Pemerintah", 5),
               rep("UMKM", 7))
)

#VISUALISASI DATA
ggplot(data, aes(x = Konsumsi_GWh, y = Biaya_per_kWh, color = Konsumen)) +
  geom_point(size = 3) +
  geom_smooth(method = "lm", se = FALSE) +
  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"
  ) +
  scale_y_continuous(labels = label_number(suffix = " Rp", big.mark = ".", decimal.mark = ",")) +
  scale_x_log10(
    breaks = c(10, 30, 100, 300),
    labels = label_number(big.mark = ".", decimal.mark = ",")
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5, size = 14, face = "bold"),
    axis.title.x = element_text(size = 12),
    axis.title.y = element_text(size = 12),
    plot.caption = element_text(hjust = 1, size = 8, face = "italic"),
    legend.title = element_blank()
  )
## `geom_smooth()` using formula = 'y ~ x'

PENJELASAN SYNTAX

INTEPRETASI

Grafik yang dihasilkan menunjukkan pola hubungan antara tingkat konsumsi listrik (dalam GWh) dengan biaya per kWh untuk berbagai kategori konsumen. Secara umum, terlihat tren bahwa semakin tinggi konsumsi listrik, semakin rendah biaya per kWh yang dibayarkan oleh konsumen. Khusus untuk segmen rumah tangga, terlihat bahwa pengguna dengan konsumsi besar cenderung membayar tarif per kWh yang lebih rendah dibandingkan pengguna dengan konsumsi lebih kecil. Hal serupa tampak pada sektor industri, di mana konsumen besar mendapat tarif listrik yang lebih murah, yang kemungkinan disebabkan oleh insentif atau kebijakan tarif khusus dari pemerintah guna mendorong produktivitas dan efisiensi energi. Pada konsumen dari instansi pemerintah, tren ini juga tampak meskipun data pada segmen ini relatif terbatas, sehingga perlu kehati-hatian dalam menarik kesimpulan yang lebih luas. Untuk sektor UMKM, juga terlihat pola yang sama, di mana konsumsi yang lebih tinggi berkorelasi dengan biaya per kWh yang lebih rendah. Hal ini bisa menjadi indikasi adanya dukungan atau subsidi tarif untuk pelaku usaha kecil. Secara keseluruhan, grafik ini menunjukkan adanya hubungan negatif antara konsumsi dan biaya listrik per kWh di berbagai segmen konsumen. Ini mencerminkan kebijakan tarif yang berbasis pada volume konsumsi, yang meskipun menguntungkan konsumen besar, tetap perlu ditinjau ulang dari sisi keadilan dan efisiensi penggunaan energi.