Growth Analysis with SQL

Growth Analysis SQL Thực Chiến – Case #13 – Challenge #01

Khóa học 2in1: Bạn không những được học về SQL – Bạn còn được học tư duy Growth Analysis qua các Case Studies & Challenges thực chiến. Để đăng ký khóa học Growth Analysis Với SQL Thực Chiến Từ Foundation – Advanced, bạn có thể Inbox mình Tại Đây.

Case Study #013 SQL Thực Chiến: Định Nghĩa Aha! Moment gồm 04 Challenges:

  • Challenge #01: Phân Tích Ma Trận “Aha Moment”
  • Challenge #02: Dành cho các bạn học viên Data Analyst BootCamp
  • Challenge #03: Dành cho các bạn học viên Data Analyst BootCamp
  • Challenge #04: Dành cho các bạn học viên Data Analyst BootCamp

Phần 01: Học Tư Duy Growth

  • Mục tiêu của phân tích growth là tìm ra các hành động cụ thể giúp tăng trưởng người dùng dựa trên dữ liệu.
  • Ma trận “Aha Moment” là một công cụ phân tích để xác định hành vi then chốt của người dùng mới, giúp họ nhận ra giá trị sản phẩm và quyết định ở lại.
  • Phân tích này giúp chuyển các quan sát về hành vi người dùng thành các số liệu đo lường được, từ đó đưa ra các quyết định cải tiến sản phẩm.
Tại sao Ma Trận “Aha Moment” quan trọng?
  • Vấn đề chính của các sản phẩm là giữ chân người dùng mới (new user retention).
  • “Aha Moment” là thời điểm người dùng lần đầu tiên nhận ra giá trị cốt lõi mà sản phẩm mang lại.
  • Ví dụ về “Aha Moment”:
    • Facebook: Người dùng kết nối với 7 người bạn trong 10 ngày đầu tiên.
  • Ma trận này giúp bạn định lượng hóa và xác thực khoảnh khắc “Aha” bằng dữ liệu, thay vì chỉ dựa vào phỏng đoán.
Hướng dẫn phân tích từng bước

Bước 1: Đặt Giả Thuyết

  • Tư duy sản phẩm: Đặt mình vào vị trí người dùng.
    • Vấn đề của họ là gì? Hành động nào trong sản phẩm giúp họ giải quyết vấn đề đó và cảm thấy hài lòng?
    • Ví dụ với app nghe nhạc: Có phải là khi họ tìm được bài hát yêu thích? Hay khi họ tạo playlist đầu tiên? Hay khi họ chia sẻ một bài hát?
  • Phân tích dữ liệu: Chuyển các ý tưởng trên thành các hành động có thể đo lường được. Đây là các giả thuyết để đưa vào ma trận.
    • Ví dụ 1: Action: played >= 5 songs in first 7 days.
    • Ví dụ 2: Action: created 1 playlist in first 7 days.
    • Ví dụ 3: Action: followed 1 artist in first 7 days.

Bước 2: Phân Tích 4 Chỉ Số Chính

  • Correlation (Hệ số tương quan):
    • Giải thích: Là một số từ -1 đến 1, đo lường mức độ liên quan giữa một hành động và việc người dùng ở lại. Số càng gần 1, mối liên quan càng chặt chẽ. Đây là chỉ số quan trọng nhất để sàng lọc các giả thuyết ban đầu.
    • Bắt đầu bằng việc tìm hành động có Correlation cao nhất. Đây là ứng cử viên hàng đầu cho “Aha Moment”.
    • Công thức sử dụng trong SQL:
      • Correlation = (TP*TN – FP*FN) / SQRT((TP+FP)*(TP+FN)*(TN+FP)*(TN+FN))
        • TP (True Positive): Số người dùng đã làm hành động VÀ ở lại.
        • TN (True Negative): Số người dùng không làm hành động VÀ rời đi.
        • FP (False Positive): Số người dùng đã làm hành động NHƯNG rời đi.
        • FN (False Negative): Số người dùng không làm hành động NHƯNG ở lại.
  • Sample Size (Kích thước mẫu):
    • Giải thích: Là tổng số người dùng đã thực hiện hành động đang xét.
    • Cần thận trọng với những hành động có Correlation cao nhưng Sample Size quá nhỏ. Một kết quả có ý nghĩa thống kê đòi hỏi Sample Size đủ lớn.
    • Công thức: Sample Size = TP + FP
  • Positive Predictive Value (PPV – Giá trị dự báo dương):
    • Giải thích: Trả lời câu hỏi: “Trong số những người đã làm hành động này, bao nhiêu phần trăm đã ở lại?”
    • PPV càng gần 100% càng tốt. Nó cho thấy hành động này có khả năng dự báo chính xác việc người dùng sẽ ở lại.
    • Công thức: PPV = TP / (TP + FP)
  • Negative Predictive Value (NPV – Giá trị dự báo âm):
    • Giải thích: Trả lời câu hỏi: “Trong số những người không làm hành động này, bao nhiêu phần trăm đã rời bỏ?”
    • NPV càng gần 100% càng tốt. Nó xác nhận rằng việc không thực hiện hành động này có liên quan chặt chẽ đến việc người dùng sẽ rời đi.
    • Công thức: NPV = TN / (TN + FN)

Bước 3: Phân Tích Ma Trận và Ra Quyết Định

  • Loại bỏ những hành động có Correlation thấp hoặc Sample Size quá nhỏ.
  • Trong các hành động còn lại, tìm hành động có sự cân bằng tốt nhất giữa Correlation cao, PPV cao, và NPV cao.
  • Hành động được chọn chính là “Aha Moment” của bạn.

Bước 4: Áp Dụng Kết Quả Vào Cải Thiện Sản Phẩm

Tìm ra “Aha Moment” là cơ sở để thực hiện các thử nghiệm growth:

  • Tối ưu Onboarding: Thiết kế lại luồng hướng dẫn người dùng mới để thúc đẩy họ thực hiện hành động “Aha” một cách nhanh nhất.
  • Tạo Chiến Dịch Kích Hoạt: Gửi thông báo (email, push notification) đến những người dùng chưa thực hiện hành động “Aha”.
    • Ví dụ: Nếu “Aha Moment” là tạo playlist, gửi email: “Chúng tôi thấy bạn đã nghe một vài bài hát, hãy thử tạo playlist đầu tiên của bạn.”
  • Phát Triển Sản Phẩm: Ưu tiên các tính năng giúp người dùng dễ dàng thực hiện “Aha Moment” hơn.

Phần 02: Challenge SQL Server

Business Problem
  • Bạn là một Data Analyst của một ứng dụng stream nhạc mới nổi. Ban lãnh đạo nhận thấy một lượng lớn người dùng mới rời bỏ ứng dụng trong vòng 3 tháng đầu.
  • Vấn đề: Tỷ lệ giữ chân người dùng mới thấp đang ảnh hưởng trực tiếp đến tiềm năng tăng trưởng của công ty.
  • Yêu cầu: Ban lãnh đạo muốn tìm ra “Aha Moment” — hành động then chốt khiến người dùng nhận ra giá trị của sản phẩm và quyết định ở lại.
  • Nhiệm vụ của bạn là sử dụng dữ liệu để xây dựng một Ma trận “Aha Moment”, phân tích và xác định hành động nào có tác động lớn nhất đến việc giữ chân người dùng sau 14 ngày.
Challenge SQL Thực Chiến
  • Dựa trên tư duy sản phẩm, bạn đặt ra 3 giả thuyết về các hành động có thể là “Aha Moment”. Nhiệm vụ của bạn là viết một câu lệnh SQL để kiểm chứng và so sánh 3 giả thuyết này trong 7 ngày đầu tiên kể từ khi người dùng đăng ký:
    • played_5_songs: Người dùng đã nghe ít nhất 5 bài hát.
    • followed_artist: Người dùng đã theo dõi ít nhất 1 nghệ sĩ.
    • created_playlist: Người dùng đã tạo ít nhất 1 playlist.
  • Kết quả cuối cùng phải là một bảng tổng hợp (Ma trận Aha Moment) với các cột: action_hypothesis, correlation, sample_size, ppv, npv.
SQL Logic
WITH user_first_7_days_actions AS (
    -- CTE 1: TỔNG HỢP HÀNH ĐỘNG TRONG 7 NGÀY ĐẦU
    -- Mục tiêu: Với mỗi user, tổng hợp lại các hành động họ đã làm trong 7 ngày đầu tiên sau khi đăng ký.
    -- Đây là bước chuẩn bị dữ liệu thô, chuyển từ log sự kiện thành một bảng có cấu trúc user-centric.
    SELECT
        u.user_id,
        ur.retained_after_14_days,

        -- Sử dụng MAX(CASE WHEN...) để tạo cờ (flag) 0 hoặc 1. 
        -- Nếu user có ít nhất 1 hành động 'play_song', kết quả MAX sẽ là 1, ngược lại là 0.
        MAX(CASE WHEN ua.activity_type = 'play_song' THEN 1 ELSE 0 END) AS played_any_song,
        MAX(CASE WHEN ua.activity_type = 'follow_artist' THEN 1 ELSE 0 END) AS followed_any_artist,
        MAX(CASE WHEN ua.activity_type = 'create_playlist' THEN 1 ELSE 0 END) AS created_any_playlist,

        -- Đếm số lần hành động 'play_song' xảy ra. 
        -- COUNT chỉ đếm các giá trị không NULL, nên CASE WHEN trả về activity_id (không NULL) khi đúng điều kiện.
        COUNT(CASE WHEN ua.activity_type = 'play_song' THEN ua.activity_id END) as songs_played_count
    FROM
        users u
    -- LEFT JOIN với user_retention để lấy "biến mục tiêu": user có được giữ lại hay không.
    LEFT JOIN
        user_retention ur ON u.user_id = ur.user_id
    -- LEFT JOIN với user_activity để lấy tất cả hành động của user.
    LEFT JOIN
        user_activity ua ON u.user_id = ua.user_id 
        -- Điều kiện JOIN quan trọng: Chỉ lấy các hoạt động trong vòng 7 ngày kể từ ngày đăng ký.
        -- DATEADD(day, 6, u.registration_date) tương đương với registration_date + 6 ngày, tạo ra một cửa sổ 7 ngày.
        AND ua.activity_date BETWEEN u.registration_date AND DATEADD(day, 6, u.registration_date)
    -- Gom nhóm theo từng user để thực hiện các hàm tổng hợp (MAX, COUNT).
    GROUP BY
        u.user_id, ur.retained_after_14_days
),

hypotheses_flags AS (
    -- CTE 2: CHUYỂN ĐỔI THÀNH CỜ GIẢ THUYẾT
    -- Mục tiêu: Chuyển đổi dữ liệu đã tổng hợp từ CTE 1 thành các cờ (0/1) rõ ràng cho từng giả thuyết cụ thể.
    SELECT
        user_id,
        retained_after_14_days,

        -- Tạo cờ cho giả thuyết "nghe ít nhất 5 bài hát".
        CAST(CASE WHEN songs_played_count >= 5 THEN 1 ELSE 0 END AS BIT) AS played_5_songs,
        -- Chuyển đổi các cờ đã có từ CTE 1 sang kiểu BIT (0/1) để thống nhất.
        CAST(followed_any_artist AS BIT) AS followed_artist,
        CAST(created_any_playlist AS BIT) AS created_playlist
    FROM
        user_first_7_days_actions
),

metrics_components AS (
    -- CTE 3: TÍNH TOÁN CÁC THÀNH PHẦN CỦA MA TRẬN (TP, TN, FP, FN)
    -- Mục tiêu: Từ các cờ giả thuyết, tính toán 4 thành phần cốt lõi cho mỗi giả thuyết.
    -- Đây là bước phức tạp nhất, sử dụng kỹ thuật UNPIVOT để biến các cột giả thuyết thành hàng.
    SELECT
        action_hypothesis,

        -- True Positive (TP): User ĐÃ LÀM hành động VÀ Ở LẠI.
        SUM(CASE WHEN did_action = 1 AND retained_after_14_days = 1 THEN 1 ELSE 0 END) AS TP,
        -- True Negative (TN): User KHÔNG LÀM hành động VÀ RỜI ĐI.
        SUM(CASE WHEN did_action = 0 AND retained_after_14_days = 0 THEN 1 ELSE 0 END) AS TN,
        -- False Positive (FP): User ĐÃ LÀM hành động NHƯNG RỜI ĐI.
        SUM(CASE WHEN did_action = 1 AND retained_after_14_days = 0 THEN 1 ELSE 0 END) AS FP,
        -- False Negative (FN): User KHÔNG LÀM hành động NHƯNG VẪN Ở LẠI.
        SUM(CASE WHEN did_action = 0 AND retained_after_14_days = 1 THEN 1 ELSE 0 END) AS FN
    FROM
        hypotheses_flags
    -- UNPIVOT: "Xoay" dữ liệu từ dạng cột sang dạng hàng.
    -- 3 cột (played_5_songs, followed_artist, created_playlist) sẽ được chuyển thành 2 cột:
    -- 1. `action_hypothesis`: Chứa tên của cột gốc (tên giả thuyết).
    -- 2. `did_action`: Chứa giá trị (0 hoặc 1) của cột gốc.
    -- Kỹ thuật này giúp tính toán đồng loạt cho tất cả các giả thuyết mà không cần viết lại code.
    UNPIVOT (
        did_action FOR action_hypothesis IN (played_5_songs, followed_artist, created_playlist)
    ) AS unpivoted_actions
    -- Sau khi unpivot, gom nhóm theo từng giả thuyết để tính TP, TN, FP, FN riêng cho mỗi giả thuyết.
    GROUP BY
        action_hypothesis
)

-- FINAL SELECT: TÍNH TOÁN CÁC CHỈ SỐ MA TRẬN
-- Mục tiêu: Từ các thành phần TP, TN, FP, FN, tính toán các chỉ số cuối cùng.
SELECT
    action_hypothesis,
    TP,
    TN,
    FP,
    FN,
    -- Sample Size (Kích thước mẫu): Tổng số người dùng đã thực hiện hành động.
    TP + FP AS sample_size,

    -- Correlation (Hệ số tương quan - Phi Coefficient): Đo lường mức độ liên quan giữa hành động và việc ở lại.
    -- Công thức: (TP*TN - FP*FN) / SQRT((TP+FP)*(TP+FN)*(TN+FP)*(TN+FN))
    CAST(
        (TP * TN - FP * FN) / 
        -- NULLIF(..., 0): Tránh lỗi chia cho 0. Nếu mẫu số bằng 0, biểu thức sẽ trả về NULL thay vì lỗi.
        -- SQRT yêu cầu đầu vào là float, nên cần CAST.
        NULLIF(SQRT(CAST((TP + FP) * (TP + FN) * (TN + FP) * (TN + FN) AS FLOAT)), 0)
    AS DECIMAL(10, 4)) AS correlation,

    -- Positive Predictive Value (PPV): Trong số những người ĐÃ LÀM hành động, bao nhiêu % ở lại?
    -- Công thức: TP / (TP + FP)
    CAST(TP AS FLOAT) / NULLIF(CAST(TP + FP AS FLOAT), 0) AS ppv,

    -- Negative Predictive Value (NPV): Trong số những người KHÔNG LÀM hành động, bao nhiêu % rời đi?
    -- Công thức: TN / (TN + FN)
    CAST(TN AS FLOAT) / NULLIF(CAST(TN + FN AS FLOAT), 0) AS npv
FROM
    metrics_components
-- Sắp xếp kết quả theo Correlation giảm dần để giả thuyết mạnh nhất nổi lên trên cùng.
ORDER BY
    correlation DESC;
Phân Tích Kết Quả
action_hypothesisTPTNFPFNsample_sizecorrelationppvnpv
created_playlist1618610220.36770.72730.6429
followed_artist62222080.20090.75000.5238
played_5_songs42222260.10840.66670.5000
  • created_playlist là “Aha Moment” mạnh nhất:
    • correlation (0.3677): cao nhất trong các giả thuyết. Con số này cho thấy một mối tương quan dương, có ý nghĩa giữa việc tạo playlist và việc ở lại.
    • sample_size (22): Có 22/50 người dùng thực hiện hành động này.
    • ppv (0.7272): Khoảng 73% người dùng tạo playlist trong 7 ngày đầu đã ở lại. Điều này có nghĩa là nếu một người dùng mới tạo playlist, khả năng họ trở thành người dùng trung thành là rất cao.
    • npv (0.6428): Khoảng 64% người dùng không tạo playlist đã rời đi. Điều này củng cố thêm tầm quan trọng của hành động này.
  • followed_artist: Có correlation (0.2009) dương nhưng thấp hơn đáng kể. Mặc dù ppv (75%) có vẻ cao, sample_size lại khá nhỏ (chỉ 8 người), khiến nó trở thành một tín hiệu kém tin cậy hơn so với created_playlist.
  • played_5_songs: Có correlation (0.1084) rất thấp. Điều này cho thấy việc chỉ nghe nhạc một cách thụ động không phải là yếu tố quyết định giữ chân người dùng.
    Hành Động Tiếp Theo

    Phân tích dữ liệu chỉ thực sự có giá trị khi nó dẫn đến các quyết định kinh doanh. Dựa trên insight đã được xác thực lại “tạo playlist là Aha Moment”, đây là các hành động cụ thể và có cơ sở vững chắc cho team Growth và Product:

    • Tối ưu Onboarding (Ưu tiên cao nhất):
      • Hành động: Thiết kế lại luồng hướng dẫn người dùng mới. Ngay sau khi người dùng nghe 1-2 bài hát, hiển thị một pop-up hoặc một gợi ý nổi bật hướng dẫn họ tạo ngay một playlist.
      • Mục tiêu: Giảm thời gian đến “Aha Moment”, giúp người dùng nhận ra giá trị nhanh hơn và tăng tỷ lệ giữ chân ngay từ tuần đầu tiên.
    • Tạo Chiến Dịch Kích Hoạt:
      • Hành động: Thiết lập một chiến dịch tự động. Với những user đã đăng ký được 3 ngày mà chưa tạo playlist, gửi cho họ một email hoặc thông báo đẩy (push notification) với tiêu đề hấp dẫn như: “Tạo playlist đầu tiên chỉ trong 30 giây!” kèm theo hướng dẫn đơn giản.
      • Mục tiêu: “Vớt” lại những người dùng có nguy cơ rời bỏ bằng cách chủ động thúc đẩy họ thực hiện hành động then chốt.
    • Cải tiến Sản phẩm:
      • Hành động: Ưu tiên các tính năng giúp việc tạo playlist trở nên dễ dàng và thú vị hơn. Ví dụ: thêm nút “Add to new playlist” nổi bật hơn ngay trên màn hình chơi nhạc. Thực hiện A/B testing vị trí của nút này để tối ưu hóa tỷ lệ click.
      • Mục tiêu: Tích hợp “Aha Moment” sâu hơn vào trải nghiệm cốt lõi của sản phẩm, biến nó thành một hành động tự nhiên và không thể thiếu.

      Source Code

      Leave a Comment