knitr::opts_chunk$set(echo = TRUE)
library(completejourney)
library(tidyverse)
library(scales)
library(dplyr)
transactions <- transactions_sample
transactions
#First Chart
top_products <- transactions %>%
inner_join(products, by = "product_id") %>%
inner_join(demographics, by = "household_id") %>%
group_by(income, product_id, product_category) %>%
summarise(total_sales = sum(sales_value, na.rm = TRUE), .groups = "drop") %>%
arrange(income, desc(total_sales)) %>%
group_by(income) %>%
slice_head(n = 5)
ggplot(top_products, aes(x = total_sales, y = product_category, fill = income)) +
geom_col() +
facet_wrap(~income, scales = "free_y", ncol = 2) +
labs(
title = "Top 5 Purchased Products by Five Lowest Income Level",
subtitle = "Comparing product preferences across income categories",
x = "Total Sales ($)",
y = "Product Category",
fill = "Income Level"
) +
theme_minimal()

#Second Chart
cookies_cones <- transactions %>%
inner_join(products, by = 'product_id') %>%
filter(product_category == "COOKIES/CONES") %>%
inner_join(demographics, by = "household_id") %>%
group_by(income) %>%
summarise(total_cookies_cones_purchased = sum(quantity, na.rm = TRUE), .groups = "drop") %>%
arrange(income)
ggplot(data = cookies_cones, aes(x = income, y = total_cookies_cones_purchased, fill = income)) +
geom_col() +
labs(
title = "Cookies/Cones Purchases by Income Level",
subtitle = "Total quantity of cookies/cones purchased across different income levels",
x = "Income Level",
y = "Total Quantity of Cookies/Cones Purchased"
) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))

#Third Chart
discount_effectiveness <- transactions %>%
inner_join(products, by = "product_id") %>%
mutate(discounted = ifelse(coupon_disc > 0 | retail_disc > 0, "Discounted", "Full Price")) %>%
group_by(department, discounted) %>%
summarize(count = n(), .groups = "drop") %>%
mutate(pct = count / sum(count) * 100) %>%
filter(discounted == "Discounted") %>%
arrange(desc(pct)) %>%
slice_max(pct, n = 12)
ggplot(discount_effectiveness, aes(x = reorder(department, pct), y = pct, fill = pct)) +
geom_col() +
coord_flip() +
labs(
title = "Discount usage by each department",
x = "Department",
y = "Percentage of Transactions Using a Discount (%)",
caption = "The study has been limited to the first 12 categories with the highest %discount usage",
fill = "Discount Usage (%)"
) +
theme_minimal() +
theme(
plot.title = element_text(size = 12, face = "bold", margin = margin(b = 20)),
strip.text = element_text(size = 9, face = "bold"),
plot.caption = element_text(size = 7, hjust = 0, margin = margin(t = 30)),
axis.title.x = element_text(margin = margin(t = 15)),
axis.title.y = element_text(margin = margin(r = 10))
)

LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KYGBge3J9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpsaWJyYXJ5KGNvbXBsZXRlam91cm5leSkNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShzY2FsZXMpDQpsaWJyYXJ5KGRwbHlyKQ0KYGBgDQoNCmBgYHtyIHRyYW5zYWN0aW9uc30NCnRyYW5zYWN0aW9ucyA8LSB0cmFuc2FjdGlvbnNfc2FtcGxlDQp0cmFuc2FjdGlvbnMNCmBgYA0KDQoNCiNGaXJzdCBDaGFydA0KYGBge3IgZmlnLndpZHRoPTE1fQ0KdG9wX3Byb2R1Y3RzIDwtIHRyYW5zYWN0aW9ucyAlPiUNCiAgaW5uZXJfam9pbihwcm9kdWN0cywgYnkgPSAicHJvZHVjdF9pZCIpICU+JQ0KICBpbm5lcl9qb2luKGRlbW9ncmFwaGljcywgYnkgPSAiaG91c2Vob2xkX2lkIikgJT4lDQogIGdyb3VwX2J5KGluY29tZSwgcHJvZHVjdF9pZCwgcHJvZHVjdF9jYXRlZ29yeSkgJT4lDQogIHN1bW1hcmlzZSh0b3RhbF9zYWxlcyA9IHN1bShzYWxlc192YWx1ZSwgbmEucm0gPSBUUlVFKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lDQogIGFycmFuZ2UoaW5jb21lLCBkZXNjKHRvdGFsX3NhbGVzKSkgJT4lDQogIGdyb3VwX2J5KGluY29tZSkgJT4lDQogIHNsaWNlX2hlYWQobiA9IDUpDQoNCg0KZ2dwbG90KHRvcF9wcm9kdWN0cywgYWVzKHggPSB0b3RhbF9zYWxlcywgeSA9IHByb2R1Y3RfY2F0ZWdvcnksIGZpbGwgPSBpbmNvbWUpKSArDQogIGdlb21fY29sKCkgKw0KICBmYWNldF93cmFwKH5pbmNvbWUsIHNjYWxlcyA9ICJmcmVlX3kiLCBuY29sID0gMikgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIlRvcCA1IFB1cmNoYXNlZCBQcm9kdWN0cyBieSBGaXZlIExvd2VzdCBJbmNvbWUgTGV2ZWwiLA0KICAgIHN1YnRpdGxlID0gIkNvbXBhcmluZyBwcm9kdWN0IHByZWZlcmVuY2VzIGFjcm9zcyBpbmNvbWUgY2F0ZWdvcmllcyIsDQogICAgeCA9ICJUb3RhbCBTYWxlcyAoJCkiLA0KICAgIHkgPSAiUHJvZHVjdCBDYXRlZ29yeSIsDQogICAgZmlsbCA9ICJJbmNvbWUgTGV2ZWwiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQojU2Vjb25kIENoYXJ0DQpgYGB7cn0NCmNvb2tpZXNfY29uZXMgPC0gdHJhbnNhY3Rpb25zICU+JQ0KICBpbm5lcl9qb2luKHByb2R1Y3RzLCBieSA9ICdwcm9kdWN0X2lkJykgJT4lDQogIGZpbHRlcihwcm9kdWN0X2NhdGVnb3J5ID09ICJDT09LSUVTL0NPTkVTIikgJT4lICANCiAgaW5uZXJfam9pbihkZW1vZ3JhcGhpY3MsIGJ5ID0gImhvdXNlaG9sZF9pZCIpICU+JQ0KICBncm91cF9ieShpbmNvbWUpICU+JQ0KICBzdW1tYXJpc2UodG90YWxfY29va2llc19jb25lc19wdXJjaGFzZWQgPSBzdW0ocXVhbnRpdHksIG5hLnJtID0gVFJVRSksIC5ncm91cHMgPSAiZHJvcCIpICU+JQ0KICBhcnJhbmdlKGluY29tZSkNCg0KZ2dwbG90KGRhdGEgPSBjb29raWVzX2NvbmVzLCBhZXMoeCA9IGluY29tZSwgeSA9IHRvdGFsX2Nvb2tpZXNfY29uZXNfcHVyY2hhc2VkLCBmaWxsID0gaW5jb21lKSkgKyANCiAgZ2VvbV9jb2woKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiQ29va2llcy9Db25lcyBQdXJjaGFzZXMgYnkgSW5jb21lIExldmVsIiwNCiAgICBzdWJ0aXRsZSA9ICJUb3RhbCBxdWFudGl0eSBvZiBjb29raWVzL2NvbmVzIHB1cmNoYXNlZCBhY3Jvc3MgZGlmZmVyZW50IGluY29tZSBsZXZlbHMiLA0KICAgIHggPSAiSW5jb21lIExldmVsIiwNCiAgICB5ID0gIlRvdGFsIFF1YW50aXR5IG9mIENvb2tpZXMvQ29uZXMgUHVyY2hhc2VkIg0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkgDQpgYGANCg0KI1RoaXJkIENoYXJ0DQpgYGB7cn0NCmRpc2NvdW50X2VmZmVjdGl2ZW5lc3MgPC0gdHJhbnNhY3Rpb25zICU+JQ0KICBpbm5lcl9qb2luKHByb2R1Y3RzLCBieSA9ICJwcm9kdWN0X2lkIikgJT4lDQogIG11dGF0ZShkaXNjb3VudGVkID0gaWZlbHNlKGNvdXBvbl9kaXNjID4gMCB8IHJldGFpbF9kaXNjID4gMCwgIkRpc2NvdW50ZWQiLCAiRnVsbCBQcmljZSIpKSAlPiUNCiAgZ3JvdXBfYnkoZGVwYXJ0bWVudCwgZGlzY291bnRlZCkgJT4lDQogIHN1bW1hcml6ZShjb3VudCA9IG4oKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lDQogIG11dGF0ZShwY3QgPSBjb3VudCAvIHN1bShjb3VudCkgKiAxMDApICU+JQ0KICBmaWx0ZXIoZGlzY291bnRlZCA9PSAiRGlzY291bnRlZCIpICU+JQ0KICBhcnJhbmdlKGRlc2MocGN0KSkgJT4lDQogIHNsaWNlX21heChwY3QsIG4gPSAxMikgDQoNCmdncGxvdChkaXNjb3VudF9lZmZlY3RpdmVuZXNzLCBhZXMoeCA9IHJlb3JkZXIoZGVwYXJ0bWVudCwgcGN0KSwgeSA9IHBjdCwgZmlsbCA9IHBjdCkpICsNCiAgZ2VvbV9jb2woKSArDQogIGNvb3JkX2ZsaXAoKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiRGlzY291bnQgdXNhZ2UgYnkgZWFjaCBkZXBhcnRtZW50IiwNCiAgICB4ID0gIkRlcGFydG1lbnQiLA0KICAgIHkgPSAiUGVyY2VudGFnZSBvZiBUcmFuc2FjdGlvbnMgVXNpbmcgYSBEaXNjb3VudCAoJSkiLA0KICAgIGNhcHRpb24gPSAiVGhlIHN0dWR5IGhhcyBiZWVuIGxpbWl0ZWQgdG8gdGhlIGZpcnN0IDEyIGNhdGVnb3JpZXMgd2l0aCB0aGUgaGlnaGVzdCAlZGlzY291bnQgdXNhZ2UiLA0KICAgIGZpbGwgPSAiRGlzY291bnQgVXNhZ2UgKCUpIg0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpICsgDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBmYWNlID0gImJvbGQiLCBtYXJnaW4gPSBtYXJnaW4oYiA9IDIwKSksDQogICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gOSwgZmFjZSA9ICJib2xkIiksDQogICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KHNpemUgPSA3LCBoanVzdCA9IDAsIG1hcmdpbiA9IG1hcmdpbih0ID0gMzApKSwNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQobWFyZ2luID0gbWFyZ2luKHQgPSAxNSkpLCAgDQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KG1hcmdpbiA9IG1hcmdpbihyID0gMTApKSAgDQogICkNCmBgYA==