python数据科学导论-泰坦尼克号之数据分析

题目一:数据清洗及预处理

一、首先导入读取csv的pandas包,然后读取训练数据集及预测数据集

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
#训练数据集
train = pd.read_csv("train.csv")
#测试数据集
test  = pd.read_csv("test.csv")
#合并数据集,方便同时对两个数据集进行清洗
full = train.append(test , ignore_index = True )
print('合并后的数据集:',full.shape)
#查看前五条数据
print(full.head())


用head函数可以默认读取前5行的数据
shape函数,返回的是元组
hg.shape返回的是hg的行数和列数
hg.shape[0]返回的是hg的行数,有几行
hg.shape[1]返回的是hg的列数,有几列

通过full.info方法我们可以看出,其中Age和Cabin属性有大量的缺省值,需要平均值或默认数据进行替换。
在这里插入图片描述
所以我们对基本数据类型/文本数据进行分开替换:
基本数据类型用mean方法求出平均值然后fillna方法填充

#年龄(Age)
full['Age']=full['Age'].fillna( full['Age'].mean() )
#船票价格(Fare)
full['Fare'] = full['Fare'].fillna( full['Fare'].mean() )

文本数据类型先用head、value_counts方法看一下大部分数据值是什么

print(full['Embarked'].head())
print(full['Embarked'].value_counts())
full['Embarked'] = full['Embarked'].fillna( 'S' )
# 船舱号(Cabin):查看里面数据长啥样
print(full['Cabin'].head())
# 由于缺失数据比较多,船舱号(Cabin)缺失值填充为U,表示未知(Uknow)
full['Cabin'] = full['Cabin'].fillna( 'U' )

数据清洗完成后,info方法查看一下,就剩预测数据集里的400位同志的生存情况。

在这里插入图片描述

题目二:数据可视化

1.先用柱状图看一下性别对于生存情况的可视化分析

#数据可视化
sex = train.groupby('Sex')['Survived'].sum()
sex.plot.bar()
plt.title('survived_count')
plt.show()

在这里插入图片描述
2.计算男女中死亡人数 1表示生存,0表示死亡

train.groupby(['Sex','Survived'])['Survived'].count().unstack().plot(kind='bar',stacked='True')
plt.title('survived_count')
plt.ylabel('count')
plt.show()

在这里插入图片描述
在这里插入图片描述
关于groupby的用法:
https://blog.csdn.net/shujuelin/article/details/79635848?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-9.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-9.control
3、计算不同票价中生存与死亡人数 折线图


fare_sur = train.groupby(['Fare'])['Survived'].value_counts().sort_values(ascending=False)
# 排序后绘折线图
fig = plt.figure(figsize=(20, 18))
fare_sur.plot(grid=True)
plt.legend()
plt.show()

在这里插入图片描述
4、可视化展示泰坦尼克号数据集中不同仓位等级的人生 存和死亡人员的分布情况

pclass_sur = train.groupby(['Pclass'])['Survived'].value_counts()

sns.countplot(x="Pclass", hue="Survived", data=train)

题目三:特征分析

1、 将性别映射为0、1数值


# 将性别的值映射为数值
# 男(male)对应数值1,女(female)对应数值0
sex_mapDict={'male':1, 'female':0}
#map函数:对Series每个数据应用自定义的函数计算
full['Sex']=full['Sex'].map(sex_mapDict)
print(full['Sex'].head())

在这里插入图片描述
2、登船港口(Embarked)

embarkedDf = pd.DataFrame()
# 使用get_dummies进行one-hot编码,产生虚拟变量(dummy variables),列名前缀是Embarked
# one hot编码是将类别变量转换为机器学习算法易于利用的一种形式的过程。
# prefix:指定列名
embarkedDf = pd.get_dummies( full['Embarked'] , prefix='Embarked' )
#添加one-hot编码产生的虚拟变量(dummy variables)到泰坦尼克号数据集full
full = pd.concat([full,embarkedDf],axis=1)
# 因为已经使用登船港口(Embarked)进行了one-hot编码产生了它的虚拟变量(dummy variables)
# 所以这里把登船港口(Embarked)删掉;
full.drop('Embarked',axis=1,inplace=True)


在这里插入图片描述
3、客舱等级(Pclass)

# 1=1等舱,2=2等舱,3=3等舱
#存放提取后的特征
pclassDf = pd.DataFrame()
#使用get_dummies进行one-hot编码,列名前缀是Pclass
pclassDf = pd.get_dummies( full['Pclass'] , prefix='Pclass' )
#print(pclassDf.head())

#添加one-hot编码产生的虚拟变量(dummy variables)到泰坦尼克号数据集full
full = pd.concat([full,pclassDf],axis=1)
#删掉客舱等级(Pclass)这一列
full.drop('Pclass',axis=1,inplace=True)
print(full.head())

4、从姓名中提取头衔:
乘客名字(Name)中,有一个非常显著的特点:
乘客头衔每个名字当中都包含了具体的称谓或者说是头衔,
将这部分信息提取出来后可以作为非常有用一个新变量,可以帮助我们进行预测。


# 定义函数:从姓名中获取头衔
def getTitle(name):
    str3 = name.split( ',' )[1].split( '.' )[0].strip()
    return str3
#存放提取后的特征
titleDf = pd.DataFrame()
#map函数:对Series每个数据应用自定义的函数计算
titleDf['Title'] = full['Name'].map(getTitle)
#print(titleDf.head())

# 获取所有姓名中头衔的列表
titleDf['Title'].unique()

# 定义以下几种头衔类别:
# Officer 政府官员
# Royalty 王室(皇室)
# Mr 已婚男士
# Mrs 已婚妇女
# Miss 年轻未婚女子
# Master 有技能的人/教师
# 根据所有姓名中头衔的列表,定义头衔类别的映射关系
title_mapDict = {
                    "Capt":       "Officer",
                    "Col":        "Officer",
                    "Major":      "Officer",
                    "Jonkheer":   "Royalty",
                    "Don":        "Royalty",
                    "Sir" :       "Royalty",
                    "Dr":         "Officer",
                    "Rev":        "Officer",
                    "the Countess":"Royalty",
                    "Dona":       "Royalty",
                    "Mme":        "Mrs",
                    "Mlle":       "Miss",
                    "Ms":         "Mrs",
                    "Mr" :        "Mr",
                    "Mrs" :       "Mrs",
                    "Miss" :      "Miss",
                    "Master" :    "Master",
                    "Lady" :      "Royalty"
                    }

#map函数:对Series每个数据应用自定义的函数计算
titleDf['Title'] = titleDf['Title'].map(title_mapDict)
#使用get_dummies进行one-hot编码
titleDf = pd.get_dummies(titleDf['Title'])
titleDf.head()

#添加one-hot编码产生的虚拟变量(dummy variables)到泰坦尼克号数据集full
full = pd.concat([full,titleDf],axis=1)
#删掉姓名这一列
full.drop('Name',axis=1,inplace=True)
print(full.head())

在这里插入图片描述
5、从客舱号中提取客舱类别

print(full['Cabin'].head())
#存放客舱号信息
cabinDf = pd.DataFrame()
# 客场号的类别值是首字母,例如:
# C85 类别映射为首字母C
full[ 'Cabin' ] = full[ 'Cabin' ].map( lambda c : c[0] )
##使用get_dummies进行one-hot编码,列名前缀是Cabin
cabinDf = pd.get_dummies( full['Cabin'] , prefix = 'Cabin' )
cabinDf.head()

#添加one-hot编码产生的虚拟变量(dummy variables)到泰坦尼克号数据集full
full = pd.concat([full,cabinDf],axis=1)
#删掉客舱号这一列
full.drop('Cabin',axis=1,inplace=True)
print(full.head())

在这里插入图片描述
6、建立家庭人数和家庭类别


familyDf = pd.DataFrame()

# 家庭人数=同代直系亲属数(Parch)+不同代直系亲属数(SibSp)+乘客自己
# (因为乘客自己也是家庭成员的一个,所以这里加1)
familyDf[ 'FamilySize' ] = full[ 'Parch' ] + full[ 'SibSp' ] + 1
# 家庭类别:
# 小家庭Family_Single:家庭人数=1
# 中等家庭Family_Small: 2<=家庭人数<=4
# 大家庭Family_Large: 家庭人数>=5
familyDf[ 'Family_Single' ] = familyDf[ 'FamilySize' ].map( lambda s : 1 if s == 1 else 0 )
familyDf[ 'Family_Small' ]  = familyDf[ 'FamilySize' ].map( lambda s : 1 if 2 <= s <= 4 else 0 )
familyDf[ 'Family_Large' ]  = familyDf[ 'FamilySize' ].map( lambda s : 1 if 5 <= s else 0 )
#print(familyDf.head())

#添加one-hot编码产生的虚拟变量(dummy variables)到泰坦尼克号数据集full
full = pd.concat([full,familyDf],axis=1)
full.head()

在这里插入图片描述

题目三:相关分析(线性相关分析、方差分析等)

1、相关系数法:计算各个特征的相关系数

corrDf = full.corr()
# 查看各个特征与生成情况(Survived)的相关系数,
# ascending=False表示按降序排列
corrDf['Survived'].sort_values(ascending =False)
#print(corrDf)
# 根据各个特征与生成情况(Survived)的相关系数大小,选择了这几个特征作为模型的输入:
#特征选择
full_X = pd.concat( [titleDf,#头衔
                     pclassDf,#客舱等级
                     familyDf,#家庭大小
                     full['Fare'],#船票价格
                     cabinDf,#船舱号
                     embarkedDf,#登船港口
                     full['Sex']#性别
                    ] , axis=1 )
print(full_X.head())

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

题目四:回归及预测(逻辑回归)

首先我们的训练数据集(train.csv)一共有891条数据,剩下四百多条数据是没有生存情况数据的,也就是我们的预测数据集(test.csv)需要我们使用机器学习算法来进行模拟预测。
此题目我使用了机器学习算法中的逻辑回归算法(logisic regression)
1、 首先看了一下原始预测集和预测数据集的特征:

sourceRow=891
#原始数据集:特征
source_X = full_X.loc[0:sourceRow-1,:]
#原始数据集:标签
source_y = full.loc[0:sourceRow-1,'Survived']
#预测数据集:特征
pred_X = full_X.loc[sourceRow:,:]
#原始数据集有多少行
print('原始数据集有多少行:',source_X.shape[0])
#预测数据集大小
print('预测数据集有多少行:',pred_X.shape[0])
from sklearn.model_selection import train_test_split
train_X, test_X, train_y, test_y = train_test_split(source_X ,
                                                    source_y,
                                                    train_size=.8)
#输出数据集大小
print ('原始数据集特征:',source_X.shape,
       '训练数据集特征:',train_X.shape ,
      '测试数据集特征:',test_X.shape)

print ('原始数据集标签:',source_y.shape,
       '训练数据集标签:',train_y.shape ,
      '测试数据集标签:',test_y.shape)


在这里插入图片描述
2、建立逻辑回归模型进行预测

#第1步:导入算法
from sklearn.linear_model import LogisticRegression
#第2步:创建模型:逻辑回归(logisic regression)
model = LogisticRegression()
#第3步:训练模型
print(model.fit( train_X , train_y ))

# 分类问题,score得到的是模型的正确率
print(model.score(test_X , test_y ))

pred_Y = model.predict(pred_X)
# 生成的预测值是浮点数(0.0,1,0)
# 但是Kaggle要求提交的结果是整型(0,1)
# 所以要对数据类型进行转换
pred_Y=pred_Y.astype(int)
#乘客id
passenger_id = full.loc[sourceRow:,'PassengerId']
#数据框:乘客id,预测生存情况的值
predDf = pd.DataFrame(
    { 'PassengerId': passenger_id ,
     'Survived': pred_Y } )
predDf.shape

print(predDf.head())

#保存结果
predDf.to_csv('titanic_pred.csv', index = False )


模型的正确率如下:
在这里插入图片描述

  • 12
    点赞
  • 137
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值