How People Order Online? Analysis of 3 million Instacart orders.
BDA-503 - Term Project - Berk Orbay
As group cleveR, we will work on the online order behaviors of Instacart customers witH group members:
#About the Company Instacart is a San Francisco based online shopping website that provide service for online grocery shopping orders and same-day delivery service from various local stores. Instacart has founded in San Francisco on June 2012 and operating in 39 states across United States of America today.
Our Purpose
In this project, our work will be composed of 3 main areas.
1.Exploratory Analysis on the data
2.Segmentation
3.Recommendation
Our study will begin with exploratory data analysis. We will try to explain customer behaviours and pruchasing patterns.We will try to reach facts like “what time of the day customers order most”, “What is avarege basket size?”, “Which products ordered together” etc.
After exploratory analysis, we will try to group customers according to their purchasing behaviours. We will exemine their orders according to product category, order time, order amount in order to find similarities and differences.
At the end, we will try to find what a customer most likely to buy in his/her next order and try to suggest them the products.
About the Data
Instacart Market Basket web site has a recommendation feature, suggestion the users some items that he / she may buy again. Its dataset is provided as for non-commercial use. Our task is how consumers discover and purchase groceries by predicting which item will be reordered on the next order.
The data provided should give a better understanding of both the characteristics of its products and the relationship with the orders. The only information provided about users is their sequence of orders and the products in those orders. All of the IDs in the dataset are randomized and cannot be linked back to any other ID. It includes orders from many different retailers and is a heavily biased subset of Instacart’s production data. No retailer ID is provided.
The dataset consists of information about 3.4 million grocery orders which is distributed to six csv files; “orders”, “products”, “order_products”, “order_products_prior”, “aisles”, “departments”. A definition of each variable and an explanation are given in the following sections.
You can reach dataset from instacard. Lets look at the row numbers and variables in each file:
Products
This file contains the names of the products with their corresponding product_id. Furthermore the aisle and department are included.
- product_id: product identifier
- product_name: name of the product
- aisle_id: foreign key
- department_id: foreign key
products<-read.csv("data/products.csv")
kable(head(products,5),align="l")
product_id | product_name | aisle_id | department_id |
---|---|---|---|
1 | Chocolate Sandwich Cookies | 61 | 19 |
2 | All-Seasons Salt | 104 | 13 |
3 | Robust Golden Unsweetened Oolong Tea | 94 | 7 |
4 | Smart Ones Classic Favorites Mini Rigatoni With Vodka Cream Sauce | 38 | 1 |
5 | Green Chile Anytime Sauce | 5 | 13 |
Aisles
This file contains the names of the aisles with their aisle_id and name of the aisle.
- aisle_id: aisle identifier
- aisle: the name of the aisle
aisles<-read.csv("data/aisles.csv")
kable(head(aisles,5),align="l")
aisle_id | aisle |
---|---|
1 | prepared soups salads |
2 | specialty cheeses |
3 | energy granola bars |
4 | instant foods |
5 | marinades meat preparation |
Departments
This file contains the names of the departments with their department_id and name of the department.
- department_id: department identifier
- department: the name of the department
departments<-read.csv("data/departments.csv")
kable(head(departments,5),align="l")
department_id | department |
---|---|
1 | frozen |
2 | other |
3 | bakery |
4 | produce |
5 | alcohol |
Orders
This file gives a list of all orders we have in the dataset. 1 row per order. For example, we can see that user 1 has 11 orders, 1 of which is in the train set, and 10 of which are prior orders. The orders.csv doesn’t tell us about which products were
- ordered. This is contained in the order_products.csv
- order_id: order identifier
- user_id: customer identifier
- eval_set: which evaluation set this order belongs in (see SET described below)
- order_number: the order sequence number for this user (1 = first, n = nth)
- order_dow: the day of the week the order was placed on
- order_hour_of_day: the hour of the day the order was placed on
- days_since_prior: days since the last order, capped at 30 (with NAs for order_number = 1)
#orders<-read.csv("data/orders.csv" ,nrows = 1000000)
orders<-read.csv("data/orders.csv")
kable(head(orders,5),align="l")
order_id | user_id | eval_set | order_number | order_dow | order_hour_of_day | days_since_prior_order |
---|---|---|---|---|---|---|
2539329 | 1 | prior | 1 | 2 | 8 | NA |
2398795 | 1 | prior | 2 | 3 | 7 | 15 |
473747 | 1 | prior | 3 | 3 | 12 | 21 |
2254736 | 1 | prior | 4 | 4 | 7 | 29 |
431534 | 1 | prior | 5 | 4 | 15 | 28 |
Order_Products_Train
This file gives us information about which products (product_id) were ordered. It also contains information of the order (add_to_cart_order) in which the products were put into the cart and information of whether this product is a re-order(1) or not(0).
- order_id: foreign key
- product_id: foreign key
- add_to_cart_order: order in which each product was added to cart
- reordered: 1 if this product has been ordered by this user in the past, 0 otherwise
#op_train<-read.csv("data/order_products__train.csv",nrows = 1000000)
op_train<-read.csv("data/order_products__train.csv")
kable(head(op_train,5),align="l")
order_id | product_id | add_to_cart_order | reordered |
---|---|---|---|
1 | 49302 | 1 | 1 |
1 | 11109 | 2 | 1 |
1 | 10246 | 3 | 0 |
1 | 49683 | 4 | 0 |
1 | 43633 | 5 | 1 |
Order_Products_Prior
This file gives us information about which products (product_id) were ordered. It also contains information of the order (add_to_cart_order) in which the products were put into the cart and information of whether this product is a re-order(1) or not(0).
- order_id: foreign key
- product_id: foreign key
- add_to_cart_order: order in which each product was added to cart
- reordered: 1 if this product has been ordered by this user in the past, 0 otherwise
#op_prior<-read.csv("data/order_products__prior.csv",nrows = 1000000)
op_prior<-read.csv("data/order_products__prior.csv")
kable(head(op_prior,5),align="l")
order_id | product_id | add_to_cart_order | reordered |
---|---|---|---|
2 | 33120 | 1 | 1 |
2 | 28985 | 2 | 1 |
2 | 9327 | 3 | 0 |
2 | 45918 | 4 | 1 |
2 | 30035 | 5 | 0 |
Data Join Process
In this step, tables that read from csv files are joined. In other words, we create a model from the tables in order to analysis data easily.
orders_product<-rbind(op_prior,op_train)
orders_full<-left_join(orders,orders_product,by="order_id")
orders_full<-left_join(orders_full,products,by="product_id")
orders_full<-left_join(orders_full,aisles,by="aisle_id")
orders_full<-left_join(orders_full,departments,by="department_id")
rm(orders_product, aisles,op_prior,op_train,orders,products,departments)
#orders_full <-orders_full %>% filter(row_number()<=1000000)
order_number_by_user_id<-orders_full %>% group_by(user_id) %>% summarise(number_of_order=n_distinct(order_id))
Exploratory Data Analysis
General Information
Data includes 3421083 order. There are 206209 users who placed on order. Minumum of order placed by the users is 4 . Maxiumum of order placed by the users is 100
#rm(order_number_by_user_id)
temp<- orders_full %>% group_by(department) %>% summarise(count=n()) %>% mutate(per=count/sum(count) ) %>% arrange(desc(per))
per<- temp %>% filter(row_number()<=4) %>% summarise(sum=round(sum(per),2)*100)
Bestseller Departmants
When we look at the number of products sold in each department, department produce and dairy eggs are obvious leaders in sales quantity. Produce department contain products such as vegetable and fruit in the form of fresh or package whereas dairy eggs contain yogurt, packaged cheese, milk and eggs, etc. Also we can see that 63 % of the sales are come from 4 departments.
Product_number<-orders_full %>% filter(!is.na(department)) %>% group_by(department) %>% summarise(Number_of_Product=n()) %>% arrange(desc(Number_of_Product))
ggplot(Product_number,aes(x=reorder(department,-Number_of_Product),y=Number_of_Product)) +geom_bar(fill="#4caf50", stat = "identity") + scale_x_discrete(name="Department") +scale_y_continuous(name="Number of Product",labels = comma)+ theme( axis.text.x = element_text(angle =90,size=16) , axis.title = element_text(size = 16),plot.title = element_text(size=18),axis.text.y = element_text(size = 16 )) + ggtitle('Number of Product Sold by Department')
rm(Product_number,per,temp)
Bestseller Aisles
Most ordered product’s aisles are looking in tandem with product’s department. Fresh vegetables and fruits aisles take the lead in sales quantity by far.
Product_number<-orders_full %>% filter(!is.na(aisle)) %>% group_by(aisle) %>% summarise(Number_of_Product=n()) %>% arrange(desc(Number_of_Product))
ggplot(Product_number %>% filter(row_number()<=15),aes(x=reorder(aisle,-Number_of_Product),y=Number_of_Product)) +geom_bar(position="dodge",fill="#4caf50", stat = "identity") + theme(axis.text.x = element_text(angle =90,size = 16),axis.title = element_text(size = 16),plot.title = element_text(size=18),axis.text.y = element_text(size = 16)) + scale_x_discrete(name="Aisle")+scale_y_continuous(name="Number of Product",labels = comma)+ggtitle('Number of Product Sold by Aisle')
rm(Product_number)
Bestseller Products
If we put top 15 products on the cart, we can see that Bananas are the most ordered products followed by Bag of Organic Bananas and Organic Strawberries.
Product_number<-orders_full %>% filter(!is.na(product_name)) %>% group_by(product_name) %>% summarise(Number_of_Product=n()) %>% arrange(desc(Number_of_Product))
ggplot(Product_number %>% filter(row_number()<=15),aes(x=reorder(product_name,-Number_of_Product),y=Number_of_Product)) +geom_bar(fill="#4caf50", stat = "identity") +scale_x_discrete(name="Product") +scale_y_continuous(name="Number of Product",labels = comma)+ theme(axis.text.x = element_text(angle =90,size = 16),axis.text.y = element_text(size = 16),axis.title = element_text(size = 16),plot.title = element_text(size=18)) + ggtitle('Number of Product Sold')
rm(Product_number)
Order Number according to Day Of Week
It can be said that customers order at weekends more. (In the row data days described by number from 0 to 6. We assume that 0 equals Saturday)
#ls(orders_full)
orders_full<-orders_full %>% mutate(order_day=ifelse(order_dow==0,"Sat",
ifelse(order_dow==1,"Sun",
ifelse(order_dow==2,"Man",
ifelse(order_dow==3,"Tue",
ifelse(order_dow==4,"Wed",
ifelse(order_dow==5,"Thu",
ifelse(order_dow==6,"Fri",NA))))))))
order_number_by_day<-orders_full %>% group_by(order_day,order_dow) %>% summarise(number_of_order=n_distinct(order_id))
ggplot(order_number_by_day,aes(x=reorder(order_day,order_dow),y=number_of_order)) +geom_bar(fill="#4caf50", stat = "identity")+ scale_x_discrete(name="Day")+scale_y_continuous(name="Number of Order",labels = comma) + ggtitle('Number of Order by Day of Week') + theme(axis.text = element_text(size=16) ,axis.title = element_text(size = 16),plot.title = element_text(size=18))
rm(order_number_by_day)
Order Number according to Hour of Day
Most orders come during daytime, from 7 am to 7 pm, which is not very surprising.
#ls(orders_full)
#orders_full <- mutate(orders_full , order_day=derivedFactor('Sat'=order_dow==0,'Sun'=order_dow==1,'Man'=order_dow==2,'Tue'=order_dow==3,'Wed'=order_dow==4,'Thu'=order_dow==5,'Fri'=order_dow==6 ,.default = NA))
order_number_by_hour<-orders_full %>% group_by(order_hour_of_day) %>% summarise(number_of_order=n_distinct(order_id))
ggplot(order_number_by_hour,aes(x=order_hour_of_day,y=number_of_order)) +geom_bar(fill="#4caf50", stat = "identity") + ggtitle('Number of Order by Hour of Day') +theme(axis.text = element_text(size=16) ,axis.title = element_text(size = 16),plot.title = element_text(size=18)) + scale_x_continuous(breaks=seq(0, 24, 1),name="Number of Order")+ scale_y_continuous(name = "Number of Order",labels = comma)
rm(order_number_by_hour)
Item Number in the Orders
People mostly add to cart less than 10 items when they order. As it clear in the graph, after 6 item per order there is negative correlation between number of items in the order and order number.
Max_Products_by_Order_Id<-orders_full %>% group_by(order_id) %>% summarise(max_product=max(add_to_cart_order)) %>% arrange(max_product)
ggplot(Max_Products_by_Order_Id,aes(x=max_product)) + geom_histogram( fill="#4caf50" ,bins = 50) +
ggtitle('Add to Cart Order Histogram')+theme(axis.text = element_text(size=16) ,axis.title = element_text(size = 16),plot.title = element_text(size=18)) + scale_x_continuous(breaks=seq(0, 50, 5),name="Add to Cart Order")+ scale_y_continuous(name = "Frequency",labels = comma)
## Warning: Removed 75000 rows containing non-finite values (stat_bin).
rm(Max_Products_by_Order_Id)
First Order Ratio by Product
People put those products first to cart if they buy them. Emergency contraceptive, Rethab Energy Iced Tea and California Champagne around 80% of time added the cart first when they were bought.
first_add_product<-orders_full %>% group_by(product_name) %>% summarise(first_percentage=round(n_distinct(order_id[add_to_cart_order==1]) /n(),2),count_product=n_distinct(order_id[add_to_cart_order==1] )) %>% arrange(desc(first_percentage)) %>% filter(count_product>10)
ggplot(first_add_product%>%filter(row_number()<=15) ,aes(x=reorder(product_name,-first_percentage),y=first_percentage)) +geom_bar(fill="#4caf50", stat = "identity")+ scale_x_discrete(label=function(x) abbreviate(x, minlength=20),name="Product Name") + ggtitle('First Order Percentage by Product') +theme(axis.text.x = element_text(angle =90),axis.title = element_text(size = 16),plot.title = element_text(size=18),axis.text = element_text(size = 16) ) + scale_y_continuous(name = "Frequency",labels = comma)
rm(first_add_product)
Day Since Prior Order
People tend to order more in 7 or less days after their prior order
days_since_prior_order_data<-orders_full %>% group_by(order_id) %>% summarise(days_since_prior_order=max(days_since_prior_order))
ggplot(days_since_prior_order_data,aes(x=days_since_prior_order)) + geom_histogram(
fill="#4caf50" ,bins = 30) +theme(axis.text = element_text(size = 16),axis.title = element_text(size = 16),plot.title = element_text(size=18) ) + scale_y_continuous(name = "Frequency",labels = comma) + scale_x_continuous(breaks=seq(0, 30, 1),name="Day Since Prior Order")+ ggtitle('Day Since Prior Order Histogram')
## Warning: Removed 206209 rows containing non-finite values (stat_bin).
rm(days_since_prior_order_data)
Relationship Add to Cart Order and Product Sales
The chart show that products between 50 and 100 add to cart order is the sold more than others. So there is no relationship add to cart order and number of products sold.
Product_number<-orders_full %>% filter(!is.na(product_name)) %>% group_by(product_name) %>% summarise(Number_of_Product=n() , add_to_cart_order=max(add_to_cart_order)) %>% filter(Number_of_Product>=100) %>% arrange(desc(Number_of_Product))
ggplot(Product_number,aes(x=Number_of_Product,y=add_to_cart_order)) + geom_point(color="#4caf50") +theme(axis.text = element_text(size = 16),axis.title = element_text(size = 16),plot.title = element_text(size=18) ) + scale_y_continuous(name = "Add to Cart Order",labels = comma) + scale_x_continuous(name="Number Of Products Sold",labels = comma)
rm(Product_number)
Relationship Add to Cart Order and Day Since Prior Order
The cart show that as Day since Prior Order increases, the number of products in order will increase. As it is seen below, in days between 1 and 5, there are few products in order. In conclusion people tend add more products to basket as days since prior order increase.
temp<-orders_full %>% group_by(product_name) %>% summarise(maximum_product=max(add_to_cart_order) , days_since_prior_order=max(days_since_prior_order)) %>% filter(days_since_prior_order>0)
ggplot(temp,aes(x=days_since_prior_order,y=maximum_product)) + geom_point(color="#4caf50") +theme(axis.text = element_text(size = 16),axis.title = element_text(size = 16),plot.title = element_text(size=18) ) + scale_y_continuous(name = "Add to Cart Order",labels = comma) + scale_x_continuous(name="Days Since Prior Order")
## Warning: Removed 1 rows containing missing values (geom_point).
rm(temp)
Basket Analysis
We conduct market basket analysis so that looking for combination of products’ aisles that occur together frequently in transaction. We assign support as 0.1 because we want to show of product which is sold together more than 300.000 times. In addition we assign confidence as 0.50 since we want to show products sold together more than %50 chance.
## Warning in asMethod(object): removing duplicated items in transactions
## Apriori
##
## Parameter specification:
## confidence minval smax arem aval originalSupport maxtime support minlen
## 0.5 0.1 1 none FALSE TRUE 5 0.1 2
## maxlen target ext
## 2 rules FALSE
##
## Algorithmic control:
## filter tree heap memopt load sort verbose
## 0.1 TRUE TRUE FALSE TRUE 2 TRUE
##
## Absolute minimum support count: 321487
##
## set item appearances ...[0 item(s)] done [0.00s].
## set transactions ...[134 item(s), 3214874 transaction(s)] done [1.42s].
## sorting and recoding items ... [16 item(s)] done [0.22s].
## creating transaction tree ... done [3.66s].
## checking subsets of size 1 2
## Warning in apriori(order_product_pivot, parameter = list(supp = 0.1, conf
## = 0.5, : Mining stopped (maxlen reached). Only patterns up to a length of 2
## returned!
## done [0.01s].
## writing ... [15 rule(s)] done [0.00s].
## creating S4 object ... done [0.45s].
## lhs rhs support confidence lift count
## [1] {91} => {24} 0.11763 0.69296 1.2440 378158
## [2] {115} => {24} 0.10993 0.57552 1.0332 353415
## [3] {112} => {24} 0.11237 0.68531 1.2303 361249
## [4] {107} => {24} 0.10531 0.62920 1.1296 338545
## [5] {84} => {83} 0.12509 0.51164 1.1522 402145
## [6] {84} => {24} 0.16442 0.67252 1.2073 528593
## [7] {21} => {83} 0.13487 0.58761 1.3232 433598
## [8] {21} => {24} 0.15498 0.67520 1.2122 498231
## [9] {120} => {83} 0.14404 0.54667 1.2311 463077
## [10] {120} => {24} 0.18807 0.71377 1.2814 604624
## [11] {123} => {83} 0.23445 0.63917 1.4393 753740
## [12] {83} => {123} 0.23445 0.52797 1.4393 753740
## [13] {123} => {24} 0.27027 0.73681 1.3228 868883
## [14] {83} => {24} 0.31776 0.71557 1.2846 1021564
## [15] {24} => {83} 0.31776 0.57046 1.2846 1021564
lhs | Var.2 | rhs | support | confidence | lift | count |
---|---|---|---|---|---|---|
{123} | => | {24} | 0.27027 | 0.73681 | 1.3228 | 868883 |
{83} | => | {24} | 0.31776 | 0.71557 | 1.2846 | 1021564 |
{120} | => | {24} | 0.18807 | 0.71377 | 1.2814 | 604624 |
{91} | => | {24} | 0.11763 | 0.69296 | 1.2440 | 378158 |
{112} | => | {24} | 0.11237 | 0.68531 | 1.2303 | 361249 |
{21} | => | {24} | 0.15498 | 0.67520 | 1.2122 | 498231 |
{84} | => | {24} | 0.16442 | 0.67252 | 1.2073 | 528593 |
{123} | => | {83} | 0.23445 | 0.63917 | 1.4393 | 753740 |
{107} | => | {24} | 0.10531 | 0.62920 | 1.1296 | 338545 |
{21} | => | {83} | 0.13487 | 0.58761 | 1.3232 | 433598 |
{115} | => | {24} | 0.10993 | 0.57552 | 1.0332 | 353415 |
{24} | => | {83} | 0.31776 | 0.57046 | 1.2846 | 1021564 |
{120} | => | {83} | 0.14404 | 0.54667 | 1.2310 | 463077 |
{83} | => | {123} | 0.23445 | 0.52797 | 1.4393 | 753740 |
{84} | => | {83} | 0.12509 | 0.51164 | 1.1522 | 402145 |
As it is shown in the chart that greatest value for support 0.317 means that fresh fruit and fresh vegatables added cart together most frequently(more than 1mn times). with 0.715 confidence value. But greatest value for confidence belongs to packaged vegatables fruits and fresh fruits with 0.736 which means 74% of packaged vegatables fruits transaction fresh fruit also are bought. On the other hand with 0.105 support value chips pretzels and fresh fruits added to cart least freaquently.Finally lowest confidence value is between milk fresh vegatables, 51%.
As it seen on the graph there are not significant correlation for support, confidence and lift of product of aisles.
plot(rules )
On the last graph, it is clear that some products from fresh fruits and fresh vegatables aisles added most of the transactions.
plot(head(sort(rules , by="lift"),10), method="graph", control=list(type="items"))
## Warning: Unknown control parameters: type
## Available control parameters (with default values):
## main = Graph for 10 rules
## nodeColors = c("#66CC6680", "#9999CC80")
## nodeCol = c("#EE0000FF", "#EE0303FF", "#EE0606FF", "#EE0909FF", "#EE0C0CFF", "#EE0F0FFF", "#EE1212FF", "#EE1515FF", "#EE1818FF", "#EE1B1BFF", "#EE1E1EFF", "#EE2222FF", "#EE2525FF", "#EE2828FF", "#EE2B2BFF", "#EE2E2EFF", "#EE3131FF", "#EE3434FF", "#EE3737FF", "#EE3A3AFF", "#EE3D3DFF", "#EE4040FF", "#EE4444FF", "#EE4747FF", "#EE4A4AFF", "#EE4D4DFF", "#EE5050FF", "#EE5353FF", "#EE5656FF", "#EE5959FF", "#EE5C5CFF", "#EE5F5FFF", "#EE6262FF", "#EE6666FF", "#EE6969FF", "#EE6C6CFF", "#EE6F6FFF", "#EE7272FF", "#EE7575FF", "#EE7878FF", "#EE7B7BFF", "#EE7E7EFF", "#EE8181FF", "#EE8484FF", "#EE8888FF", "#EE8B8BFF", "#EE8E8EFF", "#EE9191FF", "#EE9494FF", "#EE9797FF", "#EE9999FF", "#EE9B9BFF", "#EE9D9DFF", "#EE9F9FFF", "#EEA0A0FF", "#EEA2A2FF", "#EEA4A4FF", "#EEA5A5FF", "#EEA7A7FF", "#EEA9A9FF", "#EEABABFF", "#EEACACFF", "#EEAEAEFF", "#EEB0B0FF", "#EEB1B1FF", "#EEB3B3FF", "#EEB5B5FF", "#EEB7B7FF", "#EEB8B8FF", "#EEBABAFF", "#EEBCBCFF", "#EEBDBDFF", "#EEBFBFFF", "#EEC1C1FF", "#EEC3C3FF", "#EEC4C4FF", "#EEC6C6FF", "#EEC8C8FF", "#EEC9C9FF", "#EECBCBFF", "#EECDCDFF", "#EECFCFFF", "#EED0D0FF", "#EED2D2FF", "#EED4D4FF", "#EED5D5FF", "#EED7D7FF", "#EED9D9FF", "#EEDBDBFF", "#EEDCDCFF", "#EEDEDEFF", "#EEE0E0FF", "#EEE1E1FF", "#EEE3E3FF", "#EEE5E5FF", "#EEE7E7FF", "#EEE8E8FF", "#EEEAEAFF", "#EEECECFF", "#EEEEEEFF")
## edgeCol = c("#474747FF", "#494949FF", "#4B4B4BFF", "#4D4D4DFF", "#4F4F4FFF", "#515151FF", "#535353FF", "#555555FF", "#575757FF", "#595959FF", "#5B5B5BFF", "#5E5E5EFF", "#606060FF", "#626262FF", "#646464FF", "#666666FF", "#686868FF", "#6A6A6AFF", "#6C6C6CFF", "#6E6E6EFF", "#707070FF", "#727272FF", "#747474FF", "#767676FF", "#787878FF", "#7A7A7AFF", "#7C7C7CFF", "#7E7E7EFF", "#808080FF", "#828282FF", "#848484FF", "#868686FF", "#888888FF", "#8A8A8AFF", "#8C8C8CFF", "#8D8D8DFF", "#8F8F8FFF", "#919191FF", "#939393FF", "#959595FF", "#979797FF", "#999999FF", "#9A9A9AFF", "#9C9C9CFF", "#9E9E9EFF", "#A0A0A0FF", "#A2A2A2FF", "#A3A3A3FF", "#A5A5A5FF", "#A7A7A7FF", "#A9A9A9FF", "#AAAAAAFF", "#ACACACFF", "#AEAEAEFF", "#AFAFAFFF", "#B1B1B1FF", "#B3B3B3FF", "#B4B4B4FF", "#B6B6B6FF", "#B7B7B7FF", "#B9B9B9FF", "#BBBBBBFF", "#BCBCBCFF", "#BEBEBEFF", "#BFBFBFFF", "#C1C1C1FF", "#C2C2C2FF", "#C3C3C4FF", "#C5C5C5FF", "#C6C6C6FF", "#C8C8C8FF", "#C9C9C9FF", "#CACACAFF", "#CCCCCCFF", "#CDCDCDFF", "#CECECEFF", "#CFCFCFFF", "#D1D1D1FF", "#D2D2D2FF", "#D3D3D3FF", "#D4D4D4FF", "#D5D5D5FF", "#D6D6D6FF", "#D7D7D7FF", "#D8D8D8FF", "#D9D9D9FF", "#DADADAFF", "#DBDBDBFF", "#DCDCDCFF", "#DDDDDDFF", "#DEDEDEFF", "#DEDEDEFF", "#DFDFDFFF", "#E0E0E0FF", "#E0E0E0FF", "#E1E1E1FF", "#E1E1E1FF", "#E2E2E2FF", "#E2E2E2FF", "#E2E2E2FF")
## alpha = 0.5
## cex = 1
## itemLabels = TRUE
## labelCol = #000000B3
## measureLabels = FALSE
## precision = 3
## layout = NULL
## layoutParams = list()
## arrowSize = 0.5
## engine = igraph
## plot = TRUE
## plot_options = list()
## max = 100
## verbose = FALSE
References
“The Instacart Online Grocery Shopping Dataset 2017”, Accessed from https://www.instacart.com/datasets/grocery-shopping-2017 on October 24,2017
“Isntacart Market Basket Analysis”, Accessed from https://www.kaggle.com/c/instacart-market-basket-analysis on October 25,2017