Case Study 6: The Bullwhip Effect

Empirical measurement in US economic data and simulation of countermeasures

Author

Supply Chain Management – Group Work

NoteOverview
Topic Demand amplification in multi-stage supply chains
Link to the lecture Chapter 8 of the course reader: causes of the bullwhip effect, order-up-to ordering policy, variance ratio, bound according to Chen et al. (2000), Beer Game, countermeasures
Type Data-based case study: real sales and inventory data from the U.S. Census Bureau (via FRED) and a simulation
Group size 3–6 people
Deliverable Presentation (30 min) + discussion (15 min), slide deck (PDF) and reproducible R/Quarto code

1 Learning objectives

After working through this case study, you will be able to

  • operationalise the bullwhip effect as a variance ratio and measure it in real economic data,
  • recognise and discuss measurement problems (seasonal adjustment, aggregation, trends),
  • simulate a multi-stage supply chain with an order-up-to policy and a moving-average forecast,
  • compare the theoretical bound according to Chen et al. (2000) with simulation results, and
  • quantitatively evaluate the effect of countermeasures (information sharing, shorter lead times, better forecasts, avoidance of order batching).

2 Initial situation

Since Forrester (1961) and Lee et al. (1997), it has been known that the variability of orders increases upstream in a supply chain. The consequences are high safety stocks, poorly utilised capacities and supply shortages. The years 2020–2023 at the latest have shown how strong the impact can be: the slump in demand at the start of the pandemic was followed by panic buying, later by a shortage of semiconductors and finally by full warehouses.

A consulting firm receives two assignments from an industry association:

  1. To examine empirically whether and how strongly the bullwhip effect is measurable in the US economy between retail, wholesale and manufacturing.
  2. To show in a simulation model which countermeasures most effectively dampen the effect in a typical four-stage supply chain (retail – wholesale – manufacturer – supplier).

3 Data

3.1 Part A: Manufacturing and Trade Inventories and Sales (MTIS)

The U.S. Census Bureau publishes monthly sales and inventories for the retail, wholesale and manufacturing stages. The series are freely available via FRED (Federal Reserve Bank of St. Louis), e.g. as CSV at https://fred.stlouisfed.org/graph/fredgraph.csv?id=<ID>.

Stage Sales (million USD, seasonally adjusted) Inventory (million USD, seasonally adjusted, end of month)
Retail RETAILSMSA RETAILIMSA
Wholesale (merchant wholesalers) WHLSLRSMSA WHLSLRIMSA
Manufacturing (manufacturers) MNFCTRSMSA MNFCTRIMSA

For industry analyses, the Census Bureau (https://www.census.gov/mtis/ as well as the individual statistics Monthly Retail Trade, Monthly Wholesale Trade and M3 Manufacturers’ Shipments, Inventories & Orders) provides the data by NAICS industry, in some cases also not seasonally adjusted. An example of a food chain: Food and Beverage Stores (NAICS 445) → Grocery Wholesalers (NAICS 4244) → Food Manufacturing (NAICS 311).

Since orders are not directly observed in these data, the empirical literature (e.g. Cachon et al. 2007) uses the production or procurement of a stage as a proxy:

\[ P_t = S_t + I_t - I_{t-1}, \]

where \(S_t\) denotes sales (valued at cost) and \(I_t\) the inventory at the end of the month. The bullwhip effect of a stage is then measured as \(B = \operatorname{Var}(P)/\operatorname{Var}(S)\).

3.2 Part B: End-customer demand for the simulation

As end-customer demand, use a real time series of your choice, for example

  • the weekly demand of a product category from the Olist dataset (Case Study 4),
  • the daily sales of an item from the French bakery (Case Study 5), or
  • a monthly retail sales series from FRED (e.g. RSXFS).

Justify your choice and describe the statistical properties of the series (level, variability, seasonality, autocorrelation).

4 Tasks

4.1 Part A – Empirical measurement

A1. Load the six MTIS series from 1992 onwards, calculate \(P_t\) for each stage and visualise \(S_t\) and \(P_t\) together.

A2. Calculate the variance ratio \(B\) for each stage on the levels and on the first differences, in each case for at least two sub-periods (e.g. 1992–2019 and 2020–today). Is \(B > 1\)? How do stages and periods differ?

A3. Name two significant measurement problems of this approach (e.g. seasonal adjustment, aggregation across industries) and compare your results with Cachon et al. (2007).

4.2 Part B – Simulation of a four-stage supply chain

B1. Use the starter code, in which each stage \(k\) in each period observes its customer’s demand, estimates the mean and standard deviation with a moving average over \(p\) periods, determines the order-up-to level \(S_t = \hat\mu_t (L+1) + z\,\hat\sigma_t\sqrt{L+1}\) and orders \(O_t = \max\{0,\ D_t + S_t - S_{t-1}\}\). Simulate the base case (\(L=2\), \(p=4\), \(z=1.65\)) with your real end-customer demand and compare \(B_k\) for each stage with the bound according to Chen et al. (2000):

\[ \frac{\operatorname{Var}(O)}{\operatorname{Var}(D)} \;\ge\; 1 + \frac{2L}{p} + \frac{2L^2}{p^2}. \]

B2. Investigate at least three of the following countermeasures and present the results comparatively:

Scenario Change
Longer forecast window \(p = 8, 12, 26\)
Shorter lead time \(L = 1\) (and \(L = 4\) for comparison)
Information sharing All stages forecast on the basis of end-customer demand
Order batching Orders only every \(m = 4\) periods
Vendor managed inventory Stages 1 and 2 are planned jointly

Which measure has the strongest effect, and which cause according to Lee et al. (1997) does it address?

4.3 Part C – Beer Game (in class)

C1. During the Beer Game, document your group’s orders, inventories and backlogs for each round and calculate the variance ratios for each stage.

4.4 Part D – Recommendation and reflection

D1. Recommendation. Which three measures should companies implement first, and which prerequisites (IT, trust, contracts) are necessary for this?

D2. Reflection. Answer the following questions in your presentation. They form the starting point for the subsequent discussion:

  1. Why is the bullwhip effect considerably weaker in the aggregated economic data than in the simulation and the Beer Game? What does this say about the significance of each method?
  2. What did the Beer Game reveal about your own decision-making behaviour? Did you neglect pipeline inventories (Sterman 1989), and why?
  3. Which countermeasure has a strong effect in the simulation but is difficult to implement in practice, and why does it fail (incentives, trust, data)?
  4. How do international supply chains with long sea freight, many interfaces and different cultures of collaboration amplify the effect?
  5. How can the shortages and excess inventories of 2020–2023 (pandemic, chip crisis) be explained with your results?

5 Literature

  • Cachon, G. P.; Randall, T.; Schmidt, G. M. (2007): In Search of the Bullwhip Effect. Manufacturing & Service Operations Management 9(4), 457–479.
  • Chen, F.; Drezner, Z.; Ryan, J. K.; Simchi-Levi, D. (2000): Quantifying the Bullwhip Effect in a Simple Supply Chain. Management Science 46(3), 436–443.
  • Forrester, J. W. (1961): Industrial Dynamics. Cambridge, MA: MIT Press.
  • Lee, H. L.; Padmanabhan, V.; Whang, S. (1997): The Bullwhip Effect in Supply Chains. Sloan Management Review 38(3), 93–102.
  • Sterman, J. D. (1989): Modeling Managerial Behavior: Misperceptions of Feedback in a Dynamic Decision Making Experiment. Management Science 35(3), 321–339.
  • Course reader for the lecture, Chapter 8.

6 Appendix: R starter code

Code
library(tidyverse)

lade_fred <- function(id) {
  read_csv(paste0("https://fred.stlouisfed.org/graph/fredgraph.csv?id=", id),
           show_col_types = FALSE) |>
    rename(datum = 1, wert = 2)
}

stufen <- tribble(
  ~stufe,          ~umsatz,      ~bestand,
  "Retail",        "RETAILSMSA", "RETAILIMSA",
  "Wholesale",     "WHLSLRSMSA", "WHLSLRIMSA",
  "Manufacturing", "MNFCTRSMSA", "MNFCTRIMSA"
)

mtis <- stufen |>
  mutate(daten = map2(umsatz, bestand, \(u, b)
    inner_join(lade_fred(u) |> rename(S = wert),
               lade_fred(b) |> rename(I = wert), by = "datum"))) |>
  select(stufe, daten) |> unnest(daten) |>
  group_by(stufe) |>
  mutate(P = S + I - lag(I)) |>
  ungroup()

mtis |> group_by(stufe) |>
  summarise(B_niveau = var(P, na.rm = TRUE) / var(S),
            B_diff   = var(diff(P[-1])) / var(diff(S[-1])))
Code
# Simple simulation of orders in a multi-stage supply chain
# (without inventories and deliveries)
simuliere_bullwhip <- function(D, stufen = 4, L = 2, p = 4, z = 1.65,
                               info_sharing = FALSE) {
  n <- length(D)
  O <- matrix(NA_real_, nrow = n, ncol = stufen + 1)
  O[, 1] <- D                                    # column 1 = end-customer demand
  for (k in 1:stufen) {
    d_k   <- O[, k]                              # demand seen by stage k
    d_fc  <- if (info_sharing) D else d_k        # data basis for the forecast
    S_alt <- NA
    for (t in seq_len(n)) {
      if (t < p) { O[t, k + 1] <- d_k[t]; next } # warm-up phase
      fenster <- d_fc[(t - p + 1):t]
      S <- mean(fenster) * (L + 1) + z * sd(fenster) * sqrt(L + 1)
      O[t, k + 1] <- if (is.na(S_alt)) d_k[t] else max(0, d_k[t] + S - S_alt)
      S_alt <- S
    }
  }
  colnames(O) <- c("End_customer", paste0("Stage_", 1:stufen))
  as.data.frame(O)
}

# Demonstration with artificial demand – replace D with your real series
set.seed(42)
D <- round(rnorm(156, mean = 100, sd = 15))
sim <- simuliere_bullwhip(D, L = 2, p = 8)
round(sapply(sim[-(1:20), ], var) / var(D[-(1:20)]), 2)
End_customer      Stage_1      Stage_2      Stage_3      Stage_4 
        1.00         2.10         6.41        20.62        71.63