Как рассчитать сводную статистику?

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]
    

Сводная статистика

../../_images/06_aggregate.svg
  • Каков средний возраст пассажиров Титаника?

    In [4]: titanic["Age"].mean()
    Out[4]: 29.69911764705882
    

К столбцам с числовыми данными можно применять различные статистические операции. По умолчанию исключаются отсутствующие данные и обрабатываются только строки.

../../_images/06_reduction.svg
  • Каков средний возраст и стоимость билета пассажиров Титаника?

    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
В руководстве пользователя

Подробная информация об описательной статистике представлена в разделе руководства пользователя об описательной статистике.

Сводная статистика, сгруппированная по категориям

../../_images/06_groupby.svg
  • Каков средний возраст мужчин в сравнении с женщинами среди пассажиров Титаника?

    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
../../_images/06_groupby_select_detail.svg

Примечание

Столбец 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().

В руководстве пользователя

Полное описание подхода «разделить-применить-объединить» приведено в разделе руководства пользователя о групповых операциях.

Подсчет количества записей по категориям

../../_images/06_valuecounts.svg
  • Каково количество пассажиров в каютах каждого класса?

    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 — это удобное сокращение для подсчета количества записей в каждой категории.

В руководстве пользователя

Полное описание подхода «разделить-применить-объединить» представлено на страницах руководства пользователя о групповых операциях.