Ikki ustun o'rtasidagi korrelyatni olish uchun .corr dan foydalaning

I have the following pandas dataframe Top15: enter image description here

Inson boshiga tushadigan hujjatlarning sonini hisoblaydigan ustun yarataman:

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

Aholi jon boshiga to'g'ri keladigan hujjatlar va aholi jon boshiga to'g'ri keladigan energiya manbalari o'rtasidagi munosabatlarni bilishni istayman. Shuning uchun .corr() usulini (Pearsonning korrelyatsiyasi) ishlataman:

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

I want to return a single number, but the result is: enter image description here

42
Yo'q. Sizga 2x2 matritsani qaytarish kerak; uning yuqori chap burchagini ko'rsatasiz. Agar siz .corr -ni to'g'ridan-to'g'ri dataframe-ga qo'llasangiz, u barcha juftlik korrelyatsiyasini qaytaradi; shuning uchun siz matritsangizning diagonalida 1-raqamlarni kuzatasiz (har bir ustun o'zi bilan mutlaqo bog'liq). Quyidagi tahrirni ko'ring.
qo'shib qo'ydi muallif Cleb, manba
Iltimos, agar sizning savolingizga javob bergan deb hisoblasangiz, javobni qabul qiling .
qo'shib qo'ydi muallif MaxU, manba
Bu savol Coursera-da "Python da Data Science'e Kirish" kursi. Xususan, topshiriq 3, savol 9. O'qituvchi Chris Brooks talabalarni Stack Overflowga savollar berishga undashganda, men ularning so'zlashuvlardagi muammolarni yozishi kerakligini anglatmaydi deb o'ylayman.
qo'shib qo'ydi muallif L S, manba
O'ylaymanki, siz haqsiz. Lekin nima uchun "data.corr (usuli =" pearson ") faqat energiya ta'minoti va energiya ta'minoti o'rtasidagi munosabatni qaytaradi?
qo'shib qo'ydi muallif tong zhu, manba
Sizning javobingizni qabul qildim, rahmat
qo'shib qo'ydi muallif tong zhu, manba
Siz aytgan tugmani topa olmadim. Sizning javobingiz yonidagi yuqori o'qni bosing
qo'shib qo'ydi muallif tong zhu, manba

6 javoblar

Haqiqiy ma'lumotsiz, savolga javob berish qiyin, biroq shunga o'xshash narsalarni izlayapsiz deb o'ylayman:

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

Bu ikki sütununuzun 'Kontaktlar boshiga yaraydigan hujjatlar' va 'Energiya iste'moli> o'rtasidagi o'zaro bog'liqlikni hisoblab chiqadi.

Misol berish uchun:

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

Keyin

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

kutilganidek 1 ni beradi.

Endi siz qiymatni o'zgartirsangiz, masalan.

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

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

buyruq

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

qaytaradi

0.99586

kutilayotganidek 1 ga yaqin.

If you apply .corr directly to your dataframe, it will return all pairwise correlations between your columns; that's why you Keyin observe 1s at the diagonal of your matrix (each column is perfectly correlated with itself).

df.corr()

Shuning uchun qaytib keladi

          A         B
A  1.000000  0.995862
B  0.995862  1.000000

Siz ko'rsatadigan grafikada korrelyatsiya matritsasining faqat yuqori chap burchagi ko'rinadi (menimcha).

If you want to filter entries above/below a certain threshold, you can check this question. If you want to plot a heatmap of the correlation coefficients, you can check this answer and if you Keyin run into the issue with overlapping axis-labels check the following post.

75
qo'shib qo'ydi
@ Dr.DOOM: Ha, faqatgina ketma-ket ketadi, masalan. df.loc [1,:]. corr (df.loc [2,:]) ham yaxshi ishlaydi. Barcha dataframe uchun oddiygina ko'chirishingiz mumkin: df.T.corr() .
qo'shib qo'ydi muallif Cleb, manba
@ Dr.DOOM: O'z kodingizni bilmasligim ham qiyin. Yuqoridagi misolni 0.99586 o'rniga sizning holatingizda 1 qaytarishini to'g'ri tushundimmi?
qo'shib qo'ydi muallif Cleb, manba
@ Dr.DOOM: Ko'paytirish mumkin emas. np.random.seed (0) bilan 0.771616539283 bo'lsin. Ushbu urug 'bilan harakat qila olasizmi?
qo'shib qo'ydi muallif Cleb, manba
@laura: ma'lumotlarni bilmasdan aytish qiyin. Ehtimol, siz yangi savolni ochib, uni mos yozuvlar sifatida foydalanishingiz mumkin !? Qayta ishlab chiqilgan namunaga ega bo'lishni unutmang.
qo'shib qo'ydi muallif Cleb, manba
Dataset hajmi 500 * 10 bo'lsa, dataset.corr() matritsani 10 * 10 chiqishi kerak, lekin u 1 * 1 chiqish matrisi beradi ... nima uchun?
qo'shib qo'ydi muallif laura, manba
bu satrda qo'llanilishi mumkinmi?
qo'shib qo'ydi muallif Dr.DOOM, manba
Df.loc [2, 'B'] = 4.5 'ni qo'llagan holda, sizning taklifingizni sinab ko'rdim, ammo hisob-kitob hali ham 1 ga qaytadi. Ehtimol, hisob-kitobda shunchaki aralashib qoldim
qo'shib qo'ydi muallif Dr.DOOM, manba
Ha, men sizning kodingizni ishlatganman. har doim 1 qaytadi
qo'shib qo'ydi muallif Dr.DOOM, manba
Np misolida pd importni o'rniga import pandalarini sinab ko'ring example_df = pd.DataFrame (np.random.randn (5, 5), np.arange (5)) print example_df print example_df.iloc [1,:] print example_df.iloc [2,:] print example_df.iloc [1,:]. Corr (example_df.iloc [2,:])
qo'shib qo'ydi muallif Dr.DOOM, manba
qo'shib qo'ydi muallif Dr.DOOM, manba

I ran into the same issue. It appeared Citable Documents per Person was a float, and python skips it somehow by default. All the other columns of my dataframe were in numpy-formats, so I solved it by converting the columnt to np.float64

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

O'zingiz hisoblaydigan ustun aniq ekanligini eslang

6
qo'shib qo'ydi

Agar siz barcha ustunlar juftlari orasidagi korrelyatsiyalarni xohlasangiz, shunday qilishingiz mumkin:

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')])
1
qo'shib qo'ydi

Ma'lumotlarim raqamli turga aylantirilgandan keyin mening halim bo'ladi:

Top15[['Citable docs per Capita','Energy Supply per Capita']].corr()
0
qo'shib qo'ydi

Ma'lumotlar turini o'zgartirish orqali ushbu muammoni hal qildim. "Aholi jon boshiga energiya ta'minoti" raqamini ko'rsangiz, "Kontaktlar uchun yaroqli hujjatlar" obyekt turi hisoblanadi. Ustunni astype yordamida float qilishga aylantirdim. count_nonzero va sum kodlari ishlamasa va std ishlatilmadi.

0
qo'shib qo'ydi

Siz buni chaqirganingizda:

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

DataFrame.corr() funktsiyasi juftlik bilan o'zaro bog'liqlikni amalga oshirganligi sababli, siz ikkita o'zgaruvchidan to'rtta juftlikka egasiz. Shunday qilib, asosan siz diagonal qiymatlarni avto-korrelyatsiya (o'zingiz bilan korrelyatsiya qilish, ikkita o'zgaruvchiga ega bo'lganingizdan beri ikkita qiymat) va boshqa ikkita qiymat bir-birining boshqasiga va boshqasiga o'zaro bog'liqlik sifatida olinadi.

Bitta qiymatga ega bo'lish uchun ikkita ketma-ketlik o'rtasidagi o'zaro bog'liqlikni bajarish kerak:

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)

yoki, agar siz bir xil funktsiyadan bitta qiymatni (DataFrame ning corr) istasangiz:

single_value = correlation[0][1] 

Umid qilamanki bu yordam.

0
qo'shib qo'ydi
Python
Python
372 ishtirokchilar

Bu guruh python dasturlash tilini muhokama qilish uchun. Iltimos, o'zingizni hurmat qiling va faqat dasturlash bo'yicha yozing. Botlar mavzusini @botlarhaqida guruhida muhokama qling! FAQ: @PyFAQ Offtopic: @python_uz_offtopic

Python offtopic group !
Python offtopic group !
150 ishtirokchilar

@python_uz gruppasining offtop gruppasi. offtop bo'lsa ham reklama mumkin emas ) Boshqa dasturlash tiliga oid gruppalar @languages_programming