如何计算Pandas中分组数量的相关系数?

How to calculate the correlation coefficient of grouped quantities in Pandas?

我有一个DataFrame,其中每一行代表一起交通事故。其中两列是 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

我发现以下方法使用两个辅助 DataFrames:

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

这证实了 scipy.stats.pearsonr 获得的结果。虽然它仍然不是很优雅,但我会很感激改进建议。

您可以直接使用 groupby 数据的 mean 而不是计数和求和,然后使用 series corr(默认方法是 pearson)即

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

输出:

0.99926008128973687