Xây dựng phễu bán hàng với ggplot2

Tác giả: Hoàng Đức Anh | 2019-06-15

Trong quá trình phân tích bán hàng, phếu bán hàng (sale funnel) là một kỹ thuật rất hữu dụng để trực quan hóa kết quả kinh doanh theo từng nhóm. Tuy nhiên, hiện ít có biểu đồ nào thể hiện được phễu bán hàng một cách hiệu quả trên R.

Trong bài viết này, RAnalytics sẽ hướng dẫn một ví dụ thực tiễn trực quan hóa phễu bán hàng một cách hiệu quả.


Xem ví dụ điển hình về phễu bán hàng dưới đây

data <- read.table(textConnection(
          c("step;segment1;segment2;segment3;total
          1_visit;1806;11663;12641;26110
          2_register;1143;6476;5372;12991
          3_login;1806;11663;2694;16163
          4_subscribe;21;3322;2694;6037
          5_paid;259;422;41;722")),
        header = T, sep = ";")
# Dữ liệu
data
##                    step segment1 segment2 segment3 total
## 1               1_visit     1806    11663    12641 26110
## 2            2_register     1143     6476     5372 12991
## 3               3_login     1806    11663     2694 16163
## 4           4_subscribe       21     3322     2694  6037
## 5                5_paid      259      422       41   722

Trong tập dữ liệu trên, ta sẽ mô phỏng dữ liệu phếu bán hàng của 3 phân khúc khách hàng trên một trang thương mại điện tử mà trong đó, khách hàng sẽ đi qua năm bước khác nhau:

  • Ghé thăm website (visit)
  • Đăng ký (register)
  • Đăng nhập (login)
  • Đăng ký cập nhật các thông tin sản phẩm (subscribe)
  • Mua hàng và trả tiền thành công (paid)

Để tạo một biểu đồ phễu bán hàng, ta sẽ thực hiện 3 bước lớn sau.

  • Tạo theme cho biểu đồ
  • Tạo các biểu đồ con cho phễu bán hàng
  • Kết hợp các biểu đồ để tạo thành phễu bán hàng hoàn chỉnh
# Gọi library
library(tidyverse)
library(reshape2)
library(forcats)
library(ggthemes)

# Tạo theme trông cho chart
funnel_theme <- theme(axis.title = element_blank(),
        axis.ticks.x = element_blank(),
        axis.text.x = element_blank(),
        legend.position = "none",
        panel.grid = element_blank()
        )

# Phân rã dữ liệu
df <- data %>% melt(id.vars = "step")

# Tạo biểu đồ chính
p1 <- df %>% 
  mutate(step = fct_rev(step)) %>% 
  filter(variable != "total") %>% 
  ggplot(aes(step, value)) +
  geom_bar(aes(fill = variable), stat = "identity") +
  facet_grid(~variable, scale = "free") +
  coord_flip() + 
  geom_text(aes(label = value),
            position = position_stack(vjust = .5)) +
  scale_fill_tableau() +
  theme_minimal() +
  scale_y_sqrt() +
  funnel_theme +
  theme(plot.margin=grid::unit(c(0,0,0,0), "mm")) +
  theme(
  axis.text.y = element_blank(),
  strip.text = element_text(size = 14, 
                            face = "bold")) +
  theme(
    panel.spacing = unit(0, "mm")) +
  annotate("rect", xmin = 0.5, xmax = 1.5, ymin = 0, ymax = Inf,
           alpha = .2) +
  annotate("rect", xmin = 2.5, xmax = 3.5, ymin = 0, ymax = Inf,
           alpha = .2) +
  annotate("rect", xmin = 4.5, xmax = 5.5, ymin = 0, ymax = Inf,
           alpha = .2) +
  theme(axis.text.y = element_blank())
p1

  • Tạo thêm phần label tổng theo từng segment
df %>%
  mutate(step = fct_rev(step)) %>%
  filter(variable == "total") %>%
  ggplot(aes(step, 0)) +
  geom_label(aes(label = value),
             col = "white",
             fill = "darkred",
             size = 4) +
  coord_flip() +
  facet_wrap(~variable) +
  theme_minimal() +
  theme(axis.text = element_blank()) +
  funnel_theme +
  theme(
    strip.text.x = element_blank()
  ) -> p2
p2

  • Tạo thêm thứ tự các bước trong phễu bán hàng để dễ theo dõi hơn
df2 <- data.frame(step = data$step,
                  value = 1:5)
df2 %>% 
  mutate(step = fct_rev(step)) %>% 
  ggplot(aes(step, 1)) +
  geom_hline(yintercept = 1) +
  geom_point(size = 10, col = "darkgreen") +
  geom_text(aes(label = value), 
            col = "white") +
  coord_flip() +
  theme_minimal() +
  funnel_theme +
  theme(
    axis.text = element_text(size = 14)
  ) -> p3
p3

  • Cuối cùng, ta có thể tạo ghép các biểu đồ rời rạc để tạo thành phễu bán hàng hoàn chỉnh. Việc kết hợp các biểu đồ trên ggplot2 có thể hoàn thành một cách đơn giản với ggplot2
#devtools::install_github("thomasp85/patchwork")
library(patchwork)
p3 + 
  labs(title = "Sale funnel for 3 segments") +
  p1 + p2 + 
  plot_layout(nrow = 1, widths = c(1, 8, 1))


Như vậy, chúng ta đã hoàn thành phễu bán hàng rất chuyên nghiệp với ggplot2. Phễu bán hàng này đặc biệt hiệu quả khi cùng lúc phải so sánh nhiều phân khúc khách hàng khác nhau trên toàn bộ chuỗi bán hàng. Chúc các bạn học tập và làm việc hiệu quả với Ranalytics.vn!

comments powered by Disqus