Di era perkembangan teknologi sekarang ini berdampak ke seluruh elemen kehidupan masyarakat termasuk industri kuliner. Jika kita ingin memesan sebuah makanan kita tak perlu lagi datang ke restoran tersebut. Cukup hanya dengan menggunakan aplikasi layanan pesan antar makanan yang berbasis online. Banyak negara sudah menggunakan aplikasi tersebut. Salah satunya India di kota Bangalore. Permintaan akan layanan pesan antar makanan online meningkat di sana.
Kita akan melakukan analisa menggunakan dataset Bangalore Online Food Delivery Preferences untuk mencari tau karakteristik konsumen yang akan melakukan pemesanan kembali dan mencari tau penyebab mengapa konsumen tidak melakukan pemesanan kembali.
Dataset Bangalore Online Food Delivery Preferences merupakan data hasil survei yang mencakup data pribadi dan pendapat konsumen pengguna aplikasi layanan pesan antar makanan online di kota Bangalore. Dataset tersebut memiliki 388 baris dan 55 kolom yang beberapa di antaranya.
Age
: Umur dalam tahun Gender
: Jenis
kelamin Marital.Status
: Status
Occupation
: Pekerjaan Monthly.Income
:
Pendapatan per bulan Educational.Qualifications
:
Pendidikan terakhir Family.size
: Jumlah anggota
keluarga latitude
: Garis lintang tempat tinggal
longitude
: Garis bujur tempat tinggal
Pin.code
: Kode pos tempat tinggal
Yang pertama kita lakukan adalah memanggil library yang dibutuhkan.
library(tidyverse)
Selanjutnya kita input dataset Bangalore Online Food Delivery
Preferences menggunakan fungsi read.csv()
dan
menyimpannya ke dalam variabel deliv
. Kita perlu
menggunakan parameter stringsAsFactors
untuk mengubah tipe
data character menjadi factor.
<- read.csv("onlinedeliverydata.csv",
deliv stringsAsFactors = T)
head(deliv)
Kita menggunakan fungsi glimpse()
untuk melihat apakah
masih ada tipe data yang belum sesuai.
glimpse(deliv)
## Rows: 388
## Columns: 55
## $ Age <int> 20, 24, 22, 22, 22, 27, 22, …
## $ Gender <fct> Female, Female, Male, Female…
## $ Marital.Status <fct> Single, Single, Single, Sing…
## $ Occupation <fct> Student, Student, Student, S…
## $ Monthly.Income <fct> No Income, Below Rs.10000, B…
## $ Educational.Qualifications <fct> Post Graduate, Graduate, Pos…
## $ Family.size <int> 4, 3, 3, 6, 4, 2, 3, 3, 2, 4…
## $ latitude <dbl> 12.9766, 12.9770, 12.9551, 1…
## $ longitude <dbl> 77.5993, 77.5773, 77.6593, 7…
## $ Pin.code <int> 560001, 560009, 560017, 5600…
## $ Medium..P1. <fct> Food delivery apps, Food del…
## $ Medium..P2. <fct> Web browser, Web browser, …
## $ Meal.P1. <fct> Breakfast, Snacks, Lunch, Sn…
## $ Meal.P2. <fct> Lunch, Dinner, Snacks, D…
## $ Perference.P1. <fct> Non Veg foods (Lunch / Dinne…
## $ Perference.P2. <fct> Bakery items (snacks), Veg…
## $ Ease.and.convenient <fct> Neutral, Strongly agree, Str…
## $ Time.saving <fct> Neutral, Strongly agree, Str…
## $ More.restaurant.choices <fct> Neutral, Strongly agree, Str…
## $ Easy.Payment.option <fct> Neutral, Strongly agree, Neu…
## $ More.Offers.and.Discount <fct> Neutral, Strongly agree, Neu…
## $ Good.Food.quality <fct> Neutral, Neutral, Disagree, …
## $ Good.Tracking.system <fct> Neutral, Agree, Neutral, Agr…
## $ Self.Cooking <fct> Neutral, Strongly agree, Dis…
## $ Health.Concern <fct> Neutral, Strongly agree, Neu…
## $ Late.Delivery <fct> Neutral, Agree, Neutral, Neu…
## $ Poor.Hygiene <fct> Neutral, Strongly agree, Agr…
## $ Bad.past.experience <fct> Neutral, Strongly agree, Agr…
## $ Unavailability <fct> Neutral, Strongly agree, Agr…
## $ Unaffordable <fct> Neutral, Strongly agree, Agr…
## $ Long.delivery.time <fct> Agree, Strongly agree, Agree…
## $ Delay.of.delivery.person.getting.assigned <fct> Agree, Strongly agree, Agree…
## $ Delay.of.delivery.person.picking.up.food <fct> Agree, Strongly agree, Agree…
## $ Wrong.order.delivered <fct> Agree, Strongly agree, Stron…
## $ Missing.item <fct> Agree, Strongly agree, Agree…
## $ Order.placed.by.mistake <fct> Agree, Strongly agree, Neutr…
## $ Influence.of.time <fct> Yes, Yes, Yes, Yes, Yes, Yes…
## $ Order.Time <fct> Weekend (Sat & Sun), Anytime…
## $ Maximum.wait.time <fct> 30 minutes, 30 minutes, 45 m…
## $ Residence.in.busy.location <fct> Agree, Strongly Agree, Agree…
## $ Google.Maps.Accuracy <fct> Neutral, Neutral, Strongly A…
## $ Good.Road.Condition <fct> Neutral, Disagree, Neutral, …
## $ Low.quantity.low.time <fct> Neutral, Strongly disagree, …
## $ Delivery.person.ability <fct> Neutral, Agree, Agree, Agree…
## $ Influence.of.rating <fct> Yes, Yes, Yes, Yes, Yes, Yes…
## $ Less.Delivery.time <fct> Moderately Important, Very I…
## $ High.Quality.of.package <fct> Moderately Important, Very I…
## $ Number.of.calls <fct> Moderately Important, Very I…
## $ Politeness <fct> Moderately Important, Very I…
## $ Freshness <fct> Moderately Important, Very I…
## $ Temperature <fct> Moderately Important, Very I…
## $ Good.Taste <fct> Moderately Important, Very I…
## $ Good.Quantity <fct> Moderately Important, Very I…
## $ Output <fct> Yes, Yes, Yes, Yes, Yes, Yes…
## $ Reviews <fct> "Nil\n", "Nil", "Many a time…
Kita perlu mengubah tipe data kolom Family.size
dan
Pin.code
menjadi factor untuk mempermudah kita dalam
melakukan analisa.
<-
deliv %>%
deliv mutate(Family.size = as.factor(Family.size),
Pin.code = as.factor(Pin.code))
Selanjutnya kita perlu membuang beberapa kolom yaitu
latitude
, longitude
, dan Reviews
karena kita tidak melakukan analisa teks dan geospasial.
<-
deliv %>%
deliv select(-c(55, 8, 9))
Kita juga perlu melihat apakah terdapat missing value pada dataset
kita dengan menggunakan fungsi anyNA()
.
anyNA(deliv)
## [1] FALSE
Tidak terdapat missing value pada dataset kita.
Untuk dapat mengetahui karakteristik konsumen yang melakukan
pemesanan kembali kita perlu melakukan subsetting menggunakan fungsi
filter()
dan menyimpannya ke dalam variabel
deliv_yes
.
<-
deliv_yes %>%
deliv filter(Output %in% "Yes")
Setelah itu kita ingin melihat jumlah konsumen berdasarkan pekerjaan mereka.
table(deliv_yes$Occupation)
##
## Employee House wife Self Employeed Student
## 76 7 34 184
Kita dapat melihat konsumen paling banyak merupakan mahasiswa. Kita akan coba mencari tau lebih dalam mahasiswa seperti apa yang akan melakukan pemesanan kembali menggunakan aplikasi layanan pesan antar makanan online.
Kita subsetting terlebih dahulu data yang kita punya dan kita simpan
ke dalam variabel student
.
<-
student %>%
deliv_yes filter(Occupation %in% "Student")
Kita ingin melihat preferensi mahasiswa dalam memilih medium saat melakukan pemesanan.
table(student$Medium..P1.)
##
## Direct call Food delivery apps Walk-in Web browser
## 4 160 19 1
table(student$Medium..P2.)
##
## Direct call Walk-in Web browser
## 111 49 24
Pada preferensi pertama mahasiswa lebih suka memesan lewat aplikasi sedangkan pada preferensi kedua mahasiswa lebih suka lewat telepon langsung.
Kita juga ingin mengetahui preferensi waktu yang disukai mahasiswa dalam memesan makanan.
table(student$Meal.P1.)
##
## Breakfast Dinner Lunch Snacks
## 28 46 63 47
table(student$Meal.P2.)
##
## Dinner Lunch Snacks
## 149 11 24
Pada preferensi pertama mahasiswa paling suka melakukan pemesanan untuk makan siang. Tetapi untuk makan malam dan snack jumlahnya hampir sama dengan rentang nilai yang tidak terlalu jauh dengan makan siang dan sarapan. Pada preferensi kedua mahasiswa paling suka melakukan pemesanan untuk makan malam.
Selanjutnya kita juga ingin mengetahui preferensi jenis makanan yang paling banyak dipesan mahasiswa.
table(student$Perference.P1.)
##
## Bakery items (snacks) Non Veg foods (Lunch / Dinner)
## 0 150
## Sweets Veg foods (Breakfast / Lunch / Dinner)
## 2 32
table(student$Perference.P2.)
##
## Bakery items (snacks) Ice cream / Cool drinks
## 10 25
## Sweets Veg foods (Breakfast / Lunch / Dinner)
## 12 137
Pada preferensi pertama jenis makanan yang paling banyak dipesan mahasiswa adalah makanan yang bukan vegan sedangkan pada preferensi kedua makanan yang paling banyak dipesan mahasiswa adalah makanan vegan.
Kita ingin melihat pendapatan per bulan mahasiswa yang melakukan pemesanan kembali.
table(student$Monthly.Income)
##
## 10001 to 25000 25001 to 50000 Below Rs.10000 More than 50000 No Income
## 5 3 17 2 157
Mahasiswa yang paling banyak melakukan pemesanan kembali dalah mahasiswa yang belum memiliki pendapatan per bulan.
Selanjutnya kita ingin melihat jumlah mahasiswa berdasarkan kualifikasi pendidikan mereka.
table(student$Educational.Qualifications)
##
## Graduate Ph.D Post Graduate School Uneducated
## 67 7 110 0 0
Mahasiswa yang paling banyak melakukan pemesanan kembali adalah mahasiswa yang memiliki kualifikasi pendidikan magister. Diikuti mahasiswa yang memiliki kualifikasi pendididkan sarjana dengan rentang nilai yang tidak terlalu jauh.
Kita perlu untuk mengetahui jumlah mahasiswa berdasarkan status mereka.
table(student$Marital.Status)
##
## Married Prefer not to say Single
## 6 0 178
Mahasiswa yang paling banyak melakukan pemesanan kembali memiliki status lajang.
Selanjutnya kita akan mencari tau jumlah mahasiswa berdasarkan kode pos rumah mereka.
table(student$Pin.code)
##
## 560001 560002 560003 560004 560005 560006 560007 560008 560009 560010 560011
## 5 2 4 3 0 0 2 3 32 10 4
## 560012 560013 560014 560015 560016 560017 560018 560019 560020 560021 560022
## 0 0 3 3 1 3 0 2 2 3 0
## 560023 560024 560025 560026 560027 560028 560029 560030 560032 560033 560034
## 2 6 0 1 4 0 6 2 1 1 4
## 560036 560038 560041 560042 560043 560045 560046 560047 560048 560049 560050
## 5 7 1 3 4 0 1 1 3 2 1
## 560051 560055 560056 560059 560060 560061 560062 560064 560066 560067 560068
## 1 0 1 0 0 1 2 1 0 1 1
## 560070 560072 560073 560075 560076 560078 560079 560080 560085 560086 560091
## 2 0 1 3 3 5 0 2 3 2 0
## 560092 560093 560095 560096 560097 560098 560100 560102 560103 560104 560109
## 2 0 3 7 0 1 1 1 1 1 1
Kode pos yang paling banyak melakukan pemesanan kembali adalah 560009 dengan jumlah 32.
Kita akan melihat jumlah mahasiswa berdasarkan waktu pemesanannya.
table(student$Order.Time)
##
## Anytime (Mon-Sun) Weekdays (Mon-Fri) Weekend (Sat & Sun)
## 111 7 66
Mahasiswa paling banyak melakukan pemesanan pada saat kapan saja. Selain itu mahasiswa juga melakukan pemesanan pada saat akhir pekan.
Kita ingin mengetahui apakah ketidaksediaan menu menjadi poin penting bagi mahasiswa.
table(student$Unavailability)
##
## Agree Disagree Neutral Strongly agree
## 46 40 47 18
## Strongly disagree
## 33
Jumlah mahasiswa yang menjawab netral dan setuju hampir sama yaitu 47 dan 46. Untuk yang menjawab tidak setuju dan sangat tidak setuju 40 dan 33 orang.
Selanjutnya kita ingin mengetahui apakah rumah mahasiswa berada di lokasi yang sibuk atau tidak.
table(student$Residence.in.busy.location)
##
## Agree Disagree Neutral Strongly Agree
## 107 21 31 19
## Strongly disagree
## 6
Sebanyak 107 orang menjawab setuju rumah mereka berada di lokasi yang sibuk.
Kita dapat mengetahui rumah mahasiswa yang berada di lokasi yang
sibuk berdasarkan jumlah Pin.code
dan
Residence.in.busy.location
.
<- as.data.frame(table(student$Pin.code, student$Residence.in.busy.location))
student_loc
%>%
student_loc arrange(-Freq) %>%
head()
Berdasarkan hasil di atas tiga pendapat terbanyak mahasiswa pada saat ditanya apakah rumah mereka berada di lokasi yang sibuk adalah setuju dan sangat setuju. Kode pos yang paling banyak menjawab setuju dan sangat setuju adalah 560009 dan 560010.
Kita juga perlu mengetahui karakteristik konsumen yang tidak
melakukan pemesanan kembali. Kita memfilter data yang kita punya kembali
dan menyimpannya ke dalam variabel deliv_no
.
<-
deliv_no %>%
deliv filter(Output %in% "No")
Sama seperti sebelumnya kita akan melihat jumlah konsumen berdasarkan pekerjaan mereka.
table(deliv_no$Occupation)
##
## Employee House wife Self Employeed Student
## 42 2 20 23
Jumlah konsumen yang paling banyak tidak melakukan pemesanan kembali adalah karyawan. Sehingga kita perlu untuk mencari tau lebih dalam karyawan seperti apa yang tidak melakukan pemesanan kembali pada aplikasi layanan pesan antar makanan online.
Kita filter terlebih dahulu data yang karyawan saja pada
deliv_no
dan kita simpan ke dalam variabel
employee2
.
<-
employee2 %>%
deliv_no filter(Occupation %in% "Employee")
Kita akan menggunakan data kuesioner yang telah dijawab untuk mengetahui karakteristik konsumen yang tidak melakukan pemesanan kembali.
Yang pertama kita ingin lihat adalah jumlah karyawan berdasarkan medium pemesanan.
table(employee2$Medium..P1.)
##
## Direct call Food delivery apps Walk-in Web browser
## 0 42 0 0
table(employee2$Medium..P2.)
##
## Direct call Walk-in Web browser
## 19 14 9
Pada preferensi pertama semua karyawan lebih suka melakukan pemesanan lewat aplikasi. Sedangkan pada preferensi kedua ada 19 karyawan yang memilih melakukan pemesanan melalui telepon langsung, 14 karyawan yang datang ke restoran, dan sembilan karyawan yang melakukan pemesanan lewat web browser.
Selanjutnya kita ingin melihat jumlah karyawan berdasarkan preferensi jenis makanan mereka.
table(employee2$Meal.P1.)
##
## Breakfast Dinner Lunch Snacks
## 3 15 17 7
table(employee2$Meal.P2.)
##
## Dinner Lunch Snacks
## 32 2 8
Pada preferensi pertama karyawan memilih melakukan pemesanan untuk makan siang dan makan malam. Sedangkan pada preferensi kedua sebagian besar karyawan memilih melakukan pemesanan untuk makan malam.
Kita juga akan melihat jumlah karyawan berdasarkan preferensi jenis makanan yang mereka pilih.
table(employee2$Perference.P1.)
##
## Bakery items (snacks) Non Veg foods (Lunch / Dinner)
## 0 31
## Sweets Veg foods (Breakfast / Lunch / Dinner)
## 1 10
table(employee2$Perference.P2.)
##
## Bakery items (snacks) Ice cream / Cool drinks
## 1 4
## Sweets Veg foods (Breakfast / Lunch / Dinner)
## 9 28
Pada preferensi pertama jenis makanan yang paling banyak dipilih adalah makanan non vegan. Sedangkan pada preferensi kedua jenis makanan yang paling banyak dipilih adalah makanan vegan.
Tahap selanjutnya yang akan kita lakukan adalah melihat pendapatan per bulan dan status karyawan yang tidak melakukan pemesanan kembali.
table(employee2$Monthly.Income)
##
## 10001 to 25000 25001 to 50000 Below Rs.10000 More than 50000 No Income
## 6 19 6 11 0
table(employee2$Marital.Status)
##
## Married Prefer not to say Single
## 25 5 12
Berdasarkan hasil di atas karyawan yang paling banyak tidak melakukan pemesanan kembali adalah karyawan yang memiliki pendapatan per bulan di antara 25.001 dan 50.000. Memiliki selisih jumlah yang tidak terlalu jauh adalah karyawan dengan pendapatan per bulan lebih dari 50.000. Untuk status karyawan yang paling banyak tidak melakukan pemesanan kembali adalah menikah.
Karena status karyawan yang paling banyak tidak melakukan pemesanan
kembali adalah menikah, maka kita perlu mencari variabel lain yang kita
punya yang dapat menjelaskan lebih detail status tersebut. Kita akan
melakukan filter kembali dan menyimpannya ke dalam variabel
married2
.
<-
married2 %>%
employee2 filter(Marital.Status %in% "Married")
Kita ingin melihat jumlah karyawan yang memiliki status menikah berdasarkan jumlah anggota keluarganya.
table(married2$Family.size)
##
## 1 2 3 4 5 6
## 2 3 4 8 5 3
Dua teratas jumlah karyawan terbanyak yang memiliki status menikah adalah yang memiliki jumlah anggota keluarga empat dan lima orang.
Kembali ke data employee2
, kita ingin melihat jumlah
karyawan berdasarkan jenis kelamin.
table(employee2$Gender)
##
## Female Male
## 20 22
Terdapat 22 karyawan yang berjenis kelamin laki-laki dan sisanya perempuan sebanyak 20 orang.
Kita juga ingin mengetahui jumlah karyawan berdasarkan kode pos rumah mereka.
table(employee2$Pin.code)
##
## 560001 560002 560003 560004 560005 560006 560007 560008 560009 560010 560011
## 0 0 1 0 2 1 1 0 1 1 1
## 560012 560013 560014 560015 560016 560017 560018 560019 560020 560021 560022
## 1 1 0 1 0 1 1 0 1 1 1
## 560023 560024 560025 560026 560027 560028 560029 560030 560032 560033 560034
## 2 0 0 0 0 0 0 0 0 0 3
## 560036 560038 560041 560042 560043 560045 560046 560047 560048 560049 560050
## 0 3 2 1 0 0 0 0 0 0 0
## 560051 560055 560056 560059 560060 560061 560062 560064 560066 560067 560068
## 0 0 0 0 1 0 0 0 4 1 1
## 560070 560072 560073 560075 560076 560078 560079 560080 560085 560086 560091
## 0 1 0 0 0 0 0 0 0 0 2
## 560092 560093 560095 560096 560097 560098 560100 560102 560103 560104 560109
## 3 2 0 0 0 0 0 0 0 0 0
Kode pos yang paling banyak tidak melakukan pemesanan kembali adalah 560066 dengan jumlah empat. Sedangkan kode pos 560034 dan 560038 masing-masing terdapat tiga karyawan yang tidak melakukan pemesanan kembali.
Selanjutnya kita ingin melihat jumlah karyawan berdasarkan waktu pemesanan.
table(employee2$Order.Time)
##
## Anytime (Mon-Sun) Weekdays (Mon-Fri) Weekend (Sat & Sun)
## 29 2 11
Sebagian besar karyawan memilih untuk melakukan pemesanan kapan saja.
Di tahap ini kita akan mencari tau apakah ketidaksediaan menu menjadi poin penting bagi karyawan.
table(employee2$Unavailability)
##
## Agree Disagree Neutral Strongly agree
## 12 15 8 4
## Strongly disagree
## 3
Kita dapat melihat 15 karyawan menjawab tidak setuju, 12 karyawan menjawab setuju, dan delapan karyawan menjawab netral.
Kita juga akan mencari tau apakah rumah karyawan berada di lokasi
yang sibuk berdasarkan variabel
Residence.in.busy.location
.
table(employee2$Residence.in.busy.location)
##
## Agree Disagree Neutral Strongly Agree
## 33 3 4 0
## Strongly disagree
## 2
Sebagian besar karyawan yang tidak melakukan pemesanan kembali menjawab setuju.
Sama seperti sebelumnya kita dapat mengetahui rumah karyawan yang
berada di lokasi yang sibuk berdasarkan jumlah Pin.code
dan
Residence.in.busy.location
.
<- as.data.frame(table(employee2$Pin.code, employee2$Residence.in.busy.location))
employee_loc
%>%
employee_loc arrange(-Freq) %>%
head()
Berdasarkan hasil di atas tiga pendapat terbanyak karyawan pada saat ditanya apakah rumah mereka berada di lokasi yang sibuk adalah setuju dan netral. Kode pos yang paling banyak menjawab setuju dan netral adalah 560034, 560038, dan 560092.
Setelah melakukan berbagai proses analisa dapat kita temukan bahwa.
Pada Output 1.
Pada Output 0.