Visualisasi Data

Penyajian data (data visualization) merupakan bentuk pengemasan suatu data secara visual sedemikian sehingga data lebih mudah dipahami. Penyajian data bisa dilakukan dalam bentuk tabel, diagram, maupun grafik.

Penyajian data yang baik:

Visualisasi data adalah langkah penting dalam analisis data karena membantu dalam memahami, menganalisis, dan menyampaikan informasi secara efektif. Di R, fungsi dasar untuk membuat grafik adalah plot(). Fungsi ini sangat fleksibel dan dapat digunakan untuk membuat berbagai jenis plot, mulai dari scatter plot sederhana hingga plot yang lebih kompleks.

Fungsi plot() adalah fungsi dasar di R untuk membuat grafik 2D. Grafik yang dihasilkan bisa berupa scatter plot, line plot, bar plot, dan lain-lain, tergantung pada parameter yang digunakan.

Format:

plot(x, y, type = "p", main = "Judul Plot", xlab = "Label X", ylab = "Label Y", ...)

dimana:

Plot Dasar

Scatter Plot (Plot Titik)

Scatter plot digunakan untuk menunjukkan hubungan antara dua variabel numerik.

# Data contoh
x <- 1:10
y <- c(2, 3, 5, 7, 11, 13, 17, 19, 23, 29)

# Membuat scatter plot dasar
plot(x, y, main = "Scatter Plot Dasar", xlab = "X", ylab = "Y", pch = 19, col = "blue")

Terdapat parameter pch yang mengatur tipe simbol menjadi lingkaran penuh, dan col yang mengatur warna titik menjadi biru.

plot(
    1:10,
    main = "Grafik Saya", xlab = "sumbu-X",
    ylab = "sumbu-Y",
    col = "red", # warna titik
    cex = 2, # size titik, 1 default, 0.5 setengahnya, 2 berarti 2x
    pch = 25, # bentuk titik, dari 0-25 (silahkan dieksplor)
)

Line Plot (Plot Garis)

Line plot digunakan untuk menunjukkan tren atau perubahan data seiring waktu.

# Membuat line plot
plot(x, y, type = "l", main = "Line Plot Dasar", xlab = "X", ylab = "Y", col = "red", lwd = 2)

Terdapat parameter lwd yang mengatur ketebalan garis, type mengatur jenis plot menjadi garis, dan col mengatur warna garis menjadi merah.

Tipe Plot sendiri bisa kita ubah tergantung daripada kebutuhannya. Beberapa tipe plot yang umum digunakan.

  • type = "p" : Scatter plot (default)
  • type = "l" : Line plot
  • type = "b" : Plot dengan garis dan titik
  • type = "o" : Garis dan titik saling overlap
  • type = "h" : Histogram
  • type = "s" : Step plot
plot(x, y, type = "b", main = "Poin dan Garis Gabungan", xlab = "X", ylab = "Y", pch = 16, col = "darkgreen", lty = 2)

Terdapat parameter baru, yaitu lty yang merupakan tipe garis putus-putus.

  • 0 tidak ada line
  • 1 solid line
  • 2 dashed line
  • 3 dotted line
  • 4 dot dashed line
  • 5 long dashed line
  • 6 two dashed line

Kita bisa menambahkan beberapa data pada plot yang sama menggunakan fungsi lines() atau points().

# Membuat plot pertama
plot(x, y, type = "l", col = "blue")

# Menambahkan garis lain
lines(x, y + 2, col = "red")

# Membuat plot pertama
plot(x, y, type = "p", col = "blue")

# Menambahkan titik lain
points(x, y + 2, col = "red", pch = 19)

Scatter Plot bisa juga untuk perbandingan.

# hari pertama, usia dan kecepatan 12 mobil:
x1 <- c(5, 7, 8, 7, 2, 2, 9, 4, 11, 12, 9, 6)
y1 <- c(99, 86, 87, 88, 111, 103, 87, 94, 78, 77, 85, 86)

# hari kedua, usia dan kecepatan 15 mobil:
x2 <- c(2, 2, 8, 1, 15, 8, 12, 9, 7, 3, 11, 4, 7, 14, 12)
y2 <- c(100, 105, 84, 105, 90, 99, 90, 95, 94, 100, 79, 112, 91, 80, 85)

plot(x1, y1,
    main = "Pengamatan Mobil",
    xlab = "Usia",
    ylab = "Kecepatan",
    col = "red",
    cex = 2
)
points(x2, y2,
    col = "blue",
    cex = 2
)

Plot Baris (Bar Plot)

Berikut ini adalah contoh sederhana pembuatan bar plot.

# x-axis values
x <- c("A", "B", "C", "D")

# y-axis values
y <- c(2, 4, 6, 8)

# Bisa menempatkan label di tiap bar
barplot(y, names.arg = x)

# Bisa mengatur lebar bar
barplot(y, names.arg = x, width = 0.5)

barplot(y, names.arg = x, width = c(1, 2, 3, 4)) # lebar setiap bar berbeda

# Bisa mengatur posisi label
barplot(y, names.arg = x, width = 0.5, horiz = TRUE)

# Bisa mengatur warna bar
barplot(y, names.arg = x, width = 0.5, col = "blue")

# Density atau bar texture
barplot(y, names.arg = x, density = 10)

# Bisa mengatur title
barplot(y,
    names.arg = x,
    width = 0.5,
    col = "blue",
    main = "Contoh Grafik Bar"
)

Contoh lain misalkan memanfaatkan dataset yang ada di dalam R, yaitu mtcars.

# Data frekuensi
counts <- table(mtcars$gear)

# Membuat bar plot
barplot(
  counts, 
  main = "Frekuensi Gear pada mtcars", 
  xlab = "Jumlah Gear", 
  ylab = "Frekuensi", 
  col = "cyan")

Pie Chart

Pie chart merupakan plot lingkaran yang digunakan untuk menampilkan data dalam bentuk proporsi berdasarkan bagian-bagian lingkaran, dengan masing-masing mencerminkan persentase dari keseluruhan.

x <- c(10, 20, 30, 40)
pie(x)

# Pie pertama akan mulai pada 90 derajat
pie(x, init.angle = 90)

# Tambahkan label dan header
mylabels <- c("Apel", "Pisang", "Semangka", "Kurma")
pie(x, labels = mylabels, main = "Buah-buahan")

# Bisa tambahkan warna
mycolors <- c("blue", "yellow", "green", "black")
pie(x, labels = mylabels, main = "Buah-buahan", col = mycolors)

# Bisa tambahkan legenda
# bottomright, bottom, bottomleft, left, topleft, top, topright, right, center
legend("bottomright", mylabels, cex = 0.8, fill = mycolors)

Histogram

Histogram digunakan untuk menampilkan distribusi frekuensi data numerik.

# Data contoh
data <- rnorm(100, mean = 50, sd = 10)

# Membuat histogram
hist(data, main = "Histogram Distribusi Data", xlab = "Nilai", ylab = "Frekuensi", col = "lightblue", border = "black")

Boxplot

Boxplot digunakan untuk menggambarkan distribusi data dan mendeteksi outlier.

# Membuat boxplot
boxplot(mtcars$mpg, main = "Boxplot MPG pada mtcars", ylab = "Miles Per Gallon", col = "orange")

Plot kategori dengan factor

# Data kategoris
education <- factor(c("SMA", "Sarjana", "Magister", "Doktoral", "Sarjana", "Doktoral"))

# Membuat plot kategori
plot(education)

Kustomisasi Plot

Fungsi plot() menyediakan banyak opsi untuk menyesuaikan tampilan plot Anda. Berikut adalah beberapa parameter yang sering digunakan:

Selain itu, untuk menampilkan beberapa grafik dalam satu jendela, kita bisa menggunakan fungsi par() dengan parameter mfrow atau mfcol. Ada juga kita bisa mengatur skala dari sumbu X dan Y menggunakan parameter xlim dan ylim.

Contoh plot yang sudah dikostumisasi:

x  <- 1:10
y1 <- seq(2, 20, by = 2)
y2 <- c(3, 5, 7, 9, 11, 13, 15, 17, 19, 21)

# Membuat plot pertama
plot(x, y1, type = "b", col = "blue", pch = 19, ylim = c(0, 25), main = "Plot dengan Legenda", xlab = "X", ylab = "Y")
# Menambahkan plot kedua
lines(x, y2, type = "b", col = "green", pch = 17)
# Menambahkan legenda
legend("topleft", legend = c("Y1", "Y2"), col = c("blue", "green"), pch = c(19, 17), lty = 1)

# Menampilkan 2 plot dalam 1 jendela (2 baris, 1 kolom)
par(mfrow = c(2, 1))

# Plot pertama
plot(x, y1, type = "b", col = "red", pch = 19, ylim = c(0, 25), main = "Plot 1", xlab = "X", ylab = "Y1")

# Plot kedua
x2 <- c("A", "B", "C", "D", "E", "F", "G", "H", "I", "J")

barplot(y1,
    names.arg = x2,
    width = 0.5,
    col = "yellow",
    main = "Plot 2"
)

Plot dengan Data Frame

Kita dapat membuat plot langsung dari data frame, yang memudahkan dalam visualisasi data yang terstruktur.

# Menggunakan dataset mtcars
data(mtcars)

# Scatter plot mpg vs hp
plot(mtcars$hp, mtcars$mpg, main = "MPG vs Horsepower", xlab = "Horsepower (hp)", ylab = "Miles Per Gallon (mpg)", pch = 16, col = "darkgreen")

Kita juga bisa menggunakan formula untuk menyederhanakan kode plot di atas dengan formula interface.

# Scatter plot dengan formula
plot(mpg ~ hp, data = mtcars, main = "MPG vs Horsepower", xlab = "Horsepower (hp)", ylab = "Miles Per Gallon (mpg)", pch = 18, col = "brown")

Biasanya, setelah kita membuat grafik, kita ingin menyimpan plot tersebut ke dalam bentuk file (png, jpeg, atau pdf).

Menyimpan ke dalam PNG

# Membuka perangkat PNG
png("scatter_plot.png", width = 800, height = 600)

# Membuat plot
plot(x, y1, main = "Scatter Plot PNG", xlab = "X", ylab = "Y", pch = 20, col = "navy")

# Menutup perangkat
dev.off()
## png 
##   2

** Menyimpan ke dalam pdf**

# Membuka perangkat PDF
pdf("line_plot.pdf", width = 8, height = 6)

# Membuat plot
plot(x, y2, type = "l", main = "Line Plot PDF", xlab = "X", ylab = "Y", col = "maroon", lwd = 2)

# Menutup perangkat
dev.off()
## png 
##   2

Penggunaan Multi-plot dalam satu grafik

Seperti yang sudah dicontohkan di atas bahwa dengan menggunakan par() kita dapat menampilkan beberapa plot dalam satu jendela grafik.

# Mengatur layout menjadi 2 baris dan 2 kolom
par(mfrow = c(2, 2))

# Plot 1: Scatter Plot
plot(x, y1, main = "Scatter Plot", xlab = "X", ylab = "Y1", pch = 16, col = "blue")

# Plot 2: Line Plot
plot(x, y2, type = "l", main = "Line Plot", xlab = "X", ylab = "Y2", col = "red", lwd = 2)

# Plot 3: Bar Plot
barplot(counts, main = "Bar Plot", xlab = "Gear", ylab = "Frequency", col = "cyan")

# Plot 4: Boxplot
boxplot(mtcars$mpg, main = "Boxplot MPG", ylab = "Miles Per Gallon", col = "orange")

# Mengembalikan layout ke default
par(mfrow = c(1, 1))

Dataset bawaan R, yaitu mtcars dapat digunakan sebagai bahan untuk pembuatan grafik multi-plot yang mencakup berbagai jenis plot. Dataset mtcars adalah dataset klasik di R yang berisi data spesifikasi teknis dari 32 mobil seperti konsumsi bahan bakar, jumlah silinder, tenaga, berat, dan lain-lain.

Tujuan dari multi-plot ini adalah

# Mengatur layout menjadi 2 baris dan 2 kolom
par(mfrow = c(2, 2), mar = c(4, 4, 2, 1), oma = c(0, 0, 2, 0))

# Scatter Plot: Hubungan antara tenaga kuda dan konsumsi bahan bakar
plot(mtcars$hp, mtcars$mpg,
     main = "HP vs MPG",
     xlab = "Horsepower (HP)",
     ylab = "Miles Per Gallon (MPG)",
     pch = 19,
     col = "darkblue")
abline(lm(mpg ~ hp, data = mtcars), col = "red", lwd = 2)  # Menambahkan garis regresi

# Boxplot: Distribusi MPG berdasarkan jumlah silinder
boxplot(mpg ~ cyl, data = mtcars,
        main = "MPG by Cylinders",
        xlab = "Cylinders",
        ylab = "MPG",
        col = c("lightgreen", "lightblue", "lightpink"))

# Histogram: Distribusi tenaga kuda
hist(mtcars$hp,
     main = "Distribution of Horsepower",
     xlab = "Horsepower",
     ylab = "Frequency",
     col = "lightgray",
     border = "black",
     breaks = 10)

# Bar Plot: Jumlah mobil berdasarkan transmisi (0 = Automatic, 1 = Manual)
barplot(table(mtcars$am),
        main = "Number of Cars by Transmission",
        xlab = "Transmission (0 = Automatic, 1 = Manual)",
        ylab = "Number of Cars",
        col = c("orange", "purple"),
        names.arg = c("Automatic", "Manual"))

# Menambahkan judul keseluruhan untuk semua plot
mtext("Analysis of mtcars Dataset", outer = TRUE, cex = 1.5)

Penjelasan:

  1. Scatter Plot (HP vs MPG)
    • Menunjukkan hubungan antara tenaga kuda (hp) dan konsumsi bahan bakar (mpg).
    • Garis regresi linear ditambahkan untuk memperlihatkan tren umum.
  2. Boxplot (MPG by Cylinders)
    • Menunjukkan distribusi mpg untuk setiap kelompok jumlah silinder (cyl).
    • Warna digunakan untuk membedakan jumlah silinder yang berbeda.
  3. Histogram (Distribution of Horsepower)
    • Menampilkan distribusi frekuensi tenaga kuda (hp) di seluruh dataset.
  4. Bar plot (Number of cars by transmission)
    • Menggambarkan jumlah mobil berdasarkan jenis transmisi (am).
    • Nama sumbu X disesuaikan agar lebih informatif.
  5. mtext(): Menambahkan judul keseluruhan untuk semua plot dalam multi-plot.
  6. par(mfrow = c(2, 2)) digunakan untuk mengatur layout grafik menjadi 2 baris 2 kolom
  7. mar = c(4, 4, 2, 1) mengatur margin untuk masing-masing subplot
  8. oma = c(0, 0, 2, 0) mengatur margin luar (outer margin area) untuk keseluruhan plot yang memungkinkan penambahan judul utama di luar area plot.

Contoh lain penggunaan multi-plot

Di sini kita coba menggunakan contoh data keuangan di beberapa satuan kerja (satker) dimana datanya ada nama satker, nama kegiatan, nama akun, target, dan realisasi. Dari data tersebut, ada 4 analisis yang akan dibangun, yaitu:

  1. Perbandingan Target vs Realisasi per Satker (Bar Plot)
  2. Total Realisasi per Kegiatan (Bar Plot)
  3. Distribusi Realisasi Anggaran per Akun (Boxplot)
  4. Selisih Target vs Realisasi per Satker (Bar Plot Horizontal)
# ANALISIS DATA KEUANGAN

# Membuat data yang lebih besar dengan memperbanyak jumlah satker, kegiatan, dan akun
set.seed(123)  # Untuk menghasilkan data acak yang konsisten

# Contoh data diperbanyak
nama_satker <- rep(paste("Satker", LETTERS[1:10]), each = 10)
nama_kegiatan <- rep(paste("Kegiatan", 1:10), times = 10)
nama_akun <- rep(paste("Akun", 1:5), times = 20)

# Membuat target dan realisasi secara acak
target <- sample(100:500, 100, replace = TRUE)
realisasi <- target - sample(-50:50, 100, replace = TRUE)

data <- data.frame(nama_satker, nama_kegiatan, nama_akun, target, realisasi)

# Menghitung data tambahan yang diperlukan
agg_data <- aggregate(cbind(target, realisasi) ~ nama_satker, data = data, sum)
agg_data_kegiatan <- aggregate(realisasi ~ nama_kegiatan, data = data, sum)  # Agregasi per kegiatan
agg_data$selisih <- agg_data$target - agg_data$realisasi

# Memastikan data tidak memiliki nilai NA atau Inf
data <- na.omit(data)  # Menghapus baris yang mengandung NA
agg_data <- agg_data[complete.cases(agg_data), ]
agg_data_kegiatan <- agg_data_kegiatan[complete.cases(agg_data_kegiatan), ]

# Mengatur layout untuk 2x2 grid menggunakan layout()
layout(matrix(c(1, 2, 3, 4), nrow = 2, byrow = TRUE), widths = c(1, 1), heights = c(1, 1))

# 1. Perbandingan Target vs Realisasi per Satker (Bar Plot)
if (nrow(agg_data) > 0) {
    barplot(t(as.matrix(agg_data[, 2:3])),
            beside = TRUE,
            col = c("deepskyblue3", "orange3"),
            names.arg = agg_data$nama_satker,
            main = "Perbandingan Target vs Realisasi per Satker",
            xlab = "Satker",
            ylab = "Nilai (Juta)",
            legend.text = c("Target", "Realisasi"),
            args.legend = list(x = "topright", bty = "n", inset = 0.05),
            las = 2,  # Rotasi nama satker agar lebih terlihat
            cex.names = 0.8, 
            border = NA)  # Menghilangkan border bar plot
} else {
    plot.new()  # Membuat plot kosong jika data tidak valid
    title(main = "Data Tidak Tersedia")
}

# 2. Total Realisasi per Kegiatan (Bar Plot)
if (nrow(agg_data_kegiatan) > 0) {
    barplot(agg_data_kegiatan$realisasi,
            names.arg = agg_data_kegiatan$nama_kegiatan,
            col = "springgreen4",
            main = "Total Realisasi per Kegiatan",
            xlab = "Kegiatan",
            ylab = "Realisasi (Juta)",
            las = 2,  # Rotasi nama kegiatan agar lebih terlihat
            cex.names = 0.8,
            border = NA)  # Menghilangkan border bar plot
} else {
    plot.new()  # Membuat plot kosong jika data tidak valid
    title(main = "Data Tidak Tersedia")
}

# 3. Distribusi Realisasi Anggaran per Akun (Boxplot)
if (length(unique(data$nama_akun)) > 0 && length(data$realisasi) > 0) {
    boxplot(realisasi ~ nama_akun, data = data,
            main = "Distribusi Realisasi Anggaran per Akun",
            xlab = "Nama Akun",
            ylab = "Realisasi (Juta)",
            col = "dodgerblue3",
            border = "dodgerblue4",  # Warna border boxplot
            boxwex = 0.6,  # Lebar boxplot
            las = 2,  # Rotasi nama akun agar lebih terlihat
            cex.names = 0.8, 
            whisklty = 1,  # Gaya garis whiskers
            staplelty = 0)  # Menghilangkan staple pada outliers
} else {
    plot.new()  # Membuat plot kosong jika data tidak valid
    title(main = "Data Tidak Tersedia")
}

# 4. Selisih Target vs Realisasi per Satker (Bar Plot Horizontal)
if (nrow(agg_data) > 0) {
    barplot(agg_data$selisih,
            names.arg = agg_data$nama_satker,
            col = "orchid4",
            main = "Selisih Target vs Realisasi per Satker",
            xlab = "Selisih (Juta)",
            horiz = TRUE,
            cex.names = 0.8,
            border = NA)  # Menghilangkan border bar plot
} else {
    plot.new()  # Membuat plot kosong jika data tidak valid
    title(main = "Data Tidak Tersedia")
}

# Menambahkan judul keseluruhan untuk semua plot
mtext("Analisis Keuangan Dataset (2x2 Layout)", outer = TRUE, cex = 1.5, col = "darkblue")