Skip to main content

[Intermediate Python] - Matplotlib: Histogram

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:
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
Quan sát và cho nhận xét. trong phần này có sử dụng hàm plt.clf() dùng để clean up

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



Popular posts from this blog

[Intermediate Python] - Matplotlib: Customization

Tạo một biểu đồ là việc đơn giản, tuy nhiên tạo một biểu đồ đúng đưa ra một thông điệp rõ ràng, đó là một thách thức thực sự. Với mỗi thể hiện, ta có nhiều sự lựa chọn, trước tiên, có rất nhiều loại biểu đồ, mỗi loại biểu đồ, ta có vô hạn các thông số điều chỉnh, bạn có thể thay đổi màu sắc, hình dạng, nhãn, các trục và vân vân ...  Sự lựa chọn phụ thuộc 1 là vào dữ liệu, 2 là vào câu chuyện, ý nghĩa mà bạn muốn thể hiện từ dữ liệu đó. Bởi vì có rất nhiều tùy biến, cách tốt nhất là chúng ta phải học chúng từ các ví dụ. Hãy bắt đầu với đoạn code sau đây để tạo một biểu đồ đường thẳng. import matplotlib.pyplot as plt  year = [1950, 1951, 1952, ..., 2100]  pop = [2.538, 2.57, 2.62, ..., 10.85]  plt.plot(year, pop)  plt.show() Nó đơn giản là tạo một biểu đồ thẳng giống như các bài trước mà ta đã thực hành, nhưng bây giờ year và pop là những biến chứa nhiều dữ liệu hơn, nó bao gồm các dự án đến tận năm 2100 được dự báo bởi Liên hiệp quốc. Nếu chú...

[Intermediate Python] - Matplotlib: Basic plots with matplotlib

Trong bài này, bạn sẽ được học cách hình dung dữ liệu thực tế, cách lưu trữ dữ liệu trong các cấu trúc dữ liệu mới; khi đã thành thạo các cấu trúc điều khiển, bạn cần điều chỉnh các đoạn scripts và các thuật toán, chúng ta sẽ  kết thúc chương này với một bài tập nhỏ và chúng ta sẽ phải kết hợp mọi thứ đã  học để giải quyết bài toán.  LÝ THUYẾT Phần đầu tiên của chương là về cách hình dung dữ liệu (data visualization), nó rất quan trọng trong việc phân tích dữ liệu. Đầu tiên, bạn sẽ sử dụng nó để khám phá tập dữ liệu (dataset) để hiểu dữ liệu của bạn một cách rõ nhất, từ đó bạn mới có một cái nhìn sâu sắc về nó, và chia sẻ cái mà bạn đã nhận thức được từ dữ liệu với người khác   Ví dụ: ta nhìn vào biểu đồ xinh đẹp bên trên, nó được tạo bởi giáo sư người Thụy Sĩ Hans Rosling, giáo sư nói về sự phát triển dân số toàn cầu được xem hàng triệu lần và sắp xếp chúng tạo nên 1 biểu đồ, giáo sư đã để dữ liệu nói lên lịch sử của chính nó. Ở đây, chúng ta thấy ...