Eksplorasi, pemeriksaan kualitas data, Label Encoding, dan One-Hot Encoding untuk mempersiapkan data menuju tahap analisis dan pemodelan.
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.
ERROR, dan
UNKNOWN?Item,
Location, dan Quantity?Item,
Location, dan Quantity.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.
## [1] 1000 8
## '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
Variabel yang digunakan adalah Item,
Quantity, dan Location.
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"
)| Variabel | Missing | |
|---|---|---|
| Item | Item | 0 |
| Quantity | Quantity | 0 |
| Location | Location | 0 |
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"
)| 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.
item_freq <- sort(
table(data_clean$Item),
decreasing = TRUE
)
knitr::kable(
as.data.frame(item_freq),
col.names = c("Item", "Frekuensi"),
caption = "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
)Insight: Distribusi Item menunjukkan kategori produk yang paling sering muncul dalam data transaksi. Kategori dengan batang lebih tinggi memiliki frekuensi transaksi yang lebih besar.
location_freq <- sort(
table(data_clean$Location),
decreasing = TRUE
)
knitr::kable(
as.data.frame(location_freq),
col.names = c("Location", "Frekuensi"),
caption = "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.
quantity_freq <- sort(
table(data_clean$Quantity),
decreasing = FALSE
)
knitr::kable(
as.data.frame(quantity_freq),
col.names = c("Quantity", "Frekuensi"),
caption = "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"
)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 ...
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)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"
)| 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"
)| 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"
)| 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.
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)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.
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"
)| 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.
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"
)| 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)
)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.
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"
)| 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 |
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.