• Python分析泰坦尼克号数据集
千次阅读
2020-10-12 20:35:58

泰坦尼克号数据分析

## 分析目的：

### 分析影响乘客生存的因素

#导入相应的库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

# 查看数据前5 行

## 数值型数据描述性分析

train.describe()

## 数据预处理

### 缺失值处理

train.isnull().sum()
train.Age = train.Age.fillna(train.Age.mean())
train.Embarked = train.Embarked.fillna(method = ‘ffill’)
train.isnull().sum()

### 重复值处理

train[train.duplicated(subset = [‘Name’,‘Sex’])] #数据集中没有重复数据

### 合并SibSp与Parch属性

train[‘Sib_Par’] = train[‘SibSp’] + train[‘Parch’]

### 异常值处理

train.Fare.plot(kind = ‘box’)
train[train.Fare>200]
#train[train.Fare>200].count()
train[train.Fare>500]
train.loc[train.Fare > 500 , ‘Fare’] = 227
#查看票价为0的数据
train[(train[‘Fare’] == 0)]
train[(train[‘Pclass’]== 1) & (train[‘Fare’] == 0)]
train[(train[‘Pclass’]== 2) & (train[‘Fare’] == 0)]
train[(train[‘Pclass’]== 3) & (train[‘Fare’] == 0)]

### 删除无用的属性

train.drop([‘PassengerId’,‘Name’,‘Ticket’,‘Cabin’,‘SibSp’,‘Parch’],axis = 1,inplace = True)

# 中文乱码和坐标轴负号的处理

plt.rcParams[‘font.sans-serif’] = [‘SimHei’]
plt.rcParams[‘axes.unicode_minus’] = False
sns.factorplot(‘Survived’,data=train,kind=“count”)
plt.xlabel(‘生存’)
plt.ylabel(‘人数’)
plt.title(‘总体生存情况’)

### 2、查看Pclass的分布情况和各船舱等级的生存死亡情况

sns.factorplot(‘Pclass’,data=train,kind=“count”)
plt.xlabel(‘船舱等级’)
plt.ylabel(‘人数’)
plt.title(‘各船舱等级人数分布情况’)
Survived_1 = train.Survived[train.Pclass == 1].value_counts()
Survived_2 = train.Survived[train.Pclass == 2].value_counts()
Survived_3 = train.Survived[train.Pclass == 3].value_counts()
df_1 = pd.DataFrame({‘1等舱’:Survived_1,‘2等舱’:Survived_2,‘3等舱’:Survived_3})
df_1.plot(kind = ‘bar’, stacked = True)
plt.title(‘按船舱等级看获救情况’)
plt.xlabel(‘生存’)
plt.ylabel(‘人数’)
plt.show()

### 3、查看性别的分布情况和性别的存活情况

sns.factorplot(‘Sex’,data = train,kind = ‘count’)
plt.xlabel(‘性别’)
plt.ylabel(‘人数’)
plt.title(‘性别分布情况’)
Survived_m = train.Survived[train.Sex == ‘male’].value_counts()
Survived_f = train.Survived[train.Sex == ‘female’].value_counts()
df_2 = pd.DataFrame({‘男性’:Survived_m,‘女性’:Survived_f})
df_2.plot(kind = ‘bar’, stacked = True)
plt.title(‘按性别看获救情况’)
plt.xlabel(‘性别’)
plt.ylabel(‘人数’)
plt.show()

### 4、查看年龄分布情况和各年龄段的生存情况

#离散化
bins = [0,18,40,60,81]
train[‘Age_bins’] = pd.cut(train[‘Age’],bins = bins,labels = [‘child’,‘young’,‘middle’,‘older’])
sns.factorplot(‘Age_bins’,data = train , kind = ‘count’ )
plt.xlabel(‘年龄’)
plt.ylabel(‘人数’)
plt.title(‘各年龄分布情况’)
Survived_c = train.Survived[train.Age_bins == ‘child’].value_counts()
Survived_y = train.Survived[train.Age_bins == ‘young’].value_counts()
Survived_m = train.Survived[train.Age_bins == ‘middle’].value_counts()
Survived_o = train.Survived[train.Age_bins == ‘older’].value_counts()
df_3 = pd.DataFrame({‘孩子’:Survived_c,‘青少年’:Survived_y,‘中年’:Survived_m,‘老年’:Survived_o})
df_3.plot(kind = ‘bar’, stacked = True)
plt.title(‘按性别看获救情况’)
plt.xlabel(‘性别’)
plt.ylabel(‘人数’)
plt.show()
#计算孩子的存活率 存活中孩子的数量/总的孩子数
train[(train[‘Survived’]1)&(train[‘Age_bins’]‘child’)][‘Survived’].count()/train[train[‘Age_bins’]‘child’][‘Age_bins’].count()
#计算青少年的存活率
train[(train[‘Survived’]1)&(train[‘Age_bins’]‘young’)][‘Survived’].count()/train[train[‘Age_bins’]
‘young’][‘Age_bins’].count()
#计算中年的存活率
train[(train[‘Survived’]1)&(train[‘Age_bins’]‘middle’)][‘Survived’].count()/train[train[‘Age_bins’]‘middle’][‘Age_bins’].count()
#计算老年的存活率
train[(train[‘Survived’]1)&(train[‘Age_bins’]‘older’)][‘Survived’].count()/train[train[‘Age_bins’]
‘older’][‘Age_bins’].count()
list = [0.5035971223021583,0.36046511627906974,0.390625,0.22727272727272727]
labels = [‘child’,‘young’,‘middle’,‘older’]
series = pd.Series(list,index = labels)
series.plot(kind = ‘bar’, stacked = True)
plt.title(‘各年龄存活情况’)
plt.xlabel(‘年龄’)
plt.ylabel(‘人数’)
plt.show()

### 5、查看船票价格分布情况和各票价段的生存情况

sns.distplot(train.Fare,bins = 40)
plt.xlabel(‘票价’)
plt.ylabel(‘数量’)
plt.title(‘票价分布情况’)
train.Fare.max()
#离散化
bins = [0,55,110,165,220,275]
train[‘Fare_bins’] = pd.cut(train[‘Fare’],bins = bins,labels = [‘0-55’,‘55-110’,‘110-165’,‘165-220’,‘220-275’])
Survived_1 = train.Survived[train.Fare_bins == ‘0-55’].value_counts()
Survived_2 = train.Survived[train.Fare_bins == ‘55-110’].value_counts()
Survived_3 = train.Survived[train.Fare_bins == ‘110-165’].value_counts()
Survived_4 = train.Survived[train.Fare_bins == ‘165-220’].value_counts()
Survived_5 = train.Survived[train.Fare_bins == ‘220-275’].value_counts()
df_4 = pd.DataFrame({‘0-55’:Survived_1,‘55-110’:Survived_2,‘110-165’:Survived_3,‘165-220’:Survived_4,‘220-275’:Survived_5})
df_4.plot(kind = ‘bar’, stacked = True)
plt.title(‘按船票价格看获救情况’)
plt.xlabel(‘票价’)
plt.ylabel(‘人数’)
plt.show()
#计算各个票价的存活率 存活中各票价的数量/总的票价数
train[(train[‘Survived’]1)&(train[‘Fare_bins’]‘0-55’)][‘Survived’].count()/train[train[‘Fare_bins’]‘0-55’][‘Fare_bins’].count()
train[(train[‘Survived’]1)&(train[‘Fare_bins’]‘55-110’)][‘Survived’].count()/train[train[‘Fare_bins’]
‘55-110’][‘Fare_bins’].count()
train[(train[‘Survived’]1)&(train[‘Fare_bins’]‘110-165’)][‘Survived’].count()/train[train[‘Fare_bins’]‘110-165’][‘Fare_bins’].count()
train[(train[‘Survived’]1)&(train[‘Fare_bins’]‘165-220’)][‘Survived’].count()/train[train[‘Fare_bins’]
‘165-220’][‘Fare_bins’].count()
train[(train[‘Survived’]1)&(train[‘Fare_bins’]‘220-275’)][‘Survived’].count()/train[train[‘Fare_bins’]==‘220-275’][‘Fare_bins’].count()
list_1 = [0.33242876526458615,0.6555555555555556,0.7931034482758621,0.75,0.6875]
labels_1 = [‘0-55’,‘55-110’,‘110-165’,‘165-220’,‘220-275’]
series_1 = pd.Series(list_1,index = labels_1)
series_1.plot(kind = ‘bar’, stacked = True)
plt.title(‘各票价存活情况’)
plt.xlabel(‘票价’)
plt.ylabel(‘存活概率’)
plt.show()
series_1.plot(kind = ‘bar’, stacked = True)
plt.title(‘各票价存活情况’)
plt.xlabel(‘票价’)
plt.ylabel(‘存活概率’)
plt.show()
plt.axes(aspect=‘equal’) # 将横纵坐标标准化处理,使得饼图是正圆不是椭圆
plt.pie(
x=counts,
labels=counts.index,
autopct=’%.1f%%’,
pctdistance=0.8, # 设置百分比数据与圆心的距离
labeldistance=1.1, # 设置标签和圆心距离
textprops = {‘fontsize’:10,“color”:“black”}
)

plt.title(‘各登船口人数分布情况’)
plt.show()
Survived_S = train.Survived[train.Embarked == ‘S’].value_counts()
Survived_C = train.Survived[train.Embarked == ‘C’].value_counts()
Survived_Q = train.Survived[train.Embarked == ‘Q’].value_counts()
df_5 = pd.DataFrame({‘S’:Survived_S,‘C’:Survived_C,‘Q’:Survived_Q})
df_5.plot(kind = ‘bar’, stacked = True)
plt.title(‘按登船口看获救情况’)
plt.xlabel(‘生存’)
plt.ylabel(‘人数’)
plt.show()

### 查看同行的人数分布情况与生存关系

sns.distplot(train.Sib_Par)
plt.xlabel(‘同伴’)
plt.ylabel(‘人数’)
plt.title(‘同行人数分布情况’)
sns.factorplot(‘Sib_Par’,data = train , kind = ‘count’ , hue = ‘Survived’)
plt.xlabel(‘同伴’)
plt.ylabel(‘人数’)
plt.title(‘生存情况’)
train[(train[‘Survived’]==1)&(train[‘Sib_Par’]==0)][‘Survived’].count()/train[train[‘Sib_Par’]==0][‘Sib_Par’].count()
train[(train[‘Survived’]==1)&(train[‘Sib_Par’]==1)][‘Survived’].count()/train[train[‘Sib_Par’]==1][‘Sib_Par’].count()
train[(train[‘Survived’]==1)&(train[‘Sib_Par’]==2)][‘Survived’].count()/train[train[‘Sib_Par’]==2][‘Sib_Par’].count()
train[(train[‘Survived’]==1)&(train[‘Sib_Par’]==3)][‘Survived’].count()/train[train[‘Sib_Par’]==3][‘Sib_Par’].count()
train[(train[‘Survived’]==1)&(train[‘Sib_Par’]==4)][‘Survived’].count()/train[train[‘Sib_Par’]==4][‘Sib_Par’].count()
train[(train[‘Survived’]==1)&(train[‘Sib_Par’]==5)][‘Survived’].count()/train[train[‘Sib_Par’]==5][‘Sib_Par’].count()
train[(train[‘Survived’]==1)&(train[‘Sib_Par’]==6)][‘Survived’].count()/train[train[‘Sib_Par’]==6][‘Sib_Par’].count()
train[(train[‘Survived’]==1)&(train[‘Sib_Par’]==7)][‘Survived’].count()/train[train[‘Sib_Par’]==7][‘Sib_Par’].count()
train[(train[‘Survived’]==1)&(train[‘Sib_Par’]==10)][‘Survived’].count()/train[train[‘Sib_Par’]==10][‘Sib_Par’].count()
list_2 = [0.30353817504655495,0.5527950310559007,0.5784313725490197,0.7241379310344828,0.2,0.13636363636363635,0.3333333333333333,0,0]
labels_2 = [‘0’,‘1’,‘2’,‘3’,‘4’,‘5’,‘6’,‘7’,‘10’]
series_2 = pd.Series(list_2,index = labels_2)
series_2.plot(kind = ‘bar’, stacked = True)
plt.title(‘与同伴同行存活情况’)
plt.xlabel(‘同伴人数’)
plt.ylabel(‘存活概率’)
plt.show()

## 代码已经在电脑上运行过了，放图片太麻烦就不放了，技术不够，如果有哪里写的不好或者有更好的方法还望指出。谢谢！

更多相关内容
• 泰坦尼克号数据集分析 分析结果：宿舍房等级较低的这个生还率较高，女性生还比男性高，儿童生的几率还差一些。但是这个结论有一定的概率，实际上泰坦尼克号上有224名乘客，而数据集只有 891 名还有乘客，另外也不...
• 有个公众号和一些文章用的就是泰坦尼克数据集, 我不知道为什么要用这个，但是我找了很久，还有好多收费的， 我就再次恭喜那一个免费的，让大家的学习门槛低一点。
• 泰坦尼克号数据集（机器学习基本数据集）。训练集应用于构建机器学习模型。对于训练集，我们为每位乘客提供结果。您的模型将基于“特征”，如乘客的性别和阶级。也可以使用特征工程来创建新特征。测试集应该用来查看...
• 泰坦尼克号数据集,pyhton数据分析练手,练手专用,数据分析,Python
• 主要分析有数据接:https://pan.baidu.com/s/1jn88GiOr7uWA8BDQocFXxg 密码: s0e0不同舱位等级中幸存者和遇难者的乘客比例不同性别的幸存比例幸存和遇难...首先做准备（导入库，读入数据集） import matplotlib.pypl
• 泰坦尼克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") ...

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

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

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



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() )



print(full['Embarked'].head())
print(full['Embarked'].value_counts())
full['Embarked'] = full['Embarked'].fillna( 'S' )
# 船舱号（Cabin）：查看里面数据长啥样
# 由于缺失数据比较多，船舱号（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()



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)


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' )

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



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)

# 获取所有姓名中头衔的列表
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",
}

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

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



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' )

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



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 )

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



## 题目三：相关分析（线性相关分析、方差分析等）

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 )



## 题目四：回归及预测（逻辑回归）

首先我们的训练数据集（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

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



模型的正确率如下：

展开全文
• 数据集：kaggle上的泰坦尼克号数据集 主要字段有： PassengerId：乘客的ID Survived：是否存活（1为存活，0为死亡） Pclass：船舱等级 Name：乘客姓名 Sex：乘客性别 Age：乘客年龄 SibSp：兄弟姐妹（有些乘客可能带...

泰坦尼克号数据分析python实战
（单因素分析）

数据集：kaggle上的泰坦尼克号数据集
主要字段有：
PassengerId：乘客的ID（和存活率无关）
Survived：是否存活（1为存活，0为死亡）
Pclass：船舱等级（等级较高的船舱救生设备比较齐全）
Name：乘客姓名（无关）
Sex：乘客性别
Age：乘客年龄
SibSp：兄弟姐妹（有些乘客可能带兄弟姐妹一起上船）
Parch：父母小孩（同SibSp）
Ticket：船票编号（无关）
Fare：费用（同Pclass）
Cabin：舱号（无关）
Embarked：上船的地点（可能存在一定的相关性？）

和存活率可能相关的变量：Survived，Pclass，Sex,Age,SibSp,Parch,Fare,Embarked

要分析的问题：
1，泰坦尼克号获救情况如何？
2，船舱等级Pclass对存活Survived的影响？
3，性别Sex对存活Survived的影响？
4，年龄Age对存活Survived的影响？

首先用python对数据集进行预处理

#首先导入相关的库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline    #可视化在页面展示

#打开数据集，这里是用相对路径


先了解数据的概括(形状，缺失值)

df.shape
df.info()


由运行结果可知：数据集中一共有12列，891行。其中，Age、Cabin、Embarked存在缺失值，对其进行缺失值处理

#用平均数填充Age缺失值 fillna()
df.Age.fillna(df.Age.mean(),inplace=True)

#Cabin为舱号，和生存率无关,且缺失的数据较多。故删除
#drop（） axis=1为删除列，0为删除行
df = df.drop(["Cabin" ],axis = 1)

#Embarked为上船的地点，缺失2条记录。这里用众数填充缺失值

#查找缺失的记录是第几条。运行可知，第62和830条记录的Embarked为缺失
df[df.Embarked.isnull()]
#对Embarked的数据进行计数。运行结果可知，S为众数。
df.Embarked.value_counts()
#用众数填充Embarked的2个缺失值
#fillna('value',inplace为是否在原表上进行操作)
df.Embarked.fillna('S',inplace=True)
#查看处理后的计数情况
df.Embarked.value_counts()
#切片查看查看62行的数据，可以看到Embarked已经被填充上S
df.iloc[61]


数据缺失值处理完成，接下来进行数据的描述性统计分析

df.describe() #只针对数值型变量，忽略类别型变量


然后进行单因素分析

问题1：泰坦尼克号获救情况如何？

#计算泰坦尼克号的获救人数和获救率
total_survived=df.Survived.value_counts()
total_survived.index=total_survived.index.astype('str') #将index从数字转换为字符型“0”“1”
_x=total_survived.index  #赋值
_y=total_survived.values  #赋值

#画图
plt.figure(figsize=(10,5),dpi=80)  #plt.figure()定义画布
ax1=plt.subplot(1,2,1) #创建一个1行2列的子图，并开始绘制第一个子图

plt.title('Survived Count')
plt.bar(_x[0],_y[0],color='#39cc6A',align='center',label='survived') #bar绘制直方图
plt.bar(_x[1],_y[1],color='#ff9361',align='center',label='not survived')
label=['survived','not survived']
plt.xlabel('survived or not',fontsize=10) #添加x轴标签
plt.ylabel('count',fontsize=10) #添加y轴标签
plt.ylim(0,600)

ax2=plt.subplot(1,2,2) #绘制第2个子图
plt.title('Survived Rate')
plt.pie(total_survived,labels=['not survived','survived'],colors=['#ff9361','#39cc64'], autopct='%3.0f%%', startangle=230)
plt.axis('equal')

#plt.legend() 添加图例
plt.show()


结论1：由图形可以看出，这891名乘客中，获救的占38%，没获救的占比62，死亡率很高。

这里遇到一个问题：绘制直方图，X轴的标签赋值label设置无效。但是饼图中的label有效。希望有大佬可以解答一下，谢谢。

问题2：船舱等级Pclass对存活Survived的影响？

df['Pclass']=df['Pclass'].astype('str')
df_survived=df['Pclass'][df['Survived']==1] #将获救的Pclass数据取出来，右边等式返回的是索引值和Pclass值
df_not_survived=df['Pclass'][df['Survived']==0] #提取未获救的Pclass数据

plt.figure(figsize=(10,5),dpi=80)

plt.hist([df_survived,df_not_survived],stacked=True,color=['#39cc6a','#ff9361'],label=['Survived','Not Survived'])
plt.xticks(['1','2','3'],['Upper','Middle','Lower'])
plt.legend()  #添加数据图例
plt.xlabel('Pclass',fontsize=10)
plt.ylabel('Count',fontsize=10)
plt.title('Pclass_Survived')
plt.ylim(0,600)


结论2：第3层的船舱人数越多，获救率反而最小，船舱等级越高，获救率越大
问题3：性别Sex对存活Survived的影响？

df['Sex']=df['Sex'].astype('str')
df_sex1=df['Sex'][df['Survived']==1]
df_sex0=df['Sex'][df['Survived']==0]

plt.figure(figsize=(5,5),dpi=80)

plt.hist([df_sex1,df_sex0],stacked=True,color=['#39cc6a','#ff9361'],label=['Survived','Not Survived'])
plt.xticks([-1,0,1,2],[-1,'F','M',2])
plt.legend()
plt.xlabel('Sex',fontsize=10)
plt.ylabel('count',fontsize=10)
plt.ylim(0,600)
plt.title('Sex_Survived')

plt.show()


结论3：船上男性的人数比女性多，但女性的获救率远大于男性
问题4：年龄Age对存活Survived的影响？

#先对于年龄进行分层
def age_level(age):
if age <= 9:
return str('1')
elif age <=24:
return str('2')
elif age <=59:
return str('3')
else:
return str('4')

df['Age']=df['Age'].apply(lambda x: age_level(x))

df_age1=df['Age'][df['Survived']==1]
df_age0=df['Age'][df['Survived']==0]

plt.figure(figsize=(10,5),dpi=80)
plt.hist([df_age1,df_age0],stacked=True,color=['#39CC6A','#FF9361'],label=['Survived','Not Survived'])
plt.xticks(['1','2','3','4'],['kids','youth','middle','old'])
plt.legend()
plt.xlabel('Age_level',fontsize=10)
plt.ylabel('count',fontsize=10)
plt.title('Age_Survived')
plt.ylim(0,700)

plt.show()


结论4：中年人（24-59岁）的人数最多，获救人数也最多，儿童（0-9岁）的获救率最高。

展开全文
• 一、数据来源数据集来自于Kaggle。...二、相关工具2.1 Python 3.5.22.2 Anaconda 3三、牛刀小试3.1 导入训练数据集import pandas as pdimport numpy as npfrom pandas import Series,DataFramef = open(r'E:\Python\...

一、数据来源

数据集来自于Kaggle。Kaggle是一个数据分析建模的应用竞赛平台。当然也可以从其它地方下。

二、相关工具

2.1 Python 3.5.2

2.2 Anaconda 3

三、牛刀小试

3.1 导入训练数据集

import pandas as pd

import numpy as np

from pandas import Series,DataFrame

f = open(r'E:\Python\数据分析\data\train.csv')

对数据进行初步分析

data_train.describe()

运行结果如下：

进一步分析

data_train.info()

运行结果：

3.2 数据图像化分析

数据中的各个属性

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif']=['SimHei']

fig = plt.figure()

fig.set(alpha=0.2)

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.title(u"乘客等级分布")

plt.ylabel(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"年龄")

plt.ylabel(u"密度")

plt.title(u"各等级的乘客年龄分布")

plt.legend((u'头等舱', u'2等舱',u'3等舱'),loc='best')

plt.subplot2grid((2,3),(1,2))

data_train.Embarked.value_counts().plot(kind='bar')

plt.title(u"各登船口岸上船人数")

plt.ylabel(u"人数")

plt.show()

运行结果：

展开全文
• 泰坦尼克数据集下载 训练集 测试集 导入需要的库 import matplotlib.pyplot as plt %matplotlib inline import numpy as np import pandas as pd 加载数据集 train_file = './data/titanic/train.csv' eval_file = ...
• 1 引言 刚接触python与大数据不久，这个是学长给出的练习题目。知识积累太少，学习用了不少的时间。...2.2 泰坦尼克号 本次问题页面 请到Data页面下载数据集 数据集的各属性在Data页面下有详细介绍。 ...
• 数据的质量决定了模型的好坏，本文以泰坦尼克号数据集为例，做一下数据集的清洗（主要是缺失值的填充） 过程 （最近的时间精力有限，代码见gitee）:泰坦尼克号数据清洗 总结 <如果您发现我写的有错误，欢迎在评论...
• 用随机森林实现泰坦尼克号数据集的分类预测，包含参数调试过程和分类结果评估，并绘制ROC曲线。
• 文章目录前言具体步骤总结 ...（最近时间精力有限，具体代码过程见github，程序和注解比较详细）：以泰坦尼克号数据集为例做python可视化EDA 总结 (如果您发现我写的有错误，欢迎在评论区批评指正) ...
• 泰坦尼克号-数据分析 对泰坦尼克号数据集进行统计分析，以预测哪些乘客能够幸存。 要使用python脚本，请创建一个csv文件夹，并在其中提供文件train.csv和test.csv 。 可以从下载这两个数据集。
• 泰坦尼克号数据 进行特征分析、数据清理、数据填充、处理分类特征、将连续特征转化为离散特征、合并特征、制作模型、模型预测 import pandas as pd import numpy as np import matplotlib.pyplot as plt #将警告...
• 泰坦尼克号数据集 链接：https://pan.baidu.com/s/10y2SRH7Ry_W3CZC3s8PHWw 提取码：s128 复制这段内容后打开百度网盘手机App，操作更方便哦 导入必要的库 import numpy as np import pandas as pd pandas读取数据...
• Python泰坦尼克生还预测 Kaggle Titanic 数据分析案例 背景介绍 20世纪初，由英国白星航运公司制造的一艘巨大豪华客轮。是当时世界上最大的豪华客轮，被称为是“永不沉没的”或是“梦幻客轮”。 泰坦尼克号是...
• Datawhale开源课程：泰坦尼克号乘客数据分析 第一章 数据载入及探索性数据分析
• 理解数据导入数据采集数据查看数据集信息3. 数据清洗数据预处理特征工程4. 构建模型5. 模型评估6. 方案实施提交结果报告撰写一、提出问题什么样的人可以在泰坦尼克号事故中生存下来二、理解数据① 导入数据(pd.read...
• 项目：泰坦尼克号生存探索 安装 此项目需要Python并安装以下Python库： 您还需要安装软件才能运行和执行 如果尚未安装Python，则强烈建议您安装Python的发行版，该发行版已包含上述软件包，其中包括更多软件包。 ...
• 经典又兼具备趣味性的案例泰坦尼克号问题源码。大家都熟悉的『Jack and Rose』的故事，豪华游艇倒了，大家都惊恐逃生，可是救生艇的数量有限，无法人人都有，副船长发话了『lady and kid first！』，所以是否获救...
• 泰坦尼克号2201人员的csv数据集。 主要特征有：PassengerId、Pclass、Name 、Sex、Age 、SibSp、 Parch、Ticket 、Fare 、Cabin 、Embarked
• python，jupyter-noteboo，数据挖掘，分类预测，泰坦尼克号
• 数据预处理 泰坦尼克号 什么是数据预处理？ (What is Data Pre-Processing?) We know from my last blog that data preprocessing is a data mining technique that involves transforming raw data into an ...
• Python数据分析与挖掘——泰坦尼克号 本文利用已给特征属性和存活与否标签的训练和只包含特征信息测试集数据，通过决策树等模型来预测测试集数据乘客的生存情况 #导包 import numpy as np import pandas as pd ...

...