Faktor

Faktor sebagai penyimpanan data kategorikal dengan sekumpulan tingkat yang terkontrol.

Daftar isi

Angka hasil pengukuran disimpan sebagai vektor biasa, tetapi banyak data analisis berbentuk kategori, misalnya kelas A, B, dan C, jenis kelamin, atau tingkat pendidikan. R memperlakukan data semacam itu dengan tipe khusus bernama faktor, yaitu penyimpanan yang isinya dibatasi oleh sekumpulan tingkat (level) yang ditetapkan lebih dahulu. Topik ini membahas pembuatan faktor, pengendalian urutan tingkatnya, penyimpanan internalnya, serta penanganan tingkat yang tak terpakai dan nilai yang berada di luar tingkat.

Membuat faktor dan tingkatnya#

Fungsi factor() membentuk faktor dari vektor teks. Tingkat (level) adalah daftar nilai yang sah untuk faktor tersebut, dan secara bawaan tersusun alfabetis. Contoh berikut mengubah enam label kelas menjadi faktor.

r Contoh: membuat faktor dari vektor teks
kelas <- c("A", "B", "A", "C", "B", "A")
f <- factor(kelas)
f
text Keluaran
[1] A B A C B A
Levels: A B C

Cetakan faktor menampilkan isinya tanpa tanda kutip, lalu baris Levels berisi tingkat yang tersedia. Daftar tingkat dibaca dengan levels(), sedangkan frekuensi tiap tingkat dihitung dengan table(). Perhatikan bahwa tanda kutip hilang pada cetakan faktor karena isinya bukan lagi teks biasa, melainkan kode tingkat, sebagaimana dijelaskan pada bagian berikutnya.

r Contoh: tingkat dan frekuensi faktor
levels(f)
table(f)
text Keluaran
[1] "A" "B" "C"
f
A B C
3 2 1

Mengendalikan urutan tingkat#

Urutan alfabetis tidak selalu bermakna. Untuk ukuran Kecil, Sedang, dan Besar, urutan alfabetis justru menempatkan Besar lebih dahulu, padahal urutan yang diharapkan adalah dari yang terkecil.

r Contoh: urutan tingkat bawaan yang alfabetis
ukuran <- factor(c("Sedang", "Besar", "Kecil", "Sedang"))
levels(ukuran)
text Keluaran
[1] "Besar"  "Kecil"  "Sedang"

Argumen levels pada factor() menetapkan urutan tingkat secara eksplisit. Urutan ini digunakan R saat membandingkan, mengurutkan, dan menyusun sumbu grafik, sehingga pengendaliannya penting untuk data kategorikal yang tingkatnya bertahap. Faktor semacam ini juga dapat dinyatakan secara formal melalui argumen ordered = TRUE, yang menandai tingkatnya sebagai data ordinal.

r Contoh: menetapkan urutan tingkat
ukuran <- factor(c("Sedang", "Besar", "Kecil", "Sedang"),
                 levels = c("Kecil", "Sedang", "Besar"))
levels(ukuran)
as.integer(ukuran)
text Keluaran
[1] "Kecil"  "Sedang" "Besar"
[1] 2 3 1 2

Keluaran as.integer() memperlihatkan kode penyimpanan tiap nilai, dan kodenya mengikuti urutan tingkat yang ditetapkan. Nilai Sedang disimpan sebagai 2, Besar sebagai 3, dan Kecil sebagai 1.

Penyimpanan internal dan kegunaannya#

Di belakang layar, faktor menyimpan kode bilangan bulat yang menunjuk daftar tingkatnya, bukan teks yang berulang-ulang.

r Contoh: kode internal faktor
as.integer(f)
text Keluaran
[1] 1 2 1 3 2 1

Nilai A tersimpan sebagai 1, B sebagai 2, dan C sebagai 3, mengikuti urutan tingkatnya. Cara penyimpanan ini memberi tiga keuntungan praktis. Dari sisi memori, satu bilangan bulat jauh lebih ringkas daripada teks yang berulang pada data berukuran besar. Dari sisi pemodelan, fungsi seperti lm() membaca tingkat faktor dan membentuk variabel dummy (dummy variable) untuk tiap tingkat secara otomatis. Dari sisi grafik, paket seperti ggplot2 menempatkan kategori faktor pada sumbu diskrit dengan urutan tingkat yang sudah ditetapkan. Ketiganya menjadi alasan data kategorikal diperlakukan khusus dan tidak dibiarkan sebagai teks biasa.

Tingkat yang tak terpakai#

Faktor dapat dibuat dengan tingkat yang belum muncul dalam datanya, misalnya ketika data yang terkumpul hanya sebagian dari seluruh kategori yang mungkin. Tingkat semacam itu tetap tercatat, dan table() menampilkan hitungannya sebagai nol.

r Contoh: tingkat yang tak terpakai
hobi <- factor(c("Membaca", "Olahraga", "Membaca"),
               levels = c("Membaca", "Olahraga", "Musik", "Memasak"))
table(hobi)
text Keluaran
hobi
 Membaca Olahraga    Musik  Memasak
       2        1        0        0

Tingkat yang memang tidak diperlukan lagi dapat dilepas dengan droplevels(), sehingga daftar tingkatnya kembali hanya memuat yang terpakai. Fungsi tersebut mengembalikan faktor baru tanpa mengubah objek aslinya, sehingga hobi tetap memuat empat tingkat bila diperiksa ulang.

r Contoh: melepas tingkat tak terpakai
droplevels(hobi)
text Keluaran
[1] Membaca  Olahraga Membaca
Levels: Membaca Olahraga

Memaksa nilai di luar tingkat#

Kebalikan tingkat tak terpakai adalah nilai yang tidak terdaftar di tingkat mana pun. Pada pembuatan faktor, nilai semacam itu langsung diubah menjadi NA tanpa peringatan apa pun.

r Contoh: nilai di luar tingkat saat pembuatan
factor("Menari", levels = c("Membaca", "Olahraga"))
text Keluaran
[1] <NA>
Levels: Membaca Olahraga

Perilakunya berbeda pada penugasan ke elemen faktor yang sudah ada. Kasus ini memunculkan peringatan invalid factor level, dan elemen yang ditugaskan menjadi NA.

r Contoh: penugasan di luar tingkat
hobi[4] <- "Menari"
hobi
text Keluaran
Warning in `[<-.factor`(`*tmp*`, 4, value = "Menari") :
  invalid factor level, NA generated
[1] Membaca  Olahraga Membaca  <NA>
Levels: Membaca Olahraga Musik Memasak

Kedua perilaku ini mengikuti logika yang sama, yaitu faktor tidak boleh berisi nilai di luar tingkatnya. Solusinya adalah menetapkan tingkat yang lengkap sejak awal, atau menyusun ulang faktornya dengan daftar tingkat yang lebih lengkap melalui factor().

Ringkasan#

  • factor() mengubah vektor teks menjadi faktor dengan tingkat yang tersusun alfabetis secara bawaan.
  • Argumen levels menetapkan urutan tingkat, dan urutan itu digunakan saat membandingkan, mengurutkan, serta menyusun grafik.
  • Faktor menyimpan kode bilangan bulat yang menunjuk daftar tingkatnya, sehingga hemat memori dan dikenali oleh fungsi pemodelan maupun grafik.
  • Tingkat yang tak terpakai tetap muncul dengan hitungan nol pada table() dan dapat dilepas dengan droplevels().
  • Nilai di luar tingkat menjadi NA, dengan peringatan pada penugasan dan tanpa peringatan pada pembuatan faktor.

Referensi#