Danh sách bài viết

Bài 21: Mean, Median, Mode — Đo Lường Xu Hướng Trung Tâm

Mean, median, mode là 3 đại lượng mô tả xu hướng trung tâm của dữ liệu. Bài học định nghĩa từng đại lượng, viết code Python bằng list thuần và module statistics, phân tích pitfall của mean khi có outlier, giới thiệu weighted mean / geometric mean / harmonic mean, và nêu ứng dụng trong AI/ML: centering data, median / mode imputation cho missing value.

24/05/2026
12 phút đọc
0 lượt xem
1

Mục tiêu bài học

Sau bài học, bạn sẽ:

  • Định nghĩa được mean, median, mode và viết được công thức của từng đại lượng.
  • Code Python để tính 3 metric bằng list thuần và bằng module statistics.
  • Biết khi nào nên dùng mean, khi nào median, khi nào mode.
  • Hiểu vì sao mean dễ bị outlier kéo lệch còn median thì không.
  • Nắm sơ bộ weighted mean, geometric mean, harmonic mean.
  • Áp dụng được median / mode imputation cho missing value khi tiền xử lý dữ liệu.

Bài 18, 19, 20 đã đi qua vector, ma trận, tensor — phần đại số tuyến tính. Từ bài này series chuyển sang thống kê, bắt đầu bằng descriptive statistics.

2

Descriptive statistics là gì

Descriptive statistics (thống kê mô tả) là cách tóm tắt một tập dữ liệu lớn bằng vài con số đại diện. Thay vì nhìn từng dòng trong 1 triệu bản ghi, ta nhìn một số chỉ tiêu để có cảm nhận tổng quan.

Có 2 nhóm chính:

  • Xu hướng trung tâm (central tendency): dữ liệu tập trung quanh giá trị nào — mean, median, mode.
  • Độ phân tán (dispersion): dữ liệu trải rộng ra sao — variance, standard deviation, range, IQR. Phần này ở bài 22.

Bài này tập trung vào nhóm thứ nhất: mean, median, mode.

3

Mean — trung bình cộng

Mean (trung bình cộng, còn gọi là arithmetic mean) của \( n \) số là tổng tất cả số chia cho \( n \):

\[ \bar{x} = \frac{1}{n} \sum_{i=1}^{n} x_i \]

Ký hiệu \( \bar{x} \) (đọc là "x bar") dùng cho mean của mẫu (sample). Mean của tổng thể (population) thường ký hiệu là \( \mu \).

Ví dụ điểm kiểm tra của 5 học sinh: \( [7, 8, 6, 9, 10] \).

\[ \bar{x} = \frac{7 + 8 + 6 + 9 + 10}{5} = \frac{40}{5} = 8 \]

Code Python bằng list thuần:

scores = [7, 8, 6, 9, 10]
mean = sum(scores) / len(scores)
print(mean)   # 8.0

Mean có tính chất quan trọng: tổng các độ lệch so với mean luôn bằng 0.

\[ \sum_{i=1}^{n} (x_i - \bar{x}) = 0 \]

Nói cách khác, mean là điểm "cân bằng" của dữ liệu — nếu coi mỗi điểm dữ liệu là một quả cân đặt trên trục số, mean chính là điểm tựa giữ thanh trục thăng bằng.

4

Median — trung vị

Median (trung vị) là giá trị nằm ở vị trí giữa khi sắp xếp dữ liệu theo thứ tự tăng dần. 50% số liệu nằm dưới median, 50% nằm trên.

Cách tính phụ thuộc số phần tử \( n \):

  • Nếu \( n \) lẻ: median là phần tử ở vị trí giữa — phần tử thứ \( \frac{n+1}{2} \) (đếm từ 1).
  • Nếu \( n \) chẵn: median là trung bình cộng của hai phần tử ở giữa — phần tử thứ \( \frac{n}{2} \) và \( \frac{n}{2} + 1 \).

Ví dụ \( n \) lẻ — dataset \( [3, 1, 4, 1, 5] \). Sắp xếp: \( [1, 1, 3, 4, 5] \). \( n = 5 \), vị trí giữa là phần tử thứ 3 → median = 3.

Ví dụ \( n \) chẵn — dataset \( [3, 1, 4, 1, 5, 9] \). Sắp xếp: \( [1, 1, 3, 4, 5, 9] \). \( n = 6 \), hai phần tử ở giữa là 3 và 4 → median = \( \frac{3 + 4}{2} = 3.5 \).

Code Python bằng list thuần:

def median(data):
    s = sorted(data)
    n = len(s)
    mid = n // 2
    if n % 2 == 1:
        return s[mid]
    return (s[mid - 1] + s[mid]) / 2

print(median([3, 1, 4, 1, 5]))      # 3
print(median([3, 1, 4, 1, 5, 9]))   # 3.5

Đặc tính quan trọng nhất của median: robust với outlier. Đổi giá trị lớn nhất từ 5 lên 5000, median \( [1, 1, 3, 4, 5000] \) vẫn là 3. Mean thì nhảy từ 2.8 lên hơn 1000. Lý do: median chỉ phụ thuộc vị trí, không phụ thuộc giá trị của các phần tử ngoài cùng.

5

Mode — mốt

Mode (mốt) là giá trị xuất hiện nhiều nhất trong tập dữ liệu.

Ví dụ điểm thi của 10 học sinh: \( [5, 7, 8, 7, 6, 7, 9, 7, 8, 10] \). Đếm tần suất: số 7 xuất hiện 4 lần, các số khác ít hơn → mode = 7.

Mode có 3 trường hợp đặc biệt:

  • Unimodal: chỉ có 1 mode. Ví dụ trên.
  • Bimodal / multimodal: có 2 hoặc nhiều giá trị cùng có tần suất cao nhất. Ví dụ \( [1, 2, 2, 3, 3, 4] \) có 2 mode là 2 và 3.
  • Không có mode: mọi giá trị xuất hiện đúng 1 lần. Ví dụ \( [1, 2, 3, 4] \).

Code Python bằng list thuần:

def mode(data):
    counts = {}
    for x in data:
        counts[x] = counts.get(x, 0) + 1
    max_count = max(counts.values())
    return [v for v, c in counts.items() if c == max_count]

print(mode([5, 7, 8, 7, 6, 7, 9, 7, 8, 10]))   # [7]
print(mode([1, 2, 2, 3, 3, 4]))                # [2, 3]

Mode là đại lượng duy nhất có nghĩa với dữ liệu phân loại (categorical) — ví dụ màu sắc, nghề nghiệp, quốc tịch. Bạn không tính được mean của ["đỏ", "xanh", "đỏ"] nhưng mode = "đỏ" là hợp lệ.

6

Khi nào dùng cái nào

Cả 3 đại lượng đều mô tả "trung tâm", nhưng phù hợp với từng loại dữ liệu khác nhau.

MetricKhi dùngKhi tránh
Mean Dữ liệu số, phân bố tương đối đối xứng, không nhiều outlier. Ví dụ: chiều cao, cân nặng, điểm thi. Phân bố lệch (skewed), có outlier mạnh.
Median Dữ liệu số bị lệch hoặc có outlier. Ví dụ: thu nhập, giá nhà, thời gian phản hồi server. Dữ liệu categorical (không sắp xếp được).
Mode Dữ liệu categorical hoặc dữ liệu rời rạc cần biết giá trị phổ biến nhất. Ví dụ: cỡ áo bán chạy, loại xe đăng ký nhiều nhất. Dữ liệu liên tục với mọi giá trị gần như duy nhất (mode mất ý nghĩa).

Một ví dụ kinh điển: báo cáo thu nhập của một nhóm dân cư. Mean thu nhập thường cao hơn thực tế cảm nhận vì một vài người siêu giàu kéo mean lên. Median thu nhập phản ánh sát hơn mức thu nhập của "người ở giữa". Các tổ chức thống kê chính thức như Tổng cục Thống kê, OECD, Eurostat thường công bố cả median thu nhập bên cạnh mean vì lý do này.

7

Weighted mean

Weighted mean (trung bình có trọng số) gán mỗi giá trị một trọng số \( w_i \), giá trị nào quan trọng hơn thì \( w_i \) lớn hơn:

\[ \bar{x}_w = \frac{\sum_{i=1}^{n} w_i x_i}{\sum_{i=1}^{n} w_i} \]

Khi mọi \( w_i \) bằng nhau, công thức trở về mean thường.

Ví dụ điểm tổng kết môn: điểm chuyên cần (hệ số 1) = 8, điểm giữa kỳ (hệ số 2) = 7, điểm cuối kỳ (hệ số 3) = 9.

\[ \bar{x}_w = \frac{1 \cdot 8 + 2 \cdot 7 + 3 \cdot 9}{1 + 2 + 3} = \frac{8 + 14 + 27}{6} = \frac{49}{6} \approx 8.17 \]

Code Python bằng list thuần:

def weighted_mean(values, weights):
    return sum(v * w for v, w in zip(values, weights)) / sum(weights)

print(weighted_mean([8, 7, 9], [1, 2, 3]))   # 8.1666...

Trong ML, weighted mean xuất hiện ở nhiều chỗ:

  • Weighted loss: khi dataset bị imbalance (ví dụ 95% sample là class 0, 5% là class 1), ta gán class_weight lớn hơn cho class hiếm để model không bỏ qua nó. sklearn có tham số class_weight, PyTorch có weight trong CrossEntropyLoss.
  • Ensemble: kết quả của ensemble (Random Forest, Gradient Boosting) thường là weighted mean prediction của từng cây con.
  • Attention: output của một self-attention layer là weighted mean của các value vector, trọng số là attention score.
8

Geometric mean và Harmonic mean

Ngoài arithmetic mean, có 2 dạng mean khác dùng trong tình huống đặc thù.

Geometric mean

Geometric mean của \( n \) số dương là căn bậc \( n \) của tích các số:

\[ G = \sqrt[n]{x_1 \cdot x_2 \cdots x_n} = \left( \prod_{i=1}^{n} x_i \right)^{1/n} \]

Dùng khi dữ liệu là rate hoặc growth factor — ví dụ tốc độ tăng trưởng qua các năm. Nếu lãi suất 3 năm lần lượt là 10%, 20%, -5% (tức growth factor 1.1, 1.2, 0.95), tốc độ tăng trưởng trung bình hàng năm là:

\[ G = \sqrt[3]{1.1 \cdot 1.2 \cdot 0.95} \approx 1.0784 \]

tương đương 7.84%/năm. Arithmetic mean ở đây sẽ sai về mặt tài chính.

Harmonic mean

Harmonic mean là nghịch đảo của arithmetic mean của các nghịch đảo:

\[ H = \frac{n}{\sum_{i=1}^{n} \frac{1}{x_i}} \]

Dùng cho các đại lượng kiểu rate (km/h, request/giây). Quan trọng nhất với AI Engineer: F1 score là harmonic mean của precision và recall:

\[ F_1 = \frac{2 \cdot P \cdot R}{P + R} \]

Lý do dùng harmonic mean thay vì arithmetic: harmonic mean phạt nặng các giá trị nhỏ. Nếu precision = 1.0 nhưng recall = 0.01, arithmetic mean ≈ 0.505 (nghe có vẻ ổn), harmonic mean ≈ 0.0198 (phản ánh đúng rằng model này tệ).

Quan hệ giữa 3 loại mean với mọi tập số dương: \( H \leq G \leq \bar{x} \), dấu bằng xảy ra khi mọi \( x_i \) bằng nhau.

9

Pitfall của mean — outlier

Outlier là điểm dữ liệu có giá trị lệch xa phần lớn còn lại. Mean rất nhạy với outlier vì mỗi giá trị đều tham gia tổng với trọng số bằng nhau.

Ví dụ: thu nhập tháng (triệu VND) của 10 người trong một công ty nhỏ:

income = [12, 13, 14, 15, 15, 16, 17, 18, 20, 500]
mean   = sum(income) / len(income)            # 64.0
sorted_income = sorted(income)
median = (sorted_income[4] + sorted_income[5]) / 2   # 15.5

Mean = 64 triệu nghe như cả công ty rất khá giả. Thực tế 9/10 nhân viên có thu nhập từ 12 đến 20 triệu — median 15.5 triệu mô tả sát hơn nhiều. Người thứ 10 (giám đốc lương 500 triệu) là outlier và đã kéo mean lên gấp 4 lần.

3 cách xử lý outlier thường gặp:

  • Báo cáo median thay vì mean với dữ liệu lệch (skewed) — đơn giản và đủ dùng cho phần lớn báo cáo.
  • Trimmed mean: bỏ \( k\% \) phần tử nhỏ nhất và \( k\% \) phần tử lớn nhất rồi tính mean phần còn lại. Ví dụ trimmed mean 10% loại bỏ 10% extreme ở hai đầu.
  • Phát hiện outlier theo IQR hoặc z-score rồi quyết định bỏ hay giữ. Phần này gắn với variance, sẽ làm ở bài 22.
10

Ứng dụng trong AI/ML

Centering data (mean centering)

Nhiều thuật toán ML (PCA, linear regression, neural network) hội tụ nhanh hơn nếu mỗi feature có mean bằng 0. Cách làm: với mỗi feature, trừ đi mean của nó.

\[ x_i^{\text{centered}} = x_i - \bar{x} \]

Nếu chia tiếp cho standard deviation thì gọi là standardization (bài 22). Cả hai bước này có sẵn trong sklearn.preprocessing.StandardScaler.

Median imputation cho missing value

Khi một feature số có ô trống (NaN), nếu bỏ cả dòng sẽ mất nhiều dữ liệu. Một chiến lược đơn giản: thay NaN bằng median của feature đó. sklearn.impute.SimpleImputer(strategy="median") làm chính việc này. Dùng median thay vì mean vì median không bị outlier kéo lệch.

Mode imputation cho categorical missing

Với feature categorical (giới tính, nghề nghiệp, mã bưu chính), không có khái niệm mean / median. Cách thay NaN thông dụng nhất là dùng mode — giá trị xuất hiện nhiều nhất. sklearn.impute.SimpleImputer(strategy="most_frequent").

Baseline cho mô hình regression

Trước khi train một model phức tạp, ta nên có baseline. Với bài toán regression, baseline đơn giản nhất: dự đoán mean (hoặc median) của \( y \) cho mọi sample. Nếu model phức tạp không vượt qua baseline này thì model chưa học được gì.

11

Code Python: tính 3 metric

Đầu tiên là phiên bản viết tay bằng list thuần — không phụ thuộc thư viện ngoài.

def mean(data):
    return sum(data) / len(data)

def median(data):
    s = sorted(data)
    n = len(s)
    mid = n // 2
    if n % 2 == 1:
        return s[mid]
    return (s[mid - 1] + s[mid]) / 2

def mode(data):
    counts = {}
    for x in data:
        counts[x] = counts.get(x, 0) + 1
    max_count = max(counts.values())
    return [v for v, c in counts.items() if c == max_count]

data = [4, 8, 15, 16, 23, 42, 4, 8, 15]
print(mean(data))     # 15.0
print(median(data))   # 15
print(mode(data))     # [4, 8, 15]

Python chuẩn đã có module statistics, không cần cài đặt thêm:

import statistics as st

data = [4, 8, 15, 16, 23, 42, 4, 8, 15]
print(st.mean(data))       # 15
print(st.median(data))     # 15
print(st.mode(data))       # 4  — trả về 1 mode đầu tiên gặp
print(st.multimode(data))  # [4, 8, 15] — trả về list nếu multimodal
print(st.fmean(data))      # 15.0 — phiên bản float, nhanh hơn mean
print(st.harmonic_mean([1.0, 0.01]))           # ~ 0.0198 — dùng cho F1
print(st.geometric_mean([1.1, 1.2, 0.95]))     # ~ 1.0784

Lưu ý: statistics.mode trong Python 3.8+ trả về 1 giá trị (không raise lỗi với multimodal nữa); muốn cả list mode dùng multimode. Phiên bản nhanh hơn cho dữ liệu lớn là statistics.fmean (dùng float arithmetic).

Với dữ liệu thực tế trong ML (array hàng triệu phần tử), ta sẽ dùng NumPy / Pandas thay cho module statistics — sẽ làm ở Module 4 và 5 của series.

12

Bài tập

  1. Cho dataset thu nhập (triệu VND) của 11 người trong một startup: [15, 18, 20, 22, 25, 25, 28, 30, 32, 40, 600]. Tính mean và median. Đại lượng nào phản ánh trung bình thu nhập thật hơn? Giải thích.
  2. Một lớp 12 học sinh có xếp loại học lực: ["khá", "giỏi", "trung bình", "giỏi", "khá", "khá", "giỏi", "giỏi", "trung bình", "khá", "giỏi", "khá"]. Tính mode. Mean và median có nghĩa ở đây không? Vì sao?
  3. Tính weighted mean cho điểm tổng kết với điểm thành phần \( [9, 6, 8] \) và trọng số \( [2, 3, 5] \).
  4. Model A có precision = 0.95, recall = 0.10. Model B có precision = 0.60, recall = 0.55. Tính F1 score cho từng model bằng tay (dùng công thức harmonic mean). Model nào tốt hơn theo F1?
  5. Trong dataset Titanic, cột Age bị thiếu khoảng 20% giá trị. Bạn chọn cách imputation nào: thay bằng mean, median hay mode? Lý do?
Đáp án
  1. Mean = \( (15 + 18 + \ldots + 600) / 11 = 855/11 \approx 77.73 \) triệu. Sắp xếp lại dataset, phần tử thứ 6 là 25 → median = 25 triệu. Median phản ánh sát hơn vì giá trị 600 là outlier (có thể là founder/CEO), kéo mean lên hơn 3 lần mức của người ở giữa.
  2. Đếm tần suất: "khá" 5 lần, "giỏi" 5 lần, "trung bình" 2 lần → bimodal, mode = ["khá", "giỏi"]. Mean không có nghĩa vì xếp loại là dữ liệu categorical (không cộng được). Median cũng không có nghĩa nếu coi nhãn không có thứ tự; nếu coi có thứ tự (trung bình < khá < giỏi) thì median là "khá".
  3. \( \bar{x}_w = \frac{2 \cdot 9 + 3 \cdot 6 + 5 \cdot 8}{2 + 3 + 5} = \frac{18 + 18 + 40}{10} = 7.6 \).
  4. Model A: \( F_1 = \frac{2 \cdot 0.95 \cdot 0.10}{0.95 + 0.10} = \frac{0.19}{1.05} \approx 0.181 \). Model B: \( F_1 = \frac{2 \cdot 0.60 \cdot 0.55}{0.60 + 0.55} = \frac{0.66}{1.15} \approx 0.574 \). Model B tốt hơn theo F1 — vì cân bằng giữa precision và recall.
  5. Median. Age là feature số nhưng phân bố lệch (skewed) — có vài người tuổi rất cao kéo mean. Median ổn định hơn. Đây cũng là cách sklearn docs khuyên cho feature có outlier. Mean cũng dùng được nhưng nhạy hơn; mode không phù hợp với dữ liệu liên tục.
13

Tổng kết và bài tiếp theo

  • Descriptive statistics tóm tắt dữ liệu bằng vài con số; nhóm xu hướng trung tâm gồm 3 đại lượng: mean, median, mode.
  • Mean = tổng chia số phần tử. Tính chất: \( \sum (x_i - \bar{x}) = 0 \). Nhạy với outlier.
  • Median = giá trị ở giữa khi sắp xếp. Robust với outlier. Cách tính khác nhau cho \( n \) chẵn / lẻ.
  • Mode = giá trị xuất hiện nhiều nhất. Có thể có nhiều mode hoặc không có. Là đại lượng duy nhất dùng được với dữ liệu categorical.
  • Weighted mean dùng khi các giá trị có mức quan trọng khác nhau — xuất hiện trong weighted loss, ensemble, attention.
  • Geometric mean dùng cho rate / growth factor. Harmonic mean dùng cho F1 score.
  • Trong AI/ML: mean centering data, median imputation cho missing số, mode imputation cho missing categorical, dùng mean/median làm baseline regression.

Bài tiếp theo: Bài 22 — Variance và Standard Deviation. Mean cho biết dữ liệu tập trung quanh đâu, variance và std cho biết nó trải rộng thế nào.