Tính toán và trực quan hóa ma trận tương quan với gấu trúc


35

Tôi có một khung dữ liệu gấu trúc với một vài mục và tôi muốn tính toán mối tương quan giữa thu nhập của một số loại cửa hàng. Có một số cửa hàng có dữ liệu thu nhập, phân loại khu vực hoạt động (nhà hát, cửa hàng vải, thực phẩm ...) và các dữ liệu khác.

Tôi đã cố gắng tạo khung dữ liệu mới và chèn một cột có thu nhập của tất cả các loại cửa hàng thuộc cùng loại và khung dữ liệu trả về chỉ có cột đầu tiên được lấp đầy và phần còn lại chứa đầy NaN. Mã mà tôi mệt mỏi:

corr = pd.DataFrame()
for at in activity:
    stores.loc[stores['Activity']==at]['income']

Tôi muốn làm như vậy, vì vậy tôi có thể sử dụng .corr()để đưa ra ma trận tương quan giữa danh mục cửa hàng.

Sau đó, tôi muốn biết làm thế nào tôi có thể vẽ các giá trị ma trận (-1 đến 1, vì tôi muốn sử dụng tương quan của Pearson) với matplolib.


Câu trả lời:


24

Tôi đề nghị một số cách chơi như sau:

Sử dụng dữ liệu Bào ngư UCI cho ví dụ này ...

import matplotlib
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

# Read file into a Pandas dataframe
from pandas import DataFrame, read_csv
f = 'https://archive.ics.uci.edu/ml/machine-learning-databases/abalone/abalone.data'
df = read_csv(f)
df=df[0:10]
df

nhập mô tả hình ảnh ở đây

Hàm vẽ ma trận tương quan:

# Hàm vẽ ma trận tương quan

def correlation_matrix(df):
    from matplotlib import pyplot as plt
    from matplotlib import cm as cm

    fig = plt.figure()
    ax1 = fig.add_subplot(111)
    cmap = cm.get_cmap('jet', 30)
    cax = ax1.imshow(df.corr(), interpolation="nearest", cmap=cmap)
    ax1.grid(True)
    plt.title('Abalone Feature Correlation')
    labels=['Sex','Length','Diam','Height','Whole','Shucked','Viscera','Shell','Rings',]
    ax1.set_xticklabels(labels,fontsize=6)
    ax1.set_yticklabels(labels,fontsize=6)
    # Add colorbar, make sure to specify tick locations to match desired ticklabels
    fig.colorbar(cax, ticks=[.75,.8,.85,.90,.95,1])
    plt.show()

correlation_matrix(df)

nhập mô tả hình ảnh ở đây

Hi vọng điêu nay co ich!


Phần thứ hai thực sự rất hữu ích, nhưng tôi vẫn gặp vấn đề đầu tiên và tôi cần giải quyết nó trước khi đến phần thứ hai
gdlm

Rất khó để hiểu những gì bạn muốn trong phần đầu tiên mà không có một số dữ liệu. Bạn có thể thêm một số dữ liệu để minh họa cho phần khác mà bạn có một câu hỏi về. Tôi tin rằng điều này được giải quyết một cách tầm thường dựa trên những gì bạn đã đề cập. Chỉ cần viết 10 hàng của khung dữ liệu và trước và sau những gì bạn có và muốn.
AN6U5

1
Dòng import numpy as npnày là không cần thiết, phải không?
Martin Thoma

1
Bạn không sử dụng cbar, vậy tại sao bạn chỉ định nó?
Martin Thoma

1
@Martin Thoma - Bạn đúng là không sử dụng numpy. Tôi đã nghĩ rằng .corr () là một hàm numpy nhưng nó là gấu trúc. Tôi sử dụng thanh màu, nhưng bạn đúng là tôi không cần gán nó cho cbar. Tôi đã chỉnh sửa phản hồi dựa trên ý kiến ​​của bạn. Cảm ơn!
AN6U5

29

Một cách khác là sử dụng hàm Heatmap trong seaborn để vẽ biểu đồ hiệp phương sai. Ví dụ này sử dụng tập dữ liệu Tự động từ gói ISLR trong R (giống như trong ví dụ bạn đã hiển thị).

import pandas.rpy.common as com
import seaborn as sns
%matplotlib inline

# load the R package ISLR
infert = com.importr("ISLR")

# load the Auto dataset
auto_df = com.load_data('Auto')

# calculate the correlation matrix
corr = auto_df.corr()

# plot the heatmap
sns.heatmap(corr, 
        xticklabels=corr.columns,
        yticklabels=corr.columns)

nhập mô tả hình ảnh ở đây

Nếu bạn muốn trở nên lạ mắt hơn nữa, bạn có thể sử dụng Pandas Style , ví dụ:

cmap = cmap=sns.diverging_palette(5, 250, as_cmap=True)

def magnify():
    return [dict(selector="th",
                 props=[("font-size", "7pt")]),
            dict(selector="td",
                 props=[('padding', "0em 0em")]),
            dict(selector="th:hover",
                 props=[("font-size", "12pt")]),
            dict(selector="tr:hover td:hover",
                 props=[('max-width', '200px'),
                        ('font-size', '12pt')])
]

corr.style.background_gradient(cmap, axis=1)\
    .set_properties(**{'max-width': '80px', 'font-size': '10pt'})\
    .set_caption("Hover to magify")\
    .set_precision(2)\
    .set_table_styles(magnify())

nhập mô tả hình ảnh ở đây


Lần đầu tiên nhìn thấy sử dụng gói R trong python. Rất nhiều chức năng R có thể được sử dụng ngay bây giờ. Tuyệt vời
Diansheng

Các phiên bản của Pandas> 0.19 không chứa rpymô-đun. Bạn cần sử dụng dự án độc lập rpy2. Xem cảnh báo từ Pandas tại đây .
n1k31t4

7

Tại sao không chỉ đơn giản là làm điều này:

import seaborn as sns
import pandas as pd

data = pd.read_csv('Dataset.csv')

plt.figure(figsize=(40,40)) 
# play with the figsize until the plot is big enough to plot all the columns
# of your dataset, or the way you desire it to look like otherwise

sns.heatmap(data.corr())

Bạn có thể thay đổi bảng màu bằng cách sử dụng cmaptham số:

sns.heatmap(data.corr(), cmap='BuGn')
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.