20. Sử dụng Seaborn để vẽ các biểu đồ thống kê ( Phần 2 linear relationships)

Nhiều bộ dữ liệu chứa nhiều biến định lượng(quantitative variable), và mục tiêu của một phân tích thường liên quan đến các biến đó với nhau. Trong bài trước, chúng tôi đã thảo luận các phương thức trong seaborn có thể thực hiện việc này bằng cách vẽ ra sự phân bố chung của hai biến. Tuy nhiên, có thể sẽ rất hữu ích khi sử dụng các mô hình thống kê để ước lượng mối quan hệ đơn giản giữa hai biến trong tập dữ liệu. Các phương thức thảo luận trong chương này sẽ làm việc này thông qua linear regression framework.

Các regression trong seaborn chủ yếu là để thêm một biểu diễn trực quan giúp nhấn mạnh các mẫu trong một tập dữ liệu trong quá trình phân tích dữ liệu. Seaborn vốn không phải là một gói phần mềm cho các phân tích thống kê, để có được các biện pháp định lượng liên quan đến sự phù hợp của mô hình regression, bạn nên sử dụng các mô hình thống kê. Tuy nhiên, mục đích của seaborn là khám phá bộ dữ liệu thông qua hình ảnh hóa một cách nhanh chóng và dễ dàng, thay vì khám phá một tập dữ liệu thông qua các bảng thống kê.

Để thuận tiện cho bài, trước hết ta sẽ import đủ các gói sau:

import numpy as np

import pandas as pd

import matplotlib as mpl

import matplotlib.pyplot as plt

import seaborn as sns

sns.set(color_codes=True)

np.random.seed(sum(map(ord, "regression")))

Các phương thức vẽ regression models

Hai phương thức chính trong Seaborn được sử dụng để biểu diễn một mối quan hệ tuyến tính được xác định thông qua regression model. Hai hàm regplot(), lmplot() liên hệ chặt chẽ với nhau, và cùng chia sẻ tính năng cốt lõi. Trong đó lmplot() là sự kết hợp của regplot() và lớp FacetGrid. Một trong những sự khác nhau giữa regplot() và lmplot() là ở dữ liệu truyền vào, hai biến đầu vào x và y. Với regplot() có thể chấp nhận với nhiều định dạng từ dataframe, serial đến string xác định. Trong khi lmplot() chỉ chấp nhận dữ liệu từ string.

Trong lời gọi đơn giản, cả hai chức năng vẽ một scatterplot của hai biến, x và y, và sau đó sử dụng regression model để vẽ mối quan hệ giữa y và x thỏa mãn khoảng tin cậy 95% cho regression đó:

Ví dụ dùng regplot()

sns.regplot(x="total_bill", y="tip", data=tips);

plt.show()

Ví dụ dùng lmplot()

sns.lmplot(x="total_bill", y="tip", data=tips);

plt.show()

Các phương thức regplot(), lmplot() có các tham số khác giúp ta có thể hiệu chỉnh và lựa chọn các bộ thông số cho regression, ví dụ:
            jitter để khiến cho dữ liệu rõ ràng hơn khi chúng chồng lấn lên nhau.
            x_estimator=np.mean để ước lượng xu hướng trung tâm với một khoảng tin cậy.
            order để định nghĩa bậc regression model, thay vì dùng mô hình mặc định đơn giản là đường tuyến tính trong ví dụ trước.
            
Ta sẽ cùng phân tích bộ dữ liệu Anscombe’s quartet sau:
Các cột là: dataset, x, y
Load dữ liệu:
anscombe = sns.load_dataset("anscombe")
 Kết quả của mô hình đơn giản:
sns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'I'"),ci=None, scatter_kws={"s": 80});

plt.show()

Khi ta thay đổi bậc của regression model

sns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'I'"),order = 5,ci=None, scatter_kws={"s": 80});

plt.show()

Ví dụ sau sẽ thấy được ảnh hưởng của “outlier” trong quá trình fitting một model. (Hình màu đỏ)

sns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'III'"),ci=None, scatter_kws={"s": 80,"color": 'red'},line_kws={'color': 'red'});
plt.show()
Nó có thể hữu ích để fit với một hồi quy mạnh mẽ (robust regression), sử dụng một lost function khác để giảm ảnh hưởng của các “ouliers”. (Hình màu xanh)
sns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'III'"),robust=True, ci=None, scatter_kws={"s": 80});

plt.show()

Khi biến y là một số nhị phân ta có thể sử dụng “logistic=True” để fit một logistic regression.

Ví dụ. Sử dụng bộ dữ liệu “tips”.

tips = sns.load_dataset("tips")

tips["big_tip"] = (tips.tip / tips.total_bill) > .15

sns.lmplot(x="total_bill", y="big_tip", data=tips,y_jitter=.03);

sns.lmplot(x="total_bill", y="big_tip", data=tips,y_jitter=.03,logistic=True);

plt.show()

Một cách tiếp cận khác để fit một nonparametric regression là sử dụng lowess smoother. Cách tiếp cận này có ít giả định, mặc dù nó cần tính toán nhiều hơn do đó khoảng tin cậy không được tính toán ở tất cả.

sns.lmplot(x="total_bill", y="tip", data=tips)

sns.lmplot(x="total_bill", y="tip", data=tips,lowess=True)

plt.show()

Câu hỏi thú vị hơn là “mối quan hệ giữa hai biến này thay đổi như thế nào với một hàm của một biến thứ ba?”

Đây là nơi mà sự khác biệt giữa regplot() và lmplot() xuất hiện. Trong khi regplot() luôn cho thấy một mối quan hệ duy nhất, lmplot() kết hợp regplot() với FacetGrid để cung cấp một giao diện dễ dàng biểu diễn linear regressions trên các hình vẽ (faceted plots) cho phép bạn khám phá các tương tác với tối đa 3 categorical variables thông qua 3 đối số hue, col, row của lmplot().

Cách tốt nhất để tách ra một mối quan hệ là đánh dấu các phân lớp trên cùng hệ trục (axes) và sử dụng màu sắc để phân biệt chúng:

Ví dụ:

sns.lmplot(x="total_bill", y="tip", hue="smoker", data=tips, legend_out=False);

print "can custormize styple of them"

sns.lmplot(x="total_bill", y="tip", hue="smoker", data=tips,markers=["o", "x"], palette="Set1", legend_out=False);

plt.show()

Để thêm một biến khác, bạn có thể vẽ nhiều “facets” mà mỗi cấp của biến xuất hiện trong hàng hoặc cột của lưới:

sns.lmplot(x="total_bill", y="tip", hue="smoker",col="time", row="sex", data=tips);

plt.show()

Kết Luận

Qua bài học này người đọc đã học được cách sử dụng regplotlmplot để có thể biểu diễn mỗi quan hệ giữa hai biến định lượng qua phép regression, seaborn chủ yếu là để thêm một biểu diễn trực quan giúp nhấn mạnh các mẫu trong một tập dữ liệu trong quá trình phân tích dữ liệu.

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *