Анализ президентских выборов в России (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 г.

Исходные данные

Описание исследования

Цель

Проанализировать результаты президентских выборов в России 2018 года на уровне избирательных участков и регионов.

Задачи

  1. Выявить распределение голосов между кандидатами
  2. Сравнить явку избирателей по регионам
  3. Определить регионы-лидеры по количеству голосов за Путина
  4. Найти связь между явкой и поддержкой основного кандидата

Гипотеза

На участках с более высокой явкой доля голосов за основного кандидата выше, чем на участках с низкой явкой.

Используемые технологии

Технология Назначение
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. Явка по регионам

Топ-20 регионов по явке избирателей

Анализ:

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

График 3. Зависимость доли голосов за Путина от явки

Корреляция явки и доли голосов за Путина

Анализ:

  • Корреляция: +0.929 (очень сильная положительная)
  • На участках с высокой явкой доля Путина значительно выше

График 4. Количество голосов за Путина по городам

Топ-20 регионов по числу голосов за Путина

Выводы

Подтверждение гипотезы

Гипотеза о положительной связи между явкой и поддержкой основного кандидата подтвердилась. Коэффициент корреляции 0.929 указывает на очень сильную зависимость.

Практическая значимость

  • Разработан воспроизводимый R-рецепт для анализа выборов
  • Создана методика визуализации электоральной статистики
  • Результаты могут использоваться для политологических исследований

Используемые источники