forcats

Mengurutkan ulang tingkat faktor dan mengodekan ulang kategorinya.

Daftar isi

Data kategorikal sering tersimpan sebagai teks, dan teks yang dijadikan faktor mendapatkan urutan tingkat secara alfabetis. Urutan itu jarang bermakna, padahal urutan tingkat menentukan tampilan tabel, sumbu grafik, dan hasil pengurutan data. Paket forcats menyediakan fungsi untuk mengelola tingkat faktor tersebut. Topik ini menggunakan catatan keluhan layanan perpustakaan kampus untuk membahas pengurutan tingkat menurut nilai dan frekuensi, penggantian label, pengelompokan kategori kecil, serta pembalikan urutan.

Urutan tingkat bawaan yang alfabetis#

Data contohnya berupa vektor catatan keluhan yang masing-masing tergolong ke salah satu dari lima kategori. Fungsi rep() membangkitkan vektor tersebut dengan frekuensi yang sudah ditetapkan, sehingga jumlah tiap kategorinya tetap dan dapat dihitung ulang. Faktor dibentuk dari vektor itu dengan factor(), dan tingkatnya diperiksa dengan levels().

r
library(tidyverse)

keluhan <- rep(
  c("Sirkulasi", "Koleksi", "Ruang baca", "Jaringan", "Acara"),
  times = c(24, 18, 12, 9, 6)
)
f <- factor(keluhan)
levels(f)
text Keluaran
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.2.1     ✔ readr     2.2.0
✔ forcats   1.0.1     ✔ stringr   1.6.0
✔ ggplot2   4.0.3     ✔ tibble    3.3.1
✔ lubridate 1.9.5     ✔ tidyr     1.3.2
✔ purrr     1.2.2     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
[1] "Acara"      "Jaringan"   "Koleksi"    "Ruang baca" "Sirkulasi" 
r
table(f)
text Keluaran
f
     Acara   Jaringan    Koleksi Ruang baca  Sirkulasi 
         6          9         18         12         24 

Tingkat tersusun alfabetis, sehingga kategori Acara yang paling jarang justru menempati posisi pertama. Urutan alfabetis memang mudah diprediksi, tetapi tidak membawa informasi apa pun tentang datanya. Masalah ini terasa pada tabel dan grafik, karena frekuensi yang paling penting tidak berada di posisi yang mudah dibaca. Urutan yang tepat selalu mengikuti pertanyaan yang dijawab, sedangkan urutan alfabetis hanya menguntungkan apabila nama kategori memang tersusun berurutan secara alami. Perubahan urutan tidak mengubah hitungan apa pun, sehingga kesalahannya jarang terlihat pada angka dan baru muncul pada tampilannya. Seluruh fungsi forcats pada bagian berikutnya bekerja dengan cara yang sama, yaitu mengubah urutan atau label tingkat tanpa menyentuh isinya.

Mengurutkan tingkat menurut nilai dengan fct_reorder()#

Grafik batang yang dibangun dengan geom_col() menempatkan kategori pada sumbu mengikuti urutan tingkatnya. Apabila tingkatnya dibiarkan alfabetis, batang-batangnya tersusun acak menurut nilai, sehingga perbandingan antar batang harus dilakukan dengan memandang satu per satu. Fungsi fct_reorder() menyelesaikannya dengan mengurutkan tingkat menurut satu variabel lain, dan urutan menaik menjadi pilihan bawaannya.

r
frek <- tibble(
  kategori = c("Sirkulasi", "Koleksi", "Ruang baca", "Jaringan", "Acara"),
  jumlah = c(24, 18, 12, 9, 6)
)
p <- ggplot(frek, aes(x = fct_reorder(kategori, jumlah), y = jumlah)) +
  geom_col(fill = "#4472C4") +
  labs(x = "Kategori keluhan", y = "Jumlah keluhan", title = "Frekuensi keluhan per kategori") +
  theme_minimal()
ggplot2::ggsave("keluhan-frekuensi.svg", p, width = 5, height = 3.2)
0510152025AcaraJaringanRuang bacaKoleksiSirkulasiKategori keluhanJumlah keluhanFrekuensi keluhan per kategori
Frekuensi keluhan per kategori dengan tingkat diurutkan oleh fct_reorder()

Grafik di atas tersusun menaik dari Acara hingga Sirkulasi, sehingga kategori dengan keluhan terbanyak langsung terlihat pada batang paling kanan. Argumen pertama fct_reorder() adalah faktor yang akan diurutkan, sedangkan argumen kedua adalah angka yang menjadi dasar pengurutannya. Apabila setiap tingkat memuat lebih dari satu angka, fungsi ini mengurutkan menurut mediannya secara bawaan, dan argumen .desc = TRUE membalik arahnya menjadi menurun. Hasil pengurutannya juga dapat disimpan sebagai kolom faktor baru apabila grafik yang sama dibutuhkan berulang kali.

Mengurutkan tingkat menurut frekuensi dengan fct_infreq()#

Pengurutan menurut nilai biasanya dilakukan pada tabel ringkasan yang sudah dihitung, sedangkan fct_infreq() mengurutkan tingkat langsung dari data mentahnya. Fungsi tersebut menyusun tingkat menurut banyaknya kemunculan, mulai dari yang paling sering. Data keluhan yang masih berupa faktor panjang cukup diteruskan tanpa menghitung frekuensinya terlebih dahulu.

r
f_infreq <- fct_infreq(f)
levels(f_infreq)
text Keluaran
[1] "Sirkulasi"  "Koleksi"    "Ruang baca" "Jaringan"   "Acara"     

Urutan tingkatnya kini mengikuti frekuensi, yaitu Sirkulasi dengan 24 kemunculan hingga Acara dengan 6 kemunculan. Frekuensinya dihitung oleh fct_infreq() sendiri, sehingga hasilnya selalu konsisten dengan table(). Perbedaannya dengan fct_reorder() terletak pada masukannya, yaitu faktor mentah dan bukan tabel ringkasan yang sudah dihitung. Faktor yang telah diurutkan ini dapat diteruskan ke table() atau ke grafik, dan keduanya akan menampilkan kategori dari yang paling sering. Urutan tingkat yang sama juga menentukan urutan legenda apabila faktor tersebut dipetakan ke warna. Untuk kebutuhan sebaliknya, yaitu urutan dari yang paling jarang, fct_infreq() cukup dibungkus fct_rev().

Mengganti label tingkat dengan fct_recode()#

Fungsi fct_recode() mengganti label tingkat tanpa mengubah isinya maupun urutannya. Kegunaannya muncul ketika label dari sumber data terlalu panjang, tidak konsisten, atau perlu disesuaikan dengan istilah laporan. Contoh berikut menyingkat dua label menjadi Buku dan Kegiatan.

r
f_singkat <- fct_recode(f, "Buku" = "Koleksi", "Kegiatan" = "Acara")
levels(f_singkat)
table(f_singkat)
text Keluaran
[1] "Kegiatan"   "Jaringan"   "Buku"       "Ruang baca" "Sirkulasi" 
f_singkat
  Kegiatan   Jaringan       Buku Ruang baca  Sirkulasi 
         6          9         18         12         24 

Cetakan table(f_singkat) memperlihatkan bahwa hitungan tetap sama, sedangkan daftar tingkatnya mempertahankan posisi tingkat yang lama, sehingga Kegiatan berada di posisi pertama karena menggantikan Acara. Label lama yang tidak disebutkan dibiarkan apa adanya, dan satu panggilan fct_recode() dapat mengganti beberapa label sekaligus. Pengodean ulang juga berguna untuk menyatukan dua label yang ditulis berbeda, karena dua label lama dapat diarahkan ke label baru yang sama. Banyaknya tingkat tidak berubah melalui proses ini karena tidak ada tingkat yang ditambahkan maupun dihapus.

Mengelompokkan dan membalik tingkat#

Kategori yang jarang muncul sering perlu diringkas agar tabel dan grafiknya tidak berantakan. Fungsi fct_lump() dengan argumen n menyimpan sejumlah tingkat terbanyak, lalu menggabungkan sisanya menjadi satu tingkat yang dinamai melalui argumen other_level. Contoh berikut menyimpan dua kategori terbanyak dan mengelompokkan tiga sisanya.

r
f_lump <- fct_lump(f, n = 2, other_level = "Lainnya")
table(f_lump)
text Keluaran
f_lump
  Koleksi Sirkulasi   Lainnya 
       18        24        27 

Tingkat Lainnya yang terbentuk berisi 27 keluhan, jumlahnya melebihi Sirkulasi yang paling banyak, sehingga perlu diperhatikan saat grafik semacam ini dibaca. Penggabungan memang menyembunyikan rinciannya, tetapi justru memperlihatkan bahwa keluhan yang tersisa tersebar pada banyak kategori kecil. Tingkat gabungan tersebut ditempatkan pada posisi akhir secara bawaan, sehingga tabelnya tetap mudah dibaca. Argumen n pada contoh ini menyatakan banyaknya tingkat yang disimpan, sedangkan fct_lump_min() mengelompokkan tingkat yang frekuensinya di bawah ambang tertentu.

Fungsi terakhir adalah fct_rev(), yang membalik urutan tingkat yang sudah ada tanpa mengubah frekuensinya. Fungsi ini praktis digunakan apabila grafik batang horizontal ingin dibaca dari yang terbesar, atau apabila hasil fct_infreq() perlu dibalik.

r
levels(fct_rev(f_infreq))
text Keluaran
[1] "Acara"      "Jaringan"   "Ruang baca" "Koleksi"    "Sirkulasi" 

Ringkasan#

  • Tingkat faktor tersusun alfabetis secara bawaan, dan urutan itu menentukan tampilan tabel serta sumbu grafik tanpa membawa makna dari data.
  • fct_reorder() mengurutkan tingkat menurut satu variabel lain, sehingga batang pada geom_col() tersusun menaik atau menurun menurut nilainya.
  • fct_infreq() mengurutkan tingkat menurut frekuensi dari yang terbesar, dan fct_rev() membalik urutan tingkat yang sudah ada.
  • fct_recode() mengganti label tingkat dengan bentuk "baru" = "lama" tanpa mengubah hitungan maupun posisi tingkatnya.
  • fct_lump() dengan argumen n menyimpan kategori terbanyak dan menggabungkan sisanya menjadi satu tingkat other_level.

Referensi#