1 PENDAHULUAN

1.1 Latar Belakang

Data merupakan salah satu sumber informasi yang dapat digunakan untuk memahami suatu peristiwa. Data yang diperoleh dari kondisi nyata tidak selalu berada dalam kondidi yang siap untuk dianalisis karena dapat mengandung nilai kosong, tidak valid, maupun tidak konsisten.

Oleh karena itu, diperlukan proses indentifikasi, pemeriksaan, dan persiapan data sebelum dilakukan analisis lebih lanjut. Dalam analisis ini digunakan data populasi dan data sampel transaksi penjualan cafe. Kedua data tersebut akan diperiksa dan dibersihkan sebelum digunakan pada tahap analisis selanjutnya.

1.2 Tujuan Analisis

  1. Mengidentifikasi struktur, karakteristik, serta permasalahan pada data mentah.
  2. Melakukan proses cleaning data berdasarkan variabel yang dipilih.
  3. Melakukan eksplorasi distribusi
  4. Melakukan integrasi data
  5. Melakukan transformasi data kategorik I
  6. Melakukan transformasi data kategorik II
  7. Melakukan transformasi data numerik

Tujuan Analisis dengan variabel yang dipilih:

  1. Menganalisis hubungan antara jenis item yang dibeli (kategorik) dengan jumlah barang yang dibeli (numerik).
  2. Menganalisis hubungan antara lokasi pembelian (kategorik) dengan jumlah barang yang dibeli (numerik).

1.3 Data yang Digunakan

Data yang digunakan merupakan data sekunder, dimana data yang sebelumnya telah dikumpulkan oleh pihak lain dan kemudian digunakan untuk dianalisis. Data ini diterbitkan oleh Ahmed Mohammed yaitu data berupa transaksi penjualan cafe tahun 2023, data diambil dari kaggle.

1.3.1 Variabel Data

  1. Transaction ID
  2. Item
  3. Quantity
  4. Price Per Unit
  5. Total Spent
  6. Payment Method
  7. Location
  8. Transaction Date

1.3.2 Variabel yang Digunakan

  1. Item sebagai variabel ketegorik.
  2. Quantity sebagai variabel numerik.
  3. Location sebagai variabel kategprik.

Variabel lainnya digunakan sebagai informasi pendukung dalam proses identifikasi dan cleaning data.

1.4 Sumber dan Struktur Data

Analisis dimulai dari data yang awalnya berjumlah 10.000, lalu dipilih data sampel sebanyak 1000 data atau 10% dari data awal untuk dianalisis, lalu data disimpan dalam format CSV.

2 IDENTIFIKASI DAN CLEANING DATA

2.1 Pengambilan Data

2.1.1 Data Asli

data_populasi <- read.csv("D:\\DOWNLOAD\\ADE\\DATA ASLI.csv", header = TRUE, sep = ",")
knitr::kable(
  head(data_populasi, 100),
  caption = "100 Observasi Awal Data Populasi"
)
100 Observasi Awal Data Populasi
Transaction.ID Item Quantity Price.Per.Unit Total.Spent Payment.Method Location Transaction.Date
TXN_1961373 Coffee 2 2 4 Credit Card Takeaway 9/8/2023
TXN_4977031 Cake 4 3 12 Cash In-store 5/16/2023
TXN_4271903 Cookie 4 1 ERROR Credit Card In-store 7/19/2023
TXN_7034554 Salad 2 5 10 UNKNOWN UNKNOWN 4/27/2023
TXN_3160411 Coffee 2 2 4 Digital Wallet In-store 6/11/2023
TXN_2602893 Smoothie 5 4 20 Credit Card 3/31/2023
TXN_4433211 UNKNOWN 3 3 9 ERROR Takeaway 10/6/2023
TXN_6699534 Sandwich 4 4 16 Cash UNKNOWN 10/28/2023
TXN_4717867 5 3 15 Takeaway 7/28/2023
TXN_2064365 Sandwich 5 4 20 In-store 12/31/2023
TXN_2548360 Salad 5 5 25 Cash Takeaway 11/7/2023
TXN_3051279 Sandwich 2 4 8 Credit Card Takeaway ERROR
TXN_7619095 Sandwich 2 4 8 Cash In-store 5/3/2023
TXN_9437049 Cookie 5 1 5 Takeaway 6/1/2023
TXN_8915701 ERROR 2 1.5 3 In-store 3/21/2023
TXN_2847255 Salad 3 5 15 Credit Card In-store 11/15/2023
TXN_3765707 Sandwich 1 4 4 6/10/2023
TXN_6769710 Juice 2 3 6 Cash In-store 2/24/2023
TXN_8876618 Cake 5 3 15 Cash ERROR 3/25/2023
TXN_3709394 Juice 4 3 12 Cash Takeaway 1/15/2023
TXN_3522028 Smoothie ERROR 4 20 Cash In-store 4/4/2023
TXN_3567645 Smoothie 4 4 16 Credit Card Takeaway 3/30/2023
TXN_5132361 Sandwich 3 4 12 Digital Wallet Takeaway 12/1/2023
TXN_2616390 Sandwich 2 4 8 9/18/2023
TXN_9400181 Sandwich 5 4 20 Cash In-store 6/3/2023
TXN_7958992 Smoothie 3 4 UNKNOWN UNKNOWN 12/13/2023
TXN_5183041 Cookie 5 1 5 Credit Card In-store 4/20/2023
TXN_5695074 Juice 4 3 12 Credit Card Takeaway 4/10/2023
TXN_8467949 Smoothie 5 4 20 Credit Card 3/11/2023
TXN_7640952 Cake 4 3 12 Digital Wallet Takeaway ERROR
TXN_1736287 5 2 10 Digital Wallet 6/2/2023
TXN_8927252 UNKNOWN 2 1 ERROR Credit Card ERROR 11/6/2023
TXN_9677376 Smoothie 4 4 16 In-store 8/15/2023
TXN_7710508 UNKNOWN 5 1 5 Cash ERROR
TXN_8853997 Smoothie 2 4 8 Digital Wallet Takeaway 10/9/2023
TXN_9130559 Sandwich 1 4 4 Credit Card UNKNOWN 5/28/2023
TXN_6855453 UNKNOWN 4 3 12 In-store 7/17/2023
TXN_1080432 Salad 2 5 10 Credit Card In-store 4/29/2023
TXN_2655815 Smoothie 4 4 16 Takeaway 6/8/2023
TXN_6688524 Coffee 4 2 8 ERROR 6/29/2023
TXN_2083138 Smoothie 3 4 12 In-store 4/17/2023
TXN_2427584 Sandwich 4 4 16 Takeaway 12/22/2023
TXN_6650263 Tea 2 1.5 UNKNOWN Takeaway 1/10/2023
TXN_9620080 Juice 4 3 12 Takeaway 10/2/2023
TXN_1491578 Cookie 2 1 2 2/23/2023
TXN_5455792 Salad 3 5 15 Cash 3/22/2023
TXN_8078640 Juice 4 3 12 Digital Wallet In-store 11/3/2023
TXN_9499313 Juice 5 3 15 3/2/2023
TXN_8201146 Juice 5 3 15 Cash 6/26/2023
TXN_8230936 Cake 3 3 9 ERROR 5/2/2023
TXN_7742742 Cake 5 3 15 Takeaway 9/5/2023
TXN_6342161 Salad 5 5 25 ERROR Takeaway 1/8/2023
TXN_8914892 UNKNOWN 5 5 25 Digital Wallet 3/15/2023
TXN_3363746 Smoothie 3 4 12 Credit Card 11/25/2023
TXN_8614868 Smoothie 5 4 20 Digital Wallet Takeaway 12/5/2023
TXN_5522862 Cookie ERROR 1 2 Credit Card Takeaway 3/19/2023
TXN_3578141 Cake 5 15 Takeaway 6/27/2023
TXN_2080895 Cake UNKNOWN 3 3 Digital Wallet In-store 4/19/2023
TXN_6421134 Sandwich 4 4 16 Cash Takeaway 11/3/2023
TXN_8813311 Juice 5 3 15 In-store 10/7/2023
TXN_9023317 Salad 1 5 5 9/30/2023
TXN_8051289 1 3 3 In-store 10/9/2023
TXN_2537617 Sandwich 1 4 4 Cash 5/27/2023
TXN_9099694 UNKNOWN 3 5 15 Takeaway 11/18/2023
TXN_9230615 Smoothie 4 4 16 Digital Wallet 6/1/2023
TXN_4987129 Sandwich 3 In-store 10/20/2023
TXN_8501819 Juice 3 6 Cash 3/30/2023
TXN_3068204 Cookie 1 1 1 Credit Card Takeaway 10/3/2023
TXN_8427104 Salad 2 ERROR 10 In-store 10/27/2023
TXN_8471743 ERROR 5 3 15 Digital Wallet In-store 4/6/2023
TXN_2621580 Tea 2 1.5 3 Cash In-store 3/22/2023
TXN_4726376 Cake 2 3 6 Credit Card In-store 1/31/2023
TXN_6044979 1 1 1 Cash In-store 12/8/2023
TXN_4238417 Salad 2 5 10 ERROR 6/19/2023
TXN_1900620 Smoothie 2 4 8 Credit Card ERROR 12/14/2023
TXN_6420335 Coffee 1 2 2 Cash Takeaway 7/16/2023
TXN_3858209 Sandwich 4 4 16 Cash 2/22/2023
TXN_2091733 Salad 1 5 5 In-store
TXN_8735480 Tea 5 1.5 7.5 Cash 6/2/2023
TXN_3829165 Juice 4 3 12 Cash In-store 6/15/2023
TXN_3748616 Coffee 2 2 4 Credit Card In-store 12/9/2023
TXN_1993289 Sandwich 2 4 8 In-store 4/18/2023
TXN_2123367 Cookie 2 1 2 11/7/2023
TXN_5266394 Cake 3 3 9 Cash In-store 10/28/2023
TXN_5107946 Cake 4 3 12 Credit Card 12/22/2023
TXN_8035512 Tea 3 4.5 Cash UNKNOWN 10/29/2023
TXN_8718498 Cake 5 3 15 Credit Card ERROR 4/30/2023
TXN_3955361 Cookie 5 1 5 Takeaway 4/2/2023
TXN_9487821 ERROR 1 5 5 Digital Wallet Takeaway 5/24/2023
TXN_4132730 5 1 5 In-store 3/12/2023
TXN_8976658 Tea 2 1.5 3 Credit Card In-store 8/16/2023
TXN_5455936 UNKNOWN 5 3 15 In-store 10/28/2023
TXN_2725602 Juice 5 3 15 Credit Card 9/10/2023
TXN_3011323 Coffee 3 2 6 Credit Card 3/7/2023
TXN_6289610 Juice 3 3 UNKNOWN Cash Takeaway 8/7/2023
TXN_8268061 Salad 3 5 15 ERROR Takeaway 8/20/2023
TXN_5220895 Salad 5 5 25 Cash In-store 6/10/2023
TXN_3085509 Coffee 4 2 8 Digital Wallet In-store 4/15/2023
TXN_9999113 Juice 4 3 12 Cash Takeaway 5/27/2023
TXN_8779771 Coffee 4 2 8 Cash In-store 7/25/2023

Data asli yang diambil dari kaggle ini terdapat 10.000 data lalu diambil 10% nya, menurut Haq & Barlan (2020) dalam Jurnal Sains Komunikasi dan Pengembangan Masyarakat (IPB) yang menggunakan batas toleransi kesalahan 10% dalam menentukan ukuran sampel.

2.1.2 Data Sampel

data_sampel <- read.csv("D:\\DOWNLOAD\\ADE\\data_sampel.csv", header = TRUE, sep = ",")
knitr::kable(
  head(data_sampel, 100),
  caption = "100 Observasi Awal Data Sampel"
)
100 Observasi Awal Data Sampel
Transaction.ID Item Quantity Price.Per.Unit Total.Spent Payment.Method Location Transaction.Date
TXN_2176024 Coffee 5 ERROR 10.0 Digital Wallet In-store 2/3/2023
TXN_6327139 ERROR 4 4.0 16.0 Takeaway ERROR
TXN_5488764 Coffee 4 2.0 8.0 Digital Wallet Takeaway 6/30/2023
TXN_9530003 Salad 1 5.0 5.0 Digital Wallet 8/24/2023
TXN_3753993 Sandwich 5 4.0 20.0 Credit Card 4/1/2023
TXN_2251128 Smoothie 3 4.0 12.0 Credit Card In-store 6/7/2023
TXN_3715065 Salad 3 5.0 15.0 Credit Card ERROR 3/17/2023
TXN_7608637 ERROR 1 5.0 5.0 Digital Wallet 4/8/2023
TXN_1643122 Juice 3 3.0 9.0 In-store 5/15/2023
TXN_4176272 Coffee 1 2.0 2.0 Digital Wallet 6/6/2023
TXN_5741619 Smoothie ERROR 4.0 20.0 Cash 1/2/2023
TXN_1584851 Smoothie 1 4.0 4.0 Credit Card 4/10/2023
TXN_5801294 Salad 1 5.0 5.0 ERROR 10/20/2023
TXN_6696619 Cake 3 3.0 9.0 Takeaway 3/19/2023
TXN_2153838 Tea 4 1.5 ERROR Digital Wallet In-store 12/19/2023
TXN_7578769 Sandwich 5 4.0 20.0 Digital Wallet Takeaway 1/30/2023
TXN_5226635 Cookie 4 1.0 4.0 Credit Card Takeaway 2/1/2023
TXN_1237674 3 1.5 4.5 Credit Card UNKNOWN 10/4/2023
TXN_2887971 Smoothie 2 4.0 8.0 Digital Wallet UNKNOWN 6/26/2023
TXN_5511805 Juice 1 3.0 UNKNOWN Takeaway 6/3/2023
TXN_9769782 Smoothie 5 4.0 20.0 Cash Takeaway ERROR
TXN_6068564 Cake 4 3.0 Credit Card Takeaway 9/28/2023
TXN_7818024 Cake 3 3.0 9.0 8/16/2023
TXN_8626720 Juice 4 3.0 12.0 Cash Takeaway 6/2/2023
TXN_8684125 Salad 2 5.0 10.0 Credit Card In-store 3/8/2023
TXN_6915899 Salad 3 5.0 15.0 Credit Card In-store 5/29/2023
TXN_4822256 Smoothie 1 4.0 4.0 Credit Card 11/11/2023
TXN_8570149 Tea 1 1.5 1.5 Credit Card 6/3/2023
TXN_3455702 Salad 1 5.0 5.0 Cash Takeaway 3/23/2023
TXN_9625287 Juice 2 3.0 6.0 Cash In-store 7/8/2023
TXN_5417192 Cookie 4 1.0 4.0 Cash In-store 6/23/2023
TXN_2146829 Salad 4 5.0 20.0 Cash 12/26/2023
TXN_3171150 ERROR 1 3.0 3.0 Digital Wallet 2/6/2023
TXN_9486849 Cake ERROR 3.0 3.0 Cash Takeaway 3/17/2023
TXN_4758849 Cake 2 3.0 6.0 6/23/2023
TXN_4893692 Salad 2 5.0 10.0 1/2/2023
TXN_5048650 Smoothie 2 4.0 UNKNOWN Cash Takeaway 11/18/2023
TXN_1686323 Smoothie 4 4.0 16.0 Digital Wallet In-store 11/30/2023
TXN_1819615 Coffee 4 2.0 8.0 6/3/2023
TXN_7952153 Smoothie 2 4.0 8.0 Digital Wallet 7/24/2023
TXN_5014959 Cookie 2 1.0 2.0 Credit Card In-store 11/28/2023
TXN_6775972 Coffee 3 2.0 6.0 Credit Card 9/15/2023
TXN_3734446 5 2.0 10.0 Digital Wallet 4/16/2023
TXN_5398922 Salad 1 5.0 5.0 Cash In-store 1/10/2023
TXN_1555314 Sandwich 1 4.0 4.0 Takeaway 2/25/2023
TXN_3053494 5 3.0 15.0 Digital Wallet In-store 6/11/2023
TXN_5823330 Salad 3 5.0 15.0 Digital Wallet In-store 10/19/2023
TXN_6608817 Sandwich 5 4.0 20.0 Credit Card Takeaway 7/17/2023
TXN_8016623 Tea 2 1.5 3.0 Cash Takeaway 5/9/2023
TXN_5575420 Smoothie 3 4.0 12.0 ERROR In-store 6/26/2023
TXN_2710603 Smoothie 5 4.0 20.0 Takeaway 2/2/2023
TXN_3412484 Cake 4 3.0 12.0 Takeaway 9/6/2023
TXN_5132482 Juice 2 3.0 6.0 Digital Wallet In-store 12/21/2023
TXN_3399636 Juice 3 3.0 9.0 Digital Wallet Takeaway 8/7/2023
TXN_3601338 Cake 3 3.0 9.0 Credit Card ERROR 3/6/2023
TXN_3726397 Salad 5 5.0 25.0 Takeaway 1/30/2023
TXN_2831842 Cake 2 3.0 6.0 ERROR 5/20/2023
TXN_8499618 Cake 2 3.0 6.0 ERROR 5/23/2023
TXN_7950226 Tea 1 1.5 1.5 Digital Wallet In-store 10/13/2023
TXN_2719734 Cake 5 3.0 15.0 Digital Wallet In-store 5/22/2023
TXN_5573731 Sandwich 4 4.0 16.0 Cash 1/15/2023
TXN_2449402 Smoothie 5 4.0 20.0 Cash 1/29/2023
TXN_4653861 Sandwich UNKNOWN 4.0 16.0 Cash Takeaway ERROR
TXN_3937509 Smoothie 2 4.0 8.0 In-store 3/20/2023
TXN_2886223 Sandwich 5 4.0 20.0 Credit Card 7/24/2023
TXN_8631468 Cake 1 3.0 3.0 Credit Card In-store 10/10/2023
TXN_5966765 Cake 5 3.0 15.0 Credit Card Takeaway 11/9/2023
TXN_8379919 Cookie 3 1.0 3.0 Digital Wallet 12/4/2023
TXN_2188356 Tea 1 1.5 1.5 In-store 7/14/2023
TXN_4664329 Tea 2 1.5 3.0 Credit Card Takeaway 1/6/2023
TXN_9102030 Smoothie 4 4.0 16.0 Digital Wallet In-store ERROR
TXN_6684056 Smoothie 2 4.0 ERROR 9/14/2023
TXN_8005489 Cake 3 3.0 9.0 In-store 8/12/2023
TXN_9138791 Cake 1 3.0 Digital Wallet In-store 3/22/2023
TXN_3152531 Coffee 3 2.0 6.0 Credit Card UNKNOWN 11/24/2023
TXN_1783857 Coffee 2 UNKNOWN 4.0 Digital Wallet In-store 11/29/2023
TXN_5578796 Tea 4 1.5 6.0 In-store 4/27/2023
TXN_1317114 Cookie 2 1.0 2.0 Digital Wallet Takeaway 11/6/2023
TXN_2693431 Salad 2 5.0 10.0 Digital Wallet 5/20/2023
TXN_2156218 Smoothie 2 4.0 8.0 Digital Wallet In-store 7/24/2023
TXN_8538315 Coffee UNKNOWN 2.0 2.0 Digital Wallet 7/27/2023
TXN_2335312 UNKNOWN 2 3.0 6.0 Digital Wallet 6/23/2023
TXN_3706457 Tea 5 1.5 7.5 Credit Card Takeaway 7/18/2023
TXN_3125997 Juice 4 3.0 12.0 10/19/2023
TXN_8740257 Cake 5 3.0 15.0 Digital Wallet 6/9/2023
TXN_5845583 Tea 4 1.5 6.0 Cash In-store 10/19/2023
TXN_8675558 Tea 5 1.5 7.5 In-store 5/23/2023
TXN_1034956 Sandwich 4 4.0 16.0 Cash In-store ERROR
TXN_6363897 Salad 5 5.0 25.0 Credit Card Takeaway 11/26/2023
TXN_7176851 Tea 4 1.5 6.0 Credit Card Takeaway 11/20/2023
TXN_7853635 Salad 3 5.0 15.0 Digital Wallet Takeaway 2/16/2023
TXN_3342106 Sandwich 1 4.0 4.0 Credit Card In-store 1/14/2023
TXN_5499117 Salad 4 5.0 20.0 Digital Wallet UNKNOWN 7/16/2023
TXN_2815691 Juice 5 3.0 15.0 Digital Wallet ERROR 2/6/2023
TXN_4634772 Juice 3 3.0 9.0 Credit Card In-store 1/12/2023
TXN_3163567 Salad 2 5.0 Digital Wallet Takeaway 6/1/2023
TXN_7611120 Juice 2 3.0 6.0 Cash Takeaway 3/30/2023
TXN_8379868 Cake 3 3.0 9.0 Cash In-store 1/16/2023
TXN_5183041 Cookie 5 1.0 5.0 Credit Card In-store 4/20/2023
TXN_2473090 UNKNOWN 2 3.0 Credit Card In-store 3/3/2023

2.2 Cleaning Data Sampel

2.2.1 Pemeriksaan Data

# Struktur Data
struktur_sample <- data.frame(Variabel = names(data_sampel), Tipe_Data = sapply(data_sampel, class)) 
knitr::kable(
  struktur_sample,
  caption = "Struktur Variabel Data Sampel"
)
Struktur Variabel Data Sampel
Variabel Tipe_Data
Transaction.ID Transaction.ID character
Item Item character
Quantity Quantity character
Price.Per.Unit Price.Per.Unit character
Total.Spent Total.Spent character
Payment.Method Payment.Method character
Location Location character
Transaction.Date Transaction.Date character
# Melihat jumlah UNKNOWN, ERROR, dan nilai kosong
hasil_invalid_sampel <- data.frame(
  Variabel = names(data_sampel),
  UNKNOWN = sapply(data_sampel, function(x) {
    sum(toupper(trimws(as.character(x))) == "UNKNOWN", na.rm = TRUE)
  }),
  ERROR = sapply(data_sampel, function(x) {
    sum(toupper(trimws(as.character(x))) == "ERROR", na.rm = TRUE)
  }),
  Kosong = sapply(data_sampel, function(x) {
    sum(trimws(as.character(x)) == "", na.rm = TRUE)
  })
)
knitr::kable(
  hasil_invalid_sampel,
  caption = "Pemeriksaan Nilai Tidak Valid pada Data Sampel"
)
Pemeriksaan Nilai Tidak Valid pada Data Sampel
Variabel UNKNOWN ERROR Kosong
Transaction.ID Transaction.ID 0 0 0
Item Item 26 29 28
Quantity Quantity 15 14 15
Price.Per.Unit Price.Per.Unit 16 14 20
Total.Spent Total.Spent 19 12 20
Payment.Method Payment.Method 22 29 255
Location Location 35 37 322
Transaction.Date Transaction.Date 14 11 11
knitr::kable(
  hasil_invalid_sampel,
  caption = "Pemeriksaan Nilai Tidak Valid pada Data Sampel"
)
Pemeriksaan Nilai Tidak Valid pada Data Sampel
Variabel UNKNOWN ERROR Kosong
Transaction.ID Transaction.ID 0 0 0
Item Item 26 29 28
Quantity Quantity 15 14 15
Price.Per.Unit Price.Per.Unit 16 14 20
Total.Spent Total.Spent 19 12 20
Payment.Method Payment.Method 22 29 255
Location Location 35 37 322
Transaction.Date Transaction.Date 14 11 11

2.2.2 Cleaning Data

Strategi cleaning data dilakukan secara manual tanpa menggunakan R Studio diantaranya:

  1. ITEM (Nilai item yang kosong atau tidak valid ditentukan berdasarkan Price_Per_Unit nya).
  2. PRICE PER UNIT (NIlai Price_Per_Unit yang kosong atau tidak valid ditentukan berdasarkan Item)
  3. QUANTITY (Nilai Quantity dianalisis bedasarkan Item, Price_Per_Unit, dan Total_Spent. Apabila informasi tersebut tidak tersedia, pola Quantity berdasarkan Item dapat digunakan sebagai pertimbangan untuk imputasi)
  4. TOTAL SPENT (Nilai Total_Spent yang kosong atau tidak valid dihitung kembali menggunakan Quantity*Price_Per_Unit)
  5. Variabel Kategorik (Nilai kosong atau tidak valid pada variabel kategorik yang digunakan dalam analisis akan diisi menggunakan modus)
  6. TRANSACTION ID (Variabel ini tidak dilakukan imputasi dan tidak digunakan dalam analisis karena hanya berfungsi sebagai identitas transaksi)
  7. TRANSACTION DATE (Variabel ini ditangani secara terpisah karena merupakan variabel waktu dan tidak dapat langsung diisi dengan menggunakan mean, median, modus. Dan juga karena variabel ini tidak digunakan pada analisis lanjut)

2.2.3 Hasil Cleaning Data

data_cleaning <- read.csv("D:\\DOWNLOAD\\ADE\\Cleaning Data 1.csv", header = TRUE, sep = ",")
knitr::kable(
  head(data_cleaning, 100),
  caption = "100 Observasi Awal Data Cleaning"
)
100 Observasi Awal Data Cleaning
Transaction.ID Item Quantity Price.Per.Unit Total.Spent Payment.Method Location
TXN_2176024 Coffee 5 2.0 10.0 Digital Wallet In-store
TXN_6327139 Sandwich 4 4.0 16.0 Credit Card Takeaway
TXN_5488764 Coffee 4 2.0 8.0 Digital Wallet Takeaway
TXN_9530003 Salad 1 5.0 5.0 Digital Wallet Takeaway
TXN_3753993 Sandwich 5 4.0 20.0 Credit Card Takeaway
TXN_2251128 Smoothie 3 4.0 12.0 Credit Card In-store
TXN_3715065 Salad 3 5.0 15.0 Credit Card Takeaway
TXN_7608637 Salad 1 5.0 5.0 Digital Wallet Takeaway
TXN_1643122 Juice 3 3.0 9.0 Credit Card In-store
TXN_4176272 Coffee 1 2.0 2.0 Digital Wallet Takeaway
TXN_5741619 Smoothie 1 4.0 20.0 Cash Takeaway
TXN_1584851 Smoothie 1 4.0 4.0 Credit Card Takeaway
TXN_5801294 Salad 1 5.0 5.0 Credit Card Takeaway
TXN_6696619 Cake 3 3.0 9.0 Credit Card Takeaway
TXN_2153838 Tea 4 1.5 6.0 Digital Wallet In-store
TXN_7578769 Sandwich 5 4.0 20.0 Digital Wallet Takeaway
TXN_5226635 Cookie 4 1.0 4.0 Credit Card Takeaway
TXN_1237674 Tea 3 1.5 4.5 Credit Card Takeaway
TXN_2887971 Smoothie 2 4.0 8.0 Digital Wallet Takeaway
TXN_5511805 Juice 1 3.0 3.0 Credit Card Takeaway
TXN_9769782 Smoothie 5 4.0 20.0 Cash Takeaway
TXN_6068564 Cake 4 3.0 12.0 Credit Card Takeaway
TXN_7818024 Cake 3 3.0 9.0 Credit Card Takeaway
TXN_8626720 Juice 4 3.0 12.0 Cash Takeaway
TXN_8684125 Salad 2 5.0 10.0 Credit Card In-store
TXN_6915899 Salad 3 5.0 15.0 Credit Card In-store
TXN_4822256 Smoothie 1 4.0 4.0 Credit Card Takeaway
TXN_8570149 Tea 1 1.5 1.5 Credit Card Takeaway
TXN_3455702 Salad 1 5.0 5.0 Cash Takeaway
TXN_9625287 Juice 2 3.0 6.0 Cash In-store
TXN_5417192 Cookie 4 1.0 4.0 Cash In-store
TXN_2146829 Salad 4 5.0 20.0 Cash Takeaway
TXN_3171150 Cake 1 3.0 3.0 Digital Wallet Takeaway
TXN_9486849 Cake 1 3.0 3.0 Cash Takeaway
TXN_4758849 Cake 2 3.0 6.0 Credit Card Takeaway
TXN_4893692 Salad 2 5.0 10.0 Credit Card Takeaway
TXN_5048650 Smoothie 2 4.0 8.0 Cash Takeaway
TXN_1686323 Smoothie 4 4.0 16.0 Digital Wallet In-store
TXN_1819615 Coffee 4 2.0 8.0 Credit Card Takeaway
TXN_7952153 Smoothie 2 4.0 8.0 Digital Wallet Takeaway
TXN_5014959 Cookie 2 1.0 2.0 Credit Card In-store
TXN_6775972 Coffee 3 2.0 6.0 Credit Card Takeaway
TXN_3734446 Coffee 5 2.0 10.0 Digital Wallet Takeaway
TXN_5398922 Salad 1 5.0 5.0 Cash In-store
TXN_1555314 Sandwich 1 4.0 4.0 Credit Card Takeaway
TXN_3053494 Cake 5 3.0 15.0 Digital Wallet In-store
TXN_5823330 Salad 3 5.0 15.0 Digital Wallet In-store
TXN_6608817 Sandwich 5 4.0 20.0 Credit Card Takeaway
TXN_8016623 Tea 2 1.5 3.0 Cash Takeaway
TXN_5575420 Smoothie 3 4.0 12.0 Credit Card In-store
TXN_2710603 Smoothie 5 4.0 20.0 Credit Card Takeaway
TXN_3412484 Cake 4 3.0 12.0 Credit Card Takeaway
TXN_5132482 Juice 2 3.0 6.0 Digital Wallet In-store
TXN_3399636 Juice 3 3.0 9.0 Digital Wallet Takeaway
TXN_3601338 Cake 3 3.0 9.0 Credit Card Takeaway
TXN_3726397 Salad 5 5.0 25.0 Credit Card Takeaway
TXN_2831842 Cake 2 3.0 6.0 Credit Card Takeaway
TXN_8499618 Cake 2 3.0 6.0 Credit Card Takeaway
TXN_7950226 Tea 1 1.5 1.5 Digital Wallet In-store
TXN_2719734 Cake 5 3.0 15.0 Digital Wallet In-store
TXN_5573731 Sandwich 4 4.0 16.0 Cash Takeaway
TXN_2449402 Smoothie 5 4.0 20.0 Cash Takeaway
TXN_4653861 Sandwich 4 4.0 16.0 Cash Takeaway
TXN_3937509 Smoothie 2 4.0 8.0 Credit Card In-store
TXN_2886223 Sandwich 5 4.0 20.0 Credit Card Takeaway
TXN_8631468 Cake 1 3.0 3.0 Credit Card In-store
TXN_5966765 Cake 5 3.0 15.0 Credit Card Takeaway
TXN_8379919 Cookie 3 1.0 3.0 Digital Wallet Takeaway
TXN_2188356 Tea 1 1.5 1.5 Credit Card In-store
TXN_4664329 Tea 2 1.5 3.0 Credit Card Takeaway
TXN_9102030 Smoothie 4 4.0 16.0 Digital Wallet In-store
TXN_6684056 Smoothie 2 4.0 8.0 Credit Card Takeaway
TXN_8005489 Cake 3 3.0 9.0 Credit Card In-store
TXN_9138791 Cake 1 3.0 3.0 Digital Wallet In-store
TXN_3152531 Coffee 3 2.0 6.0 Credit Card Takeaway
TXN_1783857 Coffee 2 2.0 4.0 Digital Wallet In-store
TXN_5578796 Tea 4 1.5 6.0 Credit Card In-store
TXN_1317114 Cookie 2 1.0 2.0 Digital Wallet Takeaway
TXN_2693431 Salad 2 5.0 10.0 Digital Wallet Takeaway
TXN_2156218 Smoothie 2 4.0 8.0 Digital Wallet In-store
TXN_8538315 Coffee 1 2.0 2.0 Digital Wallet Takeaway
TXN_2335312 Cake 2 3.0 6.0 Digital Wallet Takeaway
TXN_3706457 Tea 5 1.5 7.5 Credit Card Takeaway
TXN_3125997 Juice 4 3.0 12.0 Credit Card Takeaway
TXN_8740257 Cake 5 3.0 15.0 Digital Wallet Takeaway
TXN_5845583 Tea 4 1.5 6.0 Cash In-store
TXN_8675558 Tea 5 1.5 7.5 Credit Card In-store
TXN_1034956 Sandwich 4 4.0 16.0 Cash In-store
TXN_6363897 Salad 5 5.0 25.0 Credit Card Takeaway
TXN_7176851 Tea 4 1.5 6.0 Credit Card Takeaway
TXN_7853635 Salad 3 5.0 15.0 Digital Wallet Takeaway
TXN_3342106 Sandwich 1 4.0 4.0 Credit Card In-store
TXN_5499117 Salad 4 5.0 20.0 Digital Wallet Takeaway
TXN_2815691 Juice 5 3.0 15.0 Digital Wallet Takeaway
TXN_4634772 Juice 3 3.0 9.0 Credit Card In-store
TXN_3163567 Salad 2 5.0 10.0 Digital Wallet Takeaway
TXN_7611120 Juice 2 3.0 6.0 Cash Takeaway
TXN_8379868 Cake 3 3.0 9.0 Cash In-store
TXN_5183041 Cookie 5 1.0 5.0 Credit Card In-store
TXN_2473090 Tea 2 1.5 3.0 Credit Card In-store

2.2.4 Data Dari 3 Variabel yang Dipilih

data_pilih <- read.csv("D:\\DOWNLOAD\\ADE\\DATA PILIHAN ANALISIS.csv", header = TRUE, sep = ",")
knitr::kable(
  head(data_pilih, 10),
  caption = "10 Observasi Awal Data Cleaning"
)
10 Observasi Awal Data Cleaning
Item Quantity Location
Coffee 5 In-store
Sandwich 4 Takeaway
Coffee 4 Takeaway
Salad 1 Takeaway
Sandwich 5 Takeaway
Smoothie 3 In-store
Salad 3 Takeaway
Salad 1 Takeaway
Juice 3 In-store
Coffee 1 Takeaway
data_pilih$Quantity <- as.numeric(data_pilih$Quantity)
data_pilih$Quantity <- as.numeric(data_pilih$Quantity)

3 EKSPLORASI DISTRIBUSI

3.1 Distribusi Data

struktur_pilih <- str(data_pilih)
## 'data.frame':    1000 obs. of  3 variables:
##  $ Item    : chr  "Coffee" "Sandwich" "Coffee" "Salad" ...
##  $ Quantity: num  5 4 4 1 5 3 3 1 3 1 ...
##  $ Location: chr  "In-store" "Takeaway" "Takeaway" "Takeaway" ...
knitr::kable(
  struktur_pilih,
  caption = "Struktur Variabel Data Pilih"
)

Table: Struktur Variabel Data Pilih

3.1.1 Item

tabel_item <- as.data.frame(table(data_pilih$Item))

names(tabel_item) <- c("Item", "Frekuensi")
knitr::kable(
  tabel_item,
  caption = "Frekuensi Jenis Item"
)
Frekuensi Jenis Item
Item Frekuensi
Cake 138
Coffee 118
Cookie 110
Juice 114
Salad 126
Sandwich 123
Smoothie 136
Tea 135
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.5.3
ggplot(data_pilih, aes(x = Item)) +
  geom_bar(
    fill = "#CDB4DB",
    color = "white"
  ) +
  labs(
    title = "Distribusi Jenis Item",
    x = "Jenis Item",
    y = "Frekuensi"
  ) +
  theme_minimal()

3.1.2 Quantity

Karena Quantity adalah variabel numerik, maka dapat melihat distribusinya menggunakan histogram, density plot, boxplot, dan Q-Q plot.

# Histogram
ggplot(data_pilih, aes(x = Quantity)) +
  geom_histogram(
    bins = 10,
    fill = "#CDB4DB",
    color = "white"
  ) +
  labs(
    title = "Distribusi Quantity",
    x = "Quantity",
    y = "Frekuensi"
  ) +
  theme_minimal()

# Density Plot
ggplot(data_pilih, aes(x = Quantity)) +
  geom_density(
    fill = "#B7E4C7",
    alpha = 0.7
  ) +
  labs(
    title = "Density Plot Quantity",
    x = "Quantity",
    y = "Density"
  ) +
  theme_minimal()

# Bloxplot
ggplot(data_pilih, aes(y = Quantity)) +
  geom_boxplot(
    fill = "#FFD6A5"
  ) +
  labs(
    title = "Boxplot Quantity",
    y = "Quantity"
  ) +
  theme_minimal()

# Q-Q Plot
ggplot(data_pilih, aes(sample = Quantity)) +
  stat_qq(color = "#8E9AAF") +
  stat_qq_line(color = "#D4A5A5") +
  labs(
    title = "Q-Q Plot Quantity"
  ) +
  theme_minimal()

3.1.3 Location

ggplot(data_pilih, aes(x = Location)) +
  geom_bar(fill = "#BDE0FE") +
  labs(
    title = "Distribusi Location",
    x = "Location",
    y = "Frekuensi"
  ) +
  theme_minimal()

3.1.4 Item terhadap Quantity

ggplot(data_pilih, aes(x = Item, y = Quantity)) +
  geom_boxplot(
    fill = "#CDB4DB"
  ) +
  labs(
    title = "Hubungan Jenis Item dengan Quantity",
    x = "Jenis Item",
    y = "Quantity"
  ) +
  theme_minimal()

3.1.5 Location terhadap Quantity

ggplot(data_pilih, aes(x = Location, y = Quantity)) +
  geom_boxplot(
    fill = "#A8DADD"
  ) +
  labs(
    title = "Hubungan Location dengan Quantity",
    x = "Location",
    y = "Quantity"
  ) +
  theme_minimal()

4 INTEGRASI DATA

Integrasi data merupakan proses menggabungkan data dari dua atau lebih sumber agar dapat digunakan secara bersama dalam analisis. Pada penelitian ini, data yang digunakan terdiri atas data populasi dan data sampel. Pada tahap ini, integrasi difokuskan pada tiga variabel yang dipilih berdasarkan tujuan analisis, yaitu Item, Quantity, dan Location.

Variabel Item digunakan untuk menggambarkan jenis barang yang dibeli, Quantity menunjukkan jumlah barang yang dibeli, sedangkan Location menunjukkan lokasi terjadinya transaksi. Ketiga variabel tersebut dipilih karena relevan dengan tujuan analisis yang akan dilakukan.

Dalam proses integrasi, Transaction.ID digunakan sebagai identifier (key) untuk mencocokkan data yang berasal dari populasi dan sampel. Setelah data dihubungkan berdasarkan key tersebut, hanya variabel Item, Quantity, dan Location yang digunakan sebagai informasi utama untuk tahap analisis selanjutnya.

Hasil integrasi kemudian diperiksa untuk memastikan bahwa data yang diperoleh sesuai dengan data asal, tidak terjadi duplikasi yang tidak diharapkan, serta tidak terdapat ketidaksesuaian antara data populasi dan data sampel. Dengan demikian, data hasil integrasi dapat digunakan sebagai dasar untuk tahap analisis berikutnya.

5 TRANFORMASI DATA KATEGORIK I

Encoding ialah proses mengubah representasi data ke bentuk atau kode tertentu sesuai kebutuhan analisis. Encoding tidak mengubah informasi yang mendasari data, tetapi hanya mengubah cara kategori tersebut direpresentasikan.

Dalam data yang digunakan untuk analisis terdapat 2 variabel kategorik, yaitu:

  1. Item
  2. Location

Kedua variabel tersebut dapat ditransformasikan menggunakan teknik encoding.

5.1 Label Encoding

Label encoding memberikan satu kode numerik untuk setiap kategori. Kode tersebut hanya berfungsi sebagai label. jadi, angka 1 tidak berarti “lebih besar” daripada angka 0.

5.1.1 a. Variabel Item

data_pilih$Item_Label <- as.numeric(factor(data_pilih$Item))
head(data_pilih[,c("Item", "Item_Label")], 50)
##        Item Item_Label
## 1    Coffee          2
## 2  Sandwich          6
## 3    Coffee          2
## 4     Salad          5
## 5  Sandwich          6
## 6  Smoothie          7
## 7     Salad          5
## 8     Salad          5
## 9     Juice          4
## 10   Coffee          2
## 11 Smoothie          7
## 12 Smoothie          7
## 13    Salad          5
## 14     Cake          1
## 15      Tea          8
## 16 Sandwich          6
## 17   Cookie          3
## 18      Tea          8
## 19 Smoothie          7
## 20    Juice          4
## 21 Smoothie          7
## 22     Cake          1
## 23     Cake          1
## 24    Juice          4
## 25    Salad          5
## 26    Salad          5
## 27 Smoothie          7
## 28      Tea          8
## 29    Salad          5
## 30    Juice          4
## 31   Cookie          3
## 32    Salad          5
## 33     Cake          1
## 34     Cake          1
## 35     Cake          1
## 36    Salad          5
## 37 Smoothie          7
## 38 Smoothie          7
## 39   Coffee          2
## 40 Smoothie          7
## 41   Cookie          3
## 42   Coffee          2
## 43   Coffee          2
## 44    Salad          5
## 45 Sandwich          6
## 46     Cake          1
## 47    Salad          5
## 48 Sandwich          6
## 49      Tea          8
## 50 Smoothie          7

5.1.2 b. Variabel Location

data_pilih$Location_Label <- as.numeric(factor(data_pilih$Location))

5.1.3 Interpretasi

Setiap kategori Item dan Location telah direpresentasikan dalam bentuk angka. Angka tersebut hanya merupakan kode kategori dan tidak menunjukkan bahwa satu kategori lebih tinggi daripada kategori lainnya. Hal ini sesuai dengan konsep label encoding pada materi.

5.2 Ordinal Encoding

Ordinal encoding digunakan ketika kategori memiliki urutan atau tingkatan alami, misalnya :

Low < Medium < HIgh < Critical.

Pada data penelitian ini hanya memiliki variabel Item dan Location yang tidak memiliki urutan alami, sehingga ordinal encoding tidak diterapkan pada kedua variabel tersebut.

5.3 One-Hot Encoding

One-hot encoding membuat satu variabel indikator untuk setiap kategori. Nilai 1 menunjukkan observasi termasuk kategori tersebut, sedangkan 0 menunjukkan bukan kategori tersebut. Untuk data ini, teknik ini cocok karena Item dan Location merupakan kategori yang tidak memiliki tingkatan.

5.3.1 a. Variabel Item

data_item <- model.matrix(~ Item - 1, data = data_pilih)
data_item <- as.data.frame(data_item)
head(data_item, 10)
##    ItemCake ItemCoffee ItemCookie ItemJuice ItemSalad ItemSandwich ItemSmoothie
## 1         0          1          0         0         0            0            0
## 2         0          0          0         0         0            1            0
## 3         0          1          0         0         0            0            0
## 4         0          0          0         0         1            0            0
## 5         0          0          0         0         0            1            0
## 6         0          0          0         0         0            0            1
## 7         0          0          0         0         1            0            0
## 8         0          0          0         0         1            0            0
## 9         0          0          0         1         0            0            0
## 10        0          1          0         0         0            0            0
##    ItemTea
## 1        0
## 2        0
## 3        0
## 4        0
## 5        0
## 6        0
## 7        0
## 8        0
## 9        0
## 10       0

5.3.2 b. Variabel Location

data_location <- model.matrix(~ Location - 1, data = data_pilih)
data_location <- as.data.frame(data_location)
head(data_location, 10)
##    LocationIn-store LocationTakeaway
## 1                 1                0
## 2                 0                1
## 3                 0                1
## 4                 0                1
## 5                 0                1
## 6                 1                0
## 7                 0                1
## 8                 0                1
## 9                 1                0
## 10                0                1

5.4 Menggabungkan Hasil Encoding

data_encoded <- cbind(
  data_pilih["Quantity"],
  data_item,
  data_location
)

head(data_encoded, 10)
##    Quantity ItemCake ItemCoffee ItemCookie ItemJuice ItemSalad ItemSandwich
## 1         5        0          1          0         0         0            0
## 2         4        0          0          0         0         0            1
## 3         4        0          1          0         0         0            0
## 4         1        0          0          0         0         1            0
## 5         5        0          0          0         0         0            1
## 6         3        0          0          0         0         0            0
## 7         3        0          0          0         0         1            0
## 8         1        0          0          0         0         1            0
## 9         3        0          0          0         1         0            0
## 10        1        0          1          0         0         0            0
##    ItemSmoothie ItemTea LocationIn-store LocationTakeaway
## 1             0       0                1                0
## 2             0       0                0                1
## 3             0       0                0                1
## 4             0       0                0                1
## 5             0       0                0                1
## 6             1       0                1                0
## 7             0       0                0                1
## 8             0       0                0                1
## 9             0       0                1                0
## 10            0       0                0                1

5.5 Validasi Hasil Encoding

Hasil encoding harus divalidasi, dimana yang diperiksa antara lain kategori tetap terwakili, jumlah observasi tetap, representasi sesuai dengan kategori asal, dan makna data tidak berubah

5.5.1 1. Membandingkan Jumlah Baris

nrow(data_pilih)
## [1] 1000
nrow(data_encoded)
## [1] 1000

5.5.2 2. Melihat Struktur Data

str(data_encoded)
## 'data.frame':    1000 obs. of  11 variables:
##  $ Quantity        : num  5 4 4 1 5 3 3 1 3 1 ...
##  $ ItemCake        : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ ItemCoffee      : num  1 0 1 0 0 0 0 0 0 1 ...
##  $ ItemCookie      : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ ItemJuice       : num  0 0 0 0 0 0 0 0 1 0 ...
##  $ ItemSalad       : num  0 0 0 1 0 0 1 1 0 0 ...
##  $ ItemSandwich    : num  0 1 0 0 1 0 0 0 0 0 ...
##  $ ItemSmoothie    : num  0 0 0 0 0 1 0 0 0 0 ...
##  $ ItemTea         : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ LocationIn-store: num  1 0 0 0 0 1 0 0 1 0 ...
##  $ LocationTakeaway: num  0 1 1 1 1 0 1 1 0 1 ...

5.5.3 3. Memeriksa Kategori Asal

unique(data_pilih$Item)
## [1] "Coffee"   "Sandwich" "Salad"    "Smoothie" "Juice"    "Cake"     "Tea"     
## [8] "Cookie"
unique(data_pilih$Location)
## [1] "In-store" "Takeaway"

6 TRANSFORMASI DATA KATEGORIK II

6.1 Menyiapkan Variabel Kategorik

Sebelum melakukan encoding, variabel kategorik perlu dikenali sebagai factor. Dengan tujuan agar kategori disimpan sebagai level dan memudahkan proses transformasi.

data_pilih$Item <- factor(data_pilih$Item)
data_pilih$Location <- factor(data_pilih$Location)

str(data_pilih)
## 'data.frame':    1000 obs. of  5 variables:
##  $ Item          : Factor w/ 8 levels "Cake","Coffee",..: 2 6 2 5 6 7 5 5 4 2 ...
##  $ Quantity      : num  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 ...
##  $ Item_Label    : num  2 6 2 5 6 7 5 5 4 2 ...
##  $ Location_Label: num  1 2 2 2 2 1 2 2 1 2 ...

6.2 One-Hot Encoding

One-hot encoding mengubah setiap kategori menjadi kolom indikator bernilai 0 atau 1. Teknik ini sesuai untuk variabel nominal karena tidak memberikan urutan pada kategori.

6.2.1 1. Item

item_onehot <- model.matrix(~ Item - 1, data = data_pilih)
item_onehot <- as.data.frame(item_onehot)
head(item_onehot, 15)
##    ItemCake ItemCoffee ItemCookie ItemJuice ItemSalad ItemSandwich ItemSmoothie
## 1         0          1          0         0         0            0            0
## 2         0          0          0         0         0            1            0
## 3         0          1          0         0         0            0            0
## 4         0          0          0         0         1            0            0
## 5         0          0          0         0         0            1            0
## 6         0          0          0         0         0            0            1
## 7         0          0          0         0         1            0            0
## 8         0          0          0         0         1            0            0
## 9         0          0          0         1         0            0            0
## 10        0          1          0         0         0            0            0
## 11        0          0          0         0         0            0            1
## 12        0          0          0         0         0            0            1
## 13        0          0          0         0         1            0            0
## 14        1          0          0         0         0            0            0
## 15        0          0          0         0         0            0            0
##    ItemTea
## 1        0
## 2        0
## 3        0
## 4        0
## 5        0
## 6        0
## 7        0
## 8        0
## 9        0
## 10       0
## 11       0
## 12       0
## 13       0
## 14       0
## 15       1

6.2.2 2. Location

location_onehot <- model.matrix(~ Location - 1, data = data_pilih)
location_onehot <- as.data.frame(location_onehot)
head(location_onehot, 5)
##   LocationIn-store LocationTakeaway
## 1                1                0
## 2                0                1
## 3                0                1
## 4                0                1
## 5                0                1

6.3 Membuat Dataset Hasil Encoding

data_encoded <- cbind(
  data_pilih["Quantity"],
  item_onehot,
  location_onehot
)

head(data_encoded, 10)
##    Quantity ItemCake ItemCoffee ItemCookie ItemJuice ItemSalad ItemSandwich
## 1         5        0          1          0         0         0            0
## 2         4        0          0          0         0         0            1
## 3         4        0          1          0         0         0            0
## 4         1        0          0          0         0         1            0
## 5         5        0          0          0         0         0            1
## 6         3        0          0          0         0         0            0
## 7         3        0          0          0         0         1            0
## 8         1        0          0          0         0         1            0
## 9         3        0          0          0         1         0            0
## 10        1        0          1          0         0         0            0
##    ItemSmoothie ItemTea LocationIn-store LocationTakeaway
## 1             0       0                1                0
## 2             0       0                0                1
## 3             0       0                0                1
## 4             0       0                0                1
## 5             0       0                0                1
## 6             1       0                1                0
## 7             0       0                0                1
## 8             0       0                0                1
## 9             0       0                1                0
## 10            0       0                0                1

6.4 Membandingkan Dimensi Data

dim(data_pilih)
## [1] 1000    5
dim(data_encoded)
## [1] 1000   11

6.5 Membandingkan Jumlah Kategori

nlevels(data_pilih$Item)
## [1] 8
nlevels(data_pilih$Location)
## [1] 2

6.6 Membandingkan Label/Ordinal dan One-Hot

data_label <- data_pilih
data_label$Item_Label <- as.numeric(data_label$Item)
data_label$Location_Label <- as.numeric(data_label$Location)
dim(data_label)
## [1] 1000    5
dim(data_encoded)
## [1] 1000   11

6.7 Cek Missing Value

colSums(is.na(data_encoded))
##         Quantity         ItemCake       ItemCoffee       ItemCookie 
##                0                0                0                0 
##        ItemJuice        ItemSalad     ItemSandwich     ItemSmoothie 
##                0                0                0                0 
##          ItemTea LocationIn-store LocationTakeaway 
##                0                0                0

6.8 Dampak Encoding terhadap Data

Berdasarkan hasil tersebut, one-hot encoding memberikan beberapa dampak:

  1. Jumlah baris tetap, karena tidak menambah atau mengurangi observasi.
  2. Jumlah kolom bertambah, karena setiap kategori dibuat menjadi indikator.
  3. Interpretasi kategori tetap jelas, karena setiap kolom menunjukkan keanggotaan suatu kategori.
  4. Tidak menciptakan urutan palsu, berbeda dengan memberikan kode angka pada variabel nominal.
  5. Jika kategori sangat banyak, jumlah kolom dapat meningkat cukup besar. Materi juga menekankan bahwa jumlah kategori merupakan faktor dalam pemilihan teknik encoding.

7 TRANSFORMASI DATA NUMERIK

7.1 Tujuan Dilakukan

Transformasi data numerik dilakukan untuk mengubah nilai suatu variabel menggunakan fungsi matematis agar skala atau distribusinya lebih sesuai untuk analisis, tanpa menghilangkan informasi dasarnya.

Transformasi diperlukan terutama ketika:

  1. Variabel memiliki satuan berbeda,
  2. Rentang nilai antarvariabel sangat berbeda,
  3. Data memiliki distribusi menceng atau outlier,
  4. Hubungan antarvariabel bersifat non-linear.

Pada data yang dianalisis, variabel numerik yang digunakan adalah Quantity.

7.2 Pemeriksaan Awal Data

summary(data_pilih$Quantity)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   1.000   2.000   3.000   3.049   4.000   5.000
min_max <- function(x) {
  (x - min(x, na.rm = TRUE)) /
    (max(x, na.rm = TRUE) - min(x, na.rm = TRUE))
}
data_pilih$Quantity_MinMax <- min_max(data_pilih$Quantity)

head(data_pilih)
##       Item Quantity Location Item_Label Location_Label Quantity_MinMax
## 1   Coffee        5 In-store          2              1            1.00
## 2 Sandwich        4 Takeaway          6              2            0.75
## 3   Coffee        4 Takeaway          2              2            0.75
## 4    Salad        1 Takeaway          5              2            0.00
## 5 Sandwich        5 Takeaway          6              2            1.00
## 6 Smoothie        3 In-store          7              1            0.50

7.3 Standarisasi Z-Score

data_pilih$Quantity_Z <- as.numeric(
  scale(data_pilih$Quantity)
)

head(data_pilih)
##       Item Quantity Location Item_Label Location_Label Quantity_MinMax
## 1   Coffee        5 In-store          2              1            1.00
## 2 Sandwich        4 Takeaway          6              2            0.75
## 3   Coffee        4 Takeaway          2              2            0.75
## 4    Salad        1 Takeaway          5              2            0.00
## 5 Sandwich        5 Takeaway          6              2            1.00
## 6 Smoothie        3 In-store          7              1            0.50
##    Quantity_Z
## 1  1.35844879
## 2  0.66216545
## 3  0.66216545
## 4 -1.42668456
## 5  1.35844879
## 6 -0.03411788
mean(data_pilih$Quantity_Z, na.rm = TRUE)
## [1] 3.910967e-17
sd(data_pilih$Quantity_Z, na.rm = TRUE)
## [1] 1

7.4 Transformasi Invers Square

Cek nilai nol terlebih dahulu

sd(data_pilih$Quantity_Z, na.rm = TRUE)
## [1] 1
sum(data_pilih$Quantity == 0, na.rm = TRUE)
## [1] 0
data_pilih$Quantity_Inv_Sq <- 
  1 / (data_pilih$Quantity^2)

head(data_pilih)
##       Item Quantity Location Item_Label Location_Label Quantity_MinMax
## 1   Coffee        5 In-store          2              1            1.00
## 2 Sandwich        4 Takeaway          6              2            0.75
## 3   Coffee        4 Takeaway          2              2            0.75
## 4    Salad        1 Takeaway          5              2            0.00
## 5 Sandwich        5 Takeaway          6              2            1.00
## 6 Smoothie        3 In-store          7              1            0.50
##    Quantity_Z Quantity_Inv_Sq
## 1  1.35844879       0.0400000
## 2  0.66216545       0.0625000
## 3  0.66216545       0.0625000
## 4 -1.42668456       1.0000000
## 5  1.35844879       0.0400000
## 6 -0.03411788       0.1111111

7.5 Membuat Ketiga Transformasi Sekaligus

data_pilih$Quantity_MinMax <- 
  min_max(data_pilih$Quantity)

data_pilih$Quantity_Z <- 
  as.numeric(scale(data_pilih$Quantity))

data_pilih$Quantity_Inv_Sq <- 
  1 / (data_pilih$Quantity^2)

head(data_pilih)
##       Item Quantity Location Item_Label Location_Label Quantity_MinMax
## 1   Coffee        5 In-store          2              1            1.00
## 2 Sandwich        4 Takeaway          6              2            0.75
## 3   Coffee        4 Takeaway          2              2            0.75
## 4    Salad        1 Takeaway          5              2            0.00
## 5 Sandwich        5 Takeaway          6              2            1.00
## 6 Smoothie        3 In-store          7              1            0.50
##    Quantity_Z Quantity_Inv_Sq
## 1  1.35844879       0.0400000
## 2  0.66216545       0.0625000
## 3  0.66216545       0.0625000
## 4 -1.42668456       1.0000000
## 5  1.35844879       0.0400000
## 6 -0.03411788       0.1111111

7.6 Membandingkan Statistik

mean(data_pilih$Quantity, na.rm = TRUE)
## [1] 3.049
sd(data_pilih$Quantity, na.rm = TRUE)
## [1] 1.436197
mean(data_pilih$Quantity_MinMax, na.rm = TRUE)
## [1] 0.51225
sd(data_pilih$Quantity_MinMax, na.rm = TRUE)
## [1] 0.3590492
mean(data_pilih$Quantity_Z, na.rm = TRUE)
## [1] 3.910967e-17
sd(data_pilih$Quantity_Z, na.rm = TRUE)
## [1] 1
mean(data_pilih$Quantity_Inv_Sq, na.rm = TRUE)
## [1] 0.2871489
sd(data_pilih$Quantity_Inv_Sq, na.rm = TRUE)
## [1] 0.3587741

8 KESIMPULAN AKHIR

Berdasarkan seluruh tahapan analisis yang telah dilakukan, data transaksi kafe terlebih dahulu melalui proses identifikasi, pemeriksaan kualitas, dan pembersihan data agar dapat digunakan dalam analisis. Variabel yang menjadi fokus analisis adalah Item, Quantity, dan Location, dengan masing-masing memiliki karakteristik data kategorik dan numerik yang berbeda sehingga memerlukan metode pengolahan yang sesuai.

Hasil Exploratory Data Analysis (EDA) digunakan untuk melihat distribusi masing-masing variabel serta hubungan antara Item dengan Quantity dan Location dengan Quantity. Analisis ini memberikan gambaran awal mengenai pola dan karakteristik data sebelum dilakukan analisis lebih lanjut.

Pada integrasi data, penggabungan data perlu memperhatikan identifier atau key agar tidak menghasilkan pencocokan data yang keliru. Oleh karena itu, Transaction_ID digunakan sebagai identifier, sedangkan Item, Quantity, dan Location digunakan sebagai variabel utama dalam analisis.

Untuk transformasi data kategorik, Item dan Location merupakan variabel nominal sehingga tidak memiliki urutan alami. Oleh karena itu, one-hot encoding lebih sesuai dibandingkan ordinal encoding karena tidak memberikan urutan atau makna numerik yang sebenarnya tidak dimiliki oleh kategori tersebut.

Sementara itu, pada transformasi data numerik, Quantity dapat ditransformasikan menggunakan Min-Max dan Z-Score untuk menyesuaikan skala data. Min-Max menghasilkan rentang 0–1, sedangkan Z-Score menunjukkan posisi relatif suatu nilai terhadap rata-rata. Transformasi invers memiliki sifat non-linear dan penggunaannya perlu mempertimbangkan keberadaan nilai nol.

Secara keseluruhan, tahapan analisis menunjukkan bahwa pengolahan data harus disesuaikan dengan karakteristik setiap variabel dan tujuan analisis. Proses mulai dari cleaning, eksplorasi, integrasi, encoding, hingga transformasi dilakukan bukan sekadar untuk mengubah bentuk data, tetapi untuk memastikan data memiliki representasi yang tepat dan dapat digunakan secara valid pada tahap analisis selanjutnya.

document.addEventListener("DOMContentLoaded", function() { const toc = document.getElementById("TOC"); if (!toc) return; const links = toc.querySelectorAll("a"); links.forEach(function(link) { link.addEventListener("click", function(event) { const targetID = this.getAttribute("href"); if (!targetID || !targetID.startsWith("#")) { return; } const target = document.querySelector(targetID); if (target) { event.preventDefault(); target.scrollIntoView({ behavior: "smooth", block: "start" }); } }); }); const sections = document.querySelectorAll( "h1[id], h2[id], h3[id]" ); window.addEventListener("scroll", function() { let current = ""; sections.forEach(function(section) { const sectionTop = section.offsetTop; if ( window.scrollY >= sectionTop - 150 ) { current = section.getAttribute("id"); } }); links.forEach(function(link) { link.classList.remove("active"); if ( link.getAttribute("href") === "#" + current ) { link.classList.add("active"); } }); }); });