This data is downloaded from Kaggle[https://www.kaggle.com/carrie1/ecommerce-data] and its original source is UCI Machine Learning Repository

Loading libraries

library(data.table)
data.table 1.12.6 using 2 threads (see ?getDTthreads).  Latest news: r-datatable.com

Attaching package: 㤼㸱data.table㤼㸲

The following objects are masked from 㤼㸱package:dplyr㤼㸲:

    between, first, last

The following object is masked from 㤼㸱package:purrr㤼㸲:

    transpose
library(dplyr)
library(ggplot2)
library(stringr)
library(tidyr)
library(tidyverse)
library(arules)

Attaching package: 㤼㸱arules㤼㸲

The following object is masked from 㤼㸱package:car㤼㸲:

    recode

The following object is masked from 㤼㸱package:dplyr㤼㸲:

    recode

The following objects are masked from 㤼㸱package:base㤼㸲:

    abbreviate, write
library(arulesViz)
Loading required package: grid
Registered S3 method overwritten by 'seriation':
  method         from 
  reorder.hclust gclus
Registered S3 methods overwritten by 'htmltools':
  method               from         
  print.html           tools:rstudio
  print.shiny.tag      tools:rstudio
  print.shiny.tag.list tools:rstudio
Registered S3 method overwritten by 'htmlwidgets':
  method           from         
  print.htmlwidget tools:rstudio
library(knitr)
library(gridExtra)

Attaching package: 㤼㸱gridExtra㤼㸲

The following object is masked from 㤼㸱package:randomForest㤼㸲:

    combine

The following object is masked from 㤼㸱package:dplyr㤼㸲:

    combine
library(lubridate)

Attaching package: 㤼㸱lubridate㤼㸲

The following objects are masked from 㤼㸱package:data.table㤼㸲:

    hour, isoweek, mday, minute, month, quarter, second, wday, week, yday, year

The following object is masked from 㤼㸱package:base㤼㸲:

    date
library(plyr)
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
You have loaded plyr after dplyr - this is likely to cause problems.
If you need functions from both plyr and dplyr, please load plyr first, then dplyr:
library(plyr); library(dplyr)
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Attaching package: 㤼㸱plyr㤼㸲

The following object is masked from 㤼㸱package:lubridate㤼㸲:

    here

The following objects are masked from 㤼㸱package:dplyr㤼㸲:

    arrange, count, desc, failwith, id, mutate, rename, summarise, summarize

The following object is masked from 㤼㸱package:purrr㤼㸲:

    compact

Loading data

dim(df_data)
[1] 406829      8

Data Cleaning and Feature Engineering

#Removing NAs
df_data <- df_data %>%
  drop_na()


#Converting everything to factors
df_data <- df_data %>% 
  mutate(InvoiceNo=as.factor(InvoiceNo), StockCode=as.factor(StockCode), 
         InvoiceDate=as.Date(InvoiceDate, '%m/%d/%Y %H:%M'), CustomerID=as.factor(CustomerID), 
         Country=as.factor(Country))

Creating Recency,Frequency and Monetory variables for every user for RFM Analysis !


df_RFM <- df_data %>% 
  group_by(CustomerID) %>% 
  summarise(recency=as.numeric(as.Date("2012-01-01")-max(InvoiceDate)),
            frequenci=n_distinct(InvoiceNo), monitery= sum(total_dolar)/n_distinct(InvoiceNo)) 

#lets see how these variables are distributed

ggplot(df_RFM,aes(x=recency)) + geom_histogram()

ggplot(df_RFM,aes(x=frequenci)) + geom_histogram() 

ggplot(df_RFM,aes(x=monitery)) + geom_histogram()

NA
NA

Now these users can be clustered into different group by :
1.Scoring them on quantile values of Recency,Frequency and Monitory 2.K-means clustering 3.Heirarchical clustering

Lets choose heirarchial clustering here!

Market Basket Analysis to see which products were sold together! This can be combined with the targetting/discounting strategy above to show the products which have high frequency of being bought together!

class(tr)
[1] "transactions"
attr(,"package")
[1] "arules"

Lets see how does our products look

itemFrequencyPlot(tr,topN=20,type="absolute",col=brewer.pal(8,'Pastel2'), main="Absolute Item Frequency Plot")

#Hanging T-Light holder is sold the most followed by Regency Cakestand 3 tier

#Using apriori algorithm to set up association rules 
association.rules <- apriori(tr, parameter = list(supp=0.001, conf=0.8,maxlen=10))
Apriori

Parameter specification:

Algorithmic control:

Absolute minimum support count: 22 

set item appearances ...[0 item(s)] done [0.03s].
set transactions ...[8181 item(s), 22191 transaction(s)] done [0.56s].
sorting and recoding items ... [2623 item(s)] done [0.03s].
creating transaction tree ... done [0.02s].
checking subsets of size 1 2 3 4 5 6 7 8 9 10
Mining stopped (maxlen reached). Only patterns up to a length of 10 returned!
 done [0.64s].
writing ... [49122 rule(s)] done [0.10s].
creating S4 object  ... done [0.08s].
summary(association.rules)
set of 49122 rules

rule length distribution (lhs + rhs):sizes
    2     3     4     5     6     7     8     9    10 
  105  2111  6854 16424 14855  6102  1937   613   121 

   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  2.000   5.000   5.000   5.499   6.000  10.000 

summary of quality measures:
    support           confidence          lift             count       
 Min.   :0.001036   Min.   :0.8000   Min.   :  9.846   Min.   : 23.00  
 1st Qu.:0.001082   1st Qu.:0.8333   1st Qu.: 22.237   1st Qu.: 24.00  
 Median :0.001262   Median :0.8788   Median : 28.760   Median : 28.00  
 Mean   :0.001417   Mean   :0.8849   Mean   : 64.589   Mean   : 31.45  
 3rd Qu.:0.001532   3rd Qu.:0.9259   3rd Qu.: 69.200   3rd Qu.: 34.00  
 Max.   :0.015997   Max.   :1.0000   Max.   :715.839   Max.   :355.00  

mining info:

We can see that Billboard font design & Wrap, Art lights & funk monkey, Swiss roll towel and chocolate spots have very high probability of being sold together, as compared to being sold individually!

LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpUaGlzIGRhdGEgaXMgZG93bmxvYWRlZCBmcm9tIEthZ2dsZVtodHRwczovL3d3dy5rYWdnbGUuY29tL2NhcnJpZTEvZWNvbW1lcmNlLWRhdGFdIGFuZCBpdHMgb3JpZ2luYWwgc291cmNlIGlzIFVDSSBNYWNoaW5lIExlYXJuaW5nIFJlcG9zaXRvcnkgDQoNCkxvYWRpbmcgbGlicmFyaWVzDQoNCmBgYHtyfQ0KbGlicmFyeShkYXRhLnRhYmxlKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoc3RyaW5ncikNCmxpYnJhcnkodGlkeXIpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoYXJ1bGVzKQ0KbGlicmFyeShhcnVsZXNWaXopDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShncmlkRXh0cmEpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCmxpYnJhcnkocGx5cikNCmBgYA0KDQpMb2FkaW5nIGRhdGENCmBgYHtyfQ0KZGZfZGF0YTwtIHJlYWQuY3N2KCJkYXRhLmNzdiIpDQojZGltZW5zaW9ucyBvZiB0aGUgZGF0YQ0KZGltKGRmX2RhdGEpDQojY2hlY2tpbmcgbWlzc2luZyBkYXRhDQpjb2xTdW1zKGlzLm5hKGRmX2RhdGEpKQ0KDQoNCiMxLDM1LDA4MCByb3dzIG91dCBvZiA1LDQxLDkwOSByb3dzIGhhdmUgbWlzc2luZyBjdXN0b21lciBpZCENCg0KI2NoZWNraW5nIHVuaXF1ZSBjdXN0b21lciBpZHMNCm5fZGlzdGluY3QoZGZfZGF0YSRDdXN0b21lcklEKQ0Kbl9kaXN0aW5jdChkZl9kYXRhJEludm9pY2VObykNCg0KI0xvb2tzIGxpa2UgNDM3MyBjdXN0b21lcnMgaGF2ZSBtYWRlIDI1LDkwMCBwdXJjaGFzZXMgDQpgYGANCg0KRGF0YSBDbGVhbmluZyBhbmQgRmVhdHVyZSBFbmdpbmVlcmluZw0KDQpgYGB7cn0NCiNSZW1vdmluZyBOQXMNCmRmX2RhdGEgPC0gZGZfZGF0YSAlPiUNCiAgZHJvcF9uYSgpDQoNCg0KI0NvbnZlcnRpbmcgZXZlcnl0aGluZyB0byBmYWN0b3JzDQpkZl9kYXRhIDwtIGRmX2RhdGEgJT4lIA0KICBtdXRhdGUoSW52b2ljZU5vPWFzLmZhY3RvcihJbnZvaWNlTm8pLCBTdG9ja0NvZGU9YXMuZmFjdG9yKFN0b2NrQ29kZSksIA0KICAgICAgICAgSW52b2ljZURhdGU9YXMuRGF0ZShJbnZvaWNlRGF0ZSwgJyVtLyVkLyVZICVIOiVNJyksIEN1c3RvbWVySUQ9YXMuZmFjdG9yKEN1c3RvbWVySUQpLCANCiAgICAgICAgIENvdW50cnk9YXMuZmFjdG9yKENvdW50cnkpKQ0KDQojQWRkaW5nIGEgbmV3IHZhcmlhYmxlIHRvdGFsX2RvbGxhcg0KZGZfZGF0YSA8LSBkZl9kYXRhICU+JSANCiAgbXV0YXRlKHRvdGFsX2RvbGFyID0gUXVhbnRpdHkqVW5pdFByaWNlKQ0KDQoNCmBgYA0KDQoNCg0KQ3JlYXRpbmcgUmVjZW5jeSxGcmVxdWVuY3kgYW5kIE1vbmV0b3J5IHZhcmlhYmxlcyBmb3IgZXZlcnkgdXNlciBmb3IgUkZNIEFuYWx5c2lzICENCmBgYHtyfQ0KDQpkZl9SRk0gPC0gZGZfZGF0YSAlPiUgDQogIGdyb3VwX2J5KEN1c3RvbWVySUQpICU+JSANCiAgc3VtbWFyaXNlKHJlY2VuY3k9YXMubnVtZXJpYyhhcy5EYXRlKCIyMDEyLTAxLTAxIiktbWF4KEludm9pY2VEYXRlKSksDQogICAgICAgICAgICBmcmVxdWVuY2k9bl9kaXN0aW5jdChJbnZvaWNlTm8pLCBtb25pdGVyeT0gc3VtKHRvdGFsX2RvbGFyKS9uX2Rpc3RpbmN0KEludm9pY2VObykpIA0KDQojbGV0cyBzZWUgaG93IHRoZXNlIHZhcmlhYmxlcyBhcmUgZGlzdHJpYnV0ZWQNCg0KZ2dwbG90KGRmX1JGTSxhZXMoeD1yZWNlbmN5KSkgKyBnZW9tX2hpc3RvZ3JhbSgpDQpnZ3Bsb3QoZGZfUkZNLGFlcyh4PWZyZXF1ZW5jaSkpICsgZ2VvbV9oaXN0b2dyYW0oKSANCmdncGxvdChkZl9SRk0sYWVzKHg9bW9uaXRlcnkpKSArIGdlb21faGlzdG9ncmFtKCkNCg0KDQpgYGANCk5vdyB0aGVzZSB1c2VycyBjYW4gYmUgY2x1c3RlcmVkIGludG8gZGlmZmVyZW50IGdyb3VwIGJ5IDogICAgICAgIA0KMS5TY29yaW5nIHRoZW0gb24gcXVhbnRpbGUgdmFsdWVzIG9mIFJlY2VuY3ksRnJlcXVlbmN5IGFuZCBNb25pdG9yeQ0KMi5LLW1lYW5zIGNsdXN0ZXJpbmcNCjMuSGVpcmFyY2hpY2FsIGNsdXN0ZXJpbmcNCg0KTGV0cyBjaG9vc2UgaGVpcmFyY2hpYWwgY2x1c3RlcmluZyBoZXJlISANCg0KYGBge3J9DQpkZl9SRk0yIDwtIGRmX1JGTQ0Kcm93Lm5hbWVzKGRmX1JGTTIpIDwtIGRmX1JGTTIkQ3VzdG9tZXJJRA0KZGZfUkZNMiRDdXN0b21lcklEIDwtIE5VTEwNCg0KZGZfUkZNMiA8LSBzY2FsZShkZl9SRk0yKQ0Kc3VtbWFyeShkZl9SRk0yKQ0KDQpkIDwtIGRpc3QoZGZfUkZNMikNCmMgPC0gaGNsdXN0KGQsIG1ldGhvZCA9ICd3YXJkLkQyJykNCg0Kc3ViX2dycCA8LSBjdXRyZWUoYywgayA9IDQpDQp0YWJsZShzdWJfZ3JwKQ0KDQpkZl9SRk0yIDwtIGRhdGEuZnJhbWUoZGZfUkZNMikNCg0KZGZfUkZNMiAlPiUNCiAgbXV0YXRlKGNsdXN0ZXIgPSBzdWJfZ3JwKSAlPiUNCiAgaGVhZA0KDQpkZl9SRk0zPC0gZGZfUkZNICU+JQ0KICBtdXRhdGUoY2x1c3RlciA9IHN1Yl9ncnApDQoNCmRmX1JGTTMgJT4lIGZpbHRlcihjbHVzdGVyPT0xKSAlPiUgaGVhZCg2MCkNCg0KcGxvdChjLCBjZXggPSAwLjYpDQpyZWN0LmhjbHVzdChjLCBrID0gNCwgYm9yZGVyID0gMjo1KQ0KaW5zdGFsbC5wYWNrYWdlcygiZmFjdG9leHRyYSIpDQpsaWJyYXJ5KGZhY3RvZXh0cmEpDQpmdml6X2NsdXN0ZXIobGlzdChkYXRhID0gZGZfUkZNMiwgY2x1c3RlciA9IHN1Yl9ncnApKQ0KDQojSXQgaGFzIGRpdmlkZWQgdGhlIGN1c3RvbWVycyBpbnRvIDQgY3VzdG9tZXIgc2VnbWVudHMgDQojMS4gTG93IEZyZXF1ZW5jeSBhbmQgdmVyeSBvbGQNCiMyLiBMb3cgRnJlcXVlbmN5IGFuZCBxdWl0ZSByZWNlbnQgDQojMy4gSGlnaCBtb25ldG9yeSB2YWx1ZQ0KIzQuIEhpZ2ggZnJlcXVlbmN5IGFuZCB2ZXJ5IHJlY2VudA0KDQojVGhlIGNsdXN0ZXJzIGFib3ZlIGNvdWxkIGJlIHVzZWQgZm9yIGFkIHRhcmdldHRpbmcgc3RyYXRlZ2llcywgb3IgZGVjaWRpbmcgd2hpY2ggb2ZmZXIgb3IgZGlzY291bnQgdG8gYmUgZ2l2ZW4gdG8gY3VzdG9tZXJzLg0KYGBgDQoNCk1hcmtldCBCYXNrZXQgQW5hbHlzaXMgdG8gc2VlIHdoaWNoIHByb2R1Y3RzIHdlcmUgc29sZCB0b2dldGhlciEgVGhpcyBjYW4gYmUgY29tYmluZWQgd2l0aCB0aGUgdGFyZ2V0dGluZy9kaXNjb3VudGluZyBzdHJhdGVneSBhYm92ZSB0byBzaG93IHRoZSBwcm9kdWN0cyB3aGljaCBoYXZlIGhpZ2ggZnJlcXVlbmN5IG9mIGJlaW5nIGJvdWdodCB0b2dldGhlciENCg0KDQpgYGB7cn0NCnJldGFpbDwtIGRmX2RhdGENCmRmX2RhdGEgPC0gZGZfZGF0YSAlPiVkcm9wX25hKCkNCnJldGFpbCA8LXJldGFpbCAlPiUgbXV0YXRlKERlc2NyaXB0aW9uID0gYXMuZmFjdG9yKERlc2NyaXB0aW9uKSkNClRyYW5zVGltZTwtIGZvcm1hdChyZXRhaWwkSW52b2ljZURhdGUsIiVIOiVNOiVTIikNCnN0cihyZXRhaWwpDQoNCkludm9pY2VObyA8LSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXRhaWwkSW52b2ljZU5vKSkNCg0KDQoNCg0KdHJhbnNhY3Rpb25EYXRhIDwtIGRkcGx5KHJldGFpbCxjKCJJbnZvaWNlTm8iLCJJbnZvaWNlRGF0ZSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKGRmMSlwYXN0ZShkZjEkRGVzY3JpcHRpb24sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxhcHNlID0gIiwiKSkNCg0KI3NldCBjb2x1bW4gSW52b2ljZU5vIG9mIGRhdGFmcmFtZSB0cmFuc2FjdGlvbkRhdGEgIA0KdHJhbnNhY3Rpb25EYXRhJEludm9pY2VObyA8LSBOVUxMDQojc2V0IGNvbHVtbiBEYXRlIG9mIGRhdGFmcmFtZSB0cmFuc2FjdGlvbkRhdGENCnRyYW5zYWN0aW9uRGF0YSREYXRlIDwtIE5VTEwNCiNSZW5hbWUgY29sdW1uIHRvIGl0ZW1zDQpjb2xuYW1lcyh0cmFuc2FjdGlvbkRhdGEpIDwtIGMoIml0ZW1zIikNCg0KI1NhdmluZyB0aGlzIGluIENTViBmb3JtYXQgYW5kIHVzZSBhIHJlYWQudHJhbnNhY3Rpb25zIGZ1bmN0aW9uIGZyb20gYXJ1bGVzIHBhY2thZ2UgdG8gcmVhZCB0aGUgZGF0YQ0Kd3JpdGUuY3N2KHRyYW5zYWN0aW9uRGF0YSwibWFya2V0X2Jhc2tldF90cmFuc2FjdGlvbnMuY3N2IiwgcXVvdGUgPSBGQUxTRSwgcm93Lm5hbWVzID0gRkFMU0UpDQp0ciA8LSByZWFkLnRyYW5zYWN0aW9ucygnbWFya2V0X2Jhc2tldF90cmFuc2FjdGlvbnMuY3N2JywgZm9ybWF0ID0gJ2Jhc2tldCcsIHNlcD0nLCcpDQoNCmBgYA0KDQpMZXRzIHNlZSBob3cgZG9lcyBvdXIgcHJvZHVjdHMgbG9vaw0KDQpgYGB7cn0NCml0ZW1GcmVxdWVuY3lQbG90KHRyLHRvcE49MjAsdHlwZT0iYWJzb2x1dGUiLGNvbD1icmV3ZXIucGFsKDgsJ1Bhc3RlbDInKSwgbWFpbj0iQWJzb2x1dGUgSXRlbSBGcmVxdWVuY3kgUGxvdCIpDQojSGFuZ2luZyBULUxpZ2h0IGhvbGRlciBpcyBzb2xkIHRoZSBtb3N0IGZvbGxvd2VkIGJ5IFJlZ2VuY3kgQ2FrZXN0YW5kIDMgdGllcg0KDQojVXNpbmcgYXByaW9yaSBhbGdvcml0aG0gdG8gc2V0IHVwIGFzc29jaWF0aW9uIHJ1bGVzIA0KYXNzb2NpYXRpb24ucnVsZXMgPC0gYXByaW9yaSh0ciwgcGFyYW1ldGVyID0gbGlzdChzdXBwPTAuMDAxLCBjb25mPTAuOCxtYXhsZW49MTApKQ0Kc3VtbWFyeShhc3NvY2lhdGlvbi5ydWxlcykNCg0KDQpgYGANCg0KYGBge3J9DQppbnNwZWN0KGFzc29jaWF0aW9uLnJ1bGVzWzE6MTBdKQ0KDQojIEZpbHRlciBydWxlcyB3aXRoIGNvbmZpZGVuY2UgZ3JlYXRlciB0aGFuIDAuNCBvciA0MCUNCnN1YlJ1bGVzPC1hc3NvY2lhdGlvbi5ydWxlc1txdWFsaXR5KGFzc29jaWF0aW9uLnJ1bGVzKSRjb25maWRlbmNlPjAuNF0NCiNQbG90IFN1YlJ1bGVzDQpwbG90KHN1YlJ1bGVzKQ0KDQojVGhlIHJ1bGVzIG9mIGxvdyBzdXBwb3J0IGFuZCBoaWdoIGNvbmZpZGVuY2Ugd2l0aCBjb25zaWRlcmFibGUgY291bnQgYXJlIGludGVyZXN0aW5nIQ0KDQojU29ydGluZyBteSBsaWZ0IGhlcmUgdG8gc2VlIHByb2JhYmlsaXR5IG9mIGl0ZW1zIHdoaWNoIGNhbiBzZWxsIHRvZ2V0aGVyIGJldHRlciB0aGFuIGJlaW5nIHNvbGQgYWxvbmUNCg0KaW5zcGVjdChoZWFkKGFzc29jaWF0aW9uLnJ1bGVzLCBuID0gMTAsIGJ5ID0gImxpZnQiKSkNCg0KDQpgYGANCg0KV2UgY2FuIHNlZSB0aGF0IEJpbGxib2FyZCBmb250IGRlc2lnbiAmIFdyYXAsIEFydCBsaWdodHMgJiBmdW5rIG1vbmtleSwgU3dpc3Mgcm9sbCB0b3dlbCBhbmQgY2hvY29sYXRlIHNwb3RzIGhhdmUgdmVyeSBoaWdoIHByb2JhYmlsaXR5IG9mIGJlaW5nIHNvbGQgdG9nZXRoZXIsIGFzIGNvbXBhcmVkIHRvIGJlaW5nIHNvbGQgaW5kaXZpZHVhbGx5IQ0KDQoNCg0KDQoNCg0KDQoNCg0KDQo=