Data historis suatu perusahaan yang diolah dengan baik, dapat memberi peluang baru agar perusahaan tersebut bisa beroperasi dengan lebih optimal. Hal tersebut yang ingin dicapai oleh perusahaan pesan-antar makanan, yakni ingin mengoptimasi aktivitas penjualan dan pelayanan mereka. Perusahaan ini memiliki banyak cabang di beberapa kota dan mempunyai data historis yang mencatat seluruh aktivitas pesanan dalam pola mingguan. Data diperoleh dari Kaggle : https://www.kaggle.com/ghoshsaptarshi/av-genpact-hack-dec2018?select=train.csv sebagai bagian dari Machine Learning Hackathon yang diselenggarakan oleh Analytics Vidhya & Genpact pada Desember 2018.
Setidaknya ada 4 data yang disediakan untuk dieksplor dan dibuat model machine learning: train, test, mealinfo, dan fcenter. Keempatnya bisa diolah masalah utama yang ingin dipecahkan, yaitu memprediksi jumlah penjualan selama 10 minggu mendatang (minggu ke 146 hingga 155). Uniknya dalam dataset yang tersedia, tidak ada variabel yang secara langsung mencatat historis waktu pada tiap observasi. Informasi waktu (mingguan), tercatat dalam bentuk urutan minggu kesekian. Ini adalah salah satu hal yang menarik, apakah pendekatan machine learning forecasting mampu membaca tipe dataset seperti ini? Atau perlu menggunakan model lain?
Eksplorasi dataset secara mendalam bisa memberi informasi penting terkait perlu tidaknya sebuah menu dipromosikan melaui email atau platform digital. Di sisi lain, hasil prediksi jumlah pesanan (variabel : num_orders) dari pemodelan machine learning akan digunakan untuk mengoptimasi rencana persediaan bahan makanan dan penempatan pekerja untuk tiap cabang pesan-antar.
Data train menyimpan data historik terkait aktivitas delivery untuk semua cabang. Adanya data train adalah supaya model machine learning yang nanti dibuat bisa mempelajari banyak data.
Keterangan data train :
id: Kode Unik
week: Nomer minggu
center_id: Id unik untuk pusat pemenuhan
meal_id: Id unik untuk makan
checkout_price: Harga akhir termasuk diskon, pajak dan pengeriman
base_price: harga terbaik dari makanan
emailer_for_promotion: Email dikirim untuk promosi
homepage_featured: Makanan unggulan
num_orders: Jumlah pesanan (target)
Dimensi Data
dim(train)
[1] 456548 9
Data test punya variabel yang sama dengan train, hanya berbeda di variabel target yang nantinya perlu diisi dengan hasil prediksi menggunakan machine learning.
Keterangan data test:
id: indentitas unik
week: nomer minggu
center_id: Id unik untuk pusat pemenuhan
meal_id: Id unik untuk makanan
checkout_price: Harga akhir termasuk diskoon, pajak, dan ongkos kirim
base_price: Harga dasar makanan
emailer_for_promotion: Email dikirim untuk promosi
homepage_featured: Makanan ditampilkan di beranda
Dimensi data :
dim(test)
[1] 32573 8
Data mealinfo mencatat seluruh informasi tentang makanan yang disajikan untuk kemudian diantar ke tempat tujuan.
Keterangan data mealinfo:
meal_id: Id unik untuk makan
category: type of meal (beverages/snacks/soup/etc)
cuisine: Jenis makana (minuman/makanan/ringan/sup/dan lain-lain)
Dimensi data
dim(mealinfo)
[1] 51 3
Data fcenter mencatat informasi dari setiap cabang yang melayani suatu pesanan.
Keterangan data fcenter:
center_id: Id unik untuk pusat pemenuhan
city_code: kode unik untuk kota
region_code: kode unik untuk wilayah
center_type: tipe pusat anonim
op_area: wilayah operasi (di km^2)
Dimensi data:
dim(fcenter)
[1] 77 5
Pada tahap ini, melakukan:
Data cleansing, melihat dan menyesuaikan tipe data, cek NA/missing value, dan duplicated value.
Data merging , menggabungkan beberapa dataset agar bisa dieksplorasi dan diolah lebih jauh.
Data cleansing, melihat dan menyesuaikan tipe data, cek NA/missing value, dan duplicated value.
Data Cleansing
glimpse(train)
Rows: 456,548
Columns: 9
$ id <int> 1379560, 1466964, 1346989, 1338232, 1448490, 1270037, 1191377, 1499~
$ week <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1~
$ center_id <int> 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,~
$ meal_id <int> 1885, 1993, 2539, 2139, 2631, 1248, 1778, 1062, 2707, 1207, 1230, 2~
$ checkout_price <dbl> 136.83, 136.83, 134.86, 339.50, 243.50, 251.23, 183.36, 182.36, 193~
$ base_price <dbl> 152.29, 135.83, 135.86, 437.53, 242.50, 252.23, 184.36, 183.36, 192~
$ emailer_for_promotion <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0~
$ homepage_featured <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0~
$ num_orders <int> 177, 270, 189, 54, 40, 28, 190, 391, 472, 676, 823, 972, 162, 420, ~
Transforming Data Type
glimpse(train)
Rows: 456,548
Columns: 9
$ id <fct> 1379560, 1466964, 1346989, 1338232, 1448490, 1270037, 1191377, 1499~
$ week <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1~
$ center_id <fct> 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,~
$ meal_id <fct> 1885, 1993, 2539, 2139, 2631, 1248, 1778, 1062, 2707, 1207, 1230, 2~
$ checkout_price <dbl> 136.83, 136.83, 134.86, 339.50, 243.50, 251.23, 183.36, 182.36, 193~
$ base_price <dbl> 152.29, 135.83, 135.86, 437.53, 242.50, 252.23, 184.36, 183.36, 192~
$ emailer_for_promotion <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0~
$ homepage_featured <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0~
$ num_orders <int> 177, 270, 189, 54, 40, 28, 190, 391, 472, 676, 823, 972, 162, 420, ~
Missing Value
colSums(is.na(train))
id week center_id meal_id
0 0 0 0
checkout_price base_price emailer_for_promotion homepage_featured
0 0 0 0
num_orders
0
Tidak ada missing value pada data train.
Duplicated
Tidak ada duplicated value pada data train.
Data Merging : datatrain
Saya perlu menggabungkan (merge) beberapa dataset yang disediakan menjadi satu data tabular yang siap diproses. Data train dan test masing-masing akan digabung dengan mealinfo (berdasarkan meal_id) dan fcenter (berdasarkan center_id).
Data Structure
glimpse(datatrain)
Rows: 456,548
Columns: 15
$ center_id <fct> 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,~
$ meal_id <fct> 2707, 1525, 1311, 2581, 1207, 2704, 1445, 2304, 2322, 1230, 2577, 1~
$ id <fct> 1347181, 1016940, 1378864, 1223760, 1260561, 1072972, 1169567, 1254~
$ week <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1~
$ checkout_price <dbl> 196.00, 243.50, 174.66, 581.03, 322.07, 243.50, 631.53, 485.03, 320~
$ base_price <dbl> 196.00, 281.33, 173.66, 610.13, 382.18, 281.33, 630.53, 485.03, 386~
$ emailer_for_promotion <fct> 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0~
$ homepage_featured <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0~
$ num_orders <int> 1350, 824, 595, 485, 769, 473, 175, 323, 717, 324, 501, 95, 298, 47~
$ category <chr> "Beverages", "Other Snacks", "Extras", "Pizza", "Beverages", "Other~
$ cuisine <chr> "Italian", "Thai", "Thai", "Continental", "Continental", "Thai", "C~
$ city_code <int> 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 59~
$ region_code <int> 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,~
$ center_type <chr> "TYPE_B", "TYPE_B", "TYPE_B", "TYPE_B", "TYPE_B", "TYPE_B", "TYPE_B~
$ op_area <dbl> 6.3, 6.3, 6.3, 6.3, 6.3, 6.3, 6.3, 6.3, 6.3, 6.3, 6.3, 6.3, 6.3, 6.~
Transforming Data Type
glimpse(datatrain)
Rows: 456,548
Columns: 15
$ center_id <fct> 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,~
$ meal_id <fct> 2707, 1525, 1311, 2581, 1207, 2704, 1445, 2304, 2322, 1230, 2577, 1~
$ id <fct> 1347181, 1016940, 1378864, 1223760, 1260561, 1072972, 1169567, 1254~
$ week <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1~
$ checkout_price <dbl> 196.00, 243.50, 174.66, 581.03, 322.07, 243.50, 631.53, 485.03, 320~
$ base_price <dbl> 196.00, 281.33, 173.66, 610.13, 382.18, 281.33, 630.53, 485.03, 386~
$ emailer_for_promotion <fct> 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0~
$ homepage_featured <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0~
$ num_orders <int> 1350, 824, 595, 485, 769, 473, 175, 323, 717, 324, 501, 95, 298, 47~
$ category <chr> "Beverages", "Other Snacks", "Extras", "Pizza", "Beverages", "Other~
$ cuisine <chr> "Italian", "Thai", "Thai", "Continental", "Continental", "Thai", "C~
$ city_code <fct> 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 59~
$ region_code <fct> 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,~
$ center_type <chr> "TYPE_B", "TYPE_B", "TYPE_B", "TYPE_B", "TYPE_B", "TYPE_B", "TYPE_B~
$ op_area <dbl> 6.3, 6.3, 6.3, 6.3, 6.3, 6.3, 6.3, 6.3, 6.3, 6.3, 6.3, 6.3, 6.3, 6.~
Missing Value
colSums(is.na(datatrain))
center_id meal_id id week
0 0 0 0
checkout_price base_price emailer_for_promotion homepage_featured
0 0 0 0
num_orders category cuisine city_code
0 0 0 0
region_code center_type op_area
0 0 0
Check Outliers
length(boxplot(datatrain$num_orders)$out)
[1] 32937
length(boxplot(log(datatrain$num_orders))$out)
[1] 306
Data outlier pada target variabel mencapai puluhan ribu. Untuk itu, beberapa variabel numerik–termasuk target–perlu ditransformasi menggunakan scale/log. Tampak perbedaan jumlah data outlier yang cukup signifikan setelah target variabel ditransformasi menggunakan log. Lebih jauh lagi, beberapa variabel numerik lainnya juga akan diberi perlakuan sama. Untuk sekarang sekarang kita sudah memiliki datatrain yang siap untuk diekplor dan divisualisasikan agar mendapat informasi/insight yang berguna. Berikutnya akan dibuat model machine learning supaya bisa menghasilkan prediksi yang tepat pada variabel num_orders.
glimpse(test)
Rows: 32,573
Columns: 8
$ id <int> 1028232, 1127204, 1212707, 1082698, 1400926, 1284113, 1197966, 1132~
$ week <int> 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 14~
$ center_id <int> 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,~
$ meal_id <int> 1885, 1993, 2539, 2631, 1248, 1778, 1062, 2707, 1207, 1230, 2322, 2~
$ checkout_price <dbl> 158.11, 160.11, 157.14, 162.02, 163.93, 190.15, 191.09, 242.56, 360~
$ base_price <dbl> 159.11, 159.11, 159.14, 162.02, 163.93, 190.15, 192.09, 240.56, 360~
$ emailer_for_promotion <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0~
$ homepage_featured <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0~
Transforming Data Type
glimpse(test)
Rows: 32,573
Columns: 8
$ id <fct> 1028232, 1127204, 1212707, 1082698, 1400926, 1284113, 1197966, 1132~
$ week <int> 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 14~
$ center_id <fct> 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,~
$ meal_id <fct> 1885, 1993, 2539, 2631, 1248, 1778, 1062, 2707, 1207, 1230, 2322, 2~
$ checkout_price <dbl> 158.11, 160.11, 157.14, 162.02, 163.93, 190.15, 191.09, 242.56, 360~
$ base_price <dbl> 159.11, 159.11, 159.14, 162.02, 163.93, 190.15, 192.09, 240.56, 360~
$ emailer_for_promotion <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0~
$ homepage_featured <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0~
Missing Value
colSums(is.na(test))
id week center_id meal_id
0 0 0 0
checkout_price base_price emailer_for_promotion homepage_featured
0 0 0 0
Tidak ada missing value pada data test.
Duplicated
Tidak ada duplicated value pada data test.
Data Merging : datatrain
Saya perlu menggabungkan (merge) beberapa dataset yang disediakan menjadi satu data tabular yang siap diproses. Data train dan test masing-masing akan digabung dengan mealinfo (berdasarkan meal_id) dan fcenter (berdasarkan center_id).
Data Structure
glimpse(datatrain)
Rows: 456,548
Columns: 15
$ center_id <fct> 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,~
$ meal_id <fct> 2707, 1525, 1311, 2581, 1207, 2704, 1445, 2304, 2322, 1230, 2577, 1~
$ id <fct> 1347181, 1016940, 1378864, 1223760, 1260561, 1072972, 1169567, 1254~
$ week <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1~
$ checkout_price <dbl> 196.00, 243.50, 174.66, 581.03, 322.07, 243.50, 631.53, 485.03, 320~
$ base_price <dbl> 196.00, 281.33, 173.66, 610.13, 382.18, 281.33, 630.53, 485.03, 386~
$ emailer_for_promotion <fct> 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0~
$ homepage_featured <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0~
$ num_orders <int> 1350, 824, 595, 485, 769, 473, 175, 323, 717, 324, 501, 95, 298, 47~
$ category <chr> "Beverages", "Other Snacks", "Extras", "Pizza", "Beverages", "Other~
$ cuisine <chr> "Italian", "Thai", "Thai", "Continental", "Continental", "Thai", "C~
$ city_code <int> 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 59~
$ region_code <int> 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,~
$ center_type <chr> "TYPE_B", "TYPE_B", "TYPE_B", "TYPE_B", "TYPE_B", "TYPE_B", "TYPE_B~
$ op_area <dbl> 6.3, 6.3, 6.3, 6.3, 6.3, 6.3, 6.3, 6.3, 6.3, 6.3, 6.3, 6.3, 6.3, 6.~
Transforming Data Type
glimpse(datatrain)
Rows: 456,548
Columns: 15
$ center_id <fct> 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,~
$ meal_id <fct> 2707, 1525, 1311, 2581, 1207, 2704, 1445, 2304, 2322, 1230, 2577, 1~
$ id <fct> 1347181, 1016940, 1378864, 1223760, 1260561, 1072972, 1169567, 1254~
$ week <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1~
$ checkout_price <dbl> 196.00, 243.50, 174.66, 581.03, 322.07, 243.50, 631.53, 485.03, 320~
$ base_price <dbl> 196.00, 281.33, 173.66, 610.13, 382.18, 281.33, 630.53, 485.03, 386~
$ emailer_for_promotion <fct> 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0~
$ homepage_featured <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0~
$ num_orders <int> 1350, 824, 595, 485, 769, 473, 175, 323, 717, 324, 501, 95, 298, 47~
$ category <chr> "Beverages", "Other Snacks", "Extras", "Pizza", "Beverages", "Other~
$ cuisine <chr> "Italian", "Thai", "Thai", "Continental", "Continental", "Thai", "C~
$ city_code <fct> 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 59~
$ region_code <fct> 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,~
$ center_type <chr> "TYPE_B", "TYPE_B", "TYPE_B", "TYPE_B", "TYPE_B", "TYPE_B", "TYPE_B~
$ op_area <dbl> 6.3, 6.3, 6.3, 6.3, 6.3, 6.3, 6.3, 6.3, 6.3, 6.3, 6.3, 6.3, 6.3, 6.~
Missing Value
colSums(is.na(datatrain))
center_id meal_id id week
0 0 0 0
checkout_price base_price emailer_for_promotion homepage_featured
0 0 0 0
num_orders category cuisine city_code
0 0 0 0
region_code center_type op_area
0 0 0
Check Outliers
length(boxplot(datatrain$num_orders)$out)
[1] 32937
length(boxplot(log(datatrain$num_orders))$out)
[1] 306
Data outlier pada target variabel mencapai puluhan ribu. Untuk itu, beberapa variabel numerik–termasuk target–perlu ditransformasi menggunakan scale/log. Tampak perbedaan jumlah data outlier yang cukup signifikan setelah target variabel ditransformasi menggunakan log. Lebih jauh lagi, beberapa variabel numerik lainnya juga akan diberi perlakuan sama. Untuk sekarang sekarang kita sudah memiliki datatrain yang siap untuk diekplor dan divisualisasikan agar mendapat informasi/insight yang berguna. Berikutnya akan dibuat model machine learning supaya bisa menghasilkan prediksi yang tepat pada variabel num_orders.
Data Cleansing
glimpse(mealinfo)
Rows: 51
Columns: 3
$ meal_id <int> 1885, 1993, 2539, 1248, 2631, 1311, 1062, 1778, 1803, 1198, 2707, 1847, 1438, 24~
$ category <chr> "Beverages", "Beverages", "Beverages", "Beverages", "Beverages", "Extras", "Beve~
$ cuisine <chr> "Thai", "Thai", "Thai", "Indian", "Indian", "Thai", "Italian", "Italian", "Thai"~
Transforming Data Type
glimpse(mealinfo)
Rows: 51
Columns: 3
$ meal_id <fct> 1885, 1993, 2539, 1248, 2631, 1311, 1062, 1778, 1803, 1198, 2707, 1847, 1438, 24~
$ category <fct> Beverages, Beverages, Beverages, Beverages, Beverages, Extras, Beverages, Bevera~
$ cuisine <fct> Thai, Thai, Thai, Indian, Indian, Thai, Italian, Italian, Thai, Thai, Italian, T~
Missing Value
colSums(is.na(mealinfo))
meal_id category cuisine
0 0 0
Tidak ada missing value pada data mealinfo.
Duplicated
Tidak ada duplicated value pada data mealinfo.
Data Merging : datatrain
saya perlu menggabungkan (merge) beberapa dataset yang disediakan menjadi satu data tabular yang siap diproses. Data train dan test masing-masing akan digabung dengan mealinfo (berdasarkan meal_id) dan fcenter (berdasarkan center_id).
Data Structure
glimpse(datatrain)
Rows: 456,548
Columns: 15
$ center_id <fct> 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,~
$ meal_id <fct> 2707, 1525, 1311, 2581, 1207, 2704, 1445, 2304, 2322, 1230, 2577, 1~
$ id <fct> 1347181, 1016940, 1378864, 1223760, 1260561, 1072972, 1169567, 1254~
$ week <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1~
$ checkout_price <dbl> 196.00, 243.50, 174.66, 581.03, 322.07, 243.50, 631.53, 485.03, 320~
$ base_price <dbl> 196.00, 281.33, 173.66, 610.13, 382.18, 281.33, 630.53, 485.03, 386~
$ emailer_for_promotion <fct> 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0~
$ homepage_featured <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0~
$ num_orders <int> 1350, 824, 595, 485, 769, 473, 175, 323, 717, 324, 501, 95, 298, 47~
$ category <fct> Beverages, Other Snacks, Extras, Pizza, Beverages, Other Snacks, Se~
$ cuisine <fct> Italian, Thai, Thai, Continental, Continental, Thai, Continental, I~
$ city_code <int> 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 59~
$ region_code <int> 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,~
$ center_type <chr> "TYPE_B", "TYPE_B", "TYPE_B", "TYPE_B", "TYPE_B", "TYPE_B", "TYPE_B~
$ op_area <dbl> 6.3, 6.3, 6.3, 6.3, 6.3, 6.3, 6.3, 6.3, 6.3, 6.3, 6.3, 6.3, 6.3, 6.~
Transforming Data Type
glimpse(datatrain)
Rows: 456,548
Columns: 15
$ center_id <fct> 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,~
$ meal_id <fct> 2707, 1525, 1311, 2581, 1207, 2704, 1445, 2304, 2322, 1230, 2577, 1~
$ id <fct> 1347181, 1016940, 1378864, 1223760, 1260561, 1072972, 1169567, 1254~
$ week <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1~
$ checkout_price <dbl> 196.00, 243.50, 174.66, 581.03, 322.07, 243.50, 631.53, 485.03, 320~
$ base_price <dbl> 196.00, 281.33, 173.66, 610.13, 382.18, 281.33, 630.53, 485.03, 386~
$ emailer_for_promotion <fct> 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0~
$ homepage_featured <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0~
$ num_orders <int> 1350, 824, 595, 485, 769, 473, 175, 323, 717, 324, 501, 95, 298, 47~
$ category <fct> Beverages, Other Snacks, Extras, Pizza, Beverages, Other Snacks, Se~
$ cuisine <fct> Italian, Thai, Thai, Continental, Continental, Thai, Continental, I~
$ city_code <fct> 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 59~
$ region_code <fct> 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,~
$ center_type <chr> "TYPE_B", "TYPE_B", "TYPE_B", "TYPE_B", "TYPE_B", "TYPE_B", "TYPE_B~
$ op_area <dbl> 6.3, 6.3, 6.3, 6.3, 6.3, 6.3, 6.3, 6.3, 6.3, 6.3, 6.3, 6.3, 6.3, 6.~
Missing Value
colSums(is.na(datatrain))
center_id meal_id id week
0 0 0 0
checkout_price base_price emailer_for_promotion homepage_featured
0 0 0 0
num_orders category cuisine city_code
0 0 0 0
region_code center_type op_area
0 0 0
Check Outliers
length(boxplot(datatrain$num_orders)$out)
[1] 32937
length(boxplot(log(datatrain$num_orders))$out)
[1] 306
Data outlier pada target variabel mencapai puluhan ribu. Untuk itu, beberapa variabel numerik–termasuk target–perlu ditransformasi menggunakan scale/log. Tampak perbedaan jumlah data outlier yang cukup signifikan setelah target variabel ditransformasi menggunakan log. Lebih jauh lagi, beberapa variabel numerik lainnya juga akan diberi perlakuan sama. Untuk sekarang sekarang kita sudah memiliki datatrain yang siap untuk diekplor dan divisualisasikan agar mendapat informasi/insight yang berguna. Berikutnya akan dibuat model machine learning supaya bisa menghasilkan prediksi yang tepat pada variabel num_orders.
Saya coba buat kolom baru yang menyimpan informasi penjualan sebagai hasil perkalian kolom checkout_price dan num_orders. Kolom sales nantinya akan diolah untuk menghasilkan visualisasi jenis makanan apa saya yang cukup diminati dan berkontribusi paling besar pada kenaikan angka penjualan.
Dari grafik di atas, kita bisa tahu rata-rata penjualan tiap minggunya (minggu ke 1-145) selalu naik turun, ada pola seasonality pada datatrain. Namun keadaan ini belum bisa diinterpretasikan lebih jauh, yang jelas rata-rata penjualan sejauh ini berada di angka 60.000 hingga 70.000 setiap minggu.
Ada 14 jenis (category) makanan yang tersedia pada datatrain, dimana Beverages adalah jenis yang paling sering dipesan oleh pembeli. Posisinya sangat unggul jauh dibanding jenis makanan lain. Keadaan ini bisa dipengaruhi karena kecenderungan orang-orang yang lebih suka mengonsumsi makanan ringan (camilan) ketimbang makanan berat. Namun dengan penjualan Beverages sebanyak lebih dari 120.000 pesanan, apakah berarti jenis makanan ini berkontribusi paling besar dalam meningkatkan angka penjualan?
Nyatanya tidak. Secara visualisasi, cukup jelas category makanan Rice Bowl membawa keuntungan paling besar dari seluruh data penjualan, yaitu sekitar 170.000. Kemudian ada Sandwich di peringkat dua dan Pizza di peringkat tiga. Sedangkan kontribusi Beveragescenderung kecil, sekitar 6.000 saja. Maka dari itu, perusahaan tetap perlu memperhatikan ketersediaan bahan bukan hanya makanan yang paling sering dipesan, tapi juga makanan yang punya angka penjualan tinggi.
Mengingat tingginya permintaan Beverages maka penting bagi perusahaan bisa memenuhi permintaan pembeli dengan baik. Walau kontribusinya tidak terlalu signifikan, Beverages bisa menjadi kunci untuk membangun kepuasan berbelanja bagi pembeli. Maka dari itu, plot di atas menjelaskan cuisine Italian dan Continental sebagai favorit pembeli yang memesan Beverages.