İki sütun arasındaki korelasyonu elde etmek için .corr kullanın


127

Aşağıdaki pandalar veri çerçevesine sahibim Top15: görüntü açıklamasını buraya girin

Kişi başına alıntı yapılabilir belge sayısını tahmin eden bir sütun oluşturuyorum:

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

Kişi başına atıfta bulunulabilir belge sayısı ile kişi başına enerji arzı arasındaki ilişkiyi bilmek istiyorum. Bu yüzden .corr()yöntemi kullanıyorum (Pearson korelasyonu):

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

Tek bir sayı döndürmek istiyorum, ancak sonuç: görüntü açıklamasını buraya girin


Bence haklısın. Ama bana 'data.corr (method =' pearson ')' öğesinin neden sadece Enerji Arzı ile Enerji Suppy arasındaki ilişkiyi döndürdüğünü söyleyebilir misiniz?
tong zhu

1
O değil. Size 2x2'lik bir matris döndürmelidir; sol üstteki girişi gösterirsiniz. Eğer geçerli değilse .corrsizin dataframe doğrudan, bu tüm ikili korelasyon döndürür; bu yüzden matrisinizin köşegeninde 1'ler gözlemlersiniz (her sütun kendisiyle mükemmel bir şekilde ilişkilidir). Aşağıdaki düzenlememe bakın.
Cleb

1
Lütfen sorunuza cevap verdiğini düşünüyorsanız bir cevabı kabul etmeyi düşünün
MaxU

1
Cevabınızı kabul ettim, teşekkür ederim
tong zhu

29
Bu soru doğrudan Coursera'daki "Python'da Veri Bilimine Giriş" kursundan. Özellikle, ödev 3, soru 9. Eğitmen Chris Brooks, öğrencileri Stack Overflow'a soru göndermeye teşvik ettiğinde, ödevlerdeki problemleri kelimesi kelimesine yayınlamaları gerektiğini kastettiğini sanmıyorum.
LS

Yanıtlar:


210

Gerçek veriler olmadan soruyu cevaplamak zor ama sanırım şuna benzer bir şey arıyorsunuz:

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

Bu, iki sütununuz arasındaki korelasyonu hesaplar 'Citable docs per Capita' ve 'Energy Supply per Capita'.

Bir örnek vermek gerekirse:

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

Sonra

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

1beklendiği gibi verir .

Şimdi, bir değeri değiştirirseniz, örneğin

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

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

komuta

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

İadeler

0.99586

Beklendiği gibi hala 1'e yakın.

Eğer geçerli değilse .corrsizin dataframe doğrudan, sizin sütunlar arasındaki tüm ikili korelasyon dönecektir ; bu yüzden 1smatrisinizin köşegenini gözlemlersiniz (her sütun kendisiyle mükemmel bir şekilde ilişkilidir).

df.corr()

bu nedenle geri dönecek

          A         B
A  1.000000  0.995862
B  0.995862  1.000000

Gösterdiğiniz grafikte, korelasyon matrisinin yalnızca sol üst köşesi temsil edilmektedir (varsayıyorum).

NaNÇözümünüzde s aldığınız durumlar olabilir - bir örnek için bu gönderiye bakın.

Belirli bir eşiğin üzerindeki / altındaki girişleri filtrelemek istiyorsanız, bu soruyu kontrol edebilirsiniz . Korelasyon katsayılarının bir ısı haritasını çizmek istiyorsanız, bu cevabı kontrol edebilir ve daha sonra çakışan eksen etiketleri ile sorunla karşılaşırsanız aşağıdaki gönderiyi kontrol edebilirsiniz .


bu satır bazında uygulanabilir mi?
Dr.DOOM

1
@ Dr.DOOM: Evet, sadece diziler alıyor, yani örneğin df.loc[1, :].corr(df.loc[2, :])iyi çalışacak. Tüm dataframe için, sadece devrik edebilirsiniz: df.T.corr().
Cleb

Önerinizi denedim, ancak df.loc [2, 'B'] = 4.5 kullanarak B sütunundaki a değerini değiştirdikten sonra bile hesaplama hala 1 döndürüyor. belki hesaplamada kafam karıştı
Dr.DOOM

@ Dr.DOOM: Kodunuzu bilmediğim için yardım etmek zor. Yukarıdaki örneğimin 1sizin durumunuzda yerine döndüğünü doğru anladım 0.99586mı?
Cleb

1
@Cleb: Çalıştığım bağlamda, her üst düzey çok sütunlu dizinin aynı alt katmanları var. Yapmaya çalıştığım şey için şu soruya bakın: stackoverflow.com/questions/57513002/…
Adrian Keister

7

Ben de aynı sorunla karşılaştım. Göründü Citable Documents per Personbir float oldu ve piton varsayılan olarak şekilde onu atlar. Veri çerçevemin diğer tüm sütunları nümpy biçimliydi, bu yüzden sütunu sütununa dönüştürerek çözdümnp.float64

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

Unutma, tam olarak senin hesapladığın sütun


6

Çözümüm, verileri sayısal türe dönüştürdükten sonra olurdu:

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

sütunları seçmek ve ardından .corr () yöntemini uygulamak iyi bir seçenektir, çünkü 2'den fazla sütun arasındaki korelasyonu ikili olarak hesaplayabiliriz
Sébastien Wieckowski

4

Tüm sütun çiftleri arasındaki korelasyonu istiyorsanız, şöyle bir şey yapabilirsiniz:

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

Bunu aradığınızda:

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

DataFrame.corr () işlevi çift yönlü korelasyonlar gerçekleştirdiğinden, iki değişkenden dört çiftiniz vardır. Yani, temel olarak, otomatik korelasyon (kendisiyle korelasyon, iki değişkeniniz olduğundan iki değer) ve diğer iki değeri birbiriyle çapraz korelasyon olarak ve tam tersi olarak köşegen değerler alıyorsunuz.

Tek bir değer elde etmek için iki seri arasında korelasyon gerçekleştirin:

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)

veya aynı işlevden tek bir değer istiyorsanız (DataFrame'in düzeltmesi):

single_value = correlation[0][1] 

Bu yardımcı olur umarım.


3

Şöyle çalışır:

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

Veri türünü değiştirerek bu sorunu çözdüm. 'Kişi Başına Enerji Arzı' sayısal bir tür, 'Kişi Başına Vatandaşlık Belgeleri' ise bir nesne türüdür. Astype kullanarak sütunu float'a dönüştürdüm. Bazı np işlevleriyle aynı sorunu yaşadım: count_nonzerove bir sumsüre çalıştım meanve stdçalışmadım.


0

Korelasyondan önce 'Kişi başına atıfta bulunulabilir belgelerin' sayısal olarak değiştirilmesi sorunu çözecektir.

    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')
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.