45_Pandas.DataFrame计算每列之间的相关系数并用热图可视化
使用corr()方法计算pandas.DataFrame中各列之间的相关系数。
这里,将描述以下内容。
- pandas.DataFrame.corr()的基本用法
- 数据类型为数值型或布尔型的列的计算目标
- 排除并计算缺失值 NaN
- 指定如何计算相关系数:argument method
- 使用热图可视化相关系数:seaborn
以下面的pandas.DataFrame为例。
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
df = pd.DataFrame({'A': range(5),
'B': [x**2 for x in range(5)],
'C': [x**3 for x in range(5)]})
print(df)
# A B C
# 0 0 0 0
# 1 1 1 1
# 2 2 4 8
# 3 3 9 27
# 4 4 16 64
pandas.DataFrame.corr()的基本用法
从 pandas.DataFrame 对象调用 corr() 方法计算每列之间的相关系数。 结果在 pandas.DataFrame 中返回。
df_corr = df.corr()
print(df_corr)
print(type(df_corr))
# A B C
# A 1.000000 0.958927 0.905882
# B 0.958927 1.000000 0.987130
# C 0.905882 0.987130 1.000000
# <class 'pandas.core.frame.DataFrame'>
数据类型为数值型或布尔型的列的计算目标
添加字符串和布尔列以进行说明。
df['D'] = list('abcde')
df['E'] = [True, False, True, True, False]
print(df)
# A B C D E
# 0 0 0 0 a True
# 1 1 1 1 b False
# 2 2 4 8 c True
# 3 3 9 27 d True
# 4 4 16 64 e False
print(df.dtypes)
# A int64
# B int64
# C int64
# D object
# E bool
# dtype: object
corr()方法排除数据类型object(字符串)的列,计算numeric(int、float)和bool类型的列之间的相关系数。
对于 bool 类型,True 被视为 1,False 被视为 0。
df_corr = df.corr()
print(df_corr)
# A B C E
# A 1.000000 0.958927 0.905882 -0.288675
# B 0.958927 1.000000 0.987130 -0.346023
# C 0.905882 0.987130 1.000000 -0.424522
# E -0.288675 -0.346023 -0.424522 1.000000
排除并计算缺失值 NaN
准备一个包含缺失值 Nan 的 pandas.DataFrame 对象以供解释。
df_nan = df.copy()
df_nan.iloc[[2, 3, 4], 1] = np.nan
print(df_nan)
# A B C D E
# 0 0 0.0 0 a True
# 1 1 1.0 1 b False
# 2 2 NaN 8 c True
# 3 3 NaN 27 d True
# 4 4 NaN 64 e False
在corr()方法中,剔除缺失值NaN,计算相关系数。
df_nan_corr = df_nan.corr()
print(df_nan_corr)
# A B C E
# A 1.000000 1.0 0.905882 -0.288675
# B 1.000000 1.0 1.000000 -1.000000
# C 0.905882 1.0 1.000000 -0.424522
# E -0.288675 -1.0 -0.424522 1.000000
指定如何计算相关系数:method
在corr()方法中,可以通过argument方法指定计算相关系数的方法。
从以下三种类型中选择。
- ‘pearson’:皮尔逊积矩相关系数(默认)
- ‘kendall’:肯德尔等级相关系数
- ‘spearman’:斯皮尔曼等级相关系数
使用热图可视化相关系数:seaborn
Python 的可视化库 seaborn 可以很容易地将 pandas.DataFrame 可视化为热图,就像使用 corr() 一样。
sns.heatmap(df_corr, vmax=1, vmin=-1, center=0)
plt.savefig('./data/45/seaborn_heatmap_corr_example.png')
原始数据有很多列(特征),但是如上所述, corr() 方法排除了数据类型为 object 的列。
df_house = pd.read_csv('./data/45/house_prices_train.csv', index_col=0)
print(df_house.shape)
# (1460, 80)
print(df_house.dtypes.value_counts())
# object 43
# int64 34
# float64 3
# dtype: int64
df_house_corr = df_house.corr()
print(df_house_corr.shape)
# (37, 37)
用 seaborn.heatmap() 函数可视化。
fig, ax = plt.subplots(figsize=(12, 9))
sns.heatmap(df_house_corr, square=True, vmax=1, vmin=-1, center=0)
plt.savefig('./data/45/seaborn_heatmap_house_price.png')