Required Packages

install.packages(c("gtrendsR", "tidyverse", "ggplot2", "scales",
                   "lubridate", "knitr", "kableExtra"))
library(gtrendsR)
library(tidyverse)
library(ggplot2)
library(scales)
library(lubridate)
library(knitr)
library(kableExtra)

Introduction

This report uses Google Trends data to compare U.S. web search interest for three competing athleisure brands: Lululemon, Gymshark, and Fabletics. All three are direct-to-consumer (DTC) brands competing in the activewear and athleisure space, making them a meaningful set for comparative analysis. Five years of monthly search data are used to identify trends, seasonal patterns, and peak interest periods.

Pulling 5 Years of U.S. Search Data

trends_raw <- gtrends(
  keyword = c("Lululemon", "Gymshark", "Fabletics"),
  geo     = "US",
  time    = "today+5-y"
)

# Extract interest over time
iot <- trends_raw$interest_over_time %>%
  mutate(
    hits = as.numeric(ifelse(hits == "<1", "0", hits)),
    date = as.Date(date)
  )

glimpse(iot)
## Rows: 783
## Columns: 7
## $ date     <date> 2021-07-04, 2021-07-11, 2021-07-18, 2021-07-25, 2021-08-01, …
## $ hits     <dbl> 20, 20, 23, 22, 21, 20, 21, 21, 19, 21, 21, 23, 21, 22, 24, 2…
## $ keyword  <chr> "Lululemon", "Lululemon", "Lululemon", "Lululemon", "Lululemo…
## $ geo      <chr> "US", "US", "US", "US", "US", "US", "US", "US", "US", "US", "…
## $ time     <chr> "today+5-y", "today+5-y", "today+5-y", "today+5-y", "today+5-…
## $ gprop    <chr> "web", "web", "web", "web", "web", "web", "web", "web", "web"…
## $ category <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…

Comparative Trend Lines

ggplot(iot, aes(x = date, y = hits, color = keyword)) +
  geom_line(linewidth = 1) +
  labs(
    title    = "Google Search Interest Over Time",
    subtitle = "United States, Past Five Years",
    x        = "Date",
    y        = "Search Interest",
    color    = "Brand"
  ) +
  theme_minimal()

Summary Statistics by Brand

iot %>%
  group_by(keyword) %>%
  summarise(
    Mean_Interest = round(mean(hits, na.rm = TRUE), 1),
    Max_Interest  = max(hits, na.rm = TRUE),
    Min_Interest  = min(hits, na.rm = TRUE),
    .groups = "drop"
  ) %>%
  arrange(desc(Mean_Interest)) %>%
  rename(Brand = keyword) %>%
  kable(caption = "Search Interest Summary by Brand (Past 5 Years)") %>%
  kable_styling(bootstrap_options = c("striped", "hover"),
                full_width = FALSE)
Search Interest Summary by Brand (Past 5 Years)
Brand Mean_Interest Max_Interest Min_Interest
Lululemon 40.1 100 19
Fabletics 4.5 9 2
Gymshark 3.7 12 2

Peak Interest Analysis

iot %>%
  group_by(keyword) %>%
  slice_max(hits, n = 1, with_ties = FALSE) %>%
  select(Brand = keyword, Peak_Date = date, Peak_Interest = hits) %>%
  arrange(desc(Peak_Interest)) %>%
  kable(caption = "Highest Search Interest Peak by Brand") %>%
  kable_styling(bootstrap_options = c("striped", "hover"),
                full_width = FALSE)
Highest Search Interest Peak by Brand
Brand Peak_Date Peak_Interest
Lululemon 2025-11-23 100
Gymshark 2025-11-16 12
Fabletics 2023-11-19 9

Which Brand Had the Highest Peak, and Why?

peaks <- iot %>%
  group_by(keyword) %>%
  slice_max(hits, n = 1, with_ties = FALSE)

ggplot(peaks, aes(x = reorder(keyword, hits), y = hits, fill = keyword)) +
  geom_col(show.legend = FALSE) +
  geom_text(aes(label = paste0(hits, "\n(", format(date, "%b %Y"), ")")),
            hjust = -0.1, size = 3.5) +
  coord_flip() +
  scale_y_continuous(limits = c(0, 120)) +
  labs(
    title   = "Peak Search Interest by Brand",
    subtitle = "Highest recorded search interest score over 5 years",
    x       = NULL,
    y       = "Peak Search Interest Score",
    caption = "Source: Google Trends via gtrendsR"
  ) +
  theme_minimal()

Interpretation

Lululemon consistently dominates the U.S. search interest across the five-year period, with scores ranging from 20 to a peak of 100, which is the maximum on Google Trends’ relative scale. Its recurring spikes appear annually around November and December, aligning with holiday shopping seasons and major sale events such as the brand’s “We Made Too Much” promotions.

Gymshark and Fabletics both maintain significantly lower search interest throughout the same period, hovering between 2 and 10. While their trend lines are difficult to distinguish at this scale, both brands show relatively flat and stable patterns with minimal seasonal variation, suggesting they rely more on direct traffic, social media, and paid advertising than organic search.

The gap between Lululemon and its competitors reflects key differences in brand maturity and retail presence. Lululemon’s physical store network drives Google searches from consumers looking up store locations, hours, and products, while Gymshark and Fabletics operate primarily online, where customers navigate directly to their sites rather than searching first.

References

Google Trends. (2024). Google Trends Tutorials [YouTube series]. Google Search Central. https://developers.google.com/search/blog/2024/09/google-trends-tutorials

Massicotte, P., & Eddelbuettel, D. (2023). gtrendsR: Perform and Display Google Trends Queries [R package]. https://cran.r-project.org/package=gtrendsR

Chan, M. (2019). Vignette: Google Trends with the gtrendsR package. https://martinctc.github.io/blog/vignette-google-trends-with-gtrendsr/