Page Visits Funnel

Cool T-Shirts Inc. has asked you to analyze data on visits to their website. Your job is to build a funnel, which is a description of how many people continue to the next step of a multi-step process.

In this case, our funnel is going to describe the following process:

1.A user visits CoolTShirts.com

2.A user adds a t-shirt to their cart

3.A user clicks “checkout”

4.A user actually purchases a t-shirt

# load packages
library(readr)
library(dplyr)
# load data
visits <- read_csv("visits.csv")
cart <- read_csv("cart.csv")
checkout <- read_csv("checkout.csv")
purchase <- read_csv("purchase.csv")

1.Inspect the data frames using head():

(1)visits lists all of the users who have visited the website

(2)cart lists all of the users who have added a t-shirt to their cart

(3)checkout lists all of the users who have started the checkout

(4)purchase lists all of the users who have purchased a t-shirt

# inspect data frames
head(visits)
head(cart)
head(checkout)
head(purchase)

2.Combine visits and cart using a left join.

# define visits_cart here:
visits_cart <- visits %>%
  left_join(cart)

visits_cart

3.How long is the visits data frame?

# define total_visits here:
total_visits <- nrow(visits)
total_visits
[1] 200

4.How many of the timestamps are NA for the column cart_time?

What do these null rows mean?

*Hint:

You can filter a data frame df to only include rows where column_1 has a value of NA using the following code:

df %>%

filter(is.na(column_1))

# define visit_no_cart here:
visit_no_cart <- visits_cart %>%
  filter(is.na(cart_time)) %>%
  summarize(count = n())

visit_no_cart

5.What percent of users who visited Cool T-Shirts Inc. ended up not placing a t-shirt in their cart?

# calculate visit_no_cart_percent here:
visit_no_cart_percent <- visit_no_cart / total_visits

visit_no_cart_percent

6.Repeat the left join for cart and checkout and count NA values. What percentage of users put items in their cart, but did not proceed to checkout?

# define cart_checkout here:
cart_checkout <- cart %>%
  left_join(checkout)

cart_checkout
# define total_carts here:
total_carts <- nrow(cart)
total_carts
[1] 48
# define cart_no_checkout here:
cart_no_checkout <- cart_checkout %>%
  filter(is.na(checkout_time)) %>%
  summarize(count = n())

cart_no_checkout
# calculate cart_no_checkout_percent here:
cart_no_checkout_percent <- cart_no_checkout / total_carts

cart_no_checkout_percent

7.Join all four steps of the funnel, in order, using a series of left joins. Save the results to the variable all_data.

Examine the result using head().

# define all_data here:
all_data <- visits %>%
  left_join(cart) %>%
  left_join(checkout) %>%
  left_join(purchase)

head(all_data)

8.What percentage of users proceeded to checkout, but did not purchase a t-shirt?

# define total_checkout here:
total_checkout <- nrow(checkout)

total_checkout
[1] 28
# define checkout_no_purchase here:
checkout_no_purchase <- all_data %>%
  filter(!is.na(checkout_time)) %>%
  filter(is.na(purchase_time)) %>%
  summarize(count = n())

checkout_no_purchase
# calculate checkout_no_purchase_percent here:
checkout_no_purchase_percent <- checkout_no_purchase / total_checkout

checkout_no_purchase_percent

9.Which step of the funnel is weakest (i.e., has the highest percentage of users not completing it)?

How might Cool T-Shirts Inc. change their website to fix this problem?

weakest_funnel <- max(visit_no_cart_percent, cart_no_checkout_percent, checkout_no_purchase_percent)

visit_no_cart_percent
cart_no_checkout_percent
checkout_no_purchase_percent
weakest_funnel <- 'visit_no_cart_percent'
weakest_funnel
[1] "visit_no_cart_percent"

Average Time to Purchase

10.Using the giant joined data all_data that you created, let’s calculate the average time from initial visit to final purchase. Start by adding the following column to your DataFrame:

# update all_data with time_to_purchase column here:
all_data <- all_data %>%
  mutate(time_to_purchase = purchase_time - visit_time)

all_data

11.Examine the results using:

# inspect the updated all_data data frame here:
head(all_data)

12.Calculate the average time to purchase

# define time_to_purchase here:
time_to_purchase <- all_data %>%
  summarize(mean_time = mean(time_to_purchase, na.rm = TRUE))

time_to_purchase
LS0tDQp0aXRsZTogIlBhZ2UgVmlzaXRzIEZ1bm5lbCINCmF1dGhvcjogIkFubmFiZWwgS3VvIg0KZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpLCAnJVktJW0tJWQgJUg6JU0nKWAiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQojIyBQYWdlIFZpc2l0cyBGdW5uZWwNCg0KQ29vbCBULVNoaXJ0cyBJbmMuIGhhcyBhc2tlZCB5b3UgdG8gYW5hbHl6ZSBkYXRhIG9uIHZpc2l0cyB0byB0aGVpciB3ZWJzaXRlLiBZb3VyIGpvYiBpcyB0byBidWlsZCBhIGZ1bm5lbCwgd2hpY2ggaXMgYSBkZXNjcmlwdGlvbiBvZiBob3cgbWFueSBwZW9wbGUgY29udGludWUgdG8gdGhlIG5leHQgc3RlcCBvZiBhIG11bHRpLXN0ZXAgcHJvY2Vzcy4NCg0KSW4gdGhpcyBjYXNlLCBvdXIgZnVubmVsIGlzIGdvaW5nIHRvIGRlc2NyaWJlIHRoZSBmb2xsb3dpbmcgcHJvY2VzczoNCg0KMS5BIHVzZXIgdmlzaXRzIENvb2xUU2hpcnRzLmNvbQ0KDQoyLkEgdXNlciBhZGRzIGEgdC1zaGlydCB0byB0aGVpciBjYXJ0DQoNCjMuQSB1c2VyIGNsaWNrcyDigJxjaGVja291dOKAnQ0KDQo0LkEgdXNlciBhY3R1YWxseSBwdXJjaGFzZXMgYSB0LXNoaXJ0DQoNCmBgYHtyIG1lc3NhZ2UgPSBGQUxTRSwgZXJyb3I9VFJVRX0NCiMgbG9hZCBwYWNrYWdlcw0KbGlicmFyeShyZWFkcikNCmxpYnJhcnkoZHBseXIpDQpgYGANCg0KYGBge3IgbWVzc2FnZSA9IEZBTFNFLCBlcnJvcj1UUlVFfQ0KIyBsb2FkIGRhdGENCnZpc2l0cyA8LSByZWFkX2NzdigidmlzaXRzLmNzdiIpDQpjYXJ0IDwtIHJlYWRfY3N2KCJjYXJ0LmNzdiIpDQpjaGVja291dCA8LSByZWFkX2NzdigiY2hlY2tvdXQuY3N2IikNCnB1cmNoYXNlIDwtIHJlYWRfY3N2KCJwdXJjaGFzZS5jc3YiKQ0KYGBgDQoNCjEuSW5zcGVjdCB0aGUgZGF0YSBmcmFtZXMgdXNpbmcgaGVhZCgpOg0KDQooMSl2aXNpdHMgbGlzdHMgYWxsIG9mIHRoZSB1c2VycyB3aG8gaGF2ZSB2aXNpdGVkIHRoZSB3ZWJzaXRlDQoNCigyKWNhcnQgbGlzdHMgYWxsIG9mIHRoZSB1c2VycyB3aG8gaGF2ZSBhZGRlZCBhIHQtc2hpcnQgdG8gdGhlaXIgY2FydA0KDQooMyljaGVja291dCBsaXN0cyBhbGwgb2YgdGhlIHVzZXJzIHdobyBoYXZlIHN0YXJ0ZWQgdGhlIGNoZWNrb3V0DQoNCig0KXB1cmNoYXNlIGxpc3RzIGFsbCBvZiB0aGUgdXNlcnMgd2hvIGhhdmUgcHVyY2hhc2VkIGEgdC1zaGlydA0KDQpgYGB7ciBlcnJvcj1UUlVFfQ0KIyBpbnNwZWN0IGRhdGEgZnJhbWVzDQpoZWFkKHZpc2l0cykNCmhlYWQoY2FydCkNCmhlYWQoY2hlY2tvdXQpDQpoZWFkKHB1cmNoYXNlKQ0KYGBgDQoNCjIuQ29tYmluZSB2aXNpdHMgYW5kIGNhcnQgdXNpbmcgYSBsZWZ0IGpvaW4uDQoNCmBgYHtyIGVycm9yPVRSVUV9DQojIGRlZmluZSB2aXNpdHNfY2FydCBoZXJlOg0KdmlzaXRzX2NhcnQgPC0gdmlzaXRzICU+JQ0KICBsZWZ0X2pvaW4oY2FydCkNCg0KdmlzaXRzX2NhcnQNCmBgYA0KDQozLkhvdyBsb25nIGlzIHRoZSB2aXNpdHMgZGF0YSBmcmFtZT8NCg0KYGBge3IgZXJyb3I9VFJVRX0NCiMgZGVmaW5lIHRvdGFsX3Zpc2l0cyBoZXJlOg0KdG90YWxfdmlzaXRzIDwtIG5yb3codmlzaXRzKQ0KdG90YWxfdmlzaXRzDQpgYGANCg0KNC5Ib3cgbWFueSBvZiB0aGUgdGltZXN0YW1wcyBhcmUgTkEgZm9yIHRoZSBjb2x1bW4gY2FydF90aW1lPw0KDQpXaGF0IGRvIHRoZXNlIG51bGwgcm93cyBtZWFuPw0KDQoqSGludDoNCg0KWW91IGNhbiBmaWx0ZXIgYSBkYXRhIGZyYW1lIGRmIHRvIG9ubHkgaW5jbHVkZSByb3dzIHdoZXJlIGNvbHVtbl8xIGhhcyBhIHZhbHVlIG9mIE5BIHVzaW5nIHRoZSBmb2xsb3dpbmcgY29kZToNCg0KIg0KDQpkZiAlPiUNCg0KICBmaWx0ZXIoaXMubmEoY29sdW1uXzEpKQ0KICANCiINCg0KDQpgYGB7ciBlcnJvcj1UUlVFfQ0KIyBkZWZpbmUgdmlzaXRfbm9fY2FydCBoZXJlOg0KdmlzaXRfbm9fY2FydCA8LSB2aXNpdHNfY2FydCAlPiUNCiAgZmlsdGVyKGlzLm5hKGNhcnRfdGltZSkpICU+JQ0KICBzdW1tYXJpemUoY291bnQgPSBuKCkpDQoNCnZpc2l0X25vX2NhcnQNCmBgYA0KDQo1LldoYXQgcGVyY2VudCBvZiB1c2VycyB3aG8gdmlzaXRlZCBDb29sIFQtU2hpcnRzIEluYy4gZW5kZWQgdXAgbm90IHBsYWNpbmcgYSB0LXNoaXJ0IGluIHRoZWlyIGNhcnQ/DQoNCmBgYHtyIGVycm9yPVRSVUV9DQojIGNhbGN1bGF0ZSB2aXNpdF9ub19jYXJ0X3BlcmNlbnQgaGVyZToNCnZpc2l0X25vX2NhcnRfcGVyY2VudCA8LSB2aXNpdF9ub19jYXJ0IC8gdG90YWxfdmlzaXRzDQoNCnZpc2l0X25vX2NhcnRfcGVyY2VudA0KYGBgDQoNCjYuUmVwZWF0IHRoZSBsZWZ0IGpvaW4gZm9yIGNhcnQgYW5kIGNoZWNrb3V0IGFuZCBjb3VudCBOQSB2YWx1ZXMuIFdoYXQgcGVyY2VudGFnZSBvZiB1c2VycyBwdXQgaXRlbXMgaW4gdGhlaXIgY2FydCwgYnV0IGRpZCBub3QgcHJvY2VlZCB0byBjaGVja291dD8NCg0KYGBge3IgZXJyb3I9VFJVRX0NCiMgZGVmaW5lIGNhcnRfY2hlY2tvdXQgaGVyZToNCmNhcnRfY2hlY2tvdXQgPC0gY2FydCAlPiUNCiAgbGVmdF9qb2luKGNoZWNrb3V0KQ0KDQpjYXJ0X2NoZWNrb3V0DQpgYGANCg0KYGBge3IgZXJyb3I9VFJVRX0NCiMgZGVmaW5lIHRvdGFsX2NhcnRzIGhlcmU6DQp0b3RhbF9jYXJ0cyA8LSBucm93KGNhcnQpDQp0b3RhbF9jYXJ0cw0KYGBgDQoNCmBgYHtyIGVycm9yPVRSVUV9DQojIGRlZmluZSBjYXJ0X25vX2NoZWNrb3V0IGhlcmU6DQpjYXJ0X25vX2NoZWNrb3V0IDwtIGNhcnRfY2hlY2tvdXQgJT4lDQogIGZpbHRlcihpcy5uYShjaGVja291dF90aW1lKSkgJT4lDQogIHN1bW1hcml6ZShjb3VudCA9IG4oKSkNCg0KY2FydF9ub19jaGVja291dA0KYGBgDQoNCmBgYHtyIGVycm9yPVRSVUV9DQojIGNhbGN1bGF0ZSBjYXJ0X25vX2NoZWNrb3V0X3BlcmNlbnQgaGVyZToNCmNhcnRfbm9fY2hlY2tvdXRfcGVyY2VudCA8LSBjYXJ0X25vX2NoZWNrb3V0IC8gdG90YWxfY2FydHMNCg0KY2FydF9ub19jaGVja291dF9wZXJjZW50DQpgYGANCg0KNy5Kb2luIGFsbCBmb3VyIHN0ZXBzIG9mIHRoZSBmdW5uZWwsIGluIG9yZGVyLCB1c2luZyBhIHNlcmllcyBvZiBsZWZ0IGpvaW5zLiBTYXZlIHRoZSByZXN1bHRzIHRvIHRoZSB2YXJpYWJsZSBhbGxfZGF0YS4NCg0KRXhhbWluZSB0aGUgcmVzdWx0IHVzaW5nIGhlYWQoKS4NCg0KYGBge3IgZXJyb3I9VFJVRX0NCiMgZGVmaW5lIGFsbF9kYXRhIGhlcmU6DQphbGxfZGF0YSA8LSB2aXNpdHMgJT4lDQogIGxlZnRfam9pbihjYXJ0KSAlPiUNCiAgbGVmdF9qb2luKGNoZWNrb3V0KSAlPiUNCiAgbGVmdF9qb2luKHB1cmNoYXNlKQ0KDQpoZWFkKGFsbF9kYXRhKQ0KYGBgDQoNCjguV2hhdCBwZXJjZW50YWdlIG9mIHVzZXJzIHByb2NlZWRlZCB0byBjaGVja291dCwgYnV0IGRpZCBub3QgcHVyY2hhc2UgYSB0LXNoaXJ0Pw0KDQpgYGB7ciBlcnJvcj1UUlVFfQ0KIyBkZWZpbmUgdG90YWxfY2hlY2tvdXQgaGVyZToNCnRvdGFsX2NoZWNrb3V0IDwtIG5yb3coY2hlY2tvdXQpDQoNCnRvdGFsX2NoZWNrb3V0DQpgYGANCg0KYGBge3IgZXJyb3I9VFJVRX0NCiMgZGVmaW5lIGNoZWNrb3V0X25vX3B1cmNoYXNlIGhlcmU6DQpjaGVja291dF9ub19wdXJjaGFzZSA8LSBhbGxfZGF0YSAlPiUNCiAgZmlsdGVyKCFpcy5uYShjaGVja291dF90aW1lKSkgJT4lDQogIGZpbHRlcihpcy5uYShwdXJjaGFzZV90aW1lKSkgJT4lDQogIHN1bW1hcml6ZShjb3VudCA9IG4oKSkNCg0KY2hlY2tvdXRfbm9fcHVyY2hhc2UNCmBgYA0KDQpgYGB7ciBlcnJvcj1UUlVFfQ0KIyBjYWxjdWxhdGUgY2hlY2tvdXRfbm9fcHVyY2hhc2VfcGVyY2VudCBoZXJlOg0KY2hlY2tvdXRfbm9fcHVyY2hhc2VfcGVyY2VudCA8LSBjaGVja291dF9ub19wdXJjaGFzZSAvIHRvdGFsX2NoZWNrb3V0DQoNCmNoZWNrb3V0X25vX3B1cmNoYXNlX3BlcmNlbnQNCmBgYA0KDQo5LldoaWNoIHN0ZXAgb2YgdGhlIGZ1bm5lbCBpcyB3ZWFrZXN0IChpLmUuLCBoYXMgdGhlIGhpZ2hlc3QgcGVyY2VudGFnZSBvZiB1c2VycyBub3QgY29tcGxldGluZyBpdCk/DQoNCkhvdyBtaWdodCBDb29sIFQtU2hpcnRzIEluYy4gY2hhbmdlIHRoZWlyIHdlYnNpdGUgdG8gZml4IHRoaXMgcHJvYmxlbT8NCg0KYGBge3IgZXJyb3I9VFJVRX0NCndlYWtlc3RfZnVubmVsIDwtIG1heCh2aXNpdF9ub19jYXJ0X3BlcmNlbnQsIGNhcnRfbm9fY2hlY2tvdXRfcGVyY2VudCwgY2hlY2tvdXRfbm9fcHVyY2hhc2VfcGVyY2VudCkNCg0KdmlzaXRfbm9fY2FydF9wZXJjZW50DQpjYXJ0X25vX2NoZWNrb3V0X3BlcmNlbnQNCmNoZWNrb3V0X25vX3B1cmNoYXNlX3BlcmNlbnQNCndlYWtlc3RfZnVubmVsIDwtICd2aXNpdF9ub19jYXJ0X3BlcmNlbnQnDQp3ZWFrZXN0X2Z1bm5lbA0KYGBgDQoNCiMgQXZlcmFnZSBUaW1lIHRvIFB1cmNoYXNlDQoNCjEwLlVzaW5nIHRoZSBnaWFudCBqb2luZWQgZGF0YSBhbGxfZGF0YSB0aGF0IHlvdSBjcmVhdGVkLCBsZXTigJlzIGNhbGN1bGF0ZSB0aGUgYXZlcmFnZSB0aW1lIGZyb20gaW5pdGlhbCB2aXNpdCB0byBmaW5hbCBwdXJjaGFzZS4gU3RhcnQgYnkgYWRkaW5nIHRoZSBmb2xsb3dpbmcgY29sdW1uIHRvIHlvdXIgRGF0YUZyYW1lOg0KDQpgYGB7ciBlcnJvcj1UUlVFfQ0KIyB1cGRhdGUgYWxsX2RhdGEgd2l0aCB0aW1lX3RvX3B1cmNoYXNlIGNvbHVtbiBoZXJlOg0KYWxsX2RhdGEgPC0gYWxsX2RhdGEgJT4lDQogIG11dGF0ZSh0aW1lX3RvX3B1cmNoYXNlID0gcHVyY2hhc2VfdGltZSAtIHZpc2l0X3RpbWUpDQoNCmFsbF9kYXRhDQpgYGANCg0KMTEuRXhhbWluZSB0aGUgcmVzdWx0cyB1c2luZzoNCg0KYGBge3IgZXJyb3I9VFJVRX0NCiMgaW5zcGVjdCB0aGUgdXBkYXRlZCBhbGxfZGF0YSBkYXRhIGZyYW1lIGhlcmU6DQpoZWFkKGFsbF9kYXRhKQ0KYGBgDQoNCjEyLkNhbGN1bGF0ZSB0aGUgYXZlcmFnZSB0aW1lIHRvIHB1cmNoYXNlDQoNCmBgYHtyIGVycm9yPVRSVUV9DQojIGRlZmluZSB0aW1lX3RvX3B1cmNoYXNlIGhlcmU6DQp0aW1lX3RvX3B1cmNoYXNlIDwtIGFsbF9kYXRhICU+JQ0KICBzdW1tYXJpemUobWVhbl90aW1lID0gbWVhbih0aW1lX3RvX3B1cmNoYXNlLCBuYS5ybSA9IFRSVUUpKQ0KDQp0aW1lX3RvX3B1cmNoYXNlDQpgYGA=