Анализ президентских выборов в России (2018): различия между версиями

Материал из Поле цифровой дидактики
Нет описания правки
Добавлен программный код
Строка 29: Строка 29:
На участках с более высокой явкой доля голосов за основного кандидата выше, чем на участках с низкой явкой.
На участках с более высокой явкой доля голосов за основного кандидата выше, чем на участках с низкой явкой.


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


{| 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 г.

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

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

Цель

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

Задачи

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

Гипотеза

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

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

Технология Назначение
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)))