次のようなpandasのデータフレームTop15
があります。
.
一人あたりの引用可能な文書数を推定する列を作ります。
Top15['PopEst'] = Top15['Energy Supply'] / Top15['Energy Supply per Capita']
Top15['Citable docs per Capita'] = Top15['Citable documents'] / Top15['PopEst']
一人当たりの引用可能な文書数と一人当たりのエネルギー供給量の相関を知りたいのです。そこで、.corr()
メソッド(Pearson's correlation)を使います。
data = Top15[['Citable docs per Capita','Energy Supply per Capita']]
correlation = data.corr(method='pearson')
1つの数値を返したいのですが、結果は次のようになります。 .
実際のデータがないとお答えしにくいのですが、このようなものをお求めなのでしょう。
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
あなたが示した図では、相関行列の左上隅だけが表現されています(私は推測しています)。
この記事](https://stackoverflow.com/q/52466844/1534017)に例があります。
あるしきい値以上/以下のエントリをフィルタリングしたい場合は、この質問をチェックしてください。 相関係数のヒートマップをプロットしたい場合は、この回答をチェックすることができます。また、軸ラベルの重なりの問題に遭遇した場合は、次の投稿をチェックしてください。
同じ問題に遭遇しました。
どうやらCitable Documents per Person
はfloatだったようで、pythonはデフォルトでそれをスキップしていました。データフレームの他の列はすべてnumpy形式だったので、その列をnp.float64
に変換することで解決しました。
Top15['Citable Documents per Person']=np.float64(Top15['Citable Documents per Person'])
自分で計算した通りの列であることを忘れないでください。
すべての列のペアの相関関係を知りたい場合は、次のようにします。
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')])