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) 

 

 

 

 

 

posted on 2020-07-21 17:39  小小喽啰  阅读(15542)  评论(0编辑  收藏  举报