泰坦尼克号数据分析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=pd.read_csv(r'train.csv')
先了解数据的概括(形状,缺失值)
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岁)的获救率最高。
参考文章:https://blog.csdn.net/jessie0615/article/details/90173259