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 một biểu đồ với nhiều vòng tròn, mỗi 1 vòng tròn thể hiện một quốc gia, đường kính của vòng tròn tương ứng với dân số của quốc gia đó, nhìn biểu đồ, ta dễ dàng thấy 2 vòng tròn lớn nhất đó là Trung Quốc và Ấn Độ. Có 2 trục, trục ngang thể hiện GDP bình quân đầu người tính trên USD, trục dọc thể hiện tuổi thọ, rõ ràng, ta thấy người dân sống thọ hơn ở các nước có GDP bình quân đầu người cao hơn. Vậy, có một sự khác biệt lớn giữa tuổi thọ giữa các nước có cùng mức thu nhập. Tôi nói với bạn những thứ trên để làm gì? Bởi vì, cuối chương này, chúng ta cũng sẽ tự xây dựng một biểu đồ tuyệt đẹp như vậy :)
Có rất nhiều package mô hình hóa dữ liệu trong Python, nhưng nổi trội hơn cả chính là Matplotlib. Chúng ta sẽ cần đến package con của Matplotlib là pyplot, package này được import vào như một biến tên là plt
In [1]: import matplotlib.pyplot as plt
|
Trong ví dụ đầu tiên, chúng ra sẽ cố gắng đạt được một số hiểu biết sâu sắc về sự tiến hóa của dân số thế giới. Ta có một danh sách các năm trong biến year và danh sách dân số tương ứng (đơn vị tính là tỉ người), và danh sách pop
In [2]: year = [1950, 1970, 1990, 2010]
In [3]: pop = [2.519, 3.692, 5.263, 6.972] |
Năm 1970 có 3.7 tỉ người sống trên hành tinh này. Để mô hình hóa dữ liệu này như là một biểu đồ đường thẳng, chúng ta gọi hàm plot() và truyền vào 2 tham số là year và pop: tham số thứ nhất tương ứng với trục ngang, còn tham số thứ 2 tương ứng với trục dọc
In [4]: plt.plot(year, pop)
|
Bạn có thể nghĩ là biểu đồ sẽ hiển thị lên ngay bây giờ, nhưng không Python khá là lười biếng, nó đợi đến khi ta gọi hàm show() thì lúc đó biểu đồ mới hiển thị.
In [5]: plt.show()
|
Bởi vì bạn có thể muốn thêm 1 vài thành phần vào biểu đồ trước khi hiển thị nó, chẳng hạn như tựa, nhãn,... Chúng ta sẽ bàn đến vấn đề này sau, giờ chỉ nên nhớ rằng: hàm plot() nói với Python rằng trình bày cái gì và trình bày như thế nào, hàm show() hiển thị biểu đồ. Khi nhìn vào biểu đồ, chúng ta thấy rằng các năm được đánh số trên trục ngang, còn dân số được đánh số trên trục đứng, có 4 điểm dữ liệu và Python đã vẽ một đường thẳng để nối chúng lại.
Năm 1950, dân số thế giới ở khoảng 2.5 tỉ người, nhưng năm 2010 vào khoảng 7 tỉ người, ta thấy dân số thế giới tăng gấp 3 lần trong vòng 60 năm, nó thật sự đáng sợ. Chuyện gì sẽ xảy ra nếu cứ tiếp tục tăng trưởng như vậy?? Chúng ta sẽ tìm được câu trả lời trong phần bài tập.
Tôi đã trình bày xong phần giới thiệu cơ bản về một kiểu khác của biểu đồ: đó là biểu đồ phân tán (scatter plot). Để tạo ra biểu đồ này, chúng ta thay hàm plot() thành hàm scatter, kết quả của biểu đồ scatter là những điểm dữ liệu độc lập và Python không nối các điểm này với nhau bằng đường thẳng như trước đó nữa.
In [4]: plt.scatter(year, pop)
|
Trong một vài ứng dụng, biểu đồ phân tán thường là lựa chọn tốt hơn so với biểu đồ đường thẳng, do đó nên nhớ đến hàm scatter() nhé!
BÀI TẬP
Bài 1: Line plot (1)
Với matplotlib, bạn có thể tạo một nhóm các biểu đồ khác nhau trong Python, biểu đồ cơ bản nhất là biểu đồ đường thẳng (line plot). Công thức được cho ở đây
import matplotlib.pyplot as plt
plt.plot(x,y)
plt.show()
Trong phần lý thuyết ta thấy sự tăng dân số nhanh đến mức nào trong những năm qua. Liệu chúng có tiếp tục tăng như thế nữa không? Ngân hàng thể giới ước lượng dân số thể giới cho những năm 1950 đến 2100. Các năm được cho vào 1 biến danh sách year, và tương ứng với biến danh sách pop chỉ số dân. Bạn thực hiện các lệnh theo yêu cầu sau:
- Hiển thị phần tử cuối cùng ở biến year và pop để thấy được dự đoán dân số năm 2100. Sử dụng hàm print()
- Trước khi bắt đầu. bạn nên import matplotlib.pyplot thành plt. pyplot là một packet con của matplotlib nên phải theo sau dấu chấm (.)
- Sử dụng plt.plot() để xây dựng biểu đồ đường thẳng, year tương ứng với trục ngang, pop tương ứng với trục đứng. Đừng quên sử dụng hàm show() để hiện ra biểu đồ nhé!
Bài 2: Line plot (2)
Với một biểu đồ tương đối giống với cái mà ta đã vẽ trong bài tập 1, nó được trình bày trong hình dưới. Nhìn vào biểu đồ và cho biết năm nào mà dân số thế giới xấp xỉ 10 tỉ người?
A - 2040
B - 2060
C - 2085
D - 2095
Bài 3: Line plot (3)
Bây giờ ta sẽ xây dựng một biểu đồ thẳng đầu tiên, hãy bắt đầu với dữ liệu của giáo sư Hans Rosling được thu thập năm 2007. Có 2 danh sách có sẵn cho chúng ta:
- life_exp: nó chứa tuổi thọ của mỗi quốc gia
- gdp_cap: chứa GDP bình quân đầu người tính bằng USD
GDP là chữ viết tắt của Gross Domestic Product nó thể hiện quy mô nền kinh tế của một quốc gia, nếu ta chia cho số dân thì ta sẽ có được GDP bình quân đầu người. Bây giờ hãy thực hiện các yêu cầu sau:
- In ra giá trị cuối cùng của 2 danh sách gdp_cap và life_exp >> đó là dữ liệu của Zimbabwe.
- Xây dựng một biểu đồ thẳng với gdp_cap là trục ngang, life_exp là cột đứng.
- Đừng quên hoàn thành bằng câu lệnh plt.show() để hiển thị biểu đồ ra màn hình.
Bài 4: Scatter Plot (1)
Khi ta có thời gian để xem các giá trị trên trục ngang thì biểu đồ đường thẳng phù hợp, nhưng trong một số trường hợp, khi ta cố gắng đánh giá sự tương quan giữa 2 biến thì biểu đồ phân tán (scatter plot) sẽ hữu dụng hơn. Dưới đây là ví dụ làm sao để tạo 1 biểu đồ scatter
import matplotlib.pyplot as pltplt.scatter(x,y)
plt.show()
Hãy tiếp tục với dữ liệu có sẵn là gdp_cap và life_exp ở trong phần bài trước và thực hiện các yêu cầu sau:
- Thay đổi dòng lệnh có sẵn để được 1 biểu đồ scatter
- plt.plot(gdp_cap, life_exp)
- Thêm vào dòng plt.xscale('log') để thấy được sự quan giữa GDP bình quân đầu người trên quy mô logic.
- Hoàn thành bằng câu lệnh plt.show() để hiển thị biểu đồ ra màn hình
Bài 5: Scatter Plot (2)
Trong bài tập trước, bạn thấy rằng GDP thường tương ứng với tuổi thọ cao, nói cách khác, nó có sự tương quan với nhau. Bạn có nghĩ rằng có mối liên hệ giữa dân số và tuổi thọ trong một đất nước? biến danh sách life_exp ở bài tập trước đã có sẵn, biến pop cũng có sẵn, nó liệt kê dân số ở các nước năm 2007 (đơn vị tính là triệu người). bây giờ bạn thực hiện các yêu cầu sau:
- Bắt đầu với scratch bằng cách import thư viện
matplotlib.pyplot as plt
- Tạo một biểu đồ scatter, pop tương ứng với cột ngang, life_exp tương ứng cột dọc
- Cuối cùng hiển thị biểu đồ bằng hàm show()
BÀI GIẢI
Bài 1: Line plot (1)
# Print the last item from year and pop
print(year[-1])
print(pop[-1])
# Import matplotlib.pyplot as plt
import matplotlib.pyplot as plt
# Make a line plot: year on the x-axis, pop on the y-axis
plt.plot(year, pop)
# Display the plot with plt.show()
plt.show()
Bài 2: Line plot (2)
Đáp án: B
Bài 3: Line plot (3)
# Print the last item of gdp_cap and life_exp
print(gdp_cap[-1])
print(life_exp[-1])
# Make a line plot, gdp_cap on the x-axis, life_exp on the y-axis
plt.plot(gdp_cap,life_exp)
# Display the plot
plt.show()
Bài 4: Scatter (1)
# Change the line plot below to a scatter plot
plt.scatter(gdp_cap, life_exp)
# Put the x-axis on a logarithmic scale
plt.xscale('log')
# Show plot
plt.show()
Bài 5: Scatter (2)
# Import package
import matplotlib.pyplot as plt
# Build Scatter plot
plt.scatter(pop, life_exp)
# Show plot
plt.show()