The hardware and bandwidth for this mirror is donated by METANET, the Webhosting and Full Service-Cloud Provider.
If you wish to report a bug, or if you are interested in having us mirror your free-software or open-source project, please feel free to contact us at mirror[@]metanet.ch.
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.
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)
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')
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')
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')
Figure 4: Average set price (USD) by year.
These binaries (installable software) and packages are in development.
They may not be fully stable and should be used with caution. We make no claims about them.