内容说明
这门课程得主要目的是通过真实的数据,以实战的方式了解数据分析的流程和熟悉数据分析python的基本操作。知道了课程的目的之后,我们接下来我们要正式的开始数据分析的实战教学,完成kaggle上泰坦尼克的任务,实战数据分析全流程。 这里有两份资料: 教材《Python for Data Analysis》和 baidu.com & google.com(善用搜索引擎)
学习地址:
https://github.com/datawhalechina/hands-on-data-analysis
本次博客的内容主要是对数据进行数据清洗
补充缺失值
查看缺失值
df.isnull().sum()
out
PassengerId 0
Survived 0
Pclass 0
Name 0
Sex 0
Age 177
SibSp 0
Parch 0
Ticket 0
Fare 0
Cabin 687
Embarked 2
dtype: int64
可以看到,缺失值出现的列为Age,Cabin以及Embarked三列。其中Cabin的缺失值最多。
而对于缺失值的处理,我们有两张方式,一种是直接丢弃,另外一种是进行填充,由于出现缺失值的行数较多,我们试着对表格进行填充
将Cabin为Nan的地方填充为‘Unknow’,将Age通过分组赋平均值的方法进行赋值,然后Embarked进行众数填充。
df.Cabin=df.Cabin.fillna('Unknow')
df['Age']=df.groupby(['Survived','Pclass'])['Age'].transform(lambda x: x.fillna(x.mean()))
df['Embarked']=df['Embarked'].fillna('S')
df.isnull().sum()
out
PassengerId 0
Survived 0
Pclass 0
Name 0
Sex 0
Age 0
SibSp 0
Parch 0
Ticket 0
Fare 0
Cabin 0
Embarked 0
dtype: int64
特征观察与处理
我们对特征进行一下观察,可以把特征大概分为两大类:
数值型特征:Survived ,Pclass, Age ,SibSp, Parch, Fare,其中Survived, Pclass为离散型数值特征,Age,SibSp, Parch, Fare为连续型数值特征
文本型特征:Name, Sex, Cabin,Embarked, Ticket,其中Sex, Cabin, Embarked, Ticket为类别型文本特征,数值型特征一般可以直接用于模型的训练,但有时候为了模型的稳定性及鲁棒性会对连续变量进行离散化。文本型特征往往需要转换成数值型特征才能用于建模分析。
对年龄进行分箱(离散化)处理
res=pd.cut(
df.Age,
bins=[0,5,15,30,50,80],
right=False,
labels=['[0,5)' ,'[5,15)','[15,30)', '[30,50)' ,'[50,80)']
)
res.value_counts()
out
[15,30) 446
[30,50) 293
[50,80) 73
[0,5) 40
[5,15) 38
Name: Age, dtype: int64
对文本变量进行转换
利用sklearn包中的labelencoder进行标签编码,将文本信息映射到整数域上
from sklearn.preprocessing import LabelEncoder
for feat in ['Sex','Cabin', 'Ticket']:
lbl = LabelEncoder()
label_dict = dict(zip(df[feat].unique(), range(df[feat].nunique())))
df[feat + "_labelEncode"] = df[feat].map(label_dict)
df[feat + "_labelEncode"] = lbl.fit_transform(df[feat].astype(str))
df.head()
out
PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked | Cabin_labelEncode | Ticket_labelEncode | Sex_labelEncode | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 0 | 3 | Braund, Mr. Owen Harris | 1 | 22 | 1 | 0 | A/5 21171 | 7.25 | Unknow | S | 147 | 523 | 1 |
1 | 2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Thayer) | 0 | 38 | 1 | 0 | PC 17599 | 71.2833 | C85 | C | 81 | 596 | 0 |
2 | 3 | 1 | 3 | Heikkinen, Miss. Laina | 0 | 26 | 0 | 0 | STON/O2. 3101282 | 7.925 | Unknow | S | 147 | 669 | 0 |
3 | 4 | 1 | 1 | Futrelle, Mrs. Jacques Heath (Lily May Peel) | 0 | 35 | 1 | 0 | 113803 | 53.1 | C123 | S | 55 | 49 | 0 |
4 | 5 | 0 | 3 | Allen, Mr. William Henry | 1 | 35 | 0 | 0 | 373450 | 8.05 | Unknow | S | 147 | 472 | 1 |
从纯文本Name特征里提取出Titles的特征
利用正则表达式匹配出name中的titles特征
df['Title'] = df.Name.str.extract('([A-Za-z]+)\.', expand=False)
df['Title']
out
0 Mr
1 Mrs
2 Miss
3 Mrs
4 Mr
...
886 Rev
887 Miss
888 Miss
889 Mr
890 Mr
Name: Title, Length: 891, dtype: object
总结
对数据集进行了缺失值的处理,同时对文本数据进行了标签编码,同时提取了一列新数据titles。