sns.heatmap() 热地图,包括传统的,下三角,重点(挖空)相关性性图
sns.heatmap() 热地图
我一般使用来画特征相关系数的图
seaborn.heatmap(data, vmin=None, vmax=None, cmap=None, center=None, robust=False, annot=None, fmt='.2g',
annotkws=None, linewidths=0, linecolor='white', cbar=True, cbarkws=None, cbar_ax=None, square=False,
ax=None, xticklabels=True, yticklabels=True, mask=None, **kwargs)
参数太多就不一一解释了,我就用配置好的,以后都套着用,
注意,计算相关系数时,只计算数据型的的特征,object不能计算
import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns # 读取数据文件 telcom=pd.read_csv('F:\\python\\电信用户数据\\WA_Fn-UseC_-Telco-Customer-Churn.csv') # 提取特征 charges=telcom.iloc[:,1:20] # 对特征进行编码 """ 离散特征的编码分为两种情况: 1、离散特征的取值之间没有大小的意义,比如color:[red,blue],那么就使用one-hot编码 2、离散特征的取值有大小的意义,比如size:[X,XL,XXL],那么就使用数值的映射{X:1,XL:2,XXL:3} """ corrDf = charges.apply(lambda x: pd.factorize(x)[0]) corrDf .head() corrDf.info() # 构造相关性矩阵 corr = corrDf.corr() corr # 使用热地图显示相关系数 ''' heatmap 使用热地图展示系数矩阵情况 linewidths 热力图矩阵之间的间隔大小 annot 设定是否显示每个色块的系数值 ''' plt.figure(figsize=(20,16)) ax = sns.heatmap(corr, xticklabels=corr.columns, yticklabels=corr.columns, linewidths=0.2, cmap="YlGnBu",annot=True) plt.title("Correlation between variables")
当然描述相关系数时还可以画条形图,特别是描述各特征和y值的相关程度时,还要注意,corr只对数据型数据进行计算
# 使用one-hot编码 tel_dummies = pd.get_dummies(telcom.iloc[:,1:21]) tel_dummies.head() tel_dummies.info() # 电信用户是否流失与各变量之间的相关性 plt.figure(figsize=(15,8)) tel_dummies.corr()['Churn'].sort_values(ascending = False).plot(kind='bar') plt.title("Correlations between Churn and variables")
只画下三角的地热图
fig = plt.figure(figsize = [15,10]) mask = np.zeros_like(finalTrain.corr(), dtype=np.bool) mask[np.triu_indices_from(mask)] = True sns.heatmap(finalTrain.corr(), cmap=sns.diverging_palette(150, 275, s=80, l=55, n=9), mask = mask, annot=True, center = 0) plt.title("Correlation Matrix (HeatMap)", fontsize = 15)
20210407补充重点相关性图
下三角矩阵好像变得更加简洁了,可还是有些多有些乱,虽然我们可以依据颜色的深浅来判别特征之间的强弱相关性,但还是不太方便。我们能不能找出我们所希望看到的那块呢?比如:
- 我们只想找到强相关的特征来可视化,其余的全部过滤掉。
其实是可以的,在seaborn数据包的heatmap函数中,还有一个mask函数,可以帮助我们筛选出我们希望看到的部分,例如我们只想看相关性大于0.5的部分
import numpy as np import pandas as pd import seaborn as sns import matplotlib.pyplot as plt %matplotlib inline from sklearn.datasets import load_iris iris=load_iris() iris.data iris.target iris.feature_names df=pd.DataFrame(iris.data,columns=iris.feature_names) iris.target_names df['taget']= iris.target # Calculate pairwise-correlation matrix = df.corr() cmap = sns.diverging_palette(250, 15, s=75, l=40, n=9, center="light", as_cmap=True) # mask掉上三角 & 小于某个阈值的值 mask1 = np.triu(np.ones_like(matrix, dtype=bool)) mask2 = np.abs(matrix) <= 0.5 mask = mask1 | mask2 plt.figure(figsize=(12, 8)) sns.heatmap(matrix, mask=mask, center=0, annot=True,fmt='.2f', square=True, cmap=cmap)