本文以经典的泰坦尼克数据,熟悉掌握基本的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()
训练集数据结果:
<class 'pandas.core.frame.DataFrame'>
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 Survived Pclass Age SibSp Parch Fare
count 891.000000 891.000000 891.000000 714.000000 891.000000 891.000000 891.000000
mean 446.000000 0.383838 2.308642 29.699118 0.523008 0.381594 32.204208
std 257.353842 0.486592 0.836071 14.526497 1.102743 0.806057 49.693429
min 1.000000 0.000000 1.000000 0.420000 0.000000 0.000000 0.000000
25% 223.500000 0.000000 2.000000 20.125000 0.000000 0.000000 7.910400
50% 446.000000 0.000000 3.000000 28.000000 0.000000 0.000000 14.454200
75% 668.500000 1.000000 3.000000 38.000000 1.000000 0.000000 31.000000
max 891.000000 1.000000 3.000000 80.000000 8.000000 6.000000 512.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 687 77.1
Age 177 19.9
Embarked 2 0.2
Fare 0 0.0
Ticket 0 0.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个时除外。
本篇结束,下篇将展示特征进行数值化处理的过程与结果。