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.
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)
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)"
)
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
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)
recommended_window
## # A tibble: 3 × 4
## # Groups: year [3]
## year date launch_start launch_end
## <dbl> <date> <date> <date>
## 1 2023 2023-12-10 2023-11-12 2023-11-26
## 2 2024 2024-12-08 2024-11-10 2024-11-24
## 3 2025 2025-12-07 2025-11-09 2025-11-23
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")
| Average | Median | Min | Max |
|---|---|---|---|
| 12.1 | 2 | 1 | 100 |
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)")
| 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")
| 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.
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.
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