.corrを使用して2つの列間の相関を取得する


126

私は次のパンダのデータフレームを持っていますTop15ここに画像の説明を入力してください

1人あたりの引用可能なドキュメントの数を推定する列を作成します。

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

単一の数値を返したいのですが、結果は次のとおりです。 ここに画像の説明を入力してください


私はあなたが正しいと思います。しかし、なぜ 'data.corr(method =' pearson ')'がエネルギー供給とエネルギー供給の関係しか返さないのか教えていただけますか?
tong zhu

1
ありません。2x2マトリックスが返されます。左上のエントリを表示します。.corrデータフレームに直接適用すると、すべてのペアワイズ相関が返されます。そのため、行列の対角線で1を観測します(各列はそれ自体と完全に相関しています)。以下の私の編集を参照してください。
Cleb

1
質問に対する回答が得られたと思われる場合は、回答を受け入れることを検討しください
MaxU

1
私はあなたの答えを受け入れました、ありがとう
tong zhu

28
この質問は、Courseraの「Pythonでのデータサイエンス入門」コースから直接出されたものです。具体的には、課題3、質問9です。インストラクターのChris Brooksが生徒にStack Overflowに質問を投稿するように勧めたとき、課題から逐語的に問題を投稿するつもりであるとは思いませんでした。
LS

回答:


208

実際のデータがないと質問に答えるのは難しいですが、私はあなたがこのようなものを探していると思います:

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

これにより、2つの列 '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ソリューションにs が含まれる場合があります- 例については、この投稿を確認してください。

特定のしきい値を超える/下回るエントリをフィルタリングする場合は、この質問を確認できます。相関係数のヒートマップをプロットする場合は、この回答を確認できます。軸ラベルの重複で問題が発生した場合は、次の投稿を確認してください。


これは行ごとに適用できますか?
Dr.DOOM 2018

1
@ Dr.DOOM:はい、シリーズが必要なので、たとえば問題df.loc[1, :].corr(df.loc[2, :])なく動作します。データフレーム全体については、単純に転置できますdf.T.corr()
Cleb

私はあなたの提案を試しましたが、df.loc [2、 'B'] = 4.5を使用して列Bのa値を変更した後でも、計算はまだ1を返します。多分

@ Dr.DOOM:私はあなたのコードを知らないので助けるのは難しいです。私の上記の例1があなたの場合にではなく 戻ることを正しく理解しました0.99586か?
Cleb

1
@Cleb:ええと、私が作業しているコンテキストでは、すべての高レベルのマルチカラムインデックスに同じサブレイヤがあります。:私が何をしようとしています何のためにこの質問を参照してくださいstackoverflow.com/questions/57513002/...
エイドリアンKeister

7

同じ問題に遭遇しました。登場Citable Documents per Personフロートだった、とPythonはデフォルトで何とかそれをスキップします。私のデータフレームの他のすべての列はnumpy形式であったので、columntを次のように変換することで解決しました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つ以上の列間の相関をペアワイズで計算できるため、適切なオプションです。
SébastienWieckowski

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()関数はペアワイズ相関を実行するため、2つの変数から4つのペアが得られます。したがって、基本的には対角値を自動相関として取得し(それ自体との相関、2つの変数があるため2つの値)、他の2つの値は相互の相互相関として、またその逆として取得します。

2つのシリーズ間の相関を実行して、単一の値を取得します。

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のcorr):

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

この問題は、データ型を変更することで解決しました。「1人あたりのエネルギー供給」が数値タイプであるのに対し、「1人あたりの引用可能なドキュメント」はオブジェクトタイプです。astypeを使用して列を浮動小数点に変換しました。私はいくつかのNP機能と同じ問題を抱えていた:count_nonzerosumしながら働いていたmeanstdしませんでした。


0

相関が問題を解決する前に、「Citable docs per Capita」を数値に変更します。

    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.