一、熱力圖(heatmap)
熱力圖可以看出兩個屬性之間的相關(guān)系數(shù)。
- 舉例一,以Titanic數(shù)據(jù)為例:紅色(正相關(guān))或者藍色(負相關(guān))顏色越深說明相關(guān)性越強。
plt.figure(figsize=(12,10))
foo = sns.heatmap(train.drop('PassengerId',axis=1).corr(), vmax=0.6, square=True, annot=True)
熱力圖1
- 舉例二:網(wǎng)上找的示例
import matplotlib.pyplot as plt
import seaborn as sns
data = pd.read_csv("../input/car_crashes.csv")
data = data.corr()
sns.heatmap(data)
plt.show()
熱力圖2
二、矩陣圖pairplot
當(dāng)數(shù)據(jù)的特征維度大于2時,無法在平面上表征這些維度,seaborn提供了pairplot。兩兩組成pair看數(shù)據(jù)在2個維度平面上的分布情況。
圖中點的顏色按照結(jié)果種類(class=0\1\2...)區(qū)分。對角線位置是直方圖,其它位置是散點圖。pairplot更適合大量散點的場景,更容易看出變量間的相關(guān)性。
- 舉例一:Titanic數(shù)據(jù),nosurv_col未獲救,紅色,surv_col獲救,藍色。這是一個典型不適合的場景,基本上看不出相關(guān)性。vars選擇的是整個cols
cols = ['Survived','Pclass','Age','SibSp','Parch','Fare']
g = sns.pairplot(data=train.dropna(), vars=cols, size=1.5,
hue='Survived', palette=[nosurv_col,surv_col])
g.set(xticklabels=[])
pairplot圖形1
- 舉例二:網(wǎng)上找的案例,TV\Radio\Newpaper和sales間的關(guān)系,x_vars=['TV','Radio','Newspaper'],y_vars='Sales'
import seaborn as sns
sns.pairplot(data,x_vars=['TV','Radio','Newspaper'],y_vars='Sales',size=7,aspect=0.8)
pairplot圖形2
seaborn的pairplot函數(shù)繪制X的每一維度和對應(yīng)Y的散點圖。通過設(shè)置size和aspect參數(shù)來調(diào)節(jié)顯示的大小和比例。可以從圖中看出,TV特征和銷量是有比較強的線性關(guān)系的,而Radio和Sales線性關(guān)系弱一些,Newspaper和Sales線性關(guān)系更弱。通過加入一個參數(shù)kind=’reg’,seaborn可以添加一條最佳擬合直線和95%的置信帶。
sns.pairplot(data, x_vars=['TV','Radio','Newspaper'], y_vars='Sales', size=7, aspect=0.8, kind='reg')
pairplot圖形3
舉例三:來自大牛寒小陽的博客
import matplotlib.pyplot as plt
import seaborn as sns
#使用pairplot看不同特征維度pair下數(shù)據(jù)的空間分布狀況
_=sns.pairplot(df[:50],vars=[8,11,12,14,19],hue="class",size=1.5)
plt.show()
pairplot圖形4
解讀:從柱狀圖看,第11維和第14維看起來是近似線性可分的;從散列圖看,第12和19維之間呈現(xiàn)出很高的負相關(guān)性。
接著用Seaborn的corrplot
import matplotlib.pyplot as plt
plt.figure(figsize=(12,10))
_=sns.corrplot(df,annot=False)
plt.show()
各維度間的相關(guān)性
解讀:最后一行是最終的類別(class=0/1/2..)。
從最后一行看,第11維的特征和類別間有極強的相關(guān)性,同理第14維。從交叉各行看,第11維特征和第14維特征之間也有極高的相關(guān)性;第12維特征和第19維特征間有極強的負相關(guān)性。強相關(guān)的特征其實包含了一些冗余的特征,而除掉上圖中顏色較深的特征,其余特征包含的信息量就沒有這么大了,它們和最后的類別相關(guān)度不高,甚至各自之間也沒什么先慣性。插一句,這里的維度只有20,所以這個相關(guān)度計算并不費太大力氣,然而實際情形中,你完全有可能有遠高于這個數(shù)字的特征維度,同時樣本量也可能多很多,那種情形下我們可能要先做一些處理,再來實現(xiàn)可視化了。
三、直方圖distplot
distplot(seaborn)是加強版的hist(pandas),都是做直方圖
- 舉例一:Titanic數(shù)據(jù),直方圖自動得出[0,1),[1,2)...范圍內(nèi)獲救/未獲救的人數(shù),并畫出圖形。
fig, ax = plt.subplots()
sns.distplot(surv['Age'].dropna().values, bins=range(0, 81, 1), ax=ax, kde=False, color="blue")
sns.distplot(nosurv['Age'].dropna().values, bins=range(0, 81, 1), ax=ax, kde=False, color="red")
ax.set_xlim([0, 82])
print("Median age survivors: %.1f, Median age non-survivers: %.1f"\
%(np.median(surv['Age'].dropna()), np.median(nosurv['Age'].dropna())))
直方圖1
圖中,藍色是獲救的,紅色是未獲救的。既有獲救又有未獲救是圖中紫色部分。從圖中可以看出10歲以下獲救概率高,18-30之間很少獲救。
- 舉例二:網(wǎng)上的數(shù)據(jù),對比hist()和distplot()的區(qū)別
import matplotlib.pyplot as plt
import seaborn as sns #要注意的是一旦導(dǎo)入了seaborn,matplotlib的默認作圖風(fēng)格就會被覆蓋成seaborn的格式
%matplotlib inline # 為了在jupyter notebook里作圖,需要用到這個命令
sns.distplot(births['prglngth'])
sns.plt.show()
直方圖2
可以看出distplot()與hist()的最大區(qū)別是有一條密度曲線(KDE),可以設(shè)置參數(shù)去掉這條默認的曲線。
sns.distplot(births['prglngth'], kde=False)
sns.plt.show()
直方圖3
四、直方圖hist
- 舉例:以Titanic為例,考量fare與survive之間的關(guān)系
#fare有等于0的,所以要+1
dummy = plt.hist(np.log10(surv['Fare'].values+ 1), color="orange", normed=True)
dummy = plt.hist(np.log10(nosurv['Fare'].values+ 1), histtype='step', color="blue", normed=True)
直方圖
五、堆積直方圖
在作圖之前,先理解crosstab
df = DataFrame({'key1':['a','a','b','b','a'],'key2':['one','two','one','two','one'],'data1':np.random.randn(5),'data2':np.random.randn(5)})
df
#[Out]# data1 data2 key1 key2
#[Out]# 0 0.439801 1.582861 a one
#[Out]# 1 -1.388267 -0.603653 a two
#[Out]# 2 -0.514400 -0.826736 b one
#[Out]# 3 -1.487224 -0.192404 b two
#[Out]# 4 2.169966 0.074715 a one
pd.crosstab(df.key1,df.key2, margins=True)
#[Out]# key2 one two All
#[Out]# key1
#[Out]# a 2 1 3
#[Out]# b 1 1 2
#[Out]# All 3 2 5
參考1
類似crosstab做分類的,還有:groupby\pivot_table,
參考2
對于分類型的特征,用累積直方圖還是很合適的。
- 舉例:Titanic
tab.sum(1),每個class的總和,注意縱軸是percentage
tab = pd.crosstab(train['Pclass'], train['Survived'])
print(tab)
dummy = tab.div(tab.sum(1).astype(float), axis=0).plot(kind="bar", stacked=True)
dummy = plt.xlabel('Pclass')
dummy = plt.ylabel('Percentage')
綠色是survived,可以看出1st class獲救率更高。
累積直方圖1
如果dummpy改為
dummy = tab.div(tab.sum(1).astype(float), axis=0).plot(kind="bar")
對比直方圖
同理,性別屬性也可以用累積直方圖
sex = pd.crosstab(train['Sex'], train['Survived'])
print(sex)
dummy = sex.div(sex.sum(1).astype(float), axis=0).plot(kind="bar", stacked=True)
dummy = plt.xlabel('Sex')
dummy = plt.ylabel('Percentage')
累積直方圖2