> For the complete documentation index, see [llms.txt](https://bemind.gitbook.io/neural/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://bemind.gitbook.io/neural/uchebniki-po-pandas-i-numpy/numpy/izuchaem-funkciyu-np.histogram-v-numpy-sozdaem-gistogrammu.md).

# Изучаем функцию np.histogram в NumPy: создаем гистограмму

В этом учебнике **вы научитесь использовать функцию гистограммы NumPy для вычисления гистограммы заданного набора данных**. Гистограмма показывает частоту числовых данных в пределах группированных диапазонов. Используя NumPy для расчета гистограмм, вы можете легко вычислить и получить доступ к частотам (относительным или абсолютным) различных значений.

К концу этого учебного пособия вы узнаете:

* Как работает функция гистограммы NumPy
* Как настроить количество и диапазон интервалов в результирующей гистограмме
* Как вернуть либо абсолютные значения, либо функцию плотности вероятности интервала

Если вы хотите научиться проверять, является ли распределение нормальным, ознакомьтесь с моим руководством по использованию Python для тестирования на нормальность

Содержание

* [Понимание функции гистограммы NumPy](#ponimanie-funkcii-gistogrammy-numpy)
* [Создание гистограммы с помощью NumPy в Python](#sozdanie-gistogrammy-s-pomoshyu-numpy-v-python)
* [Настройка ячеек в гистограммах NumPy](#nastroika-yacheek-v-gistogrammakh-numpy)
* [Настройка количества интервалов в гистограммах NumPy](#nastroika-kolichestva-intervalov-v-gistogrammakh-numpy)
* [Настройка диапазонов интервалов в гистограммах NumPy](#nastroika-diapazonov-intervalov-v-gistogrammakh-numpy)
* [Возврат функции плотности вероятности с помощью гистограмм NumPy](#vozvrat-funkcii-plotnosti-veroyatnosti-s-pomoshyu-gistogramm-numpy)
* [Изменение диапазона значений с помощью гистограмм NumPy](#izmenenie-diapazona-znachenii-s-pomoshyu-gistogramm-numpy)
* [Заключение](#zaklyuchenie)
* [Дополнительные ресурсы](#dopolnitelnye-resursy)

### Понимание функции гистограммы NumPy

В этом разделе вы узнаете о функции `np.histogram()` и различных параметрах и аргументах по умолчанию, которые предлагает эта функция. Функция имеет шесть различных параметров, один из которых является обязательным. Давайте посмотрим, как выглядит функция:

```python
# Понимание функции np.histogram() из библиотеки NumPy
import numpy as np

np.histogram(a, bins=10, range=None, normed=None, weights=None, density=None)
```

Функция `np.histogram()` вычисляет гистограмму данных, разбивая их на равные интервалы. Возвращает два массива: массив гистограммы (число элементов в каждом интервале) и массив с границами интервалов.

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

| Параметр   | Описание                                                                                                                                            | Аргумент по умолчанию | Принятые значения |
| ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------- | ----------------- |
| `a=`       | Входные данные, где гистограмма рассчитывается по сплющенному массиву.                                                                              | N/A                   | array-like        |
| `bins=`    | Количество интервалов одинаковой ширины или диапазонов, которые будут использоваться в качестве интервалов.                                         | 10                    | int or sequence   |
| `range=`   | Нижний и верхний диапазон значений                                                                                                                  | `None`                | (float, float)    |
| `normed=`  | Эквивалент аргумента плотности (устарел с версии 1.6.0). Будет давать неправильные результаты, если контейнеры неравны.                             | `None`                | bool              |
| `weights=` | Массив весов той же формы, что и a, где каждое значение имеет только связанный с ним вес.                                                           | `None`                | array-like        |
| `density=` | Если значение равно `False`, возвращается количество выборок в каждом интервале. Если `True`, возвращает функцию плотности вероятности в интервале. | `None`                | bool              |

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

### Создание гистограммы с помощью NumPy в Python

В этом разделе вы узнаете, как создать базовую гистограмму с помощью функции гистограммы NumPy. Для этого давайте создадим массив случайных значений от 0 до 100, используя функцию `np.random.randint()`:

```python
# Генерация массива NumPy
import numpy as np

np.random.seed(100)
arr = np.array(np.random.randint(0, 101, 100))
print(arr)

# Returns:
# [  8  24  67  87  79  48  10  94  52  98  53  66  98  14  34  24  15 100
#   60  58  16   9  93  86   2  27   4  31   1  13  83 100   4  91  59  67
#    7  49  47  65  61  14  55  71  80   2  94  19  98  63  53  27  56  30
#   48  47  39  38  44  18  64  56  34  53  74  17  72  13  30  17  53  68
#   50  91  91  83  53  78   0  13  57  76   3  70   3  84  79  10  87  60
#    3  48  52  43  36   5  71  38  86  94]
```

Этот код использует библиотеку NumPy для генерации массива случайных чисел размером 100 из диапазона от 0 до 100. Функция `np.random.seed(100)` используется для установки начального состояния генератора случайных чисел для воспроизводимости результатов.

Мы сгенерировали массив после создания начального числа. Использование функции `np.random.seed()` позволяет нам генерировать воспроизводимые результаты. Теперь, когда у нас есть наш массив, давайте передадим его в функцию `np.histogram()` со значениями аргументов по умолчанию. Это позволит нам лучше понять, как функция работает:

```python
# Создание гистограммы с помощью np.histogram()
import numpy as np

np.random.seed(100)
arr = np.array(np.random.randint(0, 101, 100))

print(np.histogram(arr))

# Returns:
# (array([13, 13,  4,  9,  8, 14, 10,  9,  8, 12]), array([  0.,  10.,  20.,  30.,  40.,  50.,  60.,  70.,  80.,  90., 100.]))
```

Этот код использует библиотеку NumPy для генерации массива случайных чисел размером 100 из диапазона от 0 до 100. Затем функция `np.histogram()` вычисляет гистограмму этого массива. Результатом будет кортеж из двух массивов: массив гистограммы (число элементов в каждом интервале) и массив с границами интервалов.

Давайте разберем, что делает приведенный выше код:

1. Мы загружаем наш массив таким же образом, как это делали ранее. Обратите внимание, что наши значения включают минимальное значение 0 и максимальное значение 100.
2. Затем мы передаём этот массив в функцию `np.histogram()` и печатаем результаты.

Функция возвращает два массива: (1) количество значений, попавших в каждый интервал, и (2) границы интервалов. **Все границы интервалов являются полуоткрытыми, за исключением последней пары**. Это означает, что первый интервал начинается от 0 включительно до 10 исключительно, и так далее.

Из результатов видно, что 13 значений попадают в первый интервал, что означает, что 13 значений находятся в диапазоне \[0, 10). Поскольку аргумент по умолчанию для функции - `bins=10`, интервалы охватывают диапазон от минимального значения (0) до максимального значения (100), деленный на 10.

Поскольку функция возвращает два значения, мы можем присвоить каждый из результатов своим переменным, как показано ниже:

```python
# Возвращение значений и интервалов с помощью np.histogram()
import numpy as np

np.random.seed(100)
arr = np.array(np.random.randint(0, 101, 100))

hist, bin_edges = np.histogram(arr)

print(f'{hist=}')
print(f'{bin_edges=}')

# Returns:
# hist=array([13, 13,  4,  9,  8, 14, 10,  9,  8, 12])
# bin_edges=array([  0.,  10.,  20.,  30.,  40.,  50.,  60.,  70.,  80.,  90., 100.])
```

Этот код использует библиотеку NumPy для генерации массива случайных чисел размером 100 из диапазона от 0 до 100. Затем функция `np.histogram()` вычисляет гистограмму этого массива. Переменная `hist` содержит массив гистограммы (число элементов в каждом интервале), а переменная `bin_edges` содержит массив с границами интервалов.

В приведенном выше коде мы использовали f-строки Python для аккуратного вывода переменных (эта функция доступна только в Python 3.8+). Теперь, когда вы видели, что производит функция с её аргументами по умолчанию, давайте посмотрим, как вы можете настроить функцию, изменяя параметр `bins=`

### Настройка ячеек в гистограммах NumPy

В этом разделе вы научитесь настраивать разбиение на корзины в гистограммах NumPy. По умолчанию функция гистограммы NumPy использует параметр `bins=10`. Это означает, что NumPy разделит диапазон значений на десять корзин одинакового размера.

#### Настройка количества интервалов в гистограммах NumPy

Мы можем изменить количество интервалов в гистограмме NumPy, передав целое число в аргумент `bins=`. Как было сказано ранее, по умолчанию NumPy создает 10 интервалов. Давайте посмотрим, как мы можем изменить функцию для создания пяти интервалов вместо десяти:

```python
# Настройка количества интервалов в гистограммах NumPy
import numpy as np

np.random.seed(100)
arr = np.array(np.random.randint(0, 101, 100))

hist, bin_edges = np.histogram(arr, bins=5)

print(f'{hist=}')
print(f'{bin_edges=}')

# Returns:
# hist=array([26, 13, 22, 19, 20])
# bin_edges=array([  0.,  20.,  40.,  60.,  80., 100.])
```

Этот код использует библиотеку NumPy для генерации массива случайных чисел размером 100 из диапазона от 0 до 100. Затем функция `np.histogram()` вычисляет гистограмму этого массива, используя 5 интервалов. Переменная `hist` содержит массив гистограммы (число элементов в каждом интервале), а переменная `bin_edges` содержит массив с границами интервалов.

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

#### Настройка диапазонов интервалов в гистограммах NumPy

Функция гистограммы NumPy также позволяет вручную определять края корзин. **Преимущество этого заключается в том, что это позволяет настраивать корзины неравного размера**. Это может быть особенно полезно, если вы работаете с категориальными данными, такими как возрастные группы.

Давайте посмотрим, как мы можем определить некоторые логические интервалы для нашей гистограммы NumPy, которые имитируют возрастные группы:

```python
# Настройка интервалов гистограмм NumPy
import numpy as np

np.random.seed(100)
arr = np.array(np.random.randint(0, 101, 100))

hist, bin_edges = np.histogram(arr, bins=[arr.min(), 18, 65, arr.max()])

print(f'{hist=}')
print(f'{bin_edges=}')

# Returns:
# hist=array([24, 42, 34])
# bin_edges=array([  0,  18,  65, 100])
```

Этот код использует библиотеку NumPy для генерации массива случайных чисел размером 100 из диапазона от 0 до 100. Затем функция `np.histogram()` вычисляет гистограмму этого массива, используя пользовательские интервалы \[минимальное значение массива, 18, 65, максимальное значение массива]. Переменная `hist` содержит массив гистограммы (число элементов в каждом интервале), а переменная `bin_edges` содержит массив с границами интервалов.

В NumPy края будут определены как включающие левую границу и исключающие правую. Это означает, что левая граница будет включена, а все значения до (но не включая) правой границы также будут учтены.

### Возврат функции плотности вероятности с помощью гистограмм NumPy

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

Давайте посмотрим, как мы можем вернуть функцию плотности вероятности в гистограммах NumPy:

```python
# Вычисление функции плотности вероятности с помощью гистограмм NumPy
import numpy as np

np.random.seed(100)
arr = np.array(np.random.randint(0, 101, 100))

hist, bin_edges = np.histogram(arr, density=True)

print(f'{hist=}')
print(f'{bin_edges=}')

# Returns:
# hist=array([0.013, 0.013, 0.004, 0.009, 0.008, 0.014, 0.01 , 0.009, 0.008,     0.012])
# bin_edges=array([  0.,  10.,  20.,  30.,  40.,  50.,  60.,  70.,  80.,  90., 100.])
```

Этот код использует библиотеку NumPy для генерации массива случайных чисел размером 100 из диапазона от 0 до 100. Затем функция `np.histogram()` вычисляет гистограмму этого массива с нормализацией (density=True), что приводит к вычислению функции плотности вероятности вместо числа элементов в каждом интервале. Переменная `hist` содержит массив значений функции плотности вероятности, а переменная `bin_edges` содержит массив с границами интервалов.

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

### Изменение диапазона значений с помощью гистограмм NumPy

По умолчанию NumPy будет включать в гистограммы, создаваемые функцией `np.histogram()`, весь диапазон значений. Вы можете изменить это поведение, задав параметру `range=` кортеж из чисел с плавающей точкой.

Давайте посмотрим, как мы можем изменить поведение функции, чтобы она показывала только значения от 0 до 50:

```python
# Изменение диапазона значений в гистограммах NumPy
import numpy as np

np.random.seed(100)
arr = np.array(np.random.randint(0, 101, 100))

hist, bin_edges = np.histogram(arr, range=(0.0, 50.0))

print(f'{hist=}')
print(f'{bin_edges=}')

# Returns:
# hist=array([9, 4, 7, 6, 2, 2, 5, 4, 2, 7])
# bin_edges=array([ 0.,  5., 10., 15., 20., 25., 30., 35., 40., 45., 50.])
```

Этот код использует библиотеку NumPy для генерации массива случайных чисел размером 100 из диапазона от 0 до 100. Затем функция `np.histogram()` вычисляет гистограмму этого массива с заданным диапазоном значений от 0.0 до 50.0. Переменная `hist` содержит массив гистограммы (число элементов в каждом интервале), а переменная `bin_edges` содержит массив с границами интервалов.

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

В этом уроке вы научились использовать функцию `np.histogram()` для создания гистограмм в NumPy. Сначала вы узнали, как работает функция, познакомившись с её параметрами и аргументами по умолчанию. Затем вы научились использовать функцию для создания гистограмм. После этого вы узнали, как настраивать количество и диапазоны интервалов. Вы также научились вычислять функцию плотности вероятности и как изменять общий диапазон значений.

### Дополнительные ресурсы

Чтобы узнать больше о связанных темах, ознакомьтесь с нижеприведенными руководствами:

* [Как нормализовать массивы NumPy](/neural/uchebniki-po-pandas-i-numpy/numpy/kak-normalizovat-massivy-numpy-minimalnoe-maksimalnoe-masshtabirovanie-z-ocenka-l2.md)
* [Как рассчитать процентили в NumPy с помощью np.percentile](/neural/uchebniki-po-pandas-i-numpy/pandas/pandas-quantile-raschet-procentilei-v-dataframe.md)
* [Numpy нормальное (гауссово) распределение (Numpy Random Normal)](/neural/uchebniki-po-pandas-i-numpy/numpy/raspredelenie-normalnogo-gaussova-raspredeleniya-v-numpy-sluchainoe-normalnoe-v-numpy.md)
* [Гистограмма NumPy: официальная документация](https://numpy.org/doc/stable/reference/generated/numpy.histogram.html)
