Lấy mẫu¶
Lấy mẫu xác định cách ta thu thập dữ liệu và kiểm soát trực tiếp chất lượng của mọi kết luận ta rút ra. Tài liệu này bao quát lấy mẫu ngẫu nhiên, phân tầng, cụm và hệ thống; phân bố lấy mẫu; luật số lớn; và bootstrapping — các phương pháp thiết yếu cho việc chia huấn luyện/kiểm tra và quản lý tập dữ liệu trong ML.
-
Trong một thế giới lý tưởng, bạn sẽ đo đạc mọi thành viên của nhóm mà bạn quan tâm. Trong thực tế, điều đó hầu như không bao giờ khả thi. Bạn không thể khảo sát mọi cử tri, kiểm tra mọi bóng đèn, hay quét hình mọi bệnh nhân. Vì vậy bạn lấy một mẫu (sample) và dùng nó để tìm hiểu về toàn bộ.
-
Tổng thể (population) là tập hợp đầy đủ các cá nhân hoặc vật phẩm bạn muốn nghiên cứu. Mẫu (sample) là tập con bạn thực sự quan sát.
-
Một tham số (parameter) là một con số mô tả tổng thể (vd. chiều cao trung bình thực của mọi người trưởng thành trong một quốc gia).
-
Một thống kê (statistic) là một con số được tính từ mẫu của bạn (vd. chiều cao trung bình của 500 người bạn đã đo). Các thống kê được dùng để ước lượng các tham số.
-
Chất lượng của các kết luận của bạn phụ thuộc hoàn toàn vào cách bạn chọn mẫu. Một mẫu thiên lệch dẫn đến các kết luận thiên lệch, bất kể phân tích của bạn có tinh vi đến đâu.
-
Khung lấy mẫu (sampling frame) là danh sách tất cả các cá nhân từ đó bạn thực sự rút ra mẫu. Lý tưởng nhất là nó khớp hoàn hảo với tổng thể, nhưng trong thực tế có những khoảng trống.
-
Ví dụ, nếu bạn khảo sát mọi người qua điện thoại, bạn sẽ bỏ lỡ tất cả những người không có điện thoại. Sự khác biệt giữa khung và tổng thể được gọi là sai số phủ sóng (coverage error).
-
Sai số lấy mẫu (sampling error) là sự khác biệt tự nhiên giữa một thống kê mẫu và tham số tổng thể.
-
Ngay cả một mẫu hoàn toàn ngẫu nhiên cũng sẽ không khớp chính xác với tổng thể. Các mẫu lớn hơn làm giảm sai số lấy mẫu.
-
Có hai họ lấy mẫu chính: xác suất và phi xác suất.
-
Lấy mẫu xác suất (probability sampling) nghĩa là mọi thành viên của tổng thể đều có một cơ hội được chọn biết trước, khác không. Điều này cho phép bạn định lượng sự không chắc chắn và khái quát hóa kết quả.
-
Lấy mẫu ngẫu nhiên đơn giản (simple random sampling): mọi cá nhân có cơ hội được chọn bằng nhau, và mọi mẫu có kích thước \(n\) đều có khả năng như nhau. Hãy nghĩ đến việc bỏ mọi tên vào một cái mũ và rút một cách mù quáng.
-
Lấy mẫu phân tầng (stratified sampling): chia tổng thể thành các nhóm không chồng lấn (tầng) dựa trên một đặc điểm chung (vd. nhóm tuổi, vùng miền), sau đó lấy mẫu ngẫu nhiên từ mỗi tầng. Điều này đảm bảo sự đại diện từ mọi nhóm và giảm phương sai khi các tầng khác nhau.
-
Lấy mẫu cụm (cluster sampling): chia tổng thể thành các nhóm (cụm), chọn ngẫu nhiên một số cụm, sau đó bao gồm mọi người trong các cụm đã chọn. Điều này thực tế khi tổng thể phân bố rộng về mặt địa lý, như lấy mẫu toàn bộ trường học thay vì từng học sinh riêng lẻ trên một quận.
-
Lấy mẫu hệ thống (systematic sampling): chọn một điểm bắt đầu ngẫu nhiên, sau đó lấy mọi cá nhân thứ \(k\) từ danh sách. Ví dụ, bắt đầu từ người thứ 7 và sau đó lấy mọi người thứ 10 (7, 17, 27, ...). Đơn giản để thực hiện nhưng có thể tạo ra thiên lệch nếu danh sách có một mô hình ẩn.
-
Lấy mẫu phi xác suất (non-probability sampling) không cho mọi thành viên một cơ hội được chọn biết trước. Kết quả không thể được khái quát hóa một cách chặt chẽ, nhưng các phương pháp này thường nhanh hơn và rẻ hơn.
-
Lấy mẫu thuận tiện (convenience sampling): chọn bất kỳ ai dễ tiếp cận nhất. Khảo sát người ở trung tâm thương mại là thuận tiện nhưng bỏ lỡ những người không đến đó.
-
Lấy mẫu hạn ngạch (quota sampling): giống như lấy mẫu phân tầng, nhưng không có tính ngẫu nhiên. Nhà nghiên cứu điền đầy các hạn ngạch (vd. 50 nam và 50 nữ) bằng cách chọn các cá nhân có thể tiếp cận từ mỗi nhóm.
-
Lấy mẫu quả cầu tuyết (snowball sampling): bắt đầu với một vài người tham gia và yêu cầu họ tuyển dụng thêm người khác. Hữu ích cho các nhóm khó tiếp cận (vd. nghiên cứu bệnh hiếm), nhưng bị thiên lệch nặng về phía các cá nhân có kết nối.
-
Một khi bạn có một phương pháp lấy mẫu, một câu hỏi tự nhiên xuất hiện: nếu tôi lấy một mẫu khác, liệu tôi có nhận được một thống kê khác không? Gần như chắc chắn là có. Phân bố lấy mẫu (sampling distribution) là phân bố của một thống kê (như trung bình mẫu) trên mọi mẫu có thể có cùng kích thước.
-
Hãy tưởng tượng rút 1,000 mẫu khác nhau, mỗi mẫu 30 người, và tính chiều cao trung bình của mỗi mẫu. 1,000 giá trị trung bình đó tạo thành một phân bố. Một số sẽ hơi cao hơn trung bình tổng thể thực, một số hơi thấp hơn, và hầu hết sẽ tập trung quanh giá trị thực.
-
Độ lệch chuẩn của phân bố lấy mẫu này được gọi là sai số chuẩn (standard error):
-
Chú ý rằng sai số chuẩn co lại khi \(n\) tăng. Mẫu lớn hơn cho các ước lượng chính xác hơn. Tăng gấp bốn kích thước mẫu sẽ giảm một nửa sai số chuẩn.
-
Kết quả quan trọng nhất trong thống kê là Định lý giới hạn trung tâm (CLT) (Central Limit Theorem). Nó nói: bất kể hình dạng của tổng thể gốc là gì, phân bố của các trung bình mẫu tiến tới một phân bố chuẩn khi kích thước mẫu tăng.
- Chính xác hơn, nếu \(X_1, X_2, \ldots, X_n\) là các quan sát độc lập từ một phân bố bất kỳ với trung bình \(\mu\) và phương sai hữu hạn \(\sigma^2\), thì khi \(n\) tăng:
-
Định lý giới hạn trung tâm là thứ làm cho phần lớn thống kê suy luận có hiệu lực. Nó cho phép ta dùng phân bố chuẩn như một xấp xỉ ngay cả khi dữ liệu nền không chuẩn, miễn là mẫu đủ lớn.
-
"Đủ lớn" là bao nhiêu? Một quy tắc thông thường là \(n \ge 30\), nhưng điều này phụ thuộc vào mức độ không chuẩn của tổng thể. Với các phân bố lệch cao, bạn có thể cần nhiều hơn. Với các phân bố gần như đối xứng, thậm chí \(n = 10\) cũng có thể đủ.
-
Định lý giới hạn trung tâm có ba điều kiện chính:
- Độc lập (independence): mỗi quan sát không ảnh hưởng đến các quan sát khác
- Phương sai hữu hạn (finite variance): phương sai tổng thể phải tồn tại (loại trừ một số phân bố kỳ lạ)
- Phân bố đồng nhất (identical distribution): mọi quan sát đến từ cùng một phân bố
Bài tập lập trình (dùng CoLab hoặc notebook)¶
-
Minh họa CLT bằng hình ảnh: rút các mẫu từ một phân bố lệch cao, tính trung bình mẫu, và xem histogram của các trung bình trở nên hình chuông.
import jax import jax.numpy as jnp import matplotlib.pyplot as plt key = jax.random.PRNGKey(0) # Exponential distribution (very skewed) population = jax.random.exponential(key, shape=(100_000,)) fig, axes = plt.subplots(1, 4, figsize=(14, 3)) sample_sizes = [1, 5, 30, 100] for ax, n in zip(axes, sample_sizes): keys = jax.random.split(key, 2000) means = jnp.array([jax.random.choice(k, population, shape=(n,)).mean() for k in keys]) ax.hist(means, bins=40, color="#3498db", alpha=0.7, density=True) ax.set_title(f"n = {n}") ax.set_xlim(0, 4) fig.suptitle("CLT: sample means become normal as n increases", fontsize=13) plt.tight_layout() plt.show() -
So sánh lấy mẫu ngẫu nhiên đơn giản với lấy mẫu phân tầng. Tạo một tổng thể với các nhóm riêng biệt và chỉ ra rằng lấy mẫu phân tầng cho phương sai thấp hơn trong các ước lượng.
import jax import jax.numpy as jnp key = jax.random.PRNGKey(42) # Population: two distinct groups group_a = jax.random.normal(key, shape=(500,)) + 10 # mean ~10 key, subkey = jax.random.split(key) group_b = jax.random.normal(subkey, shape=(500,)) + 20 # mean ~20 population = jnp.concatenate([group_a, group_b]) # Simple random sampling: 1000 trials, sample size 20 srs_means = [] for i in range(1000): key, subkey = jax.random.split(key) sample = jax.random.choice(subkey, population, shape=(20,), replace=False) srs_means.append(sample.mean()) srs_means = jnp.array(srs_means) # Stratified sampling: 10 from each group strat_means = [] for i in range(1000): key, k1, k2 = jax.random.split(key, 3) s_a = jax.random.choice(k1, group_a, shape=(10,), replace=False) s_b = jax.random.choice(k2, group_b, shape=(10,), replace=False) strat_means.append(jnp.concatenate([s_a, s_b]).mean()) strat_means = jnp.array(strat_means) print(f"Simple Random - Mean: {srs_means.mean():.3f}, Std: {srs_means.std():.3f}") print(f"Stratified - Mean: {strat_means.mean():.3f}, Std: {strat_means.std():.3f}") print(f"Stratified sampling reduced variance by {(1 - strat_means.var()/srs_means.var())*100:.1f}%") -
Khám phá cách kích thước mẫu ảnh hưởng đến sai số chuẩn. Vẽ đồ thị sai số chuẩn theo kích thước mẫu và xác nhận mối quan hệ \(1/\sqrt{n}\).
import jax import jax.numpy as jnp import matplotlib.pyplot as plt key = jax.random.PRNGKey(7) population = jax.random.normal(key, shape=(50_000,)) * 10 + 50 sample_sizes = [5, 10, 20, 50, 100, 200, 500, 1000] std_errors = [] for n in sample_sizes: means = [] for _ in range(500): key, subkey = jax.random.split(key) sample = jax.random.choice(subkey, population, shape=(n,)) means.append(sample.mean()) std_errors.append(jnp.array(means).std()) plt.figure(figsize=(8, 4)) plt.plot(sample_sizes, std_errors, "o-", color="#e74c3c", label="Observed SE") theoretical = population.std() / jnp.sqrt(jnp.array(sample_sizes, dtype=jnp.float32)) plt.plot(sample_sizes, theoretical, "--", color="#3498db", label="σ/√n (theoretical)") plt.xlabel("Sample size (n)") plt.ylabel("Standard error") plt.legend() plt.title("Standard error shrinks with larger samples") plt.show()