দুটি কলামের মধ্যে পারস্পরিক সম্পর্ক পেতে .corr ব্যবহার করুন


127

আমার কাছে নীচের পান্ডাস ডেটাফ্রেম রয়েছে Top15: এখানে চিত্র বর্ণনা লিখুন

আমি এমন একটি কলাম তৈরি করেছি যা প্রতি ব্যক্তি কেবলি ডকুমেন্টের সংখ্যা অনুমান করে:

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

আমি মাথাপিছু যোগ্য কাগজপত্রের সংখ্যা এবং মাথাপিছু শক্তি সরবরাহের মধ্যে পারস্পরিক সম্পর্ক জানতে চাই। সুতরাং আমি .corr()পদ্ধতিটি (পিয়ারসনের পারস্পরিক সম্পর্ক) ব্যবহার করি :

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

আমি একটি একক নম্বর ফিরিয়ে দিতে চাই, তবে ফলাফলটি হ'ল: এখানে চিত্র বর্ণনা লিখুন


আমি আপনি ঠিক মনে করেন. তবে আপনি কি আমাকে বলতে পারেন যে 'ডেটা.কম' (পদ্ধতি = 'পেয়ারসন') কেবলমাত্র শক্তি সরবরাহ এবং শক্তি সরবরাহের মধ্যে সম্পর্ক ফিরিয়ে দেয় কেন?
টং Zhu

1
এটা না. এটি আপনাকে 2x2 ম্যাট্রিক্স প্রদান করবে; আপনি এর উপরের বাম এন্ট্রি দেখান আপনি যদি .corrসরাসরি আপনার ডেটাফ্রেমে আবেদন করেন তবে এটি সমস্ত জুটিযুক্ত সম্পর্কগুলি ফিরিয়ে দেবে; এজন্য আপনি তারপরে ম্যাট্রিক্সের তির্যকটিতে 1 টি পর্যবেক্ষণ করেন (প্রতিটি কলামই নিজেকে পুরোপুরিভাবে সংযুক্ত করে)। আমার সম্পাদনা নীচে দেখুন।
ক্লেব

1
দয়া করে একটি উত্তর গ্রহণ করার বিষয়টি বিবেচনা করুন যদি আপনি মনে করেন এটি আপনার প্রশ্নের উত্তর দিয়েছে
ম্যাকসু

1
আমি আপনার উত্তর গ্রহণ করেছি, আপনাকে ধন্যবাদ
টুং zhu

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, :]), খুব ভাল কাজ করবে। সমগ্র dataframe জন্য, আপনি কেবল জায়গা বদল করুন করতে পারেন: df.T.corr()
ক্লাব

আমি আপনার পরামর্শটি চেষ্টা করেছি তবে গণনাটি df.loc [2, 'বি'] = 4.5 ব্যবহার করে কলাম বিতে একটি মান পরিবর্তন করার পরেও 1 প্রদান করে। সম্ভবত আমি
গণনায়

@ ডাঃডুম: আমি আপনার কোডটি জানি না বলে সহায়তা করা কঠিন। আমি কি সঠিকভাবে বুঝতে পেরেছি যে উপরের থেকে আমার উদাহরণটি 1পরিবর্তে আপনার ক্ষেত্রে ফিরে আসে 0.99586?
ক্লিব

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 কলাম মধ্যে পারস্পরিক pairwise গনা করতে হয়
সেবাস্টিয়ান Wieckowski

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

যেহেতু ডেটাফ্রেম.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)

বা, যদি আপনি একই ফাংশন থেকে একক মান চান (ডেটাফ্রেমের কর):

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')
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.