ACTION REQUIRED: This block includes DUMMY
DATA to prevent the “object not found” error. For your final
report, you MUST replace the dummy data creation
(set.seed to raw_sales <- dummy_raw_sales)
with your actual data loading and assignment to the
raw_sales variable.
# 1. LOAD YOUR RAW DATA HERE (e.g., replace raw_sales with your loaded data)
# Example: raw_sales <- read.csv("path/to/your/sales_data.csv")
# raw_sales$OrderDate <- as.Date(raw_sales$OrderDate)
# --- DUMMY DATA CREATION (DELETE THIS SECTION FOR FINAL RUN) ---
set.seed(42)
dates <- seq(as.Date("2011-01-01"), as.Date("2016-12-31"), by="day")
categories <- c(road_categories, mountain_categories)
dummy_raw_sales <- tibble(
OrderDate = sample(dates, 10000, replace = TRUE),
Category = sample(categories, 10000, replace = TRUE),
Revenue = runif(10000, 1000, 100000) * (as.numeric(format(OrderDate, "%m")) %in% 6:8)
)
raw_sales <- dummy_raw_sales # Assign dummy data to raw_sales
# ----------------------------------------------------------------
# --- Create required aggregated data frames ---
# A. Monthly Category Sales (Used for smoothed plots)
monthly_category_sales <- raw_sales %>%
mutate(Month = floor_date(OrderDate, "month")) %>%
group_by(Month, Category) %>%
summarise(Revenue = sum(Revenue)) %>%
ungroup()
# B. Quarterly Category Sales (Used for raw quarterly plots)
quarterly_category_sales <- raw_sales %>%
mutate(Quarter = floor_date(OrderDate, "quarter")) %>%
group_by(Quarter, Category) %>%
summarise(Revenue = sum(Revenue)) %>%
ungroup()
# C. Total Sales Data Frames
monthly_sales <- monthly_category_sales %>%
group_by(Month) %>%
summarise(Revenue = sum(Revenue))
quarterly_sales <- quarterly_category_sales %>%
group_by(Quarter) %>%
summarise(Revenue = sum(Revenue))
# D. Weekly data frames
weekly_category_sales <- raw_sales %>%
mutate(Week = floor_date(OrderDate, "week")) %>%
group_by(Week, Category) %>%
summarise(Revenue = sum(Revenue)) %>%
ungroup()
weekly_sales <- weekly_category_sales %>%
group_by(Week) %>%
summarise(Revenue = sum(Revenue))
(Corresponds to Page 1, Top Chart)
ggplot(quarterly_sales, aes(x = Quarter, y = Revenue)) +
geom_line(color = "blue", size = 1) +
geom_point(color = "blue", size = 2) +
labs(title = "Total Sales (Quarterly)", y = "Revenue (USD)") +
scale_y_continuous(labels = scales::dollar) +
theme_minimal()
(Corresponds to Page 1, Bottom Chart)
ggplot(monthly_sales, aes(x = Month, y = Revenue)) +
geom_smooth(method = "loess", span = 0.3, color = "blue", fill = "grey", alpha = 0.5) +
geom_point(color = "black", size = 1.5) +
labs(title = "Total Sales (Monthly)", y = "Revenue (USD)") +
scale_y_continuous(labels = scales::dollar) +
theme_minimal()
(Corresponds to Page 2)
ggplot(weekly_sales, aes(x = Week, y = Revenue)) +
geom_smooth(method = "loess", span = 0.15, color = "blue", fill = "grey", alpha = 0.5) +
geom_point(color = "black", size = 1.5) +
labs(title = "Total Sales (Weekly)", y = "Revenue (USD)") +
scale_y_continuous(labels = scales::dollar) +
theme_minimal()
(Corresponds to Page 3)
ggplot(quarterly_category_sales %>% filter(Category %in% road_categories),
aes(x = Quarter, y = Revenue, group = Category, color = Category)) +
geom_line(size = 1) +
geom_point(size = 2) +
facet_wrap(~ Category, scales = "free_y", ncol = 1, strip.position = "top") +
labs(title = "Road Sales Trends (Quarterly)", y = "Revenue") +
scale_y_continuous(labels = scales::unit_format(unit = "K", scale = 1e-3)) +
theme_minimal() +
theme(legend.position = "none")
(Corresponds to Page 4)
ggplot(monthly_category_sales %>% filter(Category %in% road_categories),
aes(x = Month, y = Revenue, group = Category, color = Category)) +
geom_smooth(method = "loess", span = 0.3, fill = "grey", alpha = 0.5) +
geom_point(size = 1.5) +
facet_wrap(~ Category, scales = "free_y", ncol = 1, strip.position = "top") +
labs(title = "Road Sales Trends (Monthly)", y = "Revenue") +
scale_y_continuous(labels = scales::dollar_format(prefix = "$", suffix = "K", scale = 1e-3)) +
theme_minimal() +
theme(legend.position = "none")
(Corresponds to Page 5)
ggplot(weekly_category_sales %>% filter(Category %in% road_categories),
aes(x = Week, y = Revenue, group = Category, color = Category)) +
geom_smooth(method = "loess", span = 0.15, fill = "grey", alpha = 0.5) +
geom_point(size = 1.5) +
facet_wrap(~ Category, scales = "free_y", ncol = 1, strip.position = "top") +
labs(title = "Road Sales Trends (Weekly)", y = "Revenue") +
scale_y_continuous(labels = scales::dollar_format(prefix = "$", suffix = "K", scale = 1e-3)) +
theme_minimal() +
theme(legend.position = "none")
(Corresponds to Page 6)
ggplot(quarterly_category_sales %>% filter(Category %in% mountain_categories),
aes(x = Quarter, y = Revenue, group = Category, color = Category)) +
geom_line(size = 1) +
geom_point(size = 2) +
facet_wrap(~ Category, scales = "free_y", ncol = 1, strip.position = "top") +
labs(title = "Mountain Sales Trends (Quarterly)", y = "Revenue") +
scale_y_continuous(labels = scales::unit_format(unit = "K", scale = 1e-3)) +
theme_minimal() +
theme(legend.position = "none")
(Corresponds to Page 7)
ggplot(monthly_category_sales %>% filter(Category %in% mountain_categories),
aes(x = Month, y = Revenue, group = Category, color = Category)) +
geom_smooth(method = "loess", span = 0.3, fill = "grey", alpha = 0.5) +
geom_point(size = 1.5) +
facet_wrap(~ Category, scales = "free_y", ncol = 1, strip.position = "top") +
labs(title = "Mountain Sales Trends (Monthly)", y = "Revenue") +
scale_y_continuous(labels = scales::dollar_format(prefix = "$", suffix = "K", scale = 1e-3)) +
theme_minimal() +
theme(legend.position = "none")
(Corresponds to Page 8)
ggplot(weekly_category_sales %>% filter(Category %in% mountain_categories),
aes(x = Week, y = Revenue, group = Category, color = Category)) +
geom_smooth(method = "loess", span = 0.15, fill = "grey", alpha = 0.5) +
geom_point(size = 1.5) +
facet_wrap(~ Category, scales = "free_y", ncol = 1, strip.position = "top") +
labs(title = "Mountain Sales Trends (Weekly)", y = "Revenue") +
scale_y_continuous(labels = scales::dollar_format(prefix = "$", suffix = "K", scale = 1e-3)) +
theme_minimal() +
theme(legend.position = "none")