Chuyển đến nội dung chính

Biểu đồ Hộp trong Python: Hướng dẫn Toàn diện cho Người mới bắt đầu

Tạo các biểu đồ hộp ấn tượng trong Python! Hướng dẫn toàn diện cho người mới bắt đầu này bao quát Matplotlib và Seaborn, giúp bạn trực quan hóa và so sánh phân phối dữ liệu.
· 15 phút đọc

Khám phá cùng AI

Bạn đã bao giờ tự hỏi làm thế nào để biểu diễn trực quan phân phối dữ liệu số trong Python tốt hơn chưa? Lựa chọn tốt nhất là học cách dùng biểu đồ hộp! Biểu đồ hộp là cách tuyệt vời để so sánh phân phối giữa nhiều nhóm.

Trong hướng dẫn này, chúng ta sẽ tìm hiểu biểu đồ hộp là gì, các cách tạo chúng trong Python, và một số lỗi phổ biến của người mới bắt đầu.

Biểu đồ Hộp trong Python là gì?

Biểu đồ hộp, còn gọi là biểu đồ hộp và râu (box-and-whisker), là một cách hiển thị dữ liệu tiêu chuẩn dựa trên năm số tóm tắt: giá trị nhỏ nhất, tứ phân vị thứ nhất (Q1), trung vị, tứ phân vị thứ ba (Q3) và giá trị lớn nhất.

Biểu đồ hộp đặc biệt hữu ích để nhận diện giá trị ngoại lai và hiểu độ phân tán cũng như độ lệch của dữ liệu. Chúng cũng được dùng khi so sánh nhiều nhóm hoặc trực quan hóa phân phối của một biến đơn.

Các thành phần của biểu đồ hộp

Một biểu đồ hộp điển hình gồm nhiều thành phần:

  1. Trung vị: Giá trị nằm giữa của dữ liệu, thể hiện bằng một đường bên trong hộp.
  2. Hộp: Biểu diễn khoảng tứ phân vị (IQR), là khoảng giữa Q1 và Q3. Cạnh dưới và trên lần lượt là Q1 và Q3.
  3. Râu: Các đường thẳng đứng kéo dài từ hai đầu hộp, biểu diễn giá trị nhỏ nhất và lớn nhất, không tính các ngoại lai.
  4. Giá trị ngoại lai: Các điểm nằm ngoài phần râu, được xem là bất thường hoặc cực trị so với phần còn lại của dữ liệu.
  5. Nắp: Các đường ngang ở cuối phần râu, biểu diễn giá trị nhỏ nhất và lớn nhất, bao gồm cả ngoại lai.

Các thành phần này kết hợp với nhau tạo nên ý nghĩa thống kê cho biểu đồ hộp và cho phép so sánh trực quan dễ dàng giữa các nhóm dữ liệu khác nhau.

Python là công cụ mạnh mẽ giúp chúng ta tạo biểu đồ hộp. Ở các phần sau, chúng ta sẽ xem qua các phương pháp khác nhau để thực hiện.

Biểu đồ Hộp trong Python: Hướng dẫn Từng bước

Giờ bạn đã có hiểu biết cơ bản về biểu đồ hộp, hãy xem cách tạo chúng bằng Python. Nhiều thư viện trong Python như Matplotlib, Seaborn và Plotly hỗ trợ tạo biểu đồ hộp.

Để tạo biểu đồ hộp trong Python, trước tiên cần cài đặt các thư viện cần thiết. Các thư viện chính là Matplotlib, Seaborn và Plotly.

Dưới đây là mã để cài đặt:

pip install matplotlib
pip install seaborn
pip install plotly==5.22.0

Sau khi cài đặt, bước tiếp theo là import các thư viện này vào môi trường Python của bạn.

Hãy đảm bảo bạn cũng nạp các bộ dữ liệu cần dùng cho biểu đồ hộp, nếu có.

#imports Matplotlib library and assigns shorthand 'plt'
import matplotlib.pyplot as plt
#imports Seaborn library and assigns shorthand 'sns'
import seaborn as sns
#imports Plotly library and assigns shorthand 'px'
import plotly.express as px

Nhờ sự linh hoạt của Python, việc tạo một biểu đồ hộp đơn giản chỉ cần rất ít mã. Hãy bắt đầu với thư viện phổ biến nhất, Matplotlib.

Để tạo biểu đồ hộp bằng Matplotlib, hãy import các thư viện cần thiết:

import matplotlib.pyplot as plt
import numpy as np

Tiếp theo, chuẩn bị một tập dữ liệu đơn giản:

# Generates some random dataset
np.random.seed(10) 
data = np.random.normal(0, 1, 100)

Cuối cùng, tạo biểu đồ hộp và hiển thị:

# Creates a boxplot
plt.boxplot(data) plt.title('Basic Boxplot') plt.show()

Kết quả như sau:Biểu đồ Matplotlib cơ bản

Nếu bạn muốn tạo các biểu đồ hộp riêng trong những subplot khác nhau, bạn có thể dùng hàm subplot. Cách này cho phép tạo nhiều biểu đồ hộp cạnh nhau trong một hình ảnh.

Dưới đây là ví dụ mã đầy đủ:

import matplotlib.pyplot as plt
import numpy as np
# Generates multiple datasets
data1 = np.random.normal(0, 1, 100)
data2 = np.random.normal(1, 2, 100)
data3 = np.random.normal(2, 1.5, 100)
# Creates subplots
fig, axs = plt.subplots(1, 3, figsize=(15, 5))
# Plots Boxplot for Data 1
axs[0].boxplot(data1)
axs[0].set_title('Data 1')
axs[0].set_xlabel('Sample')
axs[0].set_ylabel('Value')
# Plots Boxplot for Data 2
axs[1].boxplot(data2)
axs[1].set_title('Data 2')
axs[1].set_xlabel('Sample')
axs[1].set_ylabel('Value')
# Plots Boxplot for Data 3
axs[2].boxplot(data3)
axs[2].set_title('Data 3')
axs[2].set_xlabel('Sample')
axs[2].set_ylabel('Value')
# Adjusts layout
plt.tight_layout()
plt.show()

Đây là biểu đồ thu được:

Nhiều biểu đồ hộp trong Matplotlib

Tuy nhiên, các subplot này không dùng chung trục nên không phù hợp cho so sánh cạnh nhau giữa các danh mục. Để có nhiều biểu đồ hộp dùng chung trục, bạn sẽ cần tạo biểu đồ hộp theo nhóm.

Biểu đồ hộp theo nhóm đặc biệt hữu ích để so sánh phân phối giữa nhiều danh mục, giúp hiểu dữ liệu chi tiết hơn. Những so sánh này có thể bộc lộ khác biệt không dễ thấy ở các biểu đồ khác.

Mỗi nhóm được hiển thị cạnh nhau trong cùng một biểu đồ, giúp dễ dàng làm nổi bật biến động, xu hướng và ngoại lai giữa các nhóm nhỏ khác nhau.

Cách tạo một subplot theo nhóm như sau:

# Generates grouped data
data_group1 = [np.random.normal(0, 1, 100), np.random.normal(1, 2, 100), np.random.normal(2, 1.5, 100)]
data_group2 = [np.random.normal(0, 1, 100), np.random.normal(1, 2, 100), np.random.normal(2, 1.5, 100)]
# Combines two data groups into a dataset
data = data_group1 + data_group2
# Creates grouped boxplots
plt.boxplot(data, positions=[1, 2, 3, 5, 6, 7], labels=['G1-D1', 'G1-D2', 'G1-D3', 'G2-D1', 'G2-D2', 'G2-D3'])
plt.title('Grouped Boxplots')
plt.xlabel('Group-Dataset')
plt.ylabel('Value')
plt.show()

Đây là biểu đồ hộp theo nhóm tạo ra từ đoạn mã trên:

Biểu đồ hộp theo nhóm trong Matplotlib

Bạn có thể dùng các tùy chỉnh nâng cao trong Matplotlib để tăng chất lượng trực quan hóa dữ liệu.

Các kỹ thuật như thêm giá trị trung bình, thêm độ lệch chuẩn, tạo biểu đồ hộp theo nhóm và dùng biểu đồ hộp ngang có thể mang lại hiểu biết tốt hơn về phân phối dữ liệu.

Tùy chỉnh biểu đồ hộp trong Python cũng cho phép bạn điều chỉnh hình ảnh theo yêu cầu của dự án.

Dưới đây là một số cách tùy chỉnh biểu đồ hộp với thư viện Matplotlib:

1. Thêm nhãn và tiêu đề

Tiêu đề và nhãn giúp biểu đồ dễ hiểu hơn, người xem có thể nhanh chóng nắm bắt sự so sánh dữ liệu. Việc thêm các thành phần này khá đơn giản với các hàm của Matplotlib.

Để thêm nhãn cho biểu đồ hộp trong Matplotlib:

plt.boxplot(data)
# Adds title
plt.title('Customized Boxplot Title')
# Adds x axis label
plt.xlabel('Customized X Label')
# Adds y axis label
plt.ylabel('Customized Y Label')
plt.show()

Đoạn mã này sẽ tạo biểu đồ hộp có nhãn như hình dưới:

Tùy chỉnh tiêu đề và nhãn trong Matplotlib

2. Điều chỉnh màu sắc biểu đồ hộp

Tùy chỉnh màu sắc và kiểu dáng của biểu đồ hộp trong Python giúp trình bày dữ liệu rõ ràng và hấp dẫn hơn. Chúng cũng giúp bạn nhấn mạnh hiệu quả các điểm dữ liệu hoặc so sánh quan trọng cho các bên liên quan.

Bạn có thể thay đổi màu của hộp, râu, nắp, đường trung vị và các điểm ngoại lai thông qua các tham số boxprops, whiskerprops, capprops, medianprops và flierprops.

Ví dụ mã:

plt.boxplot(data, boxprops=dict(color='blue'), whiskerprops=dict(color='red'), capprops=dict(color='green'), medianprops=dict(color='orange'), flierprops=dict(markerfacecolor='red', marker='o'))
plt.show()

Đoạn mã này sẽ tạo màu sắc khác nhau cho các thành phần của biểu đồ hộp theo tham số bạn đặt:

Tùy chỉnh màu biểu đồ hộp trong Matplotlib

3. Thêm giá trị trung bình và độ lệch chuẩn

Thêm trung bình và độ lệch chuẩn vào biểu đồ hộp để cung cấp nhiều thông tin thống kê hơn.

# Creates dataset
data1 = np.random.normal(0, 1, 100)
data2 = np.random.normal(1, 2, 100)
data3 = np.random.normal(2, 1.5, 100)
# Calculates the mean and standard deviations
mean = [np.mean(d) for d in data]
std_devs = [np.std(d) for d in data]
# Creates a boxplot
plt.boxplot(data, labels=['Data 1', 'Data 2', 'Data 3'])
# Adds mean as red dots
for i in range(len(mean)):
   plt.plot(i + 1, mean[i], 'ro')
# Adds standard deviations as error bars
for i in range(len(std_devs)):
   plt.errorbar(i + 1, mean[i], yerr=std_devs[i], fmt='o', color='red')
# Plots graph
plt.title('Boxplot with Means and Standard Deviations')
plt.xlabel('Dataset')
plt.ylabel('Value')
plt.show()

Đây là biểu đồ thu được:

Biểu đồ hộp với trung bình và độ lệch chuẩn trong Matplotlib

4. Biểu đồ hộp ngang

Biểu đồ hộp ngang có thể giúp trực quan hóa dễ đọc hơn, đặc biệt khi tên danh mục dài.

Có thể thực hiện đơn giản bằng tham số vert của hàm boxplot trong Matplotlib.

# Creates horizontal boxplot
plt.boxplot(data,
            labels=['Data 1', 'Data 2', 'Data 3'], 
            vert=False)
# Plots graph
plt.title('Horizontal Boxplot')
plt.xlabel('Value')
plt.ylabel('Dataset')
plt.show()

Đây là biểu đồ tạo ra từ đoạn mã trên:

Biểu đồ hộp ngang trong Matplotlib

Khóa học Giới thiệu Trực quan hóa Dữ liệu với Matplotlib của chúng tôi cũng sẽ giúp bạn hiểu rõ hơn cách tạo các trực quan hóa dữ liệu vượt ra ngoài biểu đồ hộp.

Nếu bạn cần tham khảo lại sau này, đây là tổng hợp cheat sheet cho việc vẽ biểu đồ trong Matplotlib:

Cheatsheet Matplotlib

Seaborn, được xây dựng trên Matplotlib, giúp việc tạo các biểu đồ hộp bắt mắt trở nên đơn giản với ít mã. Cú pháp rõ ràng khiến thư viện này phù hợp cho mọi trình độ, và tích hợp tốt với các thư viện khác giúp linh hoạt tối đa trong phân tích dữ liệu.

Dưới đây là hướng dẫn từng bước để tạo một biểu đồ hộp cơ bản bằng Seaborn. Như trước, bắt đầu bằng cách import các thư viện cần thiết.

# Imports necessary libraries
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np

Tiếp theo, chuẩn bị một tập dữ liệu đơn giản:

# Generates a random dataset
np.random.seed(10)
data = np.random.normal(0, 1, 100)

Cuối cùng, tạo biểu đồ hộp và hiển thị:

# Creates a basic boxplot
sns.boxplot(data=data)
# Adds title to the boxplot
plt.title('Basic Boxplot') 
plt.show()

Đây là biểu đồ thu được:

Biểu đồ hộp Seaborn cơ bản

Bạn có thể tùy chỉnh biểu đồ Seaborn bằng các tham số hue, orient và palette.

Để tô màu biểu đồ hộp theo danh mục, hãy dùng tham số hue:

# Generate multiple datasets
data = {
    'Group': ['A']*100 + ['B']*100 + ['C']*100,
    'Value': np.concatenate([np.random.normal(0, 1, 100), 
                             np.random.normal(1, 2, 100), 
                             np.random.normal(2, 1.5, 100)])
}
df = pd.DataFrame(data)
# Create additional grouping data
df['Subgroup'] = np.random.choice(['X', 'Y'], size=300)
# Plots graph
sns.boxplot(x='Group', y='Value', data=df, hue='Subgroup', palette='Set2')
plt.title('Colored Boxplot')
plt.show()

Đây là biểu đồ đã được chỉnh màu:

Biểu đồ hộp Seaborn có màu

Để căn biểu đồ hộp theo một hướng cụ thể, dùng tham số orient. Với hướng dọc, đặt orient là 'v'. Với hướng ngang, đặt là 'h'.

Đây là mã cho biểu đồ hộp ngang:

# Plots horizontal boxplot
sns.boxplot(data=df, orient='h', palette='Set2')
plt.title('Colored Boxplot')
plt.show()

Đoạn mã trên sẽ tạo biểu đồ như sau:

Biểu đồ hộp ngang với Seaborn

Để thêm các điểm dữ liệu riêng lẻ vào biểu đồ hộp, bạn có thể dùng swarm plot thông qua hàm swarmplot:

# Plots boxplot
sns.boxplot(x='Group', y='Value', data=df)
# Overlays swarm plot over boxplot
sns.swarmplot(x='Group', y='Value', data=df, color='black', alpha=0.5)
plt.title('Boxplot with Swarmplot')
plt.show()

Đoạn mã trên sẽ tạo biểu đồ như sau:

Biểu đồ hộp kèm swarmplot

Swarm plot như vậy có thể giúp cung cấp thêm hiểu biết về phân phối dữ liệu. Nó bổ sung thông tin thống kê của biểu đồ hộp để mang đến cho người xem bức tranh toàn diện hơn về dữ liệu của bạn.

Xem khóa học Giới thiệu Trực quan hóa Dữ liệu với Seaborn của chúng tôi để biết thêm cách triển khai trực quan hóa dữ liệu trong Seaborn.

Nếu bạn muốn tham khảo lại sau này, đây là cheat sheet cho việc vẽ biểu đồ trong Seaborn:

Cheat sheet Seaborn

Diễn giải Kết quả Biểu đồ Hộp trong Python

Việc diễn giải biểu đồ hộp phụ thuộc vào ngữ cảnh và câu hỏi nghiên cứu cụ thể mà nó giải quyết.

Tuy vậy, có một số hướng dẫn chung giúp hiểu phân phối dữ liệu thể hiện qua biểu đồ hộp, bao gồm:

  • Đường trung vị cho biết giá trị giữa của tập dữ liệu.
  • Khoảng tứ phân vị (IQR) hay 50% giá trị ở giữa nằm giữa tứ phân vị thứ nhất (Q1) và tứ phân vị thứ ba (Q3).
  • Phần râu kéo dài lần lượt 1.5 lần phía trên Q3 và phía dưới Q1.
  • Các ngoại lai được vẽ riêng lẻ bằng dấu chấm hoặc dấu hoa thị.
  • Chiều dài của hộp và râu cho cảm nhận về mức độ phân tán của dữ liệu.
  • Phân phối lệch sẽ thể hiện sự bất đối xứng về kích thước và vị trí của hộp so với đường trung vị.
  • Các ngoại lai vượt quá 1.5 lần phía trên hoặc dưới Q3 và Q1 có thể chỉ ra các giá trị cực trị hoặc lỗi tiềm ẩn trong đo lường dữ liệu.

Những Lỗi Thường Gặp Cần Tránh Khi Tạo Biểu đồ Hộp trong Python

Mặc dù Python giúp tạo các biểu đồ hộp bắt mắt từ dữ liệu của bạn một cách đơn giản, vẫn có vài điểm cần lưu ý để tránh các trực quan hóa gây hiểu lầm hoặc không chính xác.

1. Không xử lý giá trị khuyết

Khi tạo biểu đồ hộp trong Python, người thực hành thường bỏ qua tầm quan trọng của tiền xử lý dữ liệu, dẫn đến kết quả gây hiểu lầm.

Mọi trực quan hóa dữ liệu đều cần một mức độ làm sạch trước khi vẽ. Biểu đồ hộp cũng không ngoại lệ và có thể hiển thị giá trị khuyết như ngoại lai, khiến kết quả bị lệch.

2. Chuẩn hóa/điều chỉnh thang đo không phù hợp

Ngoài ra, đôi khi người dùng không điều chỉnh thang đo dữ liệu phù hợp, dẫn đến biểu đồ hộp bị lệch và không phản ánh đúng đặc trưng của tập dữ liệu. Chuẩn hóa giúp các đặc trưng đóng góp công bằng vào phân tích.

3. Không xử lý ngoại lai

Cuối cùng, các nhà phân tích có thể bỏ qua việc xem xét và xử lý kỹ các ngoại lai trước khi vẽ. Xử lý sai ngoại lai có thể làm sai lệch diễn giải, vì vậy cần phân biệt ngoại lai thực sự với lỗi hay bất thường trong quá trình thu thập dữ liệu.

Hãy thử dùng cheat sheet này khi xây dựng trực quan hóa dữ liệu:

Cheat sheet trực quan hóa dữ liệu

Kết luận

Biểu đồ hộp là công cụ quý giá để trực quan hóa phân phối dữ liệu và so sánh giữa các danh mục.

Trong Python, bạn có thể dùng Matplotlib, Seaborn hoặc Plotly để tạo biểu đồ hộp nhanh chóng mà không cần quá nhiều mã. DataCamp có các khóa học toàn diện cho từng công cụ này:

Bạn muốn khám phá sâu hơn về trực quan hóa dữ liệu bằng Python? Vậy lộ trình kỹ năng Data Visualization with Python sẽ giúp bạn rất nhiều!

Câu hỏi thường gặp

Biểu đồ hộp có dùng cho dữ liệu phi số được không?

Không, biểu đồ hộp được thiết kế riêng cho dữ liệu số. Chúng biểu diễn phân phối của một tập dữ liệu dựa trên năm số tóm tắt (giá trị nhỏ nhất, tứ phân vị thứ nhất, trung vị, tứ phân vị thứ ba và giá trị lớn nhất), vốn yêu cầu giá trị số. Với dữ liệu phi số, các kỹ thuật trực quan hóa khác như biểu đồ cột hoặc biểu đồ tròn sẽ phù hợp hơn.

Làm sao diễn giải khi có nhiều ngoại lai trong một biểu đồ hộp?

Nhiều ngoại lai trong một biểu đồ hộp cho thấy có nhiều điểm dữ liệu khác biệt đáng kể so với phần còn lại của tập dữ liệu. Điều này có thể gợi ý sự biến thiên hoặc các quan sát bất thường cần được điều tra thêm. Ngoại lai có thể do lỗi thu thập dữ liệu, biến thiên tự nhiên, hoặc khác biệt đáng kể giữa các nhóm phụ trong dữ liệu.

Tôi có thể dùng biểu đồ hộp để so sánh phân phối dữ liệu giữa nhiều danh mục không?

Có, biểu đồ hộp rất phù hợp để so sánh phân phối giữa nhiều danh mục. Bạn có thể đặt các biểu đồ hộp cạnh nhau cho các danh mục khác nhau để so sánh trung vị, khoảng tứ phân vị và sự xuất hiện của ngoại lai. Điều này giúp xác định khác biệt và tương đồng trong phân phối của các nhóm.

Những sai lầm thường gặp nào cần tránh khi diễn giải biểu đồ hộp?

Khi diễn giải biểu đồ hộp, hãy tránh các sai lầm sau:

  • Bỏ qua ngữ cảnh của ngoại lai: Ngoại lai không phải lúc nào cũng là lỗi mà có thể là biến thiên có ý nghĩa.
  • Nhầm lẫn trung vị với trung bình: Trung vị là giá trị giữa, không phải giá trị trung bình, và ít bị ảnh hưởng bởi ngoại lai.
  • Xem nhẹ tầm quan trọng của kích thước mẫu: Mẫu nhỏ có thể dẫn đến biểu đồ hộp gây hiểu lầm. Hãy đảm bảo kích thước dữ liệu đủ lớn để diễn giải đáng tin cậy.
Làm thế nào để tạo biểu đồ hộp tương tác trong Python?

Để tạo biểu đồ hộp tương tác trong Python, bạn có thể dùng các thư viện như Plotly hoặc Bokeh. Các thư viện này cho phép bạn thêm tính tương tác vào trực quan hóa, chẳng hạn như tooltip, phóng to và kéo thả (pan).

Austin Chia

Tác giả

Austin Chia

Tôi là Austin, một blogger và cây bút công nghệ với nhiều năm kinh nghiệm làm nhà khoa học dữ liệu và nhà phân tích dữ liệu trong lĩnh vực chăm sóc sức khỏe. Khởi đầu hành trình công nghệ với nền tảng sinh học, tôi hiện hỗ trợ những người khác thực hiện chuyển đổi tương tự thông qua blog công nghệ của mình. Niềm đam mê công nghệ đã đưa tôi đến với việc cộng tác viết cho hàng chục công ty SaaS, truyền cảm hứng cho người khác và chia sẻ trải nghiệm của bản thân.

Chủ đề

Liên quan