- •Python для науки о данных: перезагрузка Ремикс популярной книги Генри Гарнера "Clojure для науки о данных", 2015
- •Об авторе оригинала книги
- •Содержание
- •Предисловие автора к оригиналу книги на Clojure
- •Статистика
- •Скачивание исходного кода примеров
- •Обследование данных
- •Исправление данных
- •Описательные статистики
- •Среднее значение
- •Интерпретация математических обозначений
- •Медиана
- •Дисперсия
- •Квантили
- •Дискретизация данных
- •Гистограммы
- •Нормальное распределение
- •Центральная предельная теорема
- •Булочник господина Пуанкаре
- •Генерирование распределений
- •Асимметрия
- •Графики нормального распределения
- •Способы сопоставительной визуализации
- •Коробчатые диаграммы
- •Интегральные функции распределения
- •Важность визуализации
- •Визуализация данных об электорате
- •Обработка столбцов
- •Добавление производных столбцов
- •Сопоставительная визуализация электоральных данных
- •Визуализация электоральных данных рф
- •Сравнительная визуализация
- •Функции массы вероятности
- •Точечные графики
- •Настройка прозрачности разброса
Способы сопоставительной визуализации
Квантильные графики дают замечательную возможность сопоставить измеренное эмпирическое (выборочное) распределение с теоретическим нормальным распределением. Однако если мы хотим сопоставить друг другу два или более эмпирических распределения, то графики нормального распределения для этого не подойдут. Впрочем, у нас есть несколько других вариантов, как показано в следующих двух разделах.
Коробчатые диаграммы
Коробчатые диаграммы, или диаграммы типа "ящик с усами", — это способ визуализации таких описательных статистик, как медиана и дисперсия. Мы можем сгенерировать их с помощью следующего исходного кода:
def ex_1_22():
'''Показать коробчатую диаграмму
с данными честного и нечестного булочников'''
d = {'Честный булочник' :honest_baker(1000, 30),
'Нечестный булочник':dishonest_baker(950, 30)}
pd.DataFrame(d).boxplot(sym='o', whis=1.95, showmeans=True)
plt.ylabel('Вес буханки (гр.)')
plt.show()
Этот пример создаст следующую диаграмму:
Ящики в центре диаграммы представляют интерквартильный размах. Линия поперек ящика — это медиана. Большая точка — это среднее. Для честного булочника линия медианы проходит через центр окружности, показывая, что среднее и медиана примерно одинаковые. Для нечестного булочника среднее отодвинуто от медианы, что указывает на смещение.
Усы показывают на диапазон данных. Выбросы представлены полыми кругами. Всего одна диаграмма позволяет яснее увидеть расхождение между двумя статистическими распределениями, чем рассматривать их отдельно на гистограмме или квантильном графике.
Интегральные функции распределения
Интегральные функции распределения (ИФР), также известные как кумулятивные функции распределения, от англ. Cumulative Distribution Function (CDF), описывают вероятность, что значение, взятое из распределения, будет меньше x. Как и все распределения вероятностей, их значения лежат в диапазоне между 0 и 1, где 0 — это невозможность, а 1 — полная определенность. Например, представьте, что я собираюсь бросить шестигранный кубик. Какова вероятность, что выпадет значение меньше 6?
Для уравновешенного
кубика вероятность выпадения пятерки
или меньшего значения равна
.
И наоборот, вероятность, что выпадет
единица, равна всего
.
Тройка или меньше соответствуют равным
шансам — то есть вероятности 50%.
ИФР выпадения чисел на кубике следует той же схеме, что и все ИФР — для чисел на нижнем краю диапазона ИФР близка к нулю, что соответствует низкой вероятности выбора чисел в этом диапазоне или ниже. На верхнем краю диапазона ИФР близка к единице, поскольку большинство значений, взятых из последовательности, будет ниже.
ИФР и квантили тесно друг с другом связаны — ИФР является инверсией квантильной функции. Если 0.5-квантиль соответствует значению 1000, тогда ИФР для 1000 составляет 0.5.
Подобно тому, как функция Pandas quantile позволяет нам отбирать значения из распределения в конкретных точках, эмпирическая ИФР empirical_cdf позволяет нам внести значение из последовательности и вернуть значение в диапазоне между 0 и 1. Это функция более высокого порядка, т.е. она принимает значение (в данном случае последовательность значений) и возвращает функцию, которую потом можно вызывать, сколько угодно, с различными значениями на входе, и возвращая ИФР для каждого из них.
Функции более высокого порядка — это функции, которые принимают или возвращают функции.
Построим график ИФР одновременно для честного и нечестного булочников. Для этих целей можно воспользоваться функцией построения двумерного графика библиотеки Pandas plot для визуализации ИФР, изобразив на графике исходные данные — то есть выборки из распределений честного и нечестного булочников — в сопоставлении с вероятностями, вычисленными относительно эмпирической ИФР. Функция plot ожидает, что значения x и значения y будут переданы в виде двух раздельных последовательностей значений. Для этих целе мы воспользуемся конструктором таблицы данных Pandas DataFrame.
Чтобы изобразить оба распределения на одном графике, мы должны передать функции plot несколько серий. Для многих своих графиков Pandas предоставляет функции, которые позволяют добавлять дополнительные серии. В случае с функцией plot мы можем присвоить указатель на создаваемый график, присвоив временной переменной (ax) результат первого вызова функции plot, и затем при повторных вызовах указывать эту переменную в именованном аргументе функции (ax=ax). Можно также передать необязательную метку серии. Мы выполним это в следующем ниже примере, чтобы на готовом графике отличить две серии друг от друга. Сначала определим универсальную функцию построения эмпирической ИФР против теоретической, которая получает на вход кортеж из двух серий (tp[1] и tp[3]) и их названий и метки осей, и затем вызовем ее:
def empirical_cdf(x):
"""Вернуть эмпирическую ИФР для x"""
sx = sorted(x)
return pd.DataFrame( {0: sx, 1:sp.arange(len(sx))/len(sx)} )
def ex_1_23():
'''Показать графики эмпирической ИФР
честного булочника в сопоставлении с нечестным'''
df = empirical_cdf(honest_baker(1000, 30))
df2 = empirical_cdf(dishonest_baker(950, 30))
ax = df.plot(0, 1, label='Честный булочник')
df2.plot(0, 1, label='Нечестный булочник', grid=True, ax=ax)
plt.xlabel('Вес буханки')
plt.ylabel('Вероятность')
plt.legend(loc='best')
plt.show()
Приведенный выше пример сгенерирует следующий график:
Несмотря на то, что этот график выглядит совсем по-другому, он в сущности показывает ту же самую информацию, что и коробчатая диаграмма. Мы видим, что две линии пересекаются примерно в медиане 0.5, соответствующей 1000 гр. Линия нечестного булочника обрезается в нижнем хвосте и удлиняется на верхнем хвосте, что соответствует асимметричному распределению.
