Udacity机器学习入门项目4:探索数据集

%matplotlib inline 
import pandas as pandas
import matplotlib.pyplot as plt

# 读取csv文件,年龄等数据存在缺失值
csv = pandas.read_csv('titanic-data.csv')
csv.info()

RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
PassengerId    891 non-null int64
Survived       891 non-null int64
Pclass         891 non-null int64
Name           891 non-null object
Sex            891 non-null object
Age            714 non-null float64
SibSp          891 non-null int64
Parch          891 non-null int64
Ticket         891 non-null object
Fare           891 non-null float64
Cabin          204 non-null object
Embarked       889 non-null object
dtypes: float64(2), int64(5), object(5)
memory usage: 83.6+ KB
In [62]:
# 判断各个元素对存活率的影响,删除当前元素缺失值
def influence(survived, element):
    # 判断**对存活率的影响
    survived_element = csv[[survived, element]].dropna()
    groupby_element = survived_element.groupby(element)
    total_groupby_element = groupby_element.count()
    survived_groupby_element = groupby_element.sum()

    # **的生还人数
    print("生还人数")
    print(survived_groupby_element)
    # **的总人数
    print("总人数")
    print(total_groupby_element)
    # **的生还率
    print("生还率")
    survived_rate_element = survived_groupby_element / total_groupby_element
    print(survived_rate_element)
    # 直方图**的生还率
    survived_rate_element.plot(kind='bar')
    plt.title(element + 'Survival rate')
    plt.xlabel(element)
    plt.ylabel(survived)
    plt.show()
In [63]:
# 判断区间元素对存活率的影响,删除当前元素缺失值
def section_influence(survived, element, lim):
    # 判断区间元素对存活率的影响
    # 分组
    def cla(n, lim):
        if n == 0:
            return 'unknown'
        return '[%d, %d)' % (lim * (n // lim), lim * (n // lim) + lim)

    survived_section = csv[[survived, element]].dropna()

    section_group = pandas.DataFrame({
        'element_group': [cla(section, lim) for section in survived_section[element]]
    })

    groupby_section = pandas.concat([csv['Survived'], section_group], axis=1)

    groupby_element = groupby_section.groupby('element_group')
    total_groupby_element = groupby_element.count()
    survived_groupby_element = groupby_element.sum()

    # 分组的生还人数
    print(survived_groupby_element)
    # 分组的总人数
    print(total_groupby_element)
    # 分组的生还率
    survived_rate_element = survived_groupby_element / total_groupby_element
    print(survived_rate_element)
    # 直方图分组的生还率
    survived_rate_element.plot(kind='bar')
    plt.title(element + 'Survival rate')
    plt.xlabel(element)
    plt.ylabel(survived)
    survived_rate_element.plot(kind='pie',subplots=True)
    plt.show()
In [64]:
# 判断双元素对存活率的影响
def double_influence(element1, element2, survived):
    # 判断**对存活率的影响
    # survived_element = csv[[survived, element]]
    groupby_element = csv.groupby([element1, element2])[survived]
    total_groupby_element = groupby_element.count()
    survived_groupby_element = groupby_element.sum()

    # **的生还人数
    print("生还人数")
    print(survived_groupby_element)
    # **的总人数
    print("总人数")
    print(total_groupby_element)
    # **的生还率
    print("生还率")
    survived_rate_element = survived_groupby_element / total_groupby_element
    print(survived_rate_element)
    # 直方图**的生还率
    survived_rate_element.unstack().plot(kind='bar')
    plt.title(element1 + "+" + element2 + " "+ 'Survival rate')
    plt.xlabel(element1 + "+" + element2)
    plt.ylabel(survived)
    plt.show()

判断舱位对存活率的影响

变量 "Survived","Pclass"

In [65]:
influence('Survived', 'Pclass')
生还人数
        Survived
Pclass          
1            136
2             87
3            119
总人数
        Survived
Pclass          
1            216
2            184
3            491
生还率
        Survived
Pclass          
1       0.629630
2       0.472826
3       0.242363

结果显示舱位等级越高,存活率越高

判断性别对存活率的影响

变量 "Survived","Sex"

In [66]:
influence('Survived', 'Sex')
生还人数
        Survived
Sex             
female       233
male         109
总人数
        Survived
Sex             
female       314
male         577
生还率
        Survived
Sex             
female  0.742038
male    0.188908

结果显示女性存活率较高

判断年龄对存活率的影响

变量 "Survived","Age",区间20

In [67]:
section_influence('Survived', 'Age', 20)
               Survived
element_group          
[0, 20)              57
[20, 40)            168
[40, 60)             47
[60, 80)              7
[80, 100)             0
               Survived
element_group          
[0, 20)             164
[20, 40)            387
[40, 60)            137
[60, 80)             25
[80, 100)             1
               Survived
element_group          
[0, 20)        0.347561
[20, 40)       0.434109
[40, 60)       0.343066
[60, 80)       0.280000
[80, 100)      0.000000

结果显示低龄存活率偏高,差异不是很明显,最高龄100%是因为样本量太少.

判断亲戚和配偶在船数量对存活率的影响

变量 "Survived","SibSp"

In [68]:
influence('Survived', 'SibSp')
生还人数
       Survived
SibSp          
0           210
1           112
2            13
3             4
4             3
5             0
8             0
总人数
       Survived
SibSp          
0           608
1           209
2            28
3            16
4            18
5             5
8             7
生还率
       Survived
SibSp          
0      0.345395
1      0.535885
2      0.464286
3      0.250000
4      0.166667
5      0.000000
8      0.000000

结果显示有1到2个亲戚对存活是有帮助的,1个最好,人数再多的话,可能因为需要照顾到每个人,反而不如独自一人存活率高

判断父母孩子的在船数量对存活率的影响

变量 "Survived","Parch"

In [69]:
influence('Survived', 'Parch')
生还人数
       Survived
Parch          
0           233
1            65
2            40
3             3
4             0
5             1
6             0
总人数
       Survived
Parch          
0           678
1           118
2            80
3             5
4             4
5             5
6             1
生还率
       Survived
Parch          
0      0.343658
1      0.550847
2      0.500000
3      0.600000
4      0.000000
5      0.200000
6      0.000000

结果显示有比没有高,但是太多的话会影响逃生不如独自一人和亲戚配偶在船数量产生的影响类似

判断消费能力对存活率的影响

变量 "Survived","Fare",区间20

In [70]:
section_influence('Survived', 'Fare', 20)
               Survived
element_group          
[0, 20)             142
[100, 120)            7
[120, 140)           10
[140, 160)            6
[160, 180)            2
[20, 40)             86
[200, 220)            3
[220, 240)            3
[240, 260)            1
[260, 280)            4
[40, 60)             31
[500, 520)            3
[60, 80)             23
[80, 100)            20
unknown               1
               Survived
element_group          
[0, 20)             500
[100, 120)           11
[120, 140)           11
[140, 160)            9
[160, 180)            2
[20, 40)            200
[200, 220)            4
[220, 240)            5
[240, 260)            2
[260, 280)            6
[40, 60)             54
[500, 520)            3
[60, 80)             46
[80, 100)            23
unknown              15
               Survived
element_group          
[0, 20)        0.284000
[100, 120)     0.636364
[120, 140)     0.909091
[140, 160)     0.666667
[160, 180)     1.000000
[20, 40)       0.430000
[200, 220)     0.750000
[220, 240)     0.600000
[240, 260)     0.500000
[260, 280)     0.666667
[40, 60)       0.574074
[500, 520)     1.000000
[60, 80)       0.500000
[80, 100)      0.869565
unknown        0.066667

显示有消费较少的存活率较低

判断上船的港口编号对存活率的影响

变量 "Survived","Embarked"

In [71]:
influence('Survived', 'Embarked')
生还人数
          Survived
Embarked          
C               93
Q               30
S              217
总人数
          Survived
Embarked          
C              168
Q               77
S              644
生还率
          Survived
Embarked          
C         0.553571
Q         0.389610
S         0.336957

S口人数最多,存活率最底,但是实际感觉和这方面可能没有关系

判断舱位和性别对存活率的综合影响

变量 "Pclass","Sex","Survived"

In [72]:
double_influence('Pclass', 'Sex', 'Survived')
生还人数
Pclass  Sex   
1       female    91
        male      45
2       female    70
        male      17
3       female    72
        male      47
Name: Survived, dtype: int64
总人数
Pclass  Sex   
1       female     94
        male      122
2       female     76
        male      108
3       female    144
        male      347
Name: Survived, dtype: int64
生还率
Pclass  Sex   
1       female    0.968085
        male      0.368852
2       female    0.921053
        male      0.157407
3       female    0.500000
        male      0.135447
Name: Survived, dtype: float64

不管是男女,舱位都是等级越高,存活率越高

结论:


泰坦尼克号的总人数大概有2200多,乘客有1300多,样本中的900左右数据量虽然不是全部人员的数据,但是就乘客而言样本数量所占比例已然接近70%,根据我们分析的结果显示舱位等级和性别对存活率有较大的影响,由于数据不完整且有缺失,分析结果并不一定正确,这种结果只是代表一个较大概率的可能性. 
除了样本所提供的因素,其他因素已知或者未知对于存活率的影响也是无法忽视,其中我认为泰坦尼克号上的800多工作人员对存活率的影响是非常大的,工作人员的行为显然可以很大程度引导乘客,目前这方面数据完全空缺,所以不能保证我们的结果是完全正确的.


代码评价:

# 读取csv文件,年龄等数据存在缺失值
12
csv = pandas.read_csv('titanic-data.csv')
13
csv.info()
建议

建议变量名使用更具有实际意义的 titanic_datatitanic_df 等,其中 df 代表 DataFrame 数据类型


# 判断各个元素对存活率的影响,删除当前元素缺失值
20
def influence(survived, element):
21
    # 判断**对存活率的影响
22
    survived_element = csv[[survived, element]].dropna()
建议

关于缺失值的处理,强烈建议在分析之前的部分进行,现在这种处理方式,相当于对不同的变量用了“不同的数据集”(包含 Age 的分析是用 714 条数据、包含 Embarked 的分析用 889 条数据,其他 891 条数据)进行分析比对,看谁对生存几率的影响最大。虽然数据条数的差别不是很多,但是如果多的那些条数据对这些变量有较大影响呢?我们不能排除。。
所以,这里如果决定滤除掉分析中的缺失值数据,则最好在一开始将需要用到的 Age 和 Embarked 列有缺失值的项一起丢弃掉,最终形成一个新的数据集,进行对所有变量的分析探索。

#在原数据集上原地修改,原数据集变为清除缺失值之后的数据集
csv.dropna(subset = ['Age', 'Embarked'], inplace = True)

# 判断区间元素对存活率的影响,删除当前元素缺失值
49
def section_influence(survived, element, lim):
50
    # 判断区间元素对存活率的影响
51
    # 分组
52
    def cla(n, lim):
53
        if n == 0:
54
            return 'unknown'
55
        return '[%d, %d)' % (lim * (n // lim), lim * (n // lim) + lim)
建议

分段,可以使用 pandas 的 cut 函数方便操作:

#对年龄进行分组,每10岁为一组
bins=np.arange(0,90,10)
#添加Age_group字段
csv['Age_group'] = pd.cut(csv['Age'], bins)

如果你想要自定义每一个分段的区间以及 label ,以下是另一种用法示例:

# 分组
bins=[0, 10, 18, 35, 60 , 80]
csv['Age_group'] = pd.cut(csv['Age'], bins, labels = ['children', 'teenager', 'youth', 'middle', 'old'])

这样就可以将 Age_group 这个特征当作类似性别一样的分类变量进行探索了



项目文件:

http://download.csdn.net/download/zhe1110/10194001


你可能感兴趣的:(udacity)