If You Order Chipotle Online, You Are Probably Getting Less Food
Comparing weights of orders
R
Miscellaneous
Author
Gio Circo, Ph.D.
Published
April 3, 2024
How Inconsistent are Chipotle Orders?
Here’s a quick one. The question posed here is “do you get less food if you order your Chipotle order online versus in person?” There are plentyofposts going back years claiming that their orders are smaller if they order online.
I happened to be watching a video from YouTuber Zackary Smigel who decided to eat nothing but Chipotle for 30 days. One of the interesting things in his video is that he provided his data for 30 consecutive Chipotle visits here. what Zackary might not have known is that he unintentionally created a very nice blocked experiment design. What this means is we can easily identify sources of variation in order weight by controlling for other variables present.
I downloaded the data from the Google Sheet, saved a few of the columns locally as a .csv and did some minimal processing.
Code
library(tidyverse)library(knitr)library(kableExtra)# load the data locallydf <-read_csv("../../../data/chipotle.csv") %>%select(-Chips)# function to convert formatted lbs, oz to gramslbs_oz_to_grams <-function(lbs_oz) { parts <-unlist(strsplit(lbs_oz, "\\.")) pounds_in_grams <-as.numeric(parts[1]) *453.592 ounces_in_grams <-as.numeric(parts[2]) *28.3495 total_grams <- pounds_in_grams + ounces_in_gramsreturn(total_grams)}food_weight_data <- df %>%pivot_longer(cols =c("Burrito", "Bowl"),names_to ="food",values_to ="weight" ) %>%na.omit()# convert weight to gramsfood_weight_data$weight <-sapply(food_weight_data$weight, lbs_oz_to_grams)head(food_weight_data[,1:5]) %>%kable(digits =2, caption ="Chipotle Food Order Data")
Chipotle Food Order Data
Order
Meat
Store
food
weight
Person
Chicken
Store 1
Burrito
992.23
Person
Chicken
Store 1
Burrito
907.18
Online
Chicken
Store 1
Bowl
907.18
Online
Carnitas
Store 1
Burrito
850.48
Person
Carnitas
Store 1
Bowl
1048.93
Person
Chicken
Store 1
Burrito
850.48
So for every order he made, we can control for whether it was in-person or online, the type of meat used in the order, the store it originated from, and the type of food (either a burrito or a bowl).
Do you get less food online?
Let’s answer this question. To start, we can look at the general distribution of weights. Below we see that the median weight of an order is just under 800 grams, or about 1.7 pounds. The largest order he got was a whopping 2.3 pounds, and the smallest was 1.1 pounds.
If we plot out a little density plot we can see the distribution of weights is (approximately) normal, with online orders appearing to be a bit lighter than in-person ones. Without adjusting for anything else, the median weight of online orders is about 709 grams, and in-person orders are 907. However, just based on this visual we can’t be certain it isn’t due to other factors (for example, maybe he ordered more heavy items only online).
ggplot(food_weight_data) +geom_boxplot(aes(x = weight, y = Order, fill = Order), alpha = .8) +labs(x ="Weight (grams)", y ="Order Type", title ="Box Plot, Chipotle Order Weights (n=30)") +scale_fill_manual(values =c('#4477AA', '#EE6677')) +theme_bw() +theme(legend.position ='none',legend.title =element_blank(),legend.text =element_text(face ="bold"))
Code
ggplot(food_weight_data) +geom_density(aes(x = weight, fill = Order), color ='white', linewidth =1, alpha = .8) +labs(x ="Weight (grams)", y ="Probability Density", title ="Density Plot, Chipotle Order Weights (n=30)", subtitle ="Y axis is smoothed PDF") +scale_fill_manual(values =c('#4477AA', '#EE6677')) +theme_bw() +theme(legend.position =c(.1,.9),legend.title =element_blank(),legend.text =element_text(face ="bold"))
Code
ggplot(food_weight_data) +geom_histogram(aes(x = weight, fill = Order), color ='white', linewidth =1, alpha = .8, bins =10) +labs(x ="Weight (grams)", y ="Count", title ="Histogram, Chipotle Order Weights (n=30)") +scale_fill_manual(values =c('#4477AA', '#EE6677')) +theme_bw() +theme(legend.position =c(.1,.9),legend.title =element_blank(),legend.text =element_text(face ="bold"))
Results
To determine whether online orders weigh less than in-person orders, we can just apply some simple statistics. Here, I fit a linear regression with each blocking factor. In this way we “control” for variables we know affect order weight (e.g. bowls weigh more than burritos, or store 3 gives you more food than store 1). In the end all we care about is the coefficient for the effect of ordering online relative to ordering in-person.
Code
# in-person ordering yields about 160g more food, or about more 20% on averagefit1 <-lm(weight ~ Order + Meat + Store + food, data = food_weight_data)broom::tidy(fit1) %>%kable(digits =2, caption ="Linear regression on order weight") %>%kable_styling("striped") %>%row_spec(2, bold = T, hline_after = T)
Linear regression on order weight
term
estimate
std.error
statistic
p.value
(Intercept)
843.22
36.42
23.15
0.00
OrderPerson
160.62
30.22
5.31
0.00
MeatChicken
-29.47
32.48
-0.91
0.37
StoreStore 2
-62.26
36.74
-1.69
0.10
StoreStore 3
-93.44
36.74
-2.54
0.02
foodBurrito
-82.38
30.22
-2.73
0.01
So what does this mean? Well, after controlling for the other variables we see that the effect of ordering in-person relative to online is 160 grams more food (or about 5.6 ounces). Based on the orders he submitted that roughly equates to 20% more food from ordering in-person rather than online!
So, yes, in this case it does appear that ordering online resulted in smaller orders relative to in-person.
Caveats
All of this analysis assumes that the online orders were roughly equivalent to the in-person one (e.g. ordering the same ingredients online as in-person). This would not be valid if he tended to order more additional items when in the store rather then online. However, from watching the video and looking at the listed cost of all items ($11.00) it appears that the orders are comparable.
I would also caution against extrapolation. The data here comes for 30 orders from a single city in the US. It is a limited set of data with a limited number of observations. So, as always with science, some degree of skepticism is always warranted.
Full Model
Code
summary(lm(weight ~ Order + Meat + Store + food, data = food_weight_data))
Call:
lm(formula = weight ~ Order + Meat + Store + food, data = food_weight_data)
Residuals:
Min 1Q Median 3Q Max
-147.79 -43.47 -8.17 52.23 129.06
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 843.22 36.42 23.154 < 2e-16 ***
OrderPerson 160.62 30.22 5.314 1.88e-05 ***
MeatChicken -29.47 32.48 -0.907 0.3733
StoreStore 2 -62.26 36.74 -1.694 0.1031
StoreStore 3 -93.44 36.74 -2.543 0.0178 *
foodBurrito -82.38 30.22 -2.726 0.0118 *
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 81.84 on 24 degrees of freedom
Multiple R-squared: 0.6358, Adjusted R-squared: 0.56
F-statistic: 8.381 on 5 and 24 DF, p-value: 0.0001068