☕ Pra-pemrosesan Data Penjualan Kafe

Eksplorasi, pemeriksaan kualitas data, Label Encoding, dan One-Hot Encoding untuk mempersiapkan data menuju tahap analisis dan pemodelan.

1 Pendahuluan

1.1 Latar Belakang

Data penjualan kafe merupakan salah satu sumber informasi yang dapat digunakan untuk mengetahui karakteristik transaksi, jenis produk yang dijual, jumlah produk yang dibeli, serta lokasi transaksi. Namun, sebelum data digunakan untuk analisis lebih lanjut, diperlukan proses pra-pemrosesan agar data memiliki struktur yang sesuai dan dapat diolah dengan baik.

Pra-pemrosesan data merupakan tahap penting dalam analisis data karena kondisi data yang belum terstruktur dapat memengaruhi hasil analisis maupun pemodelan. Salah satu proses yang dilakukan dalam pra-pemrosesan adalah mengubah variabel kategorik menjadi bentuk numerik. Hal ini diperlukan karena sebagian metode analisis dan algoritma pemodelan membutuhkan data dalam bentuk numerik.

Pada data penjualan kafe, variabel seperti Item, Location, dan Quantity dapat diperlakukan sebagai variabel kategorik. Oleh karena itu, digunakan dua metode encoding, yaitu Label Encoding dan One-Hot Encoding. Label Encoding memberikan kode numerik pada setiap kategori, sedangkan One-Hot Encoding mengubah setiap kategori menjadi variabel dummy dengan nilai 0 dan 1.

Selain proses encoding, data juga perlu diperiksa terlebih dahulu melalui pemeriksaan struktur, ukuran data, missing value, serta nilai ERROR dan UNKNOWN. Pemeriksaan tersebut dilakukan untuk memastikan bahwa data yang digunakan berada dalam kondisi yang layak untuk tahap analisis selanjutnya.

Fokus analisis: memastikan data memiliki kualitas yang baik, memahami distribusi variabel, serta membandingkan dua pendekatan encoding untuk variabel kategorik.

1.2 Rumusan Masalah

  1. Bagaimana kondisi awal dan kualitas data penjualan kafe berdasarkan struktur, ukuran data, missing value, ERROR, dan UNKNOWN?
  2. Bagaimana distribusi variabel Item, Location, dan Quantity?
  3. Bagaimana penerapan Label Encoding pada variabel kategorik?
  4. Bagaimana penerapan One-Hot Encoding pada variabel kategorik?
  5. Bagaimana perbandingan hasil data setelah dilakukan encoding?

1.3 Tujuan

  1. Mengetahui kondisi awal dan kualitas data penjualan kafe.
  2. Mengetahui distribusi variabel Item, Location, dan Quantity.
  3. Menerapkan Label Encoding pada variabel kategorik.
  4. Menerapkan One-Hot Encoding dalam bentuk variabel dummy.
  5. Membandingkan hasil dan ukuran data setelah proses encoding.
  6. Menyiapkan data untuk tahap analisis atau pemodelan berikutnya.

2 Menyiapkan Data

2.1 Membaca Data

Data dibaca menggunakan read.csv(). File menggunakan pemisah titik koma sehingga digunakan sep = ";".

data <- read.csv(
  "C:/Users/LENOVO/Downloads/Cleaning Data 1.csv",
  header = TRUE,
  sep = ";",
  stringsAsFactors = FALSE
)

head(data)

Catatan: Jika file dipindahkan ke komputer lain atau digunakan di RPubs, sesuaikan lokasi file CSV atau letakkan file pada working directory yang digunakan.

3 Kondisi Awal Data

3.1 Ukuran dan Struktur

jumlah_baris <- nrow(data)
jumlah_kolom <- ncol(data)

dim(data)
## [1] 1000    8
str(data)
## 'data.frame':    1000 obs. of  8 variables:
##  $ Transaction.ID: chr  "TXN_2176024" "TXN_6327139" "TXN_5488764" "TXN_9530003" ...
##  $ Item          : chr  "Coffee" "Sandwich" "Coffee" "Salad" ...
##  $ Quantity      : int  5 4 4 1 5 3 3 1 3 1 ...
##  $ Price.Per.Unit: chr  "2.0" "4.0" "2.0" "5.0" ...
##  $ Total.Spent   : chr  "10.0" "16.0" "8.0" "5.0" ...
##  $ Payment.Method: chr  "Digital Wallet" "Credit Card" "Digital Wallet" "Digital Wallet" ...
##  $ Location      : chr  "In-store" "Takeaway" "Takeaway" "Takeaway" ...
##  $ X             : logi  NA NA NA NA NA NA ...

1000 Observasi

8 Variabel

8 Kolom

4 Pemilihan dan Pembersihan Data

4.1 Memilih Variabel

Variabel yang digunakan adalah Item, Quantity, dan Location.

data_clean <- data[, c(
  "Item",
  "Quantity",
  "Location"
)]

head(data_clean, 5)

4.2 Ukuran Data

dim(data_clean)
## [1] 1000    3

5 Pemeriksaan Kualitas Data

5.1 Missing Value

missing_table <- data.frame(
  Variabel = names(data_clean),
  Missing = colSums(is.na(data_clean))
)

knitr::kable(
  missing_table,
  caption = "Jumlah Missing Value pada Setiap Variabel",
  align = "c"
)
Jumlah Missing Value pada Setiap Variabel
Variabel Missing
Item Item 0
Quantity Quantity 0
Location Location 0

5.2 ERROR dan UNKNOWN

jumlah_error <- sum(
  sapply(
    data_clean,
    function(x) {
      sum(as.character(x) == "ERROR", na.rm = TRUE)
    }
  )
)

jumlah_unknown <- sum(
  sapply(
    data_clean,
    function(x) {
      sum(as.character(x) == "UNKNOWN", na.rm = TRUE)
    }
  )
)

total_missing <- sum(is.na(data_clean))

quality_table <- data.frame(
  Pemeriksaan = c(
    "Missing Value",
    "ERROR",
    "UNKNOWN"
  ),
  Jumlah = c(
    total_missing,
    jumlah_error,
    jumlah_unknown
  )
)

knitr::kable(
  quality_table,
  caption = "Ringkasan Kualitas Data",
  align = "c"
)
Ringkasan Kualitas Data
Pemeriksaan Jumlah
Missing Value 0
ERROR 0
UNKNOWN 0

0 Missing Value

0 ERROR

0 UNKNOWN

quality_plot <- c(
  total_missing,
  jumlah_error,
  jumlah_unknown
)

names(quality_plot) <- c(
  "Missing Value",
  "ERROR",
  "UNKNOWN"
)

barplot(
  quality_plot,
  col = biru,
  border = NA,
  main = "Pemeriksaan Kualitas Data",
  xlab = "Jenis Pemeriksaan",
  ylab = "Jumlah",
  ylim = c(0, max(quality_plot, 1) * 1.2)
)

Interpretasi: Grafik di atas memberikan gambaran cepat mengenai kondisi kualitas data sebelum dilakukan transformasi dan encoding.

6 Eksplorasi Distribusi Data

6.1 Distribusi Item

item_freq <- sort(
  table(data_clean$Item),
  decreasing = TRUE
)

knitr::kable(
  as.data.frame(item_freq),
  col.names = c("Item", "Frekuensi"),
  caption = "Distribusi Item"
)
Distribusi Item
Item Frekuensi
Cake 138
Smoothie 136
Tea 135
Salad 126
Sandwich 123
Coffee 118
Juice 114
Cookie 110
par(mar = c(8, 4, 4, 2) + 0.1)

barplot(
  item_freq,
  col = biru,
  border = NA,
  main = "Distribusi Penjualan Berdasarkan Item",
  xlab = "",
  ylab = "Frekuensi",
  las = 2,
  cex.names = 0.75
)

par(mar = c(5, 4, 4, 2) + 0.1)

Insight: Distribusi Item menunjukkan kategori produk yang paling sering muncul dalam data transaksi. Kategori dengan batang lebih tinggi memiliki frekuensi transaksi yang lebih besar.

6.2 Distribusi Location

location_freq <- sort(
  table(data_clean$Location),
  decreasing = TRUE
)

knitr::kable(
  as.data.frame(location_freq),
  col.names = c("Location", "Frekuensi"),
  caption = "Distribusi Location"
)
Distribusi Location
Location Frekuensi
Takeaway 700
In-store 300
location_freq_rev <- rev(location_freq)

barplot(
  location_freq_rev,
  horiz = TRUE,
  col = biru_tua,
  border = NA,
  main = "Distribusi Transaksi Berdasarkan Location",
  xlab = "Frekuensi",
  las = 1
)

Insight: Grafik horizontal digunakan agar nama lokasi lebih mudah dibaca dan perbandingan frekuensi antarlokasi lebih jelas.

6.3 Distribusi Quantity

quantity_freq <- sort(
  table(data_clean$Quantity),
  decreasing = FALSE
)

knitr::kable(
  as.data.frame(quantity_freq),
  col.names = c("Quantity", "Frekuensi"),
  caption = "Distribusi Quantity"
)
Distribusi Quantity
Quantity Frekuensi
3 179
1 195
2 203
4 204
5 219
barplot(
  quantity_freq,
  col = biru_muda,
  border = NA,
  main = "Distribusi Jumlah Produk per Transaksi",
  xlab = "Quantity",
  ylab = "Frekuensi"
)

7 Mengubah Tipe Data

7.1 Faktor

Variabel kategorik diubah menjadi tipe faktor agar dapat digunakan dalam proses encoding.

data_factor <- data_clean

data_factor$Item <- factor(data_factor$Item)
data_factor$Location <- factor(data_factor$Location)
data_factor$Quantity <- factor(data_factor$Quantity)

str(data_factor)
## 'data.frame':    1000 obs. of  3 variables:
##  $ Item    : Factor w/ 8 levels "Cake","Coffee",..: 2 6 2 5 6 7 5 5 4 2 ...
##  $ Quantity: Factor w/ 5 levels "1","2","3","4",..: 5 4 4 1 5 3 3 1 3 1 ...
##  $ Location: Factor w/ 2 levels "In-store","Takeaway": 1 2 2 2 2 1 2 2 1 2 ...

8 Label Encoding

8.1 Proses Label Encoding

Label Encoding mengubah setiap kategori menjadi kode numerik berdasarkan urutan level faktor.

data_label <- data_factor

data_label$Item_Code <- as.integer(data_label$Item)
data_label$Location_Code <- as.integer(data_label$Location)
data_label$Quantity_Code <- as.integer(data_label$Quantity)

head(data_label, 5)

8.2 Dictionary Encoding

dictionary_item <- data.frame(
  Item = levels(data_factor$Item),
  Kode = seq_along(levels(data_factor$Item))
)

knitr::kable(
  dictionary_item,
  caption = "Dictionary Label Encoding Item",
  align = "c"
)
Dictionary Label Encoding Item
Item Kode
Cake 1
Coffee 2
Cookie 3
Juice 4
Salad 5
Sandwich 6
Smoothie 7
Tea 8
dictionary_location <- data.frame(
  Location = levels(data_factor$Location),
  Kode = seq_along(levels(data_factor$Location))
)

knitr::kable(
  dictionary_location,
  caption = "Dictionary Label Encoding Location",
  align = "c"
)
Dictionary Label Encoding Location
Location Kode
In-store 1
Takeaway 2
dictionary_quantity <- data.frame(
  Quantity = levels(data_factor$Quantity),
  Kode = seq_along(levels(data_factor$Quantity))
)

knitr::kable(
  dictionary_quantity,
  caption = "Dictionary Label Encoding Quantity",
  align = "c"
)
Dictionary Label Encoding Quantity
Quantity Kode
1 1
2 2
3 3
4 4
5 5

Catatan: Kode Label Encoding merupakan representasi numerik dari kategori berdasarkan urutan level faktor. Kode tersebut tidak otomatis menunjukkan bahwa satu kategori lebih tinggi atau lebih rendah daripada kategori lainnya.

9 One-Hot Encoding

9.1 Membuat Variabel Dummy

item_dummy <- model.matrix(
  ~ Item - 1,
  data = data_factor
)

location_dummy <- model.matrix(
  ~ Location - 1,
  data = data_factor
)

quantity_dummy <- model.matrix(
  ~ Quantity - 1,
  data = data_factor
)

onehot_contoh <- data.frame(
  quantity_dummy,
  item_dummy,
  location_dummy
)

head(onehot_contoh, 5)

9.2 Dataset Akhir

data_onehot <- data.frame(
  quantity_dummy,
  item_dummy,
  location_dummy
)

jumlah_baris_onehot <- nrow(data_onehot)
jumlah_kolom_onehot <- ncol(data_onehot)

dim(data_onehot)
## [1] 1000   15

1000 Baris One-Hot

15 Kolom One-Hot

0 / 1 Nilai Dummy

10 Visualisasi Hasil One-Hot Encoding

10.1 Contoh Representasi Dummy

contoh_onehot <- data_onehot[1:min(12, nrow(data_onehot)), ]

mat_onehot <- as.matrix(contoh_onehot)

image(
  t(mat_onehot[nrow(mat_onehot):1, , drop = FALSE]),
  axes = FALSE,
  col = c("#F1F5F9", "#2563EB"),
  main = "Heatmap Representasi One-Hot Encoding",
  xlab = "Variabel Dummy",
  ylab = "Observasi"
)

axis(
  1,
  at = seq(0, 1, length.out = ncol(mat_onehot)),
  labels = colnames(mat_onehot),
  las = 2,
  cex.axis = 0.55
)

axis(
  2,
  at = seq(0, 1, length.out = nrow(mat_onehot)),
  labels = rev(rownames(mat_onehot)),
  las = 1
)

box()

Cara membaca: Nilai 1 menunjukkan bahwa kategori tersebut aktif pada observasi tertentu, sedangkan nilai 0 menunjukkan kategori tersebut tidak aktif.

11 Validasi Encoding

11.1 Pemeriksaan One-Hot Encoding

Validasi dilakukan untuk memastikan setiap observasi memiliki tepat satu kategori aktif pada masing-masing kelompok variabel.

item_valid <- all(
  rowSums(item_dummy) == 1
)

location_valid <- all(
  rowSums(location_dummy) == 1
)

quantity_valid <- all(
  rowSums(quantity_dummy) == 1
)

validasi_table <- data.frame(
  Variabel = c(
    "Item",
    "Location",
    "Quantity"
  ),
  Validasi = c(
    item_valid,
    location_valid,
    quantity_valid
  )
)

knitr::kable(
  validasi_table,
  caption = "Hasil Validasi One-Hot Encoding",
  align = "c"
)
Hasil Validasi One-Hot Encoding
Variabel Validasi
Item TRUE
Location TRUE
Quantity TRUE

Interpretasi: Nilai TRUE menunjukkan bahwa setiap baris memiliki tepat satu kategori aktif pada kelompok variabel yang diperiksa.

12 Perbandingan Hasil

12.1 Perbandingan Ukuran Data

perbandingan <- data.frame(
  Tahap = c(
    "Data Awal",
    "Setelah Pemilihan Variabel",
    "Setelah One-Hot Encoding"
  ),
  Baris = c(
    nrow(data),
    nrow(data_clean),
    nrow(data_onehot)
  ),
  Kolom = c(
    ncol(data),
    ncol(data_clean),
    ncol(data_onehot)
  )
)

knitr::kable(
  perbandingan,
  caption = "Perbandingan Ukuran Data pada Setiap Tahap",
  align = "c"
)
Perbandingan Ukuran Data pada Setiap Tahap
Tahap Baris Kolom
Data Awal 1000 8
Setelah Pemilihan Variabel 1000 3
Setelah One-Hot Encoding 1000 15
kolom_tahap <- c(
  ncol(data),
  ncol(data_clean),
  ncol(data_onehot)
)

names(kolom_tahap) <- c(
  "Data Awal",
  "Pemilihan Variabel",
  "One-Hot Encoding"
)

barplot(
  kolom_tahap,
  col = c(biru_tua, biru, biru_muda),
  border = NA,
  main = "Perubahan Jumlah Variabel",
  xlab = "Tahap Pengolahan",
  ylab = "Jumlah Kolom",
  ylim = c(0, max(kolom_tahap) * 1.2)
)

12.2 Perbandingan Metode

Label Encoding menghasilkan satu kode numerik untuk setiap kategori sehingga jumlah variabel relatif tetap sederhana. Namun, kode numerik dapat menimbulkan kesan adanya urutan antar kategori.

One-Hot Encoding menghasilkan variabel dummy bernilai 0 dan 1 untuk setiap kategori. Pendekatan ini lebih aman untuk variabel kategorik nominal karena tidak memberikan makna tingkatan pada kategori.

13 Ringkasan Hasil

ringkasan <- data.frame(
  Indikator = c(
    "Jumlah observasi awal",
    "Jumlah variabel awal",
    "Variabel yang digunakan",
    "Missing Value",
    "ERROR",
    "UNKNOWN",
    "Kolom hasil One-Hot Encoding"
  ),
  Nilai = c(
    nrow(data),
    ncol(data),
    ncol(data_clean),
    total_missing,
    jumlah_error,
    jumlah_unknown,
    ncol(data_onehot)
  )
)

knitr::kable(
  ringkasan,
  caption = "Ringkasan Hasil Pra-pemrosesan",
  align = "c"
)
Ringkasan Hasil Pra-pemrosesan
Indikator Nilai
Jumlah observasi awal 1000
Jumlah variabel awal 8
Variabel yang digunakan 3
Missing Value 0
ERROR 0
UNKNOWN 0
Kolom hasil One-Hot Encoding 15

14 Menyimpan Data

14.1 Menyimpan Hasil Encoding

write.csv(
  data_onehot,
  "data_kafe_onehot.csv",
  row.names = FALSE
)

Output: Dataset hasil One-Hot Encoding telah disimpan dengan nama data_kafe_onehot.csv dan dapat digunakan untuk tahap analisis atau pemodelan berikutnya.

15 Kesimpulan

Berdasarkan proses pra-pemrosesan yang telah dilakukan, data penjualan kafe berhasil dipersiapkan melalui beberapa tahap, yaitu pemeriksaan kondisi awal data, pemilihan variabel, pemeriksaan kualitas data, analisis distribusi, perubahan tipe data menjadi faktor, Label Encoding, dan One-Hot Encoding.

Pemeriksaan kualitas data dilakukan melalui identifikasi missing value, ERROR, dan UNKNOWN. Selanjutnya, distribusi Item, Location, dan Quantity divisualisasikan untuk memberikan gambaran mengenai karakteristik data.

Label Encoding menghasilkan representasi kategori dalam bentuk kode numerik. Sementara itu, One-Hot Encoding mengubah kategori menjadi variabel dummy bernilai 0 dan 1. Validasi dilakukan untuk memastikan bahwa proses One-Hot Encoding telah menghasilkan representasi kategori yang sesuai.

Dengan demikian, data hasil pra-pemrosesan telah berada dalam bentuk yang lebih terstruktur dan dapat digunakan sebagai dasar untuk analisis atau pemodelan data pada tahap berikutnya.

16 Daftar Pustaka

  • James, G., Witten, D., Hastie, T., & Tibshirani, R. An Introduction to Statistical Learning.
  • R Core Team. R: A Language and Environment for Statistical Computing.