Bài viết này giới thiệu về histogram, histogram là cách nhìn rất hữu ích để khám phá dữ liệu
LÝ THUYẾT
Hãy tưởng tượng có 12 giá trị giữa 0 và 6 và tôi đặt nó trên 1 đường thẳng, để xây dựng một biểu đồ histogram cho những giá trị này, tôi sẽ chia đường thẳng thành những đoạn bằng nhau, được gọi là những ngăn (bins). Giả sử bạn có 3 ngăn, mỗi ngăn có độ rộng là 2, tiếp theo bạn đếm xem có bao nhiêu điểm dữ liệu bên trong mỗi ngăn, ở đây ta có 4 điểm trong ngăn 1, 6 điểm trong ngăn 2 và 2 điểm trong ngăn 3, cuối cùng, ta sẽ vẽ 1 thanh biểu trưng cho mỗi ngăn, chiều cao của thanh tương ứng với số lượng điểm dữ liệu trong ngăn đó. Kết quả của biểu đồ cho ta một cái nhìn tổng quan về cách mà 12 giá trị được phân phối, một vài giá trị ở ngăn giữa, nhưng có nhiều giá trị nhỏ hơn 2 và lớn hơn 4.
Tất nhiên, matplotlib cũng có khả năng tạo biểu đồ histograms, như bài học trước thì ta cũng cần phải import gói pyplot bên trong matplotlib, tiếp theo ta có thể sử dụng hàm hist(), hãy gõ help(plt.hist) để xem các tham số trong hàm hist().
In [1]: help(plt.hist)
Help on function hist in module matplotlib.pyplot:
Help on function hist in module matplotlib.pyplot:
hist(x, bins=10, range=None, normed=False, weights=None,
cumulative=False, bottom=None, histtype='bar', align='mid',
orientation='vertical', rwidth=None, log=False, color=None, label=None,
stacked=False, hold=None, data=None, **kwargs)
Plot a histogram.
Compute and draw
the histogram of *x*. The return value is a tuple (*n*, *bins*, *patches*) or
([*n0*, *n1*, ...], *bins*, [*patches0*, *patches1*,...]) if the input contains
multiple data.
Multiple data can
be provided via *x* as a list of datasets of potentially different length ([*x0*, *x1*, ...]), or
as a 2-D ndarray in which each column is
a dataset. Note that the ndarray form is
transposed relative to the list form.
Có rất nhiều tham số trong hàm hist() này nhưng có 2 tham số đầu tiên rất quan trọng: x - sẽ là danh sách các giá trị mà bạn muốn tạo histogram, tham số thứ 2 - các ngăn (bins) - để cho Python biết bao nhiêu ngăn mà dữ liệu sẽ được chia ra. Dựa trên số lượng này, hist() sẽ tự động tìm ra ranh giới thích hợp cho các ngăn và tính toán có bao nhiêu giá trị tương ứng với ngăn đó; nếu ta không đặc tả tham số này thì mặc định nó là 10.
Như biểu đồ histogram mà ta đã xem qua phía trên, chúng ta bắt đầu tạo bằng danh sách với 12 giá trị, sau đó, chỉ đơn giản là gọi hàm hist() và truyền biến chứa danh sách vào tương ứng với giá trị x, tôi chọn tham số bins =3 tức là chia các giá trị thành 3 ngăn, cuối cùng ta sẽ gọi hàm show() để hiển thị histogram
In [3]: values = [0, 0.6, 1.4, 1.6, 2.2, 2.5, 2.6, 3.2, 3.5, 3.9, 4.2, 6]
In [4]: plt.hist(values, bins =3)
In [5]: plt.show()
Histogram rất hữu ích khi dữ liệu lớn, ví dụ với dữ liệu dân số ta sẽ có được một tháp dân số như hình sau:
Sự phân bố dân số theo độ tuổi được thể hiện rõ ràng cho cả nam và nữ, trong hình trên histogram được xoay 90 độ và các ngăn (bins) được thể hiện dọc, ở độ tuổi 40-44 dân số đông nhất, có 20 triệu nam và 20 triệu nữ, nó được gọi là baby boomers. Đây là tháp dân số của năm 2010, bạn nghĩ năm 2050 sẽ thay đổi thế nào? Hãy nhìn hình bên dưới
Ta thấy tháp dân số đã được nâng lên, và giai đoạn baby booms cũng đã trở nên già hơn. So sánh 2 biểu đồ ta dễ dàng thấy thấy được sự thay đổi dân số theo thời gian, đó chính là sức mạnh của histogram đấy
BÀI TẬP
Bài 1: Build a histogram (1)
Danh sách life_app chứa dữ liệu tuổi thọ của các nước khác nhau trong năm 2007. Để biết được sự phân phối dân số ở các nước khác nhau như thế nào, hãy vẽ histogram để thể hiện điều đó.
Sử dụng plt.hist() để tạo, không đặc tả tham số bins và lấy giá trị mặc định là 10
Trình bày histogram bằng hàm show().
Bài 2: Build a histogram (2)
Trong bài trước, ta không đặc tả tham số bins, mặc định Python sẽ đặt giá trị là 10. Giá trị của tham số bins cực kỳ quan trọng, nếu số bins quá lớn tức sự phân chia là ít nhóm nó sẽ đơn giản hóa số liệu và bạn sẽ không thấy dữ liệu một cách chi tiết; ngược lại, nếu số bins quá nhỏ, tức là sự phân chia quá chi tiết và sự thể hiện của dữ liệu sẽ trở nên vụn vặt, manh mún; do đó bạn cần phải điều chỉnh chỉ số bins cho phù hợp.
- Tạo một histogram lấy dữ liệu từ biến life_exp có sẵn, chia thành 5 bins
- Tạo một histogram lấy dữ liệu từ biến life_exp có sẵn, chia thành 20 bins
Bài 3: Build a histogram (3) compare
Trong phần lý thuyết, chúng ta có được tháp dân số của hiện tại và tương lai, bằng cách sử dụng histogram mà ta có được sự so sánh một cách dễ dàng. Bây giờ, bài tập tương tự là với biến life_exp chứa thông tin tuổi thọ của các nước khác nhau trong năm 2007, và biến life_exp1950 chứa dữ liệu của năm 1950.
- Tạo một histogram lấy dữ liệu từ biến life_exp có sẵn, chia thành 15 bins
- Tạo một histogram lấy dữ liệu từ biến life_exp1950 có sẵn, chia thành 20 bins
Có gì khác nhau giữa 2 biểu đồ đó? Cho nhận xét
Bài 4: Choose the right plot (1)
Bạn là giáo sư giảng dạy Khoa học Dữ liệu bằng Python và bạn muốn đánh giá trực quan nếu các điểm trong bài kiểm tra của bạn theo sau một phân bố cụ thể. Bạn sử dụng biểu đồ nào?
A) Line plot - Biểu đồ đường thẳng
B) Scatter plot - Biểu đồ phân tán
C) Histogram
Bài 5: Choose the right plot (2)
Bạn là giáo sư giảng dạy Khoa học Dữ liệu bằng Python và bạn muốn đánh giá sự trực quan giữa điểm số cao hơn tương ứng với độ dài câu hỏi dài hơn. Bạn sử dụng biểu đồ nào?
A) Line plot - Biểu đồ đường thẳng
B) Scatter plot - Biểu đồ phân tán
C) Histogram
BÀI GIẢI
Bài 1: Build a histogram (1)
# Create histogram of life_exp data
plt.hist(life_exp)
# Display histogram
plt.show()
Bài 2: Build a histogram (2)
# Build histogram with 5 bins
plt.hist(life_exp,bins = 5)
# Show and clean up plot
plt.show()
plt.clf()
# Build histogram with 20 bins
plt.hist(life_exp,bins = 20)
# Show and clean up plot
plt.show()
plt.clf()
Bài 3: Build a histogram (3) compare
# Histogram of life_exp, 15 bins
plt.hist(life_exp, bins = 15)
# Show and clear plot
plt.show()
plt.clf()
# Histogram of life_exp1950, 15 bins
plt.hist(life_exp1950, bins = 15)
# Show and clear plot again
plt.show()
plt.clf()
Bài 4: Choose the right plot (1)
Đáp án C vì Histogram sẽ thể hiện được ở từng thang điểm có bao nhiêu học sinh đạt số điểm đó.
Bài 5: Choose the right plot (2)
Đáp án B vì Scatter có 2 trục và mỗi điểm dữ liệu sẽ thể hiện được mối tương quan giữa 2 yếu tố đề bài đưa ra