機器學習——畫圖方法
本篇部落格與Titanic部落格相關聯,是其第2部分內容,由於涉及大量通過視覺化圖形 進行資料預覽、分析的地方,因此獨立成篇,作為畫圖方法的筆記。
-
資料分析階段,我們要概覽資料,觀察每個特徵與標籤的關係,特徵需不要處理,比如多個特徵組合一個新特徵,無價值特徵捨棄,選擇有用特徵等等,這些前期工作比較繁瑣,但確是必須的。它讓我們更好的認識資料,對資料更加敏感。
1、預覽資料集
載入資料集
# -*- coding:utf-8 -*-
import numpy as np #科學計算
import pandas as pd #資料分析
from pandas import Series, DataFrame
data_train = pd.read_csv("all/train.csv")
data_test = pd.read_csv('all/test.csv')
首先預覽下訓練集和測試集 先看訓練集
data_train.head(10)
我們可以看到有一些特徵列,以及特徵的相應取值。 接著,總覽一下資料
data_train.info()
# 輸出
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
PassengerId 891 non-null int64
Survived 891 non-null int64
Pclass 891 non-null int64
Name 891 non-null object
Sex 891 non-null object
Age 714 non-null float64
SibSp 891 non-null int64
Parch 891 non-null int64
Ticket 891 non-null object
Fare 891 non-null float64
Cabin 204 non-null object
Embarked 889 non-null object
dtypes: float64(2), int64(5), object(5)
memory usage: 83.6+ KB
我們可以看到,有891個樣本,其中Age、Cabin、Embarked三個特徵存在缺失值,這個資料處理階段要解讀此問題。 處理完缺失值後,可以再次使用data_train.info()
檢視一下進行確認。
data_train.describe()
#輸出
可以看到各個樣本個數、平均值、標準差、最小值、最大值等資訊, 也可以
data_train['Age'].describe()
看到Age特徵,樣本有714個,平均年齡約為29.699歲,標準差14.52歲,最小年齡為0.42,最大年齡80。
data_train.Cabin.value_counts()
#輸出
C23 C25 C27 4
B96 B98 4
G6 4
F33 3
D 3
C22 C26 3
F2 3
E101 3
E8 2
B28 2
C83 2
C124 2
D36 2
....
可以看到Cabin特徵的一些內容資訊。
2、對每個特徵與生存率survivaled之間的關係進行分析
(1)分析Age與生存率survivaled的關係
import matplotlib.pyplot as plt
import matplotlib
# 顯示中文
from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei']
fig = plt.figure()
fig.set(alpha=0.2) # 設定圖表顏色alpha引數
plt.subplot2grid((2,3),(0,0)) # 在一張大圖裡分列幾個小圖
data_train.Survived.value_counts().plot(kind='bar')# 柱狀圖
plt.title(u"獲救情況 (1為獲救)") # 標題
plt.ylabel(u"人數")
plt.subplot2grid((2,3),(0,1))
data_train.Pclass.value_counts().plot(kind="bar")
plt.ylabel(u"人數")
plt.title(u"乘客等級分佈")
plt.subplot2grid((2,3),(0,2))
plt.scatter(data_train.Survived, data_train.Age)
plt.ylabel(u"年齡") # 設定縱座標名稱
plt.grid(b=True, which='major', axis='y')
plt.title(u"按年齡看獲救分佈 (1為獲救)")
plt.subplot2grid((2,3),(1,0), colspan=2)
data_train.Age[data_train.Pclass == 1].plot(kind='kde')
data_train.Age[data_train.Pclass == 2].plot(kind='kde')
data_train.Age[data_train.Pclass == 3].plot(kind='kde')
plt.xlabel(u"年齡")# plots an axis lable
plt.ylabel(u"密度")
plt.title(u"各等級的乘客年齡分佈")
plt.legend((u'頭等艙', u'2等艙',u'3等艙'),loc='best') # sets our legend for our graph.
plt.subplot2grid((2,3),(1,2))
data_train.Embarked.value_counts().plot(kind='bar')
plt.title(u"各登船口岸上船人數")
plt.ylabel(u"人數")
plt.show()
data_train.Survived.value_counts().plot(kind='bar')# 柱狀圖
kind =’bar’ 是柱狀圖 kind= ‘kde’ 是密度圖 我們看到了獲救人數的情況,乘客等級分佈情況、各個等級乘客年齡分佈情況、各個登船口岸登船人數的情況、年齡與生存率的關係
我們看到各個年齡段的人都有獲救和不獲救的情況存在。
(2)各個等級Pclass乘客獲救情況
# -*- coding:utf-8 -*-
fig = plt.figure()
fig.set(alpha=0.2) # 設定圖表顏色alpha引數
Survived_0 = data_train.Pclass[data_train.Survived == 0].value_counts()
Survived_1 = data_train.Pclass[data_train.Survived == 1].value_counts()
df=pd.DataFrame({u'獲救':Survived_1, u'未獲救':Survived_0})
df.plot(kind='bar', stacked=True)
plt.title(u"各乘客等級的獲救情況")
plt.xlabel(u"乘客等級")
plt.ylabel(u"人數")
plt.show()
fig = plt.figure()
明顯等級為1的乘客,獲救的概率高很多
(3)Sex與生存率的關係
#看看各性別的獲救情況
fig = plt.figure()
fig.set(alpha=0.2) # 設定圖表顏色alpha引數
Survived_m = data_train.Survived[data_train.Sex == 'male'].value_counts()
Survived_f = data_train.Survived[data_train.Sex == 'female'].value_counts()
df=pd.DataFrame({u'男性':Survived_m, u'女性':Survived_f})
df.plot(kind='bar', stacked=True)
plt.title(u"按性別看獲救情況")
plt.xlabel(u"性別")
plt.ylabel(u"人數")
plt.show()
可以明顯看出,女性的獲救率遠高於男性,可以說是與生存率標籤聯絡非常緊密了。
#上面程式碼的部分解釋
Survived_m = data_train.Survived[data_train.Sex == 'male'].value_counts()
Survived_m
#輸出
0 468
1 109
Name: Survived, dtype: int64
(4)姓名與生存率的關係
其實在baseline的時候,我是沒有考慮姓名的,因為通常上來講,你叫什麼名字和你的生存率有個鬼關係。。如果想要看看其分析可以本篇博文最後所附的參考文獻。
但是最終,我還是選取了姓名這個特徵,並且該特徵起到了很重要的作用, 這是因為Name特徵中,如果你仔細觀察,會發現其包括對乘客的稱呼,如:Mr、Miss、Mrs等,稱呼資訊包含了乘客的年齡、性別,同時也包含了如社會地位等的稱呼,如:Dr,、Lady、Major、Master等的稱呼。 因此可以說姓名這個屬性包含極大的資訊量,不能捨棄。 其具體處理過程,在titanic這篇博文中進行了說明。 [ Kaggle——高分泰坦尼克災難生存預測詳細講解(LR、Bagging) ]
至於其他博文中說,研究名字長度與生存率的關係,emmm,怎麼說呢,從畫圖分析好像確實有影響,實際情況時,當災難發生,短名字可能更容易被別人叫? 或者短名字在災後記錄生存者的時候,更方便清點人員記錄,因此容易被記錄下來,emmm,總之,我感覺不是靠譜,因此最終模型也並未加入名字長短這個特徵,有興趣的可以點開本篇博文最後所附的參考文獻進行檢視。
(5)有無兄弟姐妹和存活與否的關係—SibSp
sibsp_df = data_train[data_train['SibSp'] != 0]
no_sibsp_df = data_train[data_train['SibSp'] == 0]
plt.figure(figsize=(10,5))
plt.subplot(121)
sibsp_df['Survived'].value_counts().plot.pie(labels=['No Survived', 'Survived'], autopct = '%1.1f%%')
plt.xlabel('sibsp')
plt.subplot(122)
no_sibsp_df['Survived'].value_counts().plot.pie(labels=['No Survived', 'Survived'], autopct = '%1.1f%%')
plt.xlabel('no_sibsp')
plt.show()
可以看到,有兄弟姐妹的,生存率確實高一些。
(6)有無父母子女和存活與否的關係 Parch
parch_df = data_train[data_train['Parch'] != 0]
no_parch_df = data_train[data_train['Parch'] == 0]
plt.figure(figsize=(10,5))
plt.subplot(121)
parch_df['Survived'].value_counts().plot.pie(labels=['No Survived', 'Survived'], autopct = '%1.1f%%')
plt.xlabel('parch')
plt.subplot(122)
no_parch_df['Survived'].value_counts().plot.pie(labels=['No Survived', 'Survived'], autopct = '%1.1f%%')
plt.xlabel('no_parch')
plt.show()
通用我們可以看到,有父母的生存率稍稍比無父母的生存率高出一些。 我在實踐過程中,也將SibSp 和 Parch特徵 組合成了新特徵 Family_size,(Family_size=SibSp + Parch +1),但是結果評分反而下降了,其實通過觀察我們也能發現,有1-2個家人的,生存率會高,無家人的 和 家人過多的,生存率會低。
(7)票價分佈和存活與否的關係 Fare
首先繪製票價的分佈情況:
plt.figure(figsize=(10,5))
data_train['Fare'].hist(bins = 70)
data_train.boxplot(column='Fare', by='Pclass', showfliers=False)
plt.show()
繪製生存與否與票價均值和方差的關係:
由上圖示可知,票價與是否生還有一定的相關性,生還者的平均票價要大於未生還者的平均票價。
(8)船艙型別和存活與否的關係 Cabin
由於Cabin的缺失值較多,因此我們取有Cabin值和無Cabin值作為特這,通過畫圖分析,我們可以看到,有Cabin值的乘客生存率要大於沒有的乘客。 雖然我覺得這麼做有點扯,但也不是完全沒有道理,清點人員在災難後記錄Cabin值的時候,往往只有存活者才可以提供Cabin,死亡者Cabin隨著票一起丟失了。
(9)港口和存活與否的關係 Embarked
import seaborn as sns
sns.countplot('Embarked', hue='Survived', data=data_train)
plt.title('Embarked and Survived')
Text(0.5,1,'Embarked and Survived')
sns.factorplot('Embarked', 'Survived', data=data_train, size=3, aspect=2)
plt.title('Embarked and Survived rate')
plt.show()
由上可以看出,在不同的港口上船,生還率不同,C最高,Q次之,S最低。
(10)Ticket、PassengerID特徵
PassengerID 是乘客身份的唯一標識,Ticket特徵也差不多,因此,其與生存率可以說是沒有任何關係了。
至此,11個特徵分析完畢,survival特徵作為標籤。