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 plenty of posts 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 locally
df <- read_csv("../../../data/chipotle.csv") %>%
  select(-Chips)

# function to convert formatted lbs, oz to grams
lbs_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_grams
  return(total_grams)
}

food_weight_data <-
  df %>%
  pivot_longer(
    cols = c("Burrito", "Bowl"),
    names_to = "food",
    values_to = "weight"
  ) %>%
  na.omit()

# convert weight to grams
food_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.

Code
quantile(food_weight_data$weight)
       0%       25%       50%       75%      100% 
 510.2910  715.8249  793.7860  907.1840 1048.9315 

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).

Code
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"))

Visually, in-person orders appear to be larger
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"))

Visually, in-person orders appear to be larger
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"))

Visually, in-person orders appear to be larger

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 average
fit1 <- 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