Анализ президентских выборов в России (2018): различия между версиями
Материал из Поле цифровой дидактики
Нет описания правки |
Добавлен программный код |
||
| Строка 29: | Строка 29: | ||
На участках с более высокой явкой доля голосов за основного кандидата выше, чем на участках с низкой явкой. | На участках с более высокой явкой доля голосов за основного кандидата выше, чем на участках с низкой явкой. | ||
== | == Используемые технологии == | ||
{| class="wikitable" | {| class="wikitable" | ||
| Строка 46: | Строка 46: | ||
| scales || Форматирование процентов | | scales || Форматирование процентов | ||
|} | |} | ||
== 4. Программный код == | |||
<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> | |||
Версия от 09:25, 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 | Форматирование процентов |
4. Программный код
# АНАЛИЗ ПРЕЗИДЕНТСКИХ ВЫБОРОВ В РОССИИ 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)))
