Анализ президентских выборов в России (2018): различия между версиями
Материал из Поле цифровой дидактики
заполнена основная информация по проекту, а также цели, задачи и гипотеза |
Нет описания правки |
||
| (не показаны 3 промежуточные версии этого же участника) | |||
| Строка 7: | Строка 7: | ||
* '''Платформа:''' Kaggle | * '''Платформа:''' Kaggle | ||
* '''Дата публикации:''' 30 апреля 2018 г. | * '''Дата публикации:''' 30 апреля 2018 г. | ||
=== Исходные данные === | |||
* '''Файл:''' voting_data_eng.csv (8.9 MB) | |||
* '''Структура:''' 94 487 строк (избирательных участков), 23 столбца | |||
* '''Регионов:''' 85 | |||
* '''Ссылка:''' https://www.kaggle.com/datasets/valenzione/russian-presidental-elections-2018-voting-data | |||
== Описание исследования == | == Описание исследования == | ||
| Строка 21: | Строка 28: | ||
=== Гипотеза === | === Гипотеза === | ||
На участках с более высокой явкой доля голосов за основного кандидата выше, чем на участках с низкой явкой. | На участках с более высокой явкой доля голосов за основного кандидата выше, чем на участках с низкой явкой. | ||
== Используемые технологии == | |||
{| class="wikitable" | |||
! Технология !! Назначение | |||
|- | |||
| R 4.5.3 || Язык программирования | |||
|- | |||
| RStudio || Среда разработки | |||
|- | |||
| dplyr || Обработка и агрегация данных | |||
|- | |||
| ggplot2 || Визуализация (создание графика) | |||
|- | |||
| tidyr || Преобразование форматов данных | |||
|- | |||
| scales || Форматирование процентов | |||
|} | |||
== Программный код == | |||
<syntaxhighlight lang="R"> | |||
# АНАЛИЗ ПРЕЗИДЕНТСКИХ ВЫБОРОВ В РОССИИ 2018 | |||
library(dplyr) | |||
library(ggplot2) | |||
library(readr) | |||
library(tidyr) | |||
library(scales) | |||
# 1. ЗАГРУЗКА ДАННЫХ | |||
votes <- read_csv("voting_data_eng.csv") | |||
# 2. ПРЕДОБРАБОТКА | |||
votes_clean <- votes %>% | |||
mutate( | |||
total_voters = `Number of voters enlisted`, | |||
Putin_votes = `Putin Vladimir Vladimirovich`, | |||
Putin_share = Putin_votes / total_voters, | |||
Grudinin_share = `Grudinin Pavel Nikolaevich` / total_voters, | |||
Zhirinovskiy_share = `Zhirinovskiy Vladimir Volfovich` / total_voters, | |||
Sobchak_share = `Sobchak Ksenia Anatolyevna` / total_voters, | |||
Yavlinskiy_share = `Yavlinskiy Gregory Alekseivich` / total_voters, | |||
turnout = `Number of valid ballot papers` / total_voters | |||
) %>% | |||
filter(total_voters >= 10, Putin_share <= 1, Putin_share >= 0) | |||
# 3. ГРАФИК 1: КРУГОВАЯ ДИАГРАММА | |||
pie_data <- votes_clean %>% | |||
summarise( | |||
Путин = sum(Putin_votes), | |||
Грудинин = sum(`Grudinin Pavel Nikolaevich`), | |||
Жириновский = sum(`Zhirinovskiy Vladimir Volfovich`), | |||
Собчак = sum(`Sobchak Ksenia Anatolyevna`), | |||
Явлинский = sum(`Yavlinskiy Gregory Alekseivich`) | |||
) %>% | |||
pivot_longer(everything(), names_to = "candidate", values_to = "votes") %>% | |||
mutate(percentage = votes / sum(votes) * 100) | |||
p1 <- ggplot(pie_data, aes(x = "", y = percentage, fill = candidate)) + | |||
geom_bar(stat = "identity", width = 1) + | |||
coord_polar(theta = "y", start = 0) + | |||
geom_text(aes(label = paste0(round(percentage, 1), "%")), | |||
position = position_stack(vjust = 0.5), size = 5) + | |||
scale_fill_manual(values = c("#1E88E5", "#E53935", "#FFC107", "#8E24AA", "#43A047")) + | |||
labs(title = "Распределение голосов по кандидатам") + | |||
theme_void() + | |||
theme(plot.title = element_text(hjust = 0.5, size = 14, face = "bold")) | |||
ggsave("graph1_pie.png", p1, width = 8, height = 8, dpi = 300) | |||
# 4. ГРАФИК 2: ЯВКА ПО РЕГИОНАМ | |||
turnout_by_region <- votes_clean %>% | |||
group_by(region_name) %>% | |||
summarise(turnout = mean(turnout) * 100) %>% | |||
arrange(desc(turnout)) %>% head(20) | |||
p2 <- ggplot(turnout_by_region, aes(x = reorder(region_name, turnout), y = turnout, fill = turnout)) + | |||
geom_bar(stat = "identity") + | |||
scale_fill_gradient(low = "lightblue", high = "darkblue") + | |||
coord_flip() + | |||
labs(title = "Топ-20 регионов по явке", x = "", y = "Явка (%)") + | |||
theme_minimal() | |||
ggsave("graph2_turnout.png", p2, width = 10, height = 8, dpi = 300) | |||
# 5. ГРАФИК 3: ПУТИН vs ЯВКА | |||
p3 <- ggplot(votes_clean, aes(x = turnout * 100, y = Putin_share * 100)) + | |||
geom_point(alpha = 0.1, size = 0.5, color = "steelblue") + | |||
geom_smooth(method = "lm", color = "red", se = TRUE) + | |||
labs(title = "Зависимость доли Путина от явки", | |||
x = "Явка (%)", y = "Доля Путина (%)") + | |||
theme_minimal() | |||
ggsave("graph3_putin_turnout.png", p3, width = 10, height = 6, dpi = 300) | |||
# 6. ГРАФИК 4: ГОЛОСА ЗА ПУТИНА ПО ГОРОДАМ | |||
cities_data <- votes_clean %>% | |||
group_by(region_name) %>% | |||
summarise(votes = sum(Putin_votes) / 1000) %>% | |||
arrange(desc(votes)) %>% head(20) | |||
p4 <- ggplot(cities_data, aes(x = reorder(region_name, votes), y = votes, fill = votes)) + | |||
geom_bar(stat = "identity") + | |||
scale_fill_gradient(low = "lightcoral", high = "darkred") + | |||
coord_flip() + | |||
labs(title = "Голоса за Путина по городам (тыс.)", x = "", y = "Тысяч голосов") + | |||
theme_minimal() | |||
ggsave("graph4_cities.png", p4, width = 12, height = 8, dpi = 300) | |||
# 7. СТАТИСТИКА | |||
total_stats <- votes_clean %>% | |||
summarise( | |||
Путин = round(mean(Putin_share) * 100, 1), | |||
Грудинин = round(mean(Grudinin_share) * 100, 1), | |||
Жириновский = round(mean(Zhirinovskiy_share) * 100, 1), | |||
Явка = round(mean(turnout) * 100, 1) | |||
) | |||
cor_putin_turnout <- cor(votes_clean$Putin_share, votes_clean$turnout) | |||
print(total_stats) | |||
print(paste("Корреляция Путин ↔ Явка:", round(cor_putin_turnout, 3))) | |||
</syntaxhighlight> | |||
== Результаты == | |||
=== График 1. Распределение голосов по кандидатам === | |||
[[Файл:graph1_candidates_distribution.png|thumb|center|500px|Круговая диаграмма распределения голосов по кандидатам]] | |||
'''Анализ:''' | |||
* Путин — 79.2% голосов | |||
* Грудинин — 12.1% | |||
* Жириновский — 5.9% | |||
* Собчак — 1.7% | |||
* Явлинский — 1.1% | |||
=== График 2. Явка по регионам === | |||
[[Файл:graph2_turnout_by_region.png|thumb|center|800px|Топ-20 регионов по явке избирателей]] | |||
'''Анализ:''' | |||
* Самые высокие показатели явки: Чеченская Республика (95%), Дагестан (92%), Тыва (90%) | |||
* Самые низкие: крупные города (Москва — 65%, Санкт-Петербург — 68%) | |||
=== График 3. Зависимость доли голосов за Путина от явки === | |||
[[Файл:graph3_putin_vs_turnout.png|thumb|center|800px|Корреляция явки и доли голосов за Путина]] | |||
'''Анализ:''' | |||
* Корреляция: '''+0.929''' (очень сильная положительная) | |||
* На участках с высокой явкой доля Путина значительно выше | |||
=== График 4. Количество голосов за Путина по городам === | |||
[[Файл:graph4_putin_votes_by_city.png|thumb|center|800px|Топ-20 регионов по числу голосов за Путина]] | |||
== Выводы == | |||
=== Подтверждение гипотезы === | |||
Гипотеза о положительной связи между явкой и поддержкой основного кандидата '''подтвердилась'''. Коэффициент корреляции 0.929 указывает на очень сильную зависимость. | |||
=== Практическая значимость === | |||
* Разработан воспроизводимый R-рецепт для анализа выборов | |||
* Создана методика визуализации электоральной статистики | |||
* Результаты могут использоваться для политологических исследований | |||
== Используемые источники == | |||
* Kaggle - Russian Presidential Elections 2018 Voting Data: https://www.kaggle.com/datasets/valenzione/russian-presidental-elections-2018-voting-data | |||
* Документация R: https://www.r-project.org/ | |||
* Документация ggplot2: https://ggplot2.tidyverse.org/ | |||
[[Категория:ИНДОР-211]] | |||
[[Категория:Работы ИНДОР-211]] | |||
[[Категория:RRecipe]] | |||
[[Категория:BigDataWorks]] | |||
Версия от 10:07, 14 апреля 2026
Анализ президентских выборов в России (2018)
Общая информация
- Авторы: Студентки группы - PolezhaevaMA, Самира Мохаммад
- Дата исследования: 13 апреля 2026
- Источник: Russian Presidential Elections 2018 Voting Data
- Платформа: Kaggle
- Дата публикации: 30 апреля 2018 г.
Исходные данные
- Файл: voting_data_eng.csv (8.9 MB)
- Структура: 94 487 строк (избирательных участков), 23 столбца
- Регионов: 85
- Ссылка: https://www.kaggle.com/datasets/valenzione/russian-presidental-elections-2018-voting-data
Описание исследования
Цель
Проанализировать результаты президентских выборов в России 2018 года на уровне избирательных участков и регионов.
Задачи
- Выявить распределение голосов между кандидатами
- Сравнить явку избирателей по регионам
- Определить регионы-лидеры по количеству голосов за Путина
- Найти связь между явкой и поддержкой основного кандидата
Гипотеза
На участках с более высокой явкой доля голосов за основного кандидата выше, чем на участках с низкой явкой.
Используемые технологии
| Технология | Назначение |
|---|---|
| R 4.5.3 | Язык программирования |
| RStudio | Среда разработки |
| dplyr | Обработка и агрегация данных |
| ggplot2 | Визуализация (создание графика) |
| tidyr | Преобразование форматов данных |
| scales | Форматирование процентов |
Программный код
# АНАЛИЗ ПРЕЗИДЕНТСКИХ ВЫБОРОВ В РОССИИ 2018
library(dplyr)
library(ggplot2)
library(readr)
library(tidyr)
library(scales)
# 1. ЗАГРУЗКА ДАННЫХ
votes <- read_csv("voting_data_eng.csv")
# 2. ПРЕДОБРАБОТКА
votes_clean <- votes %>%
mutate(
total_voters = `Number of voters enlisted`,
Putin_votes = `Putin Vladimir Vladimirovich`,
Putin_share = Putin_votes / total_voters,
Grudinin_share = `Grudinin Pavel Nikolaevich` / total_voters,
Zhirinovskiy_share = `Zhirinovskiy Vladimir Volfovich` / total_voters,
Sobchak_share = `Sobchak Ksenia Anatolyevna` / total_voters,
Yavlinskiy_share = `Yavlinskiy Gregory Alekseivich` / total_voters,
turnout = `Number of valid ballot papers` / total_voters
) %>%
filter(total_voters >= 10, Putin_share <= 1, Putin_share >= 0)
# 3. ГРАФИК 1: КРУГОВАЯ ДИАГРАММА
pie_data <- votes_clean %>%
summarise(
Путин = sum(Putin_votes),
Грудинин = sum(`Grudinin Pavel Nikolaevich`),
Жириновский = sum(`Zhirinovskiy Vladimir Volfovich`),
Собчак = sum(`Sobchak Ksenia Anatolyevna`),
Явлинский = sum(`Yavlinskiy Gregory Alekseivich`)
) %>%
pivot_longer(everything(), names_to = "candidate", values_to = "votes") %>%
mutate(percentage = votes / sum(votes) * 100)
p1 <- ggplot(pie_data, aes(x = "", y = percentage, fill = candidate)) +
geom_bar(stat = "identity", width = 1) +
coord_polar(theta = "y", start = 0) +
geom_text(aes(label = paste0(round(percentage, 1), "%")),
position = position_stack(vjust = 0.5), size = 5) +
scale_fill_manual(values = c("#1E88E5", "#E53935", "#FFC107", "#8E24AA", "#43A047")) +
labs(title = "Распределение голосов по кандидатам") +
theme_void() +
theme(plot.title = element_text(hjust = 0.5, size = 14, face = "bold"))
ggsave("graph1_pie.png", p1, width = 8, height = 8, dpi = 300)
# 4. ГРАФИК 2: ЯВКА ПО РЕГИОНАМ
turnout_by_region <- votes_clean %>%
group_by(region_name) %>%
summarise(turnout = mean(turnout) * 100) %>%
arrange(desc(turnout)) %>% head(20)
p2 <- ggplot(turnout_by_region, aes(x = reorder(region_name, turnout), y = turnout, fill = turnout)) +
geom_bar(stat = "identity") +
scale_fill_gradient(low = "lightblue", high = "darkblue") +
coord_flip() +
labs(title = "Топ-20 регионов по явке", x = "", y = "Явка (%)") +
theme_minimal()
ggsave("graph2_turnout.png", p2, width = 10, height = 8, dpi = 300)
# 5. ГРАФИК 3: ПУТИН vs ЯВКА
p3 <- ggplot(votes_clean, aes(x = turnout * 100, y = Putin_share * 100)) +
geom_point(alpha = 0.1, size = 0.5, color = "steelblue") +
geom_smooth(method = "lm", color = "red", se = TRUE) +
labs(title = "Зависимость доли Путина от явки",
x = "Явка (%)", y = "Доля Путина (%)") +
theme_minimal()
ggsave("graph3_putin_turnout.png", p3, width = 10, height = 6, dpi = 300)
# 6. ГРАФИК 4: ГОЛОСА ЗА ПУТИНА ПО ГОРОДАМ
cities_data <- votes_clean %>%
group_by(region_name) %>%
summarise(votes = sum(Putin_votes) / 1000) %>%
arrange(desc(votes)) %>% head(20)
p4 <- ggplot(cities_data, aes(x = reorder(region_name, votes), y = votes, fill = votes)) +
geom_bar(stat = "identity") +
scale_fill_gradient(low = "lightcoral", high = "darkred") +
coord_flip() +
labs(title = "Голоса за Путина по городам (тыс.)", x = "", y = "Тысяч голосов") +
theme_minimal()
ggsave("graph4_cities.png", p4, width = 12, height = 8, dpi = 300)
# 7. СТАТИСТИКА
total_stats <- votes_clean %>%
summarise(
Путин = round(mean(Putin_share) * 100, 1),
Грудинин = round(mean(Grudinin_share) * 100, 1),
Жириновский = round(mean(Zhirinovskiy_share) * 100, 1),
Явка = round(mean(turnout) * 100, 1)
)
cor_putin_turnout <- cor(votes_clean$Putin_share, votes_clean$turnout)
print(total_stats)
print(paste("Корреляция Путин ↔ Явка:", round(cor_putin_turnout, 3)))
Результаты
График 1. Распределение голосов по кандидатам

Анализ:
- Путин — 79.2% голосов
- Грудинин — 12.1%
- Жириновский — 5.9%
- Собчак — 1.7%
- Явлинский — 1.1%
График 2. Явка по регионам

Анализ:
- Самые высокие показатели явки: Чеченская Республика (95%), Дагестан (92%), Тыва (90%)
- Самые низкие: крупные города (Москва — 65%, Санкт-Петербург — 68%)
График 3. Зависимость доли голосов за Путина от явки

Анализ:
- Корреляция: +0.929 (очень сильная положительная)
- На участках с высокой явкой доля Путина значительно выше
График 4. Количество голосов за Путина по городам

Выводы
Подтверждение гипотезы
Гипотеза о положительной связи между явкой и поддержкой основного кандидата подтвердилась. Коэффициент корреляции 0.929 указывает на очень сильную зависимость.
Практическая значимость
- Разработан воспроизводимый R-рецепт для анализа выборов
- Создана методика визуализации электоральной статистики
- Результаты могут использоваться для политологических исследований
Используемые источники
- Kaggle - Russian Presidential Elections 2018 Voting Data: https://www.kaggle.com/datasets/valenzione/russian-presidental-elections-2018-voting-data
- Документация R: https://www.r-project.org/
- Документация ggplot2: https://ggplot2.tidyverse.org/
