Khóa học
Biểu đồ tần suất (histogram) là dạng đồ thị phổ biến hiển thị các điểm dữ liệu được tổ chức theo những khoảng giá trị xác định. Ta thường thấy chúng trong thống kê, dùng để biểu diễn số lượng của một loại biến cụ thể xuất hiện trong một khoảng giá trị nhất định. Ví dụ, thầy cô toán ngày xưa của bạn có thể đã dùng biểu đồ tần suất để trực quan hóa số điểm mà tất cả học sinh trong lớp đạt được.

Hình 1: Ví dụ về biểu đồ tần suất thể hiện phân bố điểm số của một lớp.
[Nguồn: Ví dụ Histogram với Matplotlib]
Các cột có chiều cao khác nhau của histogram trông giống biểu đồ cột, nhưng histogram dùng để trực quan hóa dữ liệu định lượng thay vì dữ liệu phân loại – vốn là trường hợp của biểu đồ cột.
Nhìn chung, dữ liệu số được trực quan hóa trong histogram là liên tục, nghĩa là có vô số giá trị. Cố gắng vẽ tất cả giá trị của biến liên tục thường không khả thi. Histogram khắc phục vấn đề này bằng cách nhóm nhiều điểm dữ liệu vào các khoảng giá trị hợp lý (gọi là bin) và cho phép chúng được trực quan hóa.
Trong hướng dẫn này, chúng ta sẽ tìm hiểu cách triển khai histogram trong Python bằng thư viện trực quan hóa dữ liệu Plotly. Chúng ta cũng sẽ đề cập đến các cách khác nhau để tùy chỉnh histogram Plotly và vì sao trực quan hóa dữ liệu lại quan trọng ngay từ đầu.
Xem sổ tay DataLab để làm theo phần mã trong bài hướng dẫn này.
Tầm quan trọng của trực quan hóa dữ liệu trong phân tích dữ liệu
Không doanh nghiệp nào có thể nói rằng họ sẽ không được lợi từ việc hiểu dữ liệu của mình tốt hơn. Vai trò của phân tích dữ liệu là giúp doanh nghiệp tối ưu hóa hiệu suất và cải thiện lợi nhuận; lĩnh vực này vươn tới mọi nơi có dữ liệu bởi vì hiểu biết sâu sắc (insight) thường được coi là lợi thế cạnh tranh.
Trực quan hóa dữ liệu là dạng biểu diễn đồ họa mà các nhà phân tích sử dụng để truyền đạt thông tin và dữ liệu. Mục đích là tóm tắt dữ liệu trong một định dạng dễ hiểu, làm nổi bật những bài học quan trọng rút ra từ dữ liệu cho người xem.
Nói cách khác, doanh nghiệp sử dụng trực quan hóa dữ liệu để nhanh chóng nhận diện xu hướng mà nếu không có hỗ trợ hình ảnh thì sẽ khó nhận ra. Biểu diễn đồ họa giúp truyền tải thông tin một cách phổ quát, nhanh chóng và hiệu quả.
Giới thiệu về Plotly
Plotly là một thư viện trực quan hóa dữ liệu tương tác, mã nguồn mở cho Python và R, được viết bằng JavaScript. Trong bài viết này, chúng ta sẽ tập trung vào Plotly Python, đôi khi được gọi là “plotly.py” để phân biệt với phiên bản JavaScript.
Mẹo: Học các khóa Nhập môn trực quan hóa dữ liệu với Plotly trong Python hoặc Trực quan hóa dữ liệu tương tác với Plotly trong R để nắm vững Plotly.
Nhiều người dùng Plotly thường nhận xét rằng ban đầu họ bị “cuốn hút” bởi tính thẩm mỹ hiện đại mà thư viện cho phép người kể chuyện triển khai khá dễ dàng. Plotly Python cho phép tạo các trực quan hóa web hấp dẫn, tương tác có thể:
- hiển thị trong sổ tay Jupyter,
- lưu thành tệp HTML độc lập,
- phục vụ như một phần của ứng dụng web thuần Python xây dựng bằng Dash.
Một điểm hấp dẫn khác của Plotly là dải biểu đồ phong phú. Thư viện hỗ trợ hơn 40 loại biểu đồ độc đáo cho nhiều trường hợp sử dụng, bao gồm thống kê, tài chính, địa lý, khoa học và biểu đồ 3 chiều.
Việc xuất trực quan hóa tạo bằng Plotly rất dễ dàng nhờ tích hợp sâu với Kaleido – tiện ích xuất ảnh. Cũng có hỗ trợ rộng cho bối cảnh ngoài web, bao gồm các trình soạn thảo desktop (ví dụ: Spyder, PyCharm, v.v.) và xuất tài liệu tĩnh (ví dụ: xuất sổ tay Jupyter sang PDF).
Cài đặt plotly.py khá đơn giản; có thể cài bằng pip:
pip install plotly>=5.11.0, <5.12.0
Hoặc dùng Conda:
conda install -c plotly plotly>=5.11.0, <5.12.0
Lưu ý: Khuyến nghị cài đặt thư viện trong môi trường ảo để giữ các phụ thuộc của những dự án khác nhau tách biệt. Bạn cũng có thể bắt đầu với sổ tay DataLab - một IDE Khoa học dữ liệu Python & R trên đám mây.
Sử dụng DataLab
DataLab là Môi trường Phát triển Tích hợp (IDE) trực tuyến cho phép người dùng viết mã, phân tích dữ liệu cá nhân hoặc theo nhóm, và chia sẻ insight dữ liệu. Nói cách khác, bạn có thể xem DataLab như một dạng Google Docs dành riêng cho khoa học dữ liệu; tìm hiểu thêm về cách hoạt động trong bài viết Sử dụng DataLab trong lớp học.
Với tác vụ này, chúng ta cần tạo một sổ tay từ một tập dữ liệu. May mắn là DataCamp cung cấp một kho dữ liệu phong phú và ngày càng tăng để phân tích. Khi chúng ta tạo sổ tay từ một tập dữ liệu, môi trường sẽ có sẵn toàn bộ dữ liệu cấu hình trước và mô tả ngắn gọn để bạn có thể bắt tay vào làm ngay từ đầu.
Các bước để tạo sổ tay bằng tập dữ liệu của DataCamp như sau:
- Từ ứng dụng DataLab, chọn "Datasets" trong thanh bên.
- Chọn một tập dữ liệu bạn quan tâm. Một hộp thoại sẽ hiển thị. Nó cung cấp xem trước tập dữ liệu đã chọn, bao gồm từ điển dữ liệu và liên kết nguồn tập dữ liệu, tùy chọn ngôn ngữ (Python hoặc R), và tổng quan về các ấn phẩm mà người dùng khác đã tạo với tập dữ liệu này.
- Chọn Create workbook.

Hình 2: GIF minh họa các bước tạo sổ tay từ một tập dữ liệu.
Lưu ý: Xem Tạo Plotly Histogram với dữ liệu Olympics để theo dõi đoạn mã.
Chúng ta sẽ sử dụng tập dữ liệu Olympics Data từ bộ sưu tập dữ liệu nội bộ của DataCamp. Theo mô tả, đây là tập dữ liệu lịch sử về Thế vận hội hiện đại, từ Athens 1896 đến Rio 2016. Mỗi hàng tương ứng với một vận động viên (271116 bản ghi) tham gia một nội dung thi Olympic và huy chương đạt được (nếu có).
Các cột bao gồm như sau:
|
Cột |
Giải thích |
|
id |
Mã duy nhất cho mỗi vận động viên |
|
name |
Tên vận động viên |
|
sex |
M hoặc F |
|
age |
Tuổi của vận động viên |
|
height |
Tính bằng xen-ti-mét |
|
weight |
Tính bằng ki-lô-gam |
|
team |
Tên đội |
|
noc |
Ủy ban Olympic Quốc gia (3 ký tự) |
|
games |
Năm và mùa |
|
year |
Số nguyên |
|
season |
Hè hoặc Đông |
|
city |
Thành phố đăng cai |
|
sport |
Môn thể thao |
|
event |
Nội dung thi |
|
medal |
Vàng, Bạc, Đồng hoặc NA |
Dựa trên hiểu biết hiện tại, các cột mà ta có thể kỳ vọng để xây dựng histogram là: age, height, weight và year. Lý do là histogram được tạo từ các giá trị số liên tục – chúng được dùng để biểu diễn phân bố dữ liệu số, trong đó dữ liệu được phân vào các bin và hiển thị số đếm cho mỗi bin.
Chúng ta sẽ dùng cột age để tạo histogram.
Tạo Plotly Histogram
Tạo một histogram trong Python với Plotly khá đơn giản; ta có thể dùng Plotly Express, là một giao diện cấp cao, dễ sử dụng…
import plotly.express as px
# Create a histogram
fig = px.histogram(olympic_data.age, x="age",
title="Distribution of Athletes age")
fig.show()
Hình 3: Một histogram được tạo bằng Plotly Express
Chúng ta cũng có tùy chọn dùng Graph Objects.
import plotly.graph_objects as go
fig = go.Figure(data=[go.Histogram(x=olympic_data.age)])
# add the title
fig.update_layout(title=dict(text="Distribution of Athletes age"))
fig.show()
Hình 4: Histogram tạo bằng Plotly Graph Objects.
Các hàm Plotly express bên trong sẽ gọi đến graph_objects và trả về một giá trị. Vì vậy, các hàm Plotly express hữu ích vì chúng cho phép người dùng vẽ trực quan hóa dữ liệu mà thường sẽ cần nhiều dòng mã hơn nếu vẽ bằng graph_objects.
“Mô-đun plotly.express (thường được import là px) chứa các hàm có thể tạo toàn bộ figure cùng lúc và được gọi là Plotly Express hoặc PX. Plotly Express là một phần tích hợp sẵn của thư viện Plotly và là điểm khởi đầu được khuyến nghị để tạo hầu hết các figure phổ biến. Mỗi hàm Plotly Express đều sử dụng graph objects bên trong và trả về một thể hiện plotly.graph_objects.Figure.”
Nguồn: Plotly Express trong Python.
Mặc dù Plotly express là điểm vào được khuyến nghị, chúng ta sẽ dùng graph_objects để tùy chỉnh giao diện của histogram vì nó linh hoạt hơn.
Tùy chỉnh giao diện của Plotly histogram
Hiện tại, histogram của chúng ta khá đơn điệu. Hãy làm cho nó sinh động hơn bằng cách thay đổi phông chữ cho tiêu đề và thêm nhãn trục.
# Create histogram
fig = go.Figure(data=[go.Histogram(x=olympic_data.age)])
fig.update_layout(
# Set the global font
font = {
"family":"Times new Roman",
"size":16
},
# Update title font
title = {
"text": "Distribution of Athletes age",
"y": 0.9, # Sets the y position with respect to `yref`
"x": 0.5, # Sets the x position of title with respect to `xref`
"xanchor":"center", # Sets the title's horizontal alignment with respect to its x position
"yanchor": "top", # Sets the title's vertical alignment with respect to its y position. "
"font": { # Only configures font for title
"family":"Arial",
"size":20,
"color": "red"
}
}
)
# Add X and Y labels
fig.update_xaxes(title_text="Age")
fig.update_yaxes(title_text="Number of Athletes")
# Display plot
fig.show()
Hình 5: Plotly histogram với tiêu đề được cập nhật và đã thêm nhãn trục.
Histogram của chúng ta trở nên nhiều thông tin hơn với những bổ sung này.
Tiếp theo, hãy thay đổi kích thước mỗi bin.
# Create histogram
fig = go.Figure(data = [
go.Histogram(
x = olympic_data.age,
xbins=go.histogram.XBins(size=5) # Change the bin size to 5
)
]
)
Hình 6: Plotly histogram với kích thước bin bằng 5.
Trong đoạn mã trên, chúng ta đặt tham số xbins trong thể hiện go.Histogram thành một thể hiện go.histogram.Xbins và xác định kích thước bin mong muốn như một tham số của thể hiện đó. Lưu ý rằng ta cũng có thể thực hiện bước này bằng một đối tượng dict với các thuộc tính tương thích.
Cuối cùng, hãy đổi màu các bin sang cam để trực quan hóa nổi bật hơn một chút.
# Create histogram
fig = go.Figure(data = [
go.Histogram(
x = olympic_data.age,
xbins=go.histogram.XBins(size=5), # Change the bin size
marker=go.histogram.Marker(color="orange") # Change the color
)
]
)
Hình 7: Plotly histogram với bin màu cam.
Ổn hơn nhiều.
Trong đoạn mã trên, chúng ta đặt tham số marker trong thể hiện go.Histogram thành một thể hiện go.histogram.Marker và xác định màu mong muốn như một tham số của thể hiện đó.
Tuy nhiên, còn rất nhiều tùy chỉnh khác có thể áp dụng cho Plotly histogram, chẳng hạn như thêm văn bản khi di chuột (hover).
Bật văn bản hover
Khi bạn di chuột qua một cột trong histogram hiện tại, văn bản chi tiết về ý nghĩa của từng cột sẽ hiển thị – xem Hình 8.

Hình 8: Văn bản hover hiện tại khi di chuột qua histogram của chúng ta.
Điều này chưa thật直 quan. Khi trực quan hóa dữ liệu, ta muốn biểu đồ có thể tự giải thích – kể cả ở mức văn bản hover. Do đó, hãy cập nhật thông tin hiển thị khi di chuột qua một bin.
# Create histogram
fig = go.Figure(data = [
go.Histogram(
x = olympic_data.age,
xbins=go.histogram.XBins(size=5), # Change the bin size
marker=go.histogram.Marker(color="orange"), # Change the color
hovertemplate="<br>".join([
"Age Range: %{x}",
"Number of Athletes: %{y}"]) # Make hover text more informative
)
]
)
Hình 9: Thông tin hover đã được cập nhật.
Văn bản hiển thị khi di chuột qua một bin giờ đã nhiều thông tin hơn, giúp trực quan hóa dễ diễn giải hơn. Chúng ta làm điều này bằng cách cập nhật tham số hovertemplate trong thể hiện go.Histogram.
Thêm tùy chọn lọc
Trước đó trong hướng dẫn, ta đã nói có thể xây dựng histogram cho các thuộc tính age, height, weight và year. Không cần tạo riêng từng histogram cho mỗi thuộc tính.
Thay vào đó, ta có thể tạo một histogram duy nhất và thêm các nút lọc cho phép bạn chuyển đổi thuộc tính hiển thị trên trực quan hóa.
Dưới đây là cách thực hiện trong mã.
"""
Starter code provided by vestland on StackOverflow
Link: https://bit.ly/3ipqOMo
"""
# continuous features
continuous_vars = ["age", "height", "weight", "year"]
# plotly
fig = go.Figure()
# set up ONE trace
fig.add_trace(
go.Histogram(x = olympic_data.age,
xbins=go.histogram.XBins(size=5), # Change the bin size
marker=go.histogram.Marker(color="orange"), # Change the color
)
)
buttons = []
# button with one option for each dataframe
for col in continuous_vars:
buttons.append(dict(method='restyle',
label=col,
visible=True,
args=[{"x":[olympic_data[col]],
"type":'histogram', [0]],
)
)
# some adjustments to the updatemenus
updatemenu = []
your_menu = dict()
updatemenu.append(your_menu)
updatemenu[0]['buttons'] = buttons
updatemenu[0]['direction'] = 'down'
updatemenu[0]['showactive'] = True
# add dropdown menus to the figure
fig.update_layout(showlegend=False, updatemenus=updatemenu)
fig.show()
Hình 10: Histogram với các bộ lọc cho phép người dùng chuyển đổi giữa nhiều thuộc tính trên một trực quan hóa duy nhất.
Vậy là xong; nhớ xem sổ tay Tạo Plotly Histogram với dữ liệu Olympics và thử nghiệm những gì chúng ta đã xây dựng trong hướng dẫn này.
Tổng kết
Bạn đã biết cách tạo histogram trong Plotly Python; trong hướng dẫn này, chúng ta đã đề cập:
- Histogram là gì và cách hoạt động
- Tầm quan trọng của trực quan hóa dữ liệu trong phân tích dữ liệu
- Cách bắt đầu với DataLab
- Cách tạo histogram trong Plotly
- Các cách khác nhau để tùy chỉnh histogram
- Cách áp dụng bộ lọc
Nếu bạn muốn tìm hiểu thêm về việc tạo histogram hoặc sử dụng Plotly, hãy xem các liên kết dưới đây: