Khi làm việc với dữ liệu bảng chúng ta thường xuyên phải thống kê dữ liệu theo các nhóm để bắt dữ liệu tạo ra những thông tin insight hữu ích cho phân tích và ra quyết định. Ngoài ra những feature tốt, có sức mạnh phân loại và dự báo cao có thể được tạo thành từ việc thống kê dữ liệu theo nhóm. Quá trình thống kê và phân tích dữ liệu mặc dù tốn kém về mặt thời gian nhưng lại rất quan trọng đối với mô hình. Vì vậy chúng ta cần thực hiện chúng kỹ lưỡng và cần kết hợp giữa kỹ năng thống kê và kinh nghiệm thực tiễn.
Ở mục 5 này chúng ta sẽ làm quen với hai câu lệnh kinh điển trong pandas được sử dụng nhiều trong thống kê theo nhóm trên pandas đó là
tax_labels low 15221 normal 73540 high 117807 Name: tax, dtype: int641 và
tax_labels low 15221 normal 73540 high 117807 Name: tax, dtype: int642.
2.4.1. df.groupby[]
groupby là câu lệnh cho phép bạn áp dụng những hàm số trên measurements dựa trên việc phân nhóm dữ liệu theo các dimensions.
Nếu bạn chưa hiểu về khái niệm measurement và dimension thì mình có thể giải thích đơn giản là: measurement là những biến có thể cộng trừ nhân chia và đo đếm được còn dimension là những biến dùng để phân nhóm dữ liệu. Ví dụ chiều cao là một measurement có thể đo theo dimension là giới tính gồm các nhóm nam/nữ.
Cú pháp của hàm
tax_labels low 15221 normal 73540 high 117807 Name: tax, dtype: int641 khá đơn giản:
Chúng ta cần xác định các chiều dimension trong
tax_labels low 15221 normal 73540 high 117807 Name: tax, dtype: int644. Phía sau
tax_labels low 15221 normal 73540 high 117807 Name: tax, dtype: int645 là một list các measurements mà ta cần áp dụng hàm lên trên những trường này.
df.groupby['tax_labels']['tax'].sum[]
tax_labels low 15221 normal 73540 high 117807 Name: tax, dtype: int64
Theo cách trên thì ta chỉ áp dụng được với những hàm tính toán như
tax_labels low 15221 normal 73540 high 117807 Name: tax, dtype: int646 có sẵn trong dataframe. Nếu muốn sử dụng
tax_labels low 15221 normal 73540 high 117807 Name: tax, dtype: int645 cho mọi biến đổi hàm chúng ta có thể dùng hàm
tax_labels low 15221 normal 73540 high 117807 Name: tax, dtype: int648 trong
tax_labels low 15221 normal 73540 high 117807 Name: tax, dtype: int649.
df.groupby['tax_labels']['tax'].apply[lambda x: sum[x]]
tax_labels low 15221 normal 73540 high 117807 Name: tax, dtype: int64
Nếu muốn áp dụng tính toán cho nhiều measurements một lúc thì truyền vào một list các measurements. Chẳng hạn bên dưới ta truyền vào một list gồm
df.groupby['tax_labels']['tax'].apply[lambda x: sum[x]]0
import numpy as np df.groupby['tax_labels'][['tax', 'rm']].apply[lambda x: np.mean[x]]
taxrmtax_labelslow220.594206.52564normal310.295366.42074high589.035006.04020
Chúng ta cũng có thể tự định nghĩa các hàm được tuỳ biến theo ý muốn:
# Tính quantile 90% của mỗi nhóm tax_labels. def quantile[x]: q_90 = np.quantile[x, 0.9] return q_90 df.groupby['tax_labels']['tax'].apply[lambda x: quantile[x]]
tax_labels low 244.2 normal 384.0 high 666.0 Name: tax, dtype: float64
Hoặc group theo nhiều chiều dữ liệu. Khi đó phải truyền vào
tax_labels low 15221 normal 73540 high 117807 Name: tax, dtype: int645 một list các dimension.
df.groupby[['tax_labels', 'chas']]['tax'].apply[lambda x: quantile[x]]
tax_labels chas low 0 244.6 1 223.0 normal 0 384.0 1 307.0 high 0 666.0 1 666.0 Name: tax, dtype: float64
Ưu điểm của
tax_labels low 15221 normal 73540 high 117807 Name: tax, dtype: int645 đó là nhanh gọn, dễ hiểu. Nhưng nhược điểm của
tax_labels low 15221 normal 73540 high 117807 Name: tax, dtype: int645 đó là chúng ta chỉ có thể áp dụng cùng một biến đổi hàm số cho mọi measurements. Ở
df.groupby['tax_labels']['tax'].apply[lambda x: sum[x]]4 bạn có thể tuỳ biến sâu hơn từng hàm đối với từng measurement nhưng cú pháp sẽ phức tạp hơn một chút.
2.4.2. Pivotable
Pivot table là một công thức có ứng dụng rất quan trọng trong pandas. Nó giúp cho chúng ta thực hiện các thống kê trên các biến measurement theo các chiều dimension.
Bạn sẽ hình dung ra cách áp dụng của
df.groupby['tax_labels']['tax'].apply[lambda x: sum[x]]5 thông qua ví dụ bên dưới.
import numpy as np pd.pivot_table[df, columns = ['tax_labels', 'chas'], index = ['rad'], values = 'tax', aggfunc = np.sum]
tax_labelslownormalhighchas010101rad1241198496804220218000445600036424446120801273042155020434214712222052853216221758289269282160058070388807888042870008005695153500240000825845328
Bạn hình dung ra nội dung của bảng thống kê trên chứ?
Bảng thống kê trên sẽ tính tổng số thuế thu được phân theo các cột là
df.groupby['tax_labels']['tax'].apply[lambda x: sum[x]]6 và
df.groupby['tax_labels']['tax'].apply[lambda x: sum[x]]7 [tax_labels gồm low, normal và high và chas gồm 0-không bao bởi sông, 1-bao bởi sông].
Các dòng lại được phân nhóm theo chỉ số mức độ tiếp cận đường cao tốc
df.groupby['tax_labels']['tax'].apply[lambda x: sum[x]]8 gồm các giá trị
df.groupby['tax_labels']['tax'].apply[lambda x: sum[x]]9.
Như vậy ta có thể hình dung được trong công thức của pivot_table, các đối số của nó có ý nghĩa như sau:
tax_labels low 15221 normal 73540 high 117807 Name: tax, dtype: int64
0: List các dimensions của cột mà chúng ta cần thống kê.tax_labels low 15221 normal 73540 high 117807 Name: tax, dtype: int64
1: List các dimensions theo dòng mà chúng ta cần thống kê.tax_labels low 15221 normal 73540 high 117807 Name: tax, dtype: int64
2: List các measurement chúng ta sử dụng để tính toán.tax_labels low 15221 normal 73540 high 117807 Name: tax, dtype: int64
3: Qui định hàm số chúng ta sẽ dùng để biến đổi measurement. Trong ví dụ này chúng ta áp dụng hàm np.sum cho toán bộ các measurement.
Làm sao để qui định mỗi measurement một công thức?
Giả sử chúng ta cần tính thêm trung bình số phòng trên căn hộ. Tức là thêm trung bình của trường
tax_labels low 15221 normal 73540 high 117807 Name: tax, dtype: int644 trong khi vẫn cần tính tổng của trường
tax_labels low 15221 normal 73540 high 117807 Name: tax, dtype: int645. Khi đó cần khai báo
tax_labels low 15221 normal 73540 high 117807 Name: tax, dtype: int643 dưới dạng một dictionary có key là tên của measurement và value là công thức của measurement.
tax_labels low 15221 normal 73540 high 117807 Name: tax, dtype: int640
rmtaxtax_labelslownormalhighlownormalhighchas010101010101rad16.230007.92306.49553NaN6.54000NaN24119849680422026.08611NaN6.98827NaNNaNNaN18000445600036.442596.80556.38275NaN6.66600NaN6424446120801273046.79033NaN6.102016.178755.96652NaN2155020434214712222056.462777.64506.509226.070675.982176.44614285321622175828926928216NaNNaN6.11888NaN6.07800NaN00580703888077.03025NaN6.53008NaNNaNNaN888042870008NaNNaN7.024636.67020NaNNaN00569515350024NaNNaNNaNNaN5.984146.611370000825845328
Bảng của chúng ta đã tăng gấp đôi số cột. Dòng đầu tiên của bảng là
tax_labels low 15221 normal 73540 high 117807 Name: tax, dtype: int644,
tax_labels low 15221 normal 73540 high 117807 Name: tax, dtype: int645 là những thông tin ứng với từng measurement.