一卜范、熱力圖(heatmap)
熱力圖可以看出兩個(gè)屬性之間的相關(guān)系數(shù)。
- 舉例一,以Titanic數(shù)據(jù)為例:紅色(正相關(guān))或者藍(lán)色(負(fù)相關(guān))顏色越深說(shuō)明相關(guān)性越強(qiáng)迁匠。
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時(shí)驹溃,無(wú)法在平面上表征這些維度城丧,seaborn提供了pairplot。兩兩組成pair看數(shù)據(jù)在2個(gè)維度平面上的分布情況豌鹤。
圖中點(diǎn)的顏色按照結(jié)果種類(lèi)(class=0\1\2...)區(qū)分亡哄。對(duì)角線(xiàn)位置是直方圖,其它位置是散點(diǎn)圖布疙。pairplot更適合大量散點(diǎn)的場(chǎng)景蚊惯,更容易看出變量間的相關(guān)性愿卸。
- 舉例一:Titanic數(shù)據(jù),nosurv_col未獲救截型,紅色趴荸,surv_col獲救,藍(lán)色宦焦。這是一個(gè)典型不適合的場(chǎng)景发钝,基本上看不出相關(guān)性。vars選擇的是整個(gè)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的每一維度和對(duì)應(yīng)Y的散點(diǎn)圖酝豪。通過(guò)設(shè)置size和aspect參數(shù)來(lái)調(diào)節(jié)顯示的大小和比例【椋可以從圖中看出孵淘,TV特征和銷(xiāo)量是有比較強(qiáng)的線(xiàn)性關(guān)系的,而Radio和Sales線(xiàn)性關(guān)系弱一些锄码,Newspaper和Sales線(xiàn)性關(guān)系更弱夺英。通過(guò)加入一個(gè)參數(shù)kind=’reg’,seaborn可以添加一條最佳擬合直線(xiàn)和95%的置信帶滋捶。
sns.pairplot(data, x_vars=['TV','Radio','Newspaper'], y_vars='Sales', size=7, aspect=0.8, kind='reg')
pairplot圖形3
舉例三:來(lái)自大牛寒小陽(yáng)的博客
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維看起來(lái)是近似線(xiàn)性可分的;從散列圖看重窟,第12和19維之間呈現(xiàn)出很高的負(fù)相關(guān)性载萌。
接著用Seaborn的corrplot
import matplotlib.pyplot as plt
plt.figure(figsize=(12,10))
_=sns.corrplot(df,annot=False)
plt.show()
各維度間的相關(guān)性
解讀:最后一行是最終的類(lèi)別(class=0/1/2..)。
從最后一行看巡扇,第11維的特征和類(lèi)別間有極強(qiáng)的相關(guān)性扭仁,同理第14維。從交叉各行看厅翔,第11維特征和第14維特征之間也有極高的相關(guān)性乖坠;第12維特征和第19維特征間有極強(qiáng)的負(fù)相關(guān)性。強(qiáng)相關(guān)的特征其實(shí)包含了一些冗余的特征刀闷,而除掉上圖中顏色較深的特征熊泵,其余特征包含的信息量就沒(méi)有這么大了,它們和最后的類(lèi)別相關(guān)度不高甸昏,甚至各自之間也沒(méi)什么先慣性顽分。插一句,這里的維度只有20施蜜,所以這個(gè)相關(guān)度計(jì)算并不費(fèi)太大力氣卒蘸,然而實(shí)際情形中,你完全有可能有遠(yuǎn)高于這個(gè)數(shù)字的特征維度翻默,同時(shí)樣本量也可能多很多缸沃,那種情形下我們可能要先做一些處理恰起,再來(lái)實(shí)現(xiàn)可視化了。
三和泌、直方圖distplot
distplot(seaborn)是加強(qiáng)版的hist(pandas)村缸,都是做直方圖
- 舉例一:Titanic數(shù)據(jù),直方圖自動(dòng)得出[0,1),[1,2)...范圍內(nèi)獲救/未獲救的人數(shù)武氓,并畫(huà)出圖形。
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
圖中仇箱,藍(lán)色是獲救的县恕,紅色是未獲救的。既有獲救又有未獲救是圖中紫色部分剂桥。從圖中可以看出10歲以下獲救概率高忠烛,18-30之間很少獲救。
- 舉例二:網(wǎng)上的數(shù)據(jù)权逗,對(duì)比hist()和distplot()的區(qū)別
import matplotlib.pyplot as plt
import seaborn as sns #要注意的是一旦導(dǎo)入了seaborn美尸,matplotlib的默認(rèn)作圖風(fēng)格就會(huì)被覆蓋成seaborn的格式
%matplotlib inline # 為了在jupyter notebook里作圖,需要用到這個(gè)命令
sns.distplot(births['prglngth'])
sns.plt.show()
直方圖2
可以看出distplot()與hist()的最大區(qū)別是有一條密度曲線(xiàn)(KDE),可以設(shè)置參數(shù)去掉這條默認(rèn)的曲線(xiàn)斟薇。
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
類(lèi)似crosstab做分類(lèi)的袱箱,還有:groupby\pivot_table,
參考2
對(duì)于分類(lèi)型的特征遏乔,用累積直方圖還是很合適的。
- 舉例:Titanic
tab.sum(1)发笔,每個(gè)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")
對(duì)比直方圖
同理捻激,性別屬性也可以用累積直方圖
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