Физтех.Статистика
Информация не актуальна. Сайт переехал на miptstats.github.io
Скачать ipynb
Введение в анализ данных¶
Титаник¶
Был крупнейшим пассажирским судном в 1912—1913 годах. Во время первого рейса затонул в северной Атлантике, столкнувшись с айсбергом в ночь с 14 на 15 апреля 1912 года, при этом погибло 1502 из 2224 пассажиров и членов экипажа.
Данные о пассажирах были собраны в таблицы, которые можно скачать с Kaggle. Эти данные часто используются в качестве обучающих в анализе данных.
Этот обучающий ноутбук на примерах показывает основную функциональность библиотек pandas
и seaborn
.
Подробные обучающие ноутбуки можно посмотреть по ссылкам:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(palette='Set2', font_scale=1.3)
1. Чтение данных¶
Подробнее про чтение и запись данных.
Прочитаем данные с помощью библиотеки pandas
. Библиотека pandas предназначена для статистической обработки данных, по функциональности близкий к SQL и R. Включает в себя функциональность работы с базами данных и таблицами Excel.
При чтении укажем, что первую колонку нужно использовать в качестве индекса (т.е. ключа) в таблице: index_col=0
.
Мы видим таблицу со следующими колонками:
Pclass
— класс пассажира (1
— высший,2
— средний,3
— низший);Name
— имя;Sex
— пол;Age
— возраст;SibSp
— количество братьев, сестер, сводных братьев, сводных сестер, супругов на борту титаника;Parch
— количество родителей, детей (в том числе приемных) на борту титаника;Ticket
— номер билета;Fare
— плата за проезд;Cabin
— каюта;Embarked
— порт посадки (C
— Шербур;Q
— Квинстаун;S
— Саутгемптон).
data = pd.read_csv('train.csv', index_col=0)
data
Можно вывести только строго указанное количество строк
data.head(2)
Соответствующая переменная имеет тип данных DataFrame
.
type(data)
2. Способы извлечения данных¶
Данные из отдельной колонки
data['Name']
Если имя колонки "достаточно хорошее", то можно и так
data.Name
Данные по столбцу имеют тип данных Series
.
type(data.Name)
Можно вытащить сразу несколько колонок
data[['Survived', 'Pclass', 'Name']]
Имена всех колонок
data.columns
Список всех индексов таблицы (т.е. ключей)
data.index
Название колонки-индекса
data.index.name
Тип данных в каждой из колонок таблицы
data.dtypes
Строку таблицы, соответствующую ключу 1, можно получить через loc
data.loc[1]
Обратите внимание, что обычный численный индекс этой строки равен 0. По нему также можно извлекать строку с мопощью iloc
.
data.iloc[0]
Если же попробовать запустить
то возникнет исключение KeyError: 0
, поскольку ключа 0
в этой таблице нет.
Можно извлечь несколько строк
data.iloc[0:3]
Можно извлечь конкретное значение
data.iloc[0]['Name']
Или так
data.iloc[0, 2]
data.describe()
Идентификация пропусков в таблице
data.isna()
Можно посчитать долю пропущенных значений в каждой колонке
data.isna().mean()
Сортировка по столбцу
data.sort_values(by='Age')
3.2 Графики с помощью seaborn
¶
Посмотрим, как можно работать с библиотекой seaborn
. Это популярная библиотека готовых шаблонов для статистической визуализации, написанная на бэкенде matplotlib
. Она имеет высокоуровневый интерфейс и по умолчанию может строить более эстетичные графики.
Построим гистограмму по возрасту отдельно для мужчин и женщин.
with sns.axes_style('whitegrid'):
plt.figure(figsize=(9, 5))
sns.histplot(data=data, x='Age', hue='Sex')
Построим боксплоты (ящики с усами) для стоимости билета в зависимости от класса.
with sns.axes_style('whitegrid'):
plt.figure(figsize=(9, 4))
sns.boxplot(data=data, x='Fare', y='Pclass', orient='h')
Ограничим значения по горизонтальной оси
with sns.axes_style('whitegrid'):
plt.figure(figsize=(9, 4))
sns.boxplot(data=data, x='Fare', y='Pclass', orient='h')
plt.xlim((-5, 170))
3.3 Более сложные операции из pandas
¶
Подробнее про группировку данных.
Сгруппируем данные по классу и усредним по всем численным колонкам
data.groupby(by='Pclass').mean()
Похожим образом можно для каждого класса посчитать функции минимума и максимума
data.groupby(by='Pclass').aggregate([min, max])
Подробнее про агрегирующие функции.
С помощью функции crosstab
можно очень легко получить информацию о том, сколько человек определенного пола ехали в таком-то классе, а также сумму по строкам и столбцам.
pd.crosstab(data['Sex'], data['Pclass'], margins=True)
А с помощью похожей функции pivot_table
можно легко получить информацию о том, каков максимальный возраст среди пассажиров определенного пола для каждого класса.
pd.pivot_table(
data,
values='Age',
index='Sex',
columns='Pclass',
aggfunc=np.max
)
Почитайте также про операции объединения таблиц, например, merge
и join
.