Appearance
🎮 Forecast Simulator — Dự Báo Như Pro!
Bạn vừa trở thành Lead Forecasting Analyst tại ForecastPro Inc. 🔮 — công ty tư vấn forecasting cho retail và e-commerce. Mỗi tuần, clients gửi đến time series data và hỏi: "Dự báo giúp chúng tôi! Dùng method nào? Forecast bao nhiêu? Tin được không?" 7 vòng, mỗi vòng: phân tích data → chọn method → forecast. Forecast gần actual = điểm cao. MAPE thấp = Gold! 🏆
🎯 Mục tiêu học tập
Sau khi hoàn thành game, bạn sẽ:
- Nhận diện time series patterns — trend, seasonality, noise level
- Chọn forecasting method phù hợp — Naïve, SMA, ETS, Holt-Winters
- Hiểu trade-off giữa simple và complex methods
- Đánh giá forecast accuracy — MAE, MAPE
- Tư duy khi nào forecast đáng tin — và khi nào không
📜 Luật chơi
┌──────────────────────────────────────────────────────┐
│ BẠN = Lead Forecasting Analyst 🔮 │
│ CLIENTS = 7 businesses cần forecast │
│ MỖI VÒNG = 1 dataset → chọn method → forecast │
│ MAPE THẤP = ĐIỂM CAO │
│ MỤC TIÊU = Tổng MAPE trung bình < 10% → Gold 🥇 │
└──────────────────────────────────────────────────────┘Cách tính điểm mỗi vòng:
| Kết quả MAPE | XP |
|---|---|
| MAPE < 5% | +15 XP 🟢 Excellent |
| MAPE 5-10% | +12 XP 🟡 Good |
| MAPE 10-20% | +8 XP 🟠 Fair |
| MAPE 20-30% | +4 XP 🔴 Poor |
| MAPE > 30% | +0 XP 💀 Fail |
| Không dùng hint | +2 XP bonus ⚡ |
| Giải thích đúng lý do chọn method | +3 XP bonus 🧠 |
Tổng XP tối đa: 7 × 15 = 105 XP (chưa tính bonus)
Nguyên tắc quan trọng:
- 🔮 Method phù hợp data pattern — không phải complex = tốt hơn
- 📊 Train/Test split temporal — KHÔNG random!
- 📈 Trend + Seasonality → cần Holt-Winters — SMA/SES không capture
🏆 Bảng xếp hạng & Huy hiệu
Ranks (dựa trên Average MAPE qua 7 vòng)
| Hạng | Average MAPE | Mô tả |
|---|---|---|
| 🥇 Gold — Forecast Master | < 10% | Bạn forecast như Walmart, Amazon! |
| 🥈 Silver — Forecast Apprentice | 10-15% | Tốt! Cần luyện thêm seasonal patterns. |
| 🥉 Bronze — Forecast Beginner | 15-25% | Cơ bản OK nhưng chọn sai method cho nhiều cases. |
| 💀 Game Over | > 25% | Client mất tiền vì forecast sai — ôn lại Buổi 16! |
Huy hiệu đặc biệt
| Badge | Điều kiện | Mô tả |
|---|---|---|
| 📈 Trend Spotter | MAPE < 8% vòng có trend (Vòng 1, 3, 5) | Bắt trend chuẩn xác! |
| 🔄 Season Expert | MAPE < 8% vòng có seasonality (Vòng 2, 4, 6) | Seasonal pattern master! |
| 🎯 Sniper | MAPE < 5% bất kỳ vòng nào | Forecast accuracy on point! |
| 🔥 Full Streak | MAPE < 15% tất cả 7 vòng | Consistent across all scenarios! |
| 🏆 Perfect Score | Average MAPE < 7% | Forecasting legend! |
| 💡 No Hints Hero | Không dùng hint cả game | Pure forecasting intuition! |
🎲 Chỉ số theo dõi
┌─────────────────────────────────┐
│ 🔮 FORECAST SCOREBOARD │
│ ─────────────────────────── │
│ XP hiện tại: ___/105 │
│ Vòng hiện tại: ___/7 │
│ Avg MAPE: ___% │
│ Best MAPE: ___% │
│ Worst MAPE: ___% │
│ Hints used: ___ │
│ Hạng dự kiến: ___ │
└─────────────────────────────────┘🎮 BẮT ĐẦU GAME!
🔵 VÒNG 1: "Coffee Shop Revenue — Chỉ có Trend" (+15 XP)
🏷️ Category: Trend Detection
Tình huống:
Bean & Brew — chuỗi coffee shop, 15 stores tại TP.HCM. Monthly revenue 2 năm (24 months):
| Month | Revenue (triệu VND) | Month | Revenue (triệu VND) |
|---|---|---|---|
| M1 | 320 | M13 | 485 |
| M2 | 335 | M14 | 500 |
| M3 | 348 | M15 | 518 |
| M4 | 360 | M16 | 530 |
| M5 | 375 | M17 | 545 |
| M6 | 390 | M18 | 558 |
| M7 | 405 | M19 | 570 |
| M8 | 418 | M20 | 585 |
| M9 | 430 | M21 | 600 |
| M10 | 445 | M22 | 612 |
| M11 | 460 | M23 | 625 |
| M12 | 470 | M24 | 640 |
Pattern: Revenue tăng đều ~15 triệu/tháng. Không có seasonal dip/spike rõ. Trend tuyến tính rõ ràng.
Câu hỏi: Forecast M25 (tháng tiếp theo)?
4 lựa chọn:
| Method | Forecast M25 | Logic | |
|---|---|---|---|
| A | Naïve (F = Y_last) | 640 | Lấy giá trị cuối |
| B | SMA(12) | 576 | Average 12 tháng gần nhất |
| C | Holt (Double ETS — level + trend) | 655 | Capture trend tuyến tính |
| D | Holt-Winters (triple) | 658 | Full model với seasonal |
💡 Hint (−2 XP)
Data chỉ có trend rõ, KHÔNG có seasonal pattern. Method nào capture trend mà KHÔNG over-complicate?
✅ Đáp án
C — Holt (Double Exponential Smoothing) — Forecast: 655 triệu VND. Actual: 652. MAPE = 0.5% 🟢
Tại sao C:
- Data có trend tuyến tính rõ ràng (+15/month), không có seasonality
- A (Naïve): 640 = level cuối cùng, bỏ qua trend → under-forecast. MAPE ~1.8%
- B (SMA 12): 576 = average, lag behind trend rất nhiều → MAPE ~11.7%
- C (Holt): Level + Trend → capture đúng growth direction. MAPE ~0.5%
- D (Holt-Winters): Thêm seasonal component nhưng data KHÔNG có seasonality → over-fitting, unnecessary complexity. MAPE ~1.2%
Bài học: Đừng dùng model phức tạp hơn cần thiết. Trend only → Holt. Có seasonal → Holt-Winters.
🔵 VÒNG 2: "Ice Cream Shop — Seasonality rõ ràng" (+15 XP)
🏷️ Category: Seasonal Pattern
Tình huống:
TroBăng — chuỗi kem, 8 stores. Monthly sales (nghìn ly) qua 3 năm:
| Month | Year 1 | Year 2 | Year 3 |
|---|---|---|---|
| Jan | 12 | 13 | 14 |
| Feb | 14 | 15 | 16 |
| Mar | 18 | 19 | 20 |
| Apr | 25 | 27 | 28 |
| May | 35 | 37 | 39 |
| Jun | 42 | 44 | 46 |
| Jul | 45 | 47 | ??? |
| Aug | 40 | 42 | |
| Sep | 30 | 32 | |
| Oct | 20 | 21 | |
| Nov | 15 | 16 | |
| Dec | 13 | 14 |
Pattern: Rõ ràng seasonal — peak mùa hè (Jun-Aug), low mùa đông (Nov-Jan). Mild upward trend.
Câu hỏi: Forecast July Year 3 (nghìn ly)?
4 lựa chọn:
| Method | Forecast | Logic | |
|---|---|---|---|
| A | Naïve (F = Jun Y3) | 46 | Last value |
| B | Seasonal Naïve (F = Jul Y2) | 47 | Same month last year |
| C | SMA(6) | 27 | Average 6 tháng gần nhất |
| D | Holt-Winters (additive) | 49 | Trend + Seasonal model |
💡 Hint (−2 XP)
Data có trend nhẹ tăng + seasonal pattern 12 tháng rõ ràng. Method nào capture BOTH?
✅ Đáp án
D — Holt-Winters Additive — Forecast: 49 nghìn ly. Actual: 48.5. MAPE = 1.0% 🟢
Tại sao D:
- Seasonal pattern rõ: peak Jul = highest month. Trend tăng ~1-2 nghìn ly/năm.
- A (Naïve): 46 = June value. July luôn > June → under-forecast. MAPE ~5.2%
- B (Seasonal Naïve): 47 = July Year 2. Không capture trend tăng → slightly under. MAPE ~3.1%
- C (SMA 6): Average Jan-Jun → 27. MISS seasonal peak hoàn toàn! MAPE ~44%. Tệ nhất.
- D (Holt-Winters): Capture trend (+2/year) + seasonal (July = peak) → 49. MAPE ~1%
Bài học: Khi data có BOTH trend và seasonality → Holt-Winters. SMA fail catastrophically trên seasonal data.
🔵 VÒNG 3: "Startup SaaS — Exponential Growth" (+15 XP)
🏷️ Category: Non-Linear Trend
Tình huống:
CloudSync — SaaS startup, MRR (Monthly Recurring Revenue) qua 18 tháng:
| Month | MRR (triệu VND) | Month | MRR (triệu VND) |
|---|---|---|---|
| M1 | 50 | M10 | 250 |
| M2 | 58 | M11 | 290 |
| M3 | 68 | M12 | 335 |
| M4 | 80 | M13 | 385 |
| M5 | 95 | M14 | 440 |
| M6 | 112 | M15 | 505 |
| M7 | 130 | M16 | 575 |
| M8 | 155 | M17 | 655 |
| M9 | 185 | M18 | 750 |
Pattern: Exponential growth ~15%/month. Không seasonal. Curve convex (tăng nhanh dần).
Câu hỏi: Forecast M19?
4 lựa chọn:
| Method | Forecast M19 | Logic | |
|---|---|---|---|
| A | Naïve | 750 | Last value — flat |
| B | SMA(3) | 660 | Average last 3 — lag |
| C | Holt (additive trend) | 840 | Linear trend extrapolation |
| D | Holt (multiplicative trend) | 862 | Exponential trend extrapolation |
💡 Hint (−2 XP)
Growth rate tương đối (%) ổn định, không phải tuyệt đối (+VND). Tháng trước tăng 95, tháng trước nữa tăng 80. Tăng dần → trend KHÔNG linear.
✅ Đáp án
D — Holt Multiplicative Trend — Forecast: 862 triệu VND. Actual: 855. MAPE = 0.8% 🟢
Tại sao D:
- Growth ~15%/month → multiplicative (exponential), không additive (linear)
- A (Naïve): 750 → bỏ qua growth hoàn toàn. MAPE ~12.3%
- B (SMA 3): 660 → lag behind exponential curve. MAPE ~22.8%
- C (Holt Additive): Assume linear growth (~85/month cuối) → 840. Close nhưng slightly under vì actual growth accelerating. MAPE ~1.8%
- D (Holt Multiplicative): Assume % growth ổn định → 862. Best fit cho exponential data. MAPE ~0.8%
Bài học: Additive trend = constant AMOUNT increase. Multiplicative trend = constant PERCENTAGE increase. SaaS MRR thường multiplicative.
🔵 VÒNG 4: "Supermarket — Noisy Data" (+15 XP)
🏷️ Category: Noise Handling
Tình huống:
GreenMart — siêu thị, daily sales (triệu VND) tuần vừa rồi:
| Day | Mon | Tue | Wed | Thu | Fri | Sat | Sun |
|---|---|---|---|---|---|---|---|
| Week 1 | 180 | 165 | 210 | 175 | 230 | 310 | 285 |
| Week 2 | 195 | 155 | 185 | 190 | 245 | 320 | 275 |
| Week 3 | 170 | 180 | 195 | 160 | 220 | 305 | 290 |
| Week 4 | 185 | 170 | 200 | 185 | 235 | ??? |
Pattern: Weekend (Sat-Sun) bán nhiều hơn weekday. Nhưng data noisy — variance cao giữa các ngày.
Câu hỏi: Forecast Saturday Week 4?
4 lựa chọn:
| Method | Forecast | Logic | |
|---|---|---|---|
| A | Naïve (F = Friday W4) | 235 | Last value |
| B | SMA(7) — average tuần W4 | 195 | Smooth noise |
| C | Seasonal Naïve (F = Sat W3) | 305 | Same day last week |
| D | Average of all Saturdays | 312 | Mean(310, 320, 305) |
💡 Hint (−2 XP)
Saturday luôn là peak day. Nhìn 3 tuần: Sat = 310, 320, 305. Có weekly seasonal pattern rõ. Data noisy nhưng day-of-week pattern stable.
✅ Đáp án
D — Average of all Saturdays — Forecast: 312 triệu VND. Actual: 315. MAPE = 1.0% 🟢
Tại sao D:
- Weekly seasonality rõ ràng: Sat = peak, mid-week = low
- A (Naïve = Friday): 235 ← Friday ≠ Saturday! Wrong day pattern. MAPE ~25.4%
- B (SMA 7): 195 → average ALL days → miss Saturday peak. MAPE ~38.1%
- C (Seasonal Naïve): 305 = last Saturday → reasonable nhưng chỉ 1 data point. MAPE ~3.2%
- D (Mean Saturdays): 312 → average 3 Saturdays, smooth out noise. MAPE ~1.0%
Bài học: Khi seasonal pattern rõ + noise cao → average CÙNG SEASON period giảm noise hiệu quả. Naïve sai vì dùng wrong season (Friday ≠ Saturday).
🔵 VÒNG 5: "E-commerce — Promotion Spike" (+15 XP)
🏷️ Category: External Event
Tình huống:
ShopFast — e-commerce, monthly orders (nghìn đơn):
| Month | Orders | Note |
|---|---|---|
| Jan | 45 | |
| Feb | 42 | Tết → dip |
| Mar | 48 | |
| Apr | 50 | |
| May | 52 | |
| Jun | 55 | |
| Jul | 53 | |
| Aug | 56 | |
| Sep | 58 | |
| Oct | 60 | |
| Nov | 120 | 11.11 Flash Sale! |
| Dec | 65 | |
| Jan Y2 | 62 | |
| Feb Y2 | 58 | Tết |
| Mar Y2 | ??? | Normal month |
Pattern: Trend tăng nhẹ. November spike do 11.11 promotion — outlier, không phải seasonality!
Câu hỏi: Forecast Mar Y2?
4 lựa chọn:
| Method | Forecast | Logic | |
|---|---|---|---|
| A | SMA(3) | 80 | Average (120+65+62)/3 — includes Nov spike! |
| B | SMA(12) | 67 | Average all 12 months — diluted Nov |
| C | Holt-Winters | 72 | Full model nhưng Nov distorts seasonal factor |
| D | SMA(3) SAU KHI remove outlier Nov → replace 120→57 | 62 | Clean data first |
💡 Hint (−2 XP)
November 120K = outlier do promotion, KHÔNG phải seasonal pattern. Nếu include trong model → mọi forecast bị inflate. Need to clean outlier trước khi forecast.
✅ Đáp án
D — SMA(3) sau khi clean outlier — Forecast: 62 nghìn đơn. Actual: 63. MAPE = 1.6% 🟢
Tại sao D:
- November 120K = one-time promotion spike, NOT seasonal. Include nó = poison model.
- A (SMA 3 raw): 80 → inflated bởi Nov 120K. Actual 63 → MAPE ~27%. Terrible!
- B (SMA 12): 67 → Nov diluted nhưng still affects. MAPE ~6.3%. OK nhưng not best.
- C (Holt-Winters): Treat Nov as "seasonal November" → expect next Nov also 120K. Wrong! MAPE ~14.3% trên Mar forecast.
- D (Clean then SMA): Replace 120→57 (estimated baseline), SMA(3) trên clean data = (57+65+62)/3 ≈ 62. Actual 63. MAPE ~1.6%
Bài học: LUÔN check outliers trước khi forecast. Promotion spikes = external events, not intrinsic pattern. Clean hoặc adjust trước khi fit model.
🔵 VÒNG 6: "Hotel Bookings — Additive vs Multiplicative" (+15 XP)
🏷️ Category: Decomposition Choice
Tình huống:
SunHotel — khách sạn biển, monthly bookings (phòng/tháng):
| Quarter | Year 1 | Year 2 | Year 3 | Year 4 |
|---|---|---|---|---|
| Q1 (Jan-Mar) | 200 | 250 | 310 | 380 |
| Q2 (Apr-Jun) | 350 | 440 | 550 | 680 |
| Q3 (Jul-Sep) | 500 | 620 | 780 | ??? |
| Q4 (Oct-Dec) | 280 | 350 | 440 |
Pattern: Trend tăng mạnh. Q3 (summer) luôn là peak. Seasonal amplitude TĂNG theo trend — Year 1 peak 500, Year 3 peak 780. Tỷ lệ Q3/Q1 ≈ 2.5x ổn định.
Câu hỏi: Forecast Q3 Year 4 (phòng/tháng)?
4 lựa chọn:
| Method | Forecast Q3 Y4 | Logic | |
|---|---|---|---|
| A | HW Additive seasonal | 900 | Seasonal add constant amount |
| B | HW Multiplicative seasonal | 975 | Seasonal multiply by proportion |
| C | Seasonal Naïve (= Q3 Y3) | 780 | Same quarter last year |
| D | SMA(4) | 553 | Average last 4 quarters |
💡 Hint (−2 XP)
Seasonal amplitude TĂNG theo trend: Y1 summer swing = 300 (500-200), Y3 summer swing = 470 (780-310). Swing tỷ lệ với level → multiplicative seasonality, không additive.
✅ Đáp án
B — Holt-Winters Multiplicative — Forecast: 975 phòng. Actual: 960. MAPE = 1.6% 🟢
Tại sao B:
- Seasonal amplitude tăng proportionally → multiplicative model
- Q3/mean ratio ≈ 1.50 stable across years
- A (HW Additive): Add fixed seasonal = 300 (Y1 season) → 900. Under-forecast vì actual swing larger. MAPE ~6.3%
- B (HW Multiplicative): Multiply by seasonal ratio ~1.50 → 975. Match data pattern. MAPE ~1.6%
- C (Seasonal Naïve): 780 = Y3 Q3. Miss trend growth. MAPE ~18.8%
- D (SMA 4): Average → 553. Miss everything. MAPE ~42.4%
Bài học: Nếu seasonal swings tăng theo trend → Multiplicative. Nếu swings cố định → Additive. Nhìn data visualization hoặc compute seasonal ratios.
🔴 VÒNG 7: "The Ultimate Challenge — COVID Disruption" (+15 XP)
🏷️ Category: Structural Break & Judgment
Tình huống:
FlyHigh — hãng hàng không nội địa. Monthly passengers (nghìn):
| Year | Q1 avg | Q2 avg | Q3 avg | Q4 avg |
|---|---|---|---|---|
| 2018 | 450 | 520 | 600 | 480 |
| 2019 | 480 | 560 | 650 | 520 |
| 2020 | 200 | 50 | 180 | 280 |
| 2021 | 300 | 350 | 250 | 380 |
| 2022 | 420 | 500 | 580 | 470 |
| 2023 | 470 | 550 | 640 | 510 |
| 2024 | 500 | 580 | 670 | 540 |
| 2025-Q1 | 520 |
Pattern: Pre-COVID (2018-2019): stable growth. COVID (2020-2021): collapse + recovery. Post-COVID (2022-2024): recovery + return to trend.
Câu hỏi: Forecast Q2 2025?
4 lựa chọn:
| Method | Forecast | Logic | |
|---|---|---|---|
| A | HW trên ALL data (2018-2025Q1) | 480 | Include COVID years → model confused |
| B | HW trên POST-COVID only (2022-2025Q1) | 605 | Clean data, recent trend |
| C | HW trên PRE-COVID (2018-2019) → extrapolate | 620 | As if COVID never happened |
| D | HW POST-COVID + seasonal factor from PRE-COVID | 610 | Best of both: recent trend + long-term seasonality |
💡 Hint (−2 XP)
COVID 2020-2021 là structural break — pattern bị phá vỡ hoàn toàn. Include nó trong training data sẽ confuse model (giảm trend, distort seasonality). Nhưng PRE-COVID seasonality pattern VẪN ĐÚNG cho post-COVID. Combine?
✅ Đáp án
D — HW POST-COVID + PRE-COVID seasonality — Forecast: 610 nghìn. Actual: 608. MAPE = 0.3% 🟢
Tại sao D:
- COVID = structural break. Data 2020-2021 = anomalous, KHÔNG đại diện cho future.
- A (All data): COVID data pull model down → Q3 seasonal factor bị giảm. Forecast 480 = way too low. MAPE ~21.1%
- B (Post-COVID only): 3 năm data = vừa đủ cho HW. Forecast 605 = reasonable. MAPE ~0.5%
- C (Pre-COVID extrapolate): Ignore 2020+ recovery pattern. As if growth continued linearly from 2019. Forecast 620 = slightly over vì growth rate post-COVID hơi khác. MAPE ~2.0%
- D (Hybrid): Post-COVID level + trend (2022-2025Q1) + seasonal RATIOS from pre-COVID (2018-2019, more data = better seasonal estimates). Best of both worlds. MAPE ~0.3%
Bài học QUAN TRỌNG NHẤT:
- Structural breaks (COVID, recession, new competitor) → split data at break point
- Don't train on anomalous periods — model learns wrong patterns
- Seasonality survives structural breaks — summer is still summer after COVID
- Expert judgment + model = best — recognize break, adjust training data accordingly
📊 KẾT QUẢ GAME
Tổng kết điểm
┌───────────────────────────────────────────────────┐
│ 🔮 FORECAST SIMULATOR — KẾT QUẢ │
│ ─────────────────────────────────────────────── │
│ Vòng 1 (Trend): MAPE ___% → ___ XP │
│ Vòng 2 (Seasonal): MAPE ___% → ___ XP │
│ Vòng 3 (Exponential): MAPE ___% → ___ XP │
│ Vòng 4 (Noisy): MAPE ___% → ___ XP │
│ Vòng 5 (Outlier): MAPE ___% → ___ XP │
│ Vòng 6 (Add vs Mul): MAPE ___% → ___ XP │
│ Vòng 7 (Structural): MAPE ___% → ___ XP │
│ ─────────────────────────────────────────────── │
│ TỔNG XP: ___/105 │
│ AVG MAPE: ___% │
│ HẠNG: ___ │
│ BADGES: ___ │
└───────────────────────────────────────────────────┘Bài học tổng hợp từ 7 vòng
| Vòng | Pattern | Best Method | Key Lesson |
|---|---|---|---|
| 1 | Trend only | Holt (Double ETS) | Simple trend → Holt. Đừng over-complicate |
| 2 | Trend + Season | Holt-Winters | Season rõ → HW additive |
| 3 | Exponential growth | Holt Multiplicative | % growth → multiplicative trend |
| 4 | Noisy + Weekly season | Average same day | Season stable, noise high → average cùng period |
| 5 | Outlier from promotion | Clean then forecast | ALWAYS clean outliers trước khi model |
| 6 | Growing season amplitude | HW Multiplicative | Season tỷ lệ theo level → multiplicative |
| 7 | Structural break (COVID) | Hybrid approach | Split at break, combine post + pre seasonality |
💡 Golden Rules of Forecasting
- Visualize first — nhìn data trước khi chọn method
- Simple baseline — bắt đầu bằng Naïve, beat it?
- Match method to pattern — trend → Holt, seasonal → HW
- Clean before model — outliers, missing values
- Additive vs Multiplicative — check seasonal amplitude
- Structural breaks — split data, don't train on anomalies
- Prediction interval — never just point forecast