Вступ

У цьому звіті викладено аналіз динаміки соціальної дистанції українців до представників 13 етнічних та лінгво-етнічних груп у 1994–2021 роках та 12 груп у 2022-2023 роках. Дані отримано з багаторічної серії опитувань, проведених Київським міжнародним інститутом соціології протягом 29 років.

Для вимірювання соціальної дистанції використовувалася шкала Еморі Богардуса, розроблена в 1925 та 1933 роках. Наталія Паніна адаптаувала її для України у 1990 році. Чим менше значення за шкалою, тим вища готовність респондентів приймати представників відповідної етнічної групи у близьке соціальне оточення (родина, сусідство тощо). Мінімальне значення за шкалою - 1, максимальне - 7.

Соціологічні опитування, проведені в різні роки, демонструють певні методологічні відмінності. Зокрема, в опитуваннях 2022–2023 років відбулися такі зміни: загальні категорії «росіяни» та «білоруси» були вилучені. Натомість запроваджено нові групи, диференційовані за місцем проживання: «росіяни — жителі України/росії» (обчислене середнє значення) та «білоруси — жителі України/білорусі» (обчислене середнє значення). Крім того, в 2022-2023 роках в масиві була відсутня оцінка євреїв.

Через зміну методики (виключено одних груп та добавлення інших) до аналізу включено два масиви. Загальна кількість респондентів, які надали повні відповіді на відповідний блок запитань у 1994-2021 році, становить 5 030 609, у 2022-2023 року - 1 985; вибірка зважена.

Дослідження дозволяє виявити латентні ієрархії “соціальної бажаності”, а також простежити, як змінювалася толерантність/міжетнічні упереджчення українського суспільства упродовж трьох десятиліть.

Завантаження бібліотек

library(haven)
library(dplyr)
library(ggplot2)
library(knitr)
library(smacof)
library(ggrepel)
library(sjmisc)
library(Hmisc)
library(tidyr)
library(kableExtra)
library(plotly)

1 Етнічні групи, включені до аналізу у 1994-2021 роках

file_name <- "DiscussData-Inter-ethnic_prejudice_in_Ukraine_(1994-2023)-Data_KIIS_Interethnic_tolerance_1994-2023_UKR.sav"
X1 <- read_sav(file_name)


потрібні_стовпчики <- c("score_americans", "score_africans", "score_belarus", "score_jews",
                        "score_canadians", "score_germans", "score_poles", "score_romani",
                        "score_russians", "score_romanians", "score_ukrainians_rus",
                        "score_ukrainians_ukr", "score_french", "year", "weight")

# Фільтрація та очистка

df_cleaned <- na.omit(X1[, потрібні_стовпчики])

# Перейменування змінних для зручності
old_score_names <- grep("^score_", colnames(df_cleaned), value = TRUE)
new_short_names <- sub("score_", "", old_score_names)
df_cleaned <- df_cleaned %>% rename(!!!setNames(old_score_names, new_short_names))
target_vars_in_df_cleaned <- new_short_names[new_short_names %in% names(df_cleaned)]

if (length(target_vars_in_df_cleaned) > 0) {
  # 2. Використовуємо lapply для отримання атрибутів "label" з df_cleaned
  #    Функція всередині lapply отримує нове, коротке ім'я змінної (v_short),
  #    звертається до стовпця df_cleaned[[v_short]] і отримує його атрибут "label".
  labels_list_df_cleaned <- lapply(target_vars_in_df_cleaned, function(v_short) {
    attr(df_cleaned[[v_short]], "label")
  })

  # 3. Надаємо імена елементам списку (використовуючи короткі імена)
  names(labels_list_df_cleaned) <- target_vars_in_df_cleaned

  # 4. Виводимо список
  cat("\nАтрибути 'label' для перейменованих ('score_') змінних у df_cleaned:\n")
  print(labels_list_df_cleaned)
} else {
  cat("\nНе знайдено перейменованих 'score' змінних у df_cleaned для виведення атрибутів.\n")
  cat("Можливі причини: стовпці 'score_' були повністю видалені через na.omit, або не були серед 'потрібні_стовпчики'.\n")
  cat("Згенеровані 'new_short_names' (якщо є):", paste(new_short_names, collapse=", "), "\n")
  cat("Стовпці в 'df_cleaned':", paste(names(df_cleaned), collapse=", "), "\n")
}
## 
## Атрибути 'label' для перейменованих ('score_') змінних у df_cleaned:
## $americans
## [1] "Шкала Богардуса (мінімальний бал). Американці"
## 
## $africans
## [1] "Шкала Богардуса (мінімальний бал). Африканці"
## 
## $belarus
## [1] "Шкала Богардуса (мінімальний бал). Білоруси"
## 
## $jews
## [1] "Шкала Богардуса (мінімальний бал). Євреї"
## 
## $canadians
## [1] "Шкала Богардуса (мінімальний бал). Канадці"
## 
## $germans
## [1] "Шкала Богардуса (мінімальний бал). Німці"
## 
## $poles
## [1] "Шкала Богардуса (мінімальний бал). Поляки"
## 
## $romani
## [1] "Шкала Богардуса (мінімальний бал). Роми (цигани)"
## 
## $russians
## [1] "Шкала Богардуса (мінімальний бал). Росіяни"
## 
## $romanians
## [1] "Шкала Богардуса (мінімальний бал). Румуни"
## 
## $ukrainians_rus
## [1] "Шкала Богардуса (мінімальний бал). Російськомовні українці"
## 
## $ukrainians_ukr
## [1] "Шкала Богардуса (мінімальний бал). Українськомовні українці"
## 
## $french
## [1] "Шкала Богардуса (мінімальний бал). Французи"

2 Середні значення змінних за роками (1994-2021)

social_distance_vars <- names(df_cleaned)[1:13]

summary_stats_weighted_mean <- df_cleaned %>%
  group_by(year) %>%
  summarise(
    across(
      .cols = all_of(social_distance_vars), # Тепер social_distance_vars має існувати
      .fns = list(
        w_mean = ~ Hmisc::wtd.mean(.x, weights = weight, na.rm = TRUE)
      ),
      .names = "{.col}"
    ),
    .groups = "drop"
  ) %>%
  arrange(year)%>%round(1)


plot_data_long <- summary_stats_weighted_mean %>%
  pivot_longer(
    cols = all_of(social_distance_vars), # Вказуємо стовпці, які потрібно "розплавити"
    names_to = "ethnic_group",          # Назва нового стовпця для назв етнічних груп
    values_to = "weighted_mean_value"   # Назва нового стовпця для значень середніх
  )


social_distance_gg <- ggplot(plot_data_long,
                               aes(x = year,
                                   y = weighted_mean_value,
                                   group = ethnic_group,
                                   color = ethnic_group,
                                   # Додаємо кастомний текст для tooltip
                                   text = paste("Етнічна група:", ethnic_group,
                                                "<br>Рік:", year,
                                                "<br>Середнє:", weighted_mean_value))) + # <br> для нового рядка в HTML
  geom_line(linewidth = 0.8) +
  geom_point(size = 1.5) + # Точки важливі для того, щоб було куди наводити мишку
  labs(
    title = "Динаміка середніх значень соціальної дистанції за роками",
    subtitle = paste0("Для ", length(social_distance_vars), " етнічних груп"),
    x = "Рік",
    y = "Зважене середнє значення соціальної дистанції",
    color = "Етнічна група"
  ) +
  theme_minimal(base_size = 12) +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold"),
    plot.subtitle = element_text(hjust = 0.5),
    legend.position = "right", # Спробуйте "bottom" якщо легенда заважає
    axis.text.x = element_text(angle = 45, hjust = 1)
  ) +
  scale_x_continuous(breaks = unique(plot_data_long$year))

# 3. Перетворення ggplot об'єкта на інтерактивний plotly об'єкт
# Ми вказуємо plotly використовувати нашу кастомну естетику 'text' для tooltip
interactive_social_distance_plot <- ggplotly(social_distance_gg, tooltip = "text")

# 4. Виведення інтерактивного графіка
# В RStudio або інтерактивній сесії графік з'явиться у вкладці "Viewer"
# В R Markdown документі він буде вбудований в HTML вивід
interactive_social_distance_plot

Загальні тенденції (1994–2021)
1. Стабільно найвища дистанція — до ромів, африканців, росіян. Роми: утримуються на найвіддаленішій позиції майже весь період (від 5.1 до 5.9).

Африканці: стабільно на рівні ~5.0–5.6, злегка знижується лише в 2021 р. (4.7).

Росіяни: з 1994 до 2013 — досить низька дистанція (1.9–2.7), після чого різко зростає:

2014 - 3.1,

2015 - 4.0 (!),

2021 - 4.1.

➤ Очевидна реакція на анексію Криму (2014) та війну на Донбасі.

2. Поступове збільшення дистанції до “Західних” націй (американці, німці, французи) — пізніше стабілізація або спад Американці: з 3.7 (1994) до піку 5.1 (2006–2007), потім поступове зниження до 3.9 (2021).

Німці, французи, канадці: схожий патерн — ріст до 2006–2009, далі стабілізація або зниження.

➤ Можливо, відображає пострадянське відчуження/дистанцію, яка пізніше змінюється на більшу відкритість до Заходу, особливо після 2014.

3. Низька соціальна дистанція до українців (обох груп) і поляків
Українці (українськомовні та російськомовні): послідовно найближчі в уявленнях респондентів (1.7–2.4).

Поляки: досить близька дистанція (3.8–4.6), дещо зменшується в 2014–2021.

➤ Ймовірно, наслідок історичної та культурної близькості, з посиленням проєвропейського вектору.

4. Євреї — приклад зменшення дистанції Початок: 3.6 (1994), далі плавне збільшення до 4.5 (2007), але після 2014 — спадає знову до 3.9 (2021).

➤ Може свідчити про зменшення ксенофобських наративів, вплив політики пам’яті.

context_data <- data.frame(
  Period = c("1990–1999", "2004–2005", "2014", "2014–2021", "2019–2021", "2021"),
  Events = c(
    "Пострадянський період: економічна криза, ідентифікаційна дезорієнтація",
    "Помаранчева революція, демократичне пробудження",
    "Анексія Криму, війна на Донбасі",
    "Євроінтеграція, візова лібералізація, діджиталізація держави",
    "Президентство В. Зеленського, культурні ініціативи",
    "COVID-19: пандемія, ізоляція, потреба у солідарності"
  ),
  Effects = c(
    "Висока загальна дистанція до «не своїх», домінування пострадянських упереджень",
    "Зростання симпатії до Заходу, активація демократичних орієнтацій",
    "Різке зростання дистанції до росіян",
    "Зменшення дистанції до західних націй, нормалізація проєвропейських орієнтацій",
    "Зменшення соціальної дистанції до євреїв",
    "Пониження соціальної дистанції до більшості етнічних груп"
  )
)

# Заміна назв стовпців для виводу таблиці
colnames(context_data) <- c("Період", "Події", "Можливий ефект")

kable(context_data, caption = "Подієві контексти, що впливали на динаміку соціальної дистанції в Україні (1994–2021)")
Подієві контексти, що впливали на динаміку соціальної дистанції в Україні (1994–2021)
Період Події Можливий ефект
1990–1999 Пострадянський період: економічна криза, ідентифікаційна дезорієнтація Висока загальна дистанція до «не своїх», домінування пострадянських упереджень
2004–2005 Помаранчева революція, демократичне пробудження Зростання симпатії до Заходу, активація демократичних орієнтацій
2014 Анексія Криму, війна на Донбасі Різке зростання дистанції до росіян
2014–2021 Євроінтеграція, візова лібералізація, діджиталізація держави Зменшення дистанції до західних націй, нормалізація проєвропейських орієнтацій
2019–2021 Президентство В. Зеленського, культурні ініціативи Зменшення соціальної дистанції до євреїв
2021 COVID-19: пандемія, ізоляція, потреба у солідарності Пониження соціальної дистанції до більшості етнічних груп

З даних таблиці простежуються як загальні довгострокові тренди, так і різкі зсуви, пов’язані з ключовими подіями в історії України (наприклад, Євромайданом, анексією Криму).

Латентна ієрархія соціальної бажаності проявляється стабільно: найвища дистанція до ромів і африканців, найменша — до українців, поляків, білорусів.
Ключова подія, що трансформувала картину — війна з Росією: вона радикально змінила ставлення до росіян.
Західні нації поступово стають “ближчими”, особливо після Євромайдану.
Євреї — приклад позитивної динаміки подолання історичних упереджень. Різноманітні культурні проєкти та політичні зміни могли формувати позитивний імідж і зменшувати соціальні стереотипи. Крім того, українці почали оцінювати політиків за їхніми програмами, а не за походженням. З 2021 — тенденція до загального зниження соціальної дистанції, можливо, як реакція на глобальні кризи й потребу в єдності. В цей перод відмічається зменшення соціальних контактів. Примітно, що саме у 2021 році, порівняно з 2019-м, було зафіксоване зростання соціальної дистанції до білорусів, росіян та українців (обох мовних груп).

3 Побудова MDS (вся вибірка)

weighted_corr_matrix_obj <- cov.wt(df_cleaned[1:13],
                                   wt = df_cleaned$weight,
                                   cor = TRUE)
cor_matrix <- round(weighted_corr_matrix_obj$cor, 3)

dst <- sim2diss(cor_matrix, method = "corr", to.dist = TRUE)
map_result <- mds(delta = dst, ndim = 2, type = "ordinal")
Stress_result <- round(map_result$stress, 3)
Total_Weighted_N <- sum(df_cleaned$weight)
Total_Unweighted_N <- nrow(df_cleaned)

mds_coords <- as.data.frame(map_result$conf)
colnames(mds_coords) <- c("Вимір 1", "Вимір 2")
mds_coords$label <- rownames(map_result$conf)

plot_title <- paste0("Вся вибірка (Stress: ", Stress_result,
                     ", Зважене N: ", round(Total_Weighted_N), ")")

ggplot(mds_coords, aes(x = `Вимір 1`, y = `Вимір 2`, label = label)) +
  geom_point(color = "blue", size = 2.5) +
  geom_text_repel(size = 3.0, segment.color = "grey50", box.padding = 0.35) +
  ggtitle(plot_title) +
  xlab("Вимір 1 ") +
  ylab("Вимір 2") +
  theme_minimal(base_size = 12) +
  theme(plot.title = element_text(hjust = 0.5)) +
  coord_fixed(ratio = 1, xlim = c(-1.5, 1.5), ylim = c(-1.5, 1.5))

Метод багатовимірного шкалювання дозволяє візуалізувати відстані у сприйнятті різних національностей. Аналіз проведено на об’єднаному масиві за великий проміжок часу. Тому подану нижче інтерпретацію слід сприймати з обережністю (як усереднену тенденцію). Значення Stress = 0.049, яке отримано при моделюванні, є достатньо прийнятним для соціологічних досліджень, що працюють із даними ставлень та упереджень (вважається, що для ordinal MDS значення Stress до 0.2 або або навіть до 0.1 є допустимим). Отже, двовимірне відображення простору соціальної дистанції передає основні закономірності латентної структури міжгрупових оцінок.

Інтерпретація простору соціальної дистанції (MDS)

Вимір 1. Вісь “слов’яни – західні/неслов’янські нації”.

Перший вимір, який пояснює основну вісь варіації у ставленнях респондентів до різних етнічних та національних груп, чітко розділяє респондентські оцінки за ознакою етнокультурної та політичної близькості, що у пострадянському контексті асоціюється зі слов’янською ідентичністю та історичною співучастю в радянському просторі.

На одному полюсі (правий край) розташовані українці (українськомовні та російськомовні), білоруси та росіяни — етноси, що мають спільну культурно-лінгвістичну основу, спільну історію, включаючи радянське минуле, а також нерідко й родинні зв’язки. Їхня близькість у просторі MDS свідчить про нижчу соціальну дистанцію.

На протилежному (лівому) полюсі розміщуються американці, канадці, французи, німці, а також африканці та румуни — групи, що, з точки зору респондентів, культурно та історично більш віддалені. Цей розподіл свідчить про перцептивну межу між “нашими” (слов’янами) та “іншими” (західним чи неєвропейським світом).

Таким чином, вимір 1 можна інтерпретувати як “етнокультурну близькість до слов’янського ядра”, або “інгрупова/аутгрупова дистанція у пострадянському контексті”.

Вимір 2. Вісь “ціннісна сумісність та соціальна довіра”

Другий вимір менш структурований, однак демонструє вертикаль, пов’язану із соціальним статусом і культурною легітимністю. На його верхньому полюсі розміщені українці (особливо українськомовні), поляки, французи — групи, що, ймовірно, сприймаються як “цивілізаційно близькі” або такі, що мають спільні демократичні та європейські цінності.

У нижній частині координатного простору фігурують роми, євреї, африканці — групи, які історично маргіналізовані або стереотипізовані, що вказує на існування латентної шкали ієрархізації за критеріями «соціальної бажаності», яка є похідною від домінантного наративу про «інших». Особливо показовим є розташування росіян: їхня низька позиція у просторі соціальної дистанції може зумовлюватися анексією Автономної Республіки Крим та збройною агресією РФ на Донбасі. Таким чином, геополітичні події стають каталізаторами переосмислення символічних меж “своїх” і “чужих” у колективній свідомості.

Це дозволяє трактувати Вимір 2 як “вісь ціннісної легітимності та соціальної довіри”, яка структурує сприйняття груп не стільки за етнічним принципом, скільки за рівнем культурної “прийнятності” в уявному моральному порядку.

4 MDS по кожному року

# Рік: 1994
df_1994 <- subset(df_cleaned, year == 1994)

weighted_corr_matrix_obj_1994 <- cov.wt(df_1994[1:13],
                                        wt = df_1994$weight,
                                        cor = TRUE)
cor_matrix_1994 <- round(weighted_corr_matrix_obj_1994$cor, 3)

dst_1994 <- sim2diss(cor_matrix_1994, method = "corr", to.dist = TRUE)
map_result_1994 <- mds(delta = dst_1994, ndim = 2, type = "ordinal")
Stress_result_1994 <- round(map_result_1994$stress, 3)

Total_Weighted_N_1994 <- sum(df_1994$weight)
Total_Unweighted_N_1994 <- nrow(df_1994)

mds_coords_1994 <- as.data.frame(map_result_1994$conf)
colnames(mds_coords_1994) <- c("Вимір 1", "Вимір 2")
mds_coords_1994$label <- rownames(map_result_1994$conf)

plot_title_1994 <- paste0("1994 (Stress: ", Stress_result_1994,
                          ", Зважене N: ", round(Total_Weighted_N_1994), ")")

ggplot(mds_coords_1994, aes(x = `Вимір 1`, y = `Вимір 2`, label = label)) +
  geom_point(color = "blue", size = 2.5) +
  geom_text_repel(size = 3.0, segment.color = "grey50", box.padding = 0.35) +
  ggtitle(plot_title_1994) +
  xlab("Вимір 1 ") +
  ylab("Вимір 2") +
  theme_minimal(base_size = 12) +
  theme(plot.title = element_text(hjust = 0.5)) +
  coord_fixed(ratio = 1, xlim = c(-1.5, 1.5), ylim = c(-1.5, 1.5))

# Рік: 1995
df_1995 <- subset(df_cleaned, year == 1995)

weighted_corr_matrix_obj_1995 <- cov.wt(df_1995[1:13],
                                        wt = df_1995$weight,
                                        cor = TRUE)
cor_matrix_1995 <- round(weighted_corr_matrix_obj_1995$cor, 3)

dst_1995 <- sim2diss(cor_matrix_1995, method = "corr", to.dist = TRUE)
map_result_1995 <- mds(delta = dst_1995, ndim = 2, type = "ordinal")
Stress_result_1995 <- round(map_result_1995$stress, 3)

Total_Weighted_N_1995 <- sum(df_1995$weight)
Total_Unweighted_N_1995 <- nrow(df_1995)

mds_coords_1995 <- as.data.frame(map_result_1995$conf)
colnames(mds_coords_1995) <- c("Вимір 1", "Вимір 2")
mds_coords_1995$label <- rownames(map_result_1995$conf)

plot_title_1995 <- paste0("1995 (Stress: ", Stress_result_1995,
                          ", Зважене N: ", round(Total_Weighted_N_1995), ")")

ggplot(mds_coords_1995, aes(x = `Вимір 1`, y = `Вимір 2`, label = label)) +
  geom_point(color = "blue", size = 2.5) +
  geom_text_repel(size = 3.0, segment.color = "grey50", box.padding = 0.35) +
  ggtitle(plot_title_1995) +
  xlab("Вимір 1 ") +
  ylab("Вимір 2") +
  theme_minimal(base_size = 12) +
  theme(plot.title = element_text(hjust = 0.5)) +
  coord_fixed(ratio = 1, xlim = c(-1.5, 1.5), ylim = c(-1.5, 1.5))

# Рік: 1996
df_1996 <- subset(df_cleaned, year == 1996)

weighted_corr_matrix_obj_1996 <- cov.wt(df_1996[1:13],
                                        wt = df_1996$weight,
                                        cor = TRUE)
cor_matrix_1996 <- round(weighted_corr_matrix_obj_1996$cor, 3)

dst_1996 <- sim2diss(cor_matrix_1996, method = "corr", to.dist = TRUE)
map_result_1996 <- mds(delta = dst_1996, ndim = 2, type = "ordinal")
Stress_result_1996 <- round(map_result_1996$stress, 3)

Total_Weighted_N_1996 <- sum(df_1996$weight)
Total_Unweighted_N_1996 <- nrow(df_1996)

mds_coords_1996 <- as.data.frame(map_result_1996$conf)
colnames(mds_coords_1996) <- c("Вимір 1", "Вимір 2")
mds_coords_1996$label <- rownames(map_result_1996$conf)

plot_title_1996 <- paste0("1996 (Stress: ", Stress_result_1996,
                          ", Зважене N: ", round(Total_Weighted_N_1996), ")")

ggplot(mds_coords_1996, aes(x = `Вимір 1`, y = `Вимір 2`, label = label)) +
  geom_point(color = "blue", size = 2.5) +
  geom_text_repel(size = 3.0, segment.color = "grey50", box.padding = 0.35) +
  ggtitle(plot_title_1996) +
  xlab("Вимір 1 ") +
  ylab("Вимір 2") +
  theme_minimal(base_size = 12) +
  theme(plot.title = element_text(hjust = 0.5)) +
  coord_fixed(ratio = 1, xlim = c(-1.5, 1.5), ylim = c(-1.5, 1.5))

# Рік: 1997
df_1997 <- subset(df_cleaned, year == 1997)

weighted_corr_matrix_obj_1997 <- cov.wt(df_1997[1:13],
                                        wt = df_1997$weight,
                                        cor = TRUE)
cor_matrix_1997 <- round(weighted_corr_matrix_obj_1997$cor, 3)

dst_1997 <- sim2diss(cor_matrix_1997, method = "corr", to.dist = TRUE)
map_result_1997 <- mds(delta = dst_1997, ndim = 2, type = "ordinal")
Stress_result_1997 <- round(map_result_1997$stress, 3)

Total_Weighted_N_1997 <- sum(df_1997$weight)
Total_Unweighted_N_1997 <- nrow(df_1997)

mds_coords_1997 <- as.data.frame(map_result_1997$conf)
colnames(mds_coords_1997) <- c("Вимір 1", "Вимір 2")
mds_coords_1997$label <- rownames(map_result_1997$conf)

plot_title_1997 <- paste0("1997 (Stress: ", Stress_result_1997,
                          ", Зважене N: ", round(Total_Weighted_N_1997), ")")

ggplot(mds_coords_1997, aes(x = `Вимір 1`, y = `Вимір 2`, label = label)) +
  geom_point(color = "blue", size = 2.5) +
  geom_text_repel(size = 3.0, segment.color = "grey50", box.padding = 0.35) +
  ggtitle(plot_title_1997) +
  xlab("Вимір 1 ") +
  ylab("Вимір 2") +
  theme_minimal(base_size = 12) +
  theme(plot.title = element_text(hjust = 0.5)) +
  coord_fixed(ratio = 1, xlim = c(-1.5, 1.5), ylim = c(-1.5, 1.5))

# Рік: 1998
df_1998 <- subset(df_cleaned, year == 1998)

weighted_corr_matrix_obj_1998 <- cov.wt(df_1998[1:13],
                                        wt = df_1998$weight,
                                        cor = TRUE)
cor_matrix_1998 <- round(weighted_corr_matrix_obj_1998$cor, 3)

dst_1998 <- sim2diss(cor_matrix_1998, method = "corr", to.dist = TRUE)
map_result_1998 <- mds(delta = dst_1998, ndim = 2, type = "ordinal")
Stress_result_1998 <- round(map_result_1998$stress, 3)

Total_Weighted_N_1998 <- sum(df_1998$weight)
Total_Unweighted_N_1998 <- nrow(df_1998)

mds_coords_1998 <- as.data.frame(map_result_1998$conf)
colnames(mds_coords_1998) <- c("Вимір 1", "Вимір 2")
mds_coords_1998$label <- rownames(map_result_1998$conf)

plot_title_1998 <- paste0("1998 (Stress: ", Stress_result_1998,
                          ", Зважене N: ", round(Total_Weighted_N_1998), ")")

ggplot(mds_coords_1998, aes(x = `Вимір 1`, y = `Вимір 2`, label = label)) +
  geom_point(color = "blue", size = 2.5) +
  geom_text_repel(size = 3.0, segment.color = "grey50", box.padding = 0.35) +
  ggtitle(plot_title_1998) +
  xlab("Вимір 1 ") +
  ylab("Вимір 2") +
  theme_minimal(base_size = 12) +
  theme(plot.title = element_text(hjust = 0.5)) +
  coord_fixed(ratio = 1, xlim = c(-1.5, 1.5), ylim = c(-1.5, 1.5))

# Рік: 1999
df_1999 <- subset(df_cleaned, year == 1999)

weighted_corr_matrix_obj_1999 <- cov.wt(df_1999[1:13],
                                        wt = df_1999$weight,
                                        cor = TRUE)
cor_matrix_1999 <- round(weighted_corr_matrix_obj_1999$cor, 3)

dst_1999 <- sim2diss(cor_matrix_1999, method = "corr", to.dist = TRUE)
map_result_1999 <- mds(delta = dst_1999, ndim = 2, type = "ordinal")
Stress_result_1999 <- round(map_result_1999$stress, 3)

Total_Weighted_N_1999 <- sum(df_1999$weight)
Total_Unweighted_N_1999 <- nrow(df_1999)

mds_coords_1999 <- as.data.frame(map_result_1999$conf)
colnames(mds_coords_1999) <- c("Вимір 1", "Вимір 2")
mds_coords_1999$label <- rownames(map_result_1999$conf)

plot_title_1999 <- paste0("1999 (Stress: ", Stress_result_1999,
                          ", Зважене N: ", round(Total_Weighted_N_1999), ")")

ggplot(mds_coords_1999, aes(x = `Вимір 1`, y = `Вимір 2`, label = label)) +
  geom_point(color = "blue", size = 2.5) +
  geom_text_repel(size = 3.0, segment.color = "grey50", box.padding = 0.35) +
  ggtitle(plot_title_1999) +
  xlab("Вимір 1 ") +
  ylab("Вимір 2") +
  theme_minimal(base_size = 12) +
  theme(plot.title = element_text(hjust = 0.5)) +
  coord_fixed(ratio = 1, xlim = c(-1.5, 1.5), ylim = c(-1.5, 1.5))

# Рік: 2000
df_2000 <- subset(df_cleaned, year == 2000)

weighted_corr_matrix_obj_2000 <- cov.wt(df_2000[1:13],
                                        wt = df_2000$weight,
                                        cor = TRUE)
cor_matrix_2000 <- round(weighted_corr_matrix_obj_2000$cor, 3)

dst_2000 <- sim2diss(cor_matrix_2000, method = "corr", to.dist = TRUE)
map_result_2000 <- mds(delta = dst_2000, ndim = 2, type = "ordinal")
Stress_result_2000 <- round(map_result_2000$stress, 3)

Total_Weighted_N_2000 <- sum(df_2000$weight)
Total_Unweighted_N_2000 <- nrow(df_2000)

mds_coords_2000 <- as.data.frame(map_result_2000$conf)
colnames(mds_coords_2000) <- c("Вимір 1", "Вимір 2")
mds_coords_2000$label <- rownames(map_result_2000$conf)

plot_title_2000 <- paste0("2000 (Stress: ", Stress_result_2000,
                          ", Зважене N: ", round(Total_Weighted_N_2000), ")")

ggplot(mds_coords_2000, aes(x = `Вимір 1`, y = `Вимір 2`, label = label)) +
  geom_point(color = "blue", size = 2.5) +
  geom_text_repel(size = 3.0, segment.color = "grey50", box.padding = 0.35) +
  ggtitle(plot_title_2000) +
  xlab("Вимір 1 ") +
  ylab("Вимір 2") +
  theme_minimal(base_size = 12) +
  theme(plot.title = element_text(hjust = 0.5)) +
  coord_fixed(ratio = 1, xlim = c(-1.5, 1.5), ylim = c(-1.5, 1.5))

# Рік: 2001
df_2001 <- subset(df_cleaned, year == 2001)

weighted_corr_matrix_obj_2001 <- cov.wt(df_2001[1:13],
                                        wt = df_2001$weight,
                                        cor = TRUE)
cor_matrix_2001 <- round(weighted_corr_matrix_obj_2001$cor, 3)

dst_2001 <- sim2diss(cor_matrix_2001, method = "corr", to.dist = TRUE)
map_result_2001 <- mds(delta = dst_2001, ndim = 2, type = "ordinal")
Stress_result_2001 <- round(map_result_2001$stress, 3)

Total_Weighted_N_2001 <- sum(df_2001$weight)
Total_Unweighted_N_2001 <- nrow(df_2001)

mds_coords_2001 <- as.data.frame(map_result_2001$conf)
colnames(mds_coords_2001) <- c("Вимір 1", "Вимір 2")
mds_coords_2001$label <- rownames(map_result_2001$conf)

plot_title_2001 <- paste0("2001 (Stress: ", Stress_result_2001,
                          ", Зважене N: ", round(Total_Weighted_N_2001), ")")

ggplot(mds_coords_2001, aes(x = `Вимір 1`, y = `Вимір 2`, label = label)) +
  geom_point(color = "blue", size = 2.5) +
  geom_text_repel(size = 3.0, segment.color = "grey50", box.padding = 0.35) +
  ggtitle(plot_title_2001) +
  xlab("Вимір 1 ") +
  ylab("Вимір 2") +
  theme_minimal(base_size = 12) +
  theme(plot.title = element_text(hjust = 0.5)) +
  coord_fixed(ratio = 1, xlim = c(-1.5, 1.5), ylim = c(-1.5, 1.5))

# Рік: 2002
df_2002 <- subset(df_cleaned, year == 2002)

weighted_corr_matrix_obj_2002 <- cov.wt(df_2002[1:13],
                                        wt = df_2002$weight,
                                        cor = TRUE)
cor_matrix_2002 <- round(weighted_corr_matrix_obj_2002$cor, 3)

dst_2002 <- sim2diss(cor_matrix_2002, method = "corr", to.dist = TRUE)
map_result_2002 <- mds(delta = dst_2002, ndim = 2, type = "ordinal")
Stress_result_2002 <- round(map_result_2002$stress, 3)

Total_Weighted_N_2002 <- sum(df_2002$weight)
Total_Unweighted_N_2002 <- nrow(df_2002)

mds_coords_2002 <- as.data.frame(map_result_2002$conf)
colnames(mds_coords_2002) <- c("Вимір 1", "Вимір 2")
mds_coords_2002$label <- rownames(map_result_2002$conf)

plot_title_2002 <- paste0("2002 (Stress: ", Stress_result_2002,
                          ", Зважене N: ", round(Total_Weighted_N_2002), ")")

ggplot(mds_coords_2002, aes(x = `Вимір 1`, y = `Вимір 2`, label = label)) +
  geom_point(color = "blue", size = 2.5) +
  geom_text_repel(size = 3.0, segment.color = "grey50", box.padding = 0.35) +
  ggtitle(plot_title_2002) +
  xlab("Вимір 1 ") +
  ylab("Вимір 2") +
  theme_minimal(base_size = 12) +
  theme(plot.title = element_text(hjust = 0.5)) +
  coord_fixed(ratio = 1, xlim = c(-1.5, 1.5), ylim = c(-1.5, 1.5))

# Рік: 2003
df_2003 <- subset(df_cleaned, year == 2003)

weighted_corr_matrix_obj_2003 <- cov.wt(df_2003[1:13],
                                        wt = df_2003$weight,
                                        cor = TRUE)
cor_matrix_2003 <- round(weighted_corr_matrix_obj_2003$cor, 3)

dst_2003 <- sim2diss(cor_matrix_2003, method = "corr", to.dist = TRUE)
map_result_2003 <- mds(delta = dst_2003, ndim = 2, type = "ordinal")
Stress_result_2003 <- round(map_result_2003$stress, 3)

Total_Weighted_N_2003 <- sum(df_2003$weight)
Total_Unweighted_N_2003 <- nrow(df_2003)

mds_coords_2003 <- as.data.frame(map_result_2003$conf)
colnames(mds_coords_2003) <- c("Вимір 1", "Вимір 2")
mds_coords_2003$label <- rownames(map_result_2003$conf)

plot_title_2003 <- paste0("2003 (Stress: ", Stress_result_2003,
                          ", Зважене N: ", round(Total_Weighted_N_2003), ")")

ggplot(mds_coords_2003, aes(x = `Вимір 1`, y = `Вимір 2`, label = label)) +
  geom_point(color = "blue", size = 2.5) +
  geom_text_repel(size = 3.0, segment.color = "grey50", box.padding = 0.35) +
  ggtitle(plot_title_2003) +
  xlab("Вимір 1 ") +
  ylab("Вимір 2") +
  theme_minimal(base_size = 12) +
  theme(plot.title = element_text(hjust = 0.5)) +
  coord_fixed(ratio = 1, xlim = c(-1.5, 1.5), ylim = c(-1.5, 1.5))

# Рік: 2004
df_2004 <- subset(df_cleaned, year == 2004)

weighted_corr_matrix_obj_2004 <- cov.wt(df_2004[1:13],
                                        wt = df_2004$weight,
                                        cor = TRUE)
cor_matrix_2004 <- round(weighted_corr_matrix_obj_2004$cor, 3)

dst_2004 <- sim2diss(cor_matrix_2004, method = "corr", to.dist = TRUE)
map_result_2004 <- mds(delta = dst_2004, ndim = 2, type = "ordinal")
Stress_result_2004 <- round(map_result_2004$stress, 3)

Total_Weighted_N_2004 <- sum(df_2004$weight)
Total_Unweighted_N_2004 <- nrow(df_2004)

mds_coords_2004 <- as.data.frame(map_result_2004$conf)
colnames(mds_coords_2004) <- c("Вимір 1", "Вимір 2")
mds_coords_2004$label <- rownames(map_result_2004$conf)

plot_title_2004 <- paste0("2004 (Stress: ", Stress_result_2004,
                          ", Зважене N: ", round(Total_Weighted_N_2004), ")")

ggplot(mds_coords_2004, aes(x = `Вимір 1`, y = `Вимір 2`, label = label)) +
  geom_point(color = "blue", size = 2.5) +
  geom_text_repel(size = 3.0, segment.color = "grey50", box.padding = 0.35) +
  ggtitle(plot_title_2004) +
  xlab("Вимір 1 ") +
  ylab("Вимір 2") +
  theme_minimal(base_size = 12) +
  theme(plot.title = element_text(hjust = 0.5)) +
  coord_fixed(ratio = 1, xlim = c(-1.5, 1.5), ylim = c(-1.5, 1.5))

# Рік: 2005
df_2005 <- subset(df_cleaned, year == 2005)

weighted_corr_matrix_obj_2005 <- cov.wt(df_2005[1:13],
                                        wt = df_2005$weight,
                                        cor = TRUE)
cor_matrix_2005 <- round(weighted_corr_matrix_obj_2005$cor, 3)

dst_2005 <- sim2diss(cor_matrix_2005, method = "corr", to.dist = TRUE)
map_result_2005 <- mds(delta = dst_2005, ndim = 2, type = "ordinal")
Stress_result_2005 <- round(map_result_2005$stress, 3)

Total_Weighted_N_2005 <- sum(df_2005$weight)
Total_Unweighted_N_2005 <- nrow(df_2005)

mds_coords_2005 <- as.data.frame(map_result_2005$conf)
colnames(mds_coords_2005) <- c("Вимір 1", "Вимір 2")
mds_coords_2005$label <- rownames(map_result_2005$conf)

plot_title_2005 <- paste0("2005 (Stress: ", Stress_result_2005,
                          ", Зважене N: ", round(Total_Weighted_N_2005), ")")

ggplot(mds_coords_2005, aes(x = `Вимір 1`, y = `Вимір 2`, label = label)) +
  geom_point(color = "blue", size = 2.5) +
  geom_text_repel(size = 3.0, segment.color = "grey50", box.padding = 0.35) +
  ggtitle(plot_title_2005) +
  xlab("Вимір 1 ") +
  ylab("Вимір 2") +
  theme_minimal(base_size = 12) +
  theme(plot.title = element_text(hjust = 0.5)) +
  coord_fixed(ratio = 1, xlim = c(-1.5, 1.5), ylim = c(-1.5, 1.5))

# Рік: 2006
df_2006 <- subset(df_cleaned, year == 2006)

weighted_corr_matrix_obj_2006 <- cov.wt(df_2006[1:13],
                                        wt = df_2006$weight,
                                        cor = TRUE)
cor_matrix_2006 <- round(weighted_corr_matrix_obj_2006$cor, 3)

dst_2006 <- sim2diss(cor_matrix_2006, method = "corr", to.dist = TRUE)
map_result_2006 <- mds(delta = dst_2006, ndim = 2, type = "ordinal")
Stress_result_2006 <- round(map_result_2006$stress, 3)

Total_Weighted_N_2006 <- sum(df_2006$weight)
Total_Unweighted_N_2006 <- nrow(df_2006)

mds_coords_2006 <- as.data.frame(map_result_2006$conf)
colnames(mds_coords_2006) <- c("Вимір 1", "Вимір 2")
mds_coords_2006$label <- rownames(map_result_2006$conf)

plot_title_2006 <- paste0("2006 (Stress: ", Stress_result_2006,
                          ", Зважене N: ", round(Total_Weighted_N_2006), ")")

ggplot(mds_coords_2006, aes(x = `Вимір 1`, y = `Вимір 2`, label = label)) +
  geom_point(color = "blue", size = 2.5) +
  geom_text_repel(size = 3.0, segment.color = "grey50", box.padding = 0.35) +
  ggtitle(plot_title_2006) +
  xlab("Вимір 1 ") +
  ylab("Вимір 2") +
  theme_minimal(base_size = 12) +
  theme(plot.title = element_text(hjust = 0.5)) +
  coord_fixed(ratio = 1, xlim = c(-1.5, 1.5), ylim = c(-1.5, 1.5))

# Рік: 2007
df_2007 <- subset(df_cleaned, year == 2007)

weighted_corr_matrix_obj_2007 <- cov.wt(df_2007[1:13],
                                        wt = df_2007$weight,
                                        cor = TRUE)
cor_matrix_2007 <- round(weighted_corr_matrix_obj_2007$cor, 3)

dst_2007 <- sim2diss(cor_matrix_2007, method = "corr", to.dist = TRUE)
map_result_2007 <- mds(delta = dst_2007, ndim = 2, type = "ordinal")
Stress_result_2007 <- round(map_result_2007$stress, 3)

Total_Weighted_N_2007 <- sum(df_2007$weight)
Total_Unweighted_N_2007 <- nrow(df_2007)

mds_coords_2007 <- as.data.frame(map_result_2007$conf)
colnames(mds_coords_2007) <- c("Вимір 1", "Вимір 2")
mds_coords_2007$label <- rownames(map_result_2007$conf)

plot_title_2007 <- paste0("2007 (Stress: ", Stress_result_2007,
                          ", Зважене N: ", round(Total_Weighted_N_2007), ")")

ggplot(mds_coords_2007, aes(x = `Вимір 1`, y = `Вимір 2`, label = label)) +
  geom_point(color = "blue", size = 2.5) +
  geom_text_repel(size = 3.0, segment.color = "grey50", box.padding = 0.35) +
  ggtitle(plot_title_2007) +
  xlab("Вимір 1 ") +
  ylab("Вимір 2") +
  theme_minimal(base_size = 12) +
  theme(plot.title = element_text(hjust = 0.5)) +
  coord_fixed(ratio = 1, xlim = c(-1.5, 1.5), ylim = c(-1.5, 1.5))

# Рік: 2008
df_2008 <- subset(df_cleaned, year == 2008)

weighted_corr_matrix_obj_2008 <- cov.wt(df_2008[1:13],
                                        wt = df_2008$weight,
                                        cor = TRUE)
cor_matrix_2008 <- round(weighted_corr_matrix_obj_2008$cor, 3)

dst_2008 <- sim2diss(cor_matrix_2008, method = "corr", to.dist = TRUE)
map_result_2008 <- mds(delta = dst_2008, ndim = 2, type = "ordinal")
Stress_result_2008 <- round(map_result_2008$stress, 3)

Total_Weighted_N_2008 <- sum(df_2008$weight)
Total_Unweighted_N_2008 <- nrow(df_2008)

mds_coords_2008 <- as.data.frame(map_result_2008$conf)
colnames(mds_coords_2008) <- c("Вимір 1", "Вимір 2")
mds_coords_2008$label <- rownames(map_result_2008$conf)

plot_title_2008 <- paste0("2008 (Stress: ", Stress_result_2008,
                          ", Зважене N: ", round(Total_Weighted_N_2008), ")")

ggplot(mds_coords_2008, aes(x = `Вимір 1`, y = `Вимір 2`, label = label)) +
  geom_point(color = "blue", size = 2.5) +
  geom_text_repel(size = 3.0, segment.color = "grey50", box.padding = 0.35) +
  ggtitle(plot_title_2008) +
  xlab("Вимір 1 ") +
  ylab("Вимір 2") +
  theme_minimal(base_size = 12) +
  theme(plot.title = element_text(hjust = 0.5)) +
  coord_fixed(ratio = 1, xlim = c(-1.5, 1.5), ylim = c(-1.5, 1.5))

# Рік: 2009
df_2009 <- subset(df_cleaned, year == 2009)

weighted_corr_matrix_obj_2009 <- cov.wt(df_2009[1:13],
                                        wt = df_2009$weight,
                                        cor = TRUE)
cor_matrix_2009 <- round(weighted_corr_matrix_obj_2009$cor, 3)

dst_2009 <- sim2diss(cor_matrix_2009, method = "corr", to.dist = TRUE)
map_result_2009 <- mds(delta = dst_2009, ndim = 2, type = "ordinal")
Stress_result_2009 <- round(map_result_2009$stress, 3)

Total_Weighted_N_2009 <- sum(df_2009$weight)
Total_Unweighted_N_2009 <- nrow(df_2009)

mds_coords_2009 <- as.data.frame(map_result_2009$conf)
colnames(mds_coords_2009) <- c("Вимір 1", "Вимір 2")
mds_coords_2009$label <- rownames(map_result_2009$conf)

plot_title_2009 <- paste0("2009 (Stress: ", Stress_result_2009,
                          ", Зважене N: ", round(Total_Weighted_N_2009), ")")

ggplot(mds_coords_2009, aes(x = `Вимір 1`, y = `Вимір 2`, label = label)) +
  geom_point(color = "blue", size = 2.5) +
  geom_text_repel(size = 3.0, segment.color = "grey50", box.padding = 0.35) +
  ggtitle(plot_title_2009) +
  xlab("Вимір 1 ") +
  ylab("Вимір 2") +
  theme_minimal(base_size = 12) +
  theme(plot.title = element_text(hjust = 0.5)) +
  coord_fixed(ratio = 1, xlim = c(-1.5, 1.5), ylim = c(-1.5, 1.5))

# Рік: 2010
df_2010 <- subset(df_cleaned, year == 2010)

weighted_corr_matrix_obj_2010 <- cov.wt(df_2010[1:13],
                                        wt = df_2010$weight,
                                        cor = TRUE)
cor_matrix_2010 <- round(weighted_corr_matrix_obj_2010$cor, 3)

dst_2010 <- sim2diss(cor_matrix_2010, method = "corr", to.dist = TRUE)
map_result_2010 <- mds(delta = dst_2010, ndim = 2, type = "ordinal")
Stress_result_2010 <- round(map_result_2010$stress, 3)

Total_Weighted_N_2010 <- sum(df_2010$weight)
Total_Unweighted_N_2010 <- nrow(df_2010)

mds_coords_2010 <- as.data.frame(map_result_2010$conf)
colnames(mds_coords_2010) <- c("Вимір 1", "Вимір 2")
mds_coords_2010$label <- rownames(map_result_2010$conf)

plot_title_2010 <- paste0("2010 (Stress: ", Stress_result_2010,
                          ", Зважене N: ", round(Total_Weighted_N_2010), ")")

ggplot(mds_coords_2010, aes(x = `Вимір 1`, y = `Вимір 2`, label = label)) +
  geom_point(color = "blue", size = 2.5) +
  geom_text_repel(size = 3.0, segment.color = "grey50", box.padding = 0.35) +
  ggtitle(plot_title_2010) +
  xlab("Вимір 1 ") +
  ylab("Вимір 2") +
  theme_minimal(base_size = 12) +
  theme(plot.title = element_text(hjust = 0.5)) +
  coord_fixed(ratio = 1, xlim = c(-1.5, 1.5), ylim = c(-1.5, 1.5))

# Рік: 2011
df_2011 <- subset(df_cleaned, year == 2011)

weighted_corr_matrix_obj_2011 <- cov.wt(df_2011[1:13],
                                        wt = df_2011$weight,
                                        cor = TRUE)
cor_matrix_2011 <- round(weighted_corr_matrix_obj_2011$cor, 3)

dst_2011 <- sim2diss(cor_matrix_2011, method = "corr", to.dist = TRUE)
map_result_2011 <- mds(delta = dst_2011, ndim = 2, type = "ordinal")
Stress_result_2011 <- round(map_result_2011$stress, 3)

Total_Weighted_N_2011 <- sum(df_2011$weight)
Total_Unweighted_N_2011 <- nrow(df_2011)

mds_coords_2011 <- as.data.frame(map_result_2011$conf)
colnames(mds_coords_2011) <- c("Вимір 1", "Вимір 2")
mds_coords_2011$label <- rownames(map_result_2011$conf)

plot_title_2011 <- paste0("2011 (Stress: ", Stress_result_2011,
                          ", Зважене N: ", round(Total_Weighted_N_2011), ")")

ggplot(mds_coords_2011, aes(x = `Вимір 1`, y = `Вимір 2`, label = label)) +
  geom_point(color = "blue", size = 2.5) +
  geom_text_repel(size = 3.0, segment.color = "grey50", box.padding = 0.35) +
  ggtitle(plot_title_2011) +
  xlab("Вимір 1 ") +
  ylab("Вимір 2") +
  theme_minimal(base_size = 12) +
  theme(plot.title = element_text(hjust = 0.5)) +
  coord_fixed(ratio = 1, xlim = c(-1.5, 1.5), ylim = c(-1.5, 1.5))

# Рік: 2012
df_2012 <- subset(df_cleaned, year == 2012)

weighted_corr_matrix_obj_2012 <- cov.wt(df_2012[1:13],
                                        wt = df_2012$weight,
                                        cor = TRUE)
cor_matrix_2012 <- round(weighted_corr_matrix_obj_2012$cor, 3)

dst_2012 <- sim2diss(cor_matrix_2012, method = "corr", to.dist = TRUE)
map_result_2012 <- mds(delta = dst_2012, ndim = 2, type = "ordinal")
Stress_result_2012 <- round(map_result_2012$stress, 3)

Total_Weighted_N_2012 <- sum(df_2012$weight)
Total_Unweighted_N_2012 <- nrow(df_2012)

mds_coords_2012 <- as.data.frame(map_result_2012$conf)
colnames(mds_coords_2012) <- c("Вимір 1", "Вимір 2")
mds_coords_2012$label <- rownames(map_result_2012$conf)

plot_title_2012 <- paste0("2012 (Stress: ", Stress_result_2012,
                          ", Зважене N: ", round(Total_Weighted_N_2012), ")")

ggplot(mds_coords_2012, aes(x = `Вимір 1`, y = `Вимір 2`, label = label)) +
  geom_point(color = "blue", size = 2.5) +
  geom_text_repel(size = 3.0, segment.color = "grey50", box.padding = 0.35) +
  ggtitle(plot_title_2012) +
  xlab("Вимір 1 ") +
  ylab("Вимір 2") +
  theme_minimal(base_size = 12) +
  theme(plot.title = element_text(hjust = 0.5)) +
  coord_fixed(ratio = 1, xlim = c(-1.5, 1.5), ylim = c(-1.5, 1.5))

# Рік: 2013
df_2013 <- subset(df_cleaned, year == 2013)

weighted_corr_matrix_obj_2013 <- cov.wt(df_2013[1:13],
                                        wt = df_2013$weight,
                                        cor = TRUE)
cor_matrix_2013 <- round(weighted_corr_matrix_obj_2013$cor, 3)

dst_2013 <- sim2diss(cor_matrix_2013, method = "corr", to.dist = TRUE)
map_result_2013 <- mds(delta = dst_2013, ndim = 2, type = "ordinal")
Stress_result_2013 <- round(map_result_2013$stress, 3)

Total_Weighted_N_2013 <- sum(df_2013$weight)
Total_Unweighted_N_2013 <- nrow(df_2013)

mds_coords_2013 <- as.data.frame(map_result_2013$conf)
colnames(mds_coords_2013) <- c("Вимір 1", "Вимір 2")
mds_coords_2013$label <- rownames(map_result_2013$conf)

plot_title_2013 <- paste0("2013 (Stress: ", Stress_result_2013,
                          ", Зважене N: ", round(Total_Weighted_N_2013), ")")

ggplot(mds_coords_2013, aes(x = `Вимір 1`, y = `Вимір 2`, label = label)) +
  geom_point(color = "blue", size = 2.5) +
  geom_text_repel(size = 3.0, segment.color = "grey50", box.padding = 0.35) +
  ggtitle(plot_title_2013) +
  xlab("Вимір 1 ") +
  ylab("Вимір 2") +
  theme_minimal(base_size = 12) +
  theme(plot.title = element_text(hjust = 0.5)) +
  coord_fixed(ratio = 1, xlim = c(-1.5, 1.5), ylim = c(-1.5, 1.5))

# Рік: 2014
df_2014 <- subset(df_cleaned, year == 2014)

weighted_corr_matrix_obj_2014 <- cov.wt(df_2014[1:13],
                                        wt = df_2014$weight,
                                        cor = TRUE)
cor_matrix_2014 <- round(weighted_corr_matrix_obj_2014$cor, 3)

dst_2014 <- sim2diss(cor_matrix_2014, method = "corr", to.dist = TRUE)
map_result_2014 <- mds(delta = dst_2014, ndim = 2, type = "ordinal")
Stress_result_2014 <- round(map_result_2014$stress, 3)

Total_Weighted_N_2014 <- sum(df_2014$weight)
Total_Unweighted_N_2014 <- nrow(df_2014)

mds_coords_2014 <- as.data.frame(map_result_2014$conf)
colnames(mds_coords_2014) <- c("Вимір 1", "Вимір 2")
mds_coords_2014$label <- rownames(map_result_2014$conf)

plot_title_2014 <- paste0("2014 (Stress: ", Stress_result_2014,
                          ", Зважене N: ", round(Total_Weighted_N_2014), ")")

ggplot(mds_coords_2014, aes(x = `Вимір 1`, y = `Вимір 2`, label = label)) +
  geom_point(color = "blue", size = 2.5) +
  geom_text_repel(size = 3.0, segment.color = "grey50", box.padding = 0.35) +
  ggtitle(plot_title_2014) +
  xlab("Вимір 1 ") +
  ylab("Вимір 2") +
  theme_minimal(base_size = 12) +
  theme(plot.title = element_text(hjust = 0.5)) +
  coord_fixed(ratio = 1, xlim = c(-1.5, 1.5), ylim = c(-1.5, 1.5))

# Рік: 2015
df_2015 <- subset(df_cleaned, year == 2015)

weighted_corr_matrix_obj_2015 <- cov.wt(df_2015[1:13],
                                        wt = df_2015$weight,
                                        cor = TRUE)
cor_matrix_2015 <- round(weighted_corr_matrix_obj_2015$cor, 3)

dst_2015 <- sim2diss(cor_matrix_2015, method = "corr", to.dist = TRUE)
map_result_2015 <- mds(delta = dst_2015, ndim = 2, type = "ordinal")
Stress_result_2015 <- round(map_result_2015$stress, 3)

Total_Weighted_N_2015 <- sum(df_2015$weight)
Total_Unweighted_N_2015 <- nrow(df_2015)

mds_coords_2015 <- as.data.frame(map_result_2015$conf)
colnames(mds_coords_2015) <- c("Вимір 1", "Вимір 2")
mds_coords_2015$label <- rownames(map_result_2015$conf)

plot_title_2015 <- paste0("2015 (Stress: ", Stress_result_2015,
                          ", Зважене N: ", round(Total_Weighted_N_2015), ")")

ggplot(mds_coords_2015, aes(x = `Вимір 1`, y = `Вимір 2`, label = label)) +
  geom_point(color = "blue", size = 2.5) +
  geom_text_repel(size = 3.0, segment.color = "grey50", box.padding = 0.35) +
  ggtitle(plot_title_2015) +
  xlab("Вимір 1 ") +
  ylab("Вимір 2") +
  theme_minimal(base_size = 12) +
  theme(plot.title = element_text(hjust = 0.5)) +
  coord_fixed(ratio = 1, xlim = c(-1.5, 1.5), ylim = c(-1.5, 1.5))

# Рік: 2016
df_2016 <- subset(df_cleaned, year == 2016)

weighted_corr_matrix_obj_2016 <- cov.wt(df_2016[1:13],
                                        wt = df_2016$weight,
                                        cor = TRUE)
cor_matrix_2016 <- round(weighted_corr_matrix_obj_2016$cor, 3)

dst_2016 <- sim2diss(cor_matrix_2016, method = "corr", to.dist = TRUE)
map_result_2016 <- mds(delta = dst_2016, ndim = 2, type = "ordinal")
Stress_result_2016 <- round(map_result_2016$stress, 3)

Total_Weighted_N_2016 <- sum(df_2016$weight)
Total_Unweighted_N_2016 <- nrow(df_2016)

mds_coords_2016 <- as.data.frame(map_result_2016$conf)
colnames(mds_coords_2016) <- c("Вимір 1", "Вимір 2")
mds_coords_2016$label <- rownames(map_result_2016$conf)

plot_title_2016 <- paste0("2016 (Stress: ", Stress_result_2016,
                          ", Зважене N: ", round(Total_Weighted_N_2016), ")")

ggplot(mds_coords_2016, aes(x = `Вимір 1`, y = `Вимір 2`, label = label)) +
  geom_point(color = "blue", size = 2.5) +
  geom_text_repel(size = 3.0, segment.color = "grey50", box.padding = 0.35) +
  ggtitle(plot_title_2016) +
  xlab("Вимір 1 ") +
  ylab("Вимір 2") +
  theme_minimal(base_size = 12) +
  theme(plot.title = element_text(hjust = 0.5)) +
  coord_fixed(ratio = 1, xlim = c(-1.5, 1.5), ylim = c(-1.5, 1.5))

# Рік: 2017
df_2017 <- subset(df_cleaned, year == 2017)

weighted_corr_matrix_obj_2017 <- cov.wt(df_2017[1:13],
                                        wt = df_2017$weight,
                                        cor = TRUE)
cor_matrix_2017 <- round(weighted_corr_matrix_obj_2017$cor, 3)

dst_2017 <- sim2diss(cor_matrix_2017, method = "corr", to.dist = TRUE)
map_result_2017 <- mds(delta = dst_2017, ndim = 2, type = "ordinal")
Stress_result_2017 <- round(map_result_2017$stress, 3)

Total_Weighted_N_2017 <- sum(df_2017$weight)
Total_Unweighted_N_2017 <- nrow(df_2017)

mds_coords_2017 <- as.data.frame(map_result_2017$conf)
colnames(mds_coords_2017) <- c("Вимір 1", "Вимір 2")
mds_coords_2017$label <- rownames(map_result_2017$conf)

plot_title_2017 <- paste0("2017 (Stress: ", Stress_result_2017,
                          ", Зважене N: ", round(Total_Weighted_N_2017), ")")

ggplot(mds_coords_2017, aes(x = `Вимір 1`, y = `Вимір 2`, label = label)) +
  geom_point(color = "blue", size = 2.5) +
  geom_text_repel(size = 3.0, segment.color = "grey50", box.padding = 0.35) +
  ggtitle(plot_title_2017) +
  xlab("Вимір 1 ") +
  ylab("Вимір 2") +
  theme_minimal(base_size = 12) +
  theme(plot.title = element_text(hjust = 0.5)) +
  coord_fixed(ratio = 1, xlim = c(-1.5, 1.5), ylim = c(-1.5, 1.5))

# Рік: 2018
df_2018 <- subset(df_cleaned, year == 2018)

weighted_corr_matrix_obj_2018 <- cov.wt(df_2018[1:13],
                                        wt = df_2018$weight,
                                        cor = TRUE)
cor_matrix_2018 <- round(weighted_corr_matrix_obj_2018$cor, 3)

dst_2018 <- sim2diss(cor_matrix_2018, method = "corr", to.dist = TRUE)
map_result_2018 <- mds(delta = dst_2018, ndim = 2, type = "ordinal")
Stress_result_2018 <- round(map_result_2018$stress, 3)

Total_Weighted_N_2018 <- sum(df_2018$weight)
Total_Unweighted_N_2018 <- nrow(df_2018)

mds_coords_2018 <- as.data.frame(map_result_2018$conf)
colnames(mds_coords_2018) <- c("Вимір 1", "Вимір 2")
mds_coords_2018$label <- rownames(map_result_2018$conf)

plot_title_2018 <- paste0("2018 (Stress: ", Stress_result_2018,
                          ", Зважене N: ", round(Total_Weighted_N_2018), ")")

ggplot(mds_coords_2018, aes(x = `Вимір 1`, y = `Вимір 2`, label = label)) +
  geom_point(color = "blue", size = 2.5) +
  geom_text_repel(size = 3.0, segment.color = "grey50", box.padding = 0.35) +
  ggtitle(plot_title_2018) +
  xlab("Вимір 1 ") +
  ylab("Вимір 2") +
  theme_minimal(base_size = 12) +
  theme(plot.title = element_text(hjust = 0.5)) +
  coord_fixed(ratio = 1, xlim = c(-1.5, 1.5), ylim = c(-1.5, 1.5))

# Рік: 2019
df_2019 <- subset(df_cleaned, year == 2019)

weighted_corr_matrix_obj_2019 <- cov.wt(df_2019[1:13],
                                        wt = df_2019$weight,
                                        cor = TRUE)
cor_matrix_2019 <- round(weighted_corr_matrix_obj_2019$cor, 3)

dst_2019 <- sim2diss(cor_matrix_2019, method = "corr", to.dist = TRUE)
map_result_2019 <- mds(delta = dst_2019, ndim = 2, type = "ordinal")
Stress_result_2019 <- round(map_result_2019$stress, 3)

Total_Weighted_N_2019 <- sum(df_2019$weight)
Total_Unweighted_N_2019 <- nrow(df_2019)

mds_coords_2019 <- as.data.frame(map_result_2019$conf)
colnames(mds_coords_2019) <- c("Вимір 1", "Вимір 2")
mds_coords_2019$label <- rownames(map_result_2019$conf)

plot_title_2019 <- paste0("2019 (Stress: ", Stress_result_2019,
                          ", Зважене N: ", round(Total_Weighted_N_2019), ")")

ggplot(mds_coords_2019, aes(x = `Вимір 1`, y = `Вимір 2`, label = label)) +
  geom_point(color = "blue", size = 2.5) +
  geom_text_repel(size = 3.0, segment.color = "grey50", box.padding = 0.35) +
  ggtitle(plot_title_2019) +
  xlab("Вимір 1 ") +
  ylab("Вимір 2") +
  theme_minimal(base_size = 12) +
  theme(plot.title = element_text(hjust = 0.5)) +
  coord_fixed(ratio = 1, xlim = c(-1.5, 1.5), ylim = c(-1.5, 1.5))

# Рік: 2021
df_2021 <- subset(df_cleaned, year == 2021)

weighted_corr_matrix_obj_2021 <- cov.wt(df_2021[1:13],
                                        wt = df_2021$weight,
                                        cor = TRUE)
cor_matrix_2021 <- round(weighted_corr_matrix_obj_2021$cor, 3)

dst_2021 <- sim2diss(cor_matrix_2021, method = "corr", to.dist = TRUE)
map_result_2021 <- mds(delta = dst_2021, ndim = 2, type = "ordinal")
Stress_result_2021 <- round(map_result_2021$stress, 3)

Total_Weighted_N_2021 <- sum(df_2021$weight)
Total_Unweighted_N_2021 <- nrow(df_2021)

mds_coords_2021 <- as.data.frame(map_result_2021$conf)
colnames(mds_coords_2021) <- c("Вимір 1", "Вимір 2")
mds_coords_2021$label <- rownames(map_result_2021$conf)

plot_title_2021 <- paste0("2021 (Stress: ", Stress_result_2021,
                          ", Зважене N: ", round(Total_Weighted_N_2021), ")")

ggplot(mds_coords_2021, aes(x = `Вимір 1`, y = `Вимір 2`, label = label)) +
  geom_point(color = "blue", size = 2.5) +
  geom_text_repel(size = 3.0, segment.color = "grey50", box.padding = 0.35) +
  ggtitle(plot_title_2021) +
  xlab("Вимір 1 ") +
  ylab("Вимір 2") +
  theme_minimal(base_size = 12) +
  theme(plot.title = element_text(hjust = 0.5)) +
  coord_fixed(ratio = 1, xlim = c(-1.5, 1.5), ylim = c(-1.5, 1.5))

# 2. Створюємо вектор з назвами років (і "Загальна вибірка")
роки_або_вибірка <- c(
  "1994", "1995", "1996", "1997", "1998", "1999",
  "2000", "2001", "2002", "2003", "2004", "2005",
  "2006", "2007", "2008", "2009", "2010", "2011",
  "2012", "2013", "2014", "2015", "2016", "2017",
  "2018", "2019", "2021", # 2020 пропущено
  "Загальна вибірка"
)

# 3. Створюємо вектор зі значеннями стресу
# ВАЖЛИВО: переконайтеся, що ці змінні існують у вашому середовищі!
значення_стресу <- c(
  Stress_result_1994, Stress_result_1995, Stress_result_1996,
  Stress_result_1997, Stress_result_1998, Stress_result_1999,
  Stress_result_2000, Stress_result_2001, Stress_result_2002,
  Stress_result_2003, Stress_result_2004, Stress_result_2005,
  Stress_result_2006, Stress_result_2007, Stress_result_2008,
  Stress_result_2009, Stress_result_2010, Stress_result_2011,
  Stress_result_2012, Stress_result_2013, Stress_result_2014,
  Stress_result_2015, Stress_result_2016, Stress_result_2017,
  Stress_result_2018, Stress_result_2019, Stress_result_2021,
  Stress_result # Використовуємо Stress_result_total для загальної вибірки
)

# 4. Створюємо датафрейм (таблицю)
таблиця_стресів <- data.frame(
  Рік = роки_або_вибірка,
  Стрес = значення_стресу
)

# 5. Виводимо красиву таблицю за допомогою kable()
kable(таблиця_стресів,
      caption = "Значення стресу за роками та для загальної вибірки",
      col.names = c("Рік / Вибірка", "Значення стресу"),
      align = c('l', 'c') # Вирівнювання: лівий для першої колонки, центр для другої
)
Значення стресу за роками та для загальної вибірки
Рік / Вибірка Значення стресу
1994 0.032
1995 0.037
1996 0.035
1997 0.025
1998 0.030
1999 0.033
2000 0.058
2001 0.060
2002 0.047
2003 0.066
2004 0.047
2005 0.062
2006 0.055
2007 0.065
2008 0.040
2009 0.048
2010 0.067
2011 0.048
2012 0.055
2013 0.060
2014 0.056
2015 0.054
2016 0.057
2017 0.056
2018 0.063
2019 0.042
2021 0.079
Загальна вибірка 0.049

5 Енічні групи, включені до аналізу в 2022 та 2023 роках

# Фільтруємо дані лише на 2022 та 2023 роки
data <- X1 %>%
  filter(year %in% c(2022, 2023))

# Список необхідних змінних для вибірки
required_vars <- c(
  "score_americans", 
  "score_africans", 
  "score_canadians", 
  "score_germans", 
  "score_poles", 
  "score_romani",
  "score_romanians", 
  "score_ukrainians_rus", 
  "score_ukrainians_ukr",  
  "score_french",
  "score_russians_ukr_rus",  
  "score_belarus_ukr_bel",
  "year", 
  "weight"
)

# Залишаємо лише ті змінні, які реально є у data
available_vars <- intersect(required_vars, names(data))
data_scores <- data %>% select(all_of(available_vars))

# Видаляємо рядки з пропущеними значеннями
df_2022_2023 <- na.omit(data_scores)

# Перейменовуємо змінні: видаляємо префікс "score_"
old_score_names <- grep("^score_", names(df_2022_2023), value = TRUE)
new_score_names <- sub("^score_", "", old_score_names)

df_2022_2023 <- df_2022_2023 %>%
  rename(!!!setNames(old_score_names, new_score_names))

# Зберігаємо імена змінних для аналізу (без year та weight)
social_distance_vars_selected <- setdiff(names(df_2022_2023), c("year", "weight"))
# Перевірка, чи df_2022_2023 не порожній після na.omit
if (nrow(df_2022_2023) == 0) {
  warning("Після видалення NA (na.omit) датафрейм df_2022_2023 порожній. Формулювання не будуть виведені.")
  # Якщо датафрейм порожній, немає сенсу продовжувати з перейменуванням і виведенням атрибутів
  social_distance_vars_selected <- character(0) # Порожній вектор
} else {
  # Перейменовуємо змінні: видаляємо префікс "score_"
  old_score_names <- grep("^score_", names(df_2022_2023), value = TRUE)
  new_score_names <- sub("^score_", "", old_score_names)
  
  if (length(old_score_names) > 0) {
    df_2022_2023 <- df_2022_2023 %>%
      rename(!!!setNames(old_score_names, new_score_names))
  }
  
  # Зберігаємо імена змінних для аналізу (без year та weight)
  social_distance_vars_selected <- setdiff(names(df_2022_2023), c("year", "weight"))
}
# --- Кінець вашого коду для створення df_2022_2023 ---


# --- Виведення формулювань (атрибутів 'label') ---
cat("\nФормулювання запитань для змінних у df_2022_2023:\n\n")
## 
## Формулювання запитань для змінних у df_2022_2023:
if (length(social_distance_vars_selected) > 0 && nrow(df_2022_2023) > 0) {
  for (var_name in social_distance_vars_selected) {
    # Перевіряємо, чи існує такий стовпець у df_2022_2023
    # (має існувати, оскільки social_distance_vars_selected формується з names(df_2022_2023))
    if (var_name %in% names(df_2022_2023)) {
      question_label <- attr(df_2022_2023[[var_name]], "label")
      
      if (!is.null(question_label)) {
        cat(paste0("Змінна (у df_2022_2023): ", var_name, "\n"))
        cat(paste0("Формулювання: ", question_label, "\n\n"))
      } else {
        cat(paste0("Змінна (у df_2022_2023): ", var_name, "\n"))
        cat("Формулювання: [Атрибут 'label' відсутній або NULL]\n\n")
      }
    }
  }
} else if (nrow(df_2022_2023) == 0) {
    cat("Датафрейм df_2022_2023 порожній, формулювання не можуть бути виведені.\n")
} else {
  cat("Список 'social_distance_vars_selected' порожній. Немає змінних для виведення формулювань.\n")
  cat("Перевірте, чи були успішно перейменовані змінні та чи є вони у df_2022_2023 крім 'year' та 'weight'.\n")
}
## Змінна (у df_2022_2023): americans
## Формулювання: Шкала Богардуса (мінімальний бал). Американці
## 
## Змінна (у df_2022_2023): africans
## Формулювання: Шкала Богардуса (мінімальний бал). Африканці
## 
## Змінна (у df_2022_2023): canadians
## Формулювання: Шкала Богардуса (мінімальний бал). Канадці
## 
## Змінна (у df_2022_2023): germans
## Формулювання: Шкала Богардуса (мінімальний бал). Німці
## 
## Змінна (у df_2022_2023): poles
## Формулювання: Шкала Богардуса (мінімальний бал). Поляки
## 
## Змінна (у df_2022_2023): romani
## Формулювання: Шкала Богардуса (мінімальний бал). Роми (цигани)
## 
## Змінна (у df_2022_2023): romanians
## Формулювання: Шкала Богардуса (мінімальний бал). Румуни
## 
## Змінна (у df_2022_2023): ukrainians_rus
## Формулювання: Шкала Богардуса (мінімальний бал). Російськомовні українці
## 
## Змінна (у df_2022_2023): ukrainians_ukr
## Формулювання: Шкала Богардуса (мінімальний бал). Українськомовні українці
## 
## Змінна (у df_2022_2023): french
## Формулювання: Шкала Богардуса (мінімальний бал). Французи
## 
## Змінна (у df_2022_2023): russians_ukr_rus
## Формулювання: Росіяни - жителі України / росії - середнє (обчисленe значення)
## 
## Змінна (у df_2022_2023): belarus_ukr_bel
## Формулювання: Білоруси - жителі України / білорусі - середнє (обчисленe значення)

6 Середні значення змінних за роками (2022-2023)

Аналізуючи дані за 2022 та 2023 роки, спстерігаємо, що найменша соціальна дистанція: Стабільно спостерігається до українськомовних українців, і ця дистанція ще скоротилася у 2023 році (з 2.2 до 2.0). Це очікувано і свідчить про високий рівень внутрішньогрупової солідарності.
Соціальна дистанція до російськомовних українців дещо зросла (з 2.7 до 3.0). Це може бути пов’язано з посиленням ролі української мови як маркера ідентичності та патріотизму в умовах війни, а також, можливо, з певною настороженістю чи переоцінкою ставлення до російськомовності як такої. Тим не менш, вони залишаються однією з найближчих груп.
Групи з найбільшою соціальною дистанцією: росіяни мають стабільно найвищий показник соціальної дистанції (5.7), що не змінився. Це прямий наслідок російської агресії. За ними йдуть роми, білоруси та африканці. Однак, до ромів, білорусів та африканців дистанція у 2023 дещо скоротилася.
Спостерігається значне скорочення соціальної дистанції до представників західних країн – німців, американців, французів, канадців. Це, ймовірно, відображає вдячність та посилення симпатій до країн, які надають Україні значну підтримку у війні. Також скоротилася дистанція до поляків та румунів, що є сусідніми країнами, які активно допомагають.
Попри роль Білорусі у війні як плацдарму для російських військ, соціальна дистанція до білорусів дещо скоротилася (з 4.9 до 4.7). До ромів та африканців дистанція також скоротилася, хоча й залишається відносно високою. Це може свідчити про загальне пом’якшення ксенофобських настроїв або про те, що на тлі війни з Росією інші “чужі” стали сприйматися менш негативно.

summary_stats_weighted_mean_2022_2023 <- df_2022_2023 %>%
  group_by(year) %>%
  summarise(
    across(
      .cols = all_of(social_distance_vars_selected), # ВИПРАВЛЕНО: Використовуємо визначену змінну
      .fns = list(
        w_mean = ~ Hmisc::wtd.mean(.x, weights = weight, na.rm = TRUE) 
        # na.rm = TRUE тут для .x, але na.omit вище вже видалив рядки з NA в weight
      ),
      .names = "{.col}" # Залишаємо імена стовпців без змін (напр. score_americans)
    ),
    .groups = "drop" # Рекомендовано додавати .groups = "drop"
  ) %>%
  arrange(year) %>% 
  mutate(across(where(is.numeric) & !matches("^year$"), ~round(., 1))) # Округлюємо лише числові, крім року


summary_stats_weighted_mean_2022_2023 %>%
  kbl() %>%
  kable_paper("hover", full_width = F)
year americans africans canadians germans poles romani romanians ukrainians_rus ukrainians_ukr french russians_ukr_rus belarus_ukr_bel
2022 3.7 4.8 3.5 4.1 3.0 5.1 4.5 2.7 2.2 4.0 5.7 4.9
2023 3.1 4.7 3.0 3.3 2.9 4.7 4.2 3.0 2.0 3.4 5.7 4.7

7 MDS за 2022 та 2023 роки

# Вибираємо підмножину для 2022 року
df_2022 <- subset(df_2022_2023, year == 2022)

# Обчислюємо зважену кореляційну матрицю
weighted_corr_matrix_2022 <- cov.wt(df_2022[1:12], wt = df_2022$weight, cor = TRUE)
cor_matrix_2022 <- round(weighted_corr_matrix_2022$cor, 3)

# Перетворюємо кореляційну матрицю на матрицю відстаней
dst_2022 <- sim2diss(cor_matrix_2022, method = "corr", to.dist = TRUE)

# Багатовимірне шкалювання (MDS)
map_result_2022 <- mds(delta = dst_2022, ndim = 2, type = "ordinal")
Stress_result_2022 <- round(map_result_2022$stress, 3)

# Рахуємо N
Total_Weighted_N_2022 <- sum(df_2022$weight)
Total_Unweighted_N_2022 <- nrow(df_2022)

# Координати для побудови графіка
mds_coords_2022 <- as.data.frame(map_result_2022$conf)
# **КЛЮЧОВЕ ВИПРАВЛЕННЯ:** Використовуйте прості імена стовпців для ggplot
colnames(mds_coords_2022) <- c("Dim1", "Dim2") # Наприклад, "Dim1", "Dim2"
mds_coords_2022$label <- rownames(map_result_2022$conf) # Це будуть назви ваших "Показник_X"

# Назва графіка
plot_title_2022 <- paste0("2022 (Stress: ", Stress_result_2022,
                          ", Зважене N: ", round(Total_Weighted_N_2022), ")")

# Побудова графіка
ggplot(mds_coords_2022, aes(x = Dim1, y = Dim2, label = label)) + # Використовуємо Dim1, Dim2
  geom_point(color = "blue", size = 2.5) +
  geom_text_repel(size = 3.0, segment.color = "grey50", box.padding = 0.35) +
  ggtitle(plot_title_2022) +
  xlab("Вимір 1") + # Тут можна використовувати кирилицю для відображення
  ylab("Вимір 2") + # Тут можна використовувати кирилицю для відображення
  theme_minimal(base_size = 12) +
  theme(plot.title = element_text(hjust = 0.5)) +
  coord_fixed(ratio = 1, xlim = c(-1.5, 1.5), ylim = c(-1.5, 1.5))

Stress 0.06 свідчить про дуже добру відповідність моделі даним.

Українці (обидві лінгвістичні групи) розташовані близько один до одного в лівій верхній частини графіка. З огляду на попередні графіки відбувся перехід українців зі “слов’янського” блоку в “эвропейський”.

Росіяни та білоруси знаходяться близько один до одного на правій стороні графіка і максимально віддалені від українських груп та інших європейців. Це візуалізує їхнє сприйняття як відмінного (“ворожого”) блоку.

Зазаначимо, що подані у масиві категорії “росіяни - жителі України / росії - середнє значення” та “білоруси - жителі України / білорусі - середнє значення” можуть приховувати варіативність в середині вибірки.

Центральна група (поляки, німці, канадці, французи, американці) мають схожий рівень соціальної дистанці. При цьому поляки розташовані найближче до українських груп з цієї групи.

Нижня група (периферія) - румуни, африканці, роми характеризуються традиційно високою соціальною дистанцією відносно українців.

# Вибираємо підмножину для 2023 року
df_2023 <- subset(df_2022_2023, year == 2023)

# Обчислюємо зважену кореляційну матрицю
weighted_corr_matrix_2023 <- cov.wt(df_2023[1:12], wt = df_2023$weight, cor = TRUE)
cor_matrix_2023 <- round(weighted_corr_matrix_2023$cor, 3)

# Перетворюємо кореляційну матрицю на матрицю відстаней
dst_2023 <- sim2diss(cor_matrix_2023, method = "corr", to.dist = TRUE)

# Багатовимірне шкалювання (MDS)
map_result_2023 <- mds(delta = dst_2023, ndim = 2, type = "ordinal")
Stress_result_2023 <- round(map_result_2023$stress, 3)

# Рахуємо N
Total_Weighted_N_2023 <- sum(df_2023$weight)
Total_Unweighted_N_2023 <- nrow(df_2023)

# Координати для побудови графіка
mds_coords_2023 <- as.data.frame(map_result_2023$conf)
colnames(mds_coords_2023) <- c("Вимір 1", "Вимір 2")
mds_coords_2023$label <- rownames(map_result_2023$conf)

# Назва графіка
plot_title_2023 <- paste0("2023 (Stress: ", Stress_result_2023,
                          ", Зважене N: ", round(Total_Weighted_N_2023), ")")

# Побудова графіка
ggplot(mds_coords_2023, aes(x = `Вимір 1`, y = `Вимір 2`, label = label)) +
  geom_point(color = "blue", size = 2.5) +
  geom_text_repel(size = 3.0, segment.color = "grey50", box.padding = 0.35) +
  ggtitle(plot_title_2023) +
  xlab("Вимір 1") +
  ylab("Вимір 2") +
  theme_minimal(base_size = 12) +
  theme(plot.title = element_text(hjust = 0.5)) +
  coord_fixed(ratio = 1, xlim = c(-1.5, 1.5), ylim = c(-1.5, 1.5))

Висновки

Упродовж 1994–2021 років в Україні зберігається стійка ієрархія соціальної дистанції до представників різних етнічних груп, яка демонструє як латентні упередження, так і динаміку змін, пов’язану з макросоціальними подіями. Найбільшою соціальною дистанцією стабільно характеризується ставлення до ромів та африканців, що свідчить про стійкість ксенофобських наративів і недостатню інтеграцію цих груп у публічному дискурсі.

Натомість найменшою дистанцією позначено ставлення до українців (як українськомовних, так і російськомовних), поляків і білорусів. Ці результати засвідчують етнічну спорідненість, історико-культурну близькість та, в окремі періоди, спільний зовнішньополітичний вектор.

Значущі зміни спостерігаються у ставленні до росіян: після 2014 року (анексія Криму, початок війни на Донбасі) соціальна дистанція до цієї групи суттєво зросла, що є індикатором політичної переорієнтації українського суспільства. Водночас після Євромайдану спостерігається поступове зниження дистанції до представників західних країн (США, Франція, Німеччина, Канада), що відображає зростаючу ідентифікацію України з європейською спільнотою.

Показовим є приклад зниження соціальної дистанції до євреїв, що може бути зумовлено ширшою трансформацією суспільних норм, зміцненням громадянської (а не етнічної) ідентичності. Курс на європейську інтеграцію і демократичні реформи супроводжувався зростанням уваги до прав людини та недискримінації, що також сприяло зниженню упереджень у суспільстві.

У 2021 році фіксується загальне зниження соціальної дистанції до майже всіх етнічних груп (самі українці, білоруси та росіяни - виключення), що може бути реакцією на пандемічну кризу, глобалізацію загроз і зростаючу соціальну солідарність у кризових умовах.

Аналіз двовимірного простору, отриманого в результаті неметричного багатовимірного шкалювання оцінок соціальної дистанції протягом 1994-2021 року, свідчить про існування двох латентних вимірів, що структурно організовують уявлення українців про етнічні ‘інших’. Перший вимір репрезентує етнокультурну спорідненість, де нації слов’янського походження займають центральні позиції. Другий вимір можна інтерпретувати як шкалу соціальної легітимності та моральної довіри, у межах якої соціально бажані групи, як-от поляки та французи, протиставляються стигматизованим меншинам.

Війна посилила ідентифікацію з українськомовними українцями. Водночас росіяни чітко і стабільно сприймаються як найбільш ворожа та віддалена група. Білоруси сприймаються у схожому ключі, хоча й з меншою інтенсивністю негативу.

Скорочення соціальної дистанції до представників західних країн (США, Канада, Німеччина, Франція) та сусідніх європейських держав (Польща, Румунія) є прямим наслідком їхньої підтримки України. Це свідчить про формування позитивного образу цих націй та посилення геополітичної орієнтації на Захід.

Невелике зростання соціальної дистанції до російськомовних українців є важливим сигналом. Це може відображати складні процеси мовної самоідентифікації, де українська мова набуває все більшого символічного значення як маркер патріотизму та національної єдності. Це не обов’язково означає ворожість, але може вказувати на підвищені очікування щодо мовної поведінки.

Скорочення дистанції до ромів та африканців на тлі війни може бути пов’язане з тим, що головний вектор суспільної напруги та негативу змістився на агресора. Це може створювати умови для більш толерантного ставлення до інших меншин, хоча їхня позиція все ще залишається маргінальною порівняно з європейськими націями.

Порівняно з 1994-2021 роках у 2022-2023 роках змінилася просторова структура соціальних дистанцій. Українці змістилися зі “слов’янської” групи до “західної”. В умовах війни загальна структура взаємного розташування груп на MDS-графіках залишається досить стабільною, що свідчить про усталеність певних патернів сприйняття. Основні зміни стосуються “стиснення” або “розтягування” відстаней між групами, а не кардинальної зміни їхнього відносного положення.

Джерело даних