泰坦尼克号项目数据可在kaggle上免费下载。
一、分析目的:探索泰坦尼克号乘客存活影响因素
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib notebook
plt.rcParams['font.sans-serif'] = ['FangSong']
plt.rcParams['axes.unicode_minus'] = False
data = pd.read_csv('titanic_data.csv')
data.head()
二、分析思路
我们的目的是要探寻乘客存活因素。观察上面的表头,可大致判断乘客的幸存与否与名字和上船地点应该没有关系。所以我们探寻的应该是:
1、探索舱室等级与存活率的关系
2、探索性别与存活率的关系
3、探索年龄与存活率的关系
4、探索兄弟姐妹/配偶数量与存活率的关系
5、探索父母/小孩数量与存活率的关系
6、探索票价与存活率的关系
三、数据准备与处理
data.info()
data.isnull().sum()
处理缺失值,上船地点的缺失值暂时与我的分析无关,缺失的年龄用其他你年龄的平均值代替。
data['Age'].fillna(data['Age'].mean(), inplace=True)
四、数据分析¶
相关分析
data.corr()['Survived']
1、探索舱室等级与存活率的关系
df_Pclass = data.groupby('Pclass')['Survived'].mean()
print(df_Pclass)
df_Pclass.plot(kind='bar', title='Pclass distributed')
plt.ylabel('生存率')
plt.xticks(rotation=360)
2、探索性别与存活率的关系
df_sex = data.groupby('Sex')['Survived'].mean()
print(df_sex)
df_sex.plot(kind='bar', title='Sex distributed')
plt.ylabel('生存率')
plt.xticks(rotation=360)
3、探索年龄与存活率的关系
首先要对年龄进行分组,再进行可视化
bins = np.arange(0, 90, 10)
age_groups = pd.cut(data['Age'], bins)
df_age = data.groupby(age_groups)['Survived'].mean()
print(df_age)
df_age.plot(kind='bar', title='Age distributed')
plt.ylabel('生存率')
plt.xticks(rotation=360)
4、探索兄弟姐妹/配偶数量与存活率的关系
df_SibSp = data.groupby('SibSp')['Survived'].mean()
print(df_SibSp)
df_SibSp.plot(kind='bar', title='SibSp distributed')
plt.ylabel('生存率')
plt.xticks(rotation=360)
5、探索父母/小孩数量与存活率的关系
df_Parch = data.groupby('Parch')['Survived'].mean()
print(df_Parch)
df_Parch.plot(kind='bar', title='Parch distributed')
plt.ylabel('生存率')
plt.xticks(rotation=360)
首先将票价分组,预先得知最低票价为0,最高票价为512.3292
bins = np.arange(0, 600, 50)
fare_groups = pd.cut(data['Fare'], bins)
df_Fare = data.groupby(fare_groups)['Survived'].mean()
print(df_Fare)
df_Fare.plot(kind='bar', title='Fare distributed')
plt.ylabel('生存率')
plt.xticks(rotation=90)
我在这里发现了一个奇怪的现象,数据中是没有300-500区间的票价的,但是有500-550的票价,而且存活率为100%。不知道这是不是异常值,我好奇地分析了一下。
print(data.groupby(fare_groups)['Survived'].count())
plt.style.use('ggplot')
plt.boxplot(data['Fare'])
由于0-50票价的人数众多,达716人,所以我们看到,箱线图的上边缘还不到100,100-550的区间都被定义为了异常值。
在上面的分组分析中,年龄和票价我用到了分布分析的方法,分布分析是指将数据(定量数据)进行等距或者不等距的分组,进而研究各组分布规律的一种分析方法。
交叉分析
通常用于两个或两个以上,分组变量之间的关系,以交叉表形式进行变量间关系的对比分析
new_df = data.pivot_table(values=['Survived'], index=['Pclass'], columns=age_groups, aggfunc=[np.mean])
new_df
for i in [1, 2, 3]:
plt.figure(figsize=(8, 8))
new_df.loc[i].plot(kind='bar', title='Pclass'+str(i)+' survival rate')
plt.xlabel('年龄段')
plt.ylabel('生存率')