當前位置: 首頁>>技術問答>>正文


Pandas 相關矩陣的計算與可視化

對一個帶有幾個條目的pandas DataFrame,想計算某些類型商店的收入之間的相關性。這裏有有許多帶有收入的商店數據,活動區域分類(劇院,布料店,食品……)和其他數據。

我嘗試創建一個新的數據框並插入一個列,該列具有屬於同一類別的各種商店的收入,並且返回的數據框隻有第一列有值,其餘的則填充了NaN。我嘗試的代碼:

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

然後,準備使用.corr()給出商店類別之間的相關矩陣。

在那之後,我想知道如何使用matplolib繪製矩陣值(-1到1,因為我想使用Pearson的相關性)。

最佳解決辦法

可以采用下麵的方式:

在本例中使用UCI Abalone數據……

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

python,statistics,visualization,pandas

相關矩陣繪圖功能:

#相關矩陣繪圖功能

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)

python,statistics,visualization,pandas

次佳解決辦法

另一種方法是使用seaborn中的熱圖函數來繪製協方差。此示例使用R中ISLR程序包中的自動數據集(與您顯示的示例中的相同)。

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)

python,statistics,visualization,pandas

如果想要更加炫酷,你可以使用Pandas Style,例如:

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())

python,statistics,visualization,pandas

參考資料

本文由《純淨天空》出品。文章地址: https://vimsky.com/zh-tw/article/3894.html,未經允許,請勿轉載。