🎯 Mục tiêu bài học
- Phân tích transaction patterns theo thời gian, kênh, và loại giao dịch
- Xây dựng channel analysis đánh giá hiệu quả các kênh giao dịch
- Phát hiện anomaly (giao dịch bất thường) bằng statistical methods
- Phân tích số dư tài khoản và xu hướng khách hàng
| Thông tin | Chi tiết |
|---|---|
| ⏱️ Thời lượng | 2 giờ |
| 📖 Chủ đề chính | Transaction Patterns, Channel Analysis, Anomaly Detection |
| 💡 Kiến thức cần có | SQL, Statistics cơ bản |
| 🎯 Output | Transaction Analysis Report |
📖 Thuật ngữ quan trọng
| Thuật ngữ | Tiếng Việt | Mô tả |
|---|---|---|
| Transaction Volume | Số lượng giao dịch | Tổng số giao dịch trong khoảng thời gian |
| Transaction Value | Giá trị giao dịch | Tổng giá trị tiền của các giao dịch |
| Channel Mix | Cơ cấu kênh | Tỷ trọng giao dịch theo kênh (Mobile, ATM, Branch) |
| Digital Adoption | Tỷ lệ số hóa | % giao dịch qua kênh digital (Mobile + Online) |
| Anomaly | Bất thường | Giao dịch có giá trị hoặc pattern khác thường |
| Average Balance | Số dư bình quân | Trung bình số dư tài khoản trong kỳ |
| Peak Hours | Giờ cao điểm | Thời điểm giao dịch nhiều nhất |
| Dormant Account | Tài khoản ngủ | Tài khoản không giao dịch > 3 tháng |
Checkpoint
Transaction Analysis trong ngân hàng bao gồm: Volume & Value trends, Channel Mix (Mobile đang tăng mạnh, thay thế Branch), Anomaly Detection (phát hiện giao dịch bất thường có thể là fraud), và Balance Analysis (số dư phản ánh sức khỏe tài chính KH).
📊 Transaction Volume & Value Trends
Giao dịch theo thời gian
1-- 1. Daily transaction volume & value2SELECT 3 transaction_date,4 COUNT(*) AS txn_count,5 SUM(amount) AS total_value,6 ROUND(AVG(amount), 0) AS avg_txn_value,7 COUNT(DISTINCT customer_id) AS unique_customers8FROM fact_transaction9GROUP BY transaction_date10ORDER BY transaction_date;Giao dịch theo loại
1-- 2. Transaction mix theo loại2SELECT 3 transaction_type,4 COUNT(*) AS txn_count,5 ROUND(COUNT(*) * 100.0 / SUM(COUNT(*)) OVER(), 1) AS pct_count,6 SUM(amount) AS total_value,7 ROUND(SUM(amount) * 100.0 / SUM(SUM(amount)) OVER(), 1) AS pct_value,8 ROUND(AVG(amount), 0) AS avg_value,9 ROUND(PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY amount) OVER (PARTITION BY transaction_type), 0) AS median_value10FROM fact_transaction11GROUP BY transaction_type12ORDER BY txn_count DESC;Weekly Pattern
1-- 3. Giao dịch theo ngày trong tuần2SELECT 3 DATENAME(WEEKDAY, transaction_date) AS day_name,4 DATEPART(WEEKDAY, transaction_date) AS day_number,5 COUNT(*) AS txn_count,6 ROUND(AVG(amount), 0) AS avg_amount,7 COUNT(DISTINCT customer_id) AS unique_customers8FROM fact_transaction9GROUP BY DATENAME(WEEKDAY, transaction_date), DATEPART(WEEKDAY, transaction_date)10ORDER BY day_number;| Ngày | Volume | Ghi chú |
|---|---|---|
| Monday | 🟦🟦🟦🟦🟦🟦🟦🟦🟦🟦 | 📈 Cao — đầu tuần |
| Tuesday | 🟦🟦🟦🟦🟦🟦🟦🟦🟦 | |
| Wednesday | 🟦🟦🟦🟦🟦🟦🟦🟦 | |
| Thursday | 🟦🟦🟦🟦🟦🟦🟦🟦🟦 | |
| Friday | 🟦🟦🟦🟦🟦🟦🟦🟦🟦🟦 | 📈 Cao — cuối tuần lương |
| Saturday | 🟦🟦🟦🟦🟦🟦 | 📉 Giảm |
| Sunday | 🟦🟦🟦🟦🟦 | 📉 Thấp nhất |
📱 Channel Analysis
Channel Mix & Digital Adoption
1-- 4. Channel analysis2SELECT 3 channel,4 COUNT(*) AS txn_count,5 ROUND(COUNT(*) * 100.0 / SUM(COUNT(*)) OVER(), 1) AS pct_count,6 SUM(amount) AS total_value,7 ROUND(AVG(amount), 0) AS avg_value,8 COUNT(DISTINCT customer_id) AS unique_customers9FROM fact_transaction10GROUP BY channel11ORDER BY txn_count DESC;Digital Adoption Rate
1-- 5. Digital Adoption theo tháng (trend)2SELECT 3 FORMAT(transaction_date, 'yyyy-MM') AS month,4 COUNT(*) AS total_txn,5 SUM(CASE WHEN channel IN ('Mobile', 'Online') THEN 1 ELSE 0 END) AS digital_txn,6 ROUND(7 SUM(CASE WHEN channel IN ('Mobile', 'Online') THEN 1.0 ELSE 0 END) 8 / COUNT(*) * 100, 19 ) AS digital_adoption_pct10FROM fact_transaction11GROUP BY FORMAT(transaction_date, 'yyyy-MM')12ORDER BY month;Channel Preference theo Customer Segment
1-- 6. Channel preference theo income segment2SELECT 3 CASE 4 WHEN c.monthly_income >= 50000000 THEN 'Priority'5 WHEN c.monthly_income >= 20000000 THEN 'Affluent'6 ELSE 'Mass'7 END AS segment,8 t.channel,9 COUNT(*) AS txn_count,10 ROUND(COUNT(*) * 100.0 / SUM(COUNT(*)) OVER (11 PARTITION BY CASE 12 WHEN c.monthly_income >= 50000000 THEN 'Priority'13 WHEN c.monthly_income >= 20000000 THEN 'Affluent'14 ELSE 'Mass'15 END16 ), 1) AS pct_within_segment17FROM fact_transaction t18JOIN dim_customer c ON t.customer_id = c.customer_id19GROUP BY 20 CASE 21 WHEN c.monthly_income >= 50000000 THEN 'Priority'22 WHEN c.monthly_income >= 20000000 THEN 'Affluent'23 ELSE 'Mass'24 END,25 t.channel26ORDER BY segment, txn_count DESC;Mobile banking đã chiếm 45% giao dịch tại VNCredit Bank, tiếp tục tăng mạnh. Ngân hàng đang:
- Giảm chi nhánh vật lý (Branch chỉ còn 10%)
- Đẩy mạnh ưu đãi trên Mobile app
- ATM vẫn quan trọng cho rút tiền mặt (25%)
- Online banking (20%) cho chuyển khoản lớn
🔍 Anomaly Detection
Phát hiện giao dịch bất thường
1-- 7. Anomaly detection — giao dịch ngoài 3 sigma2WITH customer_stats AS (3 SELECT 4 customer_id,5 AVG(amount) AS avg_amount,6 STDEV(amount) AS std_amount,7 COUNT(*) AS txn_count8 FROM fact_transaction9 GROUP BY customer_id10 HAVING COUNT(*) >= 1011)12SELECT 13 t.transaction_id,14 t.customer_id,15 t.transaction_date,16 t.transaction_type,17 t.amount,18 t.channel,19 cs.avg_amount,20 cs.std_amount,21 ROUND((t.amount - cs.avg_amount) / NULLIF(cs.std_amount, 0), 2) AS z_score22FROM fact_transaction t23JOIN customer_stats cs ON t.customer_id = cs.customer_id24WHERE ABS((t.amount - cs.avg_amount) / NULLIF(cs.std_amount, 0)) > 325ORDER BY ABS((t.amount - cs.avg_amount) / NULLIF(cs.std_amount, 0)) DESC;Balance Analysis
1-- 8. Average balance theo customer segment2SELECT 3 CASE 4 WHEN c.monthly_income >= 50000000 THEN 'Priority'5 WHEN c.monthly_income >= 20000000 THEN 'Affluent'6 ELSE 'Mass'7 END AS segment,8 COUNT(DISTINCT t.customer_id) AS customers,9 ROUND(AVG(t.balance_after), 0) AS avg_balance,10 ROUND(MIN(t.balance_after), 0) AS min_balance,11 ROUND(MAX(t.balance_after), 0) AS max_balance12FROM fact_transaction t13JOIN dim_customer c ON t.customer_id = c.customer_id14GROUP BY 15 CASE 16 WHEN c.monthly_income >= 50000000 THEN 'Priority'17 WHEN c.monthly_income >= 20000000 THEN 'Affluent'18 ELSE 'Mass'19 END20ORDER BY avg_balance DESC;Dormant Account Detection
1-- 9. Tài khoản ngủ — không giao dịch > 90 ngày2SELECT 3 c.customer_id,4 c.monthly_income,5 c.city,6 MAX(t.transaction_date) AS last_txn_date,7 DATEDIFF(DAY, MAX(t.transaction_date), '2024-12-31') AS days_inactive,8 COUNT(*) AS total_txn_before_dormant9FROM dim_customer c10JOIN fact_transaction t ON c.customer_id = t.customer_id11GROUP BY c.customer_id, c.monthly_income, c.city12HAVING DATEDIFF(DAY, MAX(t.transaction_date), '2024-12-31') > 9013ORDER BY days_inactive DESC;Checkpoint
Transaction Analysis: Volume/Value trends theo thời gian, Channel Mix (Mobile 45% đang dẫn đầu), Weekly patterns (peak Monday & Friday). Anomaly Detection dùng Z-score (|z| > 3 = bất thường). Balance Analysis theo segment cho thấy Priority có số dư cao gấp 10x Mass. Dormant accounts (>90 ngày không GD) cần chiến dịch reactivation.
📋 Tổng kết
Kiến thức đã học
| Chủ đề | Nội dung chính |
|---|---|
| Transaction Trends | Volume/Value theo thời gian, seasonal patterns |
| Channel Analysis | Mobile (45%), ATM, POS, Branch — migration trend |
| Anomaly Detection | Z-score > 3 = flag bất thường, cần điều tra |
| Balance Analysis | Số dư theo segment: Priority >> Affluent >> Mass |
| Dormant Accounts | > 90 ngày không GD = reactivation target |
Key Takeaways
- ✅ Channel migration sang Mobile banking là xu hướng — cần đầu tư UX
- ✅ Z-score là công cụ đơn giản mà hiệu quả cho anomaly detection
- ✅ Weekly patterns giúp tối ưu staffing và capacity planning
- ✅ Dormant accounts cần reactivation campaigns trước khi trở thành churn
Câu hỏi tự kiểm tra
- Z-score > 3 trong transaction analysis nghĩa là gì?
- Tại sao Mobile banking chiếm tỷ trọng ngày càng cao?
- Dormant account được định nghĩa như thế nào?
- Weekly pattern giúp ngân hàng tối ưu điều gì?
Bài tiếp theo: Branch Performance →
🎉 Tuyệt vời! Bạn đã thành thạo Transaction Analysis!
Nhớ: Transaction data là mỏ vàng — trends, anomalies, channels, dormancy đều từ đây. Mobile banking là tương lai!
