web-dev-qa-db-ja.com

2列間の相関を取得するには、.corrを使用します。

次のパンダデータフレームTop15があります。 enter image description here

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

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

1人当たりの引用可能文書数と1人当たりのエネルギー供給量の間の相関関係を知りたい。だから私は.corr()メソッド(ピアソンの相関)を使用します:

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

単一の数値を返したいのですが、結果は次のようになります。 enter image description here

78
tong zhu

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

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

あなたが示すグラフィックでは、相関行列の左上隅だけが表されています(私は仮定します)。

あなたのソリューションにNaNsが含まれる場合があります - 例として この投稿 をチェックしてください。

特定のしきい値より上または下のエントリをフィルタリングする場合は、 この質問 をチェックできます。相関係数のヒートマップをプロットしたい場合は、 この回答 をチェックして、重なっている軸ラベルで問題に遭遇した場合は、 次の投稿 をチェックしてください。

138
Cleb

私は同じ問題に遭遇しました。 Citable Documents per Personはフロートであるように見えました、そして、Pythonはデフォルトでどうにかそれをスキップします。私のデータフレームの他の全ての列はぎこちないフォーマットでした、それで私は列をnp.float64に変換することによってそれを解決しました

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

それはあなたが自分で計算したものと全く同じです。

6
Gary

それはこのように動作します:

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
Orca

列のすべてのペア間の相関関係が必要な場合は、次のようにします。

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
mgoldwasser

あなたがこれを呼ぶと:

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

DataFrame.corr()関数はペアワイズ相関を実行するため、2つの変数から4つのペアが得られます。そのため、基本的には対角値を自己相関(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] 

お役に立てれば。

1
aumpen

私の解決策はデータを数値型に変換した後でしょう:

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

データ型を変更してこの問題を解決しました。 「1人当たりのエネルギー供給」が数値タイプであるのがわかる場合、「1人当たりのCitable文書」はオブジェクトタイプです。 astypeを使ってカラムをfloatに変換しました。私はいくつかのnp関数で同じ問題を抱えていました:count_nonzerosumはうまくいきましたが、meanstdはうまくいきませんでした。

0
BID