Sebelum melakukan analisis data, biasanya kita perlu mengenali data yang sedang kita hadapi terlebih dahulu. Salah satu cara paling mudah untuk melakukannya adalah melalui visualisasi data.
Dengan visualisasi, kita tidak hanya melihat angka dalam bentuk tabel, tetapi dapat lebih mudah menemukan pola, perbedaan, kecenderungan, hubungan antarvariabel, bahkan hal-hal yang tidak biasa pada data.
Pada praktikum ini, kita akan belajar bagaimana menggunakan R untuk mengeksplorasi dan memvisualisasikan berbagai jenis data.
Setelah mengikuti praktikum ini, mahasiswa diharapkan mampu:
Catatan:
Beberapa contoh pada materi kuliah menggunakan Python. Pada praktikum ini, seluruh analisis akan dilakukan menggunakan R agar kita dapat fokus mempelajari konsep eksplorasi dan visualisasi data dalam satu lingkungan kerja yang sama.
Sebelum mulai membuat visualisasi, kita perlu menyiapkan beberapa package yang akan digunakan selama praktikum.
Apa itu package?
Secara sederhana, package adalah kumpulan fungsi tambahan di R yang dibuat untuk membantu kita melakukan pekerjaan tertentu. Misalnya, ada package untuk membuat grafik, membuat peta, menghitung korelasi, melakukan text mining, dan sebagainya.
Pada praktikum ini kita akan menggunakan beberapa package sekaligus.
Package yang belum tersedia di komputer perlu di-install terlebih dahulu.
Kode berikut akan memeriksa package yang belum terpasang, kemudian hanya meng-install package yang diperlukan.
packages <- c(
"tidyverse", "ggcorrplot", "treemapify", "maps", "broom",
"factoextra", "tm", "wordcloud", "RColorBrewer", "stopwords"
)
to_install <- packages[
!packages %in% installed.packages()[, "Package"]
]
if (length(to_install) > 0) {
install.packages(to_install)
}
Ingat:
install.packages()cukup dilakukan satu kali, yaitu ketika package tersebut belum tersedia di komputer.
Jika package sudah pernah di-install, kita tidak perlu meng-install-nya kembali setiap kali membuka RStudio.
Setelah package terpasang, langkah berikutnya adalah memanggil package agar fungsi-fungsi di dalamnya dapat digunakan.
Berbeda dengan proses instalasi, library() perlu
dijalankan kembali setiap kali kita memulai session R yang
baru.
library(tidyverse) # manipulasi data dan visualisasi dengan ggplot2
library(ggcorrplot) # visualisasi korelasi
library(treemapify) # membuat treemap
library(maps) # peta dasar
library(broom) # merapikan output model
library(factoextra) # visualisasi hasil clustering
library(tm) # text mining
library(wordcloud) # membuat word cloud
library(RColorBrewer) # pilihan palet warna
library(stopwords) # daftar stopwords
Jadi, sederhananya:
Install package → cukup satu kali
Panggil package dengan library() → dilakukan
setiap memulai session R yang baru
Pada praktikum ini kita belum perlu mengunggah dataset dari luar.
Kita akan menggunakan beberapa dataset bawaan R, yaitu:
mtcarsiriseconomicsUSArrestsmpgKarena dataset tersebut sudah tersedia di R, kita dapat langsung menggunakannya untuk belajar tanpa perlu melakukan proses impor data terlebih dahulu.
Nah, setelah package siap dan data tersedia, sekarang kita bisa mulai masuk ke pertanyaan utama:
Bagaimana sebuah visualisasi dapat membantu kita memahami data?
Kita mulai dari konsep dasarnya terlebih dahulu.
Sebelum mulai membuat grafik, kita perlu memahami terlebih dahulu apa fungsi visualisasi dalam analisis data.
Secara sederhana, visualisasi data adalah cara menyajikan informasi dari data dalam bentuk visual, seperti grafik, diagram, atau peta. Tujuannya adalah agar pola dan informasi di dalam data lebih mudah dilihat dan dipahami.
Visualisasi tidak hanya digunakan untuk mempercantik hasil analisis. Dalam proses analisis data, visualisasi dapat digunakan pada dua tahap.
Pada tahap eksplorasi, visualisasi membantu kita mengenali data sebelum melakukan analisis lebih lanjut.
Melalui grafik, kita dapat mulai menjawab pertanyaan seperti:
Dengan kata lain, pada tahap ini visualisasi digunakan untuk membantu kita menemukan informasi dari data.
Setelah analisis dilakukan, visualisasi digunakan untuk menyampaikan hasil yang telah diperoleh.
Misalnya, daripada hanya menyajikan tabel berisi banyak angka, kita dapat menggunakan grafik agar pembaca lebih cepat melihat:
Jadi, fungsi visualisasi dapat diringkas menjadi:
Saat eksplorasi: visualisasi membantu kita memahami data.
Setelah analisis: visualisasi membantu orang lain memahami hasil analisis kita.
Membuat visualisasi bukan hanya memilih jenis grafik yang terlihat menarik. Grafik yang baik harus dapat menyampaikan informasi dengan benar dan mudah dipahami.
Ada beberapa hal yang perlu diperhatikan.
Skala pada sumbu grafik menentukan bagaimana nilai dalam data ditampilkan.
Pemilihan skala yang kurang tepat dapat membuat perbedaan antar nilai terlihat lebih besar atau lebih kecil dari kondisi sebenarnya. Oleh karena itu, skala harus dipilih sesuai dengan karakteristik data.
Sebelum membuat grafik, tentukan terlebih dahulu informasi apa yang ingin kita lihat atau sampaikan.
Misalnya:
Tujuan tersebut nantinya akan membantu kita menentukan jenis visualisasi yang paling sesuai.
Visualisasi juga perlu disesuaikan dengan siapa yang akan melihatnya.
Grafik untuk keperluan eksplorasi pribadi dapat berbeda dengan grafik yang digunakan dalam laporan penelitian, presentasi ilmiah, atau penyampaian informasi kepada masyarakat umum.
Karena itu, visualisasi yang baik bukan hanya benar secara statistik, tetapi juga mudah dipahami oleh audiens yang dituju.
Secara umum, proses membuat visualisasi dapat digambarkan sebagai berikut:
Data → Tentukan informasi yang ingin dilihat → Pilih jenis visualisasi → Buat plot → Atur tampilan plot
Artinya, kita tidak langsung memilih grafik.
Kita mulai dari data, kemudian menentukan pertanyaan yang ingin dijawab. Setelah itu, barulah kita memilih bentuk visualisasi yang sesuai.
Pada bagian berikutnya, kita akan mencoba beberapa jenis visualisasi berdasarkan informasi yang ingin kita lihat dari data.
Setelah memahami fungsi dasar visualisasi, sekarang kita mulai dari salah satu kebutuhan yang paling sering ditemui dalam eksplorasi data, yaitu membandingkan besaran antar kelompok.
Misalnya, kita ingin mengetahui:
Untuk kebutuhan seperti ini, salah satu visualisasi yang paling sederhana dan mudah dibaca adalah bar chart.
Bar chart atau diagram batang digunakan untuk membandingkan nilai antar kategori.
Pada bar chart:
Semakin tinggi batang, semakin besar nilai yang diwakilinya.
Kita akan menggunakan dataset mtcars.
Dataset mtcars berisi informasi mengenai beberapa jenis
mobil, seperti konsumsi bahan bakar, jumlah silinder, tenaga mesin,
berat mobil, dan beberapa karakteristik lainnya.
Untuk contoh pertama, kita akan melihat variabel cyl,
yaitu jumlah silinder mesin.
Sebelum membuat grafik, mari kita lihat terlebih dahulu berapa banyak mobil pada masing-masing jumlah silinder.
mtcars %>%
count(cyl)
## cyl n
## 1 4 11
## 2 6 7
## 3 8 14
Dari hasil tersebut, kita dapat mengetahui jumlah mobil yang memiliki 4, 6, dan 8 silinder.
Sekarang informasi tersebut kita tampilkan dalam bentuk bar chart.
mtcars %>%
count(cyl) %>%
ggplot(aes(
x = factor(cyl),
y = n,
fill = factor(cyl)
)) +
geom_col() +
geom_text(
aes(label = n),
vjust = -0.4
) +
labs(
title = "Jumlah Mobil berdasarkan Jumlah Silinder",
x = "Jumlah Silinder",
y = "Jumlah Mobil"
) +
theme_minimal() +
theme(
legend.position = "none"
)
Mari kita lihat bagian-bagian penting dari kode tersebut.
count(cyl) digunakan untuk menghitung berapa
banyak mobil pada setiap kategori jumlah silinder.
Pada bagian:
aes(
x = factor(cyl),
y = n
)
kita menentukan bahwa:
Fungsi:
geom_col()
digunakan untuk membuat batang berdasarkan nilai n yang
sudah kita hitung sebelumnya.
Kemudian:
geom_text(aes(label = n))
digunakan untuk menampilkan angka jumlah mobil di atas setiap batang.
Dari grafik, terlihat bahwa:
Dengan melihat grafik, kita dapat lebih cepat mengetahui bahwa mobil
dengan 8 silinder merupakan kelompok yang paling
banyak, sedangkan mobil dengan 6 silinder merupakan
kelompok yang paling sedikit pada dataset
mtcars.
Perhatikan bahwa informasi yang sama sebenarnya dapat diperoleh dari tabel. Namun, melalui visualisasi, perbandingan antar kategori dapat terlihat lebih cepat.
Intinya:
Gunakan bar chart ketika kita ingin membandingkan besar nilai atau jumlah antar kategori.
Lollipop chart digunakan untuk membandingkan nilai antar kategori, terutama ketika jumlah kategorinya cukup banyak.
Bentuknya mirip bar chart, tetapi batang diganti dengan garis dan titik, sehingga tampilannya lebih ringan dan mudah dibaca.
Pada contoh ini, kita akan membandingkan nilai mpg atau
miles per gallon untuk setiap mobil pada dataset
mtcars.
data_lollipop <- mtcars %>%
tibble::rownames_to_column("car") %>%
arrange(mpg) %>%
mutate(car = factor(car, levels = car))
ggplot(data_lollipop,
aes(x = mpg, y = car, color = factor(cyl))) +
geom_segment(
aes(x = 0, xend = mpg, y = car, yend = car),
color = "grey70"
) +
geom_point(size = 3) +
labs(
title = "Konsumsi Bahan Bakar (mpg) per Mobil",
x = "Miles per Gallon",
y = NULL,
color = "Silinder"
) +
theme_minimal()
Dari grafik tersebut, kita dapat melihat bahwa nilai mpg
berbeda antar mobil. Mobil dengan nilai mpg lebih tinggi
berada semakin ke kanan.
Warna titik menunjukkan jumlah silinder, sehingga kita juga dapat
melihat pola bahwa mobil dengan jumlah silinder lebih sedikit cenderung
memiliki nilai mpg yang lebih tinggi.
Intinya:
Lollipop chart cocok digunakan untuk membandingkan banyak kategori dengan tampilan yang lebih sederhana daripada bar chart.
Setelah sebelumnya kita membandingkan nilai antar kategori, sekarang kita akan melihat bagaimana suatu data tersebar.
Visualisasi sebaran membantu kita melihat apakah nilai data lebih banyak berkumpul pada rentang tertentu, menyebar luas, atau memiliki pola tertentu.
Histogram menunjukkan sebaran data dengan membagi nilai ke dalam beberapa interval.
Sementara itu, density plot menunjukkan pola sebaran dalam bentuk kurva yang lebih halus.
Pada contoh ini, kita akan melihat sebaran nilai mpg
pada dataset mtcars.
ggplot(mtcars, aes(x = mpg)) +
geom_histogram(
aes(y = after_stat(density)),
bins = 10,
fill = "lightblue",
color = "black"
) +
geom_density(
fill = "red",
alpha = 0.4
) +
labs(
title = "Distribusi Konsumsi Bahan Bakar (mpg)",
x = "mpg",
y = "Density"
) +
theme_minimal()
Dari grafik, kita dapat melihat bahwa sebagian besar nilai
mpg berada pada kisaran sekitar 15–22 mpg,
sedangkan jumlah mobil dengan nilai mpg yang sangat tinggi
relatif lebih sedikit.
Histogram membantu kita melihat jumlah pengamatan pada setiap rentang nilai, sedangkan kurva density membantu melihat bentuk umum distribusinya.
Intinya:
Histogram dan density plot digunakan untuk melihat pola sebaran dari variabel numerik.
Boxplot digunakan untuk membandingkan sebaran data antar kelompok.
Melalui boxplot, kita bisa melihat nilai tengah (median), penyebaran data, serta kemungkinan adanya outlier.
Pada contoh ini, kita akan membandingkan nilai mpg
berdasarkan jumlah silinder mobil.
ggplot(mtcars, aes(x = factor(cyl), y = mpg, fill = factor(cyl))) +
geom_boxplot() +
labs(
title = "Sebaran mpg berdasarkan Jumlah Silinder",
x = "Silinder",
y = "mpg"
) +
theme_minimal() +
theme(legend.position = "none")
Dari grafik terlihat bahwa mobil dengan 4 silinder memiliki
nilai mpg yang cenderung lebih tinggi, sedangkan
mobil dengan 8 silinder memiliki nilai mpg yang
lebih rendah.
Pada kelompok 8 silinder juga terlihat beberapa titik di luar boxplot yang menunjukkan adanya nilai yang berbeda cukup jauh dari sebagian besar data pada kelompok tersebut.
Intinya:
Boxplot cocok digunakan untuk membandingkan sebaran data antar kelompok sekaligus melihat kemungkinan outlier.
Violin plot digunakan untuk melihat dan membandingkan bentuk sebaran data antar kelompok.
Bedanya dengan boxplot, violin plot juga memperlihatkan kepadatan data. Bagian yang lebih lebar menunjukkan bahwa lebih banyak data terkumpul pada rentang nilai tersebut.
Pada contoh ini, kita membandingkan nilai mpg
berdasarkan jumlah silinder.
ggplot(mtcars, aes(x = factor(cyl), y = mpg, fill = factor(cyl))) +
geom_violin(trim = FALSE) +
geom_boxplot(width = 0.1, fill = "white") +
labs(
title = "Violin Plot mpg berdasarkan Jumlah Silinder",
x = "Silinder",
y = "mpg"
) +
theme_minimal() +
theme(legend.position = "none")
Dari grafik terlihat bahwa distribusi mpg pada setiap
kelompok silinder memiliki bentuk yang berbeda.
Mobil 4 silinder cenderung memiliki mpg
lebih tinggi, sedangkan mobil 8 silinder cenderung
memiliki mpg lebih rendah. Bagian violin yang lebih lebar
menunjukkan rentang nilai tempat data lebih banyak terkumpul.
Boxplot kecil di tengah membantu kita tetap melihat median dan penyebaran data.
Intinya:
Violin plot cocok digunakan ketika kita ingin melihat sebaran sekaligus bentuk kepadatan data antar kelompok.
Selain membandingkan nilai dan melihat sebaran data, kita juga sering ingin mengetahui seberapa besar bagian suatu kategori terhadap keseluruhan data.
Visualisasi seperti ini disebut visualisasi proporsi.
Pie chart digunakan untuk menunjukkan proporsi masing-masing kategori sebagai bagian dari keseluruhan.
Pada contoh ini, kita akan melihat proporsi mobil berdasarkan jumlah silindernya.
prop_cyl <- mtcars %>%
count(cyl) %>%
mutate(prop = n / sum(n))
ggplot(prop_cyl, aes(x = "", y = n, fill = factor(cyl))) +
geom_col(width = 1, color = "white") +
coord_polar(theta = "y") +
labs(
title = "Proporsi Mobil berdasarkan Jumlah Silinder",
fill = "Silinder"
) +
theme_void()
Dari grafik terlihat bahwa mobil dengan 8 silinder memiliki proporsi terbesar, disusul mobil 4 silinder, sedangkan mobil 6 silinder memiliki proporsi paling kecil.
Semakin besar potongan pada pie chart, semakin besar pula proporsi kategori tersebut terhadap keseluruhan data.
Intinya:
Pie chart cocok digunakan untuk melihat proporsi beberapa kategori terhadap keseluruhan.
Donut chart merupakan variasi dari pie chart yang memiliki lubang di bagian tengah.
Fungsinya tetap sama, yaitu untuk menunjukkan proporsi setiap kategori terhadap keseluruhan data, tetapi tampilannya lebih ringkas.
Pada contoh ini, kita kembali melihat proporsi mobil berdasarkan jumlah silinder.
ggplot(prop_cyl, aes(x = 2, y = n, fill = factor(cyl))) +
geom_col(width = 1, color = "white") +
coord_polar(theta = "y") +
xlim(0.5, 2.5) +
labs(
title = "Donut Chart Proporsi Silinder",
fill = "Silinder"
) +
theme_void()
Dari grafik terlihat bahwa mobil dengan 8 silinder memiliki proporsi terbesar, sedangkan mobil dengan 6 silinder memiliki proporsi paling kecil.
Secara informasi, hasil yang ditampilkan sama dengan pie chart. Perbedaannya lebih pada bentuk penyajian visual.
Intinya:
Donut chart digunakan untuk menampilkan proporsi kategori, dengan tampilan alternatif dari pie chart.
Treemap digunakan untuk menunjukkan proporsi atau perbandingan antar kategori menggunakan luas kotak.
Semakin besar ukuran kotaknya, semakin besar pula nilai atau jumlah pada kategori tersebut.
Pada contoh ini, kita akan melihat jumlah mobil berdasarkan
manufaktur pada dataset mpg.
mpg_count <- ggplot2::mpg %>%
count(manufacturer)
ggplot(
mpg_count,
aes(
area = n,
fill = manufacturer,
label = manufacturer
)
) +
geom_treemap() +
geom_treemap_text(
color = "white",
place = "centre",
grow = TRUE
) +
labs(
title = "Treemap Jumlah Mobil berdasarkan Manufaktur (dataset mpg)"
) +
theme(legend.position = "none")
Dari grafik, terlihat bahwa manufaktur seperti Dodge, Toyota, dan Volkswagen memiliki kotak yang relatif lebih besar dibanding beberapa manufaktur lainnya.
Artinya, jumlah mobil dari manufaktur tersebut lebih banyak pada
dataset mpg.
Intinya:
Pada treemap, semakin luas kotaknya, semakin besar nilai atau jumlah kategorinya.
Setelah melihat besaran, sebaran, dan proporsi, sekarang kita akan melihat hubungan antara dua variabel numerik.
Salah satu visualisasi yang paling umum digunakan adalah scatter plot.
Scatter plot menampilkan setiap pengamatan sebagai sebuah titik. Pola titik-titik tersebut dapat membantu kita melihat apakah dua variabel cenderung memiliki hubungan tertentu.
Pada contoh ini, kita akan melihat hubungan antara:
wt = berat mobilmpg = konsumsi bahan bakarggplot(mtcars, aes(x = wt, y = mpg)) +
geom_point(color = "steelblue", size = 2) +
geom_smooth(
method = "lm",
color = "darkred",
se = TRUE
) +
labs(
title = "Hubungan Berat Mobil dan Konsumsi Bahan Bakar",
x = "Berat (1000 lbs)",
y = "mpg"
) +
theme_minimal()
Dari grafik terlihat bahwa semakin besar berat mobil, nilai
mpg cenderung semakin rendah.
Pola titik yang bergerak dari kiri atas ke kanan bawah menunjukkan
adanya hubungan negatif antara berat mobil dan
mpg.
Garis merah membantu menunjukkan arah umum hubungan tersebut, sedangkan area abu-abu di sekitarnya menunjukkan ketidakpastian dari garis regresi.
Intinya:
Scatter plot digunakan untuk melihat pola hubungan antara dua variabel numerik.
Selain melihat hubungan antarvariabel, kita juga sering ingin melihat bagaimana suatu nilai berubah dari waktu ke waktu.
Visualisasi seperti ini disebut visualisasi deret waktu atau time series.
Time series plot digunakan untuk melihat pola perubahan suatu variabel berdasarkan waktu.
Biasanya, waktu ditempatkan pada sumbu X, sedangkan nilai yang diamati ditempatkan pada sumbu Y.
Pada contoh ini, kita akan melihat perubahan jumlah pengangguran
menggunakan dataset economics.
ggplot(economics, aes(x = date, y = unemploy)) +
geom_line(color = "steelblue") +
labs(
title = "Tren Jumlah Pengangguran di Amerika Serikat",
x = "Tahun",
y = "Jumlah Pengangguran (ribu)"
) +
theme_minimal()
Dari grafik terlihat bahwa jumlah pengangguran mengalami kenaikan dan penurunan dari waktu ke waktu.
Beberapa periode menunjukkan lonjakan yang cukup besar, kemudian kembali mengalami penurunan.
Intinya:
Time series plot digunakan untuk melihat perubahan, pola, dan tren suatu variabel dari waktu ke waktu.
Stacked area plot digunakan untuk melihat perubahan nilai dari waktu ke waktu sekaligus membandingkan kontribusi beberapa kategori.
Setiap warna menunjukkan kategori yang berbeda, sedangkan tinggi keseluruhan area menunjukkan total nilai pada waktu tersebut.
Pada contoh ini, digunakan data simulasi jam penggunaan untuk kategori Mobile, Desktop, dan Lainnya dari tahun 2015–2022.
set.seed(123)
stacked_df <- expand.grid(
year = 2015:2022,
kategori = c("Mobile", "Desktop", "Lainnya")
)
stacked_df$value <- round(
runif(nrow(stacked_df), 10, 50)
)
ggplot(stacked_df,
aes(x = year, y = value, fill = kategori)) +
geom_area() +
labs(
title = "Contoh Stacked Area Plot",
x = "Tahun",
y = "Jam Penggunaan",
fill = "Kategori"
) +
theme_minimal()
Dari grafik, kita dapat melihat bahwa nilai masing-masing kategori berubah dari tahun ke tahun.
Kita juga dapat melihat perubahan total penggunaan melalui tinggi keseluruhan area pada setiap tahun.
Intinya:
Stacked area plot cocok digunakan untuk melihat tren total sekaligus kontribusi beberapa kategori sepanjang waktu.
Visualisasi geospasial digunakan untuk melihat bagaimana suatu nilai atau karakteristik tersebar berdasarkan lokasi geografis.
Salah satu bentuk yang sering digunakan adalah choropleth map, yaitu peta yang memberikan warna berbeda pada setiap wilayah berdasarkan besar nilainya.
Pada contoh ini, kita akan memetakan nilai Murder dari
dataset USArrests untuk setiap negara bagian di Amerika
Serikat.
states_map <- map_data("state")
usarrests <- USArrests %>%
tibble::rownames_to_column("state") %>%
mutate(state = tolower(state))
map_df <- left_join(
states_map,
usarrests,
by = c("region" = "state")
)
ggplot(
map_df,
aes(
x = long,
y = lat,
group = group,
fill = Murder
)
) +
geom_polygon(color = "white") +
coord_fixed(1.3) +
scale_fill_gradient(
low = "lightyellow",
high = "darkred"
) +
labs(
title = "Sebaran Nilai Murder pada Dataset USArrests",
fill = "Murder"
) +
theme_void()
Pada peta, warna yang semakin gelap menunjukkan nilai
Murder yang semakin tinggi, sedangkan warna yang
lebih terang menunjukkan nilai yang lebih rendah.
Dengan visualisasi ini, perbedaan antarwilayah dapat terlihat lebih mudah dibandingkan hanya melalui tabel.
Intinya:
Visualisasi geospasial membantu kita melihat pola dan perbedaan suatu nilai berdasarkan lokasi geografis.
Setelah proses analisis dilakukan, hasil yang diperoleh tidak selalu mudah dipahami jika hanya disajikan dalam bentuk tabel atau angka.
Karena itu, visualisasi dapat digunakan untuk membantu meringkas dan menjelaskan hasil analisis dengan lebih jelas.
Pada bagian ini, kita akan melihat beberapa contoh visualisasi hasil analisis, yaitu correlation plot, regression coefficient plot, dan cluster plot.
Correlation plot digunakan untuk melihat arah dan kekuatan hubungan antar variabel numerik.
Nilai korelasi berada antara -1 sampai 1:
Pada contoh ini, kita akan melihat korelasi antar variabel pada
dataset mtcars.
corr_mat <- cor(mtcars)
ggcorrplot(
corr_mat,
hc.order = TRUE,
type = "lower",
lab = TRUE,
lab_size = 2.5,
title = "Correlation Plot - mtcars"
)
Regression coefficient plot digunakan untuk menampilkan hasil model regresi dalam bentuk visual.
Setiap titik menunjukkan nilai koefisien regresi, sedangkan garis horizontal menunjukkan confidence interval dari masing-masing koefisien.
Pada contoh ini, kita memodelkan mpg menggunakan
beberapa variabel pada dataset mtcars.
model <- lm(
mpg ~ wt + hp + cyl + disp,
data = mtcars
)
tidy_model <- tidy(
model,
conf.int = TRUE
) %>%
filter(term != "(Intercept)")
ggplot(
tidy_model,
aes(
x = reorder(term, estimate),
y = estimate
)
) +
geom_pointrange(
aes(
ymin = conf.low,
ymax = conf.high
),
color = "steelblue"
) +
geom_hline(
yintercept = 0,
linetype = "dashed",
color = "red"
) +
coord_flip() +
labs(
title = "Regression Coefficient Plot",
x = NULL,
y = "Estimate"
) +
theme_minimal()
Koefisien yang berada di sebelah negatif menunjukkan
hubungan negatif dengan mpg, sedangkan koefisien positif
menunjukkan hubungan positif.
Pada grafik, wt memiliki koefisien negatif yang cukup
besar. Artinya, setelah mempertimbangkan variabel lain dalam model,
peningkatan berat mobil cenderung diikuti penurunan nilai
mpg.
Garis merah pada nilai 0 digunakan sebagai patokan. Jika confidence interval suatu koefisien melewati nilai 0, maka pengaruh variabel tersebut belum terlihat jelas pada tingkat kepercayaan yang digunakan.
Intinya:
Regression coefficient plot membantu kita melihat arah, besar, dan ketidakpastian koefisien regresi dengan lebih mudah.
Cluster plot digunakan untuk melihat hasil pengelompokan data berdasarkan kemiripan karakteristiknya.
Pada contoh ini, data iris dikelompokkan menjadi
3 cluster menggunakan metode K-Means.
iris_scaled <- scale(iris[, 1:4])
set.seed(123)
km <- kmeans(
iris_scaled,
centers = 3,
nstart = 25
)
fviz_cluster(
km,
data = iris_scaled,
geom = "point",
ellipse.type = "convex",
main = "Hasil Analisis Gerombol (K-Means) pada Data Iris"
)
Pada grafik, setiap titik menunjukkan satu pengamatan, sedangkan warna yang berbeda menunjukkan cluster yang berbeda.
Titik-titik yang berada dalam kelompok yang sama memiliki karakteristik yang relatif lebih mirip dibandingkan dengan titik pada kelompok lain.
Terlihat bahwa ketiga cluster cukup terpisah, meskipun terdapat beberapa bagian yang posisinya berdekatan.
Intinya:
Cluster plot membantu kita melihat hasil pengelompokan data dan seberapa jelas pemisahan antar cluster.
Tidak semua data berbentuk angka. Kita juga sering menemukan data berupa teks, seperti komentar, ulasan, atau tanggapan pengguna.
Pada bagian ini, kita akan mencoba alur sederhana eksplorasi data teks:
Teks → Preprocessing → Frekuensi Kata → Word Cloud → Analisis Sentimen
Pada materi kuliah, beberapa contoh menggunakan Python. Pada praktikum ini, konsep yang sama akan kita terapkan menggunakan R.
Kita akan menggunakan beberapa komentar sederhana sebagai contoh data teks.
komentar <- c(
"Pelayanan kantor ini sangat cepat dan memuaskan",
"Saya kecewa karena antrian sangat lama dan petugas kurang ramah",
"Aplikasi ini bagus, mudah digunakan sehari-hari",
"Harga produk terlalu mahal dibandingkan kualitasnya",
"Terima kasih atas pelayanan yang luar biasa, sangat membantu",
"Sistemnya sering error, tolong diperbaiki",
"Saya suka desain baru website ini, sangat rapi",
"Pengiriman barang telat dan packingnya rusak",
"Timnya responsif dan solutif, sangat membantu",
"Kualitas produk menurun dibanding sebelumnya"
)
Sebelum dianalisis, teks biasanya perlu dibersihkan agar kata-kata yang muncul lebih mudah dihitung.
Pada tahap ini kita akan:
corpus <- VCorpus(VectorSource(komentar))
corpus <- tm_map(corpus, content_transformer(tolower))
corpus <- tm_map(corpus, removePunctuation)
corpus <- tm_map(corpus, removeNumbers)
id_stopwords <- stopwords::stopwords("id", source = "stopwords-iso")
corpus <- tm_map(corpus, removeWords, id_stopwords)
corpus <- tm_map(corpus, stripWhitespace)
Intinya:
Preprocessing membantu mengubah teks mentah menjadi teks yang lebih siap untuk dianalisis.
Setelah teks dibersihkan, kita dapat menghitung berapa kali setiap kata muncul.
Salah satu bentuk representasi sederhana yang dapat digunakan adalah Document-Term Matrix (DTM).
dtm <- DocumentTermMatrix(corpus)
dtm_matrix <- as.matrix(dtm)
freq <- colSums(dtm_matrix)
freq_df <- data.frame(
word = names(freq),
freq = freq
) %>%
arrange(desc(freq))
head(freq_df, 10)
## word freq
## membantu membantu 2
## pelayanan pelayanan 2
## produk produk 2
## antrian antrian 1
## aplikasi aplikasi 1
## bagus bagus 1
## barang barang 1
## cepat cepat 1
## desain desain 1
## dibanding dibanding 1
Kata dengan nilai freq lebih besar berarti kata tersebut
lebih sering muncul dalam kumpulan komentar.
Frekuensi kata dapat ditampilkan dalam bentuk word cloud.
Pada word cloud, semakin besar ukuran suatu kata, semakin sering kata tersebut muncul.
set.seed(123)
wordcloud(
words = freq_df$word,
freq = freq_df$freq,
min.freq = 1,
max.words = 100,
random.order = FALSE,
colors = brewer.pal(8, "Dark2")
)
Intinya:
Word cloud memberikan gambaran cepat mengenai kata-kata yang dominan dalam data teks.
Selain word cloud, frekuensi kata dapat ditampilkan menggunakan bar chart agar perbedaannya lebih mudah dibandingkan.
Kita akan menampilkan 10 kata yang paling sering muncul.
freq_df %>%
slice_max(freq, n = 10, with_ties = FALSE) %>%
ggplot(aes(x = reorder(word, freq), y = freq)) +
geom_col(fill = "steelblue") +
coord_flip() +
labs(
title = "10 Kata Paling Sering Muncul",
x = NULL,
y = "Frekuensi"
) +
theme_minimal()
Semakin panjang batang, semakin sering kata tersebut muncul dalam kumpulan komentar.
Intinya:
Bar chart memudahkan kita membandingkan frekuensi kata secara lebih jelas.
Selanjutnya, kita akan mencoba melihat apakah suatu komentar cenderung memiliki sentimen positif, negatif, atau netral.
Pendekatan sederhana yang digunakan adalah lexicon-based, yaitu mencocokkan kata dalam komentar dengan daftar kata positif dan negatif.
positive_words <- c(
"cepat", "memuaskan", "bagus", "mudah", "luar", "biasa",
"suka", "rapi", "membantu", "responsif", "solutif",
"ramah", "terima", "kasih"
)
negative_words <- c(
"kecewa", "lama", "kurang", "mahal",
"error", "telat", "rusak", "menurun"
)
Selanjutnya kita menghitung jumlah kata positif dan negatif pada setiap komentar.
sentiment_score <- function(text) {
text_clean <- text %>%
tolower() %>%
stringr::str_replace_all("[[:punct:]]", "")
words <- unlist(strsplit(text_clean, "\\s+"))
pos <- sum(words %in% positive_words)
neg <- sum(words %in% negative_words)
score <- pos - neg
label <- case_when(
score > 0 ~ "Positive",
score < 0 ~ "Negative",
TRUE ~ "Neutral"
)
data.frame(
text = text,
pos = pos,
neg = neg,
score = score,
label = label
)
}
sentiment_result <- map_dfr(
komentar,
sentiment_score
)
sentiment_result
## text pos neg
## 1 Pelayanan kantor ini sangat cepat dan memuaskan 2 0
## 2 Saya kecewa karena antrian sangat lama dan petugas kurang ramah 1 3
## 3 Aplikasi ini bagus, mudah digunakan sehari-hari 2 0
## 4 Harga produk terlalu mahal dibandingkan kualitasnya 0 1
## 5 Terima kasih atas pelayanan yang luar biasa, sangat membantu 5 0
## 6 Sistemnya sering error, tolong diperbaiki 0 1
## 7 Saya suka desain baru website ini, sangat rapi 2 0
## 8 Pengiriman barang telat dan packingnya rusak 0 2
## 9 Timnya responsif dan solutif, sangat membantu 3 0
## 10 Kualitas produk menurun dibanding sebelumnya 0 1
## score label
## 1 2 Positive
## 2 -2 Negative
## 3 2 Positive
## 4 -1 Negative
## 5 5 Positive
## 6 -1 Negative
## 7 2 Positive
## 8 -2 Negative
## 9 3 Positive
## 10 -1 Negative
Nilai sentimen ditentukan dari:
Score = jumlah kata positif − jumlah kata negatif
Sehingga:
score > 0 → Positivescore < 0 → Negativescore = 0 → NeutralHasilnya kemudian dapat diringkas dalam bentuk grafik.
ggplot(sentiment_result, aes(x = label, fill = label)) +
geom_bar() +
scale_fill_manual(
values = c(
"Positive" = "seagreen",
"Negative" = "firebrick",
"Neutral" = "grey60"
)
) +
labs(
title = "Distribusi Sentimen Komentar",
x = NULL,
y = "Jumlah Komentar"
) +
theme_minimal() +
theme(legend.position = "none")
Grafik menunjukkan berapa banyak komentar yang dikategorikan sebagai positif, negatif, dan netral.
Intinya:
Analisis sentimen sederhana membantu kita memperoleh gambaran umum mengenai kecenderungan opini dalam data teks.
Catatan:
Daftar kata positif dan negatif pada contoh ini masih sangat sederhana dan hanya digunakan untuk memahami konsep dasar analisis sentimen.
Kerjakan latihan berikut menggunakan dataset mtcars,
iris, atau dataset lain yang diberikan asisten.
hp (horsepower) pada mtcars,
urutkan dari yang terbesar.mpg berdasarkan am (0 = otomatis, 1 =
manual). Interpretasikan perbedaannya.gear) pada
mtcars.disp dan
mpg, tambahkan garis tren. Apakah hubungannya positif atau
negatif?iris.sf.ggplot2, treemapify,
ggcorrplot, tm, wordcloud,
factoextra.