次のパンダデータフレームTop15
があります。
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')
単一の数値を返したいのですが、結果は次のようになります。
実際のデータがないと質問に答えるのは難しいですが、私はあなたがこのようなものを探していると思います:
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が含まれる場合があります - 例として この投稿 をチェックしてください。
特定のしきい値より上または下のエントリをフィルタリングする場合は、 この質問 をチェックできます。相関係数のヒートマップをプロットしたい場合は、 この回答 をチェックして、重なっている軸ラベルで問題に遭遇した場合は、 次の投稿 をチェックしてください。
私は同じ問題に遭遇しました。 Citable Documents per Person
はフロートであるように見えました、そして、Pythonはデフォルトでどうにかそれをスキップします。私のデータフレームの他の全ての列はぎこちないフォーマットでした、それで私は列をnp.float64
に変換することによってそれを解決しました
Top15['Citable Documents per Person']=np.float64(Top15['Citable Documents per Person'])
それはあなたが自分で計算したものと全く同じです。
それはこのように動作します:
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'])
列のすべてのペア間の相関関係が必要な場合は、次のようにします。
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')])
あなたがこれを呼ぶと:
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]
お役に立てれば。
私の解決策はデータを数値型に変換した後でしょう:
Top15[['Citable docs per Capita','Energy Supply per Capita']].corr()
データ型を変更してこの問題を解決しました。 「1人当たりのエネルギー供給」が数値タイプであるのがわかる場合、「1人当たりのCitable文書」はオブジェクトタイプです。 astypeを使ってカラムをfloatに変換しました。私はいくつかのnp関数で同じ問題を抱えていました:count_nonzero
とsum
はうまくいきましたが、mean
とstd
はうまくいきませんでした。