This report performs market basket analysis on the Online Retail dataset using:
This analysis uses the Online Retail dataset from Kaggle (the same dataset shared here: https://www.kaggle.com/datasets/lakshmi25npathi/online-retail-dataset). It is a real transactional dataset collected from a UK-based and registered non-store online retail business. The data covers approximately two years of sales and includes detailed invoice records for customer purchases made online. :contentReferenceoaicite:0
The dataset contains the following key fields:
# install.packages(c(
# "readxl", "arules", "arulesViz", "dplyr", "stringr", "tidyr",
# "cluster", "arulesCBA", "caret"
# ))
library(readxl)
library(arules)
library(arulesViz)
library(dplyr)
library(stringr)
library(tidyr)
library(cluster)
library(arulesCBA)
library(caret)
DATA_FILE <- "online_retail.xlsx"
# Apriori parameters
APR_PARAMS <- list(
supp = 0.01,
conf = 0.30,
minlen = 2,
maxlen = 3
)
# "Strong rules" filter used for interpretation
STRONG_FILTER <- list(
lift = 5,
conf = 0.50
)
# Targeted RHS mining
RHS_TARGET <- list(
item = "11 PC CERAMIC TEA SET POLKADOT",
supp = 0.005,
conf = 0.30
)
# Cross-table exploration
CROSSTABLE_TOPN <- 30
# Similarity sampling & item similarity
SIM_SAMPLE_N <- 400
ITEM_SIM_TOPN <- 60
# Category aggregation
CAT_PARAMS <- list(
top_products = 300,
supp = 0.05,
conf = 0.30
)
# CBA parameters
CBA_PARAMS <- list(
top_features = 80,
split = 0.80,
supp = 0.02,
conf = 0.50
)
df_raw <- read_excel(DATA_FILE)
# Quick look
dplyr::glimpse(df_raw)
## Rows: 525,461
## Columns: 8
## $ Invoice <chr> "489434", "489434", "489434", "489434", "489434", "48943…
## $ StockCode <chr> "85048", "79323P", "79323W", "22041", "21232", "22064", …
## $ Description <chr> "15CM CHRISTMAS GLASS BALL 20 LIGHTS", "PINK CHERRY LIGH…
## $ Quantity <dbl> 12, 12, 12, 48, 24, 24, 24, 10, 12, 12, 24, 12, 10, 18, …
## $ InvoiceDate <dttm> 2009-12-01 07:45:00, 2009-12-01 07:45:00, 2009-12-01 07…
## $ Price <dbl> 6.95, 6.75, 6.75, 2.10, 1.25, 1.65, 1.25, 5.95, 2.55, 3.…
## $ `Customer ID` <dbl> 13085, 13085, 13085, 13085, 13085, 13085, 13085, 13085, …
## $ Country <chr> "United Kingdom", "United Kingdom", "United Kingdom", "U…
Cleaning steps:
Invoice and
DescriptionInvoice to characterDescription (uppercase + squish
whitespace)"C")df_clean <- df_raw %>%
filter(!is.na(Invoice), !is.na(Description)) %>%
mutate(
Invoice = as.character(Invoice),
Description = str_squish(str_to_upper(as.character(Description))),
Quantity = as.numeric(Quantity)
) %>%
filter(!str_detect(Invoice, "^C"), Quantity > 0)
glimpse(df_clean)
## Rows: 512,033
## Columns: 8
## $ Invoice <chr> "489434", "489434", "489434", "489434", "489434", "48943…
## $ StockCode <chr> "85048", "79323P", "79323W", "22041", "21232", "22064", …
## $ Description <chr> "15CM CHRISTMAS GLASS BALL 20 LIGHTS", "PINK CHERRY LIGH…
## $ Quantity <dbl> 12, 12, 12, 48, 24, 24, 24, 10, 12, 12, 24, 12, 10, 18, …
## $ InvoiceDate <dttm> 2009-12-01 07:45:00, 2009-12-01 07:45:00, 2009-12-01 07…
## $ Price <dbl> 6.95, 6.75, 6.75, 2.10, 1.25, 1.65, 1.25, 5.95, 2.55, 3.…
## $ `Customer ID` <dbl> 13085, 13085, 13085, 13085, 13085, 13085, 13085, 13085, …
## $ Country <chr> "United Kingdom", "United Kingdom", "United Kingdom", "U…
We build a basket per invoice (unique product descriptions per
invoice) and convert to transactions.
basket_list <- df_clean %>%
group_by(Invoice) %>%
summarise(items = list(unique(Description)), .groups = "drop") %>%
pull(items)
trans <- as(basket_list, "transactions")
summary(trans)
## transactions as itemMatrix in sparse format with
## 21002 rows (elements/itemsets/transactions) and
## 4515 columns (items) and a density of 0.005254849
##
## most frequent items:
## WHITE HANGING HEART T-LIGHT HOLDER REGENCY CAKESTAND 3 TIER
## 3316 2020
## STRAWBERRY CERAMIC TRINKET BOX ASSORTED COLOUR BIRD ORNAMENT
## 1640 1413
## PACK OF 72 RETRO SPOT CAKE CASES (Other)
## 1410 488487
##
## element (itemset/transaction) length distribution:
## sizes
## 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
## 2168 877 724 683 647 618 592 551 615 541 570 561 556 525 546 517
## 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
## 512 527 500 491 437 400 369 323 308 294 270 260 246 237 206 179
## 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
## 173 162 151 153 144 130 140 153 138 112 107 102 88 86 115 80
## 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
## 84 84 82 76 57 56 61 58 64 55 43 49 41 45 37 42
## 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
## 40 28 22 28 28 32 34 22 24 27 19 17 15 15 21 15
## 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
## 12 11 15 18 9 9 13 14 19 15 7 7 8 8 15 7
## 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
## 9 8 10 12 7 4 8 5 8 6 9 9 8 7 6 4
## 113 114 115 116 117 118 119 120 121 122 123 125 126 127 128 129
## 8 8 14 7 8 5 5 3 9 5 5 5 4 6 3 3
## 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
## 5 5 6 8 7 9 4 5 5 2 2 2 4 5 2 6
## 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161
## 4 4 6 3 2 8 1 3 3 4 4 2 5 3 1 4
## 162 163 164 165 166 167 168 169 170 171 173 174 175 176 177 178
## 7 2 4 7 3 3 3 4 1 4 2 3 2 3 2 2
## 180 181 183 184 185 186 187 188 189 190 191 192 193 194 195 196
## 3 5 3 3 1 4 1 1 3 2 2 3 3 2 2 2
## 197 199 200 201 202 203 204 205 206 207 211 212 213 216 217 218
## 2 2 4 4 3 1 2 1 2 2 1 1 1 3 2 4
## 219 220 221 222 223 224 227 228 229 231 233 237 238 240 241 243
## 2 2 2 2 2 2 1 1 1 1 1 1 1 2 2 1
## 244 246 247 249 253 254 255 261 263 264 265 267 268 269 272 274
## 1 1 3 1 1 2 1 1 1 2 1 1 1 1 2 1
## 275 276 279 284 295 296 298 299 307 314 320 323 325 330 335 337
## 2 1 1 2 1 1 1 1 1 2 1 1 1 1 1 1
## 340 341 343 355 362 368 369 372 376 379 384 400 406 411 416 420
## 2 1 2 2 1 2 1 1 1 1 1 2 1 1 1 1
## 424 427 429 435 437 438 439 441 446 448 459 460 463 465 466 476
## 1 1 2 1 1 1 1 1 1 1 1 1 1 2 1 1
## 479 480 483 484 497 498 501 506 512 515 522 536 545 546 556 567
## 1 2 1 1 2 1 1 1 1 1 1 1 1 1 1 1
## 576 577 578 585 588 589 595 601 647 673
## 1 1 1 1 1 1 1 1 1 1
##
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.00 6.00 15.00 23.73 28.00 673.00
##
## includes extended item information - examples:
## labels
## 1 *BOOMBOX IPOD CLASSIC
## 2 *USB OFFICE GLITTER LAMP
## 3 *USB OFFICE MIRROR BALL
inspect(head(trans, 5))
## items
## [1] {15CM CHRISTMAS GLASS BALL 20 LIGHTS,
## FANCY FONT HOME SWEET HOME DOORMAT,
## PINK CHERRY LIGHTS,
## PINK DOUGHNUT TRINKET POT,
## RECORD FRAME 7" SINGLE SIZE,
## SAVE THE PLANET MUG,
## STRAWBERRY CERAMIC TRINKET BOX,
## WHITE CHERRY LIGHTS}
## [2] {CAT BOWL,
## DOG BOWL , CHASING BALL DESIGN,
## HEART MEASURING SPOONS LARGE,
## LUNCHBOX WITH CUTLERY FAIRY CAKES}
## [3] {AREA PATROLLED METAL SIGN,
## ASSORTED COLOUR BIRD ORNAMENT,
## BATH BUILDING BLOCK WORD,
## BISCUITS SMALL BOWL LIGHT BLUE,
## BLACK DINER WALL CLOCK,
## CHRISTMAS CRAFT WHITE FAIRY,
## CLASSIC WHITE FRAME,
## DOOR MAT BLACK FLOCK,
## FULL ENGLISH BREAKFAST PLATE,
## HEART FILIGREE DOVE LARGE,
## HEART IVORY TRELLIS LARGE,
## HOME BUILDING BLOCK WORD,
## LOVE BUILDING BLOCK WORD,
## PEACE WOODEN BLOCK LETTERS,
## PIZZA PLATE IN BOX,
## PLEASE ONE PERSON METAL SIGN,
## SCOTTIE DOG HOT WATER BOTTLE,
## SET OF 3 BLACK FLYING DUCKS,
## SMALL MARSHMALLOWS PINK BOWL}
## [4] {BLUE PADDED SOFT MOBILE,
## CHOCOLATE HOT WATER BOTTLE,
## CHRISTMAS CRAFT HEART DECORATIONS,
## CHRISTMAS CRAFT HEART STOCKING,
## CINAMMON & ORANGE WREATH,
## EUCALYPTUS & PINECONE WREATH,
## FELTCRAFT DOLL EMILY,
## FELTCRAFT DOLL MARIA,
## FELTCRAFT DOLL ROSIE,
## FLORAL BLUE MONSTER,
## HANGING HEART ZINC T-LIGHT HOLDER,
## INFLATABLE POLITICAL GLOBE,
## JOY LARGE WOOD LETTERS,
## PACK OF 20 SKULL PAPER NAPKINS,
## PACK OF 6 SKULL PAPER CUPS,
## PARTY CONE CHRISTMAS DECORATION,
## PEACE SMALL WOOD LETTERS,
## PINK BLUE FELT CRAFT TRINKET BOX,
## RETRO COFFEE MUGS ASSORTED,
## SCOTTIE DOG HOT WATER BOTTLE,
## STRIPES DESIGN MONKEY DOLL,
## VINTAGE SNAKES & LADDERS,
## WOODEN BOX ADVENT CALENDAR}
## [5] {CARROT CHARLIE+LOLA COASTER SET,
## CHARLIE & LOLA WASTEPAPER BIN BLUE,
## CHARLIE & LOLA WASTEPAPER BIN FLORA,
## CHARLIE + LOLA BISCUITS TINS,
## CHARLIE + LOLA RED HOT WATER BOTTLE,
## CHARLIE AND LOLA CHARLOTTE BAG,
## CHARLIE AND LOLA FIGURES TINS,
## CHARLIE LOLA BLUE HOT WATER BOTTLE,
## CHARLIE+LOLA PINK HOT WATER BOTTLE,
## CHARLIE+LOLA RED HOT WATER BOTTLE,
## COUNTRY COTTAGE DOORSTOP GREEN,
## DINOSAURS WRITING SET,
## GINGHAM HEART DOORSTOP RED,
## JUMBO BAG CHARLIE AND LOLA TOYS,
## JUMBO BAG TOYS,
## SET OF MEADOW FLOWER STICKERS,
## TOMATO CHARLIE+LOLA COASTER SET}
The bar chart above presents the top 15 most frequently purchased products across all transactions.
This step helps identify dominant products and motivates further analysis using association rules to uncover meaningful co-purchase patterns.
itemFrequencyPlot(
trans,
topN = 15,
type = "absolute",
horiz = TRUE,
cex.names = 0.7,
main = "Top 15 Most Frequent Products"
)
Using the Apriori algorithm with predefined support and confidence thresholds, a total of 491 association rules were generated.
Key characteristics of the mined rules include:
rules <- apriori(
trans,
parameter = APR_PARAMS,
control = list(verbose = FALSE)
)
summary(rules)
## set of 491 rules
##
## rule length distribution (lhs + rhs):sizes
## 2 3
## 428 63
##
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 2.000 2.000 2.000 2.128 2.000 3.000
##
## summary of quality measures:
## support confidence coverage lift
## Min. :0.01005 Min. :0.3022 Min. :0.01224 Min. : 1.932
## 1st Qu.:0.01105 1st Qu.:0.3633 1st Qu.:0.02247 1st Qu.: 7.335
## Median :0.01290 Median :0.4413 Median :0.03057 Median : 9.985
## Mean :0.01421 Mean :0.4697 Mean :0.03252 Mean :13.195
## 3rd Qu.:0.01597 3rd Qu.:0.5483 3rd Qu.:0.03995 3rd Qu.:15.561
## Max. :0.03790 Max. :0.8966 Max. :0.07809 Max. :64.708
## count
## Min. :211.0
## 1st Qu.:232.0
## Median :271.0
## Mean :298.4
## 3rd Qu.:335.5
## Max. :796.0
##
## mining info:
## data ntransactions support confidence
## trans 21002 0.01 0.3
## call
## apriori(data = trans, parameter = APR_PARAMS, control = list(verbose = FALSE))
inspect(head(rules, 10))
## lhs rhs support confidence coverage lift count
## [1] {PAINTED METAL PEARS ASSORTED} => {ASSORTED COLOUR BIRD ORNAMENT} 0.01337968 0.7336815 0.01823636 10.90501 281
## [2] {CHILDS GARDEN TROWEL BLUE} => {CHILDS GARDEN TROWEL PINK} 0.01014189 0.8287938 0.01223693 64.70753 213
## [3] {CHILDS GARDEN TROWEL PINK} => {CHILDS GARDEN TROWEL BLUE} 0.01014189 0.7918216 0.01280830 64.70753 213
## [4] {KEY FOB , FRONT DOOR} => {KEY FOB , BACK DOOR} 0.01014189 0.7830882 0.01295115 41.84839 213
## [5] {KEY FOB , BACK DOOR} => {KEY FOB , FRONT DOOR} 0.01014189 0.5419847 0.01871250 41.84839 213
## [6] {SET/10 BLUE SPOTTY PARTY CANDLES} => {SET/10 PINK SPOTTY PARTY CANDLES} 0.01214170 0.7943925 0.01528426 43.11068 255
## [7] {SET/10 PINK SPOTTY PARTY CANDLES} => {SET/10 BLUE SPOTTY PARTY CANDLES} 0.01214170 0.6589147 0.01842682 43.11068 255
## [8] {BAKING SET SPACEBOY DESIGN} => {BAKING SET 9 PIECE RETROSPOT} 0.01118941 0.4766734 0.02347395 10.21540 235
## [9] {PINK REGENCY TEACUP AND SAUCER} => {GREEN REGENCY TEACUP AND SAUCER} 0.01061804 0.8576923 0.01237977 49.21654 223
## [10] {GREEN REGENCY TEACUP AND SAUCER} => {PINK REGENCY TEACUP AND SAUCER} 0.01061804 0.6092896 0.01742691 49.21654 223
rules_f <- rules %>%
subset(!is.redundant(.)) %>%
subset(is.significant(., trans))
summary(rules_f)
## set of 489 rules
##
## rule length distribution (lhs + rhs):sizes
## 2 3
## 428 61
##
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 2.000 2.000 2.000 2.125 2.000 3.000
##
## summary of quality measures:
## support confidence coverage lift
## Min. :0.01005 Min. :0.3022 Min. :0.01224 Min. : 1.932
## 1st Qu.:0.01105 1st Qu.:0.3630 1st Qu.:0.02247 1st Qu.: 7.338
## Median :0.01295 Median :0.4413 Median :0.03057 Median :10.045
## Mean :0.01422 Mean :0.4698 Mean :0.03255 Mean :13.228
## 3rd Qu.:0.01600 3rd Qu.:0.5490 3rd Qu.:0.03995 3rd Qu.:15.561
## Max. :0.03790 Max. :0.8966 Max. :0.07809 Max. :64.708
## count
## Min. :211.0
## 1st Qu.:232.0
## Median :272.0
## Mean :298.7
## 3rd Qu.:336.0
## Max. :796.0
##
## mining info:
## data ntransactions support confidence
## trans 21002 0.01 0.3
## call
## apriori(data = trans, parameter = APR_PARAMS, control = list(verbose = FALSE))
After filtering for statistically significant and non-redundant rules, a subset of strong rules was selected using lift and confidence thresholds.
The strongest rules reveal:
rules_strong <- subset(
rules_f,
lift > STRONG_FILTER$lift & confidence > STRONG_FILTER$conf
)
summary(rules_strong)
## set of 164 rules
##
## rule length distribution (lhs + rhs):sizes
## 2 3
## 119 45
##
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 2.000 2.000 2.000 2.274 3.000 3.000
##
## summary of quality measures:
## support confidence coverage lift
## Min. :0.01009 Min. :0.5027 Min. :0.01224 Min. : 6.413
## 1st Qu.:0.01086 1st Qu.:0.5445 1st Qu.:0.01743 1st Qu.:10.977
## Median :0.01186 Median :0.5982 Median :0.01964 Median :18.296
## Mean :0.01336 Mean :0.6198 Mean :0.02211 Mean :22.028
## 3rd Qu.:0.01426 3rd Qu.:0.6688 3rd Qu.:0.02355 3rd Qu.:29.507
## Max. :0.03790 Max. :0.8966 Max. :0.05499 Max. :64.708
## count
## Min. :212.0
## 1st Qu.:228.0
## Median :249.0
## Mean :280.6
## 3rd Qu.:299.5
## Max. :796.0
##
## mining info:
## data ntransactions support confidence
## trans 21002 0.01 0.3
## call
## apriori(data = trans, parameter = APR_PARAMS, control = list(verbose = FALSE))
inspect(head(sort(rules_strong, by = "lift", decreasing = TRUE), 15))
## lhs rhs support confidence coverage lift count
## [1] {CHILDS GARDEN TROWEL BLUE} => {CHILDS GARDEN TROWEL PINK} 0.01014189 0.8287938 0.01223693 64.70753 213
## [2] {CHILDS GARDEN TROWEL PINK} => {CHILDS GARDEN TROWEL BLUE} 0.01014189 0.7918216 0.01280830 64.70753 213
## [3] {POPPY'S PLAYHOUSE LIVINGROOM} => {POPPY'S PLAYHOUSE BEDROOM} 0.01066565 0.8582375 0.01242739 56.68146 224
## [4] {POPPY'S PLAYHOUSE BEDROOM} => {POPPY'S PLAYHOUSE LIVINGROOM} 0.01066565 0.7044025 0.01514142 56.68146 224
## [5] {POPPY'S PLAYHOUSE LIVINGROOM} => {POPPY'S PLAYHOUSE KITCHEN} 0.01114180 0.8965517 0.01242739 55.05666 234
## [6] {POPPY'S PLAYHOUSE KITCHEN} => {POPPY'S PLAYHOUSE LIVINGROOM} 0.01114180 0.6842105 0.01628416 55.05666 234
## [7] {POPPY'S PLAYHOUSE KITCHEN} => {POPPY'S PLAYHOUSE BEDROOM} 0.01304638 0.8011696 0.01628416 52.91246 274
## [8] {POPPY'S PLAYHOUSE BEDROOM} => {POPPY'S PLAYHOUSE KITCHEN} 0.01304638 0.8616352 0.01514142 52.91246 274
## [9] {GREEN REGENCY TEACUP AND SAUCER} => {PINK REGENCY TEACUP AND SAUCER} 0.01061804 0.6092896 0.01742691 49.21654 223
## [10] {PINK REGENCY TEACUP AND SAUCER} => {GREEN REGENCY TEACUP AND SAUCER} 0.01061804 0.8576923 0.01237977 49.21654 223
## [11] {SET/10 BLUE SPOTTY PARTY CANDLES} => {SET/10 PINK SPOTTY PARTY CANDLES} 0.01214170 0.7943925 0.01528426 43.11068 255
## [12] {SET/10 PINK SPOTTY PARTY CANDLES} => {SET/10 BLUE SPOTTY PARTY CANDLES} 0.01214170 0.6589147 0.01842682 43.11068 255
## [13] {ROSES REGENCY TEACUP AND SAUCER} => {GREEN REGENCY TEACUP AND SAUCER} 0.01352252 0.7454068 0.01814113 42.77332 284
## [14] {GREEN REGENCY TEACUP AND SAUCER} => {ROSES REGENCY TEACUP AND SAUCER} 0.01352252 0.7759563 0.01742691 42.77332 284
## [15] {KEY FOB , FRONT DOOR} => {KEY FOB , BACK DOOR} 0.01014189 0.7830882 0.01295115 41.84839 213
plot(
rules_strong,
measure = c("support", "lift"),
shading = "confidence"
)
plot(
head(rules_strong, 30),
method = "graph",
engine = "htmlwidget"
)
In this step, association rules were mined with a fixed right-hand-side (RHS) item, focusing on products that could predict the purchase of a specific target item.
No rules satisfying the minimum support and confidence thresholds were found for the selected target product.
This result suggests that:
rules_rhs <- apriori(
trans,
parameter = list(
supp = RHS_TARGET$supp,
conf = RHS_TARGET$conf,
minlen = 2,
maxlen = 3
),
appearance = list(default = "lhs", rhs = RHS_TARGET$item),
control = list(verbose = FALSE)
)
rules_rhs <- sort(rules_rhs, by = "lift", decreasing = TRUE)
summary(rules_rhs)
## set of 0 rules
inspect(head(rules_rhs, 10))
top_items <- names(sort(itemFrequency(trans), decreasing = TRUE))[1:CROSSTABLE_TOPN]
trans_top <- trans[, top_items]
ct_count <- crossTable(trans_top, measure = "count", sort = TRUE)
ct_supp <- crossTable(trans_top, measure = "support", sort = TRUE)
ct_lift <- crossTable(trans_top, measure = "lift", sort = TRUE)
head(ct_count, 5)
## WHITE HANGING HEART T-LIGHT HOLDER
## WHITE HANGING HEART T-LIGHT HOLDER 3316
## REGENCY CAKESTAND 3 TIER 429
## STRAWBERRY CERAMIC TRINKET BOX 537
## ASSORTED COLOUR BIRD ORNAMENT 441
## PACK OF 72 RETRO SPOT CAKE CASES 371
## REGENCY CAKESTAND 3 TIER
## WHITE HANGING HEART T-LIGHT HOLDER 429
## REGENCY CAKESTAND 3 TIER 2020
## STRAWBERRY CERAMIC TRINKET BOX 308
## ASSORTED COLOUR BIRD ORNAMENT 220
## PACK OF 72 RETRO SPOT CAKE CASES 238
## STRAWBERRY CERAMIC TRINKET BOX
## WHITE HANGING HEART T-LIGHT HOLDER 537
## REGENCY CAKESTAND 3 TIER 308
## STRAWBERRY CERAMIC TRINKET BOX 1640
## ASSORTED COLOUR BIRD ORNAMENT 155
## PACK OF 72 RETRO SPOT CAKE CASES 328
## ASSORTED COLOUR BIRD ORNAMENT
## WHITE HANGING HEART T-LIGHT HOLDER 441
## REGENCY CAKESTAND 3 TIER 220
## STRAWBERRY CERAMIC TRINKET BOX 155
## ASSORTED COLOUR BIRD ORNAMENT 1413
## PACK OF 72 RETRO SPOT CAKE CASES 156
## PACK OF 72 RETRO SPOT CAKE CASES
## WHITE HANGING HEART T-LIGHT HOLDER 371
## REGENCY CAKESTAND 3 TIER 238
## STRAWBERRY CERAMIC TRINKET BOX 328
## ASSORTED COLOUR BIRD ORNAMENT 156
## PACK OF 72 RETRO SPOT CAKE CASES 1410
## 60 TEATIME FAIRY CAKE CASES
## WHITE HANGING HEART T-LIGHT HOLDER 408
## REGENCY CAKESTAND 3 TIER 255
## STRAWBERRY CERAMIC TRINKET BOX 366
## ASSORTED COLOUR BIRD ORNAMENT 157
## PACK OF 72 RETRO SPOT CAKE CASES 603
## HOME BUILDING BLOCK WORD
## WHITE HANGING HEART T-LIGHT HOLDER 505
## REGENCY CAKESTAND 3 TIER 242
## STRAWBERRY CERAMIC TRINKET BOX 219
## ASSORTED COLOUR BIRD ORNAMENT 247
## PACK OF 72 RETRO SPOT CAKE CASES 170
## JUMBO BAG RED RETROSPOT LUNCH BAG RED SPOTTY
## WHITE HANGING HEART T-LIGHT HOLDER 296 344
## REGENCY CAKESTAND 3 TIER 251 181
## STRAWBERRY CERAMIC TRINKET BOX 210 256
## ASSORTED COLOUR BIRD ORNAMENT 113 101
## PACK OF 72 RETRO SPOT CAKE CASES 145 339
## JUMBO STORAGE BAG SUKI
## WHITE HANGING HEART T-LIGHT HOLDER 315
## REGENCY CAKESTAND 3 TIER 218
## STRAWBERRY CERAMIC TRINKET BOX 240
## ASSORTED COLOUR BIRD ORNAMENT 113
## PACK OF 72 RETRO SPOT CAKE CASES 221
## PACK OF 60 PINK PAISLEY CAKE CASES
## WHITE HANGING HEART T-LIGHT HOLDER 318
## REGENCY CAKESTAND 3 TIER 277
## STRAWBERRY CERAMIC TRINKET BOX 286
## ASSORTED COLOUR BIRD ORNAMENT 151
## PACK OF 72 RETRO SPOT CAKE CASES 534
## WOODEN FRAME ANTIQUE WHITE
## WHITE HANGING HEART T-LIGHT HOLDER 532
## REGENCY CAKESTAND 3 TIER 206
## STRAWBERRY CERAMIC TRINKET BOX 193
## ASSORTED COLOUR BIRD ORNAMENT 161
## PACK OF 72 RETRO SPOT CAKE CASES 129
## LUNCH BAG BLACK SKULL. LUNCH BAG SUKI DESIGN
## WHITE HANGING HEART T-LIGHT HOLDER 324 294
## REGENCY CAKESTAND 3 TIER 161 169
## STRAWBERRY CERAMIC TRINKET BOX 223 194
## ASSORTED COLOUR BIRD ORNAMENT 106 87
## PACK OF 72 RETRO SPOT CAKE CASES 179 195
## HEART OF WICKER LARGE
## WHITE HANGING HEART T-LIGHT HOLDER 434
## REGENCY CAKESTAND 3 TIER 195
## STRAWBERRY CERAMIC TRINKET BOX 162
## ASSORTED COLOUR BIRD ORNAMENT 153
## PACK OF 72 RETRO SPOT CAKE CASES 83
## LOVE BUILDING BLOCK WORD
## WHITE HANGING HEART T-LIGHT HOLDER 460
## REGENCY CAKESTAND 3 TIER 182
## STRAWBERRY CERAMIC TRINKET BOX 194
## ASSORTED COLOUR BIRD ORNAMENT 175
## PACK OF 72 RETRO SPOT CAKE CASES 165
## REX CASH+CARRY JUMBO SHOPPER
## WHITE HANGING HEART T-LIGHT HOLDER 274
## REGENCY CAKESTAND 3 TIER 92
## STRAWBERRY CERAMIC TRINKET BOX 101
## ASSORTED COLOUR BIRD ORNAMENT 99
## PACK OF 72 RETRO SPOT CAKE CASES 66
## RED HANGING HEART T-LIGHT HOLDER
## WHITE HANGING HEART T-LIGHT HOLDER 771
## REGENCY CAKESTAND 3 TIER 131
## STRAWBERRY CERAMIC TRINKET BOX 161
## ASSORTED COLOUR BIRD ORNAMENT 134
## PACK OF 72 RETRO SPOT CAKE CASES 80
## JUMBO SHOPPER VINTAGE RED PAISLEY
## WHITE HANGING HEART T-LIGHT HOLDER 234
## REGENCY CAKESTAND 3 TIER 198
## STRAWBERRY CERAMIC TRINKET BOX 156
## ASSORTED COLOUR BIRD ORNAMENT 110
## PACK OF 72 RETRO SPOT CAKE CASES 150
## JUMBO BAG STRAWBERRY HEART OF WICKER SMALL
## WHITE HANGING HEART T-LIGHT HOLDER 315 417
## REGENCY CAKESTAND 3 TIER 203 215
## STRAWBERRY CERAMIC TRINKET BOX 219 191
## ASSORTED COLOUR BIRD ORNAMENT 113 142
## PACK OF 72 RETRO SPOT CAKE CASES 200 109
## HOT WATER BOTTLE TEA AND SYMPATHY
## WHITE HANGING HEART T-LIGHT HOLDER 298
## REGENCY CAKESTAND 3 TIER 190
## STRAWBERRY CERAMIC TRINKET BOX 227
## ASSORTED COLOUR BIRD ORNAMENT 98
## PACK OF 72 RETRO SPOT CAKE CASES 136
## PARTY BUNTING PLEASE ONE PERSON METAL SIGN
## WHITE HANGING HEART T-LIGHT HOLDER 303 358
## REGENCY CAKESTAND 3 TIER 245 143
## STRAWBERRY CERAMIC TRINKET BOX 224 199
## ASSORTED COLOUR BIRD ORNAMENT 128 108
## PACK OF 72 RETRO SPOT CAKE CASES 208 127
## SWEETHEART CERAMIC TRINKET BOX
## WHITE HANGING HEART T-LIGHT HOLDER 336
## REGENCY CAKESTAND 3 TIER 257
## STRAWBERRY CERAMIC TRINKET BOX 796
## ASSORTED COLOUR BIRD ORNAMENT 103
## PACK OF 72 RETRO SPOT CAKE CASES 184
## VINTAGE SNAP CARDS
## WHITE HANGING HEART T-LIGHT HOLDER 261
## REGENCY CAKESTAND 3 TIER 177
## STRAWBERRY CERAMIC TRINKET BOX 198
## ASSORTED COLOUR BIRD ORNAMENT 113
## PACK OF 72 RETRO SPOT CAKE CASES 174
## SCOTTIE DOG HOT WATER BOTTLE
## WHITE HANGING HEART T-LIGHT HOLDER 312
## REGENCY CAKESTAND 3 TIER 132
## STRAWBERRY CERAMIC TRINKET BOX 175
## ASSORTED COLOUR BIRD ORNAMENT 110
## PACK OF 72 RETRO SPOT CAKE CASES 118
## LUNCH BAG SPACEBOY DESIGN
## WHITE HANGING HEART T-LIGHT HOLDER 219
## REGENCY CAKESTAND 3 TIER 130
## STRAWBERRY CERAMIC TRINKET BOX 122
## ASSORTED COLOUR BIRD ORNAMENT 96
## PACK OF 72 RETRO SPOT CAKE CASES 137
## BAKING SET 9 PIECE RETROSPOT
## WHITE HANGING HEART T-LIGHT HOLDER 178
## REGENCY CAKESTAND 3 TIER 120
## STRAWBERRY CERAMIC TRINKET BOX 130
## ASSORTED COLOUR BIRD ORNAMENT 88
## PACK OF 72 RETRO SPOT CAKE CASES 221
## JUMBO BAG BAROQUE BLACK WHITE
## WHITE HANGING HEART T-LIGHT HOLDER 260
## REGENCY CAKESTAND 3 TIER 166
## STRAWBERRY CERAMIC TRINKET BOX 189
## ASSORTED COLOUR BIRD ORNAMENT 90
## PACK OF 72 RETRO SPOT CAKE CASES 130
head(ct_supp, 5)
## WHITE HANGING HEART T-LIGHT HOLDER
## WHITE HANGING HEART T-LIGHT HOLDER 0.15788972
## REGENCY CAKESTAND 3 TIER 0.02042663
## STRAWBERRY CERAMIC TRINKET BOX 0.02556899
## ASSORTED COLOUR BIRD ORNAMENT 0.02099800
## PACK OF 72 RETRO SPOT CAKE CASES 0.01766498
## REGENCY CAKESTAND 3 TIER
## WHITE HANGING HEART T-LIGHT HOLDER 0.02042663
## REGENCY CAKESTAND 3 TIER 0.09618132
## STRAWBERRY CERAMIC TRINKET BOX 0.01466527
## ASSORTED COLOUR BIRD ORNAMENT 0.01047519
## PACK OF 72 RETRO SPOT CAKE CASES 0.01133225
## STRAWBERRY CERAMIC TRINKET BOX
## WHITE HANGING HEART T-LIGHT HOLDER 0.02556899
## REGENCY CAKESTAND 3 TIER 0.01466527
## STRAWBERRY CERAMIC TRINKET BOX 0.07808780
## ASSORTED COLOUR BIRD ORNAMENT 0.00738025
## PACK OF 72 RETRO SPOT CAKE CASES 0.01561756
## ASSORTED COLOUR BIRD ORNAMENT
## WHITE HANGING HEART T-LIGHT HOLDER 0.020998000
## REGENCY CAKESTAND 3 TIER 0.010475193
## STRAWBERRY CERAMIC TRINKET BOX 0.007380250
## ASSORTED COLOUR BIRD ORNAMENT 0.067279307
## PACK OF 72 RETRO SPOT CAKE CASES 0.007427864
## PACK OF 72 RETRO SPOT CAKE CASES
## WHITE HANGING HEART T-LIGHT HOLDER 0.017664984
## REGENCY CAKESTAND 3 TIER 0.011332254
## STRAWBERRY CERAMIC TRINKET BOX 0.015617560
## ASSORTED COLOUR BIRD ORNAMENT 0.007427864
## PACK OF 72 RETRO SPOT CAKE CASES 0.067136463
## 60 TEATIME FAIRY CAKE CASES
## WHITE HANGING HEART T-LIGHT HOLDER 0.019426721
## REGENCY CAKESTAND 3 TIER 0.012141701
## STRAWBERRY CERAMIC TRINKET BOX 0.017426912
## ASSORTED COLOUR BIRD ORNAMENT 0.007475479
## PACK OF 72 RETRO SPOT CAKE CASES 0.028711551
## HOME BUILDING BLOCK WORD
## WHITE HANGING HEART T-LIGHT HOLDER 0.024045329
## REGENCY CAKESTAND 3 TIER 0.011522712
## STRAWBERRY CERAMIC TRINKET BOX 0.010427578
## ASSORTED COLOUR BIRD ORNAMENT 0.011760785
## PACK OF 72 RETRO SPOT CAKE CASES 0.008094467
## JUMBO BAG RED RETROSPOT LUNCH BAG RED SPOTTY
## WHITE HANGING HEART T-LIGHT HOLDER 0.014093896 0.016379392
## REGENCY CAKESTAND 3 TIER 0.011951243 0.008618227
## STRAWBERRY CERAMIC TRINKET BOX 0.009999048 0.012189315
## ASSORTED COLOUR BIRD ORNAMENT 0.005380440 0.004809066
## PACK OF 72 RETRO SPOT CAKE CASES 0.006904104 0.016141320
## JUMBO STORAGE BAG SUKI
## WHITE HANGING HEART T-LIGHT HOLDER 0.01499857
## REGENCY CAKESTAND 3 TIER 0.01037996
## STRAWBERRY CERAMIC TRINKET BOX 0.01142748
## ASSORTED COLOUR BIRD ORNAMENT 0.00538044
## PACK OF 72 RETRO SPOT CAKE CASES 0.01052281
## PACK OF 60 PINK PAISLEY CAKE CASES
## WHITE HANGING HEART T-LIGHT HOLDER 0.015141415
## REGENCY CAKESTAND 3 TIER 0.013189220
## STRAWBERRY CERAMIC TRINKET BOX 0.013617751
## ASSORTED COLOUR BIRD ORNAMENT 0.007189791
## PACK OF 72 RETRO SPOT CAKE CASES 0.025426150
## WOODEN FRAME ANTIQUE WHITE
## WHITE HANGING HEART T-LIGHT HOLDER 0.025330921
## REGENCY CAKESTAND 3 TIER 0.009808590
## STRAWBERRY CERAMIC TRINKET BOX 0.009189601
## ASSORTED COLOUR BIRD ORNAMENT 0.007665937
## PACK OF 72 RETRO SPOT CAKE CASES 0.006142272
## LUNCH BAG BLACK SKULL. LUNCH BAG SUKI DESIGN
## WHITE HANGING HEART T-LIGHT HOLDER 0.015427102 0.013998667
## REGENCY CAKESTAND 3 TIER 0.007665937 0.008046853
## STRAWBERRY CERAMIC TRINKET BOX 0.010618036 0.009237216
## ASSORTED COLOUR BIRD ORNAMENT 0.005047138 0.004142463
## PACK OF 72 RETRO SPOT CAKE CASES 0.008522998 0.009284830
## HEART OF WICKER LARGE
## WHITE HANGING HEART T-LIGHT HOLDER 0.020664699
## REGENCY CAKESTAND 3 TIER 0.009284830
## STRAWBERRY CERAMIC TRINKET BOX 0.007713551
## ASSORTED COLOUR BIRD ORNAMENT 0.007285020
## PACK OF 72 RETRO SPOT CAKE CASES 0.003952005
## LOVE BUILDING BLOCK WORD
## WHITE HANGING HEART T-LIGHT HOLDER 0.021902676
## REGENCY CAKESTAND 3 TIER 0.008665841
## STRAWBERRY CERAMIC TRINKET BOX 0.009237216
## ASSORTED COLOUR BIRD ORNAMENT 0.008332540
## PACK OF 72 RETRO SPOT CAKE CASES 0.007856395
## REX CASH+CARRY JUMBO SHOPPER
## WHITE HANGING HEART T-LIGHT HOLDER 0.013046377
## REGENCY CAKESTAND 3 TIER 0.004380535
## STRAWBERRY CERAMIC TRINKET BOX 0.004809066
## ASSORTED COLOUR BIRD ORNAMENT 0.004713837
## PACK OF 72 RETRO SPOT CAKE CASES 0.003142558
## RED HANGING HEART T-LIGHT HOLDER
## WHITE HANGING HEART T-LIGHT HOLDER 0.036710789
## REGENCY CAKESTAND 3 TIER 0.006237501
## STRAWBERRY CERAMIC TRINKET BOX 0.007665937
## ASSORTED COLOUR BIRD ORNAMENT 0.006380345
## PACK OF 72 RETRO SPOT CAKE CASES 0.003809161
## JUMBO SHOPPER VINTAGE RED PAISLEY
## WHITE HANGING HEART T-LIGHT HOLDER 0.011141796
## REGENCY CAKESTAND 3 TIER 0.009427674
## STRAWBERRY CERAMIC TRINKET BOX 0.007427864
## ASSORTED COLOUR BIRD ORNAMENT 0.005237596
## PACK OF 72 RETRO SPOT CAKE CASES 0.007142177
## JUMBO BAG STRAWBERRY HEART OF WICKER SMALL
## WHITE HANGING HEART T-LIGHT HOLDER 0.014998572 0.019855252
## REGENCY CAKESTAND 3 TIER 0.009665746 0.010237120
## STRAWBERRY CERAMIC TRINKET BOX 0.010427578 0.009094372
## ASSORTED COLOUR BIRD ORNAMENT 0.005380440 0.006761261
## PACK OF 72 RETRO SPOT CAKE CASES 0.009522903 0.005189982
## HOT WATER BOTTLE TEA AND SYMPATHY
## WHITE HANGING HEART T-LIGHT HOLDER 0.014189125
## REGENCY CAKESTAND 3 TIER 0.009046757
## STRAWBERRY CERAMIC TRINKET BOX 0.010808494
## ASSORTED COLOUR BIRD ORNAMENT 0.004666222
## PACK OF 72 RETRO SPOT CAKE CASES 0.006475574
## PARTY BUNTING PLEASE ONE PERSON METAL SIGN
## WHITE HANGING HEART T-LIGHT HOLDER 0.014427197 0.017045996
## REGENCY CAKESTAND 3 TIER 0.011665556 0.006808875
## STRAWBERRY CERAMIC TRINKET BOX 0.010665651 0.009475288
## ASSORTED COLOUR BIRD ORNAMENT 0.006094658 0.005142367
## PACK OF 72 RETRO SPOT CAKE CASES 0.009903819 0.006047043
## SWEETHEART CERAMIC TRINKET BOX
## WHITE HANGING HEART T-LIGHT HOLDER 0.015998476
## REGENCY CAKESTAND 3 TIER 0.012236930
## STRAWBERRY CERAMIC TRINKET BOX 0.037901152
## ASSORTED COLOUR BIRD ORNAMENT 0.004904295
## PACK OF 72 RETRO SPOT CAKE CASES 0.008761070
## VINTAGE SNAP CARDS
## WHITE HANGING HEART T-LIGHT HOLDER 0.012427388
## REGENCY CAKESTAND 3 TIER 0.008427769
## STRAWBERRY CERAMIC TRINKET BOX 0.009427674
## ASSORTED COLOUR BIRD ORNAMENT 0.005380440
## PACK OF 72 RETRO SPOT CAKE CASES 0.008284925
## SCOTTIE DOG HOT WATER BOTTLE
## WHITE HANGING HEART T-LIGHT HOLDER 0.014855728
## REGENCY CAKESTAND 3 TIER 0.006285116
## STRAWBERRY CERAMIC TRINKET BOX 0.008332540
## ASSORTED COLOUR BIRD ORNAMENT 0.005237596
## PACK OF 72 RETRO SPOT CAKE CASES 0.005618513
## LUNCH BAG SPACEBOY DESIGN
## WHITE HANGING HEART T-LIGHT HOLDER 0.010427578
## REGENCY CAKESTAND 3 TIER 0.006189887
## STRAWBERRY CERAMIC TRINKET BOX 0.005808971
## ASSORTED COLOUR BIRD ORNAMENT 0.004570993
## PACK OF 72 RETRO SPOT CAKE CASES 0.006523188
## BAKING SET 9 PIECE RETROSPOT
## WHITE HANGING HEART T-LIGHT HOLDER 0.008475383
## REGENCY CAKESTAND 3 TIER 0.005713742
## STRAWBERRY CERAMIC TRINKET BOX 0.006189887
## ASSORTED COLOUR BIRD ORNAMENT 0.004190077
## PACK OF 72 RETRO SPOT CAKE CASES 0.010522807
## JUMBO BAG BAROQUE BLACK WHITE
## WHITE HANGING HEART T-LIGHT HOLDER 0.012379773
## REGENCY CAKESTAND 3 TIER 0.007904009
## STRAWBERRY CERAMIC TRINKET BOX 0.008999143
## ASSORTED COLOUR BIRD ORNAMENT 0.004285306
## PACK OF 72 RETRO SPOT CAKE CASES 0.006189887
head(ct_lift, 5)
## WHITE HANGING HEART T-LIGHT HOLDER
## WHITE HANGING HEART T-LIGHT HOLDER NA
## REGENCY CAKESTAND 3 TIER 1.345092
## STRAWBERRY CERAMIC TRINKET BOX 2.073846
## ASSORTED COLOUR BIRD ORNAMENT 1.976708
## PACK OF 72 RETRO SPOT CAKE CASES 1.666483
## REGENCY CAKESTAND 3 TIER
## WHITE HANGING HEART T-LIGHT HOLDER 1.345092
## REGENCY CAKESTAND 3 TIER NA
## STRAWBERRY CERAMIC TRINKET BOX 1.952613
## ASSORTED COLOUR BIRD ORNAMENT 1.618787
## PACK OF 72 RETRO SPOT CAKE CASES 1.754960
## STRAWBERRY CERAMIC TRINKET BOX
## WHITE HANGING HEART T-LIGHT HOLDER 2.073846
## REGENCY CAKESTAND 3 TIER 1.952613
## STRAWBERRY CERAMIC TRINKET BOX NA
## ASSORTED COLOUR BIRD ORNAMENT 1.404774
## PACK OF 72 RETRO SPOT CAKE CASES 2.979007
## ASSORTED COLOUR BIRD ORNAMENT
## WHITE HANGING HEART T-LIGHT HOLDER 1.976708
## REGENCY CAKESTAND 3 TIER 1.618787
## STRAWBERRY CERAMIC TRINKET BOX 1.404774
## ASSORTED COLOUR BIRD ORNAMENT NA
## PACK OF 72 RETRO SPOT CAKE CASES 1.644463
## PACK OF 72 RETRO SPOT CAKE CASES
## WHITE HANGING HEART T-LIGHT HOLDER 1.666483
## REGENCY CAKESTAND 3 TIER 1.754960
## STRAWBERRY CERAMIC TRINKET BOX 2.979007
## ASSORTED COLOUR BIRD ORNAMENT 1.644463
## PACK OF 72 RETRO SPOT CAKE CASES NA
## 60 TEATIME FAIRY CAKE CASES
## WHITE HANGING HEART T-LIGHT HOLDER 1.934193
## REGENCY CAKESTAND 3 TIER 1.984463
## STRAWBERRY CERAMIC TRINKET BOX 3.508257
## ASSORTED COLOUR BIRD ORNAMENT 1.746673
## PACK OF 72 RETRO SPOT CAKE CASES 6.722834
## HOME BUILDING BLOCK WORD
## WHITE HANGING HEART T-LIGHT HOLDER 2.403031
## REGENCY CAKESTAND 3 TIER 1.890369
## STRAWBERRY CERAMIC TRINKET BOX 2.107089
## ASSORTED COLOUR BIRD ORNAMENT 2.758274
## PACK OF 72 RETRO SPOT CAKE CASES 1.902446
## JUMBO BAG RED RETROSPOT LUNCH BAG RED SPOTTY
## WHITE HANGING HEART T-LIGHT HOLDER 1.503389 1.788781
## REGENCY CAKESTAND 3 TIER 2.092746 1.545043
## STRAWBERRY CERAMIC TRINKET BOX 2.156600 2.691594
## ASSORTED COLOUR BIRD ORNAMENT 1.346885 1.232516
## PACK OF 72 RETRO SPOT CAKE CASES 1.731981 4.145663
## JUMBO STORAGE BAG SUKI
## WHITE HANGING HEART T-LIGHT HOLDER 1.690732
## REGENCY CAKESTAND 3 TIER 1.920807
## STRAWBERRY CERAMIC TRINKET BOX 2.604630
## ASSORTED COLOUR BIRD ORNAMENT 1.423361
## PACK OF 72 RETRO SPOT CAKE CASES 2.789663
## PACK OF 60 PINK PAISLEY CAKE CASES
## WHITE HANGING HEART T-LIGHT HOLDER 1.743778
## REGENCY CAKESTAND 3 TIER 2.493487
## STRAWBERRY CERAMIC TRINKET BOX 3.171034
## ASSORTED COLOUR BIRD ORNAMENT 1.943182
## PACK OF 72 RETRO SPOT CAKE CASES 6.886536
## WOODEN FRAME ANTIQUE WHITE
## WHITE HANGING HEART T-LIGHT HOLDER 2.955649
## REGENCY CAKESTAND 3 TIER 1.878762
## STRAWBERRY CERAMIC TRINKET BOX 2.168050
## ASSORTED COLOUR BIRD ORNAMENT 2.099131
## PACK OF 72 RETRO SPOT CAKE CASES 1.685491
## LUNCH BAG BLACK SKULL. LUNCH BAG SUKI DESIGN
## WHITE HANGING HEART T-LIGHT HOLDER 1.840417 1.671507
## REGENCY CAKESTAND 3 TIER 1.501275 1.577287
## STRAWBERRY CERAMIC TRINKET BOX 2.561220 2.230146
## ASSORTED COLOUR BIRD ORNAMENT 1.413024 1.160787
## PACK OF 72 RETRO SPOT CAKE CASES 2.391221 2.607300
## HEART OF WICKER LARGE
## WHITE HANGING HEART T-LIGHT HOLDER 2.507987
## REGENCY CAKESTAND 3 TIER 1.849836
## STRAWBERRY CERAMIC TRINKET BOX 1.892872
## ASSORTED COLOUR BIRD ORNAMENT 2.074911
## PACK OF 72 RETRO SPOT CAKE CASES 1.128000
## LOVE BUILDING BLOCK WORD
## WHITE HANGING HEART T-LIGHT HOLDER 2.670418
## REGENCY CAKESTAND 3 TIER 1.734427
## STRAWBERRY CERAMIC TRINKET BOX 2.277161
## ASSORTED COLOUR BIRD ORNAMENT 2.384140
## PACK OF 72 RETRO SPOT CAKE CASES 2.252686
## REX CASH+CARRY JUMBO SHOPPER
## WHITE HANGING HEART T-LIGHT HOLDER 1.6143148
## REGENCY CAKESTAND 3 TIER 0.8897923
## STRAWBERRY CERAMIC TRINKET BOX 1.2031775
## ASSORTED COLOUR BIRD ORNAMENT 1.3688165
## PACK OF 72 RETRO SPOT CAKE CASES 0.9144859
## RED HANGING HEART T-LIGHT HOLDER
## WHITE HANGING HEART T-LIGHT HOLDER 4.580821
## REGENCY CAKESTAND 3 TIER 1.277684
## STRAWBERRY CERAMIC TRINKET BOX 1.934129
## ASSORTED COLOUR BIRD ORNAMENT 1.868384
## PACK OF 72 RETRO SPOT CAKE CASES 1.117826
## JUMBO SHOPPER VINTAGE RED PAISLEY
## WHITE HANGING HEART T-LIGHT HOLDER 1.400801
## REGENCY CAKESTAND 3 TIER 1.945758
## STRAWBERRY CERAMIC TRINKET BOX 1.888234
## ASSORTED COLOUR BIRD ORNAMENT 1.545345
## PACK OF 72 RETRO SPOT CAKE CASES 2.111773
## JUMBO BAG STRAWBERRY HEART OF WICKER SMALL
## WHITE HANGING HEART T-LIGHT HOLDER 1.887477 2.566651
## REGENCY CAKESTAND 3 TIER 1.996781 2.172363
## STRAWBERRY CERAMIC TRINKET BOX 2.653297 2.377031
## ASSORTED COLOUR BIRD ORNAMENT 1.588993 2.051122
## PACK OF 72 RETRO SPOT CAKE CASES 2.818361 1.577803
## HOT WATER BOTTLE TEA AND SYMPATHY
## WHITE HANGING HEART T-LIGHT HOLDER 1.857671
## REGENCY CAKESTAND 3 TIER 1.944326
## STRAWBERRY CERAMIC TRINKET BOX 2.861205
## ASSORTED COLOUR BIRD ORNAMENT 1.433675
## PACK OF 72 RETRO SPOT CAKE CASES 1.993824
## PARTY BUNTING PLEASE ONE PERSON METAL SIGN
## WHITE HANGING HEART T-LIGHT HOLDER 1.892565 2.240519
## REGENCY CAKESTAND 3 TIER 2.512103 1.469146
## STRAWBERRY CERAMIC TRINKET BOX 2.828960 2.518195
## ASSORTED COLOUR BIRD ORNAMENT 1.876249 1.586214
## PACK OF 72 RETRO SPOT CAKE CASES 3.055392 1.869239
## SWEETHEART CERAMIC TRINKET BOX
## WHITE HANGING HEART T-LIGHT HOLDER 2.125942
## REGENCY CAKESTAND 3 TIER 2.669367
## STRAWBERRY CERAMIC TRINKET BOX 10.183470
## ASSORTED COLOUR BIRD ORNAMENT 1.529402
## PACK OF 72 RETRO SPOT CAKE CASES 2.737949
## VINTAGE SNAP CARDS
## WHITE HANGING HEART T-LIGHT HOLDER 1.651401
## REGENCY CAKESTAND 3 TIER 1.838436
## STRAWBERRY CERAMIC TRINKET BOX 2.533074
## ASSORTED COLOUR BIRD ORNAMENT 1.677888
## PACK OF 72 RETRO SPOT CAKE CASES 2.589147
## SCOTTIE DOG HOT WATER BOTTLE
## WHITE HANGING HEART T-LIGHT HOLDER 1.987991
## REGENCY CAKESTAND 3 TIER 1.380692
## STRAWBERRY CERAMIC TRINKET BOX 2.254595
## ASSORTED COLOUR BIRD ORNAMENT 1.644844
## PACK OF 72 RETRO SPOT CAKE CASES 1.768224
## LUNCH BAG SPACEBOY DESIGN
## WHITE HANGING HEART T-LIGHT HOLDER 1.413908
## REGENCY CAKESTAND 3 TIER 1.377792
## STRAWBERRY CERAMIC TRINKET BOX 1.592603
## ASSORTED COLOUR BIRD ORNAMENT 1.454523
## PACK OF 72 RETRO SPOT CAKE CASES 2.080143
## BAKING SET 9 PIECE RETROSPOT
## WHITE HANGING HEART T-LIGHT HOLDER 1.150377
## REGENCY CAKESTAND 3 TIER 1.273106
## STRAWBERRY CERAMIC TRINKET BOX 1.698768
## ASSORTED COLOUR BIRD ORNAMENT 1.334674
## PACK OF 72 RETRO SPOT CAKE CASES 3.358982
## JUMBO BAG BAROQUE BLACK WHITE
## WHITE HANGING HEART T-LIGHT HOLDER 1.697648
## REGENCY CAKESTAND 3 TIER 1.779285
## STRAWBERRY CERAMIC TRINKET BOX 2.495209
## ASSORTED COLOUR BIRD ORNAMENT 1.379079
## PACK OF 72 RETRO SPOT CAKE CASES 1.996242
Hierarchical clustering based on Jaccard distance was applied to a random sample of transactions.
While the dendrogram technically represents transaction similarities, it is difficult to interpret visually due to:
As a result, the dendrogram does not provide clear, actionable clusters in its current form.
trans_sample <- trans[sample(seq_along(trans), SIM_SAMPLE_N)]
d_trans <- dissimilarity(trans_sample, method = "jaccard", items = FALSE)
hc_trans <- hclust(d_trans, method = "ward.D2")
plot(hc_trans, main = "Dendrogram: Transaction Similarity (Jaccard)")
A similar clustering approach was applied to the most frequent items in the dataset.
Although the dendrogram captures item-level similarity based on co-occurrence patterns, it suffers from the same limitations:
This highlights an important methodological limitation of hierarchical clustering when applied to high-dimensional retail data.
top_items_sim <- names(sort(itemFrequency(trans), decreasing = TRUE))[1:ITEM_SIM_TOPN]
d_items <- dissimilarity(trans[, top_items_sim], method = "jaccard", items = TRUE)
hc_items <- hclust(d_items, method = "ward.D2")
plot(hc_items, main = paste0("Dendrogram: Item Similarity (Top ", ITEM_SIM_TOPN, ")"))
This section maps products into broad categories (using simple keyword rules), aggregates transactions by category, and mines association rules on categories.
to_category <- function(x) {
x <- toupper(x)
dplyr::case_when(
str_detect(x, "CHRISTMAS|XMAS|NOEL|SANTA") ~ "CHRISTMAS",
str_detect(x, "HEART") ~ "HEART_THEME",
str_detect(x, "BAG|TOTE|JUMBO") ~ "BAGS",
str_detect(x, "MUG|CUP|TEA|COFFEE") ~ "DRINKWARE",
str_detect(x, "CANDLE|T-LIGHT|TEALIGHT|LANTERN") ~ "CANDLES_LIGHT",
str_detect(x, "WRAP|RIBBON|TAG|CARD") ~ "GIFT_WRAP",
str_detect(x, "PLATE|BOWL|KITCHEN|PAN|BAKE") ~ "KITCHEN",
str_detect(x, "TOY|GAME|PLAY") ~ "TOYS",
TRUE ~ "OTHER"
)
}
top_prod <- names(sort(itemFrequency(trans), decreasing = TRUE))[1:CAT_PARAMS$top_products]
trans_top_prod <- trans[, top_prod]
itemInfo(trans_top_prod) <- data.frame(
labels = itemLabels(trans_top_prod),
category = sapply(itemLabels(trans_top_prod), to_category),
stringsAsFactors = FALSE
)
trans_cat <- aggregate(trans_top_prod, by = "category")
summary(trans_cat)
## transactions as itemMatrix in sparse format with
## 21002 rows (elements/itemsets/transactions) and
## 9 columns (items) and a density of 0.3012676
##
## most frequent items:
## OTHER HEART_THEME DRINKWARE BAGS GIFT_WRAP (Other)
## 16203 10038 7271 7213 6042 10178
##
## element (itemset/transaction) length distribution:
## sizes
## 0 1 2 3 4 5 6 7 8 9
## 2503 3821 3915 3950 3209 1942 1004 426 196 36
##
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.000 1.000 3.000 2.711 4.000 9.000
##
## includes extended item information - examples:
## labels category
## 1 BAGS BAGS
## 2 CANDLES_LIGHT CANDLES_LIGHT
## 3 CHRISTMAS CHRISTMAS
inspect(head(trans_cat, 5))
## items
## [1] {DRINKWARE, OTHER}
## [2] {}
## [3] {HEART_THEME, OTHER}
## [4] {DRINKWARE, GIFT_WRAP, HEART_THEME, OTHER}
## [5] {BAGS, HEART_THEME}
rules_cat <- apriori(
trans_cat,
parameter = list(
supp = CAT_PARAMS$supp,
conf = CAT_PARAMS$conf,
minlen = 2,
maxlen = 3
),
control = list(verbose = FALSE)
)
rules_cat <- rules_cat[!is.redundant(rules_cat)]
summary(rules_cat)
## set of 119 rules
##
## rule length distribution (lhs + rhs):sizes
## 2 3
## 35 84
##
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 2.000 2.000 3.000 2.706 3.000 3.000
##
## summary of quality measures:
## support confidence coverage lift
## Min. :0.05004 Min. :0.3010 Min. :0.05238 Min. :1.161
## 1st Qu.:0.06687 1st Qu.:0.4767 1st Qu.:0.10132 1st Qu.:1.270
## Median :0.09475 Median :0.5828 Median :0.16422 Median :1.484
## Mean :0.12001 Mean :0.6287 Mean :0.20816 Mean :1.526
## 3rd Qu.:0.14699 3rd Qu.:0.7385 3rd Qu.:0.26645 3rd Qu.:1.700
## Max. :0.43443 Max. :0.9823 Max. :0.77150 Max. :2.426
## count
## Min. :1051
## 1st Qu.:1404
## Median :1990
## Mean :2520
## 3rd Qu.:3087
## Max. :9124
##
## mining info:
## data ntransactions support confidence
## trans_cat 21002 0.05 0.3
## call
## apriori(data = trans_cat, parameter = list(supp = CAT_PARAMS$supp, conf = CAT_PARAMS$conf, minlen = 2, maxlen = 3), control = list(verbose = FALSE))
inspect(head(sort(rules_cat, by = "lift", decreasing = TRUE), 15))
## lhs rhs support confidence
## [1] {BAGS, DRINKWARE} => {KITCHEN} 0.06185125 0.3766309
## [2] {DRINKWARE, GIFT_WRAP} => {KITCHEN} 0.05247119 0.3581410
## [3] {GIFT_WRAP, KITCHEN} => {DRINKWARE} 0.05247119 0.7155844
## [4] {BAGS, KITCHEN} => {DRINKWARE} 0.06185125 0.7052117
## [5] {BAGS, HEART_THEME} => {KITCHEN} 0.06423198 0.3089077
## [6] {HEART_THEME, KITCHEN} => {DRINKWARE} 0.06951719 0.6860902
## [7] {DRINKWARE, HEART_THEME} => {KITCHEN} 0.06951719 0.3035974
## [8] {CANDLES_LIGHT, GIFT_WRAP} => {DRINKWARE} 0.05004285 0.6750161
## [9] {GIFT_WRAP, HEART_THEME} => {KITCHEN} 0.05199505 0.3009923
## [10] {DRINKWARE, HEART_THEME} => {CANDLES_LIGHT} 0.07932578 0.3464338
## [11] {CHRISTMAS, OTHER} => {GIFT_WRAP} 0.05470908 0.5424929
## [12] {DRINKWARE, KITCHEN} => {GIFT_WRAP} 0.05247119 0.5417896
## [13] {BAGS, DRINKWARE} => {CANDLES_LIGHT} 0.05670888 0.3453175
## [14] {BAGS, CANDLES_LIGHT} => {DRINKWARE} 0.05670888 0.6501092
## [15] {GIFT_WRAP, HEART_THEME} => {CANDLES_LIGHT} 0.05947053 0.3442668
## coverage lift count
## [1] 0.16422246 2.425637 1299
## [2] 0.14650986 2.306556 1102
## [3] 0.07332635 2.066938 1102
## [4] 0.08770593 2.036977 1299
## [5] 0.20793258 1.989476 1349
## [6] 0.10132368 1.981745 1460
## [7] 0.22897819 1.955275 1460
## [8] 0.07413580 1.949758 1051
## [9] 0.17274545 1.938497 1092
## [10] 0.22897819 1.887368 1666
## [11] 0.10084754 1.885706 1149
## [12] 0.09684792 1.883261 1102
## [13] 0.16422246 1.881286 1191
## [14] 0.08722979 1.877815 1191
## [15] 0.17274545 1.875562 1249
plot(
head(sort(rules_cat, by = "lift", decreasing = TRUE), 30),
method = "graph",
engine = "htmlwidget"
)
This section prepares a binary feature matrix from the top items and defines a simple class label based on basket size (upper quartile vs. the rest).
top_feat <- names(sort(itemFrequency(trans), decreasing = TRUE))[1:CBA_PARAMS$top_features]
trans_feat <- trans[, top_feat]
X <- as(trans_feat, "matrix")
X <- as.data.frame(ifelse(X > 0, 1, 0))
basket_size <- size(trans)
threshold <- quantile(basket_size, 0.75)
class <- factor(ifelse(basket_size >= threshold, "LARGE_BASKET", "NORMAL_BASKET"))
cba_df <- cbind(class = class, X) %>%
mutate(across(everything(), as.factor))
dplyr::glimpse(cba_df)
## Rows: 21,002
## Columns: 81
## $ class <fct> NORMAL_BASKET, NORMAL_BASKET, NOR…
## $ `WHITE HANGING HEART T-LIGHT HOLDER` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, …
## $ `REGENCY CAKESTAND 3 TIER` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `STRAWBERRY CERAMIC TRINKET BOX` <fct> 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `ASSORTED COLOUR BIRD ORNAMENT` <fct> 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `PACK OF 72 RETRO SPOT CAKE CASES` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `60 TEATIME FAIRY CAKE CASES` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `HOME BUILDING BLOCK WORD` <fct> 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `JUMBO BAG RED RETROSPOT` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `LUNCH BAG RED SPOTTY` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `JUMBO STORAGE BAG SUKI` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `PACK OF 60 PINK PAISLEY CAKE CASES` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `WOODEN FRAME ANTIQUE WHITE` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `LUNCH BAG BLACK SKULL.` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `LUNCH BAG SUKI DESIGN` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `HEART OF WICKER LARGE` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `LOVE BUILDING BLOCK WORD` <fct> 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `REX CASH+CARRY JUMBO SHOPPER` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `RED HANGING HEART T-LIGHT HOLDER` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `JUMBO SHOPPER VINTAGE RED PAISLEY` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `JUMBO BAG STRAWBERRY` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `HEART OF WICKER SMALL` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `HOT WATER BOTTLE TEA AND SYMPATHY` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `PARTY BUNTING` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `PLEASE ONE PERSON METAL SIGN` <fct> 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `SWEETHEART CERAMIC TRINKET BOX` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `VINTAGE SNAP CARDS` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, …
## $ `SCOTTIE DOG HOT WATER BOTTLE` <fct> 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, …
## $ `LUNCH BAG SPACEBOY DESIGN` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `BAKING SET 9 PIECE RETROSPOT` <fct> 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, …
## $ `JUMBO BAG BAROQUE BLACK WHITE` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `PAPER CHAIN KIT 50'S CHRISTMAS` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `WOODEN PICTURE FRAME WHITE FINISH` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `HANGING HEART ZINC T-LIGHT HOLDER` <fct> 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, …
## $ `LUNCH BAG CARS BLUE` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `LUNCH BAG WOODLAND` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `SET/20 RED SPOTTY PAPER NAPKINS` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `CHOCOLATE HOT WATER BOTTLE` <fct> 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, …
## $ `ANTIQUE SILVER TEA GLASS ETCHED` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `ZINC METAL HEART DECORATION` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `SMALL POPCORN HOLDER` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `SET/5 RED SPOTTY LID GLASS BOWLS` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `GIN + TONIC DIET METAL SIGN` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `72 SWEETHEART FAIRY CAKE CASES` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `FELTCRAFT 6 FLOWER FRIENDS` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `BATHROOM METAL SIGN` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, …
## $ `RECYCLING BAG RETROSPOT` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `NATURAL SLATE HEART CHALKBOARD` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `PACK OF 72 SKULL CAKE CASES` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `6 RIBBONS RUSTIC CHARM` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `VINTAGE UNION JACK BUNTING` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `PINK CREAM FELT CRAFT TRINKET BOX` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `HAND OVER THE CHOCOLATE SIGN` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `LUNCH BAG PINK RETROSPOT` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `RED WOOLLY HOTTIE WHITE HEART.` <fct> 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, …
## $ `JUMBO BAG PINK WITH WHITE SPOTS` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `VICTORIAN GLASS HANGING T-LIGHT` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `CREAM HEART CARD HOLDER` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `PAPER BUNTING RETRO SPOTS` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `RED SPOTTY CHARLOTTE BAG` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `JUMBO BAG PINK VINTAGE PAISLEY` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `RETRO SPOT TEA SET CERAMIC 11 PC` <fct> 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, …
## $ `WOODLAND CHARLOTTE BAG` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ POSTAGE <fct> 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, …
## $ `JUMBO BAG SCANDINAVIAN PAISLEY` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `VINTAGE HEADS AND TAILS CARD GAME` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `RED GINGHAM ROSE JEWELLERY BOX` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `DOTCOM POSTAGE` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `COOK WITH WINE METAL SIGN` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `PACK OF 6 BIRDY GIFT TAGS` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `RED TOADSTOOL LED NIGHT LIGHT` <fct> 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, …
## $ `PACK OF 60 DINOSAUR CAKE CASES` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `HANGING HEART JAR T-LIGHT HOLDER` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `WOOD S/3 CABINET ANT WHITE FINISH` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `FELTCRAFT BUTTERFLY HEARTS` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `PAPER CHAIN KIT VINTAGE CHRISTMAS` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `RED RETROSPOT CAKE STAND` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `JUMBO BAG OWLS` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `ROUND SNACK BOXES SET OF4 WOODLAND` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `NO SINGING METAL SIGN` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `STRAWBERRY CHARLOTTE BAG` <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
In this step, we apply Classification Based on Associations (CBA), which combines association rule mining with classification. Unlike standard Apriori rules that aim to discover general co-purchase patterns, CBA learns class association rules (CARs) that predict a predefined target label.
n <- nrow(cba_df)
train_id <- sample(seq_len(n), size = floor(CBA_PARAMS$split * n))
train <- cba_df[train_id, ]
test <- cba_df[-train_id, ]
cba_model <- CBA(
class ~ .,
data = train,
supp = CBA_PARAMS$supp,
conf = CBA_PARAMS$conf,
pruning = "M1"
)
pred <- predict(cba_model, test)
caret::confusionMatrix(reference = test$class, data = pred)
inspect(cba_model$rules)
This report demonstrated a complete market basket analysis workflow on retail transaction data.
Key takeaways:
Overall, association rule mining proves to be a powerful and interpretable technique for understanding customer purchasing behavior and supporting data-driven decisions in retail analytics.