library(ggplot2)
library(dplyr)
library(completejourney)
Which Age Group Buys the Most Cookies
The 45-54 Age Group spends the most on cookies
transactions <- get_transactions()
transactions_with_demo <- transactions %>%
inner_join(demographics, by = "household_id")
demo_products <- transactions_with_demo %>%
inner_join(products, by = "product_id")
cookie_purchases <- filter(demo_products, product_category == "COOKIES/CONES")
cookies_by_age <- cookie_purchases %>%
group_by(age) %>%
summarise(total_spend = sum(sales_value, na.rm = TRUE))
ggplot(data = cookies_by_age, aes(x = age, y = total_spend)) +
geom_bar(stat = "identity", fill = "lightblue") +
labs(title = "Cookies Purchases by Age Group",
x = "Age Group",
y = "Spending on Cookies")

Average Spending on Top Categories by Marital Status
Married Couples spend marginally more and spend it on Miscellaneous
items or Beef most commonly
joined_data <- transactions %>%
inner_join(products, by = "product_id") %>%
inner_join(demographics, by = "household_id")
category_spending_by_marital_status <- joined_data %>%
filter(!is.na(marital_status)) %>%
group_by(marital_status, product_category)%>%
summarise(total_spend = sum(sales_value, na.rm = TRUE), num_trips = n()) %>%
mutate(avg_spend_per_trip = total_spend / num_trips)
`summarise()` has grouped output by 'marital_status'. You can override using the `.groups` argument.
top_5_categories_by_spend <- category_spending_by_marital_status %>%
group_by(marital_status) %>%
slice_max(total_spend, n = 5)
ggplot(top_5_categories_by_spend, aes(x = product_category, y = marital_status, fill = avg_spend_per_trip)) +
geom_tile(color = "white") +
scale_fill_gradient(low = "lightyellow", high = "red", name = "Avg Spend per Trip") +
labs(title = "Average Spend per Trip on Top 5 Categories by Marital Status",
subtitle = "Heatmap of average spend per trip for top product categories",
x = "Product Category",
y = "Marital Status") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))

Coffee Spending by Income Level
The mean spending on coffee increases with increases in Income but it
there are quite a few lower income outliers
coffee_data <- joined_data %>%
filter(product_category == "COFFEE")
ggplot(coffee_data, aes(x = income, y = sales_value, fill = income)) +
geom_boxplot(outlier.color = "red", outlier.shape = 16, outlier.size = 2) +
labs(title = "Distribution of Spending on Coffee by Income Level",
subtitle = "Box plot showing coffee spending across income levels",
x = "Income Level",
y = "Spending on Coffee (USD)") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))

LS0tDQp0aXRsZTogIldlZWsgNSBMYWIgLSBLeWxlIFJleCINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCg0KYGBge3J9IA0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoY29tcGxldGVqb3VybmV5KQ0KYGBgDQojIFdoaWNoIEFnZSBHcm91cCBCdXlzIHRoZSBNb3N0IENvb2tpZXMNClRoZSA0NS01NCBBZ2UgR3JvdXAgc3BlbmRzIHRoZSBtb3N0IG9uIGNvb2tpZXMNCmBgYHtyfQ0KdHJhbnNhY3Rpb25zIDwtIGdldF90cmFuc2FjdGlvbnMoKQ0KdHJhbnNhY3Rpb25zX3dpdGhfZGVtbyA8LSB0cmFuc2FjdGlvbnMgJT4lDQogIGlubmVyX2pvaW4oZGVtb2dyYXBoaWNzLCBieSA9ICJob3VzZWhvbGRfaWQiKQ0KZGVtb19wcm9kdWN0cyA8LSB0cmFuc2FjdGlvbnNfd2l0aF9kZW1vICU+JQ0KICBpbm5lcl9qb2luKHByb2R1Y3RzLCBieSA9ICJwcm9kdWN0X2lkIikNCmNvb2tpZV9wdXJjaGFzZXMgPC0gZmlsdGVyKGRlbW9fcHJvZHVjdHMsIHByb2R1Y3RfY2F0ZWdvcnkgPT0gIkNPT0tJRVMvQ09ORVMiKQ0KY29va2llc19ieV9hZ2UgPC0gY29va2llX3B1cmNoYXNlcyAlPiUNCiAgZ3JvdXBfYnkoYWdlKSAlPiUNCiAgc3VtbWFyaXNlKHRvdGFsX3NwZW5kID0gc3VtKHNhbGVzX3ZhbHVlLCBuYS5ybSA9IFRSVUUpKQ0KZ2dwbG90KGRhdGEgPSBjb29raWVzX2J5X2FnZSwgYWVzKHggPSBhZ2UsIHkgPSB0b3RhbF9zcGVuZCkpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIGZpbGwgPSAibGlnaHRibHVlIikgKw0KICBsYWJzKHRpdGxlID0gIkNvb2tpZXMgUHVyY2hhc2VzIGJ5IEFnZSBHcm91cCIsIA0KICAgICAgIHggPSAiQWdlIEdyb3VwIiwgDQogICAgICAgeSA9ICJTcGVuZGluZyBvbiBDb29raWVzIikNCmBgYA0KIyBBdmVyYWdlIFNwZW5kaW5nIG9uIFRvcCBDYXRlZ29yaWVzIGJ5IE1hcml0YWwgU3RhdHVzDQpNYXJyaWVkIENvdXBsZXMgc3BlbmQgbWFyZ2luYWxseSBtb3JlIGFuZCBzcGVuZCBpdCBvbiBNaXNjZWxsYW5lb3VzIGl0ZW1zIG9yIEJlZWYgbW9zdCBjb21tb25seQ0KYGBge3J9DQpqb2luZWRfZGF0YSA8LSB0cmFuc2FjdGlvbnMgJT4lDQogIGlubmVyX2pvaW4ocHJvZHVjdHMsIGJ5ID0gInByb2R1Y3RfaWQiKSAlPiUNCiAgaW5uZXJfam9pbihkZW1vZ3JhcGhpY3MsIGJ5ID0gImhvdXNlaG9sZF9pZCIpDQpjYXRlZ29yeV9zcGVuZGluZ19ieV9tYXJpdGFsX3N0YXR1cyA8LSBqb2luZWRfZGF0YSAlPiUNCiAgZmlsdGVyKCFpcy5uYShtYXJpdGFsX3N0YXR1cykpICU+JQ0KICBncm91cF9ieShtYXJpdGFsX3N0YXR1cywgcHJvZHVjdF9jYXRlZ29yeSklPiUNCiAgc3VtbWFyaXNlKHRvdGFsX3NwZW5kID0gc3VtKHNhbGVzX3ZhbHVlLCBuYS5ybSA9IFRSVUUpLCBudW1fdHJpcHMgPSBuKCkpICU+JQ0KICBtdXRhdGUoYXZnX3NwZW5kX3Blcl90cmlwID0gdG90YWxfc3BlbmQgLyBudW1fdHJpcHMpDQp0b3BfNV9jYXRlZ29yaWVzX2J5X3NwZW5kIDwtIGNhdGVnb3J5X3NwZW5kaW5nX2J5X21hcml0YWxfc3RhdHVzICU+JQ0KICBncm91cF9ieShtYXJpdGFsX3N0YXR1cykgJT4lDQogIHNsaWNlX21heCh0b3RhbF9zcGVuZCwgbiA9IDUpDQpnZ3Bsb3QodG9wXzVfY2F0ZWdvcmllc19ieV9zcGVuZCwgYWVzKHggPSBwcm9kdWN0X2NhdGVnb3J5LCB5ID0gbWFyaXRhbF9zdGF0dXMsIGZpbGwgPSBhdmdfc3BlbmRfcGVyX3RyaXApKSArDQogIGdlb21fdGlsZShjb2xvciA9ICJ3aGl0ZSIpICsNCiAgc2NhbGVfZmlsbF9ncmFkaWVudChsb3cgPSAibGlnaHR5ZWxsb3ciLCBoaWdoID0gInJlZCIsIG5hbWUgPSAiQXZnIFNwZW5kIHBlciBUcmlwIikgKw0KICBsYWJzKHRpdGxlID0gIkF2ZXJhZ2UgU3BlbmQgcGVyIFRyaXAgb24gVG9wIDUgQ2F0ZWdvcmllcyBieSBNYXJpdGFsIFN0YXR1cyIsDQogICAgICAgc3VidGl0bGUgPSAiSGVhdG1hcCBvZiBhdmVyYWdlIHNwZW5kIHBlciB0cmlwIGZvciB0b3AgcHJvZHVjdCBjYXRlZ29yaWVzIiwNCiAgICAgICB4ID0gIlByb2R1Y3QgQ2F0ZWdvcnkiLA0KICAgICAgIHkgPSAiTWFyaXRhbCBTdGF0dXMiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpDQpgYGANCiMgQ29mZmVlIFNwZW5kaW5nIGJ5IEluY29tZSBMZXZlbA0KVGhlIG1lYW4gc3BlbmRpbmcgb24gY29mZmVlIGluY3JlYXNlcyB3aXRoIGluY3JlYXNlcyBpbiBJbmNvbWUgYnV0IGl0IHRoZXJlIGFyZSBxdWl0ZSBhIGZldyBsb3dlciBpbmNvbWUgb3V0bGllcnMNCmBgYHtyfQ0KY29mZmVlX2RhdGEgPC0gam9pbmVkX2RhdGEgJT4lDQogIGZpbHRlcihwcm9kdWN0X2NhdGVnb3J5ID09ICJDT0ZGRUUiKQ0KZ2dwbG90KGNvZmZlZV9kYXRhLCBhZXMoeCA9IGluY29tZSwgeSA9IHNhbGVzX3ZhbHVlLCBmaWxsID0gaW5jb21lKSkgKw0KICBnZW9tX2JveHBsb3Qob3V0bGllci5jb2xvciA9ICJyZWQiLCBvdXRsaWVyLnNoYXBlID0gMTYsIG91dGxpZXIuc2l6ZSA9IDIpICsNCiAgbGFicyh0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgU3BlbmRpbmcgb24gQ29mZmVlIGJ5IEluY29tZSBMZXZlbCIsDQogICAgICAgc3VidGl0bGUgPSAiQm94IHBsb3Qgc2hvd2luZyBjb2ZmZWUgc3BlbmRpbmcgYWNyb3NzIGluY29tZSBsZXZlbHMiLA0KICAgICAgIHggPSAiSW5jb21lIExldmVsIiwNCiAgICAgICB5ID0gIlNwZW5kaW5nIG9uIENvZmZlZSAoVVNEKSIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkNCmBgYA0K