titanic數據集是個著名的數據集.kaggle上的titanic乘客生還率預測比賽是一個很好的入門機器學習的比賽.算法
數據集下載能夠去https://www.kaggle.com/c/titanic/data.機器學習
自己寫這個系列筆記是做爲本身機器學習的記錄,也爲了加深本身對機器學習相關知識的理解.可是寫了前兩篇seaborn的筆記之後,感受缺少實際的比賽數據的例子,寫起來比較枯燥,讀的人看的可能也很枯燥,瀏覽量也寥寥.讀的人可能看完了會有一種,"哦,這樣啊,原來如此,懂了懂了",然鵝,一拿到真實的數據,仍是束手無策,無從下手.函數
因此,今天就拿真實的數據來學習一下seaborn要怎麼用.怎麼在開始正式的機器學習算法以前探索咱們的數據關係.學習
titanic數據集給出了891行,12列已經標記的數據.即咱們已知train.csv中891名乘客是否生還.咱們須要預測test.csv中的418名乘客是否可以生還.編碼
首先看一眼咱們的數據.spa
Variable | Definition | Key |
---|---|---|
survival | Survival | 0 = No, 1 = Yes |
pclass | Ticket class | 1 = 1st, 2 = 2nd, 3 = 3rd |
sex | Sex | |
Age | Age in years | |
sibsp | # of siblings / spouses aboard the Titanic | |
parch | # of parents / children aboard the Titanic | |
ticket | Ticket number | |
fare | Passenger fare | |
cabin | Cabin number | |
embarked | Port of Embarkation | C = Cherbourg, Q = Queenstown, S = Southampton |
意思是一名名字叫harris的22歲男性乘客,乘坐三等倉,船上有1個兄弟姐妹/配偶,0個父母/子女,在Southampton上船,票價7.25,在這次災難中沒有生還.3d
拿到數據,我有幾個簡單的設想blog
好了,下面用seaborn來畫畫圖,觀察一下咱們的數據,看看我拿到數據後第一想法對不對.ip
我主要用catplot 和 displot來繪圖. 字符串
先來看看Pclass和Survived的關係.
catplot顧名思義,主要用來繪製分類數據(Categorical values).kind表示繪製什麼樣的圖,bar,box,violin等等.
sns.catplot(x="Pclass",y="Survived", kind="bar", data=titanic_train);
以此爲例,咱們的數據集中Pclass的取值共有3種,1,2,3,分別表示一等票,二等票,三等票.
當咱們選擇bar圖時,y軸繪製出的是一個矩形,表示的是"Survived"這個數據的均值.(默認是均值,也能夠調整爲中位值).因爲咱們的Survived取值只有0(遇難了),1(獲救了).那麼均值等於獲救比例.
很明顯1等票的生還率更高.
再來看下票價和生還之間的關係.
票價的數據各類各樣,不像Pclass就3種.
sns.catplot(y="Fare",x="Survived", kind="bar", data=titanic_train);
很明顯,獲救的人平均票價更高.
fare的值不少,咱們想看看具體有哪些,大體的分佈,能夠用box.
sns.catplot(y="Fare",x="Survived", kind="box", data=titanic_train);
box繪圖,會繪製出一個箱體,並標註出數據的25%(Q1),50%(Q2),75%(Q3)及outlier處的位置.
其中怎麼判斷哪些點是屬於異常值呢?根據IQR=Q3-Q1. 距離Q1或Q3的距離超過1.5IQR的就算是異常.
好比,下圖的Q1=12 Q2=26 Q3=57.那麼IQR=Q3-Q1=45. 超過Q3+1.5IQR=57+67.5=124.5的就會被算成異常點.會用黑色的小菱形繪製出來.
若是咱們想要繪製出機率估計圖.則能夠用displot,或者kdeplot.這個在以前的文章裏介紹過了.
sns.kdeplot(titanic_train["Fare"][(titanic_train["Survived"] == 1) & (titanic_train["Fare"].notnull())], shade=1, color='red')
sns.kdeplot(titanic_train["Fare"][(titanic_train["Survived"] == 0) & (titanic_train["Fare"].notnull())], shade=1, color='green');
能夠獲得一樣的結論,票價高的,獲救機率更高一點.
注意:知識點來了
不止這一點,咱們還看到,fare的分佈並非正態分佈的,分佈的極其不規則,也就是所謂的數據偏移,能夠看到高收入的分佈機率是很低的,可是高收入的樣本分佈確並很多,即假如咱們把100認爲高票價,一我的的票價是100以上的機率是很低的,可是在100-500之間分佈的確不少,各類各樣的都有.那機器學習算法在處理這個數據的時候就要注意了,要對數據作處理,能夠用log函數作轉換,或者你把0-20,20-50,50-100,100+的分別歸類爲1(很低),2(通常),3(較貴),4(很貴),用這種思想也能夠.
實際上,對這個數據的處理,讓我最終的預測率直接提升了2個百分點.
titanic_train["Fare"].skew()
能夠經過這個skew()來檢測數據的偏移度.若是數據偏移度比較高的話,若是skew()>0.75,通常須要對數據作分佈變換,可使用log變換.
這個skew()>0.75中的0.75怎麼來的,我不太清楚,多是一種經驗值.咱們的這個例子中skew()值已經接近5了.
下面來驗證咱們的猜測3,家人越多越容易得救
sns.catplot(x="SibSp",y="Survived", kind="bar", data=titanic_train);
sns.catplot(x="Parch",y="Survived", kind="bar", data=titanic_train);
能夠看到和咱們的猜測並不一致,當有一個兄弟姐妹的時候,獲救機率大概有0.55.而有4個兄弟姐妹的時候,獲救機率反而只有0.15了.
在父母子女上,也是相似的,當父母子女達到5個的時候,獲救機率反而低了.
titanic_train["family"] = titanic_train["SibSp"] + titanic_train["Parch"] + 1
sns.catplot(x="family",y="Survived", kind="bar", data=titanic_train);
咱們建立一個新特徵,家庭成員數,能夠看到,當家庭人數比較少的時候,生還機率大.當家庭過於龐大,生還機率更低了.
猜測,是否是人少的時候,能夠互相幫助,人多了,尋找家人會更困難,致使本能夠獲救的最終由於尋找家人也沒活下來?
接下來看咱們的猜測4,女人更容易獲救
sns.catplot(x="Sex",y="Survived", kind="bar", data=titanic_train);
結論顯而易見,女性獲救機率高得多,lady first。
再來探索一下年齡與獲救的關係,驗證咱們的猜測5.
sns.catplot(y="Age",x="Survived", kind="bar", data=titanic_train);
生還乘客的平均年齡是低了一點,可是二者區別不大,也都在正常區間,彷佛看不出來什麼.
咱們來看看機率估計.
sns.kdeplot(titanic_train["Age"][(titanic_train["Survived"] == 1) & (titanic_train["Age"].notnull())], shade=1, color='red')
sns.kdeplot(titanic_train["Age"][(titanic_train["Survived"] == 0) & (titanic_train["Age"].notnull())], shade=1, color='green');
這個圖就很明顯了,在age很小的時候,紅線(獲救)明顯有個波峯.說明在這個年級段,獲救機率更高. 在age很大的時候(60歲以上),
綠線在紅線之上,說明老人更可能遇難.
至此咱們的5個猜測基本被驗證,除了猜測3. 說明直覺仍是比較準的嘛.
如今還剩下Name,Ticket,Cabin,Embarked這4個特徵與Survived的關係沒有驗證.
其中Name,Ticket,Cabin都是不規則的字符串,須要作更多的特徵工程,找到其中的規律之後,纔好觀察數據之間的關係.Embarked的取值只有S,C,Q3種.咱們來看下Embarked與Survived的關係.
老套路:
sns.catplot(y="Survived", x = "Embarked",data = titanic_train, kind="bar")
C = Cherbourg, Q = Queenstown, S = Southampton
說實話,這個真的很是出乎個人意料.我原覺得,是否生還和上船港口沒有關係,三者的生還機率應該是基本同樣纔對.
而後我就開始胡思亂想了,總不能Cherbourg登船的人命好吧,越想越沒道理.或者說Cherbourg登船的人都坐在船的某個位置,受到冰山撞擊比較小?又或者只是由於樣本數量太少了,是個偶然的巧合?
而後我想到是否是這個港口登船的都是有錢人?
sns.catplot(y="Fare", x = "Embarked",data = titanic_train, kind="bar")
sns.catplot(x="Pclass", hue="Embarked", data=titanic_train,kind="count")
這麼一看,還真是.因此Embarked=C的乘客生還機率高不是什麼偶然.
因此這就引起了一個問題,數據之間其實有關聯的,好比Embarked和Fare就有必定的相關性.咱們能夠用heatmap來探索各個特徵數據之間的相關性.
sns.heatmap(titanic_train.corr(),annot=True,fmt ='.2f')
titanic_train.corr()計算出來的是各個特徵的皮爾遜相關係數.皮爾遜相關係數。 wiki上解釋一大堆,說實在的裏面不少數學和統計學上的公式我沒看懂.其實咱們也不須要搞的特別清楚這些數學公式. 說白了,皮爾遜相關係數就是求兩個向量之間的距離或者說夾角,越小越相關.(這個說法不嚴謹,可是原理上這麼理解是沒問題的).皮爾遜相關係數求出來在-1到1之間.
由於是求向量之間距離,因此展現的只有特徵值是數字型的特徵,Embarked特徵的值是字符,因此沒展現.你能夠把字符映射成數字,好比S-->1,C-->2,Q-->3,再計算皮爾遜相關係數.固然這樣作是有問題的.由於,S,C,Q原本不存在大小關係,這麼映射之後存在了大小關係.這裏涉及到一個one-hot編碼問題.有興趣的本身搜索一下,這篇就先不講了.
ok,以上就是本篇文章使用seaborn探索titanic數據的內容,更多有趣有用的關於數據預處理可視化,關於seaborn使用等着你們去學習探索.但願這篇文章對你們有幫助和啓發.