本文以经典的泰坦尼克数据,熟悉掌握基本的Python数据分析,以及可视化步骤。
工具:jupyter notebook
所需模块:pandas,numpy,matplotlib,seaborn,sklearn
数据文件:链接:迅雷云盘 提取码:MOGD
导入库
# 数据分析
import pandas as pd
import numpy as np
# 绘图
import matplotlib.pyplot as plt
from matplotlib import style
import seaborn as sns
获取数据
# 导入数据
test_df = pd.read_csv("test.csv")
train_df = pd.read_csv("train.csv")
数据分析
# 查看训练集数据信息
train_df.info()
训练集数据结果:
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 PassengerId 891 non-null int64
1 Survived 891 non-null int64
2 Pclass 891 non-null int64
3 Name 891 non-null object
4 Sex 891 non-null object
5 Age 714 non-null float64
6 SibSp 891 non-null int64
7 Parch 891 non-null int64
8 Ticket 891 non-null object
9 Fare 891 non-null float64
10 Cabin 204 non-null object
11 Embarked 889 non-null object
dtypes: float64(2), int64(5), object(5)
memory usage: 83.7+ KB
泰坦尼克训练集数据共计891条信息,包括:survival: 是否存活
PassengerId: 乘客ID
pclass: 舱位,1为头等舱
sex: 性别
Age: 年龄
sibsp: 兄弟姐妹/配偶数量
parch: 父母/小孩数量
ticket: 船票号码
fare: 船票费用
cabin: 客舱号码
embarked: 登船港口
部分数据存在缺失
查询数据集的前10行:
# 查看训练集数据
train_df.head(10)
获取描述统计信息:
# 查看描述统计
train_df.describe()
描述统计结果:
PassengerId SurvivedPclass Age SibSp Parch Fare
count 891.000000 891.000000891.000000714.000000891.000000891.000000891.000000
mean 446.000000 0.3838382.30864229.6991180.5230080.38159432.204208
std 257.353842 0.4865920.83607114.5264971.1027430.80605749.693429
min 1.000000 0.0000001.0000000.4200000.0000000.0000000.000000
25% 223.500000 0.0000002.00000020.1250000.0000000.0000007.910400
50% 446.000000 0.0000003.00000028.0000000.0000000.00000014.454200
75% 668.500000 1.0000003.00000038.0000001.0000000.00000031.000000
max 891.000000 1.0000003.00000080.0000008.0000006.000000512.329200
从数据集信息以及描述统计结果来看,泰坦尼克乘客幸存率为38.38%,年龄段从0.4至80岁,"Age", "Cabin","Embarked"字段存在缺失值,后面会对缺失值进行处理。
# 查看缺失值,降序排列
total = train_df.isnull().sum().sort_values(ascending = False)
percent_1 = train_df.isnull().sum()/train_df.isnull().count()*100
percent_2 = (round(percent_1,1)).sort_values(ascending = False)
missing_data = pd.concat([total, percent_2],axis = 1, keys = ["total","%"])
# concat合并数据集
missing_data.head()
显示缺失值数量及占比:
total %
Cabin 68777.1
Age 17719.9
Embarked 20.2
Fare 00.0
Ticket 00.0
进行数据分析要做一些预处理。首先,需要把多个特征转换成数字特征,这样机器学习算法才能处理它们。其次,这些特征处于不同的范围,需要转换成大致相同的范围内。最后需要处理包含缺失值(NaN =不是数字)的特征。
可以通过查看列名确定特征
# 查看列名
train_df.columns.values
主要特征包括:
array(['PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp',
'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'], dtype=object)
其中包括11个特征,以及1个目标值('Survived')
那么,哪些特征可以导致高幸存率?
1. 年龄(Age)和性别(Sex)
# 创建1行2列,大小为10X4 的画布
fig, axes = plt.subplots(nrows =1 ,ncols = 2 ,figsize =(10,4))
#也可以fig, axes = plt.subplots(1,2 ,figsize =(10,4))
# 选取数据
women = train_df[train_df["Sex"]=="female"]
men = train_df[train_df["Sex"]=="male"]
# 在画布第1列绘制男性幸存与否直方图
ax = sns.distplot(men[men["Survived"]==1].Age.dropna(),
#color="g",#可以自定义颜色
bins=18, label = "Survived", ax = axes[0], kde =False)
ax = sns.distplot(men[men["Survived"]==0].Age.dropna(),
bins=40, label = "Not_survived", ax = axes[0], kde =False)
# 添加图例和标题
ax.legend()
ax.set_title("Male")
# 在画布第2列绘制女性幸存与否直方图
_ax = sns.distplot(women[women["Survived"]==1].Age.dropna(),
#color="g",
bins=18, label = "Survived", ax = axes[1], kde =False)
_ax = sns.distplot(women[women["Survived"]==0].Age.dropna(),
bins=40, label = "Not_survived", ax = axes[1], kde =False)
# 添加图例和标题
_ax.legend()
_ax.set_title("Female")
# 保存图片
#fig.savefig("./picture/age_and_sex.png",dpi = 120)
结果展示:
女性的幸存率明显高于男性。对男性而言,18至30岁有较高的幸存率,而女性在14至40岁有较高的幸存率。5至18岁的男性存活率明显低于同年龄段的女性,另外无论男女,婴儿的幸存率都很高。
2. 登船港口(Embarked),舱位(Pclass)与性别(Sex)
# facetgrid 对数据集根据col,row 实例化facegrid类,生成对象
FacetGrid = sns.FacetGrid(train_df, col="Embarked",
# row = "Embarked"则图片纵向排列,
height=4.5, #高度
aspect=1.2 #长宽比
)
FacetGrid.map(sns.pointplot, "Pclass", "Survived", "Sex",
palette=None, #调色板
order=None,
hue_order=None
)
# 添加图例
FacetGrid.add_legend()
结果展示:
不同登船港口,乘客幸存率不同,且与性别有明显的关系。其中,S港和Q港的女性幸存率高与男性,C港口正相反;同时也可以看出,舱位(Pclas)也与幸存率相关。
3. 舱位(Pclass)
# 绘制各仓位的幸存率
fig,axes = plt.subplots(1,2,figsize =(10,4))
sns.barplot(x = "Pclass", y = "Survived", data = train_df, ax=axes[0],
palette="Set2",#调色板
capsize=0.05, #横线宽度
errwidth= 1.2, #误差线宽度
errcolor="0.1",#误差线颜色透明度,1为白色
#alpha = 0.8 #透明度
)
sns.barplot(x = "Pclass", y = "Survived", hue = "Sex", data = train_df, ax=axes[1],
capsize=0.05, #横线宽度
errwidth= 1.2, #误差线宽度
errcolor="0.1",#误差线颜色透明度,1为白色
alpha = 0.6 #透明度
)
结果展示:
明显可以看出,舱位等级越高,乘客幸存率也越高,头等舱的幸存率是三等舱的两倍还要多。(金钱可以提高生存率 #狗头 )并且舱位间的性别幸存差异也非常明显。
# 不同舱位下,各年龄的幸存与否人数
grid = sns.FacetGrid(train_df, row = "Survived", col = "Pclass",
height = 3 ,aspect = 1.2)
grid.map(plt.hist, "Age", bins = 20, alpha = 0.6)
grid.add_legend()
结果展示:
可以看个各舱位幸存的人数,头等舱幸存人数最多,而三等舱的遇难人数最多。
4. 亲属(SibSp,Parch)
将SibSp-兄弟姐妹、配偶和 Parch-父母、小孩 合并成一个因素--亲属
# 将SibSp-兄弟姐妹、配偶和 Parch-父母、小孩 合并成一个因素, 亲属
data = [train_df, test_df]
# 添加relatives列
for dataset in data:
dataset["relatives"] = dataset["SibSp"] + dataset["Parch"]
dataset.loc[dataset["relatives"] > 0, "not_alone"] = 0
dataset.loc[dataset["relatives"] == 0, "not_alone"] = 1
dataset["not_alone"] = dataset["not_alone"].astype(int)
train_df["not_alone"].value_counts()
有无亲属:
1 537
0 354
Name: not_alone, dtype: int64
axes = sns.factorplot("relatives","Survived",
data=train_df, aspect = 2.5, )
结果展示:
axes = sns.catplot("relatives", "Survived", data = train_df, aspect = 2)
亲属的数量为1-3个时,有较高的幸存率,低于1个或者高于3个幸存率下降,亲属数量为6个时除外。
本篇结束,下篇将展示特征进行数值化处理的过程与结果。