- •Python для науки о данных: перезагрузка Ремикс популярной книги Генри Гарнера "Clojure для науки о данных", 2015
- •Об авторе оригинала книги
- •Содержание
- •Предисловие автора к оригиналу книги на Clojure
- •Статистика
- •Скачивание исходного кода примеров
- •Обследование данных
- •Исправление данных
- •Описательные статистики
- •Среднее значение
- •Интерпретация математических обозначений
- •Медиана
- •Дисперсия
- •Квантили
- •Дискретизация данных
- •Гистограммы
- •Нормальное распределение
- •Центральная предельная теорема
- •Булочник господина Пуанкаре
- •Генерирование распределений
- •Асимметрия
- •Графики нормального распределения
- •Способы сопоставительной визуализации
- •Коробчатые диаграммы
- •Интегральные функции распределения
- •Важность визуализации
- •Визуализация данных об электорате
- •Обработка столбцов
- •Добавление производных столбцов
- •Сопоставительная визуализация электоральных данных
- •Визуализация электоральных данных рф
- •Сравнительная визуализация
- •Функции массы вероятности
- •Точечные графики
- •Настройка прозрачности разброса
Сопоставительная визуализация электоральных данных
Теперь рассмотрим набор данных других всеобщих выборов, на этот раз Российских, проходивших в 2011 г. Россия — гораздо более крупная страна, и поэтому данные о проголосовавших на выборах там гораздо объемнее. Для этого мы загрузим в оперативную память один большой TSV-файл с разделением полей данных символом табуляции.
def load_ru():
'''Загрузить данные по России'''
return pd.read_csv('data/ch01/Russia2011.tsv', '\t')
Посмотрим, какие имена столбцов имеются в российских данных:
def ex_1_29():
'''Показать список полей электоральных
данных по России'''
return load_ru().columns
Будет выведен следующий список столбцов:
Index(['Код ОИК', 'ОИК №', 'Имя участка',
'Число избирателей, внесенных в список избирателей',
...
'Политическая партия СПРАВЕДЛИВАЯ РОССИЯ',
'Политическая партия ЛДПР - Либерально-демократическая партия России',
'Политическая партия "ПАТРИОТЫ РОССИИ"',
'Политическая партия КОММУНИСТИЧЕСКАЯ ПАРТИЯ КОММУНИСТЫ РОССИИ',
'Политическая партия "Российская объединенная демократическая партия "ЯБЛОКО"',
'Политическая партия "ЕДИНАЯ РОССИЯ"',
'Всероссийская политическая партия "ПАРТИЯ РОСТА"'],
dtype='object')
Имена столбцов в российском наборе данных очень описательны, но, пожалуй, длиннее, чем нужно. Также, было бы удобно, если столбцы, представляющие те же самые атрибуты, которые мы уже видели в данных по выборам в Великобритании (к примеру, доля победителя и явка на выборы) были промаркированы одинаковым образом в обоих наборах данных. Переименуем их надлежащим образом.
Наряду с набором данных функция библиотеки Pandas rename ожидает словарь, в котором ключам с текущими именами столбцов поставлены в соответствие значения с новыми именами. Если объединить ее с данными i/add-derived-column, которые мы уже рассматривали, то мы получим следующее:
def load_ru_victors():
'''Загрузить данные по России,
выбрать, переименовать и вычислить поля'''
new_cols_dict = {
'Число избирателей, внесенных в список избирателей':'Электорат',
'Число действительных избирательных бюллетеней':
'Действительные бюллетени',
'Политическая партия "ЕДИНАЯ РОССИЯ"':'Победитель'
}
newcols = list(new_cols_dict.values())
df = load_ru().rename( columns=new_cols_dict )[newcols]
df['Доля победителя'] = df['Победитель'] / df['Действительные бюллетени']
df['Явка'] = df['Действительные бюллетени'] / df['Электорат']
return df
Библиотека Pandas располагает функцией безопасного деления divide, которая идентична операции /, но защищает от деления на ноль. Она вместо пропущенного значения (nan) в одном из полей подставляет значение, передаваемое в именованном аргументе fill_value. Если же оба значения поля равны nan, то результат будет отсуствовать. Поэтому операцию деления можно было бы переписать следующим образом:
df[ 'Доля победителя' ] = \
df[ 'Победитель' ].divide( df[ 'Действительные бюллетени' ], \
fill_value=1 )
