# Pandas Quantile: Расчет процентилей в DataFrame

В этом руководстве вы научитесь использовать функцию `quantile` в Pandas для расчета процентилей и квантилей вашего DataFrame в Pandas. Умение рассчитывать квантили и процентили позволяет легко сравнивать данные с другими значениями в данных. Вы узнаете, как использовать метод quantile в Pandas для расчета процентилей и квартилей, а также как использовать различные параметры для изменения поведения метода.

```markdown
К концу этого руководства вы научитесь:
```

* Почему вам может понадобиться рассчитать процентиль
* Как рассчитать один процентиль столбца Pandas
* Как вычислить несколько процентилей или квартилей столбца Pandas
* Как рассчитать процентили всего кадра данных
* Как изменить интерполяцию значений при расчете процентилей

Быстрый ответ: Используйте функцию `quantile` в Pandas для расчета процентилей

<figure><img src="https://datagy.io/wp-content/uploads/2021/11/Quick-Answer-Pandas-Quantile-to-Calculate-Percentiles-1024x330.png" alt="Quick Answer - Pandas Quantile to Calculate Percentiles" height="330" width="1024"><figcaption></figcaption></figure>

**Обновлено в апреле 2023 года**: Я обновил пост, добавив больше примеров и объяснений функции `quantile()` в Pandas. Также я обновил пост, чтобы отразить изменения, сделанные в Pandas 2.0.

Содержание

* [Что такое процентиль?](#chto-takoe-procentil)
* [Загрузка образца фрейма данных Pandas](#zagruzka-obrazca-freima-dannykh-pandas)
* [Обзор квантильного метода Pandas](#obzor-kvantilnogo-metoda-pandas)
* [Используйте квантиль Pandas для расчета одного процентиля](#ispolzuite-kvantil-pandas-dlya-rascheta-odnogo-procentilya)
* [Используйте квантиль Pandas для расчета нескольких процентилей](#ispolzuite-kvantil-pandas-dlya-rascheta-neskolkikh-procentilei)
* [Используйте квантиль Pandas для расчета процентилей кадра данных](#ispolzuite-kvantil-pandas-dlya-rascheta-procentilei-kadra-dannykh)
* [Используйте квантиль Pandas для расчета процентилей и изменения интерполяции](#ispolzuite-kvantil-pandas-dlya-rascheta-procentilei-i-izmeneniya-interpolyacii)
* [Визуализация процентилей с помощью коробчатых диаграмм](#vizualizaciya-procentilei-s-pomoshyu-korobchatykh-diagramm)
* [Обработка пропущенных значений при вычислении квантилей](#obrabotka-propushennykh-znachenii-pri-vychislenii-kvantilei)
* [Заключение](#zaklyuchenie)
* [Дополнительная документация](#dopolnitelnaya-dokumentaciya)

### Что такое процентиль?

**Процентиль указывает на число, ниже которого падает определенный процент значений**. Например, если мы рассчитываем 90-й процентиль, тогда мы получаем число, ниже которого располагается 90% всех остальных чисел. Это имеет много полезных применений, например, в образовании. Набрать результат в 90-м процентиле не означает, что вы набрали 90% на тесте, а то, что вы показали результат лучше, чем 90% других участников тестирования.

Квартиль делит данные на четыре равные части, каждая из которых содержит 25% значений. Таким образом, квартиль разделяет данные на процентили: 0%, 25%, 50% и 75%.

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

Давайте начнем с изучения того, как рассчитать перцентиль в Pandas с использованием функции `quantile`

### Загрузка образца фрейма данных Pandas

Давайте начнем с загрузки образца DataFrame в Pandas. Если у вас есть свои данные, не стесняйтесь использовать их. Однако, если вы хотите следовать этому руководству шаг за шагом, скопируйте код ниже, чтобы сгенерировать наш DataFrame:

```python
# Loading a Sample Pandas Dataframe
import pandas as pd

df = pd.DataFrame.from_dict({
    'Student': ['Nik', 'Kate', 'Kevin', 'Evan', 'Jane', 'Kyra', 'Melissa'],
    'English': [90, 95, 75, 93, 60, 85, 75],
    'Chemistry': [95, 95, 75, 65, 50, 85, 100],
    'Math': [100, 95, 50, 75, 90, 50, 80]
})

print(df.head())

# Returns:
#   Student  English  Chemistry  Math
# 0     Nik       90         95   100
# 1    Kate       95         95    95
# 2   Kevin       75         75    50
# 3    Evan       93         65    75
# 4    Jane       60         50    90
```

Мы видим, что загрузили DataFrame Pandas с оценками студентов. У нас есть один столбец `'object'`, содержащий имена студентов, и три других числовых столбца с оценками студентов.

Теперь давайте углубимся в понимание того, как работает `quantile` метод Pandas.

### Обзор квантильного метода Pandas

Метод `quantile` в Pandas работает как с отдельной серией Pandas, так и со всем DataFrame Pandas. По умолчанию он возвращает 50-й процентиль и использует линейную интерполяцию для расчета данных.

Давайте посмотрим, как выглядит метод и какие параметры предоставляет метод `quantile`.

```python
# Understanding the Pandas .quantile() method to calculate percentiles

df.quantile(
    q=0.5,                      # The percentile to calculate
    axis=0,                     # The axis to calculate the percentile on
    numeric_only=False,         # To calculate only for numeric columns
    interpolation='linear'      # The type of interpolation to use when the quantile is between 2 values
)
```

Давайте рассмотрим различные параметры, которые предлагает метод `quantile` в Pandas. Аргументы по умолчанию представлены в квадратных скобках `[]`. \*\*Начиная с апреля 2023 года с Pandas 2.0, аргумент по умолчанию для `numeric_only` установлен в `False`. Это оказывает большое влияние на устаревший код, требуя от вашего кода быть более явным

* `q=[0.5]`: число с плавающей точкой или массив, указывающий значение(я) квантилей для расчета
* `axis=[0]`: ось для расчета процентилей (0 для расчета по строкам и 1 для расчета по столбцам)
* Если `numeric_only=[True]` установлено в `False`, вычисляйте значения также для столбцов datetime и timedelta.
* `interpolation=['linear']`: если квантили находятся между двумя значениями, как интерполировать значения

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

### Используйте квантиль Pandas для расчета одного процентиля

В этом разделе вы узнаете, как рассчитать один конкретный процентиль в столбце DataFrame с использованием метода `quantile`. Мы можем применить этот метод к указанному столбцу, и как результат, получим значение процентиля. Давайте посмотрим, как это делается:

```python
# Generate a single percentile with df.quantile()
print(df['English'].quantile())

# Returns: 85.0
```

По умолчанию Pandas использует параметр `q=0.5`, что соответствует 50-му процентилю. Если нам нужно, например, вычислить 90-й процентиль, мы можем передать значение `q=0.9` в параметры:

```python
# Generate a single percentile with df.quantile()
print(df['English'].quantile(q=0.9))

# Returns: 93.8
```

Мы видели, что при передаче только одного значения в аргумент `q=`, возвращается одно значение. Но что, если нам нужно рассчитать несколько процентилей для одного столбца Pandas? В следующем разделе вы узнаете, как это сделать.

### Используйте квантиль Pandas для расчета нескольких процентилей

Возможны ситуации, когда вам нужно рассчитать несколько различных перцентилей для столбца в Pandas. Аргумент `q=` может принимать как одно число, так и массив чисел, для которых мы хотим выполнить расчет.

Чтобы рассчитать несколько перцентилей, мы просто передаем список значений для различных перцентилей, которые хотим вычислить. Давайте посмотрим, как это выглядит:

```python
# Generate multiple percentiles with df.quantile()
print(df['English'].quantile(q=[0.1, 0.9]))

# Returns: 
# 0.1    69.0
# 0.9    93.8
# Name: English, dtype: float64
```

Этот код возвращает ряд Pandas, содержащий различные значения процентилей. Если нам нужно получить доступ к одному значению в этом ряду, мы можем просто выбрать его по индексу. Давайте посмотрим, как мы можем выбрать 90-й процентиль в нашем ряду:

```python
# Generate multiple percentiles with df.quantile() and selecting one
print(df['English'].quantile(q=[0.1, 0.9])[0.9])

# Returns: 93.8
```

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

В следующем разделе вы узнаете, как использовать Pandas для расчета процентилей всего датафрейма.

### Используйте квантиль Pandas для расчета процентилей кадра данных

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

Давайте посмотрим, как это работает, вычислив 90-й процентиль для каждого столбца:

```python
# Calculate Percentile for a Pandas Dataframe
print(df.quantile(q=0.9, numeric_only=True))

# Returns: 
# English      93.8
# Chemistry    97.0
# Math         97.0
# Name: 0.9, dtype: float64
```

Мы видим, насколько легко было рассчитать отдельный процентиль для всех колонок в DataFrame Pandas. **Начиная с Pandas 2.0, вам будет необходимо установить параметр `numeric_only=` в значение `True`.** Это серьезное отличие от предыдущих версий, где этот параметр был установлен в значение `True` по умолчанию.

Если вы хотите рассчитать несколько процентилей для всего датафрейма, вы можете передать список значений для расчета. Давайте рассчитаем несколько различных процентилей, используя метод `quantile` в Pandas:

```python
# Calculate Multiple Percentiles for an Entire DataFrame
print(df.quantile(q=[0.1, 0.5, 0.9], numeric_only=True))

# Returns:
#      English  Chemistry  Math
# 0.1     69.0       59.0  50.0
# 0.5     85.0       85.0  80.0
# 0.9     93.8       97.0  97.0
```

Мы видим, что Pandas фактически возвращает dataframe, содержащий разбивку по процентилям по разным столбцам. Мы можем использовать `.loc` или `.iloc` для выбора данных.

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

### Используйте квантиль Pandas для расчета процентилей и изменения интерполяции

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

Это место, где параметр `interpolation=` играет ключевую роль. По умолчанию Pandas будет использовать линейную интерполяцию для генерации процентиля, что означает, что значения будут рассматриваться как линейные, и будет найдено линейно интерполированное значение.

Pandas предлагает ряд настроек для изменения этого поведения. Настройки описаны в таблице ниже, с учетом двух значений i и j:

| Интерполяционный аргумент | Описание                                                           |
| ------------------------- | ------------------------------------------------------------------ |
| linear                    | Вычисляет на основе линейного предположения по формуле i + (j – i) |
| lower                     | выбирает меньшее значение, i.                                      |
| higher                    | выбирает большее значение, j                                       |
| nearest                   | выбирает ближайшее значение: i или j                               |
| midpoint                  | вычисляет среднюю точку, используя (i + j)/2                       |

Давайте посмотрим, как могут отличаться эти значения для одного столбца:

```python
# Interpolating Percentiles in Different Ways
linear = df['Math'].quantile(q=0.9, interpolation='linear')
lower = df['Math'].quantile(q=0.9, interpolation='lower')
higher = df['Math'].quantile(q=0.9, interpolation='higher')
nearest = df['Math'].quantile(q=0.9, interpolation='nearest')
midpoint = df['Math'].quantile(q=0.9, interpolation='midpoint')

print('linear returns: ', linear)
print('lower returns: ', lower)
print('higher returns: ', higher)
print('nearest returns: ', nearest)
print('midpoint returns: ', midpoint)

# Returns:
# linear returns:  97.0
# lower returns:  95
# higher returns:  100
# nearest returns:  95
# midpoint returns:  97.5
```

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

### Визуализация процентилей с помощью коробчатых диаграмм

Мы можем лучше визуализировать процентили, используя боксплоты. Создать красивые боксплоты можно с помощью библиотеки Seaborn для Python. Для создания боксплотов в Seaborn можно использовать функцию

Изображение ниже демонстрирует, как с помощью боксплотов можно визуализировать процентили:

<figure><img src="https://datagy.io/wp-content/uploads/2021/03/What-are-boxplots.001-1024x576.png" alt="" height="576" width="1024"><figcaption></figcaption></figure>

Давайте посмотрим, как мы можем использовать Seaborn для создания боксплота

```python
# Creating a Boxplot in Seaborn
import seaborn as sns
sns.set_style('whitegrid')
sns.set_palette('Set2')
sns.boxplot(df)
```

Это возвращает следующее изображение:

<figure><img src="https://datagy.io/wp-content/uploads/2021/11/Seaborn-Boxplot-Showing-Percentiles.png" alt="Seaborn Boxplot Showing Percentiles" height="247" width="373"><figcaption></figcaption></figure>

Мы видим, что диаграмма размаха помогает визуализировать, по умолчанию, 25%, 50% и 75% процентили. Диаграммы размаха могут быть чрезвычайно полезным инструментом для понимания процентилей.

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

**По умолчанию Pandas будет игнорировать любые отсутствующие значения при расчете квантилей**. Это важно знать, поскольку это влияет на ваше представление о том, как должны быть рассчитаны значения. Если вы хотите изменить способ представления этих значений, вы можете захотеть обработать отсутствующие значения сначала. Аналогично, вы можете удалить отсутствующие значения, поскольку они могут исказить ваш общий анализ.

### Заключение

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

Чтобы узнать больше о методе `quantile` в Pandas, [ознакомьтесь с официальной документацией здесь](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.quantile.html).

### Дополнительная документация

Некоторые другие соответствующие статьи представлены ниже:

* Учебное пособие по стандартному отклонению Python: объяснение и примеры
* Pandas Describe: описательная статистика по вашему фрейму данных
* 7 способов выборки данных в Pandas
* Дисперсия Pandas: расчет дисперсии столбца кадра данных Pandas
