Skip to contents

An often stated criticism of Lego is how expensive Lego has become over the years (see here, here, and here). However, there are two ways to consider Lego costs: 1. price per set or 2. price per piece. As shown in Figure 1 the number of Lego sets released each year has increased substantially since 2000. The data for this analysis comes from the Brickset website. For many sets there is no price information available, especially before the year 2000. For more recent years there are several factors leading to missing retail price information including special and promotional sets that may not have has a cost. Regardless, this analysis only uses sets released since 2000 that have a US retail price available. Table 1 provides the relevant summary statistics.

Number of Lego sets by year.

Figure 1: Number of Lego sets by year.

lego_summary <- legosets |>
    dplyr::filter(
        year >= 2000 &
        pieces > 0
        ) |>
    dplyr::mutate(
        price_per_piece = US_retailPrice / pieces,
        valid_set = !is.na(US_retailPrice) & !is.na(pieces)
    ) |>
    # There are some electronic products we want to exclude
    dplyr::filter(is.na(price_per_piece) | price_per_piece < 1) |> 
    dplyr::group_by(year) |>
    dplyr::summarise(
        n = dplyr::n(),
        n_valid = sum(valid_set),
        mean_pieces = mean(pieces, na.rm = TRUE),
        sd_pieces = sd(pieces, na.rm = TRUE),
        mean_price = mean(US_retailPrice, na.rm = TRUE),
        sd_price = sd(US_retailPrice, na.rm = TRUE),
        mean_price_per_piece = mean(price_per_piece, na.rm = TRUE),
        sd_price_per_piece = sd(price_per_piece, na.rm = TRUE)
    )
lego_summary |> 
    as.data.frame() |> 
    mutate(
        mean_pieces = paste0(round(mean_pieces, digits = 2), ' (', round(sd_pieces, digits = 2), ')'),
        mean_price = paste0(round(mean_price, digits = 2), ' (', round(sd_price, digits = 2), ')'),
        mean_price_per_piece = paste0(round(mean_price_per_piece, digits = 2), ' (', round(sd_price_per_piece, digits = 2), ')')
    ) |>
    dplyr::select(!dplyr::starts_with('sd_')) |>
    dplyr::rename(Year = year, 
                  `Number of sets` = n,
                  `Sets with price` = n_valid, 
                  `Pieces per set` = mean_pieces,
                  `Set price` = mean_price,
                  `Price per piece` = mean_price_per_piece) |>
    knitr::kable(caption = 'Summary of Lego cost by year.', digits = 2)
Table 1: Summary of Lego cost by year.
Year Number of sets Sets with price Pieces per set Set price Price per piece
2000 331 11 112.79 (272.29) 6.99 (1.9) 0.24 (0.26)
2001 352 6 113.77 (241.37) 7.99 (6) 0.09 (0.02)
2002 382 7 136.24 (257.65) 44.85 (99.32) 0.15 (0.09)
2003 353 3 189.3 (332.03) 7.49 (4.33) 0.11 (0.06)
2004 365 4 165.95 (264.32) 9.99 (8.68) 0.36 (0.43)
2005 346 35 220.03 (375.4) 39.42 (51.43) 0.31 (0.27)
2006 277 76 291.65 (356.56) 44.38 (42.05) 0.2 (0.21)
2007 242 154 362.93 (536.54) 38.13 (49.2) 0.15 (0.18)
2008 288 192 318.53 (522.54) 36.88 (43.59) 0.18 (0.18)
2009 313 204 277.5 (386.12) 38.98 (42.56) 0.19 (0.19)
2010 356 234 273.78 (480.52) 34.36 (49.35) 0.21 (0.18)
2011 416 283 223.77 (372.41) 29.63 (40.35) 0.24 (0.19)
2012 511 270 199.16 (329.44) 33.77 (35.61) 0.2 (0.17)
2013 502 293 241.43 (398.12) 42.75 (75.83) 0.2 (0.18)
2014 548 329 241.77 (382.49) 36.21 (40.54) 0.17 (0.17)
2015 617 366 249.87 (542.89) 37.96 (42.32) 0.17 (0.16)
2016 655 378 247.35 (508.79) 39.53 (53.65) 0.18 (0.18)
2017 633 368 284.58 (593.79) 45.31 (65.66) 0.16 (0.16)
2018 642 373 269.55 (526.1) 40.71 (54.36) 0.16 (0.17)
2019 614 337 308.37 (529.28) 49 (64.58) 0.16 (0.16)
2020 641 373 329.18 (676.54) 52.55 (72.23) 0.17 (0.17)
2021 667 396 405.63 (884.49) 58.16 (84.1) 0.16 (0.16)
2022 606 374 467.46 (840.08) 67.26 (84.15) 0.15 (0.14)
2023 679 392 444.74 (747.61) 67.78 (81.91) 0.14 (0.13)
2024 679 420 485.09 (723.54) 69.08 (71.48) 0.13 (0.13)

Figures 2 and 3 summarize the mean price per piece and mean price per set, respectively. As can be seen the average price per pieces has been relatively stable averaging around $0.18 per piece. However, the average price per set has risen to nearly $70 per set in 2024 from $40 in 2016. This can largely be explained by the fact that Lego sets have been getting larger over the last decade (see Figure 4).

ggplot(lego_summary, aes(x = year, y = mean_price_per_piece)) +
    geom_path() +
    geom_point(aes(size = n_valid)) +
    scale_size('n Sets') +
    scale_y_continuous(labels = scales::dollar_format(prefix="$")) +
    expand_limits(y = 0) +
    ylab('Average price per piece') + xlab('Year') +
    ggtitle('Average price (USD) per piece by year')
Average price (USD) per piece by year.

Figure 2: Average price (USD) per piece by year.

ggplot(lego_summary, aes(x = year, y = mean_price)) +
    geom_path() +
    geom_point(aes(size = n_valid)) +
    scale_size('n Sets') +
    scale_y_continuous(labels = scales::dollar_format(prefix="$")) +
    expand_limits(y = 0) +
    ylab('Average set price') + xlab('Year') + 
    ggtitle('Average set price (USD) by year')
Average set price (USD) by year.

Figure 3: Average set price (USD) by year.

ggplot(lego_summary, aes(x = year, y = mean_pieces)) +
    geom_path() +
    geom_point(aes(size = n_valid)) +
    scale_size('n Sets') +
    scale_y_continuous(labels = scales::dollar_format(prefix="$")) +
    expand_limits(y = 0) +
    ylab('Average pieces per set') + xlab('Year') + 
    ggtitle('Average number of pieces per set by year')
Average set price (USD) by year.

Figure 4: Average set price (USD) by year.