Python анализирует выживаемость Титаника

Python анализ данных pandas визуализация данных

Набор данных Titanic — это хороший дополнительный набор данных для начала работы с машинным обучением (ML) на kaggle (Titanic: Machine Learning from Disaster) Конечно, это также хороший набор данных для практики анализа данных. Для python, с точки зрения анализа данных, как мощного инструмента, он охватывает все звенья в процессе «сбор данных → обработка данных → анализ данных → визуализация данных», эта кокетливая операция больше недоступна.

После того, как этот проект завершен, за исключением того, что он не включает сбор данных (краулер Python), в основном все разделы обработки и анализа данных Python были завершены полностью. Подводя итог, можно сказать, что я заставляю себя систематизировать и выводить знания, с которыми я соприкоснулся.

вопрос для изучения

В основном исследуется взаимосвязь между выживаемостью и различными факторами (класс салона, возраст, пол, порт посадки и т. д.) на Tanic.

получить данные

Я помещаю исходные данные titanic-data.csv в тот же каталог, что и файл блокнота, а затем загружаю файл через read_csv.Конечно, прежде чем начать загружать данные, я должен импортировать необходимые пакеты Python по мере необходимости.

# 用于数据分析
import pandas as pd
import numpy as np

# 用于绘图
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

# 读取前五行数据
data_t = pd.read_csv('titanic-data.csv')
data_t.head()
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
# 数据集信息,包含数据集大小,列名,类型
data_t.info()
data_t.columns.values
<class 'pandas.core.frame.DataFrame'>
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





array(['PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp',
       'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'], dtype=object)

Наблюдение за данными

  • Загрузите titanic-data.csv в DataFrame, затем используйте функцию head(), чтобы распечатать первые 5 строк данных (ps используйте функцию tail(), чтобы распечатать последние 5 строк).

  • Благодаря предварительному наблюдению за данными эта выборка данных имеет в общей сложности 891 строку * 12 столбцов данных, а поля содержат: 'PassengerId', 'Выжил', 'Pclass', 'Имя', 'Пол', 'Возраст', 'SibSp' Количество сопровождающих сестер)', 'Парч (количество сопровождающих родителей и супругов)', 'Билет (билет)», «Тариф (плата)», «Каюта (кабина)», «Посадка (станция посадки)»

  • Среди них категориальные переменные включают Survived, Sex, Embarked, порядковые переменные включают Pclass, а числовые переменные включают PassengerId, Age, SibSp, Parch, Fare.

  • В ходе наблюдения было обнаружено, что значения Age, Cabin и Embarked содержат нулевые значения.

# 字段分析
def y(x):
    return data_t[x].unique()
print('='*20 + 'Survived字段内容' + '='*20)
print(y('Survived'))
print('='*20 + 'Sex字段内容' + '='*20)
print(y('Sex'))
print('='*20 + 'Pclass字段内容' + '='*20)
print(y('Pclass'))
print('='*20 + 'Embarked字段内容' + '='*20)
print(y('Embarked'))
====================Survived字段内容====================
[0 1]
====================Sex字段内容====================
['male' 'female']
====================Pclass字段内容====================
[3 1 2]
====================Embarked字段内容====================
['S' 'C' 'Q' nan]

значение переменной

  • Выжившие значения: 0 (мертвый), 1 (выживший)
  • Значение Пола: мужской (мужской), женский (женский)
  • Вложенные значения содержат 'S' 'C' 'Q'
# 显示重复的数据数量

data_t.duplicated().value_counts()
False    891
dtype: int64

Дублирующиеся данные

Набор данных содержит в общей сложности 891 строку данных, которые не повторяются.

# 显示有空值的列
print(data_t['Age'].isnull().value_counts())
print('-'*50)
print(data_t['Cabin'].isnull().value_counts())
print('-'*50)
print(data_t['Embarked'].isnull().value_counts())
print('-'*50)
False    714
True     177
Name: Age, dtype: int64
--------------------------------------------------
True     687
False    204
Name: Cabin, dtype: int64
--------------------------------------------------
False    889
True       2
Name: Embarked, dtype: int64
--------------------------------------------------

Нулевой случай

  • Возраст содержит в общей сложности 714 строк пустых данных.
  • Кабина имеет в общей сложности 204 строки пустых данных
  • Embarked (станция посадки) имеет всего 2 строки пустых данных.
# 描述性分析
data_t.describe()
PassengerId Survived Pclass Age SibSp Parch Fare
count 891.000000 891.000000 891.000000 714.000000 891.000000 891.000000 891.000000
mean 446.000000 0.383838 2.308642 29.699118 0.523008 0.381594 32.204208
std 257.353842 0.486592 0.836071 14.526497 1.102743 0.806057 49.693429
min 1.000000 0.000000 1.000000 0.420000 0.000000 0.000000 0.000000
25% 223.500000 0.000000 2.000000 20.125000 0.000000 0.000000 7.910400
50% 446.000000 0.000000 3.000000 28.000000 0.000000 0.000000 14.454200
75% 668.500000 1.000000 3.000000 38.000000 1.000000 0.000000 31.000000
max 891.000000 1.000000 3.000000 80.000000 8.000000 6.000000 512.329200

описательная статистика

  • Из 891 пассажира в поездке выжили 38 процентов, счастливчики.
  • Среди всех пассажиров самому младшему всего 0,4 года, самому старшему — 80 лет, а средний возраст — около 28 лет.
  • В среднем каждого пассажира сопровождали 0,52 родных брата и сестры и 0,38 супругов родителей.
  • С некоторыми пассажирами на самом деле ехало 8 человек.
  • Путешественники тратят в среднем 32 доллара на эту поездку, при этом самые высокие расходы составляют 512 долларов.

очистить данные

Не по теме Говорят, что очистка данных занимает около 80% времени в реальном бизнесе, что является действительно тяжелой работой.

При обработке отсутствующих значений мы обычно удаляем отсутствующие значения. В модуле pandas предусмотрен метод dropna() для удаления строк, содержащих значения NaN, но на самом деле лучший способ справиться с отсутствующими значениями — этозаменить на ближайшие данные

Прежде всего, очистка данных заключается в том, чтобы иметь дело с нулевыми значениями и позволить этим нулевым значениям участвовать в последующем анализе данных. Во-вторых, я удалю столбцы, которые не имеют отношения к самому анализу данных, такие как Каюта (поскольку номер каюты на самом деле никак не влияет на возможность побега). Наконец, я рассмотрю набор данных, чтобы посмотреть, смогу ли я создать некоторые новые функции, которые сделают наш анализ более интуитивным и быстрым.

# 处理空值
data_t['Age'] = data_t['Age'].fillna(data_t['Age'].mean()).astype(np.int64)
data_t['Embarked'] = data_t['Embarked'].fillna({"Embarked":"S"},inplace=True)
# 删除无关的列
data_t = data_t.drop(['Ticket','Cabin'],axis='columns')
data_t.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 10 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            891 non-null int64
SibSp          891 non-null int64
Parch          891 non-null int64
Fare           891 non-null float64
Embarked       0 non-null object
dtypes: float64(1), int64(6), object(3)
memory usage: 69.7+ KB

Обработка нулевых и избыточных значений

В приведенном выше примере используется средний возраст для замены нулевого значения, потому что «S» появляется чаще всего и имеет самый высокий уровень кофе, поэтому используйте «S» для замены нулевого значения.

Я удалил два столбца «Билет», «Кабина», на самом деле эти два столбца данных не очень полезны для нас для анализа данных.

Анализ визуализации данных

Сводная таблица — это наиболее часто используемый инструмент сводного анализа данных в Excel, который может агрегировать данные в соответствии с одним или несколькими указанными измерениями и исследовать информацию глубокого уровня в данных.

В пандах также предусмотрена функция pandas.pivot_table для реализации этих функций. В следующем анализе мы будем использовать эту функцию много раз, поэтому давайте сначала познакомимся с этой функцией:

Функция pandas.pivot_table содержит четыре основные переменные, а также несколько необязательных параметров. Четыре основные переменные — это данные источника данных, индекс индекса строки, столбцы столбца и числовые значения. Необязательные параметры включают, как суммировать значения, как обрабатывать значения NaN и отображать ли сводные данные строки.

Базовый анализ ситуации

Давайте сначала посмотрим на основную ситуацию: каково среди 891 человека соотношение выживших и тех, кто не выжил?

total_survived = data_t['Survived'].sum()
total_no_survived = 891 - total_survived

plt.figure(figsize = (10,5)) # 创建画布
plt.subplot(121) # 添加第一个子图
sns.countplot(x='Survived',data=data_t)
plt.title('Survived count')

plt.subplot(122) # 添加第二个子图
plt.pie([total_survived,total_no_survived],labels=['Survived','No survived'],autopct='%1.0f%%')
plt.title('Survived rate')

plt.show()

生还情况

Вывод: Среди 891 пассажира показатели выживаемости и невыживаемости составили 38% и 62% соответственно.

Исследуйте взаимосвязь между P-классом, полом, возрастом и уровнем выживаемости соответственно.

Взаимосвязь между классом (Pclass) и выживаемостью

Включите сводную таблицу.

# 不同船舱人数分布
data_t.pivot_table(values='Name',index='Pclass',aggfunc='count')
Name
Pclass
1 216
2 184
3 491

Удобно передавать несколько параметров.

Если мы не используем функцию pivot_table, мы обычно используем group_by для группировки агрегаций.

data_t[['Pclass','Name']].groupby(['Pclass']).count()
Name
Pclass
1 216
2 184
3 491

Для сравнения, функция pivot_table более удобочитаема.

Визуальная работа

plt.figure(figsize = (10,5)) # 创建画布
sns.countplot(x='Pclass',data=data_t)
plt.title('Person Count Across on Pclass')

plt.show()

舱位与生还率的情况

Также можно использовать круговые диаграммы.

plt.figure(figsize = (10,5)) # 创建画布
plt.pie(data_t[['Pclass','Name']].groupby(['Pclass']).count(),labels=['1','2','3'],autopct='%1.0f%%')
plt.axis("equal") #绘制标准的圆形图

plt.show()

在这里插入图片描述

Итак, это распределение числа людей по разным классам.Нам нужно найти зависимость между классом и выживаемостью.

Взаимосвязь между классом и выживаемостью

data_t.pivot_table(values='Survived',index='Pclass',aggfunc=np.mean)
Survived
Pclass
1 0.629630
2 0.472826
3 0.242363

Визуальная работа

plt.figure(figsize= (10 ,5))
sns.barplot(data=data_t,x="Pclass",y="Survived",ci=None) # ci表示置信区间

plt.show()

在这里插入图片描述

Вывод: первый класс имеет самую высокую вероятность выживания, за ним следует второй класс, а третий класс имеет самую низкую вероятность.

Взаимосвязь между полом и выживаемостью
# 不同性别生还率
data_t.pivot_table(values='Survived',index='Sex',aggfunc=np.mean)
Survived
Sex
female 0.742038
male 0.188908

Визуальная работа

plt.figure(figsize=(10,5))
sns.barplot(data=data_t,x='Sex',y='Survived',ci=None) 

plt.show()

在这里插入图片描述

Вывод: Вероятность выживания женщин намного выше, чем у мужчин.

Всестороннее рассмотрение взаимосвязи между полом (Sex), классом (Pclass) и выживаемостью
#首先计算不同舱位不同性别的人的生还概率
data_t.pivot_table(values='Survived',index=['Pclass','Sex'],aggfunc=np.mean)
Survived
Pclass Sex
1 female 0.968085
male 0.368852
2 female 0.921053
male 0.157407
3 female 0.500000
male 0.135447

Визуальная работа

plt.figure(figsize=(10,5))
sns.pointplot(data=data_t,x='Pclass',y='Survived',hue='Sex',ci=None)

plt.show()

在这里插入图片描述

В заключение
  • Во всех каютах выживаемость женщин была выше, чем у мужчин.
  • Выживаемость женщин в салонах первого и второго класса одинакова и намного выше, чем в салонах третьего класса.
  • Выживаемость самцов в каютах первого класса выше, чем в каютах второго и третьего классов, а выживаемость самцов в каютах второго и третьего классов одинакова.
Взаимосвязь между возрастом и выживаемостью

В отличие от вышеуказанных категориальных переменных, таких как класс и пол, возраст является непрерывной числовой переменной.Как правило, для работы с такими типами данных мы используем метод дискретизации непрерывных переменных.

Так называемая дискретизация относится к разделению интервала переменной на несколько небольших интервалов, а наблюдения, попадающие в один и тот же интервал, представляются одним и тем же символом.Простое понимание состоит в том, чтобы разделить наблюдения, принадлежащие к единому диапазону, на группу. . Затем наблюдайте в группах.

В pandas предусмотрена функция cut для дискретизации переменных.

data_t['AgeGroup'] = pd.cut(data_t['Age'],5) # 将年龄的列数值划分为五等份
data_t.AgeGroup.value_counts(sort=False)
(-0.08, 16.0]    100
(16.0, 32.0]     525
(32.0, 48.0]     186
(48.0, 64.0]      69
(64.0, 80.0]      11
Name: AgeGroup, dtype: int64

Выживаемость по возрастным группам

data_t.pivot_table(values='Survived',index='AgeGroup',aggfunc=np.mean)

Survived
AgeGroup
(-0.08, 16.0] 0.550000
(16.0, 32.0] 0.344762
(32.0, 48.0] 0.403226
(48.0, 64.0] 0.434783
(64.0, 80.0] 0.090909

Визуальная работа

plt.figure(figsize=(10,5))
sns.barplot(data=data_t,x='AgeGroup',y='Survived',ci=None)
plt.xticks(rotation=60) # 设置标签刻度角度

plt.show()

在这里插入图片描述

Заключение. Выживаемость была выше в группе детей и подростков.

многофакторный анализ

Вышеизложенное представляет собой отдельный взгляд на взаимосвязь между возрастом/полом/классом и выживаемостью.Давайте посмотрим на выживаемость, объединив несколько факторов.

Связь между возрастом (Age), полом (Sex) и выживаемостью
data_t.pivot_table(values='Survived',index='AgeGroup',columns='Sex',aggfunc=np.mean)
Sex female male
AgeGroup
(-0.08, 16.0] 0.673469 0.431373
(16.0, 32.0] 0.718391 0.159544
(32.0, 48.0] 0.791045 0.184874
(48.0, 64.0] 0.916667 0.177778
(64.0, 80.0] NaN 0.090909

Визуальная работа

plt.figure(figsize= (10 ,5))
sns.pointplot(data=data_t,x="AgeGroup",y="Survived",hue="Sex",ci=None,
             markers=["^", "o"], linestyles=["-", "--"])
plt.xticks(rotation=60)

plt.show()

在这里插入图片描述

Выводы: Дети и подростки, женщины имеют более высокие показатели выживаемости. Выжившие мужчины в основном дети и подростки.

Связь между возрастом (Age), полом (Sex), классом (Pclass) и выживаемостью

data_t.pivot_table(values="Survived",index="AgeGroup",columns=["Sex","Pclass"],aggfunc=np.mean)

Sex female male
Pclass 1 2 3 1 2 3
AgeGroup
(-0.08, 16.0] 0.833333 1.000000 0.545455 1.000000 0.818182 0.270270
(16.0, 32.0] 0.975610 0.923077 0.521277 0.354167 0.086207 0.138776
(32.0, 48.0] 1.000000 0.904762 0.250000 0.435897 0.076923 0.055556
(48.0, 64.0] 0.941176 0.833333 1.000000 0.269231 0.090909 0.000000
(64.0, 80.0] NaN NaN NaN 0.166667 0.000000 0.000000

Визуальная работа

sns.FacetGrid(data=data_t,row="AgeGroup",aspect=2.5)\
.map(sns.pointplot,"Pclass","Survived","Sex",hue_order=["male","female"],ci=None,palette="deep", 
     markers=["^", "o"], linestyles=["-", "--"]).add_legend()

plt.show()

在这里插入图片描述

Суммировать

Этот анализ в основном исследует взаимосвязь между выживаемостью на «Титанике» и различными факторами (класс салона, возраст, пол, порт посадки и т. д.).

Объем выборки — 891 человек. После кораблекрушения в живых осталось 342 человека, выживаемость — 38%.

На «Титанике» есть три типа кают: один, два и три, среди них первый класс имеет наибольшую вероятность выживания, за ним следует второй класс, а третий класс имеет наименьшую вероятность.

Среди 891 человека мужчин было 577, женщин — 314. Выживаемость женщин была намного выше, чем у мужчин. Можно видеть, что у женщин больше шансов выжить в этой аварии, чем у мужчин, что указывает на то, что в этой аварии был перенесен принцип «дамы вперед».

Среди 891 человека в выборке минимальный возраст составляет 0,42 года, а максимальный — 80 лет. По принципу деления [(0,34, 16,336]

Среди 891 человека в выборке показатель выживаемости у C был самым высоким, за ним следовал Q, а показатель выживаемости у S был самым низким.

Наконец, следует отметить, что набор данных для этого анализа данных выбирается из совокупности. Если выборка несмещенная, выборка выбирается из совокупности случайным образом. Согласно центральной предельной теореме результаты анализа являются репрезентативными. результаты анализов недостоверны.