दो स्तंभों के बीच सहसंबंध प्राप्त करने के लिए .corr का उपयोग करें


127

मेरे पास निम्नलिखित पांडा डेटाफ्रेम हैं Top15: यहाँ छवि विवरण दर्ज करें

मैं एक कॉलम बनाता हूँ जो प्रति व्यक्ति धर्मार्थ दस्तावेजों की संख्या का अनुमान लगाता है:

Top15['PopEst'] = Top15['Energy Supply'] / Top15['Energy Supply per Capita']
Top15['Citable docs per Capita'] = Top15['Citable documents'] / Top15['PopEst']

मैं प्रति व्यक्ति citable दस्तावेजों की संख्या और प्रति व्यक्ति ऊर्जा आपूर्ति के बीच संबंध जानना चाहता हूं। इसलिए मैं .corr()विधि का उपयोग करता हूं (पियर्सन के सहसंबंध):

data = Top15[['Citable docs per Capita','Energy Supply per Capita']]
correlation = data.corr(method='pearson')

मैं एक ही नंबर वापस करना चाहता हूं, लेकिन परिणाम है: यहाँ छवि विवरण दर्ज करें


मेरे विचार से आप सही है। लेकिन क्या आप मुझे बता सकते हैं कि 'data.corr (विधि =' पीयरसन ')' केवल ऊर्जा आपूर्ति और ऊर्जा आपूर्ति के बीच के संबंध को क्यों लौटाता है?
जीभ झू

1
ऐसा नहीं होता। इसे आपको 2x2 मैट्रिक्स वापस करना चाहिए; आप इसकी ऊपरी बाईं प्रविष्टि दिखाते हैं। यदि आप .corrसीधे अपने डेटाफ़्रेम पर लागू होते हैं, तो यह सभी जोड़ीदार सहसंबंधों को लौटा देगा; यही कारण है कि तब आप अपने मैट्रिक्स के विकर्ण पर 1s का निरीक्षण करते हैं (प्रत्येक स्तंभ अपने आप में पूरी तरह से सहसंबद्ध है)। नीचे मेरा संपादन देखें।
क्लेब

1
पर विचार करें स्वीकार करने एक जवाब अगर आपको लगता है कि यह आपके प्रश्न का उत्तर है
MaxU

1
मैं, आपका जवाब स्वीकार कर लिया है धन्यवाद
टोंग झू

28
यह प्रश्न कौरसेरा पर "पाइथन में डेटा साइंस का परिचय" पाठ्यक्रम से सीधे है। विशेष रूप से, असाइनमेंट 3, प्रश्न 9. जब प्रशिक्षक क्रिस ब्रूक्स स्टैक ओवरफ्लो में छात्रों को प्रश्न पोस्ट करने के लिए प्रोत्साहित करते हैं, तो मुझे नहीं लगता कि उनका मतलब है कि उन्हें असाइनमेंट वर्बटिम से समस्याओं को पोस्ट करना चाहिए।
रास

जवाबों:


209

वास्तविक डेटा के बिना प्रश्न का उत्तर देना कठिन है लेकिन मुझे लगता है कि आप कुछ इस तरह की तलाश कर रहे हैं:

Top15['Citable docs per Capita'].corr(Top15['Energy Supply per Capita'])

यह आपके दो स्तंभों के बीच सहसंबंध की गणना करता है 'Citable docs per Capita' और 'Energy Supply per Capita'

एक उदाहरण देने के लिए:

import pandas as pd

df = pd.DataFrame({'A': range(4), 'B': [2*i for i in range(4)]})

   A  B
0  0  0
1  1  2
2  2  4
3  3  6

फिर

df['A'].corr(df['B'])

देता है 1के रूप में उम्मीद।

अब, यदि आप एक मूल्य बदलते हैं, उदाहरण के लिए

df.loc[2, 'B'] = 4.5

   A    B
0  0  0.0
1  1  2.0
2  2  4.5
3  3  6.0

आदेश

df['A'].corr(df['B'])

रिटर्न

0.99586

जो अभी भी उम्मीद के मुताबिक 1 के करीब है।

यदि आप .corrसीधे अपने डेटाफ़्रेम पर लागू होते हैं, तो यह आपके कॉलम के बीच सभी जोड़ीदार सहसंबंधों को लौटाएगा ; यही कारण है कि तब आप 1sअपने मैट्रिक्स के विकर्ण पर निरीक्षण करते हैं (प्रत्येक स्तंभ अपने आप में पूरी तरह से सहसंबद्ध है)।

df.corr()

इसलिए लौटेगा

          A         B
A  1.000000  0.995862
B  0.995862  1.000000

आपके द्वारा दिखाए गए ग्राफ़िक में, सहसंबंध मैट्रिक्स के केवल ऊपरी बाएं कोने का प्रतिनिधित्व किया जाता है (मुझे लगता है)।

ऐसे मामले हो सकते हैं, जहां आप NaNअपने समाधान में शामिल हो जाते हैं - उदाहरण के लिए इस पोस्ट की जांच करें

यदि आप एक निश्चित सीमा से ऊपर / नीचे प्रविष्टियों को फ़िल्टर करना चाहते हैं, तो आप इस प्रश्न की जांच कर सकते हैं । यदि आप सहसंबंध गुणांक के हीटमैप को प्लॉट करना चाहते हैं, तो आप इस उत्तर की जांच कर सकते हैं और यदि आप ओवरलैपिंग अक्ष-लेबल के साथ समस्या में भाग लेते हैं, तो निम्न पोस्ट की जांच करें


क्या इसे पंक्ति द्वारा लागू किया जा सकता है?
डॉ। ओडीओएम

1
@ डॉ.डोम: हाँ, यह सिर्फ श्रृंखला लेता है, इसलिए जैसे df.loc[1, :].corr(df.loc[2, :])ठीक काम करेगा। संपूर्ण डेटाफ़्रेम के लिए, आप बस स्थानांतरित कर सकते हैं df.T.corr():।
क्लेब

मैंने आपके सुझाव की कोशिश की, लेकिन गणना अभी भी 1 रिटर्न df.loc [2, 'B'] = 4.5 का उपयोग करते हुए स्तंभ B में मान बदलने के बाद भी। शायद im सिर्फ गणना पर उलझन में है
डॉ। डीओएम

@ डॉ। डीओडीएम: जैसा कि मुझे आपका कोड नहीं पता है, मदद करना मुश्किल है। क्या मैं सही ढंग से समझ पाया कि ऊपर के 1बजाय मेरे मामले में मेरा उदाहरण आपके स्थान पर है 0.99586?
15

1
@ कॉलेब: ठीक है, जिस संदर्भ में मैं काम कर रहा हूं, प्रत्येक उच्च-स्तरीय मल्टी-कॉलम इंडेक्स में समान उप-परतें हैं। इस प्रश्न को देखें कि मैं क्या करने की कोशिश कर रहा हूं: stackoverflow.com/questions/57513002/…
एड्रियन कीस्टर

7

मैं उसी मुद्दे में भाग गया। यह Citable Documents per Personएक फ्लोट था, और अजगर इसे डिफ़ॉल्ट रूप से किसी भी तरह छोड़ देता है। मेरे डेटाफ़्रेम के अन्य सभी कॉलम संख्यात्मक-स्वरूपों में थे, इसलिए मैंने कॉलम को परिवर्तित करके इसे हल कियाnp.float64

Top15['Citable Documents per Person']=np.float64(Top15['Citable Documents per Person'])

याद रखें कि यह ठीक उसी कॉलम है जिसे आपने स्वयं गणना की है


6

डेटा को संख्यात्मक प्रकार में परिवर्तित करने के बाद मेरा समाधान होगा:

Top15[['Citable docs per Capita','Energy Supply per Capita']].corr()

स्तंभों का चयन करना और फिर .corr () विधि एक अच्छा विकल्प है क्योंकि हम 2 से अधिक स्तंभों के बीच सहसंबंध युग्मय की गणना कर सकते हैं
सेबस्टियन विवेकोस्की

4

यदि आप स्तंभों के सभी जोड़ों के बीच सहसंबंध चाहते हैं, तो आप कुछ ऐसा कर सकते हैं:

import pandas as pd
import numpy as np

def get_corrs(df):
    col_correlations = df.corr()
    col_correlations.loc[:, :] = np.tril(col_correlations, k=-1)
    cor_pairs = col_correlations.stack()
    return cor_pairs.to_dict()

my_corrs = get_corrs(df)
# and the following line to retrieve the single correlation
print(my_corrs[('Citable docs per Capita','Energy Supply per Capita')])

3

जब आप यह कहते हैं:

data = Top15[['Citable docs per Capita','Energy Supply per Capita']]
correlation = data.corr(method='pearson')

चूंकि, DataFrame.corr () फ़ंक्शन जोड़ी-वार सहसंबंध करता है, आपके पास दो चर से चार जोड़ी है। तो, मूल रूप से आपको ऑटो के सहसंबंध के रूप में विकर्ण मान मिल रहा है (स्वयं के साथ सहसंबंध, दो मूल्य चूंकि आपके पास दो चर हैं), और अन्य दो मान एक बनाम दूसरे के क्रॉस सहसंबंध के रूप में और इसके विपरीत।

या तो एक मूल्य प्राप्त करने के लिए दो श्रृंखलाओं के बीच सहसंबंध करें:

from scipy.stats.stats import pearsonr
docs_col = Top15['Citable docs per Capita'].values
energy_col = Top15['Energy Supply per Capita'].values
corr , _ = pearsonr(docs_col, energy_col)

या, यदि आप एक ही फ़ंक्शन (DataFrame का कॉस्ट) से एकल मान चाहते हैं:

single_value = correlation[0][1] 

उम्मीद है की यह मदद करेगा।


3

यह इस तरह काम करता है:

Top15['Citable docs per Capita']=np.float64(Top15['Citable docs per Capita'])

Top15['Energy Supply per Capita']=np.float64(Top15['Energy Supply per Capita'])

Top15['Energy Supply per Capita'].corr(Top15['Citable docs per Capita'])

1

मैंने डेटा प्रकार बदलकर इस समस्या को हल किया। यदि आप देखते हैं कि 'ऊर्जा आपूर्ति प्रति व्यक्ति' एक संख्यात्मक प्रकार है, जबकि 'कैपिटा डॉक्स प्रति व्यक्ति' एक वस्तु प्रकार है। मैंने कॉलम को फ्लोट का उपयोग करके एस्ट्राइप में बदल दिया। मुझे कुछ np फ़ंक्शंस के साथ भी यही समस्या थी: count_nonzeroऔर sumकाम किया meanऔर stdनहीं किया।


0

सहसंबंध से पहले 'कैपिटल डॉक्स प्रति कैपिटा' को संख्यात्मक में बदलना समस्या का समाधान करेगा।

    Top15['Citable docs per Capita'] = pd.to_numeric(Top15['Citable docs per Capita'])
    data = Top15[['Citable docs per Capita','Energy Supply per Capita']]
    correlation = data.corr(method='pearson')
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.