September 23, 2021

Мир гистограмм с Python

В этой статье расскажу о ключевых инструментах для подсчета гистограмм и их визуализации в Python. В этом нам помогут библиотеки NumPy, Pandas, Matplotlib и Seaborn.

В качестве демонстрационных данных будем использовать опрос пользователей сайт Kaggle 2017 года (2017 Kaggle ML & DS Survey, файл multipleChoiceResponses.csv).

Получение численных значений гистрограммы

В этом нам поможет функция histogram из библиотеки NumPy. В число ее основных параметров входит bins - границы для интервалов деления или их количество (будут выбраны равные части из заданного диапазона range, который по умолчанию простирается от минимума выборки до ее максимума). Функция возвращает количество вхождений в каждый интервал и их границы. Также при задании параметра density=True histogram выполняет нормировку, действуя аналогично плотности распределения, так чтобы произведение вхождений на длины интервалов равнялось 1. Посчитаем гистограмму для столбца Age:

response=pd.read_csv('input/multipleChoiceResponses.csv', encoding='ISO-8859-1')
hist, edges = np.histogram(response.loc[response['Age'].notnull(), 'Age'], bins=np.arange(101, step=11))
hist, edges

а теперь приведем пример с нормализацией:

hist, edges = np.histogram([1,2,3,5,6], bins=[0, 5, 7], density=True)
hist, edges
(hist*np.diff(edges)).sum()

Похожий результат возвращает функция hist библиотеки Matplotlib (плюсом еще рисует график):

hist, edges, patches = plt.hist(response['Age'])

Если изучаемый столбец категориальный, то его значения удобно вывести с помощью метода value_counts:

response['GenderSelect'].value_counts()

также присутствует возможность нормализации (за это отвечает параметр normalize):

response['GenderSelect'].value_counts(normalize=True)  

Построение графиков гистограмм

Построение гистрограмм можно осуществить вызовом функций hist из Matplotlib (работает для численной переменной), как указывалось выше. Однако более гибким является способ вывода гистограмм с помощью Pandas и схожего метода hist:

response['Age'].hist(bins =np.arange(101, step=10),  density=True)

В отличие от собрата из Matplotlib метод умеет работать с пропущенными значениями, а также позволяет построить распределение категориальной переменной:

response['GenderSelect'].hist(xrot=90)

Библиотека Seaborn отличается красивыми настройками по умолчанию. Как она выполняет отображение категориальной переменной с помощью функции countplot, можете оценить ниже:

sns.countplot(y=response['GenderSelect'],order=response['GenderSelect'].value_counts().index)