Thống kê 1 — Thống kê mô tả cho phân tích dữ liệu

13 thg 7, 2026 3 lượt xem
#bi
#statistics
#descriptive-statistics
#data-analysis

Mở đầu: vì sao mọi phân tích đều bắt đầu từ thống kê mô tả

Trước khi dựng mô hình dự báo, làm A/B test hay báo cáo cho ban lãnh đạo, bước đầu tiên luôn là nhìn cho ra dữ liệu đang trông như thế nào. Đó chính là công việc của thống kê mô tả (descriptive statistics): tóm tắt một tập số liệu lớn thành vài con số biết nói — trung tâm ở đâu, phân tán ra sao, hình dạng lệch hay cân.

Đây là bài mở đầu series. Toàn bộ ví dụ SQL chạy được trực tiếp trên sandbox PostgreSQL (chỉ đọc) với 5 bảng:

  • customers(id, full_name, city, created_at)
  • accounts(id, customer_id, account_no, balance, currency)
  • transactions(id, account_id, amount, kind, created_at)
  • employees(id, name, department_id, salary, hired_at)
  • departments(id, name)

Ta sẽ dùng chủ yếu transactions.amount (giá trị giao dịch) và accounts.balance (số dư) — hai đại lượng tiền tệ điển hình lệch phải (right-skewed) trong ngân hàng, nơi mà việc chọn sai thước đo có thể dẫn tới kết luận sai hoàn toàn.


1. Đo xu hướng trung tâm (central tendency)

Ba thước đo phổ biến, nhưng KHÔNG thay thế được cho nhau:

Thước đoĐịnh nghĩaNhạy với outlier?Áp dụng cho
Mean (trung bình)Tổng chia số phần tửRất nhạyDữ liệu đối xứng, cần cộng dồn (tổng doanh thu)
Median (trung vị)Giá trị ở giữa khi sắp xếpBền vữngDữ liệu lệch (thu nhập, số dư, giá trị giao dịch)
Mode (yếu vị)Giá trị xuất hiện nhiều nhấtKhông nhạyDữ liệu phân loại (kind, city, currency)

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

Mean trực quan và có tính chất toán học đẹp (dùng để tính tổng, phương sai, hồi quy). Nhưng nó kéo theo giá trị cực đoan: chỉ cần một giao dịch 10 tỷ đồng lọt vào tập hàng nghìn giao dịch vài triệu, mean lập tức bị đẩy lên cao và không còn "đại diện" cho một giao dịch điển hình.

Median chia tập dữ liệu làm đôi: 50% nằm dưới, 50% nằm trên. Nó không quan tâm giá trị cực đoan lớn tới đâu, chỉ quan tâm thứ hạng. Vì vậy median là thước đo trung tâm đáng tin nhất cho các đại lượng lệch phải.

Mode trả lời "giá trị nào phổ biến nhất". Với dữ liệu liên tục (số dư), mode ít ý nghĩa; nhưng với dữ liệu rời rạc/phân loại (loại giao dịch, loại tiền tệ) thì mode chính là thứ ta cần.

1.2 Vì sao median tốt cho thu nhập / số dư lệch phải

Hãy tưởng tượng 9 khách có số dư 5 triệu và 1 khách có số dư 5 tỷ:

  • Mean = (9 × 5tr + 5.000tr) / 10 = 504,5 triệu — không một khách nào có số dư gần con số này.
  • Median = 5 triệu — đúng với "khách điển hình".

Đây là lý do báo chí luôn nói "thu nhập trung vị" chứ không nói "thu nhập trung bình": một vài tỷ phú kéo mean lên mà không phản ánh đời sống đa số. Trong ngân hàng, số dư và giá trị giao dịch có cùng bản chất — vài khách/giao dịch VIP lớn gấp hàng nghìn lần phần còn lại.

Quy tắc nhanh: nếu mean > median rõ rệt → phân phối lệch phải, nên báo cáo bằng median (hoặc cả hai kèm chú thích).


2. Đo độ phân tán (dispersion)

Trung tâm chưa đủ: hai tập có cùng mean vẫn có thể khác nhau trời vực về mức độ "tản mát".

Thước đoCông thức / ý nghĩaGhi chú
Rangemax − minĐơn giản, nhưng cực nhạy outlier
Variance (σ²/s²)Trung bình bình phương độ lệch so với meanĐơn vị bị bình phương (đồng²)
Standard deviation (σ/s)Căn bậc hai của varianceCùng đơn vị với dữ liệu → dễ đọc
IQR (Interquartile Range)Q3 − Q1 (khoảng giữa 50% dữ liệu)Bền vững với outlier
CV (Coefficient of Variation)σ / mean (thường tính %)So sánh phân tán giữa các thang đo khác nhau

2.1 Standard deviation — thước đo "chuẩn"

Độ lệch chuẩn (standard deviation) đo trung bình mỗi điểm cách mean bao xa. Nó cùng đơn vị với dữ liệu (đồng, không phải đồng²), nên đọc được trực tiếp: "số dư trung bình 50 triệu, độ lệch chuẩn 120 triệu" cho thấy dữ liệu tản rất rộng quanh mean. Nhưng SD dựa trên mean nên cũng thừa hưởng sự nhạy cảm với outlier.

2.2 IQR — phân tán bền vững

IQR = Q3 − Q1 là chiều rộng của "khối 50% dữ liệu ở giữa". Nó bỏ qua 25% thấp nhất và 25% cao nhất, nên các giao dịch VIP khổng lồ không làm méo IQR. Với dữ liệu ngân hàng lệch phải, IQR + median là cặp đôi mô tả đáng tin hơn mean + SD.

2.3 CV — so sánh táo với cam

Hệ số biến thiên (CV) chuẩn hoá độ phân tán theo mean, nên không đơn vị. Nó cho phép so sánh mức độ dao động giữa hai đại lượng có thang đo khác nhau: ví dụ số dư (triệu đồng) so với số lượng giao dịch/tháng. CV càng cao → dữ liệu càng dao động tương đối. Lưu ý: CV vô nghĩa khi mean gần 0 hoặc có giá trị âm.


3. Phân vị, percentile và five-number summary

Percentile thứ p là giá trị mà dưới nó có p% dữ liệu. Median chính là percentile thứ 50 (P50). Quartile chia dữ liệu làm 4 phần: Q1 = P25, Q2 = P50 (median), Q3 = P75.

Five-number summary gồm 5 con số tóm tắt trọn vẹn hình dạng một biến số:

min  →  Q1 (P25)  →  median (P50)  →  Q3 (P75)  →  max

Đây là nền tảng của boxplot (biểu đồ hộp): hộp trải từ Q1 đến Q3 (chứa 50% dữ liệu giữa), vạch giữa là median, hai "râu" (whisker) kéo tới min/max trong ngưỡng, và các điểm nằm ngoài Q1 − 1.5×IQR hoặc Q3 + 1.5×IQR được đánh dấu là outlier. Boxplot là công cụ tuyệt vời để phát hiện dữ liệu lệch và điểm bất thường chỉ trong một cái nhìn.

Trong PostgreSQL, percentile tính bằng hàm sắp thứ tự PERCENTILE_CONT(p) WITHIN GROUP (ORDER BY col)_CONT nội suy tuyến tính giữa hai điểm gần nhất, còn _DISC trả về một giá trị thực có trong tập.


4. Hình dạng phân phối: skewness & kurtosis

Histogram là cách trực quan nhất để thấy hình dạng: chia miền giá trị thành các khoảng (bin) rồi đếm số quan sát rơi vào mỗi bin.

  • Skewness (độ lệch) — đo sự bất đối xứng.
    • Skewness ≈ 0: đối xứng (như phân phối chuẩn).
    • Skewness > 0: lệch phải — đuôi dài kéo về bên phải, mean > median. Điển hình của số dư, thu nhập, giá trị giao dịch.
    • Skewness < 0: lệch trái — đuôi dài về bên trái, mean < median.
  • Kurtosis (độ nhọn) — đo độ "nặng đuôi": kurtosis cao nghĩa là nhiều giá trị cực đoan (đuôi dày), rủi ro xuất hiện outlier lớn cao hơn. Trong quản trị rủi ro, đuôi dày rất đáng quan tâm.

Với dữ liệu lệch phải, thứ tự luôn là mode < median < mean. Chỉ cần so mean với median là biết ngay chiều lệch — không cần tính skewness đầy đủ.


5. Population vs Sample: σ vs s, chia n vs n−1

Một điểm hay bị nhầm và có thật sự khác biệt trong công thức.

  • Population (tổng thể) — toàn bộ đối tượng ta quan tâm. Tham số dùng ký hiệu Hy Lạp: mean = μ, độ lệch chuẩn = σ, phương sai = σ². Khi có đủ dữ liệu tổng thể, phương sai chia cho n.
  • Sample (mẫu) — một tập con rút ra để ước lượng tổng thể. Thống kê dùng ký hiệu Latin: mean = x̄, độ lệch chuẩn = s, phương sai = s². Phương sai mẫu chia cho n − 1 (hiệu chỉnh Bessel).

Vì sao mẫu chia cho n − 1?

Trực giác: khi tính phương sai mẫu, ta phải dùng x̄ (mean của chính mẫu) thay cho μ thật (không biết). Mà x̄ được chọn sao cho tổng bình phương độ lệch quanh nó là nhỏ nhất — nên các độ lệch quanh x̄ luôn nhỏ hơn độ lệch quanh μ thật. Nếu chia cho n, ta sẽ đánh giá thấp phương sai thật một cách có hệ thống. Chia cho n − 1 (một "bậc tự do" đã bị x̄ dùng mất) sẽ bù đúng phần thiếu hụt đó, cho ước lượng không chệch (unbiased).

Thực hành: với n lớn (hàng nghìn dòng như giao dịch ngân hàng), n vs n−1 gần như không khác. Nhưng phải hiểu đúng khi làm việc trên mẫu nhỏ.

Trong PostgreSQL: STDDEVSTDDEV_SAMP chia cho n−1 (mẫu); STDDEV_POP chia cho n (tổng thể). Tương tự VAR_SAMP vs VAR_POP.


6. SQL chạy được trên sandbox

6.1 Bản tóm tắt cơ bản: mean / min / max / stddev

Bức tranh đầu tiên về transactions.amount — count, trung bình, biên và độ lệch chuẩn mẫu:

-- ▶ Chạy được
SELECT
  COUNT(*)                       AS n,
  ROUND(AVG(amount), 2)          AS mean_amount,
  MIN(amount)                    AS min_amount,
  MAX(amount)                    AS max_amount,
  ROUND(STDDEV_SAMP(amount), 2)  AS sd_sample,
  ROUND(STDDEV_POP(amount), 2)   AS sd_population
FROM transactions;

Nếu sd_sample lớn xấp xỉ hoặc vượt mean_amount, đó là dấu hiệu dữ liệu tản rộng và nhiều khả năng lệch — cần xem thêm median.

6.2 Percentile & five-number summary

Tính đầy đủ five-number summary cùng các phân vị 25/50/75/90 cho số dư tài khoản:

-- ▶ Chạy được
SELECT
  MIN(balance)                                              AS min_bal,
  PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY balance)     AS p25,
  PERCENTILE_CONT(0.50) WITHIN GROUP (ORDER BY balance)     AS median,
  PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY balance)     AS p75,
  PERCENTILE_CONT(0.90) WITHIN GROUP (ORDER BY balance)     AS p90,
  MAX(balance)                                              AS max_bal,
  PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY balance)
    - PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY balance) AS iqr
FROM accounts;

Cột iqr (Q3 − Q1) là độ phân tán bền vững với outlier. Khoảng cách từ p90 tới max_bal thường rất lớn ở dữ liệu ngân hàng — đó chính là cái đuôi phải.

6.3 So sánh AVG vs median để "bắt" độ lệch

Đây là kiểm tra lệch nhanh nhất: đặt mean cạnh median trên cùng cột amount:

-- ▶ Chạy được
SELECT
  ROUND(AVG(amount), 2)                                 AS mean_amount,
  PERCENTILE_CONT(0.50) WITHIN GROUP (ORDER BY amount)  AS median_amount,
  ROUND(
    (AVG(amount) - PERCENTILE_CONT(0.50) WITHIN GROUP (ORDER BY amount))::numeric,
    2
  )                                                     AS mean_minus_median
FROM transactions;

Nếu mean_minus_median dương và lớn → lệch phải rõ: mean bị vài giao dịch lớn kéo lên trong khi median vẫn phản ánh giao dịch điển hình. Đây là bằng chứng nên báo cáo bằng median.

6.4 Phân phối theo nhóm

Thống kê mô tả theo từng loại giao dịch (kind) — mỗi nhóm có trung tâm và độ tản riêng:

-- ▶ Chạy được
SELECT
  kind,
  COUNT(*)                                              AS n,
  ROUND(AVG(amount), 2)                                 AS mean_amount,
  PERCENTILE_CONT(0.50) WITHIN GROUP (ORDER BY amount)  AS median_amount,
  ROUND(STDDEV_SAMP(amount), 2)                         AS sd_amount
FROM transactions
GROUP BY kind
ORDER BY n DESC;

Tách theo nhóm giúp phát hiện: có thể một kind đối xứng còn kind khác lệch nặng — gộp chung sẽ che mất đặc điểm này. Muốn phân tích theo loại tiền tệ, đổi sang GROUP BY currency trên bảng accounts (dùng cột balance).


7. Quy trình mô tả một biến số trong thực tế


Use case thực tế

Bối cảnh: Phòng Phân tích NCB cần đưa vào bản tin nội bộ con số "giá trị giao dịch điển hình" trong tháng để bộ phận kinh doanh tham chiếu khi thiết kế hạn mức ưu đãi.

Vấn đề: Bản nháp đầu tiên dùng AVG(amount) và ra 48 triệu đồng/giao dịch. Nhưng đội vận hành phản hồi "con số này cao bất thường, đa số giao dịch chỉ vài triệu".

Điều tra bằng thống kê mô tả:

  1. Chạy block 6.3 → mean = 48 triệu, median = 6,2 triệu, mean_minus_median = 41,8 triệu. Chênh lệch khổng lồ → lệch phải nặng.
  2. Chạy block 6.2 (đổi sang amount) → P75 = 12 triệu, P90 = 35 triệu, max = 9,8 tỷ. Xác nhận đuôi phải cực dài do vài giao dịch doanh nghiệp lớn.
  3. Chạy block 6.4 → tách theo kind thấy nhóm giao dịch giá trị lớn tuy chỉ chiếm ~0,3% số lượng nhưng kéo toàn bộ mean lên.

Kết luận & hành động:

  • Bản tin đổi sang báo cáo median 6,2 triệu làm "giá trị điển hình", kèm P90 = 35 triệu để mô tả nhóm giao dịch lớn.
  • Thiết kế hạn mức ưu đãi dựa trên median + IQR thay vì mean, tránh bị nhóm VIP làm méo.
  • Ghi chú rõ trong dashboard: "amount lệch phải, dùng median". Đây cũng là nền để các bài sau bàn về phân phối xác suấtlấy mẫu & CLT.

Cùng logic này áp dụng cho các chỉ số rủi ro và scoring — xem thêm các độ đo đánh giá mô hìnhphân tích nâng cao trong BI.


Ghi nhớ

  • Trung tâm: mean cho dữ liệu đối xứng và khi cần cộng dồn; median cho dữ liệu lệch (thu nhập, số dư, giá trị giao dịch); mode cho dữ liệu phân loại.
  • Mean rất nhạy outlier, median thì không — trong ngân hàng, mặc định ưu tiên median cho các đại lượng tiền tệ.
  • Phân tán: SD dễ đọc (cùng đơn vị) nhưng nhạy outlier; IQR bền vững; CV để so sánh phân tán giữa các thang đo khác nhau.
  • Five-number summary (min, Q1, median, Q3, max) + boxplot tóm gọn hình dạng và lộ ngay outlier.
  • Lệch phải ⇔ mean > median ⇔ mode < median < mean — so mean với median là cách bắt lệch nhanh nhất; kurtosis cao = đuôi dày, nhiều cực đoan.
  • Population dùng σ (chia n), sample dùng s (chia n−1); n−1 bù cho việc x̄ đã "dùng mất" một bậc tự do, cho ước lượng không chệch.
  • PostgreSQL: PERCENTILE_CONT(p) WITHIN GROUP (ORDER BY col) cho phân vị; STDDEV_SAMP (n−1) vs STDDEV_POP (n); đặt AVG cạnh median là bài kiểm tra lệch rẻ nhất.

Bài viết liên quan

Phân biệt ước lượng điểm và ước lượng khoảng, cách xây khoảng tin cậy (CI) bằng margin of error z*·SE / t*·SE, đánh đổi mức 90/95/99%, và cách DIỄN GIẢI ĐÚNG khoảng tin cậy (95% CI không phải xác suất tham số nằm trong khoảng). Có CI cho trung bình và cho tỷ lệ, ảnh hưởng của cỡ mẫu, cùng ví dụ ngân hàng về tỷ lệ nợ xấu và số dư trung bình.

13 thg 7, 2026 3

Chọn biểu đồ đúng cho từng loại dữ liệu, nguyên tắc thiết kế dashboard, và kể chuyện bằng dữ liệu.

13 thg 7, 2026 3

Kimball dimensional modeling: bảng fact/dimension, star vs snowflake, grain, và Slowly Changing Dimension.

13 thg 7, 2026 2

Khối OLAP, các thao tác drill-down/roll-up/slice & dice/pivot, OLAP vs OLTP và ROLAP/MOLAP/HOLAP.

13 thg 7, 2026 2