一、任务描述
背景故事:
泰坦尼克号(RMS Titanic),又译作铁达尼号,是英国白星航运公司下辖的一艘奥林匹克级游轮,排水量46000吨,于1909年3月31日在北爱尔兰贝尔法斯特港的哈兰德与沃尔夫造船厂动工建造,1911年5月31日下水,1912年4月2日完工试航。泰坦尼克号是当时世界上体积最庞大、内部设施最豪华的客运轮船,有“永不沉没”的美誉 。然而不幸的是,在它的处女航中,泰坦尼克号便遭厄运——它从英国南安普敦出发,途经法国瑟堡-奥克特维尔以及爱尔兰科夫(Cobh),驶向美国纽约。1912年4月14日23时40分左右,泰坦尼克号与一座冰山相撞,造成右舷船艏至船中部破裂,五间水密舱进水。4月15日凌晨2时20分左右,泰坦尼克船体断裂成两截后沉入大西洋底3700米处。2224名船员及乘客中,1517人丧生,其中仅333具罹难者遗体被寻回。泰坦尼克号沉没事故为和平时期死伤人数最为惨重的一次海难,其残骸直至1985年才被再度发现,目前受到联合国教育、科学及文化组织的保护。
泰坦尼克号的沉没是历史上著名的海难事件,当时登船乘客数以千计。他们的个人信息各不相同,生还罹难遭遇各异。虽然,人们对他们的遭遇表示不幸,但是这个灾难也给数据分析和预测提供了比较丰富的数据样品。
数据集中有部分缺失值,通过不同的方法进行填充
二、数据集分析
数据集来自Kaggle网站,网址为:https://www.kaggle.com/c/titanic
数据集中有12个特征,其中Survived是目标值,其余各个特征代表的意思:
- PassengerId : 乘客ID,这个是自动生成的
- Pclass : 乘客等级(1/2/3等舱位)
- Name : 乘客姓名
- Sex : 性别
- Age : 年龄
- SibSp : 堂兄弟/妹个数
- Parch : 父母与小孩个数
- Ticket : 船票信息
- Fare : 票价
- Cabin : 客舱
- Embarked : 登船港口
三、代码实现
import pandas as pd # 数据分析,组织表格的形式
import numpy as np
import matplotlib.pyplot as plt
from sklearn import neighbors
data = pd.read_csv('train.csv')
print(data.info())
print(data.head())
# 缺失值的识别
# 判断各变量中是否存在缺失值
print(data.isnull().any(axis=0))
# 各变量中缺失值的数量
print(data.isnull().sum(axis=0))
# 各变量中缺失值的比例
print(data.isnull().sum(axis = 0)/data.shape[0])
# 缺失值的处理方法
# 方法1:删除法
# 删除无效列,drop默认删除行,列需要加axis=1
# 删除缺失严重的Cabin变量
data.drop(labels='Cabin',axis=1,inplace=True)
# 删除无关紧要的变量
data.drop(['PassengerId','Ticket','Name'],axis=1,inplace=True)
print(data.info())
print(data.head())
# 删除缺失行,根据Embarked变量,删除对应的缺失行
data.dropna(subset=['Embarked'], inplace=True)
#print(data.isnull().sum()) #打印各个特征值的空值总和
# 方法2:替换法,中位数,均值,众数等
'''
print(data.Age)
# 利用所有人年龄的中位数来填补 年龄数据中的缺失值
print(data.Age.describe())
print("年龄的中位数是:",data.Age.median())
print("年龄的均值是:",data.Age.mean())
age_median = data.Age.median()
data.Age.fillna(age_median,inplace=True)
print(data.Age.describe())
print(data.Age)
print(data.info())
'''
# 方法3:插补法,需要用到机器学习算法
# 将字符型的性别变量映射为数值变量
data.Sex = data.Sex.map({'male':1,'female':0})
data.drop(labels='Embarked',axis=1,inplace=True)
print(data)
# 将数据拆分为两组,一是年龄缺失组,二是年龄非缺失组,
missing = data.loc[data.Age.isnull(),]
nomissing = data.loc[~data.Age.isnull(),]
print(missing)
print(nomissing)
# 基于非缺失值构建KNN(K近邻回归)模型,再对缺失组做预测
# 提取出所有的自变量
X = nomissing.columns[nomissing.columns != 'Age']
# 构建模型,K近邻(回归)模型
knn = neighbors.KNeighborsRegressor()
# 模型拟合
knn.fit(nomissing[X], nomissing.Age)
# 年龄预测
pred_age = knn.predict(missing[X])
print(pred_age)
# missing['Age'] = pred_age
data.loc[data.Age.isnull(),'Age'] = pred_age
print(data)
四、重点讲解
1、对于缺失值的处理,归纳为三种方法:
方法一:删除法
该方法通常用来删除缺失值较多,且对最终预测结果影响不大的特征;或者删除缺失值较少的特征所对应的样本,删除少量的样本也并不会影响最终的预测结果。
方法二:替换法
该方法常常通过统计信息,利用需要填充的特征已有的数据,计算中位数、平均数、众数等,选择其一填充进所有的缺失值,缺失值填充的值一致。
方法三:插补法
该方法需要利用回归算法推断出该条样本特定特征最大可能的取值,也就是使用了最有可能的值来填充缺失值,每个缺失值不一定相同,准确性更高。
2、pandas:
- pandas是一个强大的分析结构化数据的工具集
- 它的使用基础是Numpy(提供高性能的矩阵运算)
- 用于数据挖掘和数据分析,同时也提供数据清洗功能
Pandas中常见的数据结构有两种:
- Pandas Series:
- Pandas series 是像数组一样的一维对象,可以存储很多类型的数据。Pandas series 和 Numpy array之间的主要区别之一是你可以为Pandas series 中的每个元素分配索引标签;另一个区别是Pandas series 可以同时存储不同类型的数据。
-
Pandas DataFrame:
-
Pandas DataFrame 是具有带标签的行和列的二维数据结构,可以存储多种类型的数据,类似于电子表格。
-