Keterangan: Age : usia Jenis Kelamin : sex ChestPain : jenis nyeri dada (4 nilai) RestBP : tekanan darah Chol : Serum kolestoral dalam mg/dl Fbs : gula darah > 120 mg/dl RestECG : hasil elektrokardiografi (nilai 0,1,2) MaxHR : detak jantung maksimum tercapai ExAng : angina yang diinduksi olahraga Oldpeak : depresi yang disebabkan oleh olahraga Slope : kemiringan segmen ST Ca : jumlah pembuluh utama (0-3) yang diwarnai oleh flourosopy thal: 0 = biasa; 1 = cacat tetap; 2 = cacat reversibel AHD : Nama dan nomor jaminan sosial pasien baru-baru ini dihapus dari database, diganti dengan nilai dummy

Data Univariat

library(ggplot2) #untuk membuat visualisasi data yang fleksibel dan ekspresif.
## Warning: package 'ggplot2' was built under R version 4.2.2
library(dplyr) # untuk melakukan manipulasi data, seperti pemfilteran, pengelompokan, pengurutan, dan transformasi data dalam cara yang efisien.
## Warning: package 'dplyr' was built under R version 4.2.2
## 
## 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(readr) #untuk membaca dataset
## Warning: package 'readr' was built under R version 4.2.2
data <- read_csv("Heart.csv") #untuk membaca dataset
## New names:
## Rows: 303 Columns: 15
## ── Column specification
## ──────────────────────────────────────────────────────── Delimiter: "," chr
## (3): ChestPain, Thal, AHD dbl (12): ...1, Age, Sex, RestBP, Chol, Fbs, RestECG,
## MaxHR, ExAng, Oldpeak,...
## ℹ Use `spec()` to retrieve the full column specification for this data. ℹ
## Specify the column types or set `show_col_types = FALSE` to quiet this message.
## • `` -> `...1`
data #menampikan data
## # A tibble: 303 × 15
##     ...1   Age   Sex ChestPain    RestBP  Chol   Fbs RestECG MaxHR ExAng Oldpeak
##    <dbl> <dbl> <dbl> <chr>         <dbl> <dbl> <dbl>   <dbl> <dbl> <dbl>   <dbl>
##  1     1    63     1 typical         145   233     1       2   150     0     2.3
##  2     2    67     1 asymptomatic    160   286     0       2   108     1     1.5
##  3     3    67     1 asymptomatic    120   229     0       2   129     1     2.6
##  4     4    37     1 nonanginal      130   250     0       0   187     0     3.5
##  5     5    41     0 nontypical      130   204     0       2   172     0     1.4
##  6     6    56     1 nontypical      120   236     0       0   178     0     0.8
##  7     7    62     0 asymptomatic    140   268     0       2   160     0     3.6
##  8     8    57     0 asymptomatic    120   354     0       0   163     1     0.6
##  9     9    63     1 asymptomatic    130   254     0       2   147     0     1.4
## 10    10    53     1 asymptomatic    140   203     1       2   155     1     3.1
## # … with 293 more rows, and 4 more variables: Slope <dbl>, Ca <dbl>,
## #   Thal <chr>, AHD <chr>

Output diatas adalah data dengan menampilkan 10 baris awal. indeks dimulai dari 1-10.

  1. Tampilkan bar chart dari variabel ChestPain dengan menggunakan package ggplot2
ggplot(data, aes(x= ChestPain ))+ #data frame atau tibble yang akan digunakan untuk membuat plot, dan aes() adalah fungsi yang digunakan untuk mendefinisikan estetika (aesthetic mappings). Pada baris ini, kita menghubungkan variabel ChestPain dengan sumbu x dalam plot.
  geom_bar(fill="pink")+ #memberikan warna merah muda pada batang-batang grafik.
  labs(title= "Barchart of ChestPain", x="Chest Pain Level", y= "count" ) # menambahkan judul dan label sumbu ke plot.

Analisis: Output diatas adalah bar chart dari atribut Chest Pain dimana “asymptomatic” memiliki nilai tertinggi dibandingkan yang lain yaitu sekitar 140.

  1. Tampilkan bar chart seperti pada gambar diatas, ganti skala y dengan persentase
percentage = prop.table(table(data$ChestPain))*100 #menghitung proporsi dari setiap nilai dalam tabel frekuensi tersebut;menghitung jumlah masing-masing nilai yang ada dalam kolom ChestPain dari data frame data; mengalikan proporsi dengan 100 untuk mengubahnya menjadi persentase
data= data.frame(ChestPain= names(percentage), percentage= as.numeric(percentage)) # membuat data frame baru dengan dua kolom: "ChestPain" yang berisi nilai-nilai unik ChestPain dan "percentage" yang berisi persentase masing-masing nilai tersebut;mengubah vektor percentage menjadi tipe data numerik;mengambil nama-nilai dari vektor percentage, yang sesuai dengan nilai-nilai unik dalam kolom ChestPain
ggplot(data, aes(x= ChestPain, y= percentage))+ #pembuatan objek plot; data adalah data frame atau tibble yang akan digunakan untuk membuat plot; aes()  digunakan untuk mendefinisikan estetika (aesthetic mappings)
  geom_bar(stat= "identity", fill="pink")+ #Ini adalah baris kedua kode, di mana kita menambahkan geometri batang ke plot yang sudah ada;"identity" digunakan untuk memplot nilai-nilai dari variabel ; fill = "pink" untuk mengisi warna batang dengan "pink"
  scale_y_continuous(labels = scales:: percent_format(sacle=1))+ #mengatur skala pada sumbu y
  labs(title= "Barchart of ChestPain Percentage", y="Percentage", x="ChestPain") #untuk menambahkan judul dan label sumbu ke plot

Analisis: Ini adalah barchart dari atribut ChestPain bedasarka persentasenya dimana “asymptomatic” memiliki persentase > 4000%/

  1. Urutkan bar chart dari yang terkecil ke terbesar. Gunakan package dplyr dan ggplot
ggplot(data, aes(x = reorder(ChestPain, percentage), y = percentage)) + #pembuatan objek plot 
  geom_bar(stat = "identity", fill = "pink") + # untuk membuat grafik batang dan warna grafik batang
  labs(title = "Bar Chart Variabel ChestPain (Percentage) - Ordered") + #untuk menambahkan judul ke plot
  ylab("Persentase (%)") + #menambahkan label pada sumbu y
  xlab("ChestPain") # menambahkan label "Persentase (%)" pada sumbu y

Analisis:Setelah atribut diurutkan dari yang terkecil hingga terbesar, maka dimulai dari atribut “typical”, “nontypical”, “nonanginal”, dan “asymptomatic” sebagai atribut terbanyak dengan persentase > 40%.

  1. Berikan label dengan nilai numerik pada setiap chart, dengan mengurutkan dari presentase terbesar ke terkecil, pada sumbu X buat label miring dengan 45 derajat
ggplot(data, aes(x = reorder(ChestPain, percentage), y = percentage)) + #pembuatan objek plot
  geom_bar(stat = "identity", fill = "pink") + #untuk membuat grafik batang; untuk memplot nilai-nilai dari variabel ;untuk mengisi warna batang dengan "pink"
  labs(title = "Bar Chart dari Variabel ChestPain (Percentage, Ordered)", #untuk menambahkan judul dan label sumbu ke plot
       x = "ChestPain", #menambahkan label pada sumbu x
       y = "Persentase (%)") + #menambahkan label pada sumbu y
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) + #untuk mengatur teks label sumbu x agar miring sebesar 45 derajat dan posisinya disesuaikan dengan hjust = 1, sehingga tidak tumpang tindih
  geom_text(aes(label = sprintf("%.1f%%", percentage)), vjust = -0.5, size = 3) #menambahkan teks label persentase pada batang batang dalam grafik

Analisis: Output menunjukkan hasil dari barchart dari variabel ChestPain secara berurutan dari terkecil-terbesar dengan menampilkan persentasenya juga.

  1. Transpose sumbu x dan sumbu y
ggplot(data, aes(y = reorder(ChestPain, -percentage), x = percentage)) + # pembuatan objek plot
  geom_bar(stat = "identity", width = 0.7, fill = "pink") + #memplot nilai-nilai dari variabel;  mengisi warna batang dengan "pink" 
  labs(title = "Bar Chart Variabel ChestPain") + #menambahkan judul dan label sumbu ke plot.
  xlab("Percentage (%)") + #menambahkan label pada sumbu x
  ylab("ChestPain") + #menambahkan label pada sumbu y
  geom_text(aes(label = sprintf("%.1f%%", percentage)), hjust = -0.1, size = 4) #menambahkan teks label persentase pada batang batang dalam grafik

Analisis:Output adalah hasil dari transpose pada grafik sebelumnya dimana sumbu x ada di y dan juga sebaliknya.

  1. Buat pie chart berdasarkan Thal
pie(c(280,60,20),c('Thal'), #untuk membuat grafik pie;ektor yang berisi nilai-nilai yang akan digunakan untuk menggambarkan proporsi bagian-bagian dalam pie chart;vektor yang berisi nilai-nilai yang akan digunakan untuk menggambarkan proporsi bagian-bagian dalam pie chart
col=c('#0292D8','#F7EA39','#c432a2'),#untuk menentukan warna untuk masing-masing bagian dalam pie chart
init.angle = -50, border = NA) # untuk mengatur sudut awal (initial angle) dari pie chart;border = NA menghilangkan garis batas (border) antara bagian-bagian dalam pie chart.

Analisis: Output ini adalah pie chart dari atribut “Thal” dengan pembagian 280, 60, dan 20.

  1. Buat histogram berdasarkan Age
#ggplot(data = data, aes(x = "Age")) + #membuat objek plot
  #geom_histogram(binwidth = 5, fill = "grey", color = "pink") + #membuat histogram berdasarkan objek yang sudah ada
  #labs(x = "Age", y = "Frequency", title = "Histogram of Age") #membuat judul plot dengan x dan y sebagai isinya

Analisis: Ini adalah hostogram berdasarkan atribut “Age” atau umur. Error in geom_histogram(binwidth = 5, fill = “grey”, color = “red”) :

ℹ Error occurred in the 1st layer. Caused by error in setup_params(): ! stat_bin() requires a continuous x aesthetic ✖ the x aesthetic is discrete. ℹ Perhaps you want stat="count"?

  1. Buat histogram berdasarkan Age dimana sumbu y dalam persen
age_counts <- data %>% #menyimpan hasil perhitungan frekuensi data umur
  group_by("Age") %>% #mengelompokkan data berdasarkan variabel "Age"
  summarise(Frequency = n()) #untuk menghitung frekuensi (jumlah data) dalam setiap kelompok umur


total_count <- nrow(data) #Baris ini menghitung total jumlah baris (data) dalam data frame data dan menyimpannya dalam variabel total_count
age_counts <- age_counts %>%
  mutate(Percentage = (Frequency / total_count) * 100) #Baris ini melakukan perhitungan persentase frekuensi untuk setiap kelompok umur dalam age_counts yang telah dibuat sebelumnya
ggplot(age_counts, aes(x = "Age", y = Percentage)) + #pembuatan objek plot
  geom_bar(stat = "identity", fill = "pink") + #menambahkan geometri batang ke plot yang sudah ada;memplot nilai-nilai dari variabel "Percentage" langsung sebagai tinggi batang (tanpa menghitung frekuensi);mengisi warna batang dengan "pink"
  labs(title = "Histogram Berdasarkan Age (in Percent)", #membuat judul 
       x = "Age", #menambahkan label pada sumbu x dengan teks "Age"
       y = "Percentage (%)") #menambahkan label pada sumbu y dengan teks "Percentage (%)

Analisis: Ini adalah output histogram berdasarkan atribut “Age” dalam persentase persen.

  1. Buatlah diagram titik berdasarkan Age
plot(data$Age, main = "Diagram Titik Berdasarkan Age", xlab = "Age", ylab = "Nilai", pch = 19, col = "pink",  xlim = c(0, 1000), ylim= c(0, 10000))#data yang akan diplot di sumbu x;menambahkan label pada sumbu x dengan teks "Age"; menambahkan label pada sumbu y dengan teks "Nilai"; mengatur tipe simbol titik (marker) menjadi 19; mengatur warna titik menjadi merah muda

Analisis: Ini adalah diagram titik berdasrkan atribut “Age” dengan limit x=1000 dan limit y=10000.

Data Bivariat

Plot Variabel Kategorik Vs Kategorik Dataset yang digunakan “mpg” (Fuel Economy) dalam R

  1. Plot menggunakan diagram batang bertumpuk, hubungan antara kelas mobil dengan jenis penggerak ( roda depan, roda belakang, atau penggerak 4 roda). (gunakan package “ggplot2”)
data(mpg) #data dari mpg
ggplot(mpg, aes(x = class, fill = drv)) + #pembuatan objek plot; menghubungkan variabel "drv" (jenis penggerak) dengan pengisian warna batang 
  geom_bar(position = "fill") + #menambahkan geometri batang ke plot yang sudah ada;"fill" mengatur batang-batang menjadi bertumpuk, sehingga total tinggi setiap batang menjadi 1 (100%)
  labs(title = "
Stacked Bar Chart: Car Class vs. Drive Type", #membuat judul
       x = "Kelas Mobil", #menambahkan label pada sumbu x dengan teks "Kelas Mobil"
       y = "Proporsi", # menambahkan label pada sumbu y dengan teks "Proporsi"
       fill = "Jenis Penggerak") + # menambahkan label yang menjelaskan bahwa pengisian warna batang menggambarkan jenis penggerak
  theme_minimal() #mengatur tampilan plot menjadi minimalis. Ini mengubah tampilan latar belakang dan elemen-elemen lainnya dalam plot sesuai dengan tema minimalis ggplot2

Analisis: Output diatas adalah dilihat berdasarkan output jika suatu kelas mobil membunyai bantang yang lebih dominan dari suatu warna(jenis penggerak) menunjukkan bahwa jenis penggerak lebih umum dalam kelas mobil.

  1. Plot menggunakan diagram batang yang dikelompokkan, hubungan antara kelas mobil dengan jenis penggerak ( roda depan, roda belakang, atau penggerak 4 roda). (gunakan package “ggplot2”)
ggplot(mpg, aes(x = class, fill = drv)) + #pembuatan objek plot; drv menghubungkan variabel "drv" (jenis penggerak) dengan pengisian warna batang
  geom_bar(position = "dodge") + #mengatur batang-batang menjadi berkelompok secara berdampingan (grouped), sehingga kita dapat membandingkan jumlah mobil berdasarkan kelas dan jenis penggerak dengan mudah
  labs(title = "
Grouped Bar Chart: Car Class vs. Drive Type", #menambahkan judul plot
       x = "Kelas Mobil", #menambahkan label pada sumbu x dengan teks "Kelas Mobil"
       y = "Jumlah", #menambahkan label pada sumbu y dengan teks "Jumlah", yang mengindikasikan bahwa sumbu y akan menunjukkan jumlah mobil
       fill = "Jenis Penggerak") + #menambahkan label yang menjelaskan bahwa pengisian warna batang menggambarkan jenis penggerak
  theme_minimal() # untuk mengatur tampilan plot menjadi minimalis. Ini mengubah tampilan latar belakang dan elemen-elemen lainnya dalam plot sesuai dengan tema minimalis ggplot2

Analisis: Output diatas adalah bar chart yang berkelompok berdasarkan jenis penggerak yang digunakannya. Jenis penggerak 4(pink) dominan digunakan pada kendaraan pick up, jenis penggerak r(biru) dominan digunakan pada kendaraan 2 seater, dan jenis penggerak f(hijau) lebih dominan digunakan pada kendaraan minivan. jumlah setiap kategorinya juga ditampilkan pada chart diatas.

  1. Pada nomor 1, tambahkan persentasenya
mpg_counts <- mpg %>% #untuk menyimpan hasil perhitungan frekuensi data berdasarkan kelas mobil dan jenis penggerak
  group_by(class, drv) %>% #mengelompokkan data berdasarkan variabel "class" (kelas mobil) dan "drv" (jenis penggerak)
  summarize(count = n()) #menghitung frekuensi (jumlah data) untuk setiap kelompok kelas mobil dan jenis penggerak
## `summarise()` has grouped output by 'class'. You can override using the
## `.groups` argument.
mpg_counts <- mpg_counts %>% #menghitung persentase frekuensi data berdasarkan kelas mobil.
  group_by(class) %>% #mengelompokkan data berdasarkan variabel "class" (kelas mobil)
  mutate(percentage = (count / sum(count)) * 100) #menambahkan kolom "percentage" yang menghitung persentase frekuensi data kelas mobil dalam setiap kelompok kelas


ggplot(mpg_counts, aes(x = class, y = percentage, fill = drv)) + #memulai pembuatan objek plot
  geom_bar(stat = "identity") + #menambahkan geometri batang ke plot yang sudah ada;memplot nilai-nilai dari variabel "percentage" langsung sebagai tinggi batang
  labs(title = "Stacked Bar Chart: Car Class vs. Drive Type (with Percentage)", x = "Kelas Mobil", y = "Persentase (%)") + #menambahkan judul dan label sumbu ke plot
  scale_fill_brewer(palette = "Set3") + #mengatur palet warna yang digunakan dalam pengisian batang. Dalam hal ini, palet "Set3" digunakan untuk memberikan warna yang berbeda untuk jenis penggerak
  geom_text(aes(label = sprintf("%.1f%%", percentage)), position = position_stack(vjust = 0.5)) #Baris terakhir ini menambahkan teks label persentase pada batang-batang dalam plot;menambahkan label berupa persentase ke setiap batang dengan format yang ditentukan

Analisis: Output diatas adalah dilihat berdasarkan output jika suatu kelas mobil membunyai bantang yang lebih dominan dari suatu warna(jenis penggerak) menunjukkan bahwa jenis penggerak lebih umum dalam kelas mobil.Dalam stacked bar chart ini, ditambahkan persentasi agar memudahkan untuk mengetahui secara signifikan berapa persentasenya.

Plot Diagram Variabel Kontinu Vs Kontinu

Lakukan dot plot terhadap dataset “Salaries” antara pengalaman dengan gaji dari Professor PT

data(Salaries, package="carData") #dataset salaries dari package carData
head(Salaries) #menampilkan 5 baris pertama dari dataset
##        rank discipline yrs.since.phd yrs.service  sex salary
## 1      Prof          B            19          18 Male 139750
## 2      Prof          B            20          16 Male 173200
## 3  AsstProf          B             4           3 Male  79750
## 4      Prof          B            45          39 Male 115000
## 5      Prof          B            40          41 Male 141500
## 6 AssocProf          B             6           6 Male  97000

Analisis: Output diatas adalah isi dari dataset dengan menampilkan 5 baris pertama dengan indeks dimulai dari 1 hingga 6.

ggplot(Salaries, aes(x = rank, y = salary)) +
  geom_dotplot(binaxis = "y", stackdir = "center") +
  labs(x = "Jabatan Akademik", y = "Gaji") +
  ggtitle("Dot Plot: The Relationship between Experience and Univ. Professor Salary")
## Bin width defaults to 1/30 of the range of the data. Pick better value with
## `binwidth`.

Analisis: Output diatas adalah hasil dari hubungan antara pengalaman dan gaji dari profesor suatu universitas. hasilnya adalah jabatan akademik seseorang sangat mempengaruhi gajinya dengan assisten prof, assocdiate prof, dan profesor secara berurutan. Besar gaji dapat dilihat di sumbu x.

professor_data <- subset(Salaries, rank == "Professor") #Baris ini menghasilkan subset dari dataset Salaries yang hanya berisi data profesor (rank == "Professor") dan menyimpannya dalam objek professor_data. Fungsi subset() digunakan untuk memfilter baris yang memenuhi kondisi tertentu.

# Membuat dot plot
ggplot(subset(Salaries, rank == "Prof"), aes(x = yrs.service, y = salary)) + #pembuatan objek plot; subset lain dari dataset Salaries, yang khusus untuk profesor dengan menggunakan rank == "Prof"
  geom_point(fill="pink") +#menambahkan geometri titik (dot) ke plot yang sudah ada;mengisi warna titik dengan "pink"
  labs(
    title = "Dot Plot Experience vs. Experience Salary (Professor)",#menambahkan judul dan label sumbu ke plot
    x = "Experience (Years)",#menambahkan label pada sumbu x dengan teks "Experience (Years)"
    y = "Salary"#menambahkan label pada sumbu y dengan teks "Salary"
  )

Analisis: Output plot diatas adalah plot titik dengan membandingkan pengalaman vs gaji dari lama pengalaman(profesor) dengan sebarannya ditunjukkan pada dot blot diatas.

Plot Diagram Variabel Kategorik Vs Kontinu

  1. Lakukan barplot yang menampilkan gaji rata-rata Professor berdasarkan jabatan akademik
# Membuat barplot gaji rata-rata berdasarkan jabatan akademik
ggplot(Salaries, aes(x = rank, y = salary, fill = rank)) + #pembuatan objek plot
  geom_bar(stat = "summary", fun = "mean", position = "dodge") + #menambahkan geometri batang ke plot yang sudah ada;
  labs(title = "Barplot: Average Professor Salary based on Academic Position", #menambahkan judul dan label sumbu ke plot
       x = "Academic Position",#menambahkan label pada sumbu x dengan teks "Academic Position"
       y = "Average Salary") + #menambahkan label pada sumbu y dengan teks "Average Salary"
  scale_fill_manual(values = c("magenta", "orange", "pink")) +#untuk mengatur palet warna yang digunakan dalam pengisian batang. Dalam hal ini, kita secara manual mengatur warna batang untuk setiap kategori "rank" dengan menggunakan palet warna yang telah ditentukan.
  theme_minimal() #untuk mengatur tampilan plot menjadi minimalis. Ini mengubah tampilan latar belakang dan elemen-elemen lainnya dalam plot sesuai dengan tema minimalis ggplot2.

Analisis:Output dari barplot yang menampilkan gaji rata-rata Professor berdasarkan jabatan akademik dimana profesor memiliki gaji tertinggi diantara yang lain dengan >1e+65 debagai rata-rata gajinya.

  1. Lakukan boxplot yang menampilkan gaji rata-rata Professor berdasarkan jabatan akademik
ggplot(Salaries, aes(x = rank, y = salary, fill = rank)) +#pembuatan objek plot 
  geom_boxplot() + #menambahkan geometri boxplot ke plot yang sudah ada
  labs(title = "Boxplot: Average Professor Salary based on Academic Department",#menambahkan judul dan label sumbu ke plot
       x = "Academic Position",#menambahkan label pada sumbu x dengan teks "Academic Position"
       y = "Average Salary") + #menambahkan label pada sumbu y dengan teks "Average Salary"
  scale_fill_manual(values = c("magenta", "orange", "pink")) +#untuk mengatur palet warna yang digunakan dalam pengisian boxplot. Dalam hal ini, kita secara manual mengatur warna boxplot untuk setiap kategori "rank" dengan menggunakan palet warna yang telah ditentukan
  theme_minimal()# untuk mengatur tampilan plot menjadi minimalis. Ini mengubah tampilan latar belakang dan elemen-elemen lainnya dalam plot sesuai dengan tema minimalis ggplot2

Analisis: Output dari boxplot yang menampilkan gaji rata-rata Professor berdasarkan jabatan akademik dimana profesor memiliki gaji tertinggi diantara yang lain dengan >1e+65 debagai rata-rata gajinya. Ditunjukkan juga q1,q2, dan q3.