Pandalar kullanarak korelasyon matrisini çizin


212

Çok sayıda özelliğe sahip bir veri setim var, bu yüzden korelasyon matrisini analiz etmek çok zorlaştı. dataframe.corr()Panda kütüphanesinden fonksiyon kullanarak elde ettiğimiz korelasyon matrisini çizmek istiyorum . Bu matrisi çizmek için panda kütüphanesi tarafından sağlanan yerleşik bir işlev var mı?


Yanıtlar:


292

Sen kullanabilirsiniz pyplot.matshow() den matplotlib:

import matplotlib.pyplot as plt

plt.matshow(dataframe.corr())
plt.show()

Düzenle:

Yorumlarda, eksen onay etiketlerinin nasıl değiştirileceğine dair bir istek vardı. Burada, daha büyük bir rakam boyutunda çizilen, veri çerçevesiyle eşleşecek eksen etiketleri ve renk ölçeğini yorumlamak için bir renk çubuğu açıklaması bulunan lüks bir sürüm var.

Etiketlerin boyutunu ve dönüşünü nasıl ayarlayacağımı ekliyorum ve colorbar ve ana figürün aynı yükseklikte çıkmasını sağlayan bir şekil oranı kullanıyorum.

f = plt.figure(figsize=(19, 15))
plt.matshow(df.corr(), fignum=f.number)
plt.xticks(range(df.shape[1]), df.columns, fontsize=14, rotation=45)
plt.yticks(range(df.shape[1]), df.columns, fontsize=14)
cb = plt.colorbar()
cb.ax.tick_params(labelsize=14)
plt.title('Correlation Matrix', fontsize=16);

korelasyon grafiği örneği


1
Bir şey eksik olmalıyım:AttributeError: 'module' object has no attribute 'matshow'
Tom Russell

1
@TomRussell Yaptınız mı import matplotlib.pyplot as plt?
joelostblom

1
Yaptığımı düşünmek istiyorum! :-)
Tom Russell

7
grafikte gerçek sütun adlarının nasıl görüntüleneceğini biliyor musunuz?
WebQube

2
@Cecilia Döndürme parametresini 90 olarak
ikbel benabdessamad

182

Ana amacınız korelasyon matrisini kendiniz bir çizim oluşturmak yerine görselleştirmekse, uygun pandas şekillendirme seçenekleri uygulanabilir bir yerleşik çözümdür:

import pandas as pd
import numpy as np

rs = np.random.RandomState(0)
df = pd.DataFrame(rs.rand(10, 10))
corr = df.corr()
corr.style.background_gradient(cmap='coolwarm')
# 'RdBu_r' & 'BrBG' are other good diverging colormaps

resim açıklamasını buraya girin

Bunun, JupyterLab Notebook gibi HTML oluşturmayı destekleyen bir arka uçta olması gerektiğini unutmayın. (Koyu arka planlardaki otomatik açık renkli metin, en son yayınlanan sürüm olan pandas0.23'ten değil, mevcut bir PR'dan alınmıştır).


Şekillendirme

Rakam hassasiyetini kolayca sınırlayabilirsiniz:

corr.style.background_gradient(cmap='coolwarm').set_precision(2)

resim açıklamasını buraya girin

Ya da ek açıklama olmadan matrisi tercih ederseniz rakamlardan tamamen kurtulun:

corr.style.background_gradient(cmap='coolwarm').set_properties(**{'font-size': '0pt'})

resim açıklamasını buraya girin

Stil belgeleri, fare işaretçisinin üzerinde gezindiği hücrenin ekranının nasıl değiştirileceği gibi daha gelişmiş stillerin talimatlarını da içerir. Çıktıyı kaydetmek için HTML kodunurender() yöntemi ve daha sonra bir dosyaya yazabilirsiniz (veya daha az resmi amaçlar için bir ekran görüntüsü alabilirsiniz).


Zaman karşılaştırması

Testlerimde 10x10 matrisinden style.background_gradient()4 kat daha hızlı plt.matshow()ve 120 kat daha hızlıydı sns.heatmap(). Ne yazık ki ölçeklenmiyor plt.matshow(): ikisi de 100x100 matris için yaklaşık aynı zaman alıyor ve plt.matshow()1000x1000 matris için 10 kat daha hızlı.


Tasarruf

Stilize edilmiş veri çerçevesini kaydetmenin birkaç olası yolu vardır:

  • render()Yöntemi ekleyerek HTML'yi döndürün ve çıktıyı bir dosyaya yazın.
  • Uygulamayı .xslxkoşullu biçimlendirmeyle dosya olarak kaydedin .to_excel()Yöntemi .
  • Bir bitmap'i kaydetmek için imgkit ile birleştirin
  • Ekran görüntüsü alın (daha az resmi amaçlarla).

Pandalar için güncelleme> = 0.24

Ayarlayarak axis=None , oldukça sütun başına veya satır başına daha tüm matrisine dayalı olarak renk hesaplamak artık mümkün:

corr.style.background_gradient(cmap='coolwarm', axis=None)

resim açıklamasını buraya girin


2
İhracat yapmanın bir görüntüsü olsaydı, bu harika olurdu!
Kristada673

1
Teşekkürler! Kesinlikle bir sapma paletine ihtiyacınız varimport seaborn as sns corr = df.corr() cm = sns.light_palette("green", as_cmap=True) cm = sns.diverging_palette(220, 20, sep=20, as_cmap=True) corr.style.background_gradient(cmap=cm).set_precision(2)
stallingOne

1
@stallingOne İyi bir nokta, örneğe negatif değerler eklememeliydim, bunu daha sonra değiştirebilirim. Sadece bunu okuyan insanlar için referans olarak, deniz karnı ile özel bir ıraksak cmap oluşturmanıza gerek yoktur (yukarıdaki açıklamada bulunanlar oldukça şık görünmesine rağmen), matplotlib'den yerleşik ıraksak cmap'leri de kullanabilirsiniz, örn corr.style.background_gradient(cmap='coolwarm'). Şu anda cmap'i belirli bir değer üzerinde ortalamanın bir yolu yoktur, bu da ıraksak cmaps ile iyi bir fikir olabilir.
joelostblom

1
@rovyko Pandalarda mısın> = 0.24.0?
joelostblom

2
Bu araziler görsel olarak harika, ancak @ Kristada673 sorusu oldukça alakalı, onları nasıl dışa aktarırsınız?
Erfan

89

Korelasyon matrisi için değişken adları da görüntüleyen bu işlevi deneyin:

def plot_corr(df,size=10):
    '''Function plots a graphical correlation matrix for each pair of columns in the dataframe.

    Input:
        df: pandas DataFrame
        size: vertical and horizontal size of the plot'''

    corr = df.corr()
    fig, ax = plt.subplots(figsize=(size, size))
    ax.matshow(corr)
    plt.xticks(range(len(corr.columns)), corr.columns);
    plt.yticks(range(len(corr.columns)), corr.columns);

6
plt.xticks(range(len(corr.columns)), corr.columns, rotation='vertical')x ekseninde sütun adlarının dikey olarak yönlendirilmesini istiyorsanız
nishant

Başka bir grafik şey, ancak bir ekleme plt.tight_layout()uzun sütun adları için de yararlı olabilir.
user3017048

86

Seaborn'un ısı haritası versiyonu:

import seaborn as sns
corr = dataframe.corr()
sns.heatmap(corr, 
            xticklabels=corr.columns.values,
            yticklabels=corr.columns.values)

9
Deniz dibi ısı haritası süslüdür ancak büyük matrislerde zayıf performans gösterir. matplotlib'in matshow yöntemi çok daha hızlıdır.
anilbey

3
Seaborn, etiket adlarını sütun adlarından otomatik olarak çıkarabilir.
Tulio Casagrande

80

Denizden bir ısı haritası çizerek veya pandalardan saçılma matrisi kullanarak özellikler arasındaki ilişkiyi gözlemleyebilirsiniz.

Dağılım Matrisi:

pd.scatter_matrix(dataframe, alpha = 0.3, figsize = (14,8), diagonal = 'kde');

Her özelliğin çarpıklığını da gözünüzde canlandırmak istiyorsanız - deniz dibi çiftleri kullanın.

sns.pairplot(dataframe)

Sns Isı Haritası:

import seaborn as sns

f, ax = pl.subplots(figsize=(10, 8))
corr = dataframe.corr()
sns.heatmap(corr, mask=np.zeros_like(corr, dtype=np.bool), cmap=sns.diverging_palette(220, 10, as_cmap=True),
            square=True, ax=ax)

Çıktı, özelliklerin bir korelasyon haritası olacaktır. yani aşağıdaki örneğe bakınız.

resim açıklamasını buraya girin

Bakkal ve deterjanlar arasındaki korelasyon yüksektir. Benzer şekilde:

Yüksek Korelasyonlu Pdoducts:
  1. Bakkal ve Deterjanlar.
Orta Korelasyonlu Ürünler:
  1. Süt ve Bakkal
  2. Süt ve Deterjanlar_Paper
Düşük Korelasyonlu Ürünler:
  1. Süt ve Şarküteri
  2. Dondurulmuş ve Taze.
  3. Dondurulmuş ve Şarküteri.

Pairplots'tan: Pairplots veya scatter matrisinden aynı ilişki kümesini gözlemleyebilirsiniz. Ancak bunlardan verilerin normal olarak dağıtılıp dağıtılmadığını söyleyebiliriz.

resim açıklamasını buraya girin

Not: Yukarıdaki, ısı haritası çizmek için kullanılan verilerden alınan aynı grafiktir.


3
Sanırım .plt değil .pl değil (bu matplotlib'e atıfta bulunuyorsa)
ghukill

2
@ghukill Gerekli değil. O bunu söyleyebilirdifrom matplotlib import pyplot as pl
Jeru Luke

korelasyon grafiğinde her zaman -1 ile +1 arasındaki korelasyon sınırının nasıl ayarlanacağı
debaonline4u

7

Matplotlib'dan imshow () yöntemini kullanabilirsiniz

import pandas as pd
import matplotlib.pyplot as plt
plt.style.use('ggplot')

plt.imshow(X.corr(), cmap=plt.cm.Reds, interpolation='nearest')
plt.colorbar()
tick_marks = [i for i in range(len(X.columns))]
plt.xticks(tick_marks, X.columns, rotation='vertical')
plt.yticks(tick_marks, X.columns)
plt.show()

5

Dataframe dfkullanıyorsanız şunları kullanabilirsiniz:

import matplotlib.pyplot as plt
import seaborn as sns

plt.figure(figsize=(15, 10))
sns.heatmap(df.corr(), annot=True)

3

statmodels grafikleri de korelasyon matrisinin güzel bir görünümünü verir

import statsmodels.api as sm
import matplotlib.pyplot as plt

corr = dataframe.corr()
sm.graphics.plot_corr(corr, xnames=list(corr.columns))
plt.show()


1

Diğer yöntemlerle birlikte, tüm durumlar için dağılım grafiği verecek çift parselin olması da iyidir.

import pandas as pd
import numpy as np
import seaborn as sns
rs = np.random.RandomState(0)
df = pd.DataFrame(rs.rand(10, 10))
sns.pairplot(df)

0

Form korelasyon matrisi, benim durumumda zdf i korelasyon matrisi gerçekleştirmek için gereken veri çerçevesidir.

corrMatrix =zdf.corr()
corrMatrix.to_csv('sm_zscaled_correlation_matrix.csv');
html = corrMatrix.style.background_gradient(cmap='RdBu').set_precision(2).render()

# Writing the output to a html file.
with open('test.html', 'w') as f:
   print('<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-widthinitial-scale=1.0"><title>Document</title></head><style>table{word-break: break-all;}</style><body>' + html+'</body></html>', file=f)

Sonra ekran görüntüsü alabiliriz. veya html dosyasını bir resim dosyasına dönüştürün.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.