#Import data :

data<- read.csv("C:/Users/Lenovo/Downloads/heart.csv") # Membaca data
head(data) # Menampilkan 6 baris pertama dari 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) # Melihat struktur 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 ...
    1. Pengecekan data

✓ Nilai yang hilang (missing values)

# Load library
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
# Cek missing values
missing_values <- colSums(is.na(data))
print(missing_values)
##      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

Interpretasi missing value :

Dataset tidak memiliki nilai yang hilang (missing values) pada semua variabel, sehingga data siap untuk dianalisis tanpa perlu penanganan terhadap missing values.

✓ Data yang tercatat ganda (duplicate records)

# Cek duplicate records
duplicate_records <- duplicated(data)
sum(duplicate_records)
## [1] 1
# Jika ada, hapus duplicate records
data_cleaned <- data[!duplicated(data), ]

Interpretasi duplicated data :

Dataset awal mengandung 1 baris duplikat, yang telah dihapus untuk memastikan keunikan data dalam analisis selanjutnya.

✓ Nilai ekstrim (outlier) pada variabel numerik

# Visualisasi boxplot untuk mendeteksi outlier
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.4.3
library(rlang)
library(paletteer)
## Warning: package 'paletteer' was built under R version 4.4.3
numerical_vars <- c("age", "trestbps", "chol", "thalach", "oldpeak", "ca")

# Ambil 6 warna dari palet
warna_list <- as.character(paletteer_c("ggthemes::Blue-Green Sequential", 30)[c(5, 10, 15, 20, 25, 30)])

for (i in seq_along(numerical_vars)) {
  var <- numerical_vars[i]
  warna <- warna_list[i]

  p <- ggplot(data, aes(x = "", y = .data[[var]])) +
    geom_boxplot(fill = warna) +
    ggtitle(paste("Boxplot of", var)) +
    theme_minimal()
  print(p)
}

Interpretasi Boxplot (“age”, “trestbps”, “chol”, “thalach”, “oldpeak”, “ca”) :

  1. Boxplot usia (age) menunjukkan bahwa distribusi usia pasien cenderung berkumpul di sekitar rentang 45 hingga 60 tahun, dengan nilai median sekitar 55 tahun dan terdapat outlier pada usia yang lebih tinggi.

  2. Boxplot menunjukkan bahwa tekanan darah istirahat (trestbps) memiliki distribusi yang cenderung simetris dengan rentang antara 90 hingga 180 mm Hg, serta terdapat beberapa outlier di atas nilai maksimum biasa.

  3. Boxplot kadar kolesterol (chol) menunjukkan bahwa sebagian besar nilai berkumpul di rentang 200 hingga 400 mg/dL, dengan beberapa outlier yang memiliki nilai lebih tinggi.

  4. Boxplot menunjukkan bahwa detak jantung maksimum (thalach) memiliki distribusi yang cenderung berkumpul di sekitar rentang 140 hingga 180 bpm, dengan satu outlier yang sangat rendah.

  5. Boxplot menunjukkan bahwa nilai depresi ST (oldpeak) cenderung berkumpul di sekitar rentang 0 hingga 2, dengan beberapa outlier yang memiliki nilai lebih tinggi.

  6. Boxplot menunjukkan bahwa sebagian besar nilai (ca) berkumpul di angka 0, dengan beberapa outlier yang memiliki nilai lebih tinggi (1, 3, dan 4).

Jika ada masalah tersebut, lakukan penanganan yang sesuai. Jelaskan mengapa menggunakan penanganan tersebut. Setelah pembersihan data, lakukan analisis statistika deskriptif untuk semua variabel numberik.

# Statistik deskriptif untuk variabel numerik
summary_std <- data_cleaned %>%
  select(age, trestbps, chol, thalach, oldpeak, ca) %>%
  summary()

print(summary_std)
##       age           trestbps          chol          thalach     
##  Min.   :29.00   Min.   : 94.0   Min.   :126.0   Min.   : 71.0  
##  1st Qu.:48.00   1st Qu.:120.0   1st Qu.:211.0   1st Qu.:133.2  
##  Median :55.50   Median :130.0   Median :240.5   Median :152.5  
##  Mean   :54.42   Mean   :131.6   Mean   :246.5   Mean   :149.6  
##  3rd Qu.:61.00   3rd Qu.:140.0   3rd Qu.:274.8   3rd Qu.:166.0  
##  Max.   :77.00   Max.   :200.0   Max.   :564.0   Max.   :202.0  
##     oldpeak            ca        
##  Min.   :0.000   Min.   :0.0000  
##  1st Qu.:0.000   1st Qu.:0.0000  
##  Median :0.800   Median :0.0000  
##  Mean   :1.043   Mean   :0.7185  
##  3rd Qu.:1.600   3rd Qu.:1.0000  
##  Max.   :6.200   Max.   :4.0000

Interpretasi summary :

Dataset menunjukkan bahwa rata-rata pasien berusia 54 tahun, dengan tekanan darah istirahat sekitar 132 mm Hg, kadar kolesterol rata-rata 246 mg/dl, detak jantung maksimum rata-rata 150 bpm, depresi ST rata-rata 1.04, dan jumlah pembuluh darah utama yang diwarnai rata-rata 0.72.

  1. 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)
library(dplyr)
library(paletteer)

# Ambil 2 warna dari palet Red-Purple
warna_gender <- as.character(paletteer_c("ggthemes::Blue-Green Sequential", 30)[c(8, 24)])

# Plot Jenis kelamin dengan Penyakit jantung
gender_plot <- data %>%
  filter(target == 1) %>%
  ggplot(aes(x = factor(sex), fill = factor(sex), )) +
  geom_bar(binwidth = 5, color = "black", alpha = 0.8) +
  scale_x_discrete(labels = c("Perempuan", "Laki-laki")) +
  scale_fill_manual(
    values = warna_gender,
    labels = c("Perempuan", "Laki-laki")
  ) +
  labs(
    title = "Jenis Kelamin dengan Penyakit Jantung",
    x = "Jenis Kelamin (0 = Perempuan, 1 = Laki-laki)",
    y = "Jumlah Pasien",
    fill = "Jenis Kelamin"
  ) +
  theme_minimal()
## Warning in geom_bar(binwidth = 5, color = "black", alpha = 0.8): Ignoring
## unknown parameters: `binwidth`
print(gender_plot)

Interpretasi gender vs penyakit jantung :

Dari visualisasi bisa dilihat, jumlah pasien laki-laki dengan penyakit jantung lebih tinggi dibandingkan dengan pasien perempuan.

# Visualisasi usia dengan penyakit jantung
library(ggplot2)
library(dplyr)
library(paletteer)

# Ambil palet warna Red-Purple
warna_gradien <- as.character(paletteer_c("ggthemes::Blue-Green Sequential", 30))

# histogram Usia Paseien dengan Penyakit Jantung
age_plot <- data %>%
  filter(target == 1) %>%
  ggplot(aes(x = age)) +
  geom_histogram(aes(fill = ..count..), binwidth = 5, color = "black", alpha = 0.8) +
  scale_fill_gradientn(colors = warna_gradien) +
  labs(
    title = "Distribusi Usia Pasien dengan Penyakit Jantung",
    x = "Usia",
    y = "Jumlah Pasien",
    fill = "Jumlah"
  ) +
  theme_minimal()

print(age_plot)
## Warning: The dot-dot notation (`..count..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(count)` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

Interpretasi usia vs penyakit jantung :

Pasien dengan penyakit jantung cenderung berusia di antara 40 hingga 60 tahun, dengan jumlah pasien tertinggi terkonsentrasi pada rentang usia 50–55 tahun.

library(ggplot2)
library(dplyr)
library(paletteer)

# Ambil palet warna dari paletteer
warna_gradien <- as.character(paletteer_c("ggthemes::Blue-Green Sequential", 30))

# Visualisasi histogram usia dengan gula darah
fbs_plot <- data %>%
  filter(fbs == 1) %>%
  ggplot(aes(x = age)) +
  geom_histogram(aes(fill = ..count..), binwidth = 5, color = "black", alpha = 0.8) +
  scale_fill_gradientn(colors = warna_gradien) +  # INI YANG PENTING
  labs(title = "Distribusi Usia Pasien dengan Gula Darah > 120 mg/dl",
       x = "Usia",
       y = "Jumlah Pasien",
       fill = "Jumlah") +
  theme_minimal()

print(fbs_plot)

Interpretasi usia vs gula darah :

Pasien dengan gula darah puasa lebih dari 120 mg/dL cenderung berusia di antara 50 hingga 60 tahun, dengan jumlah pasien tertinggi terkonsentrasi pada rentang usia ini.

  1. Lakukan analisis untuk mengetahui, apakah kadar gula darah seseorang yang lebih besar dari 120 paling banyak mengalami Heart desease?
library(ggplot2)
library(dplyr)
library(paletteer)

# Ambil warna dari paletteer
warna_custom <- as.character(paletteer_c("ggthemes::Blue-Green Sequential", 30)[c(10, 25)])

# Analisis proporsi penyakit jantung berdasarkan fbs
prop_fbs <- data %>%
  group_by(fbs, target) %>%
  summarise(count = n(), .groups = 'drop') %>%
  mutate(prop = count / sum(count))

# Tampilkan hasil
print(prop_fbs)
## # A tibble: 4 × 4
##     fbs target count   prop
##   <int>  <int> <int>  <dbl>
## 1     0      0   116 0.383 
## 2     0      1   142 0.469 
## 3     1      0    22 0.0726
## 4     1      1    23 0.0759
# Visualisasi proporsi penyakit jantung berdasarkan fbs
ggplot(prop_fbs, aes(x = factor(fbs), y = prop, fill = factor(target))) +
  geom_bar(stat = "identity", position = "dodge", binwidth = 5, color = "black", alpha = 0.8) +
  scale_x_discrete(labels = c("≤ 120 mg/dl", "> 120 mg/dl")) +
  scale_fill_manual(
    values = warna_custom,
    labels = c("Tidak Ada Penyakit Jantung", "Ada Penyakit Jantung")
  ) +
  labs(title = "Proporsi Penyakit Jantung Berdasarkan Kadar Gula Darah",
       x = "Kadar Gula Darah Puasa (fbs)",
       y = "Proporsi Pasien",
       fill = "Status Penyakit Jantung") +
  theme_minimal()
## Warning in geom_bar(stat = "identity", position = "dodge", binwidth = 5, :
## Ignoring unknown parameters: `binwidth`

# Uji Hipotesis :
cont_table <- table(data$fbs, data$target)

# Uji Chi-Square
chi_test <- chisq.test(cont_table)
print(chi_test)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  cont_table
## X-squared = 0.10627, df = 1, p-value = 0.7444

Interpretasi gula darah vs penyakit jantung :

  1. Proporsi pasien dengan kadar gula darah puasa > 120 mg/dL (fbs = 1) yang mengalami penyakit jantung (target = 1) adalah 7,59%, sedikit lebih tinggi dibandingkan proporsi pasien tanpa penyakit jantung (target = 0) pada kelompok yang sama (fbs = 1).

  2. Dari visualisasi bar chart, Pasien dengan kadar gula darah puasa lebih tinggi (> 120 mg/dL) memiliki proporsi yang lebih besar untuk mengalami penyakit jantung dibandingkan pasien dengan kadar gula darah puasa ≤ 120 mg/dL.

  3. Uji Chi-Square menunjukkan bahwa tidak ada hubungan yang signifikan antara kadar gula darah puasa (fbs) dan kejadian penyakit jantung (target) karena nilai p-value = 0.7444, yang jauh lebih besar dari 0.05.

  1. Lakukan identifikasi untuk mengetahui jenis nyeri dada yang paling banyak terjadi pada seseorang mengalami Heart desease
library(ggplot2)
library(dplyr)
library(paletteer)

# Ambil 4 warna dari palette Blue-Green Sequential
warna_cp <- as.character(paletteer_c("ggthemes::Blue-Green Sequential", 30)[c(5, 10, 20, 28)])

# Filter data untuk pasien dengan penyakit jantung (target = 1)
heart_disease_data <- data %>%
  filter(target == 1)

# Hitung frekuensi jenis nyeri dada
cp_frequency <- heart_disease_data %>%
  group_by(cp) %>%
  summarise(count = n()) %>%
  mutate(proportion = count / sum(count))

# Tampilkan hasil
print(cp_frequency)
## # A tibble: 4 × 3
##      cp count proportion
##   <int> <int>      <dbl>
## 1     0    39     0.236 
## 2     1    41     0.248 
## 3     2    69     0.418 
## 4     3    16     0.0970
# Visualisasi frekuensi jenis nyeri dada
ggplot(cp_frequency, aes(x = factor(cp), y = count, fill = factor(cp))) +
  geom_bar(stat = "identity", binwidth = 5, color = "black", alpha = 0.8) +
  scale_x_discrete(labels = c("0" = "Asymptomatic",
                              "1" = "Typical Angina",
                              "2" = "Atypical Angina",
                              "3" = "Non-Anginal Pain")) +
  scale_fill_manual(
    values = warna_cp,
    labels = c("Asymptomatic", "Typical Angina", "Atypical Angina", "Non-Anginal Pain")
  ) +
  labs(title = "Frekuensi Jenis Nyeri Dada pada Pasien dengan Penyakit Jantung",
       x = "Jenis Nyeri Dada",
       y = "Jumlah Pasien",
       fill = "Jenis Nyeri Dada") +
  theme_minimal()
## Warning in geom_bar(stat = "identity", binwidth = 5, color = "black", alpha =
## 0.8): Ignoring unknown parameters: `binwidth`

Interpretasi nyeri dada vs penyakit jantung :

  1. Jenis nyeri dada 2 (Atypical angina) merupakan tipe yang paling sering terjadi pada pasien dengan penyakit jantung, dengan proporsi sebesar 41,8%, diikuti oleh nyeri dada tipe 1 (Typical angina) dan tipe 0 (Asymptomatic).

  2. Pada visualisai, Jenis nyeri dada Atypical Angina adalah yang paling sering terjadi pada pasien dengan penyakit jantung, diikuti oleh Typical Angina, Asymptomatic, dan Non-Anginal Pain.

  1. Buat visualisasi Bar plot proporsi heart desease terhadap variabel kategorikal cp, ca, dan thal. Interpretasikan.
library(ggplot2)
library(dplyr)
library(paletteer)

# Fungsi untuk menghitung proporsi penyakit jantung
calculate_proportion <- function(data, variable) {
  data %>%
    group_by({{ variable }}, target) %>%
    summarise(count = n(), .groups = 'drop') %>%
    mutate(prop = count / sum(count)) %>%
    filter(target == 1) # Hanya target = 1
}

# Hitung proporsi
cp_prop <- calculate_proportion(data, cp)
ca_prop <- calculate_proportion(data, ca)
thal_prop <- calculate_proportion(data, thal)

# Ambil warna dari palette
warna_cp <- as.character(paletteer_c("ggthemes::Blue-Green Sequential", 30)[c(5, 10, 20, 28)])
warna_ca <- as.character(paletteer_c("ggthemes::Blue-Green Sequential", 30)[c(4, 10, 15, 22, 28)]) # untuk ca = 0-4
warna_thal <- as.character(paletteer_c("ggthemes::Blue-Green Sequential", 30)[c(6, 12, 20, 28)])

# Plot untuk cp
ggplot(cp_prop, aes(x = factor(cp), y = prop, fill = factor(cp))) +
  geom_bar(stat = "identity", color = "black", alpha = 0.8) +
  scale_x_discrete(labels = c("0" = "Asymptomatic", 
                              "1" = "Typical Angina", 
                              "2" = "Atypical Angina", 
                              "3" = "Non-Anginal Pain")) +
  scale_fill_manual(values = warna_cp,
                    labels = c("Asymptomatic", "Typical Angina", "Atypical Angina", "Non-Anginal Pain")) +
  labs(title = "Proporsi Penyakit Jantung terhadap Jenis Nyeri Dada (cp)",
       x = "Jenis Nyeri Dada",
       y = "Proporsi Pasien dengan Penyakit Jantung",
       fill = "Jenis Nyeri Dada") +
  theme_minimal()

# Plot untuk ca
ggplot(ca_prop, aes(x = factor(ca), y = prop, fill = factor(ca))) +
  geom_bar(stat = "identity", color = "black", alpha = 0.8) +
  scale_fill_manual(values = warna_ca) +
  labs(title = "Proporsi Penyakit Jantung terhadap Jumlah Pembuluh Darah Utama (ca)",
       x = "Jumlah Pembuluh Darah Utama",
       y = "Proporsi Pasien dengan Penyakit Jantung",
       fill = "Jumlah Pembuluh Darah Utama") +
  theme_minimal()

# Plot untuk thal
ggplot(thal_prop, aes(x = factor(thal), y = prop, fill = factor(thal))) +
  geom_bar(stat = "identity", color = "black", alpha = 0.8) +
  scale_fill_manual(values = warna_thal) +
  labs(title = "Proporsi Penyakit Jantung terhadap Hasil Tes Thalium (thal)",
       x = "Hasil Tes Thalium",
       y = "Proporsi Pasien dengan Penyakit Jantung",
       fill = "Hasil Tes Thalium") +
  theme_minimal()

Interpretasi nyeri dada vs cp, ca, dan thal :

  1. Jenis nyeri dada (cp) Atypical Angina memiliki proporsi pasien dengan penyakit jantung tertinggi dibandingkan jenis nyeri dada lainnya, diikuti oleh Typical Angina, Asymptomatic, dan Non-Anginal Pain.

  2. Pasien dengan 0 pembuluh darah utama yang diwarnai (ca) memiliki proporsi terbesar untuk mengalami penyakit jantung, sementara pasien dengan jumlah pembuluh darah utama yang lebih tinggi (1–4) memiliki proporsi yang lebih rendah.

  3. Hasil tes thalium (thal) 2 memiliki proporsi pasien dengan penyakit jantung tertinggi, diikuti oleh hasil tes thalium 3, sementara hasil tes thalium 0 dan 1 memiliki proporsi yang sangat rendah.

  1. 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?
# Scatter plot untuk melihat hubungan antara age dan thalach
ggplot(data, aes(x = age, y = thalach, color = factor(target))) +
  geom_point(alpha = 0.7) + # Titik transparan agar lebih mudah dilihat
  geom_smooth(method = "lm", se = FALSE, aes(color = factor(target))) + # Garis regresi linear
  scale_color_manual(values = c("#61B98C", "#006067"), labels = c("Tanpa Penyakit Jantung", "Dengan Penyakit Jantung")) +
  labs(title = "Hubungan antara Usia (age) dan Detak Jantung Maksimum (thalach)",
       x = "Usia (age)",
       y = "Detak Jantung Maksimum (thalach)",
       color = "Status Penyakit Jantung") +
  theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'

# Filter data berdasarkan target
data_with_disease <- data %>% filter(target == 1)
data_without_disease <- data %>% filter(target == 0)

# Hitung korelasi Pearson
cor_with_disease <- cor(data_with_disease$age, data_with_disease$thalach, method = "pearson")
cor_without_disease <- cor(data_without_disease$age, data_without_disease$thalach, method = "pearson")

# Tampilkan hasil
cat("Korelasi Pearson (Dengan Penyakit Jantung):", cor_with_disease, "\n")
## Korelasi Pearson (Dengan Penyakit Jantung): -0.5258007
cat("Korelasi Pearson (Tanpa Penyakit Jantung):", cor_without_disease, "\n")
## Korelasi Pearson (Tanpa Penyakit Jantung): -0.1327507

Interpretasi usia vs detak jantung maksimum :

  1. Ada hubungan negatif linear antara usia (age) dan detak jantung maksimum (thalach), dengan pasien yang memiliki penyakit jantung menunjukkan hubungan yang lebih kuat dibandingkan pasien tanpa penyakit jantung. Hubungan ini dapat dilihat dari garis regresi yang lurus pada grafik, serta didukung oleh nilai korelasi Pearson yang menunjukkan hubungan negatif.

  2. Ada hubungan negatif yang moderat dan signifikan antara usia (age) dan detak jantung maksimum (thalach) pada pasien dengan penyakit jantung, di mana semakin tua usia pasien, semakin rendah detak jantung maksimumnya.

  3. Ada hubungan negatif yang lemah antara usia (age) dan detak jantung maksimum (thalach) pada pasien tanpa penyakit jantung, yang menunjukkan bahwa semakin tua usia pasien, detak jantung maksimumnya cenderung sedikit lebih rendah, namun hubungan ini tidak terlalu kuat.

  1. Buat heatmap korelasi antar variabel yang berskala interval atau rasio kemudian interpretasukan hasil yang didapat
# Load libraries
library(dplyr)
library(ggplot2)
library(reshape2)
## Warning: package 'reshape2' was built under R version 4.4.3
library(ggcorrplot)
## Warning: package 'ggcorrplot' was built under R version 4.4.3
library(paletteer)

# Pilih variabel numerik
numerical_data <- data %>%
  select(age, trestbps, chol, thalach, oldpeak)

# Hitung matriks korelasi Pearson
cor_matrix <- cor(numerical_data, method = "pearson")

# Ambil 3 warna dari palet kontinyu
warna_korelasi <- as.character(paletteer_c("ggthemes::Blue-Green Sequential", 30)[c(1, 15, 30)])

# Visualisasi heatmap korelasi
ggcorrplot(cor_matrix, 
           hc.order = TRUE,
           type = "lower",
           lab = TRUE,
           colors = warna_korelasi,
           outline.color = "black",  # Garis untuk setiap kotak
           title = "Heatmap Korelasi Antar Variabel Numerik",
           ggtheme = theme_minimal())

Interpretasi nyeri dada vs penyakit jantung :

Heatmap memnunjukkan ada hubungan negatif moderat antara detak jantung maksimum (thalach) dan tekanan darah istirahat (trestbps), serta positif lemah antara usia (age) dan tekanan darah istirahat (Trestbps), sementara hubungan lainnya cenderung sangat lemah atau hampir tidak ada.

  1. Dari data berikut, Buat diagram yang sama dengan contoh. Serta jelaskan maksud setiap dari bagian sintag tersebut. Kemudian interpretasikan.
# Load library
library(ggplot2)

# Membuat dataframe dari data tabel
data <- data.frame(
  No = 1:24,
  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))
)

ggplot(data, aes(x = Konsumsi_GWh, y = Biaya_per_kWh, color = Konsumen)) +
  geom_point(size = 2) +
  geom_smooth(method = "lm", se = FALSE, linewidth = 1) +
  scale_x_log10() +
  scale_y_continuous(labels = function(x) paste0(format(x, big.mark = "."), " Rp")) +
  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",
    color = "Konsumen"  # <––– ini penting untuk munculin label legend
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(face = "bold"),
    legend.position = "right"
  )
## `geom_smooth()` using formula = 'y ~ x'
## Warning in prettyNum(.Internal(format(x, trim, digits, nsmall, width, 3L, :
## 'big.mark' and 'decimal.mark' are both '.', which could be confusing

Interpretasi Biaya Listrik vs Konsumsi Listrik :

Grafik ini menunjukkan bahwa semakin besar total konsumsi listrik, semakin rendah biaya listrik per kWh untuk semua kelompok konsumen. Namun, Industri dan UMKM mendapatkan manfaat terbesar dari penurunan biaya, sementara Kantor Pemerintah dan Rumah Tangga memiliki biaya yang lebih rendah pada level konsumsi rendah tetapi penurunan biayanya lebih lambat. Skema ini dirancang untuk memberikan insentif kepada konsumen dengan konsumsi tinggi untuk meningkatkan efisiensi energi dan produktivitas.