2017-10-29 2 views
1

私はDataFrameですが、各行は交通事故を表しています。列のうちの2つはSpeed_limitNumber_of_casualtiesです。私はスピードリミットと各スピードリミットの事故に対する死傷者数の比のピアソン相関係数を計算したいと思います。パンダでグループ分けされた量の相関係数を計算するには?

これまで

私のソリューション配列として、関連量を取得し、scipyのダウンロードのpearsonrを使用することです:

import pandas as pd 
import scipy.stats 

df = pd.DataFrame({'Speed_limit': [10, 10, 20, 20, 20, 30], 
        'Number_of_casualties': [1, 2, 3, 4, 1, 4]}) 

accidents_per_speed_limit = df['Speed_limit'].value_counts().sort_index() 

number_of_casualties_per_speed_limit = df.groupby('Speed_limit').sum()['Number_of_casualties'] 

speed_limit = accidents_per_speed_limit.index 
ratio = number_of_casualties_per_speed_limit.values/accidents_per_speed_limit.values 

r, _ = scipy.stats.pearsonr(x=speed_limit, y=ratio) 

print("The Pearson's correlation coefficient between the number of casualties per accidents and the speed limit is {r}.".format(r=r)) 

しかし、pandas.DataFrame.corrメソッドを使用して、よりエレガントにこれを行うことが可能であるべきであるように私には思われます。どのようにしてこのコードをリファクタリングして、それをもっとpandasのようにすることができますか?

答えて

2

代わりの数とあなたが直接、その後series corrを使用します(デフォルトの方法では、ピアソンある)GROUPBYデータのmeanを使用使用することができ、合計すなわち

m = df.groupby('Speed_limit').mean().reset_index() 
m['Speed_limit'].corr(m['Number_of_casualties']) 

出力:

0.99926008128973687 
1

私は2つの補助DataFramesを使用して、以下の方法を発見した:scipy.stats.pearsonrで得られた結果を裏付ける

df_aux = df.groupby('Speed_limit').agg(['count', 'sum']) 
df_aux2 = pd.DataFrame({'ratio': df_aux['Number_of_casualties', 'sum']/df_aux['Number_of_casualties', 'count'], 
         'speed_limit': df_aux.index}) 
print(df_aux2.corr()['ratio']['speed_limit']) 

。それはまだ非常にエレガントではない、と私は改善のための提案をありがとうと思います。

+1

代わりに、カウントと合計私たちの直接平均を使用することができます。 – Dark

関連する問題