पांडा का उपयोग करके प्लॉट सहसंबंध मैट्रिक्स


212

मेरे पास बड़ी संख्या में विशेषताओं के साथ एक डेटा सेट है, इसलिए सहसंबंध मैट्रिक्स का विश्लेषण करना बहुत मुश्किल हो गया है। मैं एक सहसंबंध मैट्रिक्स को प्लॉट करना चाहता हूं जो हमें dataframe.corr()पांडा लाइब्रेरी से फ़ंक्शन का उपयोग करके मिलता है । क्या इस मैट्रिक्स को प्लॉट करने के लिए पांडा लाइब्रेरी द्वारा प्रदान किया गया कोई अंतर्निहित कार्य है?


संबंधित उत्तर यहां देखे
joelostblom

जवाबों:


292

आप pyplot.matshow() से उपयोग कर सकते हैं matplotlib:

import matplotlib.pyplot as plt

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

संपादित करें:

टिप्पणियों में अक्ष टिक लेबल को बदलने के लिए एक अनुरोध था। यहाँ एक डीलक्स संस्करण है जो एक बड़े आकार के आकार पर खींचा गया है, जिसमें डेटाफ्रेम से मेल खाने के लिए अक्ष लेबल है, और रंग पैमाने की व्याख्या करने के लिए एक रंग पट्टी किंवदंती है।

मैं शामिल हूं कि लेबल के आकार और रोटेशन को कैसे समायोजित किया जाए, और मैं एक आंकड़ा अनुपात का उपयोग कर रहा हूं जो कि रंगबार बनाता है और मुख्य आंकड़ा समान ऊंचाई से बाहर आता है।

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

सहसंबंध प्लॉट उदाहरण


1
मुझे कुछ याद आ रहा है:AttributeError: 'module' object has no attribute 'matshow'
टॉम रसेल

1
@TomRussell आपने क्या किया import matplotlib.pyplot as plt?
joelostblom

1
मुझे लगता है कि मैंने किया था! :-)
टॉम रसेल

7
क्या आप जानते हैं कि प्लॉट पर वास्तविक कॉलम नामों को कैसे प्रदर्शित किया जाए?
वेबक्यूब

2
@Cecilia मैंने रोटेशन पैरामीटर को 90 में
ikbel बेनाबसेमदाद

182

यदि आपका मुख्य लक्ष्य सहसंबंध मैट्रिक्स की कल्पना करना है, तो प्रति सेगमेंट बनाने के बजाय, सुविधाजनक pandas स्टाइलिंग विकल्प एक व्यवहार्य अंतर्निहित समाधान है:

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

यहां छवि विवरण दर्ज करें

ध्यान दें कि यह एक बैकएंड में होना चाहिए जो HTML का समर्थन करता है, जैसे कि JupyterLab नोटबुक। (अंधेरे पृष्ठभूमि पर स्वचालित प्रकाश पाठ मौजूदा पीआर से है और नवीनतम जारी संस्करण, pandas0.23) नहीं है।


स्टाइलिंग

आप आसानी से अंक परिशुद्धता को सीमित कर सकते हैं:

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

यहां छवि विवरण दर्ज करें

या यदि आप एनोटेशन के बिना मैट्रिक्स पसंद करते हैं, तो अंकों को पूरी तरह से हटा दें:

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

यहां छवि विवरण दर्ज करें

स्टाइल प्रलेखन में अधिक उन्नत शैलियों के निर्देश भी शामिल हैं, जैसे कि सेल के प्रदर्शन को कैसे बदलना है ताकि माउस पॉइंटर ओवर होवर कर रहा है। आउटपुट को बचाने के लिए आप render()विधि को जोड़कर HTML को वापस कर सकते हैं और फिर इसे एक फ़ाइल में लिख सकते हैं (या बस कम औपचारिक उद्देश्यों के लिए स्क्रीनशॉट लें)।


समय की तुलना

मेरे परीक्षण में, 10x मैट्रिक्स की style.background_gradient()तुलना में 4 गुना तेज plt.matshow()और 120x तेज था sns.heatmap()। दुर्भाग्य से यह बड़े पैमाने पर नहीं है plt.matshow(): दोनों एक 100x100 मैट्रिक्स के लिए समान समय लेते हैं, और plt.matshow()1000x1000 मैट्रिक्स के लिए 10x तेज है।


सहेजा जा रहा है

स्टाइलिड डेटाफ़्रेम को सहेजने के कुछ संभावित तरीके हैं:


पंडों के लिए अद्यतन> = 0.24

सेटिंग के अनुसार axis=None, अब कॉलम या प्रति पंक्ति के बजाय पूरे मैट्रिक्स के आधार पर रंगों की गणना करना संभव है:

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

यहां छवि विवरण दर्ज करें


2
अगर निर्यात करने का कोई तरीका होता है, तो छवि के रूप में, यह बहुत अच्छा होता है!
क्रिस्टाडा ६ .३

1
धन्यवाद! आपको निश्चित रूप से एक डायवर्टिंग पैलेट की आवश्यकता हैimport 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)
स्टॉलिंगऑन

1
@stallingOne अच्छा बिंदु, मुझे उदाहरण में नकारात्मक मान शामिल नहीं करना चाहिए, मैं बाद में बदल सकता हूं। इसे पढ़ने वाले लोगों के संदर्भ के लिए, आपको सीबॉर्न के साथ एक कस्टम डाइवर्जेंट सीमैप बनाने की आवश्यकता नहीं है (हालांकि ऊपर टिप्पणी में एक बहुत सुंदर दिखता है), आप मैटप्लोटलिब से अंतर्निहित डायवर्जेंट सेमीैप का भी उपयोग कर सकते हैं, जैसे corr.style.background_gradient(cmap='coolwarm')। वर्तमान में cmap को किसी विशिष्ट मान पर केंद्रित करने का कोई तरीका नहीं है, जो कि divergent cmaps के साथ एक अच्छा विचार हो सकता है।
जूलोस्टब्लोम जूल

1
@rovyko क्या आप पांडा> = 0.24.0 पर हैं?
जोएलोस्टब्लॉम

2
ये भूखंड दृष्टिगत रूप से बहुत अच्छे हैं, लेकिन @ Kristada673 प्रश्न काफी प्रासंगिक है, आप उन्हें कैसे निर्यात करेंगे?
इरफान

89

इस फ़ंक्शन को आज़माएं, जो सहसंबंध मैट्रिक्स के लिए चर नाम प्रदर्शित करता है:

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- अक्ष
निशांत

एक और चित्रमय बात, लेकिन plt.tight_layout()लंबे कॉलम के नामों के लिए भी उपयोगी हो सकती है।
user3017048

86

सीबोर्न का हीटमैप संस्करण:

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

9
सीबॉर्न हीटमैप फैंसी है लेकिन यह बड़े मैट्रीस पर खराब प्रदर्शन करता है। मैटप्लेट्लिब का मात्सवो विधि बहुत तेज है।
अनिलबाई

3
सीबोर्न स्वचालित रूप से कॉलम नामों से टिकलैबल्स का अनुमान लगा सकता है।
तुलियो कासाग्रांडे

80

आप या तो सुविधाओं के बीच के संबंध का अवलोकन कर सकते हैं या समुद्री या तितर-बितर मैट्रिक्स से हीट मैप खींचकर।

स्कैटर मैट्रिक्स:

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

यदि आप प्रत्येक सुविधा के तिरछापन के बारे में भी कल्पना करना चाहते हैं - तो समुद्री जोड़ी का उपयोग करें।

sns.pairplot(dataframe)

एसएनएस हीटमैप:

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)

आउटपुट सुविधाओं का सहसंबंध मानचित्र होगा। नीचे दिए गए उदाहरण को देखें।

यहां छवि विवरण दर्ज करें

किराने और डिटर्जेंट के बीच संबंध अधिक है। इसी तरह:

उच्च सहसंबंध के साथ Pdoducts:
  1. किराने और डिटर्जेंट।
मध्यम सहसंबंध के साथ उत्पाद:
  1. दूध और किराने
  2. दूध और डिटर्जेंट_पेपर
कम सहसंबंध वाले उत्पाद:
  1. दूध और डेली
  2. जमे हुए और ताजा।
  3. जमे हुए और डेली।

Pairplots से: आप युग्मक या स्कैटर मैट्रिक्स से संबंधों के एक ही सेट का निरीक्षण कर सकते हैं। लेकिन इनसे हम यह कह सकते हैं कि डेटा सामान्य रूप से वितरित किया गया है या नहीं।

यहां छवि विवरण दर्ज करें

नोट: उपरोक्त डेटा से लिया गया वही ग्राफ है, जिसका उपयोग हीटमैप खींचने के लिए किया जाता है।


3
मुझे लगता है कि यह .plt नहीं होना चाहिए। (अगर यह
मैटलपोटलिब

2
@ghukill स्पष्ट रूप से नहीं। वह इसे संदर्भित कर सकता थाfrom matplotlib import pyplot as pl
जेरु ल्यूक

हमेशा सहसंबंध की साजिश में -1 से +1 के बीच सहसंबंध की सीमा कैसे तय करें
debaonline4u

7

आप matplotlib से imshow () विधि का उपयोग कर सकते हैं

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

यदि आप डेटाफ्रेम है dfतो आप आसानी से उपयोग कर सकते हैं:

import matplotlib.pyplot as plt
import seaborn as sns

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

3

स्टेटमॉडल ग्राफिक्स भी सहसंबंध मैट्रिक्स का एक अच्छा दृश्य देता है

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

अन्य तरीकों के साथ-साथ पेयरप्लॉट होना भी अच्छा है जो सभी मामलों के लिए स्कैटर प्लॉट देगा-

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

प्रपत्र सहसंबंध मैट्रिक्स, मेरे मामले में zdf डेटाफ्रेम है जिसे मुझे सहसंबंध मैट्रिक्स करने की आवश्यकता है।

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)

फिर हम स्क्रीनशॉट ले सकते हैं। या एक छवि फ़ाइल में HTML कन्वर्ट।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.