library(completejourney)
library(tidyverse) 

top_products_income <- transactions %>%
  inner_join(products, by = "product_id") %>%
  inner_join(demographics, by = "household_id") %>%
  group_by(income, product_id) %>%
  summarise(total_sales = sum(sales_value), .groups = 'drop') %>%
  arrange(desc(total_sales)) %>%
  slice_max(order_by = total_sales, n = 5, by = "income")

ggplot(top_products_income, aes(x = reorder(product_id, total_sales), y = total_sales, fill = income)) + geom_bar(stat = “identity”, position = position_dodge()) + labs(title = “Top 5 Products Purchased by Different Income Levels”, subtitle = “Comparison of product preferences across income brackets”, x = “Product Description”, y = “Total Sales Value”, fill = “Income Bracket”) + theme_minimal() + theme(axis.text.x = element_text(angle = 45, hjust = 1))

transactions$discount <- transactions$retail_disc + transactions$coupon_disc + transactions$coupon_match_disc

discount_analysis <- transactions %>%
  inner_join(products, by = "product_id") %>%
  group_by(product_category) %>%
  summarise(avg_discount = mean(discount, na.rm = TRUE), .groups = 'drop') %>%
  arrange(desc(avg_discount)) %>%
  slice_max(order_by = avg_discount, n = 5)  

ggplot(discount_analysis, aes(x = reorder(product_category, avg_discount), y = avg_discount, fill = product_category)) + geom_bar(stat = “identity”) + coord_flip() +
labs(title = “Top 5 Most Discounted Product Categories”, subtitle = “Average discount applied across product categories”, x = “Product Category”, y = “Average Discount ($)”) + theme_minimal() + theme(legend.position = “none”)

store_spending <- transactions %>%
  group_by(store_id) %>%
  summarise(total_spending = sum(sales_value, na.rm = TRUE), .groups = 'drop') %>%
  top_n(n = 25, wt = total_spending)  

ggplot(store_spending, aes(x = reorder(store_id, -total_spending), y = total_spending, fill = total_spending)) + geom_col() + coord_flip() +
scale_fill_gradient(low = “lightblue”, high = “darkblue”) +
labs(title = “Customer Spending by Top 25 Store Locations”, subtitle = “Total sales value at the top 25 store locations”, x = “Store ID”, y = “Total Spending ($)”) + theme_minimal() + theme(axis.text.y = element_text(size = 8))

LS0tCnRpdGxlOiAiTGFiIDUiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCgoKYGBge3J9CmxpYnJhcnkoY29tcGxldGVqb3VybmV5KQpsaWJyYXJ5KHRpZHl2ZXJzZSkgCgp0b3BfcHJvZHVjdHNfaW5jb21lIDwtIHRyYW5zYWN0aW9ucyAlPiUKICBpbm5lcl9qb2luKHByb2R1Y3RzLCBieSA9ICJwcm9kdWN0X2lkIikgJT4lCiAgaW5uZXJfam9pbihkZW1vZ3JhcGhpY3MsIGJ5ID0gImhvdXNlaG9sZF9pZCIpICU+JQogIGdyb3VwX2J5KGluY29tZSwgcHJvZHVjdF9pZCkgJT4lCiAgc3VtbWFyaXNlKHRvdGFsX3NhbGVzID0gc3VtKHNhbGVzX3ZhbHVlKSwgLmdyb3VwcyA9ICdkcm9wJykgJT4lCiAgYXJyYW5nZShkZXNjKHRvdGFsX3NhbGVzKSkgJT4lCiAgc2xpY2VfbWF4KG9yZGVyX2J5ID0gdG90YWxfc2FsZXMsIG4gPSA1LCBieSA9ICJpbmNvbWUiKQpgYGAgCgoKCmdncGxvdCh0b3BfcHJvZHVjdHNfaW5jb21lLCBhZXMoeCA9IHJlb3JkZXIocHJvZHVjdF9pZCwgdG90YWxfc2FsZXMpLCB5ID0gdG90YWxfc2FsZXMsIGZpbGwgPSBpbmNvbWUpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoKSkgKwogIGxhYnModGl0bGUgPSAiVG9wIDUgUHJvZHVjdHMgUHVyY2hhc2VkIGJ5IERpZmZlcmVudCBJbmNvbWUgTGV2ZWxzIiwKICAgICAgIHN1YnRpdGxlID0gIkNvbXBhcmlzb24gb2YgcHJvZHVjdCBwcmVmZXJlbmNlcyBhY3Jvc3MgaW5jb21lIGJyYWNrZXRzIiwKICAgICAgIHggPSAiUHJvZHVjdCBEZXNjcmlwdGlvbiIsCiAgICAgICB5ID0gIlRvdGFsIFNhbGVzIFZhbHVlIiwKICAgICAgIGZpbGwgPSAiSW5jb21lIEJyYWNrZXQiKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQoKCmBgYHtyfQp0cmFuc2FjdGlvbnMkZGlzY291bnQgPC0gdHJhbnNhY3Rpb25zJHJldGFpbF9kaXNjICsgdHJhbnNhY3Rpb25zJGNvdXBvbl9kaXNjICsgdHJhbnNhY3Rpb25zJGNvdXBvbl9tYXRjaF9kaXNjCgpkaXNjb3VudF9hbmFseXNpcyA8LSB0cmFuc2FjdGlvbnMgJT4lCiAgaW5uZXJfam9pbihwcm9kdWN0cywgYnkgPSAicHJvZHVjdF9pZCIpICU+JQogIGdyb3VwX2J5KHByb2R1Y3RfY2F0ZWdvcnkpICU+JQogIHN1bW1hcmlzZShhdmdfZGlzY291bnQgPSBtZWFuKGRpc2NvdW50LCBuYS5ybSA9IFRSVUUpLCAuZ3JvdXBzID0gJ2Ryb3AnKSAlPiUKICBhcnJhbmdlKGRlc2MoYXZnX2Rpc2NvdW50KSkgJT4lCiAgc2xpY2VfbWF4KG9yZGVyX2J5ID0gYXZnX2Rpc2NvdW50LCBuID0gNSkgIApgYGAKCgpnZ3Bsb3QoZGlzY291bnRfYW5hbHlzaXMsIGFlcyh4ID0gcmVvcmRlcihwcm9kdWN0X2NhdGVnb3J5LCBhdmdfZGlzY291bnQpLCB5ID0gYXZnX2Rpc2NvdW50LCBmaWxsID0gcHJvZHVjdF9jYXRlZ29yeSkpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKwogIGNvb3JkX2ZsaXAoKSArICAKICBsYWJzKHRpdGxlID0gIlRvcCA1IE1vc3QgRGlzY291bnRlZCBQcm9kdWN0IENhdGVnb3JpZXMiLAogICAgICAgc3VidGl0bGUgPSAiQXZlcmFnZSBkaXNjb3VudCBhcHBsaWVkIGFjcm9zcyBwcm9kdWN0IGNhdGVnb3JpZXMiLAogICAgICAgeCA9ICJQcm9kdWN0IENhdGVnb3J5IiwKICAgICAgIHkgPSAiQXZlcmFnZSBEaXNjb3VudCAoJCkiKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCgoKCmBgYHtyfQpzdG9yZV9zcGVuZGluZyA8LSB0cmFuc2FjdGlvbnMgJT4lCiAgZ3JvdXBfYnkoc3RvcmVfaWQpICU+JQogIHN1bW1hcmlzZSh0b3RhbF9zcGVuZGluZyA9IHN1bShzYWxlc192YWx1ZSwgbmEucm0gPSBUUlVFKSwgLmdyb3VwcyA9ICdkcm9wJykgJT4lCiAgdG9wX24obiA9IDI1LCB3dCA9IHRvdGFsX3NwZW5kaW5nKSAgCmBgYAoKZ2dwbG90KHN0b3JlX3NwZW5kaW5nLCBhZXMoeCA9IHJlb3JkZXIoc3RvcmVfaWQsIC10b3RhbF9zcGVuZGluZyksIHkgPSB0b3RhbF9zcGVuZGluZywgZmlsbCA9IHRvdGFsX3NwZW5kaW5nKSkgKwogIGdlb21fY29sKCkgKwogIGNvb3JkX2ZsaXAoKSArICAKICBzY2FsZV9maWxsX2dyYWRpZW50KGxvdyA9ICJsaWdodGJsdWUiLCBoaWdoID0gImRhcmtibHVlIikgKyAgCiAgbGFicyh0aXRsZSA9ICJDdXN0b21lciBTcGVuZGluZyBieSBUb3AgMjUgU3RvcmUgTG9jYXRpb25zIiwKICAgICAgIHN1YnRpdGxlID0gIlRvdGFsIHNhbGVzIHZhbHVlIGF0IHRoZSB0b3AgMjUgc3RvcmUgbG9jYXRpb25zIiwKICAgICAgIHggPSAiU3RvcmUgSUQiLAogICAgICAgeSA9ICJUb3RhbCBTcGVuZGluZyAoJCkiKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gOCkpIAoKCg==