Chuyển đến nội dung chính
Trực quan hóa Dữ liệu

Python trung cấp cho Khoa học Dữ liệu: Matplotlib

Học cách trực quan hóa dữ liệu thực với các hàm của matplotlib.
Karlijn Willems's photo
Karlijn Willems
Đã cập nhật · 11 phút đọc

Khám phá cùng AI

ChatGPTClaudePerplexity

Tạo tài khoản miễn phí của bạn

Luyện tập và Lộ trình tiến trình của bạn.

Tiếp Tục Với Google
Bằng cách tiếp tục, bạn chấp nhận Điều khoản sử dụng, Chính sách bảo mật và việc dữ liệu của bạn được lưu trữ tại Hoa Kỳ.

Trích đoạn khóa học: Python trung cấp cho Khoa học Dữ liệu - Matplotlib

Dưới đây là trích đoạn—video và bản ghi—từ chương đầu tiên của khóa học Python trung cấp cho Khoa học Dữ liệu. Tại đây là toàn bộ chương, bao gồm các bài tập tương tác.

Biểu đồ cơ bản với matplotlib

Chào bạn, tôi là Filip, một nhà khoa học dữ liệu tại DataCamp. Trong khóa học Python trung cấp này, bạn sẽ tiếp tục nâng cao kỹ năng Python cho khoa học dữ liệu. Bạn sẽ học cách trực quan hóa dữ liệu và lưu trữ dữ liệu trong các cấu trúc dữ liệu mới. Trong quá trình đó, bạn sẽ thành thạo các cấu trúc điều khiển, cần thiết để tùy chỉnh luồng của script và thuật toán. Chúng ta sẽ kết thúc chương này bằng một nghiên cứu tình huống, nơi bạn kết hợp mọi thứ đã học để giải một bài toán thú vị.

Chương đầu tiên này nói về trực quan hóa dữ liệu, một phần rất quan trọng của phân tích dữ liệu. Trước hết, bạn sẽ sử dụng nó liên tục để khám phá tập dữ liệu của mình. Bạn càng hiểu dữ liệu, bạn càng rút ra được nhiều insight. Và khi đã tìm ra các insight đó, một lần nữa, bạn sẽ cần trực quan hóa để có thể chia sẻ những phát hiện quý giá của mình với người khác. Ví dụ, hãy xem biểu đồ đẹp mắt này.

Biểu đồ này do giáo sư người Thụy Điển Hans Rosling thực hiện. Các bài nói của ông về phát triển toàn cầu đã được xem hàng triệu lần. Điều khiến chúng cuốn hút là nhờ tạo ra những biểu đồ tuyệt đẹp, ông để dữ liệu tự kể câu chuyện của chính nó. Ở đây chúng ta thấy một biểu đồ bong bóng, mỗi bong bóng đại diện cho một quốc gia. Bong bóng càng lớn thì dân số quốc gia đó càng lớn, vì vậy hai bong bóng lớn nhất ở đây là Trung Quốc và Ấn Độ.

Có 2 trục. Trục ngang hiển thị GDP bình quân đầu người, tính bằng đô la Mỹ. Trục dọc hiển thị tuổi thọ trung bình. Rõ ràng là người dân sống lâu hơn ở những quốc gia có GDP bình quân đầu người cao hơn. Tuy vậy, vẫn có sự khác biệt rất lớn về tuổi thọ giữa các quốc gia có cùng mức thu nhập.

Tại sao tôi kể cho bạn tất cả những điều này? Bởi vì đến cuối chương này, bạn sẽ có thể tự xây dựng biểu đồ đẹp mắt đó.

Có nhiều gói trực quan hóa trong Python, nhưng “mẹ của các gói” là matplotlib. Bạn sẽ cần tiểu gói pyplot. Theo thông lệ, tiểu gói này được import với tên plt như thế này.

Ở ví dụ đầu tiên, hãy thử rút ra vài insight về sự biến đổi của dân số thế giới. Tôi có một danh sách các năm, year, và một danh sách dân số tương ứng, tính bằng tỷ người, pop. Ví dụ, vào năm 1970, có 3,7 tỷ người sống trên Trái Đất.

Để vẽ dữ liệu này dưới dạng biểu đồ đường, chúng ta gọi plt.plot() và dùng hai danh sách làm đối số. Đối số đầu tiên tương ứng với trục ngang, và đối số thứ hai tương ứng với trục dọc. Bạn có thể nghĩ rằng một biểu đồ sẽ hiện ra ngay bây giờ, nhưng Python khá “lười”. Nó sẽ đợi hàm show() để thực sự hiển thị biểu đồ. Lý do là vì bạn có thể muốn thêm vài thành phần nữa trước khi hiển thị, như tiêu đề và tùy chỉnh nhãn. Tôi sẽ nói thêm về điều đó sau. Hãy nhớ điều này: hàm plot() cho Python biết vẽ cái gì và vẽ như thế nào. show() mới là hàm hiển thị biểu đồ.

Khi xem biểu đồ, ta thấy các năm được hiển thị trên trục ngang, và dân số trên trục dọc. Có bốn điểm dữ liệu, và Python nối chúng bằng một đường. Năm 1950, dân số thế giới khoảng 2,5 tỷ người. Năm 2010, khoảng 7 tỷ. Vậy dân số thế giới gần như đã tăng gấp ba trong 60 năm—khá đáng lo. Nếu dân số cứ tiếp tục tăng như vậy thì sao? Thế giới có trở nên quá tải? Bạn sẽ khám phá trong phần bài tập.

Tôi sẽ giới thiệu bạn một loại biểu đồ khác: biểu đồ phân tán (scatter). Để tạo nó, ta có thể bắt đầu từ đoạn mã trước. Lần này, bạn đổi hàm plot sang scatter. Biểu đồ phân tán kết quả chỉ vẽ các điểm dữ liệu riêng lẻ; Python không nối các điểm bằng đường. Với nhiều ứng dụng, biểu đồ phân tán thường là lựa chọn tốt hơn biểu đồ đường, nên hãy nhớ kỹ hàm scatter này. Bạn cũng có thể nói đây là cách vẽ “trung thực” hơn, vì bạn thấy rõ biểu đồ chỉ dựa trên bốn điểm dữ liệu.

Bây giờ chúng ta đã nắm những điều cơ bản của matplotlib, đến lượt bạn tạo nên những biểu đồ thật ấn tượng!


# define a simple function
import matplotlib.pyplot as plt
year = [1950, 1970, 1990, 2010]
pop = [2.519, 3.692, 5.263, 6.972]
plt.plot(year, pop)
plt.show()

import matplotlib.pyplot as plt
year = [1950, 1970, 1990, 2010]
pop = [2.519, 3.692, 5.263, 6.972]
plt.scatter(year, pop)
plt.show()

Biểu đồ tần suất (Histogram)

Trong video này, tôi sẽ giới thiệu biểu đồ tần suất (histogram). Đây là một kiểu trực quan hóa rất hữu ích để khám phá dữ liệu. Nó giúp bạn hình dung phân phối của các biến. Để xem nó hoạt động ra sao, hãy tưởng tượng có 12 giá trị từ 0 đến 6. Tôi đã đặt chúng dọc theo một trục số ở đây. Để xây dựng histogram cho các giá trị này, bạn có thể chia trục thành các đoạn bằng nhau, gọi là “bin”. Giả sử bạn chọn 3 bin, mỗi bin có độ rộng 2. Tiếp theo, bạn đếm có bao nhiêu điểm dữ liệu nằm trong mỗi bin. Có 4 điểm ở bin đầu, 6 ở bin thứ hai và 2 ở bin thứ ba. Cuối cùng, bạn vẽ một cột cho mỗi bin. Chiều cao của cột tương ứng với số điểm dữ liệu rơi vào bin đó. Kết quả là một histogram, cho chúng ta cái nhìn tổng quan về cách 12 giá trị được phân bố. Phần lớn giá trị nằm ở giữa, nhưng có nhiều giá trị dưới 2 hơn là trên 4.

Tất nhiên, matplotlib cũng có thể vẽ histogram. Như trước, bạn nên bắt đầu bằng cách import gói pyplot bên trong matplotlib. Sau đó, bạn có thể dùng hàm hist(). Hãy mở tài liệu của nó. Có khá nhiều đối số bạn có thể chỉ định, nhưng hai đối số đầu tiên ở đây là quan trọng nhất. x nên là một danh sách các giá trị mà bạn muốn vẽ histogram. Bạn có thể dùng đối số thứ hai, bins, để cho Python biết cần chia dữ liệu thành bao nhiêu bin. Dựa trên con số này, hist() sẽ tự động tìm ranh giới phù hợp cho tất cả các bin, và tính xem mỗi bin có bao nhiêu giá trị. Nếu bạn không chỉ định đối số bins, mặc định sẽ là 10.

Vậy để tạo histogram như bạn vừa thấy, hãy bắt đầu bằng cách tạo một danh sách với 12 giá trị. Tiếp theo, bạn chỉ cần gọi hist() và truyền danh sách này làm đầu vào, khớp với đối số x. Tôi cũng chỉ định đối số bins là 3, để các giá trị được chia thành ba bin. Cuối cùng nếu bạn gọi hàm show, ta sẽ có một histogram đẹp mắt. Histogram thực sự hữu ích để đưa ra bức tranh tổng quát. Ví dụ, hãy xem kim tự tháp dân số này. Phân bố độ tuổi được hiển thị cho cả nam và nữ ở Liên minh châu Âu. Lưu ý rằng các histogram được xoay 90 độ; các bin giờ đây nằm ngang. Các bin lớn nhất là nhóm tuổi 40 đến 44, với 20 triệu nam và 20 triệu nữ. Họ là thế hệ “baby boomer”.

Đây là số liệu của năm 2010. Bạn nghĩ đến năm 2050 sẽ có gì thay đổi? Hãy xem nào. Phân phối phẳng hơn, và thế hệ bùng nổ dân số đã già đi. Chỉ trong chớp mắt, bạn có thể thấy dân số sẽ thay đổi như thế nào theo thời gian. Đó chính là sức mạnh thực sự của histogram! Bây giờ hãy chuyển sang phần bài tập để tự mình thử nghiệm với histogram!


values = [0,0.6,1.4,1.6,2.2,2.5,2.6,3.2,3.5,3.9,4.2,6]
import matplotlib.pyplot as plt
plt.hist(values,bins=3)
plt.show()

Tùy chỉnh

Tạo một biểu đồ là một chuyện. Làm đúng biểu đồ, truyền tải thông điệp thật rõ ràng, mới là thách thức thực sự. Với mỗi trực quan hóa, bạn có nhiều lựa chọn. Trước hết là các kiểu biểu đồ khác nhau. Và với mỗi biểu đồ, bạn có vô số cách tùy chỉnh. Bạn có thể thay đổi màu sắc, hình dạng, nhãn, trục, v.v. Lựa chọn phụ thuộc vào, một là dữ liệu, và hai là câu chuyện bạn muốn kể bằng dữ liệu đó. Vì có quá nhiều khả năng tùy chỉnh, cách học tốt nhất là qua ví dụ.

Hãy bắt đầu với đoạn mã trong script này để vẽ một biểu đồ đường đơn giản. Nó tương tự biểu đồ đường chúng ta tạo ở video đầu tiên, nhưng lần này danh sách year và pop chứa nhiều dữ liệu hơn, bao gồm cả dự báo đến năm 2100 do Liên Hợp Quốc đưa ra. Nếu chạy script này, ta đã có một biểu đồ khá đẹp: nó cho thấy đà bùng nổ dân số hiện nay sẽ chậm lại vào cuối thế kỷ.

Nhưng vẫn có vài điểm cần cải thiện. Thứ nhất, cần rõ ràng hơn dữ liệu nào đang được hiển thị, đặc biệt với người lần đầu thấy biểu đồ. Thứ hai, biểu đồ cần nhấn mạnh hơn đến sự bùng nổ dân số. Việc đầu tiên bạn luôn cần làm là gắn nhãn cho các trục. Hãy thêm các hàm xlabel() và ylabel() . Đầu vào là các chuỗi sẽ được đặt dọc theo các trục. Hãy đảm bảo gọi các hàm này trước khi gọi phương thức show(), nếu không các tùy chỉnh sẽ không hiển thị. Khi chạy lại script, lần này các trục đã có chú thích. Chúng ta cũng sẽ thêm tiêu đề cho biểu đồ với hàm title. Ta truyền tiêu đề thực tế, 'World Population Projections', làm đối số. Và đây là tiêu đề!

Vậy là, dùng xlabel, ylabel và title, ta có thể cung cấp cho người đọc nhiều thông tin hơn về dữ liệu trên biểu đồ: giờ họ ít nhất biết biểu đồ nói về điều gì. Để đặt tăng trưởng dân số vào bối cảnh, tôi muốn trục y bắt đầu từ 0. Bạn có thể làm điều này với hàm yticks(). Đầu vào đầu tiên là một danh sách, trong ví dụ này là các số từ 0 đến 10, cách nhau 2 đơn vị. Khi chạy, biểu đồ sẽ thay đổi: đường cong dịch lên. Giờ thì rõ rằng ngay từ năm 1950, đã có khoảng 2,5 tỷ người trên hành tinh này.

Tiếp theo, để làm rõ là đơn vị tính theo tỷ (billions), ta có thể thêm đối số thứ hai cho hàm yticks(), là một danh sách tên hiển thị cho các vạch chia. Danh sách này phải có cùng độ dài với danh sách thứ nhất. Vạch 0 có nhãn 0, vạch 2 có nhãn 2B, vạch 4 có nhãn 4B, v.v. Nhân tiện, B ở đây là Billions (tỷ). Nếu chạy phiên bản script này, các nhãn sẽ thay đổi tương ứng, rất ổn.

Cuối cùng, hãy thêm một chút dữ liệu lịch sử để nhấn mạnh sự bùng nổ dân số trong 60 năm qua. Trên Wikipedia, tôi tìm được dữ liệu dân số thế giới cho các năm 1800, 1850 và 1900. Tôi có thể viết chúng dưới dạng danh sách và nối vào danh sách pop và year bằng dấu cộng. Nếu chạy lại script một lần nữa, ba điểm dữ liệu sẽ được thêm vào biểu đồ, cho bức tranh đầy đủ hơn. Đó là cách bạn biến một biểu đồ đường trung bình thành một trực quan có câu chuyện rõ ràng để kể! Giờ đến lượt bạn. Hãy chuyển sang phần bài tập, dần dần tùy chỉnh biểu đồ phát triển thế giới và trở thành “Hans Rosling” tiếp theo!


import matplotlib.pyplot as plt
import pandas as pd
year = list(range(1950, 2101))
pop = [2.53,2.57,2.62,2.67,2.71,2.76,2.81,2.86,2.92,2.97,3.03,3.08,3.14,3.2,3.26,3.33,3.4,3.47,3.54,3.62,3.69,3.77,3.84,3.92,4.,4.07,4.15,4.22,4.3,4.37,4.45,4.53,4.61,4.69,4.78,4.86,4.95,5.05,5.14,5.23,5.32,5.41,5.49,5.58,5.66,5.74,5.82,5.9,5.98,6.05,6.13,6.2,6.28,6.36,6.44,6.51,6.59,6.67,6.75,6.83,6.92,7.,7.08,7.16,7.24,7.32,7.4,7.48,7.56,7.64,7.72,7.79,7.87,7.94,8.01,8.08,8.15,8.22,8.29,8.36,8.42,8.49,8.56,8.62,8.68,8.74,8.8,8.86,8.92,8.98,9.04,9.09,9.15,9.2,9.26,9.31,9.36,9.41,9.46,9.5,9.55,9.6,9.64,9.68,9.73,9.77,9.81,9.85,9.88,9.92,9.96,9.99,10.03,10.06,10.09,10.13,10.16,10.19,10.22,10.25,10.28,10.31,10.33,10.36,10.38,10.41,10.43,10.46,10.48,10.5,10.52,10.55,10.57,10.59,10.61,10.63,10.65,10.66,10.68,10.7,10.72,10.73,10.75,10.77,10.78,10.79,10.81,10.82,10.83,10.84,10.85]
pop = [1,1.262,1.650] + pop
year = [1800,1850,1900] + year
plt.plot(year, pop)
plt.xlabel('Year')
plt.ylabel('Population')
plt.title('World Population Projections')
plt.yticks([0,2,4,6,8,10],['0','2B','4B','6B','8B','10B'])
plt.show()
Chủ đề
Trực quan hóa Dữ liệu
Liên quan

blog

Claude Opus 4.6: Tính năng, Điểm chuẩn, Bài kiểm tra thực hành và hơn thế nữa

Mô hình mới nhất của Anthropic dẫn đầu ở mã hóa tác tử và lập luận phức tạp. Thêm vào đó, nó có cửa sổ ngữ cảnh 1M.
Matt Crabtree's photo

Matt Crabtree

10 phút

Xem thêm