精华内容
下载资源
问答
  • 泰坦尼克数据集Titanic

    2020-04-22 13:05:13
    提供的训练数据集包含11个特征,分别是:Survived:0代表死亡,1代表存活;Pclass:乘客所持票类,有三种值(1,2,3);Name:乘客姓名;Sex:乘客性别;Age:乘客年龄(有缺失);SibSp:乘客兄弟姐妹/配偶的个数(整数值);...
  • Kaggle入门数据集Titanic代码记录

    千次阅读 2017-10-17 11:28:27
    本文大部分文字翻译自Kaggle的“Titanic Data Science Solutions”,以及大部分代码也搬运自此。

    本文大部分文字翻译自Kaggle的“Titanic Data Science Solutions”,以及大部分代码也搬运自此。初入Kaggle坑,拿到Titanic数据集时可以说是毫无头绪,“数据集中的冗余特征怎么通过代码去除?”“缺失值怎么补足?”“特征工程需要做哪些工作?”这些问题让我不知从何下口。记录的初衷在于作为机器学习小白的自己,试图通过这种方法理清思路,加深印象,若能帮到路过的同学,那更是喜不自胜了。

    1.导入库

    import numpy as np
    import pandas as pd
    import random as rnd
    import seaborn as sns
    import matplotlib.pyplot as plt
    from sklearn.linear_model import LogisticRegression
    from sklearn.svm import SVC, LinearSVC
    from sklearn.ensemble import RandomForestClassifier
    from sklearn.neighbors import KNeighborsClassifier
    from sklearn.naive_bayes import GaussianNB
    from sklearn.linear_model import Perceptron
    from sklearn.linear_model import SGDClassifier
    from sklearn.tree import DecisionTreeClassifier

    2.数据探索

    (1)数据概览

    下载数据

    [Titanic数据集下载地址](https://www.kaggle.com/c/titanic/data

    探索数据

    下载页面中共有三个文件,分别是train.csv,test.csv,gender_submission.csv。train是编码为1-891共891名乘客的训练数据,test和gender_submission分别为测试数据和需要提交结果的格式以及正确答案。
    首先在存放数据集的目录下的空白处按住shift键并单击右键,打开cmd。输入python或者ipython,进入python环境。

    (2)基于数据的假设

    根据目前为止的数据分析,我们得出如下假设。我们需要进一步验证这些假设,才能进行下一步分析。

    •相关性

    我们希望知道每个特征与Survived的相关性。我们也希望在project前期做这些工作,而且在之后的建模中匹配这些相关性。

    •填充

    1.填充与Survived明确相关的Age特征。
    2.Embarked可能与Survived相关,也可能与其他重要的属性相关,也要填充
    1.分析中可能不用Ticket特征,因为该特征包含大量的(22%)重复数据,而且Ticket可能与Survived无关。
    2.Cabin特征也不用,因为它的完成度较低,training和test数据集中都中含有大量null数据。
    3.PassengerId因为对Survived没有任何贡献,所以也是无关特征。
    4.Name特征的格式相对不够规范,可能对Survived也没有直接贡献,去掉。

    •创造特征

    1.可以通过Parch和 SibSp特征的加和得出船上的家庭成员总数,从而创造Family特征。
    2.从Name特征提取缩写得到Title特征。
    3.Age分支由连续的数字特征转换为离散的分类特征。
    4.也可以创造一个Fare的区间特征用来辅助分析。

    •分类

    我们也可从问题描述中描述的问题来提出假设。
    1.女性更有可能活下来
    2.孩子更有可能活下来。
    3.头等舱(Pclass=1)的人更有可能活下来。

    (3)分析数据

    为了确认我们的观察和假设是正确的,我们可以分析特征的相关性。我们仅在现阶段特征中没有空值的时候这样做,也只是在特征值为分类(Sex),序列(Pclass)或者离散(SibSp,Parch)的时候才有意义。
    •Pclass
    可以看出Survived和Pclass在Pclass=1的时候有较强的相关性(>0.5),所以最终模型中包含该特征。

    data[['Pclass','Survived']].groupby(['Pclass'],as_index=False).mean().sort_values(by='Survived', ascending=False)

    结果如下:

    Index Pclass Survived
    0 1 0.629630
    1 2 0.472826
    2 3 0.242363

    •Sex
    可以确定在问题定义中的观察——女性有更高的活下来的概率(74%)——是正确的

    data[['Sex','Survived']].groupby(['Sex'],as_index=False).mean().sort_values(by='Survived', ascending=False)

    结果如下:

    Index Sex Survived
    0 female 0.742038
    1 male 0.188908

    •SibSp and Parch
    这些特征与特定的值没有相关性,最好是由这些独立的特征派生出一个新特征或者一组新特征。
    SibSp

    data[['SibSp', 'Survived']].groupby(['SibSp'], as_index=False).mean().sort_values(by='Survived', ascending=False)

    结果如下:

    Index SibSp Survived
    1 1 0.535885
    2 2 0.464286
    0 0 0.345395
    3 3 0.250000
    4 4 0.166667
    5 5 0.000000
    6 8 0.000000

    Parch

    data[['Parch', 'Survived']].groupby(['Parch'], as_index=False).mean().sort_values(by='Survived', ascending=False)

    结果如下:

    Index Parch Survived
    3 3 0.600000
    1 1 0.550847
    2 2 0.500000
    0 0 0.343658
    5 5 0.200000
    4 4 0.000000
    6 6 0.000000

    (3)通过可视化分析数据

    现在我们可以用可视化数据分析的方式进一步确定我们的假设

    关联数值特征

    直方图在分析类似于Age特征的连续数值变量时有助于模式识别。直方图可以直观的看出样本的分布特点。
    注意直方图的X轴代表样本计数或者乘客数量。

    观察

    •婴儿(Age≤4)存活率更高
    •最老的乘客(Age=80)活下来了
    •很大一部分15-25岁的人没活下来
    •幸存者多数在15-35岁

    决定

    这个简要的分析确定了我们的假设就是下一步的工作。
    •在训练模型时应该考虑年龄
    •Age特征中没有值的需要填充
    •年龄需要分组

    g = sns.FacetGrid(data, col='Survived')
    g.map(plt.hist, 'Age', bins=20)
    plt.show()

    Age与Survived的关系

    关联数值和序列特征

    我们用一个简单的绘图识别了多项特征的相关性,这种手段可以用于样本值为数字的特征。

    观察

    •Pclass=3的乘客数量最多,但是幸存率最低。证实了我们以上‘分类’中的假设2
    •婴儿乘客在Pclass=2和Pclass=3中最有可能幸存,进一步证实了‘分类’中的假设2
    •大部分Pclass=1中的乘客幸存下来,证实了‘分类’中的假设3
    •Pclass改变了乘客关于Age的分布

    决定

    •在训练模型时考虑Pclass

    grid = sns.FacetGrid(data, col='Survived', row='Pclass', size=2.2, aspect=1.6)
    grid.map(plt.hist, 'Age', alpha=0.5, bins=20)
    grid.add_legend()
    plt.show()

    这里写图片描述

    关联分类特征

    现在我们可以把要解决的目标与分类特征关联起来了。

    观察

    •女性乘客的存活率优于男性
    •Embarked=C里面的男性幸存率高于女性是个例外,不必要建立Embarked与Survived之间的联系
    •从C和Q港口来的男性在Pclass=3中的幸存率高于Pclass=2
    •Pclass=3中的不同港口登船的存活率规律与整体男性乘客的存活率规律不同

    决定

    •把Sex特征考虑到模型中
    •把Embarked特征完善,并添加到训练模型中

    grid = sns.FacetGrid(data, row='Embarked', size=2.2, aspect=1.6)
    grid.map(sns.pointplot, 'Pclass', 'Survived', 'Sex', palette='deep')
    grid.add_legend()
    plt.show()

    这里写图片描述

    关联分类和数值特征

    我们希望关联分类特征(没有数字值)和数值特征。我们可以考虑关联Embarked(分类,无数值),Sex(分类,无数值),Fare(连续数值),以及Survived(分类,数值)

    观察

    •票价高的乘客更有可能获救
    •登船的港口与幸存率有关

    决定

    •考虑加入票价因素

    grid = sns.FacetGrid(data, row='Embarked', col='Survived', size=2.2, aspect=1.6)
    grid.map(sns.barplot, 'Sex', 'Fare', alpha=.5, ci=None)
    grid.add_legend()

    这里写图片描述

    未完待续

    展开全文
  • Kaggle是一个2010年由Anthony Goldbloom创建的专门为数据科学服务的网站,提供数据科学竞赛,数据库托管,编写和代码分享服务,堪称数据科学家的交友平台。今天,我将试图解决Kaggle上面的经典入门问题——Titianic...

    前言

    Kaggle是一个2010年由Anthony Goldbloom创建的专门为数据科学服务的网站,提供数据科学竞赛,数据库托管,编写和代码分享服务,堪称数据科学家的交友平台。今天,我将试图解决Kaggle上面的经典入门问题——Titianic竞赛https://www.kaggle.com/naresh31/titanic-machine-learning-from-disaster。这个竞赛的主要目的是根据已有的训练集的存活数据,预测测试集的存活数据。下面我将具体介绍数据分析的七个步骤:

    一,引入需要的库和数据集

    1.引入需要的库

    python提供了大量的用于数据处理,绘制图像的库,其中最常用的是pandas,numpy,matplotlib,seaborn这些,运用这些基础的库,我们可以方便的操作数据,分析数据。

    #import essential modules for data analysis and data visualization
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    import seaborn as sns
    import warnings
    warnings.filterwarnings('ignore')
    import os

    2.导入数据

    Titanic数据集有两个部分组成:训练数据集train.csv和测试数据集test.csv,可以从Kaggle网站下载https://www.kaggle.com/c/titanic/data。需要完成的任务是,根据训练数据集去预测测试数据集的人员存活率,保存到csv文件中。可以用pandas的read_csv方法实现,将数据保存到一个DataFrame数据结构中。

    #Importing the datasets
    train = pd.read_csv("train.csv")
    test = pd.read_csv("test.csv")

    3. 数据分析

    首先看一下train.csv和test.csv的数据组成,可以用pandas的sample方法。也可以用describe和info方法看一看数据的详细信息。

    # Let's take a look!
    display(train.sample(5),test.sample(5),train.describe(),test.describe(),train.info(),test.info())

     通过基本的分析,可以得到以下结论:

    1.训练数据集和测试数据集差了一个suivived属性,也就是我们的预测目标。

    2.数据存在缺失,具体来说,Age,Cabin,Embarked,Fare属性存在缺失,需要进行数据补充。

    3.Fare这一列的数据非常不均匀,可能需要进行规整或者其他操作。

    4.数据类型

    Titanic数据主要包括下面几种数据类型:

    • Categorical
      • Nominal(Cabin,Embarked)
      • Dichotomous(Sex)
      • Ordinal(Pclass)
    • Numeric
      • Discrete(PassengerId,SibSp,Parch,Survived)
      • Continuous(Age,Name)

     5.数据展示

    下面用Tableau工具可视化一下数据:

    %%HTML
    <div class='tableauPlaceholder' id='viz1516349898238' style='position: relative'><noscript><a href='#'><img alt='An Overview of Titanic Training Dataset ' src='https:&#47;&#47;public.tableau.com&#47;static&#47;images&#47;Ti&#47;Titanic_data_mining&#47;Dashboard1&#47;1_rss.png' style='border: none' /></a></noscript><object class='tableauViz'  style='display:none;'><param name='host_url' value='https%3A%2F%2Fpublic.tableau.com%2F' /> <param name='embed_code_version' value='3' /> <param name='site_root' value='' /><param name='name' value='Titanic_data_mining&#47;Dashboard1' /><param name='tabs' value='no' /><param name='toolbar' value='yes' /><param name='static_image' value='https:&#47;&#47;public.tableau.com&#47;static&#47;images&#47;Ti&#47;Titanic_data_mining&#47;Dashboard1&#47;1.png' /> <param name='animate_transition' value='yes' /><param name='display_static_image' value='yes' /><param name='display_spinner' value='yes' /><param name='display_overlay' value='yes' /><param name='display_count' value='yes' /><param name='filter' value='publish=yes' /></object></div>                <script type='text/javascript'>                    var divElement = document.getElementById('viz1516349898238');                    var vizElement = divElement.getElementsByTagName('object')[0];                    vizElement.style.width='100%';vizElement.style.height=(divElement.offsetWidth*0.75)+'px';                    var scriptElement = document.createElement('script');                    scriptElement.src = 'https://public.tableau.com/javascripts/api/viz_v1.js';                    vizElement.parentNode.insertBefore(scriptElement, vizElement);                </script>

     通过Tableau的可视化图表,我们可以看出,尽管三等船舱的乘客数量是最多的,但是获救的人中,一等舱的乘客数量反而是最多的,乘船人数女性少于男性,但是获救的女性大于男性数量,同时获救的儿童比例很大,部分和Titanic电影中的台词"女士和儿童优先"吻合。

    二,数据填充

    1.Embarked填充

    首先看一下Embarked数据的整体分布: 

    percent = pd.DataFrame(round(train.Embarked.value_counts(dropna=False, normalize=True)*100,2))
    total = pd.DataFrame(train.Embarked.value_counts(dropna=False))
    
    total.columns = ["Total"]
    percent.columns = ['Percent']
    pd.concat([total, percent], axis = 1)

    可以简单的看出,大部分的Embarked数据是S,总共缺少2条数据,我们可以选择以S进行填充,但是我们可以进一步分析一下数据,首先看一下这俩条数据到底是什么: 

    train[train.Embarked.isnull()]

    下面我们可以从Fare,Pclass,Embarked的分布中探索一下可能的分布:

    fig, ax = plt.subplots(figsize=(16,12),ncols=2)
    ax1 = sns.boxplot(x="Embarked", y="Fare", hue="Pclass", data=train, ax = ax[0]);
    ax2 = sns.boxplot(x="Embarked", y="Fare", hue="Pclass", data=test, ax = ax[1]);
    ax1.set_title("Training Set", fontsize = 18)
    ax2.set_title('Test Set',  fontsize = 18)
    fig.show()

    可以看出,不管是在train还是test数据中,当Fare接近80$,大部分一等舱的乘客上船地点是C港口,因此我们选择C港口作为填充数据。我们可以这样分析的主要原因是考虑到邮轮的价格主要和乘船距离和客舱级别有关,因此,相同的价格和相同的客舱级别应当对应相同的上船地点。

    train.Embarked.fillna('C',inplace=True)

     2.Cabin填充

    Cabin数据不管是在train还是在test中都有大量的缺失,比例达到77%,比较简单的方法是直接drop这一列,因为这一列能提供的信息很少,或者简单的按照是否有Cabin进行重新分类,但是这样我们就损失掉了Cabin列包含的信息。考虑到数据集本身比较简单,因此我们进一步探索Cabin列的特点,可以看出Cabin列由字母和数字组成,如果我们拆分出字母,按照Fare进行分类,我们可以发现Cabin列的首字母标识了Fare的高低。

    #Concat train and test into a all_data
    survivers = train.Survived
    train.drop(["Survived"],axis=1, inplace=True)
    all_data = pd.concat([train,test], ignore_index=False)
    
    #using N to fillna
    all_data.Cabin.fillna("N", inplace=True)
    all_data.Cabin = [i[0] for i in all_data.Cabin]
    
    #dig deeper
    with_N = all_data[all_data.Cabin == "N"]
    without_N = all_data[all_data.Cabin != "N"]
    
    all_data.groupby("Cabin")['Fare'].mean().sort_values()

    所以我们可以根据Fare填充Cabin的值:

    def cabin_estimator(i):
        a = 0
        if i<16:
            a = "G"
        elif i>=16 and i<27:
            a = "F"
        elif i>=27 and i<38:
            a = "T"
        elif i>=38 and i<47:
            a = "A"
        elif i>= 47 and i<53:
            a = "E"
        elif i>= 53 and i<54:
            a = "D"
        elif i>=54 and i<116:
            a = 'C'
        else:
            a = "B"
        return a
    
    with_N['Cabin']=with_N.Fare.apply(lambda x: cabin_estimator(x))

     3.Fare填充

    在test数据集中Fare存在一个缺失,我们首先看一下缺失数据的情况,然后根据具体情况,选择适合的某些数据取平均值进行填充:

    print(test[test.Fare.isnull()])
    test.Fare.fillna(test[(test.Pclass==3)&(test.Sex=="male")&(test.Embarked=="S")].Fare.mean(),inplace=True)

    4.Age填充

    Age数据在Test和train数据中缺失的比例都约在20%,根据之前的分析,Age对于预测生存率有很重要的作用,所以我们不能简单的进行均值填充,在此我们采用随机森林回归器进行预测,这一部分在后面的特征工程里面进行实际操作。

    三,可视化和数据关联分析

    四,统计分析

    五,特征工程

    六,训练前步骤

    七,选择模型训练

    八,提交结果

     

    展开全文
  • training.data.raw ('https://raw.githubusercontent.com/agconti/kaggle-titanic/master/data/train.csv')#读取数据集 head(training.data.raw,1)#查看数据项目和类型 > head(training.data.raw,1) PassengerId ...

    1logistic 分布:设X是连续随机变量,X服从logistic分布是指X具有以下分布函数和密度函数:F(x)=P(X\leqslant x)=1/(1+e^{-(x-\mu )/\gamma })                       f(x)={F}'(x)=e^{(x-\mu)/\gamma }/\gamma (1+e^{(x-\mu )/\gamma })^2    

    分布函数F(x)属于逻辑斯蒂函数,图形是一条S曲线,该曲线以点(\mu,1/2)为中心对称,曲线在中心点附近增长速度较快,在两端增长速度较慢,形状参数\gamma的值越小,曲线在中心附近增长越快。

    二项逻辑斯蒂回归模型是一种分类模型,由条件概率分布P(Y\X)表示,形式为参数化的逻辑斯蒂分布,这里随机变量x取值为实数,随机变量y的取值为1或0.通过监督学习的方法来估计模型参数。

    p(Y=1|x)=\frac{exp(w\cdot x+b)}{1+exp(w\cdot x+b)}p(Y=0|x)=\frac{1}{1+exp(w\cdot x+b)}这里,w和b都是参数,分别称为权值向量和偏置。          几率(odds)是指该事件发生的概率与改时间不发生的概率比值。事件的对数几率(log odds)的函数是logit(p)=log(p/1-p)           对于逻辑斯蒂回归而言log\frac{P(Y=1|x)}{1-p(Y=1|x)}=w\cdot x也就是说,在这个回归模型中输出Y=1的对数几率是输入x的线性函数。或者说,输出Y=1的对数几率是由输入x的线性函数表示的模型,即逻辑斯蒂回归模型。

    换一个角度而言,对输入x进行分类线性函数w\cdot x,值域为实数域。通过逻辑斯蒂回归定义,可以将线性函数w\cdot x转换为概率。p(Y=1)=\frac{exp(w\cdot x)}{1+exp(w\cdot x)}这是线性函数的值越接近正无穷,概率值就越接近1.线性函数的值越接近负无穷,概率值就越接近0。这就是逻辑斯蒂回归模型。

    (模型参数估计  多项逻辑斯蒂回归  待补充)

    2与线性回归的对比:

    在线性回归中,因变量的取值范围是整个实轴,这里仅取两个值。

    误差项不是正态分布

    因变量服从伯努利分布而不是正态分布

    3应用

    人力资源分析(应聘结果)  足彩预测  银行风控

    4用R进行案例分析          实现的函数为glm(),需要同时设置参数family="binomial"

    用逻辑回归模型来分析kaggle中Titanic数据集合,通过已知变量来预测乘客是否生还。

    training.data.raw <- read.csv('https://raw.githubusercontent.com/agconti/kaggle-titanic/master/data/train.csv')#读取数据集
    head(training.data.raw,1)#查看数据项目和类型
    > head(training.data.raw,1)
      PassengerId Survived Pclass                    Name  Sex Age SibSp Parch    Ticket Fare Cabin Embarked
    1           1        0      3 Braund, Mr. Owen Harris male  22     1     0 A/5 21171 7.25              S
    
    

    可以看到数据包括12项信息,这里我们想通过 pclass(社会地位),sex(性别),age(年龄),sibsp(家庭关系1,是否夫妻),parch(家庭关系2,父母,孩子,和保姆一起的孩子),fare(票价),embarked(出发港口)这7个变量预测乘客的是否生还。

    data <- subset(training.data.raw,select=c(2,3,5,6,7,8,10,12))#用subset函数选取所需的列
    data$Age[is.na(data$Age)] <- mean(data$Age,na.rm=T)
    data <- data[!is.na(data$Embarked),]#处理NA
    rownames(data) <- NULL
    train <- data[1:800,]#划分训练集
    test <- data[801:889,]#测试集
    model <- glm(Survived ~.,family=binomial(link='logit'),data=train)#模型拟合
    summary(model)#显示拟合细节
    Call:
    glm(formula = Survived ~ ., family = binomial(link = "logit"), 
        data = train)
    
    Deviance Residuals: 
        Min       1Q   Median       3Q      Max  
    -2.6059  -0.5933  -0.4250   0.6215   2.4148  
    
    Coefficients:
                  Estimate Std. Error z value Pr(>|z|)    
    (Intercept)  15.947761 535.411378   0.030   0.9762    
    Pclass       -1.087576   0.151088  -7.198 6.10e-13 ***
    Sexmale      -2.754348   0.212018 -12.991  < 2e-16 ***
    Age          -0.037244   0.008192  -4.547 5.45e-06 ***
    SibSp        -0.293478   0.114660  -2.560   0.0105 *  
    Parch        -0.116828   0.128113  -0.912   0.3618    
    Fare          0.001515   0.002352   0.644   0.5196    
    EmbarkedC   -10.810682 535.411254  -0.020   0.9839    
    EmbarkedQ   -10.812679 535.411320  -0.020   0.9839    
    EmbarkedS   -11.126837 535.411235  -0.021   0.9834    
    ---
    Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
    
    (Dispersion parameter for binomial family taken to be 1)
    
        Null deviance: 1066.33  on 799  degrees of freedom
    Residual deviance:  708.93  on 790  degrees of freedom
    AIC: 728.93
    
    Number of Fisher Scoring iterations: 12

     预测模型的精度

    fitted.results <- predict(model,newdata=subset(test,select=c(2,3,4,5,6,7,8),type='response'))
    fitted.results <- ifelse(fitted.results > 0.5,1,0)
    misClasificError <- mean(fitted.results != test$Survived)
    round(1-misClasificError,3)
    [1] 0.809

    输出结果为0.809 (即预测精度)

    预测评估

    install.packages("ROCR")
    library(ROCR)
    p <- predict(model, newdata=subset(test,select=c(2,3,4,5,6,7,8)), type="response")
    pr <- prediction(p, test$Survived)
    auc <- performance(pr, measure = "auc")
    auc <- auc@y.values[[1]]
    auc
    [1] 0.866342

    画图

    prf <- performance(pr, measure = "tpr", x.measure = "fpr")
    plot(prf)

         

     

    参考资料:李航《统计学》公众号:数萃大数据

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    推荐阅读:https://www.cnblogs.com/nxld/p/6170690.html

    展开全文
  • kaggle竞赛Titanic数据集

    2020-10-11 21:12:17
    kaggle竞赛经典数据集Titanic 包括train.csv test.csv gender_submission.csv
  • titanic数据集

    2020-02-14 14:42:51
    titanic数据集...
  • Titanic数据集

    2016-10-09 15:22:35
    Titanic数据集
  • Titanic-数据集

    2021-04-01 22:41:39
    Titanic-数据集
  • titanic-数据集

    2021-03-30 23:53:35
    titanic-数据集
  • titanic数据集下载

    2018-04-21 20:21:39
    titanic数据集,分为训练集和测试集,训练集有12列特征
  • Titanic生存预测数据集.rar Titanic生存预测数据集.rar Titanic生存预测数据集.rar Titanic生存预测数据集.rar Titanic生存预测数据集.rar Titanic生存预测数据集.rar Titanic生存预测数据集.rar Titanic生存预测...
  • cifar-10-batches(图像数据集)mnist(手写数据集titanic3(泰坦尼克数据集)合集。下载后请阅读ReadMe.txt。对应代码部分及其他说明请访问我的Github:https://github.com/JackDemo/TensorFlow-Keras-python3
  • titanic dataset-数据集

    2021-03-30 20:18:38
    titanic dataset-数据集
  • Titanic:数据集-源码

    2021-03-16 10:26:19
    Titanic:数据集
  • Titanic数据集.zip

    2020-12-31 18:20:48
    kaggle大赛Titanic数据集,之前去kaggle里下载太麻烦了,现在已经打包好了
  • kaggl titanic数据集

    2018-05-04 16:11:32
    kaggle关于泰坦尼克的数据集,里面有3个数据集,是完整的。
  • 探索数据集——Titanic

    千次阅读 2017-06-28 14:41:09
    项目是使用Python对给定数据集进行探索和分析。本次选择的数据集是 泰坦尼克号上 2224 名乘客和船员中 891 名的人口学数据和乘客基本信息。 使用Numpy和Pandas进行数据清洗、处理、绘图,最后进行分析说明。 报告...

    上篇文章的格式有问题,删除了,重新调整格式

    背景

      目前在 优达学城 学习数据分析课程。第二个项目是使用Python对给定数据集进行探索和分析。本次选择的数据集是 泰坦尼克号上 2224 名乘客和船员中 891 名的人口学数据和乘客基本信息。
      报告是使用 jupyter notebook完成的,相关文档放在了个人GitHub上,欢迎讨论交流!

    1. 提出问题

    问题: 有哪些因素会让船上的人,生还率更高?

    对数据集初步了解,猜测有以下因素:

    1. 性别
    2. 年龄
    3. 舱房等级

    2. 调查数据

    2.1 读取源数据

    %pylab inline
    import matplotlib.pyplot as plt
    import seaborn as sns
    import pandas as pd
    import numpy as np
    
    titanic_df = pd.read_csv('titanic-data.csv')
    titanic_df

    数据集

    2.2 数据整理

    2.2.1 补充缺失值

      表格中,年龄Age和舱房Cabin存在空值。用“0”补充上,表示“未知”含义

    titanic_fill = titanic_df.fillna(value=0)
    titanic_fill.head()

    补充缺失值

    2.2.2 筛选数据

    考虑生还率的相关因素,可能是:

    1. 年龄
    2. 性别
    3. 舱房等级
    titanic_key_factors = titanic_fill[['Survived', 'Pclass', 'Sex', 'Age']]
    titanic_key_factors.head()

    关键要素

    3. 探索与分析

    对上述考虑的三种因素分别进行分析:

    1. 单因素分析
    2. 双因素综合分析

    3.1 单因素分析

    3.1.1 舱房等级

    titanic_pclass = titanic_key_factors[['Survived', 'Pclass']]
    # 按 Pclass 分组
    groupby_pclass = titanic_pclass.groupby('Pclass')
    # 各 Pclass 的总人数
    total_groupby_pclass = groupby_pclass.count()
    # 各 Pclass 的生还数
    survived_groupby_pclass = groupby_pclass.sum()
    
    print total_groupby_pclass.rename(columns={'Survived':'Total'})
    print survived_groupby_pclass
    
    # 各 Pclass 的生还率
    survived_rate_pclass = (survived_groupby_pclass/ total_groupby_pclass).rename(columns={'Survived':'Survival Rate'})
    print survived_rate_pclass

    这里写图片描述

    axe_pclass = survived_rate_pclass.plot(kind='bar')
    axe_pclass.set_title('Pclass VS. Survival Rate')
    axe_pclass.set_ylabel('Survival Rate')

    生还率-舱房等级

    说明
      一般来说,游轮舱房的设置,Pclass=1 的应该在上层, Pclass=2 的在中层, Pclass=3 在底层则按常理推测,生还率会是按顺序递减,即 生还率(Pclass=1) > 生还率(Pclass=2) > 生还率(Pclass=3)
      从数据结果来看,符合这种递减趋势。可以将舱房等级视为生还的因素之一。

    3.1.2 性别

    titanic_sex = titanic_key_factors[['Survived', 'Sex']]
    # 按 Sex 分组
    groupby_sex = titanic_sex.groupby('Sex')
    # 各 Sex 的总数
    total_groupby_sex = groupby_sex.count()
    # 各 Sex 的生还数
    survived_groupby_sex = groupby_sex.sum()
    
    print total_groupby_sex.rename(columns={'Survived':'Total'})
    print survived_groupby_sex
    
    survive_rate_sex = (survived_groupby_sex / total_groupby_sex).rename(columns={'Survived':'Survival Rate'})
    print survive_rate_sex

    性别

    axe1_sex = survived_groupby_sex.plot(kind='bar')
    axe1_sex.set_title('Sex VS. Count')
    axe1_sex.set_ylabel('Count')
    
    axe2_sex = survive_rate_sex.plot(kind='bar')
    axe2_sex.set_title('Sex VS. Survival Rate')
    axe2_sex.set_ylabel('Survival Rate')

    生还数-性别
    生还率-性别

    说明
      女性生还率接近男性生还率的四倍。女性生还数是男性的两倍以上。

      按常理推测,男性的强壮性比女性高,生存几率应该较大。出现这种情况,有可能是男性协助女性逃生,或者说将生存机会让给女性。

    3.1.3 年龄

    titanic_age = titanic_key_factors[['Survived', 'Age']]
    
    def group_age(age, lim):
        '''
        将年龄数据 age 分组,按照组距 lim 进行
        '''
        if age == 0:
            return 'unknown'
        group = int(age) / lim
        return ('[%d, %d)') % (group*10, group*10+10)
    
    # 创建年龄分组
    age_group = pd.DataFrame({
        'age_group':[group_age(age, 10) for age in titanic_age.Age]
    })
    
    groupby_age = pd.concat([titanic_age['Survived'], age_group], axis=1)
    # 按年龄段分组的死亡数
    dead_groupby_age = groupby_age[groupby_age.Survived==0].groupby('age_group').count()
    # 按年龄段分组的生还数
    survived_groupby_age = groupby_age[groupby_age.Survived==1].groupby('age_group').count()
    
    print dead_groupby_age.rename(columns={'Survived':'Dead'})
    print survived_groupby_age
    
    titanic_age_group_count = pd.concat([dead_groupby_age.rename(columns={'Survived':'Dead'}),survived_groupby_age], axis=1)
    axe1_age_group = titanic_age_group_count.plot(kind='bar', stacked=True, figsize=(10, 6))
    axe1_age_group.set_title('Age VS Count')
    axe1_age_group.set_xlabel('Age Group')
    axe1_age_group.set_ylabel('Count')

    说明
      就年龄已知的部分来看,只有儿童(小于10岁)的生还人数大于死亡人数。
    其余各年龄段,生还人数均小于死亡人数。特别是20-30年龄段,生还人数远小于死亡人数。

    生还数量并不能很好地说明问题,以下对生还率与年龄的关系进行分析:

    # 直接计算 Survived 的均值,即为生存率
    survive_rate_groupby_age = groupby_age.groupby('age_group').mean()
    
    print survive_rate_groupby_age
    
    axe2_age_group = survive_rate_groupby_age.plot(kind='bar')
    axe2_age_group.set_title('Age VS. Survival Rate')
    axe2_age_group.set_ylabel('Survival Rate')

    这里写图片描述
    这里写图片描述

    说明:
      就各年龄段的生存率来说,儿童(0-10)的生存几率最大(超过50%)。高龄组(80-90)仅有一人,且生还,故而其生还率达100%,属于特例。
      其它年龄段没有特别明显的差异,均小于50%。最低的是老龄人(60-70),生还率仅有31.58%。

    # 年龄未知的人数
    num_unknown = groupby_age[groupby_age.age_group=='unknown'].count()
    
    print num_unknown
    
    # 各年龄段的人数占比
    num_total = groupby_age.groupby('age_group').count()
    axe3_age_group = num_total.plot(kind='pie', subplots=True, autopct='%.2f%%', figsize=(8, 8))[0]
    axe3_age_group.set_title('Proportion Of Survival Count in Age Group')

    Survived 177
    age_group 177
    dtype: int64

    这里写图片描述

    说明:
      由于年龄未知的人数较多(177人,占总体19.87%),对上述生还率与年龄关系的判断可能存在较大影响。

    3.2 双因素综合分析

    3.2.1 舱房等级 & 性别

    axe_pclass_sex = titanic_key_factors.groupby(['Pclass', 'Sex'])['Survived'].mean().unstack().plot(kind='bar')
    axe_pclass_sex.set_title('Sex VS. Pclass VS. Survival Rate')
    axe_pclass_sex.set_ylabel('Survival Rate')

    这里写图片描述

    说明
      从上图可以得知,不管是男性还是女性,生还率随着舱房等级的提高而增大。

    3.2.2 性别 & 年龄

    # Pandas 的 cut() 方法,用于分组聚集!!!
    bins = np.arange(0, 80, 10)
    #titanic_key_factors_new = pd.concat([titanic_key_factors, pd.cut(titanic_df['Age'], bins, right=False)], axis=1)
    #titanic_key_factors_new
    
    # 这个赋值会有一个 warning。 搜索过暂时没能解决。。。
    age_group_names = ['[0,10)', '[10,20)', '[20,30)', '[30,40)', '[40,50)', '[50,60)', '[60,70)']
    titanic_key_factors['age_group'] = pd.cut(titanic_df['Age'], bins, labels=age_group_names, right=False)
    axe_age_sex = titanic_key_factors.groupby(['age_group', 'Sex'])['Survived'].mean().unstack().plot(kind='bar', figsize=(10, 6))
    axe_age_sex.set_title('Sex VS. Age VS. Survival Rate')
    axe_age_sex.set_ylabel('Survival Rate')

    这里写图片描述

    从上图可得知:

    1. 不论性别,儿童生还率都较高(超过50%)
    2. 对于超过10岁的人来说,不论年龄,女性生还率远高于男性

    3.2.3 舱房等级 & 年龄

    axe_age_pclass = titanic_key_factors.groupby(['age_group', 'Pclass'])['Survived'].mean().unstack().plot(kind='bar', figsize=(10, 6))
    axe_age_pclass.set_title('Pclass VS. Age VS. Survival Rate')
    axe_age_pclass.set_ylabel('Survival Rate')

    这里写图片描述

    由上图可得出:

    1. 总体上来说,生还率随着舱房等级的提高而增大
    2. 分析年龄两端数据
      • 无论舱房等级,老年人(60岁以上)的生还率很接近(但生还率均比较低)
      • 对于儿童(10岁以下),Pclass=2的比Pclass=1高,有点偏离规律,下面进一步分析
    titanic_key_factors[(titanic_key_factors['age_group'] == '[0,10)') & (titanic_key_factors['Pclass'] == 1)]

    这里写图片描述

    从上述表格得知:

    1. 10岁以下儿童中,Pclass=1只有三位,而其中一位没有生还,从而导致生还率偏低(相对于Pclass=2来说)
    2. 合理猜测是由于某些意外,这位年龄小的儿童未能生还。
    3. 上述的第一点结论,还是较符合实际的。

    3.3 分析小结

    从上述分析结果来看,可得出以下几个结论:

    1. 舱房等级越高,则生还率越高,不论年龄、性别
    2. 不论年龄、舱房等级,女性生还率最高
    3. 儿童的还率较高,与性别、舱房等级无关

    4. 初步结论

      通过对泰坦尼克号上 2224 名乘客和船员中 891 名的人口学数据和乘客基本信息的分析,对于问题“有哪些因素会让船上的人生还率更高?”得出以下初步结论:

    1. 舱房等级、性别、年龄是影响生还率的因素
    2. 住高等级舱房的女性,其生还率是最高的;其次则为儿童(与性别、舱房等级无关)

      然而,由于不清楚样本是否随机选取、样本量不大,且样本数据中存在信息缺失,初步结论并无法表明这三个因素与“生还率”具有相关性。

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 949
精华内容 379
关键字:

数据集titanic