Introduction

For this assignment, i looked at the U.S Google search interest in “Christmas Gifts” at the past three years to see if there are any seasonal pattern in consumer interest. Using the gtrendsR package, I pulled weekly search interest data, visualized the seasonal trend, calculated average interest by month, and used the timing of each year’s peak to recommend when a campaign should launch.

Setup

library(gtrendsR)
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(lubridate)
## 
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
## 
##     date, intersect, setdiff, union
library(ggplot2)
library(writexl)
library(knitr)

Data Collection

if (file.exists("christmas_data.rds")) {
  christmas_data <- readRDS("christmas_data.rds")
} else {
  Sys.sleep(5)
  christmas_trend <- gtrends(keyword = "Christmas gifts", geo = "US", time = "2023-06-20 2026-06-20")
  christmas_data <- christmas_trend$interest_over_time
  saveRDS(christmas_data, "christmas_data.rds")
}

head(christmas_data)
##         date hits         keyword geo                  time gprop category
## 1 2023-06-18    1 Christmas gifts  US 2023-06-19 2026-06-19   web        0
## 2 2023-06-25    1 Christmas gifts  US 2023-06-19 2026-06-19   web        0
## 3 2023-07-02    1 Christmas gifts  US 2023-06-19 2026-06-19   web        0
## 4 2023-07-09    1 Christmas gifts  US 2023-06-19 2026-06-19   web        0
## 5 2023-07-16    1 Christmas gifts  US 2023-06-19 2026-06-19   web        0
## 6 2023-07-23    2 Christmas gifts  US 2023-06-19 2026-06-19   web        0
##   month
## 1   Jun
## 2   Jun
## 3   Jul
## 4   Jul
## 5   Jul
## 6   Jul
ggplot(christmas_data, aes(x = date, y = hits)) +
  geom_line(color = "darkred", linewidth = 0.8) +
  labs(
    title = "U.S. Google Search Interest: 'Christmas gifts' (2023-2026)",
    x = "Date",
    y = "Search Interest (0-100)"
  )

Average Interest by Month

christmas_data <- christmas_data %>%
  mutate(month = month(date, label = TRUE, abbr = TRUE))

monthly_avg <- christmas_data %>%
  group_by(month) %>%
  summarise(avg_interest = round(mean(hits, na.rm = TRUE), 1)) %>%
  arrange(month)

monthly_avg
## # A tibble: 12 × 2
##    month avg_interest
##    <ord>        <dbl>
##  1 Jan            1.9
##  2 Feb            2.2
##  3 Mar            1.3
##  4 Apr            1.9
##  5 May            2.2
##  6 Jun            1.4
##  7 Jul            1.7
##  8 Aug            2.2
##  9 Sep            4.2
## 10 Oct           11.2
## 11 Nov           47.8
## 12 Dec           63.4

Summary Statistics

summary_stats <- christmas_data %>%
  summarise(
    Average = round(mean(hits, na.rm = TRUE), 1),
    Median  = median(hits, na.rm = TRUE),
    Min     = min(hits, na.rm = TRUE),
    Max     = max(hits, na.rm = TRUE)
  )

kable(summary_stats, caption = "Three-Year Summary Statistics: 'Christmas Gifts' Search Interest")
Three-Year Summary Statistics: ‘Christmas Gifts’ Search Interest
Average Median Min Max
12.1 2 1 100

Monthly Averages Chunk

christmas_data <- christmas_data %>%
  mutate(month = month(date, label = TRUE, abbr = TRUE))

monthly_avg <- christmas_data %>%
  group_by(month) %>%
  summarise(avg_interest = round(mean(hits, na.rm = TRUE), 1)) %>%
  arrange(month)

kable(monthly_avg, caption = "Average 'Christmas Gifts' Search Interest by Month (2023-2026)")
Average ‘Christmas Gifts’ Search Interest by Month (2023-2026)
month avg_interest
Jan 1.9
Feb 2.2
Mar 1.3
Apr 1.9
May 2.2
Jun 1.4
Jul 1.7
Aug 2.2
Sep 4.2
Oct 11.2
Nov 47.8
Dec 63.4
peak_weeks <- christmas_data %>%
  mutate(year = year(date)) %>%
  group_by(year) %>%
  slice_max(hits, n = 1) %>%
  select(year, date, hits)

peak_weeks_clean <- peak_weeks %>%
  filter(year != 2026) %>%
  mutate(date = as.Date(date))

recommended_window <- peak_weeks_clean %>%
  mutate(
    launch_start = date - weeks(4),
    launch_end   = date - weeks(2)
  ) %>%
  select(year, date, launch_start, launch_end)

kable(recommended_window, caption = "Recommended Campaign Launch Window by Year")
Recommended Campaign Launch Window by Year
year date launch_start launch_end
2023 2023-12-10 2023-11-12 2023-11-26
2024 2024-12-08 2024-11-10 2024-11-24
2025 2025-12-07 2025-11-09 2025-11-23
ggplot(christmas_data, aes(x = date, y = hits)) +
  annotate("rect", 
           xmin = as.Date(c("2023-11-12","2024-11-10","2025-11-09")), 
           xmax = as.Date(c("2023-11-26","2024-11-24","2025-11-23")), 
           ymin = -Inf, ymax = Inf, 
           fill = "gold", alpha = 0.3) +
  geom_line(color = "darkred", linewidth = 0.8) +
  labs(
    title = "U.S. Google Search Interest: 'Christmas Gifts' (2023-2026)",
    subtitle = "Gold bands show the recommended 2-4 week campaign launch window each year",
    x = "Date",
    y = "Search Interest (0-100)",
    caption = "Source: Google Trends, retrieved via gtrendsR"
  ) +
  theme_minimal(base_size = 12)

Based on the three years of the data, the peak in “Christmas gifts’ search interest consistently in the first or second week of December. This is working backward weeks from that peak, the window to launch a Christmas gift falls between the dates of November 9 and November 26 depending on the year. This window gives the campaign enough time to build visibility before consumer search sharply accelerates going into the holiday.

According to the National Retail Federation over 61% of U.S consumers had begun their holiday shopping as early as November up from just 51% a decade ago (NRF, 2025). The window also covers the run-up to Thanksgiving weekend, which has become the single largest shopping event of the year, drawing a record 202.9 million shoppers across Black Friday and Cyber Monday in 2025 (NRF, 2025). Launching a campaign in mid-to-late November positions a brand to capture early shoppers before search interest sharply accelerates, while still being timed close enough to peak relevance to stay top of mind through December.

Conclusion

This analysis shows that “Christmas gifts” search interest is highly seasonal and predictable because the three years of data show the same pattern. From minimal interests in January through August, a slow but steady climb in September and October, and a big peak obviously in early December. I would say and recommend to launch a campaign in the window of mid to late November which gives markets a 2-4 week lead time ahead of peak search activity.

References

Google. (2024). Google Trends Help: How data is adjusted. https://support.google.com/trends/answer/4365533

Massicotte, P., & Eddelbuettel, D. (2023). gtrendsR: Perform and display Google Trends queries. R package version 1.5.1. https://CRAN.R-project.org/package=gtrendsR

National Retail Federation. (2025). Thanksgiving holiday weekend draws a record 203 million shoppers. https://nrf.com/media-center/press-releases/thanksgiving-holiday-weekend-draws-a-record-203-million-shoppers