1. Giới thiệu chung về biểu đồ boxplot

Biểu đồ boxplot, còn được gọi là biểu đồ hộp, là một công cụ thống kê đồ họa mạnh mẽ, giúp người dùng nhanh chóng nắm bắt được phân phối của một tập dữ liệu. Nhờ vào việc hiển thị các thông số quan trọng như trung vị (median), các phần tư (quartiles), giá trị tối đa, tối thiểu và các điểm ngoại lệ (outliers), boxplot giúp chúng ta:

  • So sánh phân phối giữa nhiều nhóm dữ liệu một cách trực quan.
  • Phát hiện các giá trị bất thường, tức là các outlier.
  • Đánh giá độ lệch (skewness) và độ phân tán (dispersion) của dữ liệu.

Trong các lĩnh vực như khoa học dữ liệu, tài chính, y tế, giáo dục hay nghiên cứu xã hội, boxplot luôn là một trong những biểu đồ được ưa chuộng vì tính ngắn gọn và thông tin phong phú mà nó truyền tải.

Bài viết này sẽ hướng dẫn chi tiết cách vẽ biểu đồ boxplot từ các bước chuẩn bị dữ liệu, lựa chọn công cụ (Excel, Python, R, SPSS, Stata…) cho tới cách tùy chỉnh nâng cao để biểu đồ vừa đẹp mắt, vừa truyền đạt đúng thông tin. Bạn sẽ được học:

  1. Các khái niệm cơ bản và cách tính các thành phần của boxplot.
  2. Cách vẽ boxplot trong Excel (phiên bản 2026 trở lên).
  3. Vẽ boxplot bằng Python (thư viện Matplotlib, Seaborn, Plotly).
  4. Vẽ boxplot bằng R (ggplot2, base R).
  5. Các mẹo tối ưu hoá, tùy chỉnh màu sắc, nhãn, và đánh dấu outlier.
  6. So sánh các công cụ và lựa chọn phù hợp cho từng trường hợp thực tế.

Hãy cùng nhau khám phá chi tiết từng bước trong phần tiếp theo.

2. Các thành phần cấu thành một boxplot

Trước khi thực hiện vẽ, chúng ta cần hiểu rõ các thành phần cấu thành một boxplot để không bị nhầm lẫn khi giải thích kết quả.

Thành phần Ý nghĩa Cách tính
Min (giá trị tối thiểu không tính outlier) Giá trị thấp nhất trong dữ liệu, ngoại trừ các outlier. Thường là giá trị nhỏ nhất của dữ liệu sau khi loại bỏ outlier.
Q1 (25th percentile) Phần tư thứ nhất, giá trị dưới đó có 25% dữ liệu. Sắp xếp dữ liệu tăng dần, lấy giá trị tại vị trí 0.25 (n+1).
Median (Q2, 50th percentile) Trung vị, chia dữ liệu thành hai nửa bằng nhau. Giá trị nằm ở vị trí 0.5 (n+1).
Q3 (75th percentile) Phần tư thứ ba, giá trị dưới đó có 75% dữ liệu. Vị trí 0.75 (n+1).
Max (giá trị tối đa không tính outlier) Giá trị cao nhất trong dữ liệu, ngoại trừ outlier. Giá trị lớn nhất sau khi loại bỏ outlier.
IQR (Interquartile Range) Khoảng cách giữa Q3 và Q1, thể hiện độ phân tán. IQR = Q3 – Q1
Whiskers (râu) Độ dài râu thể hiện phạm vi dữ liệu không phải outlier. Thông thường: min = Q1 – 1.5IQR, max = Q3 + 1.5IQR (các giá trị ngoài khoảng này được coi là outlier).
Outliers Các giá trị nằm ngoài phạm vi whiskers, thường được đánh dấu bằng dấu chấm hoặc ký hiệu khác. Giá trị < Q1 – 1.5IQR hoặc > Q3 + 1.5IQR

2.1. Tại sao lại dùng 1.5IQR?

Hệ số 1.5 là một quy ước phổ biến trong thống kê để xác định outlier. Khi dữ liệu có phân phối gần chuẩn, khoảng 99.3% dữ liệu sẽ nằm trong khoảng Q1 – 1.5IQR và Q3 + 1.5IQR. Do đó, các giá trị nằm ngoài này thường được xem là bất thường. Tuy nhiên, tùy vào mục đích và đặc tính dữ liệu, người dùng có thể thay đổi hệ số này (ví dụ 3IQR cho dữ liệu có biến động cao).

3. Chuẩn bị dữ liệu

Cách Vẽ Biểu Đồ Boxplot
Cách Vẽ Biểu Đồ Boxplot

3.1. Định dạng dữ liệu

Để vẽ boxplot, dữ liệu cần được tổ chức thành cột (variables) và hàng (observations). Mỗi cột đại diện cho một biến hoặc một nhóm, ví dụ:

ID Nhóm Giá trị
1 A 12.3
2 A 15.6
3 B 8.9
… … …

Nếu bạn muốn vẽ nhiều box (so sánh giữa các nhóm), hãy đảm bảo có một cột nhóm để phân biệt.

3.2. Kiểm tra dữ liệu bị thiếu và lỗi

  • Missing values: Xử lý bằng cách loại bỏ (drop) hoặc thay thế (impute) tùy vào bối cảnh.
  • Giá trị không hợp lệ: Kiểm tra xem có giá trị âm trong trường hợp đo lường không âm không.
  • Định dạng số: Đảm bảo các cột chứa số thực được định dạng đúng (không có ký tự thập phân sai locale).

3.3. Kiểm tra phân phối sơ bộ

Trước khi vẽ boxplot, nên thực hiện một số phân tích sơ bộ:

import pandas as pd
df.describe()
df.boxplot(column='Giá trị', by='Nhóm')

Kết quả describe() cho bạn nhanh các thống kê: mean, std, min, max, quartiles. Điều này giúp xác nhận tính đúng đắn của dữ liệu và phát hiện outlier sơ bộ.

4. Vẽ boxplot trong Microsoft Excel

Excel là công cụ phổ biến cho người dùng không chuyên lập trình. Dưới đây là hướng dẫn chi tiết cách vẽ boxplot trong Excel 2026 trở lên (các phiên bản mới hơn cũng tương tự).

4.1. Bước 1: Chuẩn bị dữ liệu

Giả sử bạn có dữ liệu trong Sheet1:

Nhóm Giá trị
A 12.3
A 15.6
A 14.2
B 8.9
B 10.5
B 9.8
… …

4.2. Bước 2: Chèn biểu đồ “Box & Whisker”

Cách Vẽ Biểu Đồ Boxplot
Cách Vẽ Biểu Đồ Boxplot
  1. Chọn dữ liệu: Bôi đen cột “Giá trị” và cột “Nhóm”.
  2. Vào Insert → Insert Statistic Chart → Box and Whisker. (Nếu không thấy, có thể vào “All Charts” → “Statistical” → “Box and Whisker”).
  3. Excel sẽ tự động tạo boxplot cho mỗi nhóm.

4.3. Bước 3: Tùy chỉnh biểu đồ

  • Thay đổi màu sắc: Click vào hộp (box), vào “Format Data Series”, chọn “Fill” để thay đổi màu.
  • Hiển thị giá trị outlier: Mặc định Excel sẽ hiển thị outlier dưới dạng dấu chấm. Bạn có thể thay đổi kích thước bằng cách click vào outlier → “Format Data Point”.
  • Thêm tiêu đề và nhãn trục: Click vào biểu đồ → “Chart Title” và “Axis Titles”.
  • Hiển thị trung vị: Trên “Format Data Series”, chọn “Median line” để bật/tắt.

4.4. Bước 4: Lưu và xuất biểu đồ

  • Copy: Bạn có thể copy biểu đồ sang PowerPoint hoặc Word.
  • Lưu dưới dạng hình ảnh: Click chuột phải → “Save as Picture”.

4.5. Lưu ý khi dùng Excel

  • Excel tự động tính whisker dựa trên 1.5IQR, nhưng không cho tùy chỉnh hệ số này.
  • Đối với dữ liệu lớn (hơn 10,000 điểm), Excel có thể chậm và không hiển thị chính xác outlier. Trong trường hợp này, nên chuyển sang Python hoặc R.

5. Vẽ boxplot bằng Python

Python là ngôn ngữ mạnh mẽ cho phân tích dữ liệu. Thư viện Matplotlib, Seaborn, và Plotly cung cấp các hàm vẽ boxplot linh hoạt.

5.1. Cài đặt môi trường

pip install pandas matplotlib seaborn plotly

5.2. Dữ liệu mẫu

import pandas as pd
import numpy as np np.random.seed(42)
df = pd.DataFrame({ 'Nhóm': np.repeat('A', 'B', 'C', 100), 'Giá trị': np.concatenate( np.random.normal(15, 3, 100), # Nhóm A np.random.normal(10, 2, 100), # Nhóm B np.random.normal(20, 5, 100) # Nhóm C )
})

5.3. Vẽ boxplot với Matplotlib

import matplotlib.pyplot as plt fig, ax = plt.subplots(figsize=(8,6))
df.boxplot(column='Giá trị', by='Nhóm', ax=ax, grid=False, boxprops=dict(facecolor='lightblue', color='navy'), medianprops=dict(color='red'), whiskerprops=dict(color='navy'), capprops=dict(color='navy'), flierprops=dict(marker='o', color='orange', alpha=0.5))
ax.set_title('Boxplot các Nhóm')
ax.set_xlabel('Nhóm')
ax.set_ylabel('Giá trị')
plt.suptitle('') # Loại bỏ tiêu đề mặc định
plt.show()

Giải thích các tham số

  • boxprops: định dạng hộp (màu nền, viền).
  • medianprops: màu và độ dày đường trung vị.
  • whiskerprops và capprops: màu râu và đầu râu.
  • flierprops: định dạng outlier (dấu chấm).

5.4. Vẽ boxplot với Seaborn (đẹp hơn)

Cách Vẽ Biểu Đồ Boxplot
Cách Vẽ Biểu Đồ Boxplot
import seaborn as sns plt.figure(figsize=(9,6))
sns.boxplot(x='Nhóm', y='Giá trị', data=df, palette='Pastel1', width=0.6, fliersize=5, linewidth=1.5, medianprops={'color':'black', 'linewidth':2}, whiskerprops={'linestyle':'--', 'color':'gray'})
plt.title('Boxplot So Sánh Các Nhóm (Seaborn)')
plt.show()

Seaborn tự động tính IQR và outlier, đồng thời hỗ trợ hue để phân chia theo một biến thứ hai.

5.5. Boxplot tương tác với Plotly

Plotly cho phép tạo biểu đồ tương tác trên web.

import plotly.express as px fig = px.box(df, x='Nhóm', y='Giá trị', points='outliers', # hiển thị outlier title='Boxplot tương tác (Plotly)', color='Nhóm', hover_data='Giá trị')
fig.show()

Bạn có thể zoom, hover để xem giá trị chi tiết, rất hữu ích cho báo cáo web.

5.6. Tùy chỉnh hệ số IQR trong Python

Nếu muốn thay đổi hệ số (ví dụ 2IQR), bạn cần tính thủ công:

def custom_boxplot(ax, data, group, factor=1.5, kwargs): q1 = np.percentile(data, 25) q3 = np.percentile(data, 75) iqr = q3 - q1 lower = q1 - factoriqr upper = q3 + factoriqr # Vẽ hộp và râu bằng Matplotlib ax.boxplot(data, whis=lower, upper, kwargs) # Ví dụ:
fig, ax = plt.subplots()
custom_boxplot(ax, dfdf'Nhóm'=='A''Giá trị', 'A', factor=2.0)
ax.set_title('Boxplot với hệ số IQR = 2.0')
plt.show()

6. Vẽ boxplot bằng R

R là ngôn ngữ thống kê truyền thống, với ggplot2 là thư viện mạnh mẽ nhất để tạo biểu đồ.

6.1. Cài đặt gói

install.packages(c("ggplot2", "dplyr"))
library(ggplot2)
library(dplyr)

6.2. Dữ liệu mẫu

set.seed(42)
df <- data.frame( Nhóm = rep(c("A","B","C"), each=100), Giá_trị = c(rnorm(100, 15, 3), rnorm(100, 10, 2), rnorm(100, 20, 5))
)

6.3. Boxplot cơ bản với ggplot2

ggplot(df, aes(x=Nhóm, y=Giá_trị, fill=Nhóm)) + geom_boxplot(outlier.colour = "red", outlier.shape = 16, outlier.size = 2, notch = FALSE) + # notch = TRUE để hiển thị notch labs(title="Boxplot So Sánh Các Nhóm", x="Nhóm", y="Giá trị") + theme_minimal() + scale_fill_brewer(palette="Pastel1")

6.4. Thêm notch để kiểm tra sự khác nhau giữa median

Notch (vết nứt) thể hiện khoảng tin cậy 95% cho median. Khi các notch không chồng lên nhau, chúng ta có thể khẳng định median của các nhóm khác nhau một cách có ý nghĩa thống kê.

ggplot(df, aes(x=Nhóm, y=Giá_trị, fill=Nhóm)) + geom_boxplot(notch=TRUE, outlier.colour="darkred") + labs(title="Boxplot với Notch (Kiểm tra Median)", x="Nhóm", y="Giá trị") + theme_classic()

6.5. Tùy chỉnh whisker (hệ số IQR)

Cách Vẽ Biểu Đồ Boxplot
Cách Vẽ Biểu Đồ Boxplot

Trong ggplot2, coef là tham số điều chỉnh hệ số IQR (mặc định 1.5).

ggplot(df, aes(x=Nhóm, y=Giá_trị, fill=Nhóm)) + geom_boxplot(coef = 2.0, outlier.colour="blue") + # 2IQR labs(title="Boxplot với hệ số IQR = 2.0", x="Nhóm", y="Giá trị") + theme_light()

6.6. Vẽ boxplot cho dữ liệu nhóm phụ (hue)

Nếu muốn so sánh theo hai biến, dùng facet_wrap hoặc fill:

df$Giới_tính <- sample(c("Nam","Nữ"), 300, replace=TRUE) ggplot(df, aes(x=Nhóm, y=Giá_trị, fill=Giới_tính)) + geom_boxplot(outlier.shape=NA) + # Ẩn outlier để làm sạch facet_wrap(~Giới_tính) + labs(title="Boxplot theo Nhóm và Giới tính", x="Nhóm", y="Giá trị") + theme_bw()

7. So sánh các công cụ vẽ boxplot

Tiêu chí Excel Python (Matplotlib/Seaborn/Plotly) R (ggplot2) SPSS / Stata
Độ dễ sử dụng Rất cao (giao diện kéo thả) Trung bình (cần viết code, nhưng linh hoạt) Trung bình – cao (cú pháp ggplot2 ngắn gọn) Cao (menu thống kê)
Tùy chỉnh Hạn chế (không thay đổi hệ số IQR) Rất linh hoạt, hỗ trợ tương tác (Plotly) Linh hoạt, hỗ trợ notch, theme đa dạng Trung bình
Xử lý dữ liệu lớn Không tốt (>10k) Tốt, xử lý hàng triệu dòng Tốt, nhưng phụ thuộc vào RAM Tốt
Khả năng xuất báo cáo Dễ dàng chèn vào Office Có thể xuất PNG, SVG, HTML, Jupyter Export PDF, PNG, LaTeX Export PDF, PPT
Chi phí Thuê bản Office Miễn phí (open-source) Miễn phí (open-source) Thuê bản SPSS/ Stata

Kết luận:
– Nếu bạn chỉ cần một biểu đồ nhanh, không yêu cầu tùy chỉnh sâu, Excel là lựa chọn nhanh nhất.
– Đối với phân tích chuyên sâu, cần tùy biến, hoặc làm báo cáo tự động, Python và R là hai công cụ mạnh mẽ nhất.
– Nếu bạn đã quen với SPSS hoặc Stata trong môi trường nghiên cứu xã hội, chúng cũng cung cấp chức năng boxplot nhanh chóng.

8. Mẹo nâng cao để boxplot “đẹp” và “chuyên nghiệp”

  1. Thêm nhãn giá trị trung vị
    python medians = df.groupby('Nhóm')'Giá trị'.median() for i, median in enumerate(medians): ax.text(i+1, median, f'{median:.2f}', ha='center', va='bottom', color='black')

  2. Kết hợp violin plot và boxplot
    Violin plot hiển thị mật độ, còn boxplot cung cấp thống kê cơ bản.
    python sns.violinplot(x='Nhóm', y='Giá trị', data=df, inner=None, color=".8") sns.boxplot(x='Nhóm', y='Giá trị', data=df, width=0.2)

  3. Sử dụng màu sắc thống nhất với thương hiệu
    Đặt palette bằng mã HEX để đồng nhất màu thương hiệu.

  4. Hiển thị số lượng quan sát (n) trên mỗi box
    python counts = df'Nhóm'.value_counts().sort_index() ax.set_xticklabels(f'{g}\n(n={countsg})' for g in counts.index)

  5. Làm sạch outlier nếu cần
    Đôi khi outlier là lỗi nhập liệu, bạn có thể loại bỏ trước khi vẽ:
    python Q1 = df'Giá trị'.quantile(0.25) Q3 = df'Giá trị'.quantile(0.75) IQR = Q3 - Q1 df_clean = df~((df'Giá trị' < (Q1 - 1.5IQR)) | (df'Giá trị' > (Q3 + 1.5IQR)))

  6. Thêm đường tham chiếu (reference line)
    Nếu có giá trị chuẩn (benchmark), dùng ax.axhline(y=benchmark, linestyle='--', color='red').

  7. Tạo báo cáo PDF tự động

  8. Python: matplotlib.backends.backend_pdf.PdfPages.
  9. R: ggsave("boxplot.pdf", width=8, height=6).

9. Thực hành: Tạo báo cáo boxplot cho dự án thực tế

Giả sử bạn là nhà phân tích dữ liệu trong một công ty bán lẻ, muốn so sánh doanh thu trung bình của ba khu vực (Miền Bắc, Miền Trung, Miền Nam) trong năm 2026.

Cách Vẽ Biểu Đồ Boxplot
Cách Vẽ Biểu Đồ Boxplot

9.1. Thu thập dữ liệu

Khu_vực Doanh_thu
Bắc 120, 135, 150, …
Trung 95, 100, 110, …
Nam 200, 210, 190, …

9.2. Xử lý và vẽ boxplot bằng Python

import pandas as pd, seaborn as sns, matplotlib.pyplot as plt # Đọc dữ liệu CSV
df = pd.read_csv('doanhthu_2023.csv') # Kiểm tra missing
df.dropna(inplace=True) # Vẽ boxplot
plt.figure(figsize=(10,6))
sns.boxplot(x='Khu_vực', y='Doanh_thu', data=df, palette='Set2', notch=True, # hiển thị notch flierprops=dict(marker='o', color='red', alpha=0.6))
plt.title('So sánh Doanh thu các Khu vực (2026)')
plt.xlabel('Khu vực')
plt.ylabel('Doanh thu (nghìn USD)') # Thêm đường trung vị
medians = df.groupby('Khu_vực')'Doanh_thu'.median()
for i, median in enumerate(medians): plt.text(i, median+5, f'{median:.0f}', ha='center', color='black') plt.show()

9.3. Đánh giá kết quả

  • Khu vực Nam có median cao nhất (~200k), phân tán rộng (IQR lớn) – cho thấy doanh thu không ổn định.
  • Khu vực Bắc có median trung bình, whisker dưới (Q1 – 1.5IQR) khá cao, thể hiện ít outlier thấp.
  • Khu vực Trung có phạm vi hẹp, ít outlier, cho thấy doanh thu ổn định nhưng thấp hơn.

Những thông tin này giúp ban giám đốc quyết định tập trung nguồn lực marketing vào khu vực Nam để giảm biến động, hoặc tìm nguyên nhân gây outlier (có thể là chiến dịch khuyến mãi đặc biệt).

10. Kết luận

Biểu đồ boxplot không chỉ là một công cụ trực quan mà còn chứa đựng rất nhiều thông tin thống kê quan trọng. Việc hiểu đúng các thành phần (min, Q1, median, Q3, max, IQR, outlier) giúp bạn giải thích dữ liệu một cách chính xác. Từ Excel cho người mới bắt đầu đến Python và R cho nhà phân tích chuyên sâu, mỗi công cụ có ưu nhược điểm riêng, và lựa chọn phụ thuộc vào:

  • Mức độ phức tạp của dự án.
  • Khối lượng dữ liệu cần xử lý.
  • Yêu cầu tùy chỉnh (màu sắc, notch, hệ số IQR…).
  • Môi trường làm việc (Office, Jupyter, RStudio…).

Hy vọng qua bài viết này, bạn đã nắm vững cách vẽ boxplot từ chuẩn bị dữ liệu, tính toán thống kê, tới thực hiện trên các phần mềm phổ biến, đồng thời biết cách tùy chỉnh để tạo ra các biểu đồ vừa đẹp mắt, vừa truyền tải đúng thông tin. Hãy áp dụng những kiến thức này vào công việc thực tế và khám phá thêm nhiều cách sáng tạo khác cho biểu đồ boxplot của bạn!

Chúc bạn thành công trong việc trực quan hoá dữ liệu và đưa ra quyết định dựa trên thống kê!

Rate this post
Mục nhập này đã được đăng trong Blog. Đánh dấu trang permalink.

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *