Toekomstanalyse Bright Kitchen
Introductie
#Managementsamenvatting
#Introductie groep
De opdracht
Voor opdrachtgever Bright Kitchen zullen wij een onderzoek gaan houden. De hoofdvragen van het onderzoek zijn als volgt geformuleerd:
• Hoeveel orders (totaal en per restaurant) kunnen we verwachten 1, 2 en 7 dagen vooruit? Wat is de nauwkeurigheid van de voorspelling?
• Welke variabelen hebben invloed op het aantal orders en op welke manier?
Daarnaast hadden wij de mogelijkheid om per groep een of meerdere verdiepingsvragen te gaan onderzoeken. Er kon gekozen worden uit de volgende verdiepingsvragen:
• Voorspelling van het aantal orders per categorie (main, starter, dessert).
• Koppelen van de dataset van vóór november (tabellen All_Orders, Items en SubItems) met de dataset ná november (tabellen PostOrders, PostItems en PostSubItems). Houd het nieuwe format aan.
• Kun je terugkerende klanten (alleen thuisbezorgd.nl) herkennen en hun gedrag beschrijven? Zijn er gerechten die vaak nog een keer besteld door dezelfde klant worden of juist niet?
• Hoe zijn de orders verspreid over de stad? Wat zou een goede locatie zijn voor een tweede keuken?
• Bij welk (type) items zien we een langere pick-up time dan gebruikelijk op dit tijdstip?
Data verzameling
De gebruikte tools: Er zijn een aantal verscheidene tools die wij gebruiken om onderstaande presentatie zo goed mogelijk te kunnen presenteren. Hieronder ziet u een overzicht van deze tools.
library("knitr")
library(tidyverse)
library(tidyr)
library(leaflet)
library(readxl)
library(geojsonio)
library(rmdformats)
library(data.table)
library(lubridate)
library(plyr)
library(arsenal)Het laden van de online omgeving
Deze opdracht voeren wij als studenten van de minor Data Science uit in een online omgeving zodat wij met alle studenten makkelijk bij de datasets kunnen komen en de interactie en communicatie met docenten en studenten simpeler kan verlopen.
library(DBI)
library(RMySQL)
user = 'Hackaton'
password = 'DBpass2BrKi4AlMem2Grp'
dbConn <- dbConnect(
MySQL(),
user,
password,
dbname = 'hackaton',
host = '127.0.0.1'
)
dbListTables(dbConn)## [1] "All_Orders" "Items" "PostItems" "PostOrders" "PostSubItems"
## [6] "SubItems"
Het inladen van de verscheidene databestanden
Voor dit project zijn er 6 databestanden vanuit de opdrachtgever beschikbaar gesteld voor de opdracht. Het zijn 3 verschillende soorten datasets waarbij iedere dataset 2 verscheidene perioden heeft. De datasets met Post ervoor is de huidige of vernieuwde situatie. De bestanden zonder Post ervoor zijn de databestanden in de oude situatie.
De bestanden zien er als volgt uit: - All_Orders en Postorders - Items en PostItems - SubItems en PostSubItems
PostItems <- dbSendQuery(dbConn,"SELECT * FROM PostItems")
PostItems = fetch(PostItems, n=-1)
PostOrders <- dbSendQuery(dbConn,"SELECT * FROM PostOrders")
PostOrders = fetch(PostOrders, n=-1)
PostSubItems <- dbSendQuery(dbConn,"SELECT * FROM PostSubItems")
PostSubItems = fetch(PostSubItems, n=-1)
Items <- dbSendQuery(dbConn,"SELECT * FROM Items")
Items = fetch(Items, n=-1)
All_Orders <- dbSendQuery(dbConn,"SELECT * FROM All_Orders")
All_Orders = fetch(All_Orders, n=-1)
SubItems <- dbSendQuery(dbConn,"SELECT * FROM SubItems")
SubItems = fetch(SubItems, n=-1)Data schoonmaken
Het schoonmaken van data voor- en na de maand november
Als eerste gaan wij de 6 datasets terug brengen tot 3 datasets. Wij gaan dus de verouderde situatie klaarmaken om samengevoegd te worden met de vernieuwde situatie datasets. Wij hebben hiervoor gekozen om het overzichtelijker te maken om te presenteren maar ook om voorspellende variabele bij elkaar te voegen.
Orders en PostOrders
#setdiff(names(PostOrders), names(All_Orders))
#names(All_Orders)
All_Orders2 <- All_Orders %>%
#Verwijder oude-situatie columns die irrelevant zijn
select(-created,
-pickupTime,
-courier,
-LocationID,
-customerCompanyName,
-deliveryAddressExtraAddressInfo,
-status,
-Ordercol
) %>%
#Verander namen oude-situatie naar post-variant
dplyr::rename(weekday_created = weekday,
dateString_created = dateString,
hour_created = hour,
minute_created = minute,
hourAndMinute_created = hourAndMinute,
weekdayPickUpTime = weekday2,
dateStringPickUpTime = dateString2,
hourPickUpTime = hour2,
minutePickUpTime = minute2,
hourAndMinutePickUpTime = hourAndMinute2,
id = channelOrderID,
courierDeliveryBy = platform,
channelOrderId = orderID
)
# Join All_Orders met PostOrders
OrdersTotaal <- dplyr::bind_rows(All_Orders2, PostOrders)Items en PostItems
#setdiff(names(PostItems), names(Items))
#names(Items)
Items2 <- Items %>%
#Verwijder oude-situatie columns die irrelevant zijn
select(-created,
-pickupTime
) %>%
#Verander namen oude-situatie naar post-variant
dplyr::rename(channelOrderId = OrderID,
itemsPlu = ItemsPlu,
courierDeliveryBy = platform,
weekday_created = weekday,
dateString_created = dateString,
hour_created = hour,
minute_created = minute,
hourAndMinute_created = hourAndMinute,
weekdayPickUpTime = weekday2,
dateStringPickUpTime = dateString2,
hourPickUpTime = hour2,
minutePickUpTime = minute2,
hourAndMinutePickUpTime = hourAndMinute2
)
# Join All_Orders met PostOrders
ItemsTotaal <- dplyr::bind_rows(PostItems, Items2)SubItems en PostSubItems
# setdiff(names(PostSubItems), names(SubItems))
# names(SubItems)
SubItems2 <- SubItems %>%
#Verwijder oude-situatie columns die irrelevant zijn
select(-created,
-pickupTime
) %>%
#Verander namen oude-situatie naar post-variant
dplyr::rename(channelOrderId = OrderID,
courierDeliveryBy = platform,
weekday_created = weekday,
dateString_created = dateString,
hour_created = hour,
minute_created = minute,
hourAndMinute_created = hourAndMinute,
weekdayPickUpTime = weekday2,
dateStringPickUpTime = dateString2,
hourPickUpTime = hour2,
minutePickUpTime = minute2,
hourAndMinutePickUpTime = hourAndMinute2
)
# Join All_Orders met PostOrders
SubItemsTotaal <- dplyr::bind_rows(PostSubItems, SubItems2)Data verwerking
De analyse
Bestellingen bij Bright Kitchen
De bestellingen bij Bright Kitchen zijn begonnen op 21-04-2019. Om inzichtelijk te krijgen hoeveel bestellingen zij hebben ontvangen en hoe deze verdeeld is zijn onderstaande figuren uitgewerkt.
#Voorbereiding voor figuur
OrdersTotaal$courierDeliveryBy <- revalue(OrdersTotaal$courierDeliveryBy, c("deliveroo"="Deliveroo", "takeaway"="Takeaway", "ubereats"="UberEats"))
Leveranciers <- ggplot(OrdersTotaal, aes(courierDeliveryBy,
fill = courierDeliveryBy)) +
geom_bar(color = "black", position = "dodge") +
theme_minimal() +
scale_fill_brewer(palette="Spectral") +
ggtitle("Aantal bestellingen per bezorgservice") +
theme(legend.position="bottom") +
labs(fill = "Bezorgservice:", y="Aantal verwerkte bestellingen",
x="Bezorgservice")
LeveranciersEen belangrijke factor voor Bright Kitchen is de dag van bezorging. Op dit moment ziet de verdeling er zo uit:
Figuur1 <- OrdersTotaal %>%
mutate(weekdayPickUpTime = factor(weekdayPickUpTime, levels=c("Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday",
"Sunday")))
BestellingenPerDag <-
ggplot(Figuur1, aes(weekdayPickUpTime,
fill = weekdayPickUpTime)) +
geom_bar(color = "black", position = "dodge") +
theme_minimal() +
scale_fill_brewer(palette="Spectral") +
ggtitle("Aantal bestellingen per dag van de week") +
theme(legend.position="bottom") +
labs(fill = "Dag van de week:", y="Aantal verwerkte bestellingen",
x="Bezorgservice")
BestellingenPerDag