📉 Thống kê Mô tả - Độ đo Phân tán
Mục tiêu bài học
Sau bài học này, bạn sẽ:
- Hiểu và tính toán Range, Variance, Standard Deviation
- Phân biệt Population vs Sample Variance
- Hiểu ý nghĩa của Coefficient of Variation
- Áp dụng quy tắc Empirical Rule
1. Tại sao cần Độ đo Phân tán?
Xét hai tập dữ liệu có cùng Mean = 50:
| Dataset A | Dataset B |
|---|---|
| 48, 49, 50, 51, 52 | 10, 30, 50, 70, 90 |
| Mean = 50 | Mean = 50 |
| Tập trung | Phân tán |
Chỉ biết Mean là chưa đủ! Cần biết dữ liệu phân tán như thế nào quanh giá trị trung bình.
2. Range (Khoảng biến thiên)
2.1 Công thức
2.2 Ví dụ
Dataset A: [48, 49, 50, 51, 52]
Dataset B: [10, 30, 50, 70, 90]
2.3 Ưu và nhược điểm
| Ưu điểm | Nhược điểm |
|---|---|
| Đơn giản, dễ tính | Chỉ dùng 2 giá trị |
| Nhanh chóng | Rất nhạy với outliers |
2.4 Code Python
1import numpy as np23data = [10, 30, 50, 70, 90]4range_value = np.max(data) - np.min(data)5print(f"Range: {range_value}") # 8067# Hoặc dùng np.ptp (peak to peak)8print(f"Range (ptp): {np.ptp(data)}") # 803. Variance (Phương sai)
3.1 Công thức
Population Variance:
Sample Variance:
Sample Variance chia cho (n-1) thay vì n để có unbiased estimator của population variance. Đây gọi là Bessel's correction.
3.2 Ví dụ tính tay
Dữ liệu: [2, 4, 4, 4, 5, 5, 7, 9]
Bước 1: Tính Mean
Bước 2: Tính độ lệch từng giá trị
| 2 | -3 | 9 |
| 4 | -1 | 1 |
| 4 | -1 | 1 |
| 4 | -1 | 1 |
| 5 | 0 | 0 |
| 5 | 0 | 0 |
| 7 | 2 | 4 |
| 9 | 4 | 16 |
| Tổng | 0 | 32 |
Bước 3: Tính Variance
Population:
Sample:
3.3 Code Python
1import numpy as np23data = [2, 4, 4, 4, 5, 5, 7, 9]45# Population Variance (ddof=0)6pop_var = np.var(data, ddof=0)7print(f"Population Variance: {pop_var}") # 4.089# Sample Variance (ddof=1) - mặc định trong pandas10sample_var = np.var(data, ddof=1)11print(f"Sample Variance: {sample_var:.2f}") # 4.574. Standard Deviation (Độ lệch chuẩn)
4.1 Công thức
4.2 Ý nghĩa
Standard Deviation cho biết trung bình các giá trị cách xa mean bao nhiêu.
Từ ví dụ trên:
- Trung bình, các giá trị cách mean khoảng 2 đơn vị
4.3 Code Python
1import numpy as np23data = [2, 4, 4, 4, 5, 5, 7, 9]45# Population Std6pop_std = np.std(data, ddof=0)7print(f"Population Std: {pop_std}") # 2.089# Sample Std10sample_std = np.std(data, ddof=1)11print(f"Sample Std: {sample_std:.2f}") # 2.145. Coefficient of Variation (Hệ số biến thiên)
5.1 Công thức
5.2 Ý nghĩa
CV cho phép so sánh độ phân tán giữa các tập dữ liệu có đơn vị khác nhau hoặc mean khác nhau.
5.3 Ví dụ
So sánh độ biến thiên giữa:
- Chiều cao (cm): Mean = 170, Std = 10
- Cân nặng (kg): Mean = 65, Std = 8
→ Cân nặng có độ biến thiên tương đối lớn hơn.
5.4 Code Python
1import numpy as np23# Height4height_mean, height_std = 170, 105cv_height = (height_std / height_mean) * 10067# Weight8weight_mean, weight_std = 65, 89cv_weight = (weight_std / weight_mean) * 1001011print(f"CV Height: {cv_height:.2f}%") # 5.88%12print(f"CV Weight: {cv_weight:.2f}%") # 12.31%1314# Sử dụng scipy15from scipy.stats import variation16data = [2, 4, 4, 4, 5, 5, 7, 9]17print(f"CV: {variation(data) * 100:.2f}%")6. Empirical Rule (Quy tắc 68-95-99.7)
6.1 Định nghĩa
Với phân phối chuẩn (Normal Distribution):
Empirical Rule (68-95-99.7)
| Khoảng | % Dữ liệu |
|---|---|
| μ ± 1σ | ~68% |
| μ ± 2σ | ~95% |
| μ ± 3σ | ~99.7% |
6.2 Ví dụ
Điểm IQ có Mean = 100, Std = 15
| Khoảng | Tính toán | Kết quả |
|---|---|---|
| 68% | 100 ± 15 | 85 - 115 |
| 95% | 100 ± 30 | 70 - 130 |
| 99.7% | 100 ± 45 | 55 - 145 |
→ 68% người có IQ từ 85-115
6.3 Code minh họa
1import numpy as np2import matplotlib.pyplot as plt3from scipy import stats45# Generate normal distribution6mu, sigma = 100, 157x = np.linspace(mu - 4*sigma, mu + 4*sigma, 1000)8y = stats.norm.pdf(x, mu, sigma)910plt.figure(figsize=(12, 6))11plt.plot(x, y, 'b-', linewidth=2)1213# Fill regions14plt.fill_between(x, y, where=(x >= mu-sigma) & (x <= mu+sigma), 15 alpha=0.3, color='green', label='68% (μ±1σ)')16plt.fill_between(x, y, where=(x >= mu-2*sigma) & (x <= mu+2*sigma), 17 alpha=0.2, color='yellow', label='95% (μ±2σ)')18plt.fill_between(x, y, where=(x >= mu-3*sigma) & (x <= mu+3*sigma), 19 alpha=0.1, color='red', label='99.7% (μ±3σ)')2021# Add vertical lines22for i, color in zip([1, 2, 3], ['green', 'orange', 'red']):23 plt.axvline(mu - i*sigma, color=color, linestyle='--', alpha=0.5)24 plt.axvline(mu + i*sigma, color=color, linestyle='--', alpha=0.5)2526plt.xlabel('IQ Score')27plt.ylabel('Probability Density')28plt.title('Empirical Rule (68-95-99.7 Rule)')29plt.legend()30plt.grid(True, alpha=0.3)31plt.show()3233# Verify with actual calculations34print("=== Empirical Rule Verification ===")35data = np.random.normal(mu, sigma, 100000)36print(f"% within 1σ: {np.mean((data >= mu-sigma) & (data <= mu+sigma))*100:.1f}%")37print(f"% within 2σ: {np.mean((data >= mu-2*sigma) & (data <= mu+2*sigma))*100:.1f}%")38print(f"% within 3σ: {np.mean((data >= mu-3*sigma) & (data <= mu+3*sigma))*100:.1f}%")7. Z-Score (Standard Score)
7.1 Công thức
7.2 Ý nghĩa
Z-score cho biết giá trị cách mean bao nhiêu standard deviation.
| Z-score | Ý nghĩa |
|---|---|
| z = 0 | Bằng mean |
| z = 1 | Cao hơn mean 1 std |
| z = -2 | Thấp hơn mean 2 std |
| |z| > 3 | Outlier tiềm năng |
7.3 Ví dụ
IQ = 130, với μ = 100, σ = 15
→ IQ 130 cao hơn trung bình 2 độ lệch chuẩn
7.4 Code Python
1import numpy as np2from scipy import stats34# Data5mu, sigma = 100, 156iq_score = 13078# Z-score9z = (iq_score - mu) / sigma10print(f"Z-score: {z:.2f}") # 2.01112# Standardize entire array13data = [85, 100, 115, 130, 145]14z_scores = stats.zscore(data)15print(f"Z-scores: {z_scores}")1617# Percentile từ Z-score18percentile = stats.norm.cdf(z) * 10019print(f"Percentile: {percentile:.1f}%") # 97.7%8. Tổng hợp tất cả độ đo
Code tổng hợp
1import numpy as np2import pandas as pd3from scipy import stats45def descriptive_stats(data, name="Data"):6 """Tính tất cả các độ đo thống kê mô tả"""7 8 result = {9 'Count': len(data),10 'Mean': np.mean(data),11 'Median': np.median(data),12 'Mode': stats.mode(data, keepdims=True).mode[0],13 'Min': np.min(data),14 'Max': np.max(data),15 'Range': np.ptp(data),16 'Variance (pop)': np.var(data, ddof=0),17 'Variance (sample)': np.var(data, ddof=1),18 'Std (pop)': np.std(data, ddof=0),19 'Std (sample)': np.std(data, ddof=1),20 'CV (%)': (np.std(data) / np.mean(data)) * 10021 }22 23 print(f"\n=== {name} ===")24 for key, value in result.items():25 print(f"{key}: {value:.4f}" if isinstance(value, float) else f"{key}: {value}")26 27 return result2829# Ví dụ sử dụng30data = [2, 4, 4, 4, 5, 5, 7, 9]31descriptive_stats(data, "Example Data")3233# Hoặc dùng pandas34df = pd.DataFrame({'values': data})35print("\n=== Pandas describe() ===")36print(df.describe())9. Bài tập thực hành
Bài tập 1: Tính các độ đo
Cho dữ liệu: [12, 15, 18, 22, 25, 28, 30, 35, 40, 100]
- Tính Range
- Tính Population Variance và Std
- Tính Sample Variance và Std
- Tính CV
Bài tập 2: So sánh hai lớp
| Lớp A | Lớp B |
|---|---|
| Mean = 75 | Mean = 80 |
| Std = 10 | Std = 5 |
Lớp nào có điểm đồng đều hơn?
Bài tập 3: Z-score
Chiều cao nam sinh viên: μ = 170cm, σ = 6cm
- Tính Z-score của người cao 182cm
- Người có Z = -1.5 cao bao nhiêu?
Tóm tắt
| Độ đo | Công thức | Đặc điểm |
|---|---|---|
| Range | Max - Min | Đơn giản, nhạy outliers |
| Variance | Đơn vị bình phương | |
| Std | Cùng đơn vị với data | |
| CV | So sánh tương đối | |
| Z-score | Chuẩn hóa dữ liệu |
- Range nhanh nhưng không đáng tin cậy
- Variance/Std là độ đo phổ biến nhất
- CV dùng để so sánh giữa các tập khác nhau
- Z-score giúp chuẩn hóa và so sánh
- Empirical Rule áp dụng cho phân phối chuẩn
