本周原想探究一下seaborn绘图方面的运用,发现用在实际案例中更有效果,遂直接用Kaggel 经典的Titanic案例的描述性分析部分进行研究。以下是案例的其中一部分,模型探究有待补充与更新。
复习一下,完成这篇分析报告需要进行的几个步骤:
一、导入数据包与数据集
二、数据分析
1、总体预览
2、描述性统计分析:使用统计学与绘图,初步了解数据之间相关性,为构造特征工程和模型建立做准备
3、数据清洗
4、建模与优化:
1)参数优化;
2)训练模型;
3)交叉验证
5、预测
本文先进行数据分析前三步:
一、导入数据包和数据集
%matplotlib inline
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
train=pd.read_csv(r'/Users/----/Documents/train.csv')
test=pd.read_csv(r'/Users/----/Documents/test.csv')
PassengerId=test['PassengerId']
all_data=pd.concat([train,test],ignore_index=True) #不按索引进行同字段标题的追加,同时做到重新给索引负值
二、数据分析
1、数据预览:
train.head()
train.info()
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
0 1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 NaN S
1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 0 PC 17599 71.2833 C85 C
2 3 1 3 Heikkinen, Miss. Laina female 26.0 0 0 STON/O2. 3101282 7.9250 NaN S
3 4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 0 113803 53.1000 C123 S
4 5 0 3 Allen, Mr. William Henry male 35.0 0 0 373450 8.0500 NaN S
2、数据初步分析:使用统计学与绘图
训练集幸存人数与遇难人数汇总
1)sex:性别与生存率关系——女性幸存率远高于男性
train['Survived'].value_counts()
#分类变量(sex)和0-1变量(survived)的关系
sns.barplot(x='Sex',y='Survived',data=train)
2)Pclass:客舱等级与幸存率关系——乘客社会等级越高生存率越高
sns.barplot(x='Pclass',y='Survived',data=train)
3)SibSp:旁系亲属人数适中的乘客幸存率更高
sns.barplot(x='SibSp',y='Survived',data=train)
4)Parch 直系亲属(父母&子女)数量适中的幸存率更高
sns.barplot(x='Parch',y='Survived',data=train)
5) 从不同生还情况密度图看出,在年龄15岁左侧,生还率有明显差别,密度图非交叉区域较大,其他年龄段差别不明显。可以考虑将年龄偏小的区域分离出来。
facet=sns.FacetGrid(train,hue='Survived',aspect=2)
facet.map(sns.kdeplot,'Age',shade=True)
facet.set(xlim=(0,train['Age'].max()))
facet.add_legend()
plt.xlabel('Age')
plt.ylabel('density')
6)Embarked:登岗港口与生存情况分析:C地生存率更高,可以考虑作为模型特征。
sns.countplot('Embarked',data=train) #登陆港口不同的数量分布
sns.countplot('Embarked',hue='Survived',data=train) #登陆港口不通的生存数量对比
7)Title:不同称呼的乘客幸存率不同
新增title特征,从姓名中提取乘客称呼,归为六类:
all_data['Title']=all_data['Name'].apply(lambda x:x.split(',')[1].split('.')[0].strip())
#选择称呼中的‘姓’:‘,’分隔后第二位置的部分,再次用‘.’分隔选择第一个位置单词.也就是姓氏的第一个词
Title_Dict={}
Title_Dict.update(dict.fromkeys(['Capt','Col','Major','Dr','Rev'],'Officer'))
Title_Dict.update(dict.fromkeys(['Don','Sir','Dona','the Countess','Lady'],'Royalty'))
Title_Dict.update(dict.fromkeys(['Mme','Ms','Mrs'],'Mrs'))
Title_Dict.update(dict.fromkeys(['Mlle','Miss'],'Miss'))
Title_Dict.update(dict.fromkeys(['Mr'],'Mr'))
Title_Dict.update(dict.fromkeys(['Master','Jonkheer'],'Master'))
all_data['Title']=all_data['Title'].map(Title_Dict)
sns.barplot(x='Title',y='Survived',data=all_data)
8)FamilySize:家庭成员数量2~4乘客幸存率最高
新增FamilyLabel 特征,计算familysize=Parch+SibSp+1,再分成三类
all_data['FamilySize']=all_data['SibSp']+all_data['Parch']+1 #家庭成员数量:旁系亲属+直系亲属+自己
sns.barplot(x='FamilySize',y='Survived',data=all_data)
def Fam_label(s):
if (s>=2)&(s<=4):
return 2 #小家庭
elif((s>4)&(s<=7)|(s==1)):
return 1
elif(s>7):
return 0
all_data['FamilyLabel']=all_data['FamilySize'].map(Fam_label)
sns.barplot(x='FamilyLabel',y='Survived',data=all_data)
all_data['FamilyLabel']=all_data['FamilySize'].apply(Fam_label) #map 和 apply 什么区别。。。
all_data['FamilyLabel'][:5]
9)Deck :不同甲板的乘客幸存率不同
新增Deck特征,先把Cabin空缺填充为unknown,再提取Cabin中的首字母构成乘客甲板号
#不同甲板乘客生存率不同
all_data['Cabin']=all_data['Cabin'].fillna('Unknown') #空白填充unknown
all_data['Deck']=all_data['Cabin'].str.get(0) #提取首字母作为标签
sns.barplot(x="Deck",y='Survived',data=all_data)
10)TicketGroup:与2~4人工票号数的乘客幸存率更高
#新增生存率特征,统计每个乘客共票号数
Ticket_Count=dict(all_data['Ticket'].value_counts())
all_data['TicketGroup']=all_data['Ticket'].apply(lambda x:Ticket_Count[x])
sns.barplot(x='TicketGroup',y='Survived',data=all_data)
按照生存率把TickedGroup分三类
#把 ticket_counts 分成三类
def Ticket_Label(s):
if (s>=2)&(s<=4):
return 2 #小家庭
elif((s>4)&(s<=8))|(s==1):
return 1 #大家庭
elif(s>8):
return 0 #单身出行
all_data['TicketGroup']=all_data['TicketGroup'].map(Ticket_Label)
sns.barplot(x='TicketGroup',y='Survived',data=all_data)
以上主要对数据进行描述性分析的步骤。