案例分析:
利用pandas来做一个实际案例分析。背景:船要沉了,我们根据各种影响因素,判断什么因素对船上成员的存活率影响较大。
先下载训练集名为train.csv,把该文件与程序文件放在同一个文件夹下。
1.导包:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
2.导入文件
f=pd.read_csv('train.csv')
print(df)
print(df.shape)
print(df.head(5))
读入数据:
pd.read_csv('train.csv')
或df=pd.read_table('train.csv',sep=",")使用pd_read.table(),需要指定是什么样分隔符的文本文件。用sep=””来指定。
PassengerId Survived Pclass ... Fare Cabin Embarked
0 1 0 3 ... 7.2500 NaN S
1 2 1 1 ... 71.2833 C85 C
2 3 1 3 ... 7.9250 NaN S
3 4 1 1 ... 53.1000 C123 S
4 5 0 3 ... 8.0500 NaN S
.. ... ... ... ... ... ... ...
886 887 0 2 ... 13.0000 NaN S
887 888 1 1 ... 30.0000 B42 S
888 889 0 3 ... 23.4500 NaN S
889 890 1 1 ... 30.0000 C148 C
890 891 0 3 ... 7.7500 NaN Q
[891 rows x 12 columns]
(891, 12)
PassengerId Survived Pclass ... Fare Cabin Embarked
0 1 0 3 ... 7.2500 NaN S
1 2 1 1 ... 71.2833 C85 C
2 3 1 3 ... 7.9250 NaN S
3 4 1 1 ... 53.1000 C123 S
4 5 0 3 ... 8.0500 NaN S
[5 rows x 12 columns]
我们可以看到,这个文件有891行,12列。所以我们可以不用把它全部打开看,只看它前5行暂时就够了。把前5行的列全部展示出来如下:
我们可以看到,每个成员具有12个属性,比如Survived这个属性,只有0和1两个值,0代表死亡,1代表存活。Pclass代表乘客的船舱等级。
3.计算所有的空值
print(df.isnull().sum())
PassengerId 0
Survived 0
Pclass 0
Name 0
Sex 0
Age 177
SibSp 0
Parch 0
Ticket 0
Fare 0
Cabin 687
Embarked 2
dtype: int64
发现Cabin有687个空值。
观察各成员属性:一般来说,Name,Sex等属性应该是String属性 但在python里,会自动默认为 object 属性
print(df.dtypes)
PassengerId int64
Survived int64
Pclass int64
Name object
Sex object
Age float64
SibSp int64
Parch int64
Ticket object
Fare float64
Cabin object
Embarked object
dtype: object
4.我们读数据是为了判断有多少人活了下来,我们可以直接读取Survived这个属性的值
print(df.Survived.value_counts())
0 549
1 342
Name: Survived, dtype: int64
死亡人数549,存活人数342.
我们用柱状图表示存活和死亡人数
plt.figure(figsize = (10,5)) # 创建画布
plt.subplot(121) # 添加第一个子图
sns.countplot(x='Survived',data=df)
plt.title('Survived count')
plt.show()
5.用value_counts ()这个函数还可以读取属性的值,我们来看下不同舱位的人分别有多少
print(df.Pclass.value_counts())
3 491
1 216
2 184
Name: Pclass, dtype: int64
共有3个舱,1代表高等舱,3代表低等舱。
6.我们在用isnull()读取空值的时候,会发现Cabin这个属性有687个空值,有687个成员没有这个属性,那么这个属性相对其他属性价值小,我们可以把它删除。
df1=df.drop('Cabin',axis=1)
print(df1.head(5))
PassengerId Survived Pclass \
0 1 0 3
1 2 1 1
2 3 1 3
3 4 1 1
4 5 0 3
Name Sex Age SibSp \
0 Braund, Mr. Owen Harris male 22.0 1
1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1
2 Heikkinen, Miss. Laina female 26.0 0
3 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1
4 Allen, Mr. William Henry male 35.0 0
Parch Ticket Fare Embarked
0 0 A/5 21171 7.2500 S
1 0 PC 17599 71.2833 C
2 0 STON/O2. 3101282 7.9250 S
3 0 113803 53.1000 S
4 0 373450 8.0500 S
等同于下图
我们会发现Cabin这个属性已经没有了。
7.我们再观察之前输出的空值,Age这个属性,存在177个空值。意味着这个文件里并没有把所有的成员年龄都记录上,我们可以删除也可以补上。我们这个属性选择补上。
df1['Age']=df1['Age'].fillna(20)
print(df1.isnull().sum())
PassengerId 0
Survived 0
Pclass 0
Name 0
Sex 0
Age 0
SibSp 0
Parch 0
Ticket 0
Fare 0
Embarked 2
dtype: int64
8.现在就只剩下Embarked这个属性还有两个空值。我们可以将这两个带有空值的成员也直接删除。
df2=df1[df1['Embarked'].notnull()]
print(df2.isnull().sum())
PassengerId 0
Survived 0
Pclass 0
Name 0
Sex 0
Age 0
SibSp 0
Parch 0
Ticket 0
Fare 0
Embarked 0
dtype: int64
看一个目前的成员数:
print(df2.shape)
(889, 11)
原来891个成员,现在889,删除了两个。
9.刚才我们是对特定的某一个属性进行查看的,我们也可以对多个属性一起看
print(df1.loc[10:14,['Name','Sex','Survived']])
Name Sex Survived
10 Sandstrom, Miss. Marguerite Rut female 1
11 Bonnell, Miss. Elizabeth female 1
12 Saundercock, Mr. William Henry male 0
13 Andersson, Mr. Anders Johan male 0
14 Vestrom, Miss. Hulda Amanda Adolfina female 0
10.具体分析男女存活的人数,我们可以利用 pivot_table() 来建立表格
print(df2.pivot_table(values='PassengerId',index='Survived',columns='Sex',aggfunc='count'))
Sex female male
Survived
0 81 468
1 231 109
通过这个表格我们可以看出,女性活下来231人,死去81人。相对男性存活率高多了。
11.那么继续分析活下来的人,选取Survived里面值为1的成员。
df4=df2.loc[df2['Survived']==1]
print(df4.shape)
(340, 11)
完成。
plt.figure(figsize= (10 ,5))
sns.barplot(data=df,x="Pclass",y="Survived",ci=None) # ci表示置信区间
plt.show()
最后判断两个属性是否相关,用corr()函数:
print(df['Survived'].corr(df['Pclass']))
-0.33848103596101475
可以看出,舱位的高低和存活率的关系:-0.338是负数,证明是负相关,也就是说,舱舱数,死亡概率也大。