Как рассчитать сводную статистику?¶
In [1]: import pandas as pd
- Данные о Титанике
В этом руководстве используется набор данных Titanic, сохраненный в формате CSV. Данные состоят из следующих столбцов:
PassengerId: Идентификатор каждого пассажира.
Survived: Имеет значения 0 и 1. 0 для не выживших и 1 для выживших.
Pclass: Существует 3 класса: класс 1, класс 2 и класс 3.
Name: Имя пассажира.
Sex: Пол пассажира.
Age: Возраст пассажира.
SibSp: Указание на то, что у пассажира есть братья, сестры и супруг.
Parch: Пассажир один или с семьей.
Ticket: Номер билета пассажира.
Fare: Указание тарифа.
Cabin: Каюта пассажира.
Embarked: Категория причала.
In [2]: titanic = pd.read_csv("data/titanic.csv") In [3]: titanic.head() Out[3]: PassengerId Survived Pclass ... Fare Cabin Embarked 0 1 0 3 ... 7.2500 NaN S 1 2 1 1 ... 71.2833 C85 C 2 3 1 3 ... 7.9250 NaN S 3 4 1 1 ... 53.1000 C123 S 4 5 0 3 ... 8.0500 NaN S [5 rows x 12 columns]
Сводная статистика¶
Каков средний возраст пассажиров Титаника?
In [4]: titanic["Age"].mean() Out[4]: 29.69911764705882
К столбцам с числовыми данными можно применять различные статистические операции. По умолчанию исключаются отсутствующие данные и обрабатываются только строки.
Каков средний возраст и стоимость билета пассажиров Титаника?
In [5]: titanic[["Age", "Fare"]].median() Out[5]: Age 28.0000 Fare 14.4542 dtype: float64
Статистические показатели, применяемые к нескольким столбцам
DataFrame
(выбор двух столбцов возвращаетDataFrame
, см. урок по подмножеству данных), вычисляются для каждого столбца с числовыми значениями.
Сводная статистика может быть рассчитана для нескольких столбцов одновременно. Помните функцию describe
из первого урока?
In [6]: titanic[["Age", "Fare"]].describe()
Out[6]:
Age Fare
count 714.000000 891.000000
mean 29.699118 32.204208
std 14.526497 49.693429
min 0.420000 0.000000
25% 20.125000 7.910400
50% 28.000000 14.454200
75% 38.000000 31.000000
max 80.000000 512.329200
Вместо предопределенного набора статистических показателей можно задать собственную комбинацию для нескольких столбцов с помощью метода DataFrame.agg()
:
In [7]: titanic.agg(
...: {
...: "Age": ["min", "max", "median", "skew"],
...: "Fare": ["min", "max", "median", "mean"],
...: }
...: )
...:
Out[7]:
Age Fare
min 0.420000 0.000000
max 80.000000 512.329200
median 28.000000 14.454200
skew 0.389108 NaN
mean NaN 32.204208
Подробная информация об описательной статистике представлена в разделе руководства пользователя об описательной статистике.
Сводная статистика, сгруппированная по категориям¶
Каков средний возраст мужчин в сравнении с женщинами среди пассажиров Титаника?
In [8]: titanic[["Sex", "Age"]].groupby("Sex").mean() Out[8]: Age Sex female 27.915709 male 30.726645
Поскольку нас интересует средний возраст для каждого пола, сначала делается выборка по этим двум столбцам:
titanic[["Sex", "Age"]]
. Затем методgroupby()
применяется к столбцуSex
для создания групп по категориям. Наконец рассчитывается и возвращается средний возраст для каждого пола.
Вычисление некоторого показателя (например, mean
— средний возраст) для каждой категории в столбце (например, мужчина/женщина в столбце Sex
) — это распространенный подход. Для поддержки этого типа операций используется метод groupby
. В целом это соответствует более общему подходу «разделить-применить-объединить»:
Разделить данные на группы.
Применить функцию к каждой группе независимо.
Объединить результаты в структуру данных.
В pandas шаги применения и объединения обычно выполняются вместе.
В предыдущем примере мы сначала явно выбрали 2 столбца. Если этого не сделать, метод mean
применяется к каждому столбцу, содержащему числовые данные:
In [9]: titanic.groupby("Sex").mean()
Out[9]:
PassengerId Survived Pclass Age SibSp Parch Fare
Sex
female 431.028662 0.742038 2.159236 27.915709 0.694268 0.649682 44.479818
male 454.147314 0.188908 2.389948 30.726645 0.429809 0.235702 25.523893
Нет особого смысла получать среднее значение Pclass
. если нас интересует только средний возраст для каждого пола. Выбор столбцов (как обычно, с помощью квадратных скобок []
) поддерживается и для сгруппированных данных:
In [10]: titanic.groupby("Sex")["Age"].mean()
Out[10]:
Sex
female 27.915709
male 30.726645
Name: Age, dtype: float64
Примечание
Столбец Pclass
содержит числовые данные, но на самом деле представляет 3 категории (или факторы) с метками ‘1’, ‘2’ и ‘3’. соответственно. Подсчитывать статистику по ним особого смысла нет. Поэтому pandas предоставляет тип данных Categorical
для обработки таких данных. Более подробная информация представлена в разделе руководства пользователя о категориальных данных.
Какова средняя стоимость билета для каждой из комбинаций пола и класса обслуживания?
In [11]: titanic.groupby(["Sex", "Pclass"])["Fare"].mean() Out[11]: Sex Pclass female 1 106.125798 2 21.970121 3 16.118810 male 1 67.226127 2 19.741782 3 12.661633 Name: Fare, dtype: float64
Группировка может выполняться по нескольким столбцам одновременно. Передайте имена столбцов в виде списка методу
groupby()
.
Полное описание подхода «разделить-применить-объединить» приведено в разделе руководства пользователя о групповых операциях.
Подсчет количества записей по категориям¶
Каково количество пассажиров в каютах каждого класса?
In [12]: titanic["Pclass"].value_counts() Out[12]: 3 491 1 216 2 184 Name: Pclass, dtype: int64
Метод
value_counts()
подсчитывает количество записей для каждой категории в столбце.
Метод представляет собой сокращение, так как на самом деле это операция группировки в сочетании с подсчетом количества записей в каждой группе:
In [13]: titanic.groupby("Pclass")["Pclass"].count()
Out[13]:
Pclass
1 216
2 184
3 491
Name: Pclass, dtype: int64
Примечание
Как size
, так и count
можно использовать в сочетании с groupby
. В то время как size
включает значения NaN
и просто выдает количество строк (размер таблицы), count
исключает пропущенные значения. Используйте аргумент dropna
метода value_counts
, чтобы включить или исключить значения NaN
.
В руководстве пользователя есть специальный раздел о value_counts
, см. страницу о дискретизации.
ЗАПОМНИТЕ
Сводную статистику можно рассчитать для целых столбцов или строк.
Сила подхода «разделить-применить-объединить» обеспечивается методом
groupby
.value_counts
— это удобное сокращение для подсчета количества записей в каждой категории.
Полное описание подхода «разделить-применить-объединить» представлено на страницах руководства пользователя о групповых операциях.