Perhitungan dan Visualisasi Matriks Korelasi dengan Pandas


35

Saya memiliki kerangka data panda dengan beberapa entri, dan saya ingin menghitung korelasi antara pendapatan beberapa jenis toko. Ada sejumlah toko dengan data pendapatan, klasifikasi area aktivitas (teater, toko pakaian, makanan ...) dan data lainnya.

Saya mencoba membuat bingkai data baru dan menyisipkan kolom dengan pendapatan semua jenis toko yang termasuk dalam kategori yang sama, dan kerangka data yang kembali hanya memiliki kolom pertama yang diisi dan sisanya penuh dengan NaN. Kode yang saya lelah:

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

Saya ingin melakukannya, jadi saya bisa gunakan .corr()untuk memberikan matriks korelasi antara kategori toko.

Setelah itu, saya ingin tahu bagaimana saya bisa memplot nilai matriks (-1 ke 1, karena saya ingin menggunakan korelasi Pearson) dengan matplolib.


Jawaban:


24

Saya menyarankan beberapa jenis permainan sebagai berikut:

Menggunakan data Abalone UCI untuk contoh ini ...

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

masukkan deskripsi gambar di sini

Fungsi merencanakan matriks korelasi:

# Korelasi fungsi penyusunan matrik

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)

masukkan deskripsi gambar di sini

Semoga ini membantu!


Bagian kedua benar-benar sangat membantu, tetapi saya masih memiliki masalah pertama dan saya harus menyelesaikannya sebelum pergi ke bagian kedua
gdlm

Sangat sulit untuk memahami apa yang Anda inginkan pada bagian pertama tanpa beberapa data. Bisakah Anda menambahkan beberapa data untuk mengilustrasikan bagian lain yang Anda punya pertanyaan tentang. Saya percaya ini diselesaikan secara sepele berdasarkan apa yang Anda sebutkan. Cukup tulis 10 baris dataframe dan sebelum dan sesudah dari apa yang Anda miliki dan inginkan.
AN6U5

1
Garis import numpy as nptidak perlu, bukan?
Martin Thoma

1
Anda tidak menggunakan cbar, jadi mengapa Anda menetapkannya?
Martin Thoma

1
@Martin Thoma - Anda benar bahwa numpy tidak digunakan. Saya berpikir bahwa .corr () adalah fungsi numpy tetapi ini adalah panda. Saya memang menggunakan colorbar, tetapi Anda benar bahwa saya tidak perlu menetapkannya ke cbar. Saya telah mengedit tanggapan berdasarkan komentar Anda. Terima kasih!
AN6U5

29

Alternatif lain adalah dengan menggunakan fungsi peta panas di seaborn untuk merencanakan kovarian. Contoh ini menggunakan kumpulan data otomatis dari paket ISLR di R (sama seperti dalam contoh yang Anda tunjukkan).

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)

masukkan deskripsi gambar di sini

Jika Anda ingin menjadi lebih mewah, Anda dapat menggunakan Gaya Pandas , misalnya:

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

masukkan deskripsi gambar di sini


pertama kali lihat menggunakan paket R dalam python. Banyak fungsi R yang dapat digunakan sekarang. Hebat
Diansheng

Versi Pandas> 0.19 tidak mengandung rpymodul. Anda perlu menggunakan proyek mandiri rpy2. Lihat peringatan dari Panda di sini .
n1k31t4

7

Mengapa tidak melakukan ini saja:

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

Anda dapat mengubah palet warna dengan menggunakan cmapparameter:

sns.heatmap(data.corr(), cmap='BuGn')
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.