Hướng dẫn plot histogram python seaborn - âm mưu biểu đồ con trăn seaborn

Khi phân tích một bộ dữ liệu, thường thì điều đầu tiên bạn sẽ muốn làm là nhận thức về phân phối của dữ liệu. Ý tưởng chính của Seaborn là nó cung cấp các high-level commands để tạo ra một loạt các loại hình vẽ hữu ích cho việc khai phá dữ liệu thống kê, và thậm chí một số mô hình thống kê phù hợp.

Chúng ta hãy cùng xem xét một số tập dữ liệu và các loại plot có sẵn trong Seaborn. Lưu ý rằng tất cả những điều dưới đây có thể được thực hiện bằng lệnh Matplotlib (thực tế, Seaborn được implement từ matplotlib) nhưng API Seaborn thì tiện lợi hơn nhiều.

Để 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
from scipy import stats, integrate
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(color_codes=True)
np.random.seed(sum(map(ord, "distributions")))

Histograms, KDE, and densities

Thông thường khi visualizing dữ liệu thống kê, tất cả những gì bạn muốn là vẽ histograms và join distributions của các biến. Chúng ta đã thấy rằng điều này tương đối đơn giản trong Matplotlib:

Tạo dữ liệu:

data = np.random.multivariate_normal([0, 0], [[10, 2], [2, 2]], size=2000)
data = pd.DataFrame(data, columns=['x', 'y'])

Vẽ qua matplotlib.

for col in 'xy':
    plt.hist(data[col], normed=True, alpha=0.5)

plt.show()

Cách thuận tiện nhất để xem nhanh một phân phối chuẩn một biến trong seaborn là dùng hàm distplot(). Chúng ta có thể có được một đường cong ước lượng (estimation) của phân phối bằng cách sử dụng một ước lượng mật độ hạt nhân (kernel density estimation- KDE)
for col in 'xy':
    sns.distplot(data[col])

plt.show()
  

Phương thức distplot() cũng cấp cho ta một số lựa chon như loại bỏ đường cong KDE, hoặc biểu diễn mật độ xác suất thống kê qua các ticks thẳng đứng. Cấu hình cho KDE ta dùng đối số “kde”, cấu hình cho các ticks ta dùng đối số “rug”. Cụ thể như sau:

Sử dụng KDE, RUG và chỉ dùng 5 bins.

sns.distplot(data['x'], bins = 5, kde=True, rug=True)
plt.show()

Loại bỏ KDE, chỉ dùng RUG và chỉ dùng 5 bins.

sns.distplot(data['x'], bins = 5, kde=False, rug=True)
plt.show()

Hay ta chỉ muốn hiển thị kde (kernel density estimate), và bỏ qua phần hist. Yêu cầu này là chức năng của kdeplot(), tuy nhiên ta có thể chỉ sử dụng distplot()

sns.distplot(data['x'], kde=True, hist = False)
plt.show()

Bạn cũng có thể sử dụng distplot() để fit một kiểu phân bố cho một tập dữ liệu và đánh giá trực quan nó tương ứng như thế nào với dữ liệu được quan sát:

Các bạn có thể thử lần lượt với các kiểu phân bố được liệt tại mục “Continuous distributions” ở link https://docs.scipy.org/doc/scipy/reference/stats.html#module-scipy.stats. Ví dụ:https://docs.scipy.org/doc/scipy/reference/stats.html#module-scipy.stats. Ví dụ:

sns.distplot(data['x'], kde=False, fit=stats.gamma)

plt.show()

Joint distributions

Nó cũng có thể hữu ích để hình dung một phân phối chuẩn hai biến. Cách đơn giản nhất để thực hiện việc này là chỉ sử dụng hàm jointplot(), tạo ra một biểu đồ đa bảng thể hiện đồng thời mối tương quan giữa hai biến cùng với sự phân phối chuẩn,  một biến ứng với mỗi Trục riêng. Ví dụ:jointplot(), tạo ra một biểu đồ đa bảng thể hiện đồng thời mối tương quan giữa hai biến cùng với sự phân phối chuẩn,  một biến ứng với mỗi Trục riêng. Ví dụ:

Tạo dữ liệu:

Vẽ qua matplotlib.

Phương thức distplot() cũng cấp cho ta một số lựa chon như loại bỏ đường cong KDE, hoặc biểu diễn mật độ xác suất thống kê qua các ticks thẳng đứng. Cấu hình cho KDE ta dùng đối số “kde”, cấu hình cho các ticks ta dùng đối số “rug”. Cụ thể như sau:

Sử dụng KDE, RUG và chỉ dùng 5 bins.

Loại bỏ KDE, chỉ dùng RUG và chỉ dùng 5 bins.

data = np.random.multivariate_normal([0, 0], [[10, 2], [2, 2]], size=2000)
data = pd.DataFrame(data, columns=['x', 'y'])
1
data = np.random.multivariate_normal([0, 0], [[10, 2], [2, 2]], size=2000)
data = pd.DataFrame(data, columns=['x', 'y'])
2
data = np.random.multivariate_normal([0, 0], [[10, 2], [2, 2]], size=2000)
data = pd.DataFrame(data, columns=['x', 'y'])
3
data = np.random.multivariate_normal([0, 0], [[10, 2], [2, 2]], size=2000)
data = pd.DataFrame(data, columns=['x', 'y'])
4

Hay ta chỉ muốn hiển thị kde (kernel density estimate), và bỏ qua phần hist. Yêu cầu này là chức năng của kdeplot(), tuy nhiên ta có thể chỉ sử dụng distplot()

data = np.random.multivariate_normal([0, 0], [[10, 2], [2, 2]], size=2000)
data = pd.DataFrame(data, columns=['x', 'y'])
5

Bạn cũng có thể sử dụng distplot() để fit một kiểu phân bố cho một tập dữ liệu và đánh giá trực quan nó tương ứng như thế nào với dữ liệu được quan sát:

Các bạn có thể thử lần lượt với các kiểu phân bố được liệt tại mục “Continuous distributions” ở link https://docs.scipy.org/doc/scipy/reference/stats.html#module-scipy.stats. Ví dụ:jointplot() như phía trên, kdeplot() là một lựa chọn thứ hai để biểu diễn KDE plots.

Joint distributions

data = np.random.multivariate_normal([0, 0], [[10, 2], [2, 2]], size=2000)
data = pd.DataFrame(data, columns=['x', 'y'])
6
data = np.random.multivariate_normal([0, 0], [[10, 2], [2, 2]], size=2000)
data = pd.DataFrame(data, columns=['x', 'y'])
7
data = np.random.multivariate_normal([0, 0], [[10, 2], [2, 2]], size=2000)
data = pd.DataFrame(data, columns=['x', 'y'])
8
data = np.random.multivariate_normal([0, 0], [[10, 2], [2, 2]], size=2000)
data = pd.DataFrame(data, columns=['x', 'y'])
9
for col in 'xy':
    plt.hist(data[col], normed=True, alpha=0.5)

plt.show()
0
for col in 'xy':
    plt.hist(data[col], normed=True, alpha=0.5)

plt.show()
1
data = np.random.multivariate_normal([0, 0], [[10, 2], [2, 2]], size=2000)
data = pd.DataFrame(data, columns=['x', 'y'])
4
for col in 'xy':
    plt.hist(data[col], normed=True, alpha=0.5)

plt.show()
3

Nó cũng có thể hữu ích để hình dung một phân phối chuẩn hai biến. Cách đơn giản nhất để thực hiện việc này là chỉ sử dụng hàm jointplot(), tạo ra một biểu đồ đa bảng thể hiện đồng thời mối tương quan giữa hai biến cùng với sự phân phối chuẩn,  một biến ứng với mỗi Trục riêng. Ví dụ: