library(tidyverse)
theme_set(ggthemes::theme_few())
Read QSR report data.
d <- read_csv("data/tidy_data/qsr_report_2017_tidy.csv")
All of the numbers and insights you need to know about the best drive-thru operations in the U.S. (link)
Data for the 2017 QSR Drive-Thru Study was collected and tabulated by SeeLevel HX. The study included 15 chains and data from 2,011 visits, with the following break-down of visits by chain.
visits_string <- "Arby’s (169), Burger King (171), Carl’s Jr. (88), Chick-fil-A (183), Dunkin’ Donuts (169), Hardee’s (84), KFC (167), McDonald’s (179), Panera Bread (76), Raising Cane’s (75), Starbucks (168), Taco Bell (167), Tim Horton’s (76), Wendy’s (165), Zaxby’s (75)"
visits_table <- visits_string %>%
str_remove_all(pattern = "[\\()]") %>%
str_split(pattern = ",") %>%
unlist() %>%
as_data_frame() %>%
mutate(value = value %>% str_trim) %>%
separate(value, into = c("Chain", "Visits"), sep = "(?<=[a-z.CA]) ?(?=[0-9])")
visits_table %>% knitr::kable()
| Chain | Visits |
|---|---|
| Arby’s | 169 |
| Burger King | 171 |
| Carl’s Jr. | 88 |
| Chick-fil-A | 183 |
| Dunkin’ Donuts | 169 |
| Hardee’s | 84 |
| KFC | 167 |
| McDonald’s | 179 |
| Panera Bread | 76 |
| Raising Cane’s | 75 |
| Starbucks | 168 |
| Taco Bell | 167 |
| Tim Horton’s | 76 |
| Wendy’s | 165 |
| Zaxby’s | 75 |
Visits were conducted across the country, across 156 markets. No restaurant location was visited more than once. All data was collected between June 1 and July 30, 2017.
Daypart analysis was based on the time of day of the visit—breakfast (5–9 a.m.), mid morning (9–11:30 a.m.), lunch (11:30 a.m. to 1:30 p.m.), late afternoon (1:30–4 p.m.), and dinner (4–7 p.m.). The distribution of visits mirrored revenue by daypart.
Upon each visit, a trained data collection specialist surveyed the drive-thru lane and then entered the line as any other customer. Each order placed by our researchers consisted of one main item, one side item, and one beverage. A minor special request was also made with each order, such as beverage with no ice. Although two different speed-of-service times were recorded for each visit (one for the researchers’ order/experience and another from a randomly selected vehicle), all tables within this feature are related to the researchers’ own vehicle and experience only, as this was the controlled order. Service time was defined as the time from stopping at the order station to receipt of all items (including change). Additional data collected by each researcher included but was not limited to: order accuracy, drive-thru and exterior appearance, speaker clarity, and customer service. All purchases were made using cash so as not to influence timing.
What variables are in the data set?
names(d) %>% knitr::kable(col.names = c("Variable Name"))
| Variable Name |
|---|
| Chain |
| Percent Accurate |
| Average Time (in seconds) |
| Eye Contact |
| Said “Please” |
| Pleasant demeanor |
| Smile |
| Said “Thank You” |
| None of the above (service) |
| 0-2_vehicles |
| 3-5_vehicles |
| 6 or more_vehicles |
| Suggestive sell offered |
| With the greeting |
| After order placed |
| Combo meal (suggestive_sell) |
| Special/promo (suggestive_sell) |
| Dessert (suggestive_sell) |
| Upsize combo (suggestive_sell) |
| New item (suggestive_sell) |
| Baked good (suggestive_sell) |
| Additional side (suggestive_sell) |
| Larger drink (suggestive_sell) |
| Other (suggestive_sell) |
| OCB in Place |
| 1 Station |
| 2 Station |
| 3 Station |
| Building walls dirty/damaged |
| Charged wrong amount |
| Inaccurate order |
| Offensive odors |
| Rude employees |
| Unprofessional presentation or employee appearance |
| Unsightly pickup window |
| Receipt incorrect |
| Other (Issues) |
| None of the above (Issues) |
| Visits |
d %>%
select(Chain:`Average Time (in seconds)`) %>%
arrange(desc(`Percent Accurate`)) %>%
knitr::kable()
| Chain | Percent Accurate | Average Time (in seconds) |
|---|---|---|
| Raising Canes | 97.3 | 168.23 |
| McDonalds | 93.9 | 239.03 |
| ChickfilA | 93.4 | 251.04 |
| Carls Jr | 90.9 | 270.22 |
| Zaxbys | 90.7 | 212.85 |
| Arbys | 90.5 | 244.37 |
| Taco Bell | 90.4 | 212.71 |
| Wendys | 89.7 | 180.05 |
| Burger King | 89.5 | 189.48 |
| Hardees | 88.1 | 287.87 |
| Dunkin Donuts | 87.0 | 173.85 |
| Tim Hortons | 86.8 | 202.66 |
| Starbucks | 86.2 | 266.41 |
| KFC | 83.2 | 230.98 |
| Panera Bread | 82.9 | 262.68 |
d %>%
select(Chain:`None of the above (service)`, `Rude employees`,
`Unprofessional presentation or employee appearance`) %>%
arrange(`Percent Accurate`) %>%
knitr::kable()
| Chain | Percent Accurate | Average Time (in seconds) | Eye Contact | Said “Please” | Pleasant demeanor | Smile | Said “Thank You” | None of the above (service) | Rude employees | Unprofessional presentation or employee appearance |
|---|---|---|---|---|---|---|---|---|---|---|
| Panera Bread | 82.9 | 262.68 | 86.8 | 53.9 | 90.8 | 82.9 | 93.4 | 0.0 | 1.3 | 0.0 |
| KFC | 83.2 | 230.98 | 79.6 | 35.9 | 71.3 | 64.7 | 85.0 | 4.2 | 2.4 | 0.0 |
| Starbucks | 86.2 | 266.41 | 88.0 | 43.1 | 86.8 | 77.8 | 88.0 | 1.8 | 0.6 | 0.0 |
| Tim Hortons | 86.8 | 202.66 | 92.1 | 56.6 | 82.9 | 77.6 | 92.1 | 0.0 | 0.0 | 2.6 |
| Dunkin Donuts | 87.0 | 173.85 | 76.9 | 34.3 | 79.9 | 68.0 | 85.2 | 3.0 | 1.8 | 0.0 |
| Hardees | 88.1 | 287.87 | 81.0 | 34.5 | 75.0 | 64.3 | 84.5 | 3.6 | 0.0 | 0.0 |
| Burger King | 89.5 | 189.48 | 76.6 | 35.7 | 72.5 | 66.1 | 87.7 | 1.2 | 2.3 | 2.9 |
| Wendys | 89.7 | 180.05 | 84.2 | 33.3 | 78.8 | 64.8 | 80.6 | 2.4 | 1.8 | 0.0 |
| Taco Bell | 90.4 | 212.71 | 84.4 | 36.5 | 76.6 | 72.5 | 87.4 | 4.8 | 1.2 | 0.6 |
| Arbys | 90.5 | 244.37 | 85.2 | 43.2 | 80.5 | 73.4 | 89.3 | 3.6 | 2.4 | 1.2 |
| Zaxbys | 90.7 | 212.85 | 84.0 | 32.0 | 74.7 | 64.0 | 84.0 | 4.0 | 1.3 | 0.0 |
| Carls Jr | 90.9 | 270.22 | 87.5 | 40.9 | 83.0 | 67.0 | 86.4 | 1.1 | 1.1 | 1.1 |
| ChickfilA | 93.4 | 251.04 | 85.8 | 52.5 | 91.8 | 84.7 | 93.4 | 1.1 | 0.0 | 0.0 |
| McDonalds | 93.9 | 239.03 | 82.1 | 34.6 | 79.3 | 67.0 | 83.2 | 1.7 | 0.6 | 0.0 |
| Raising Canes | 97.3 | 168.23 | 89.3 | 45.3 | 81.3 | 78.7 | 89.3 | 1.3 | 2.7 | 0.0 |
d %>%
select(Chain, `Percent Accurate`, `Suggestive sell offered`:`After order placed`) %>%
arrange(`Percent Accurate`) %>%
knitr::kable()
| Chain | Percent Accurate | Suggestive sell offered | With the greeting | After order placed |
|---|---|---|---|---|
| Panera Bread | 82.9 | 25.0 | 10.5 | 89.5 |
| KFC | 83.2 | 41.9 | 40.0 | 60.0 |
| Starbucks | 86.2 | 13.8 | 43.5 | 56.5 |
| Tim Hortons | 86.8 | 30.3 | 4.3 | 95.7 |
| Dunkin Donuts | 87.0 | 12.4 | 28.6 | 71.4 |
| Hardees | 88.1 | 38.1 | 65.6 | 34.4 |
| Burger King | 89.5 | 28.7 | 14.3 | 85.7 |
| Wendys | 89.7 | 24.8 | 26.8 | 73.2 |
| Taco Bell | 90.4 | 14.4 | 16.7 | 83.3 |
| Arbys | 90.5 | 45.0 | 56.6 | 43.4 |
| Zaxbys | 90.7 | 34.7 | 50.0 | 50.0 |
| Carls Jr | 90.9 | 65.9 | 65.5 | 34.5 |
| ChickfilA | 93.4 | 21.3 | 23.1 | 76.9 |
| McDonalds | 93.9 | 21.2 | 36.8 | 63.2 |
| Raising Canes | 97.3 | 16.0 | 50.0 | 50.0 |