Lấy mẫu, khoảng tin cậy và bootstrap
Xem thửSáng thứ Hai, ngày 8/1/2026, Bình mở bảng theo dõi tuần đầu tiên của năm. Quận Bai Bien có 43 trên 246 đơn trễ, tỉ lệ 17,5%. Quận Cho Moi có 38 trên 249 đơn trễ, tỉ lệ 15,3%. Bình đề xuất điều ba shipper từ Cho Moi sang Bai Bien ngay tuần này, vì "Bai Bien trễ nhiều hơn rõ ràng, hơn hẳn 2,2 điểm phần trăm".
Minh hỏi lại một câu đơn giản: nếu tuần đầu tiên có một nhóm khách khác đặt đơn, hai con số đó có còn giữ nguyên thứ tự không?
Trước khi đọc tiếp, hãy ghi ra dự đoán: với khoảng 250 đơn mỗi quận, chênh lệch 2,2 điểm phần trăm có đủ để kết luận Bai Bien trễ nhiều hơn Cho Moi không? Sau đủ sáu tháng dữ liệu, bạn đoán quận nào trễ nhiều hơn?
Sau bài này, bạn có thể
- Giải thích vì sao một con số metric tính trên mẫu luôn dao động, và ước lượng mức dao động bằng sai số chuẩn.
- Tính khoảng tin cậy 95% cho một tỉ lệ bằng công thức và bằng bootstrap tự viết với NumPy, rồi đối chiếu với
scipy.stats.bootstrap. - Tính khoảng tin cậy cho chênh lệch giữa hai nhóm, và quyết định khác biệt đã đáng tin hay cần thêm dữ liệu.
Cần biết trước: bài Thống kê mô tả, phương sai và giá trị ngoại lai (độ lệch chuẩn, phân vị) và bài NumPy: mảng, vectorization và broadcasting ở Chương 2 (axis, chỉ mục bằng mảng).
Mức độ: Trung bình · Thời gian: khoảng 20 phút · Từ khóa: mẫu, sai số chuẩn, khoảng tin cậy, bootstrap, so sánh hai nhóm
Tổng thể, mẫu và vì sao con số metric dao động
Tổng thể (population) là toàn bộ những gì ta muốn kết luận, ví dụ mọi đơn mà quận Bai Bien sẽ có. Mẫu (sample) là phần ta thực sự quan sát được, ví dụ 246 đơn của tuần đầu. Tỉ lệ trễ của mẫu là một ước lượng cho tỉ lệ trễ của tổng thể, và vì mẫu là một lần rút ngẫu nhiên, ước lượng đó dao động.
Để thấy mức dao động, ta làm một thí nghiệm mà ngoài đời không làm được: coi 50.000 đơn là tổng thể (tỉ lệ trễ thật 0,186), rút 2.000 mẫu khác nhau, mỗi mẫu 250 đơn, và tính tỉ lệ trễ của từng mẫu. Kết quả: 95% số mẫu cho tỉ lệ trong khoảng 0,140 đến 0,232. Cùng một tổng thể, chỉ do may rủi khi rút mẫu, một người có thể báo 14% và người khác báo 23%. Với mẫu 2.500 đơn, khoảng đó hẹp lại còn 0,172 đến 0,202.
Phân phối của tỉ lệ qua nhiều lần lấy mẫu gọi là phân phối mẫu (sampling distribution). Độ lệch chuẩn của nó gọi là sai số chuẩn (standard error). Với một tỉ lệ p tính trên n đơn, có công thức:
sai số chuẩn = căn bậc hai của (p × (1 - p) / n)
Với p = 0,186 và n = 250: căn của 0,186 × 0,814 / 250 là 0,0246, khớp với độ lệch chuẩn 0,0248 đo từ 2.000 mẫu. Vì n nằm dưới dấu căn, gấp 10 lần dữ liệu chỉ làm sai số nhỏ đi khoảng 3,2 lần, và muốn sai số giảm một nửa phải có gấp bốn lần dữ liệu.
Mô hình tư duy đầu tiên của bài: một con số metric luôn có sai số; nó chỉ là một lần rút từ phân phối của chính nó. Báo một tỉ lệ mà không kèm sai số giống như báo thời gian giao mà không nói đơn vị.
Khoảng tin cậy: viết sai số thành một khoảng
Khoảng tin cậy 95% (confidence interval, CI) cho một tỉ lệ thường được tính bằng:
p - 1,96 × sai số chuẩn đến p + 1,96 × sai số chuẩn
Hệ số 1,96 đến từ phân phối chuẩn: 95% giá trị nằm trong khoảng 1,96 độ lệch chuẩn quanh trung bình. Lưu ý: ở đây phân phối chuẩn được dùng cho phân phối mẫu của tỉ lệ, thứ thật sự gần hình chuông khi n đủ lớn, không phải cho thời gian giao như bài đầu chương. Với Bai Bien tuần đầu: 0,175 ± 1,96 × 0,0242, tức 0,127 đến 0,222.
Nghĩa của "95%": nếu lặp lại việc lấy mẫu rồi tính khoảng theo cùng cách rất nhiều lần, khoảng 95% số khoảng tính ra sẽ chứa giá trị thật. Con số 95% là độ tin cậy của phương pháp, không phải lời hứa về một khoảng cụ thể.
Bootstrap: khi chỉ có một mẫu, mẫu lại chính nó
Ngoài đời, Bình chỉ có một tuần dữ liệu, không thể rút thêm 2.000 tuần đầu khác. Công thức ở trên chỉ có cho vài con số đơn giản như tỉ lệ hay trung bình; với trung vị, p90, hay chênh lệch hai tỉ lệ, công thức phức tạp hoặc không có. Bootstrap (do Bradley Efron đề xuất năm 1979) giải quyết cả hai vấn đề bằng một ý tưởng: dùng chính mẫu làm tổng thể thu nhỏ, rồi mô phỏng việc lấy mẫu lại trên nó. Đây là mô hình tư duy thứ hai của bài.
Cụ thể: từ 246 đơn, rút ngẫu nhiên 246 đơn có hoàn lại (with replacement), tức mỗi lần rút xong lại bỏ đơn đó vào, nên có đơn được rút hai ba lần và có đơn không được rút lần nào. Tính tỉ lệ trễ của mẫu mới. Lặp lại 5.000 lần, ta có 5.000 tỉ lệ, một phân phối mô phỏng phân phối mẫu. Cắt 2,5% ở mỗi đầu, được khoảng tin cậy 95%.
Đang tải sơ đồ…
Cách đọc hình: bắt đầu từ ô cyan, mẫu thật duy nhất. Hai ô tím là một vòng mẫu lại: rút có hoàn lại đủ 246 đơn, rồi tính con số cần đo. Ô cam đầu tiên lặp vòng đó 5.000 lần. Từ 5.000 con số, ô xanh dương lấy phân vị 2,5% và 97,5% làm khoảng tin cậy. Khi con số cần đo là chênh lệch giữa hai nhóm, ô cam thứ hai hỏi khoảng đó có chứa 0 không: chứa 0 thì chưa đủ bằng chứng (ô đỏ), không chứa 0 thì chênh lệch đáng tin (ô xanh lá).
Animation dưới đây chạy vòng lặp đó với 246 đơn tuần đầu của Bai Bien: ba lần mẫu lại đầu tiên, rồi histogram của đủ 5.000 lần. Bấm nút biến thể để làm lại với 6.337 đơn của sáu tháng và so độ rộng khoảng.
Đang tải Animation…
Với 246 đơn, khoảng tin cậy rộng gần 10 điểm phần trăm, từ 0,126 tới 0,224. Tỉ lệ 0,153 của Cho Moi nằm gọn trong đó. Với 6.337 đơn, khoảng chỉ còn 0,176 đến 0,196.
Chênh lệch giữa hai nhóm: khoảng có chứa 0 không
Câu hỏi của Bình là về chênh lệch, nên con số cần bootstrap là tỉ lệ Bai Bien - tỉ lệ Cho Moi. Mỗi vòng, ta mẫu lại riêng từng quận (giữ nguyên số đơn mỗi quận), tính hai tỉ lệ, lấy hiệu. Sau 5.000 vòng, lấy phân vị 2,5% và 97,5% của các hiệu.
Kết quả cho tuần đầu: chênh lệch +0,022, khoảng tin cậy từ -0,046 đến +0,087. Khoảng chứa 0, và chứa cả những chênh lệch âm tới -4,6 điểm, tức dữ liệu tuần đầu tương thích với cả khả năng Cho Moi trễ nhiều hơn. Sau sáu tháng, tỉ lệ thật là Bai Bien 0,186 và Cho Moi 0,195: thứ tự đã đảo ngược. Câu trả lời cho câu hỏi mở bài: 2,2 điểm phần trăm trên khoảng 250 đơn mỗi quận chưa đủ để kết luận gì, và Cho Moi mới là quận trễ nhiều hơn một chút.
Không phải so sánh nào trên tuần đầu cũng vô ích. Khu Cong Nghiep và Dau Pho chênh 17,3 điểm trên cùng cỡ mẫu, khoảng tin cậy từ +0,105 đến +0,241, không chứa 0: kết luận đã đáng tin ngay từ tuần đầu, và sáu tháng sau chênh lệch vẫn là +0,119.
Làm cùng mình
Mọi đoạn code nằm trong thư mục m01/c04/examples của kho lab.
Bước 1: thí nghiệm lấy mẫu từ tổng thể 50.000 đơn.
from pathlib import Path
import numpy as np
import pandas as pd
DATA = Path(__file__).resolve().parents[2] / "data" / "orders.parquet"
late = pd.read_parquet(DATA)["is_late"].to_numpy()
p = late.mean()
rng = np.random.default_rng(7)
print(f"all 50000 orders: late rate {p:.3f}")
for n in (250, 2500):
# 2.000 lần lấy mẫu n đơn khác nhau, mỗi lần tính một tỉ lệ trễ
rates = np.array([rng.choice(late, size=n, replace=False).mean() for _ in range(2000)])
lo, hi = np.percentile(rates, [2.5, 97.5])
formula = np.sqrt(p * (1 - p) / n)
print(f"n={n:<5} first five samples {rates[:5].round(3).tolist()}")
print(f"{'':7} middle 95% of samples {lo:.3f} to {hi:.3f} spread (std) {rates.std():.4f}"
f" formula sqrt(p(1-p)/n) {formula:.4f}")
| Dòng code | Máy làm gì | Vì sao |
|---|---|---|
rng = np.random.default_rng(7) | Tạo bộ sinh số ngẫu nhiên có seed | Chạy lại ra đúng kết quả, kiểm chứng được |
rng.choice(late, size=n, replace=False) | Rút n đơn khác nhau từ tổng thể | Mô phỏng một lần lấy mẫu thật |
np.percentile(rates, [2.5, 97.5]) | Hai đầu của 95% số mẫu ở giữa | Mức dao động thật của tỉ lệ |
np.sqrt(p * (1 - p) / n) | Sai số chuẩn theo công thức | So với độ lệch chuẩn đo được |
Kết quả [Đã chạy] Python 3.12, NumPy 2.5, pandas 3.1, SciPy 1.18, CPU x86_64, ngày 04/11/2026:
all 50000 orders: late rate 0.186
n=250 first five samples [0.212, 0.172, 0.212, 0.22, 0.196]
middle 95% of samples 0.140 to 0.232 spread (std) 0.0248 formula sqrt(p(1-p)/n) 0.0246
n=2500 first five samples [0.197, 0.192, 0.181, 0.179, 0.194]
middle 95% of samples 0.172 to 0.202 spread (std) 0.0076 formula sqrt(p(1-p)/n) 0.0078
Bước 2: bootstrap tự viết cho tỉ lệ trễ tuần đầu của Bai Bien.
from pathlib import Path
import numpy as np
import pandas as pd
DATA = Path(__file__).resolve().parents[2] / "data" / "orders.parquet"
orders = pd.read_parquet(DATA)
week1 = orders[orders["created_at"] < "2026-01-08"]
sample = week1.loc[week1["district"] == "Bai Bien", "is_late"].to_numpy()
n, rate = len(sample), sample.mean()
print(f"Bai Bien week 1: {n} orders, {sample.sum()} late, rate {rate:.3f}")
rng = np.random.default_rng(42)
# Mỗi hàng là một mẫu lại: rút n chỉ số có hoàn lại từ chính mẫu ban đầu
idx = rng.integers(0, n, size=(5000, n))
boot = sample[idx].mean(axis=1)
print(f"first five bootstrap rates {boot[:5].round(3).tolist()}")
lo, hi = np.percentile(boot, [2.5, 97.5])
print(f"bootstrap 95% CI {lo:.3f} to {hi:.3f}")
se = np.sqrt(rate * (1 - rate) / n)
print(f"formula 95% CI {rate - 1.96 * se:.3f} to {rate + 1.96 * se:.3f}")
print(f"rate over all 6 months: {orders.loc[orders['district'] == 'Bai Bien', 'is_late'].mean():.3f}")
| Dòng code | Máy làm gì | Vì sao |
|---|---|---|
rng.integers(0, n, size=(5000, n)) | Ma trận chỉ số ngẫu nhiên, mỗi hàng một lần mẫu lại | Rút có hoàn lại: một chỉ số có thể xuất hiện nhiều lần trong hàng |
sample[idx] | Lấy giá trị theo ma trận chỉ số, shape (5000, 246) | Chỉ mục bằng mảng thay cho 5.000 vòng lặp |
.mean(axis=1) | Tỉ lệ trễ của từng hàng | 5.000 tỉ lệ bootstrap |
np.percentile(boot, [2.5, 97.5]) | Phân vị hai đầu | Khoảng tin cậy 95% kiểu percentile |
Kết quả [Đã chạy] Python 3.12, NumPy 2.5, pandas 3.1, SciPy 1.18, CPU x86_64, ngày 04/11/2026:
Bai Bien week 1: 246 orders, 43 late, rate 0.175
first five bootstrap rates [0.15, 0.167, 0.171, 0.191, 0.187]
bootstrap 95% CI 0.126 to 0.224
formula 95% CI 0.127 to 0.222
rate over all 6 months: 0.186
Bootstrap cho 0,126 đến 0,224, công thức cho 0,127 đến 0,222: hai cách gần như trùng nhau với một tỉ lệ. Bootstrap đáng giá ở chỗ cùng đoạn code dùng được cho trung vị, p90 hay chênh lệch, chỉ cần thay .mean(axis=1).
Bước 3: khoảng tin cậy cho chênh lệch giữa hai quận.
def diff_ci(a: np.ndarray, b: np.ndarray, n_boot: int = 5000, seed: int = 42):
rng = np.random.default_rng(seed)
# Mẫu lại riêng từng quận, giữ nguyên số đơn của mỗi quận
ra = a[rng.integers(0, len(a), size=(n_boot, len(a)))].mean(axis=1)
rb = b[rng.integers(0, len(b), size=(n_boot, len(b)))].mean(axis=1)
lo, hi = np.percentile(ra - rb, [2.5, 97.5])
return a.mean() - b.mean(), lo, hi
week1 = orders[orders["created_at"] < "2026-01-08"]
for x, y in [("Bai Bien", "Cho Moi"), ("Khu Cong Nghiep", "Dau Pho")]:
for label, data in [("week 1", week1), ("6 months", orders)]:
a = data.loc[data["district"] == x, "is_late"].to_numpy()
b = data.loc[data["district"] == y, "is_late"].to_numpy()
d, lo, hi = diff_ci(a, b)
# Khoảng chứa 0 thì chưa kết luận được quận nào trễ hơn
verdict = "not sure" if lo <= 0 <= hi else (f"{x} higher" if lo > 0 else f"{y} higher")
print(f"{label:8} {x} {a.mean():.3f} (n={len(a)}) vs {y} {b.mean():.3f} (n={len(b)})")
print(f"{'':8} difference {d:+.3f} 95% CI {lo:+.3f} to {hi:+.3f} {verdict}")
Kết quả [Đã chạy] Python 3.12, NumPy 2.5, pandas 3.1, SciPy 1.18, CPU x86_64, ngày 04/11/2026:
week 1 Bai Bien 0.175 (n=246) vs Cho Moi 0.153 (n=249)
difference +0.022 95% CI -0.046 to +0.087 not sure
6 months Bai Bien 0.186 (n=6337) vs Cho Moi 0.195 (n=6045)
difference -0.009 95% CI -0.023 to +0.005 not sure
week 1 Khu Cong Nghiep 0.276 (n=239) vs Dau Pho 0.103 (n=233)
difference +0.173 95% CI +0.105 to +0.241 Khu Cong Nghiep higher
6 months Khu Cong Nghiep 0.256 (n=6115) vs Dau Pho 0.137 (n=6278)
difference +0.119 95% CI +0.105 to +0.133 Khu Cong Nghiep higher
Bốn dòng kết luận đọc theo cặp. Bai Bien và Cho Moi: tuần đầu chưa chắc, sáu tháng vẫn chưa chắc, dù khoảng đã hẹp từ 13 điểm xuống 2,8 điểm phần trăm. Khu Cong Nghiep và Dau Pho: chắc chắn ngay từ tuần đầu.
Bước 4: dùng thư viện, scipy.stats.bootstrap.
for method in ["percentile", "BCa"]:
res = stats.bootstrap((sample,), np.mean, n_resamples=5000, confidence_level=0.95,
method=method, rng=np.random.default_rng(42))
ci = res.confidence_interval
print(f"scipy {method:10} 95% CI {ci.low:.3f} to {ci.high:.3f} standard error {res.standard_error:.4f}")
Kết quả [Đã chạy] Python 3.12, NumPy 2.5, pandas 3.1, SciPy 1.18, CPU x86_64, ngày 04/11/2026:
scipy percentile 95% CI 0.126 to 0.224 standard error 0.0247
scipy BCa 95% CI 0.130 to 0.228 standard error 0.0247
Phương pháp percentile cho đúng khoảng của bản tự viết. Phương pháp BCa (bias-corrected and accelerated, mặc định của SciPy) điều chỉnh thêm khi phân phối bootstrap bị lệch, nên khoảng dịch nhẹ thành 0,130 đến 0,228. Trong dự án thật, dùng thư viện; tự viết để hiểu thư viện làm gì.
Điều kiện và giới hạn
Bootstrap giả định các đơn trong mẫu độc lập với nhau. Đơn cùng một ngày lại chung thời tiết: hôm mưa, nhiều đơn cùng trễ. Khi đó nên mẫu lại theo ngày thay vì theo đơn.
# Cách 2: mẫu lại theo ngày, vì các đơn cùng ngày chung trời mưa hay nắng
daily = d.groupby(d["created_at"].dt.date)["is_late"].agg(["sum", "size"]).to_numpy()
pick = rng.integers(0, len(daily), size=(5000, len(daily)))
by_day = daily[pick, 0].sum(axis=1) / daily[pick, 1].sum(axis=1)
Kết quả [Đã chạy] Python 3.12, NumPy 2.5, pandas 3.1, SciPy 1.18, CPU x86_64, ngày 04/11/2026:
resample orders 95% CI 0.176 to 0.196 width 0.019
resample days 95% CI 0.175 to 0.198 width 0.023
days: 181, orders: 6337, rate 0.186
daily có một hàng mỗi ngày gồm số đơn trễ và tổng số đơn; mỗi lần mẫu lại rút 181 ngày có hoàn lại, rồi chia tổng đơn trễ cho tổng số đơn của các ngày được rút. Mẫu lại theo ngày cho khoảng rộng hơn khoảng 20%: coi các đơn cùng ngày là độc lập đã làm ta tự tin quá mức. Hai giới hạn khác cần nhớ: bootstrap không tạo ra thông tin không có trong mẫu (một quận mới có 30 đơn, 0 đơn trễ, sẽ cho khoảng 0 đến 0 dù tỉ lệ thật không phải 0), và khoảng tin cậy chỉ đo sai số do lấy mẫu, không đo sai lệch do mẫu không đại diện. Tuần đầu tháng 1 chỉ 6% đơn gặp mưa, tháng 6 là 64%, nên một khoảng tin cậy tính từ tháng 1 không nói được gì về tháng 6.
Áp dụng vào Giao Hàng Anh Tí
Bình không điều shipper dựa trên tuần đầu. Bảng theo dõi của Giao Hàng Anh Tí được sửa theo hai quy tắc: mọi tỉ lệ trễ hiển thị kèm khoảng tin cậy 95%; mọi so sánh giữa hai quận hiển thị khoảng tin cậy của chênh lệch, và ghi "chưa đủ dữ liệu" khi khoảng chứa 0. Với Khu Cong Nghiep, khoảng đã rõ ngay tuần đầu, nên quyết định tăng shipper ở đó có thể làm sớm. Lab của chương này xây đúng module tính các con số đó.
Cùng cách nghĩ sẽ quay lại nhiều lần: khi so hai mô hình ở Chương 9 (độ chính xác 0,82 và 0,81 có khác nhau thật không), khi đánh giá RAG ở mô-đun 03 trên 50 câu hỏi kiểm thử. Một metric không kèm khoảng tin cậy chưa phải là kết luận.
Hiểu lầm thường gặp
Hiểu lầm 1: "Khoảng tin cậy của chênh lệch chứa 0 nghĩa là hai quận như nhau." Sai ở chỗ không đủ bằng chứng khác với có bằng chứng bằng nhau. Sau sáu tháng, khoảng của Bai Bien trừ Cho Moi là -0,023 đến +0,005: dữ liệu vẫn tương thích với chênh lệch tới 2,3 điểm.
Hiểu lầm 2: "Bootstrap tạo thêm dữ liệu nên kết quả chính xác hơn." Bootstrap chỉ dùng lại đúng các đơn đã có để đo mức dao động. Nó không làm tỉ lệ 0,175 chính xác hơn và không sửa được mẫu thiếu đại diện.
Hiểu lầm 3: "Khoảng 0,126 đến 0,224 có 95% xác suất chứa tỉ lệ thật." Cách nói chặt chẽ hơn: phương pháp này, lặp lại nhiều lần, cho khoảng chứa giá trị thật khoảng 95% số lần. Trong thực hành, điều quan trọng là độ rộng khoảng và việc nó có chứa mốc quyết định (như 0) hay không.
| Triệu chứng | Nguyên nhân | Cách kiểm chứng | Cách sửa |
|---|---|---|---|
| Xếp hạng quận đổi liên tục giữa các tuần | Mẫu nhỏ, chênh lệch nằm trong sai số | Tính khoảng tin cậy của chênh lệch | Gom thêm dữ liệu trước khi quyết định |
| Khoảng tin cậy hẹp nhưng tháng sau số liệu lệch xa | Mẫu không đại diện (mùa khô so với mùa mưa) | So tỉ lệ ngày mưa giữa hai giai đoạn | Lấy mẫu trải đều thời gian, tách theo mùa |
| Khoảng bootstrap hẹp hơn thực tế | Quan sát không độc lập (cùng ngày, cùng khách) | Mẫu lại theo ngày, so độ rộng | Bootstrap theo nhóm (ngày, khách) |
Tự kiểm tra (có đáp án)
Câu 1 (giải thích). Vì sao bootstrap phải rút có hoàn lại? Điều gì xảy ra nếu rút 246 đơn không hoàn lại từ 246 đơn?
Đáp án: rút không hoàn lại đủ 246 đơn thì luôn được đúng mẫu gốc, chỉ khác thứ tự, nên 5.000 lần đều ra 0,175 và khoảng tin cậy có độ rộng 0. Rút có hoàn lại tạo ra các mẫu khác nhau, mô phỏng sự dao động khi lấy mẫu mới.
Câu 2 (dự đoán). Nếu Bai Bien có 984 đơn thay vì 246 (gấp bốn), với cùng tỉ lệ 0,175, khoảng tin cậy rộng khoảng bao nhiêu?
Đáp án: khoảng một nửa, cỡ 0,048 thay vì 0,098, vì sai số chuẩn tỉ lệ với 1 chia căn bậc hai của n, và căn của 4 là 2.
Câu 3 (vận dụng). Tuần đầu, chênh lệch Khu Cong Nghiep trừ Dau Pho là +0,173 với khoảng +0,105 đến +0,241. Bình nên kết luận gì, và cần cẩn trọng điều gì?
Đáp án: Khu Cong Nghiep trễ nhiều hơn là kết luận đáng tin, chênh lệch ít nhất khoảng 10 điểm phần trăm. Cần cẩn trọng về độ lớn: tuần đầu là mùa khô, nên chênh lệch các tháng mưa có thể khác (sáu tháng cho +0,119).
Tự tay làm
Trong bootstrap_rate.py, đổi mốc tuần đầu "2026-01-08" thành hai tuần đầu "2026-01-15" rồi chạy lại. Trước khi chạy, dự đoán độ rộng khoảng tin cậy mới dựa trên luật căn bậc hai.
Kết quả mong đợi để tự kiểm: 490 đơn, 81 đơn trễ, tỉ lệ 0,165; khoảng bootstrap 0,133 đến 0,200, rộng 0,067 so với 0,098 của một tuần, tức hẹp đi khoảng 1,4 lần (căn bậc hai của 2). Giải thích bằng một câu vì sao tỉ lệ hai tuần (0,165) nằm trong khoảng tin cậy của tuần đầu.
Điều cần nhớ
- Mọi con số metric tính trên mẫu đều dao động; sai số chuẩn của tỉ lệ là căn của
p(1 - p) / n, nên gấp bốn dữ liệu mới giảm một nửa sai số. - Khoảng tin cậy 95% viết sai số thành một khoảng; với tuần đầu của Bai Bien là 0,126 đến 0,224, rộng gần 10 điểm phần trăm.
- Bootstrap mẫu lại có hoàn lại từ chính mẫu, dùng được cho mọi con số kể cả chênh lệch hai nhóm; khoảng của chênh lệch chứa 0 nghĩa là chưa đủ bằng chứng.
- Bootstrap cần quan sát độc lập và mẫu đại diện; đơn cùng ngày nên được mẫu lại theo ngày.
- Bài tiếp theo, cuối chương, đo "độ ngạc nhiên" của một mô hình xác suất: entropy và cross-entropy, nền của hàm mất mát mà Chương 5 sẽ tối ưu.
Nguồn tham khảo
- NumPy, Random Generator (
default_rng,integers,choice): https://numpy.org/doc/stable/reference/random/generator.html - SciPy,
scipy.stats.bootstrap: https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.bootstrap.html - NumPy,
numpy.percentile: https://numpy.org/doc/stable/reference/generated/numpy.percentile.html - AI Engineering from Scratch (MIT), phase 01, Sampling methods: https://github.com/rohitg00/ai-engineering-from-scratch/tree/main/phases/01-math-foundations/16-sampling-methods
- AI Engineering from Scratch (MIT), phase 01, Statistics for ML: https://github.com/rohitg00/ai-engineering-from-scratch/tree/main/phases/01-math-foundations/15-statistics-for-ml