1.資料導入
import pandas as pd
titanic = pd.read_csv('titanic.csv')
2.檢視資料的行列數、資料類型、數值型資料分布情況
print(titanic.shape)
print(titanic.describe())
print(titanic.info())
3.合并标簽和特征資料集(與前兩步資料無關,僅做代碼示例)
4.資料基本資訊(類型、缺失資訊等)的封裝方法
def resumetable(df):
#顯示資料的shape
print(f''Dataset Shape:{df.shape}'')
#建立一個新的Dataframe,用來展示需要的資料基本資訊
summary=pd.Dataframe(df.dtypes,columns={'dtypes'}
summary=summary.reset_index()
summary['Name']=summary['index']
summary=summary['Name','dtypes']
summary['Missing']=df.isnull().sum().values
summary['Uniques']=df.nunique().values
summary['FirstValue']=df.loc[0].values
summary['SecondValue']=df.loc[1].values
summary['ThirdValue']=df.loc[2].values
#熵(可以了解為資料的離散化程度,同一個特征,不同的取值越多,熵就越大)
for name in summary['Name'].value_counts().index:
summary.loc[summary['Name']==name,'entropy']=round(stats.entropy(df[name].value_counts(),base=2),2)
return summary
5.單變量分析——針對分布情況
(1)數值型(主要使用——直方圖、箱線圖、小提琴圖)
#單個特征的分布情況(直方圖)
sns.distplot(titanic['fare'],kde=False)
#單個特征的分布情況(箱線圖)
sns.boxplot(titanic['fare'])
(2)類别型
print(titanic['Pclass'].value_counts())
#seaborn方法
sns.countplot(titanic['Pclass'])
ps:對于隻有一種類别的變量(或類别之間極其不平衡約等于隻有一種類别),考慮删掉該變量
類别型的其他分析:
f, [ax1,ax2,ax3] = plt.subplots(1,3,figsize=(20,5))
sns.countplot(x='Sex', hue='Survived', data=data_train, ax=ax1)
sns.countplot(x='Pclass', hue='Survived', data=data_train, ax=ax2)
sns.countplot(x='Embarked', hue='Survived', data=data_train, ax=ax3)
ax1.set_title('Sex特征分析')
ax2.set_title('Pclass特征分析')
ax3.set_title('Embarked特征分析')
f.suptitle('定類/定序資料類型特征分析',size=20,y=1.1)
f, [ax1,ax2] = plt.subplots(1,2,figsize=(20,5))
sns.countplot(x='SibSp', hue='Survived', data=data_train, ax=ax1)
sns.countplot(x='Parch', hue='Survived', data=data_train, ax=ax2)
ax1.set_title('SibSp特征分析')
ax2.set_title('Parch特征分析')
plt.show()
Sex: 對于女性而言,男性總人數雖多,但是獲救率明顯很低(先救婦女);
Pclass: 社會等級為3的總人數最多(也就是大多數人都是普通老百姓),但是獲救率非常低(社會價值高的人優先留下);
Embarked: 登陸港口S數量最多,但是獲救率也是最低的,C港口獲救率最高;
SibSp: 兄弟姐妹數量最低為0的人數最多,但是獲救率最低,而為1的獲救率相對較高,超過50%;
Parch: 情況基本同SibSp一樣,後續可以考慮将二者合并;
就以上5個特征來看,Sex和Pclass兩個特征是其中非常有影響的兩個。
6.資料相關性
除了對特征權重選擇外,我們也要分析特征相關性來篩選特征。相關性大的特征容易造成過拟合現象,是以需要進行剔除。最好的情況就是:所有特征相關性很低,各自的方差或者說資訊量很高。使用了seaborn的heatmap展示相關性,代碼如下:
features_selected = features
# data_corr
df_corr = df[features_selected].copy()
colormap = plt.cm.RdBu
plt.figure(figsize=(20,20))
sns.heatmap(df_corr.corr(),linewidths=0.1,vmax=1.0, square=True, cmap=colormap, linecolor='white', annot=True)
plt.show()