Цей матеріал представляє аналіз даних регіонального опитування, проведеного Фондом “Демократичні ініціативи” імені Ілька Кучеріва спільно з Центром політичної соціології 10-21 липня 2023 року в Одеській області. Було опитано 708 респондентів віком від 18 років методом face-to-face.
Мета аналізу: Дослідити рівень соціальної дистанції мешканців Одеської області до представників різних національних груп та внутрішньо переміщених осіб (ВПО) за допомогою шкали Богардуса. Також провести аналіз головних компонент (PCA) для виявлення основних вимірів соціальної дистанції та кластерний аналіз для ідентифікації груп респондентів зі схожими патернами відповідей.
До аналізу включені відповіді респондентів на табличне
запитання.
Інструкція
Скажіть, будь ласка, у якості кого Ви готові бачити представників
наступних соціальних груп:
Групи для оцінки (національності та ВПО) Українці із
західних областей
Внутрішні переселенці, які переїхали в Одеську область через війну
Росіян
Ромів
Євреїв
Шкала відповідей: 1. Як членів своєї родини; 2. Близьких друзів; 3. Колег по роботі; 4. Сусідів; 5. Мешканців однієї країни; 6. Як негромадян — відвідувачів моєї країни; 7. Як негромадян, яким не слід давати дозвіл на в’їзд у мою країну; 8. Важко сказати
Завантаження необхідних бібліотеки R для аналізу даних та візуалізації.
# Бібліотека для психометричного аналізу, включаючи PCA та альфа Кронбаха
library(psych)
# Бібліотека для візуалізації кореляційних матриць
library(corrplot)
# Потужна бібліотека для створення графіків
library(ggplot2)
# Бібліотека для маніпуляції даними (фільтрація, вибір, мутація)
library(dplyr)
# Бібліотека для переформатування даних (наприклад, з широкого в довгий формат)
library(tidyr)
# Бібліотека для читання файлів даних у форматах SPSS (.sav)
library(haven)
# Бібліотека для розрахунку описових статистик у зручному форматі
library(jmv)
# Бібліотека з різними корисними функціями, включаючи частотні таблиці
library(sjmisc)
# Бібліотека для тестів на багатовимірну нормальність (тест Мардіа)
library(mvnormalTest)
# Бібліотеки для кластерного аналізу та в
library(factoextra)
# Бібліотека для визначення оптимальної кількості кластерів
library(clValid)
# Бібліотека для визначення оптимальної кількості кластерів
library(NbClust)
# Бібліотека для проведення кластерного аналізу.
library(cluster)
library(haven)
Завантаження даних
# Завантаження даних з файлу .sav
file_name <- "D:/Lichnoe/2024/Social Distance Odesa/DiscussData-Regional_opinion_poll_in_Odesa_region_of_Ukraine-ODS0723.sav"
df <- read_sav(file_name)
Розрахунок балів за шкалою Богардуса Створимо нові змінні, що відображають мінімальну соціальну дистанцію (найнижчий бал за шкалою Богардуса), яку респондент готовий прийняти щодо кожної з груп. Шкала інвертована: 1 означає найменшу дистанцію (згода на шлюб), 7 - найбільшу (не пускав би в країну).
# Пояснення шкали Богардуса (запитання V36-V40):
# 1: Згоден(на), щоб представник цієї групи став членом моєї родини
# 2: Згоден(на), щоб представник цієї групи став моїм близьким другом
# 3: Згоден(на), щоб представник цієї групи був моїм сусідом
# 4: Згоден(на), щоб представник цієї групи працював зі мною в одному колективі
# 5: Згоден(на), щоб представник цієї групи був громадянином України
# 6: Згоден(на), щоб представник цієї групи був гостем (туристом) в Україні
# 7: Не пускав(ла) би представників цієї групи в Україну
# Ініціалізація нових змінних як NA
df$WestUkr <- NA
df$IDP <- NA
df$Rus <- NA
df$Roma <- NA
df$Jews <- NA
# Перекодування для WestUkr (Українці із західних областей)
# Перебираємо від найбільшої дистанції (7) до найменшої (1)
df$WestUkr[df$V36_7 == 1] <- 7
df$WestUkr[df$V36_6 == 1] <- 6
df$WestUkr[df$V36_5 == 1] <- 5
df$WestUkr[df$V36_4 == 1] <- 4
df$WestUkr[df$V36_3 == 1] <- 3
df$WestUkr[df$V36_2 == 1] <- 2
df$WestUkr[df$V36_1 == 1] <- 1 # Перезапише вищі значення, якщо застосовно
# Перекодування для IDP (Внутрішньо переміщені особи)
df$IDP[df$V37_7 == 1] <- 7
df$IDP[df$V37_6 == 1] <- 6
df$IDP[df$V37_5 == 1] <- 5
df$IDP[df$V37_4 == 1] <- 4
df$IDP[df$V37_3 == 1] <- 3
df$IDP[df$V37_2 == 1] <- 2
df$IDP[df$V37_1 == 1] <- 1
# Перекодування для Rus (Росіяни)
df$Rus[df$V38_7 == 1] <- 7
df$Rus[df$V38_6 == 1] <- 6
df$Rus[df$V38_5 == 1] <- 5
df$Rus[df$V38_4 == 1] <- 4
df$Rus[df$V38_3 == 1] <- 3
df$Rus[df$V38_2 == 1] <- 2
df$Rus[df$V38_1 == 1] <- 1
# Перекодування для Roma (Роми)
df$Roma[df$V39_7 == 1] <- 7
df$Roma[df$V39_6 == 1] <- 6
df$Roma[df$V39_5 == 1] <- 5
df$Roma[df$V39_4 == 1] <- 4
df$Roma[df$V39_3 == 1] <- 3
df$Roma[df$V39_2 == 1] <- 2
df$Roma[df$V39_1 == 1] <- 1
# Перекодування для Jews (Євреї)
df$Jews[df$V40_7 == 1] <- 7
df$Jews[df$V40_6 == 1] <- 6
df$Jews[df$V40_5 == 1] <- 5
df$Jews[df$V40_4 == 1] <- 4
df$Jews[df$V40_3 == 1] <- 3
df$Jews[df$V40_2 == 1] <- 2
df$Jews[df$V40_1 == 1] <- 1
Відбір змінних та обробка пропущених значень
# Вибираємо потрібні стовпці (з новоствореними змінними Богардуса)
data_raw <- df[, c("WestUkr", "IDP", "Rus", "Roma", "Jews")]
# Видаляємо рядки з будь-якими пропущеними значеннями (NA) у вибраних стовпцях
# Це необхідно для багатьох статистичних процедур, таких як PCA
data <- na.omit(data_raw)
# Перевіримо розмірність даних до і після видалення NA
cat("Розмірність даних до видалення NA:", paste(dim(data_raw), collapse="x"), "\n")
## Розмірність даних до видалення NA: 708x5
cat("Розмірність даних після видалення NA:", paste(dim(data), collapse="x"), "\n")
## Розмірність даних після видалення NA: 404x5
cat("Кількість видалених рядків (з NA):", nrow(data_raw) - nrow(data), "\n")
## Кількість видалених рядків (з NA): 304
# Додавання атрибутів 'label' до змінних у новому датасеті 'data'
# Це допомагає зберігати описові назви змінних разом з даними.
attr(data$WestUkr, "label") <- "Українці із західних областей"
attr(data$IDP, "label") <- "Внутрішні переселенці через війну"
attr(data$Rus, "label") <- "Росіяни"
attr(data$Roma, "label") <- "Роми"
attr(data$Jews, "label") <- "Євреї"
Інтерпретація: Описові статистики (середні значення, медіани) показують центральну тенденцію у ставленні до кожної групи. Частотні таблиці деталізують розподіл відповідей за 7-бальною шкалою Богардуса. Нижче середнє значення відповідає меншій соціальній дистанції. Розрахуємо основні описові статистики для змінних соціальної дистанції.
# Розрахунок описових статистик (середнє, медіана, ст. відхилення, мін, макс, асиметрія, ексцес)
# за допомогою функції з пакету 'jmv'
cat("Описові статистики змінних соціальної дистанції:\n")
## Описові статистики змінних соціальної дистанції:
options(digits=3)
descriptives(data, skew = TRUE, kurt = TRUE)
##
## DESCRIPTIVES
##
## Descriptives
## ───────────────────────────────────────────────────────────────────────
## WestUkr IDP Rus Roma Jews
## ───────────────────────────────────────────────────────────────────────
## N 404 404 404 404 404
## Missing 0 0 0 0 0
## Mean 3.75 3.51 5.64 5.05 4.38
## Median 5.00 4.00 7.00 5.00 5.00
## Standard deviation 1.65 1.68 1.83 1.02 1.43
## Minimum 1.00 1.00 1.00 1.00 1.00
## Maximum 7.00 6.00 7.00 7.00 7.00
## Skewness -0.700 -0.466 -1.36 -1.13 -1.30
## Std. error skewness 0.121 0.121 0.121 0.121 0.121
## Kurtosis -1.16 -1.51 0.989 4.13 0.769
## Std. error kurtosis 0.242 0.242 0.242 0.242 0.242
## ───────────────────────────────────────────────────────────────────────
sjmisc:: frq(data[1:5])
## Українці із західних областей (WestUkr) <numeric>
## # total N=404 valid N=404 mean=3.75 sd=1.65
##
## Value | N | Raw % | Valid % | Cum. %
## --------------------------------------
## 1 | 74 | 18.32 | 18.32 | 18.32
## 2 | 46 | 11.39 | 11.39 | 29.70
## 3 | 20 | 4.95 | 4.95 | 34.65
## 4 | 41 | 10.15 | 10.15 | 44.80
## 5 | 216 | 53.47 | 53.47 | 98.27
## 6 | 6 | 1.49 | 1.49 | 99.75
## 7 | 1 | 0.25 | 0.25 | 100.00
## <NA> | 0 | 0.00 | <NA> | <NA>
##
## Внутрішні переселенці через війну (IDP) <numeric>
## # total N=404 valid N=404 mean=3.51 sd=1.68
##
## Value | N | Raw % | Valid % | Cum. %
## --------------------------------------
## 1 | 85 | 21.04 | 21.04 | 21.04
## 2 | 62 | 15.35 | 15.35 | 36.39
## 3 | 16 | 3.96 | 3.96 | 40.35
## 4 | 47 | 11.63 | 11.63 | 51.98
## 5 | 192 | 47.52 | 47.52 | 99.50
## 6 | 2 | 0.50 | 0.50 | 100.00
## <NA> | 0 | 0.00 | <NA> | <NA>
##
## Росіяни (Rus) <numeric>
## # total N=404 valid N=404 mean=5.64 sd=1.83
##
## Value | N | Raw % | Valid % | Cum. %
## --------------------------------------
## 1 | 35 | 8.66 | 8.66 | 8.66
## 2 | 4 | 0.99 | 0.99 | 9.65
## 3 | 3 | 0.74 | 0.74 | 10.40
## 4 | 36 | 8.91 | 8.91 | 19.31
## 5 | 87 | 21.53 | 21.53 | 40.84
## 6 | 27 | 6.68 | 6.68 | 47.52
## 7 | 212 | 52.48 | 52.48 | 100.00
## <NA> | 0 | 0.00 | <NA> | <NA>
##
## Роми (Roma) <numeric>
## # total N=404 valid N=404 mean=5.05 sd=1.02
##
## Value | N | Raw % | Valid % | Cum. %
## --------------------------------------
## 1 | 9 | 2.23 | 2.23 | 2.23
## 2 | 1 | 0.25 | 0.25 | 2.48
## 3 | 5 | 1.24 | 1.24 | 3.71
## 4 | 64 | 15.84 | 15.84 | 19.55
## 5 | 216 | 53.47 | 53.47 | 73.02
## 6 | 83 | 20.54 | 20.54 | 93.56
## 7 | 26 | 6.44 | 6.44 | 100.00
## <NA> | 0 | 0.00 | <NA> | <NA>
##
## Євреї (Jews) <numeric>
## # total N=404 valid N=404 mean=4.38 sd=1.43
##
## Value | N | Raw % | Valid % | Cum. %
## --------------------------------------
## 1 | 38 | 9.41 | 9.41 | 9.41
## 2 | 25 | 6.19 | 6.19 | 15.59
## 3 | 13 | 3.22 | 3.22 | 18.81
## 4 | 41 | 10.15 | 10.15 | 28.96
## 5 | 248 | 61.39 | 61.39 | 90.35
## 6 | 33 | 8.17 | 8.17 | 98.51
## 7 | 6 | 1.49 | 1.49 | 100.00
## <NA> | 0 | 0.00 | <NA> | <NA>
Перевіримо багатовимірну нормальність за допомогою тесту Мардіа. Важливо для деяких припущень, хоча PCA є відносно стійким до відхилень.
# Тест Мардіа на багатовимірну асиметрію та ексцес
# H0: Дані мають багатовимірний нормальний розподіл
# Якщо p-value < 0.05, ми відхиляємо H0.
cat("Тест Мардіа на багатовимірну нормальність:\n")
## Тест Мардіа на багатовимірну нормальність:
mardia_result <- mardia(data)
print(mardia_result)
## $mv.test
## Test Statistic p-value Result
## 1 Skewness 606.0369 0 NO
## 2 Kurtosis 18.1496 0 NO
## 3 MV Normality <NA> <NA> NO
##
## $uv.shapiro
## W p-value UV.Normality
## WestUkr 0.7525 0 No
## IDP 0.7656 0 No
## Rus 0.7344 0 No
## Roma 0.8168 0 No
## Jews 0.7335 0 No
Інтерпретація: Зазвичай для соціальних даних тест Мардіа показує значуще відхилення від нормальності (p < 0.05). Це очікувано і не є перешкодою для проведення PCA, але варто пам’ятати про це при інтерпретації результатів, особливо якщо планується використання методів, що базуються на нормальності.
PCA шукає спільну дисперсію, тому змінні мають бути корельовані. Перевіримо це за допомогою кореляційної матриці та формальних тестів Бартлетта і KMO.
# Розрахунок кореляційної матриці Пірсона
# use = "pairwise.complete.obs" - обробка пропусків (хоча ми їх видалили раніше)
cor_matrix <- cor(data, use = "pairwise.complete.obs")
# Забезпечення єдиного стилю для всіх графіків
library(ggthemes)
theme_set(theme_minimal(base_size = 12))
# Візуалізація кореляційної матриці
corrplot(cor_matrix, method = "color", type = "upper", order = "hclust",
hclust.method = "average", # Метод кластеризації для впорядкування змінних
addCoef.col = "black", # Додати коефіцієнти кореляції на графік
tl.col = "black", tl.srt = 45, # Колір та кут нахилу тексту міток
diag = FALSE, # Не показувати діагональ
mar=c(0,0,1,0)) # Налаштування полів для заголовка
# Тест Бартлетта на сферичність
# H0: Кореляційна матриця є одиничною (змінні не корелюють).
# Якщо p-value < 0.05, відхиляємо H0 -> PCA є доцільним.
cat("\nТест Бартлетта на сферичність:\n")
##
## Тест Бартлетта на сферичність:
bartlett_test <- cortest.bartlett(data)
print(bartlett_test)
## $chisq
## [1] 594
##
## $p.value
## [1] 4.32e-121
##
## $df
## [1] 10
# Індекс Кайзера-Мейєра-Олкіна (KMO) - міра адекватності вибірки для PCA
# Оцінює співвідношення між кореляціями та частковими кореляціями.
# Значення > 0.6 вважаються прийнятними.
cat("\nТест KMO (адекватність вибірки):\n")
##
## Тест KMO (адекватність вибірки):
kmo_test <- KMO(data)
print(kmo_test)
## Kaiser-Meyer-Olkin factor adequacy
## Call: KMO(r = data)
## Overall MSA = 0.61
## MSA for each item =
## WestUkr IDP Rus Roma Jews
## 0.56 0.58 0.63 0.72 0.66
Інтерпретація
Кореляційна матриця: Візуально оцінюємо наявність значущих кореляцій
(кольорові клітинки, значення коефіцієнтів). Тест Бартлетта: Значущий
результат (p < 0.05) підтверджує, що змінні достатньо корелюють для
проведення PCA. Тест KMO: Загальний індекс KMO (Overall MSA) та
індивідуальні MSA для кожної змінної мають бути вище прийнятного рівня
(зазвичай > 0.6, бажано > 0.7) для виправдання PCA.
Використаємо паралельний аналіз для обґрунтованого вибору кількості компонент для виділення.
# Паралельний аналіз (Хорна)
# Порівнює власні значення реальних даних з власними значеннями випадкових даних.
# Рекомендує кількість компонент, чиї власні значення перевищують відповідні
# власні значення, отримані з випадкових даних (синя лінія вище червоної).
cat("Результати паралельного аналізу:\n")
## Результати паралельного аналізу:
# fa="pc" вказує, що ми робимо PCA.
fa_parallel_results <- fa.parallel(data, fa="pc")
## Parallel analysis suggests that the number of factors = NA and the number of components = 2
print(fa_parallel_results)
## Call: fa.parallel(x = data, fa = "pc")
## Parallel analysis suggests that the number of factors = NA and the number of components = 2
##
## Eigen Values of
##
## eigen values of factors
## [1] 1.74 0.61 -0.14 -0.19 -0.28
##
## eigen values of simulated factors
## [1] NA
##
## eigen values of components
## [1] 2.31 1.28 0.73 0.44 0.24
##
## eigen values of simulated components
## [1] 1.14 1.06 1.00 0.95 0.86
# Зверніть увагу на рядок "Parallel analysis suggests that the number of components = Y"
# у виводі консолі. Це рекомендована кількість компонент.
num_components_suggested <- fa_parallel_results$ncomp
cat("\nРекомендована кількість компонент за паралельним аналізом:", num_components_suggested, "\n")
##
## Рекомендована кількість компонент за паралельним аналізом: 2
# Задаємо кількість компонент для подальшого аналізу
# Використовуємо рекомендоване значення або інше обґрунтоване значення.
num_components <- num_components_suggested # Або встановіть вручну, напр., num_components num_components<- 2
Інтерпретація: Графік та текстовий вивід fa.parallel допомагають визначити оптимальну кількість компонент. Зазвичай обирають кількість компонент, що відповідає точкам синьої лінії (реальні дані) вище червоної пунктирної лінії (випадкові дані).
Проведемо PCA з визначеною кількістю компонент та обертанням Promax (косе обертання, що дозволяє компонентам корелювати).
# Виконання PCA за допомогою функції principal з пакету psych
# nfactors: кількість компонент для виділення (визначена раніше)
# rotate: метод обертання. "promax" - косий метод (дозволяє кореляцію між компонентами).
# Альтернатива: "varimax" (ортогональний, якщо припускаємо незалежність).
cat(paste0("Виконується PCA з ", num_components, " компонентами та обертанням 'oblimin'.\n"))
## Виконується PCA з 2 компонентами та обертанням 'oblimin'.
pc <- principal(data, nfactors = num_components, rotate = "oblimin")
# Виведення основних результатів PCA
# Включає навантаження (loadings), пояснену дисперсію, кореляції компонент (якщо обертання косе)
cat("\n--- Основні результати PCA: ---\n")
##
## --- Основні результати PCA: ---
print(pc)
## Principal Components Analysis
## Call: principal(r = data, nfactors = num_components, rotate = "oblimin")
## Standardized loadings (pattern matrix) based upon correlation matrix
## TC1 TC2 h2 u2 com
## WestUkr 0.92 0.02 0.86 0.14 1.0
## IDP 0.92 -0.02 0.84 0.16 1.0
## Rus -0.01 0.79 0.63 0.37 1.0
## Roma -0.20 0.77 0.55 0.45 1.1
## Jews 0.29 0.72 0.71 0.29 1.3
##
## TC1 TC2
## SS loadings 1.84 1.75
## Proportion Var 0.37 0.35
## Cumulative Var 0.37 0.72
## Proportion Explained 0.51 0.49
## Cumulative Proportion 0.51 1.00
##
## With component correlations of
## TC1 TC2
## TC1 1.00 0.25
## TC2 0.25 1.00
##
## Mean item complexity = 1.1
## Test of the hypothesis that 2 components are sufficient.
##
## The root mean square of the residuals (RMSR) is 0.12
## with the empirical chi square 124 with prob < 6.9e-29
##
## Fit based upon off diagonal values = 0.89
Інтерпретація виводу print(pc):
Standardized loadings (pattern matrix): Навантаження змінних на
компоненти після обертання. Вказують на силу зв’язку змінної з
компонентою.
h2 (Communalities): Частка дисперсії кожної змінної, пояснена виділеними
компонентами.
u2 (Uniquenesses): Частка дисперсії, не пояснена компонентами (1 -
h2).
SS loadings: Сума квадратів навантажень для кожної компоненти (аналог
власного значення після обертання). Proportion Var: Частка загальної
дисперсії, пояснена кожною компонентою після обертання. Cumulative Var:
Накопичена частка дисперсії. Component Correlations: Кореляційна матриця
між самими компонентами (актуально для косих обертань як oblimin).
Якщо компоненти інтерпретуються як шкали, перевіримо їхню внутрішню узгодженість за допомогою Альфи Кронбаха. Групуємо змінні на основі їхніх найвищих навантажень на компоненти.
variables_comp1 <- data[c("WestUkr", "IDP")] # Зінні сильно навантажені на Компоненту 1
variables_comp2 <- data[c("Rus", "Roma", "Jews")] # Змінні сильно навантажені на Компоненту 2
psych::alpha (variables_comp1)
##
## Reliability analysis
## Call: psych::alpha(x = variables_comp1)
##
## raw_alpha std.alpha G6(smc) average_r S/N ase mean sd median_r
## 0.85 0.85 0.74 0.74 5.8 0.015 3.6 1.6 0.74
##
## 95% confidence boundaries
## lower alpha upper
## Feldt 0.82 0.85 0.88
## Duhachek 0.82 0.85 0.88
##
## Reliability if an item is dropped:
## raw_alpha std.alpha G6(smc) average_r S/N alpha se var.r med.r
## WestUkr 0.73 0.74 0.55 0.74 2.9 NA 0 0.74
## IDP 0.76 0.74 0.55 0.74 2.9 NA 0 0.74
##
## Item statistics
## n raw.r std.r r.cor r.drop mean sd
## WestUkr 404 0.93 0.93 0.8 0.74 3.7 1.6
## IDP 404 0.93 0.93 0.8 0.74 3.5 1.7
##
## Non missing response frequency for each item
## 1 2 3 4 5 6 7 miss
## WestUkr 0.18 0.11 0.05 0.10 0.53 0.01 0 0
## IDP 0.21 0.15 0.04 0.12 0.48 0.00 0 0
psych::alpha (variables_comp2)
##
## Reliability analysis
## Call: psych::alpha(x = variables_comp2)
##
## raw_alpha std.alpha G6(smc) average_r S/N ase mean sd median_r
## 0.64 0.65 0.57 0.39 1.9 0.028 5 1.1 0.35
##
## 95% confidence boundaries
## lower alpha upper
## Feldt 0.58 0.64 0.7
## Duhachek 0.59 0.64 0.7
##
## Reliability if an item is dropped:
## raw_alpha std.alpha G6(smc) average_r S/N alpha se var.r med.r
## Rus 0.50 0.52 0.35 0.35 1.09 0.047 NA 0.35
## Roma 0.67 0.69 0.52 0.52 2.20 0.031 NA 0.52
## Jews 0.39 0.44 0.28 0.28 0.78 0.051 NA 0.28
##
## Item statistics
## n raw.r std.r r.cor r.drop mean sd
## Rus 404 0.85 0.78 0.62 0.51 5.6 1.8
## Roma 404 0.61 0.71 0.44 0.36 5.1 1.0
## Jews 404 0.82 0.81 0.68 0.57 4.4 1.4
##
## Non missing response frequency for each item
## 1 2 3 4 5 6 7 miss
## Rus 0.09 0.01 0.01 0.09 0.22 0.07 0.52 0
## Roma 0.02 0.00 0.01 0.16 0.53 0.21 0.06 0
## Jews 0.09 0.06 0.03 0.10 0.61 0.08 0.01 0
Інтерпретація Альфи Кронбаха: Значення raw_alpha > 0.7 вважається добрим показником внутрішньої узгодженості шкали (компоненти). Значення між 0.6 та 0.7 можуть бути прийнятними. Значення < 0.6 вказують на низьку надійність.
Візуалізація власних значень компонент до обертання. Допомагає візуально оцінити важливість компонент.
# Власні значення (Eigenvalues) до обертання зберігаються в pc$values
eigenvalues <- pc$values
plot(1:length(eigenvalues), eigenvalues, type = "b", pch = 19,
xlab = "Номер компоненти", ylab = "Власне значення (Eigenvalue)",
main = "Скрі-плот власних значень (до обертання)")
abline(h = 1, col = "red", lty = 2) # Горизонтальна лінія на рівні 1 (Критерій Кайзера)
legend("topright", legend="Критерій Кайзера (Eigenvalue = 1)", col="red", lty=2, cex=0.8, bg="white")
Інтерпретація: Цей графік схожий на графік паралельного аналізу, але показує лише власні значення реальних даних. “Лікоть” графіка або точки вище лінії h=1 можуть вказувати на кількість значущих компонент.
Інтерпретація навантажень: На основі того, які змінні мають високі (за модулем) навантаження на кожну компоненту, ми даємо їм змістовні назви. Наприклад, Компонента 1 може об’єднувати ставлення до “внутрішніх інших” (WestUkr, IDP), а Компонента 2 – до “зовнішніх/етнічних інших” (Rus, Roma, Jews).
Візуальна репрезентація зв’язків між змінними та компонентами. Може бути перевантаженою.
# Створення діаграми структури
# cut=0.3: показувати тільки навантаження >= 0.3
# cex: розмір тексту; rsize: розмір стрілок
cat("--- Діаграма структури компонент ---\n")
## --- Діаграма структури компонент ---
fa.diagram(pc, sort = TRUE, cut = 0.3, digits=2,
main = "Діаграма структури компонент (PCA)",
cex = 0.7, rsize=0.7)
Візуалізує одночасно змінні (як вектори) та спостереження (як точки) у просторі перших двох головних компонент.
# Використання функції biplot.psych з пакету psych
# choose=c(1,2): відобразити перші дві компоненти
# cex=c(0.6, 0.8): розмір точок (спостереження) та тексту (змінні)
cat("--- Біплот (Змінні та Компоненти) ---\n")
## --- Біплот (Змінні та Компоненти) ---
biplot.psych(pc, main = "Біплот PCA", choose=c(1,2), cex=c(0.6, 0.8), col.arrows="blue")
Інтерпретація біплоту: Вектори змінних (стрілки): Напрямок показує зв’язок з компонентами. Довжина - силу зв’язку (приблизно). Кут між векторами відображає кореляцію між змінними. Точки спостережень: Розташування точки показує оцінку респондента за двома компонентами. Близькі точки - схожі патерни відповідей.
Компонентні оцінки показують позицію кожного респондента на нових осях (головних компонентах). Це нові змінні, які можна використовувати в подальшому аналізі (напр., кластеризації).
# Отримання оцінок компонент для кожного спостереження
scores <- as.data.frame(pc$scores)
# Змінюємо назви стовпців для зручності (наприклад, TC1 -> Comp1)
colnames(scores) <- paste0("Comp", 1:num_components)
# Подивимось на перші кілька оцінок
cat("--- Перші 6 компонентних оцінок: ---\n")
## --- Перші 6 компонентних оцінок: ---
print(head(scores))
## Comp1 Comp2
## 1 0.872 1.1868
## 2 0.911 -0.0318
## 3 -0.955 1.2406
## 4 0.911 -0.0318
## 5 -1.190 -1.8071
## 6 -0.638 0.4895
# Розрахуємо описові статистики для нових змінних-компонент
cat("\n--- Описові статистики головних компонент: ---\n")
##
## --- Описові статистики головних компонент: ---
print(descriptives(scores, skew = TRUE, kurt = TRUE))
##
## DESCRIPTIVES
##
## Descriptives
## ───────────────────────────────────────────────
## Comp1 Comp2
## ───────────────────────────────────────────────
## N 404 404
## Missing 0 0
## Mean 4.26e-17 2.01e-16
## Median 0.374 0.0400
## Standard deviation 1.000 1.000
## Minimum -1.97 -3.92
## Maximum 1.52 1.98
## Skewness -0.616 -1.36
## Std. error skewness 0.121 0.121
## Kurtosis -1.15 2.72
## Std. error kurtosis 0.242 0.242
## ───────────────────────────────────────────────
# Додамо оцінки до вихідного датасету (після видалення NA)
data_with_scores <- cbind(data, scores)
cat("\n--- Перші 6 рядків даних з доданими оцінками: ---\n")
##
## --- Перші 6 рядків даних з доданими оцінками: ---
# Візуалізація розподілу оцінок
# Переформатування даних в "довгий" формат для ggplot
scores_long <- scores %>%
pivot_longer(cols = everything(),
names_to = "Component",
values_to = "Score")
# Створення скрипкового графіка
ggplot(scores_long, aes(x = Component, y = Score, fill = Component)) +
geom_violin(trim = FALSE, alpha = 0.7) +
geom_boxplot(width = 0.1, fill = "white", alpha = 0.7, outlier.shape = NA) +
labs(
title = "Розподіл оцінок для головних компонент",
x = "Компонента",
y = "Оцінка",
caption = "Скрипковий графік з накладеним боксплотом"
) +
theme_minimal(base_size = 12)
ggsave("violin_plot.png", width = 10, height = 6)
# Візуалізація спостережень у просторі перших двох компонент (Scatter plot)
# Кожна точка - окремий респондент
scatter_plot_scores <- ggplot(scores, aes(x = Comp1, y = Comp2)) +
geom_point(alpha = 0.4, shape=16, size=1.5, color="steelblue") + # Напівпрозорі точки
geom_hline(yintercept = 0, linetype = "dashed", color = "grey50") + # Нульові лінії
geom_vline(xintercept = 0, linetype = "dashed", color = "grey50") +
# Встановлює межі та підпис для осі X
scale_x_continuous(
limits = c(-2.5, 2.5),
name = paste0("Компонента 1 (", round(pc$Vaccounted["Proportion Var", 1] * 100, 1), "% дисп.)")
) + # Додано '+'
# Встановлює межі та підпис для осі Y
scale_y_continuous(
limits = c(-2.5, 2.5),
name = paste0("Компонента 2 (", round(pc$Vaccounted["Proportion Var", 2] * 100, 1), "% дисп.)")
) + # Додано '+' та підпис осі
# Залишаємо лише заголовок у labs
labs(title = "Розподіл респондентів у просторі перших двох компонент") +
# Додаємо тему та налаштування заголовка
theme_minimal(base_size = 11) +
theme(plot.title = element_text(hjust = 0.5))
# Виведення графіку
print(scatter_plot_scores)
Інтерпретація візуалізацій оцінок: Скрипковий графік: Показує форму розподілу оцінок для кожної компоненти (середнє, розмах, щільність). Scatter plot: Показує, як респонденти розподіляються у 2D-просторі компонент. Скупчення точок можуть вказувати на наявність груп (кластерів).
Використаємо компонентні оцінки (scores) як вхідні дані для кластерного аналізу (методом K-середніх), щоб знайти групи респондентів зі схожими позиціями на осях головних компонент.
Застосуємо кілька методів, щоб оцінити найбільш ймовірну кількість кластерів у даних. Інтерпретація методів вибору k: Лікоть: Шукаємо точку (“лікоть”), після якої зменшення WCSS стає менш вираженим. Силует: Шукаємо k, що максимізує середню ширину силуету. Gap Statistic: Шукаємо k, що відповідає найбільшому значенню статистики Gap (найбільший розрив між синьою лінією та пунктирною). Рішення: Обираємо k, яке підтримується кількома методами або має найкраще теоретичне обґрунтування. Припустимо, методи вказують на k=4.
# Дані для кластеризації (використовуємо оцінки за компонентами)
# Обмежуємось першими двома компонентами для візуалізації
data_for_clust <- scores[, c("Comp1", "Comp2")]
# Встановлення seed для відтворюваності результатів
set.seed(123)
# 1. Метод "Ліктя" (Elbow Method) - WCSS
cat("--- 1. Метод Ліктя (WCSS) ---\n")
## --- 1. Метод Ліктя (WCSS) ---
wss_plot <- fviz_nbclust(data_for_clust, kmeans, method = "wss", k.max = 10, nstart = 25) +
labs(subtitle = "Метод Ліктя для визначення k", y = "Total Within Sum of Squares (WCSS)") +
theme(axis.title = element_text(size=9), plot.subtitle = element_text(size=10))
# geom_vline(xintercept = 4, linetype = 2, color = "steelblue") # Приклад лінії на k=4
# 2. Статистика Розриву (Gap Statistic)
cat("\n--- 2. Статистика Розриву (Gap Statistic) ---\n")
##
## --- 2. Статистика Розриву (Gap Statistic) ---
# nboot=50 - може бути повільно, для швидкого тесту можна зменшити до 25
gap_stat_result <- clusGap(data_for_clust,
FUNcluster = kmeans,
K.max = 10,
B = 50, # Кількість бутстреп-вибірок
nstart = 25,
verbose = FALSE) # Не виводити прогрес
# Візуалізація Gap Statistic
gap_plot <- fviz_gap_stat(gap_stat_result) +
labs(subtitle = "Статистика Розриву для визначення k", y="Gap Statistic") +
theme(axis.title = element_text(size=9), plot.subtitle = element_text(size=10))
# Виведення графіків
print(wss_plot)
print(gap_plot)
# Визначення оптимального k за Gap Statistic
optimal_k_gap <- maxSE(gap_stat_result$Tab[, "gap"], gap_stat_result$Tab[, "SE.sim"], method="Tibs2001SEmax")
cat("\nРекомендована кількість кластерів за Gap Statistic (Tibs2001SEmax):", optimal_k_gap, "\n")
##
## Рекомендована кількість кластерів за Gap Statistic (Tibs2001SEmax): 3
cat("\n--- 3. Визначення кількості кластерів ---\n")
##
## --- 3. Визначення кількості кластерів ---
clvalid_result <- clValid(data_for_clust, nClust = 2:10, clMethods = "kmeans", validation = "internal")
optimalScores(clvalid_result)
## Score Method Clusters
## Connectivity 26.2607 kmeans 2
## Dunn 0.0635 kmeans 8
## Silhouette 0.5240 kmeans 4
cat("\n--- 4. Комплексний аналіз з NbClust ---\n")
##
## --- 4. Комплексний аналіз з NbClust ---
# Цей метод може бути тривалим, оскільки розраховує ~30 індексів
nbclust_result <- NbClust(data = data_for_clust, distance = "euclidean",
min.nc = 2, max.nc = 10, method = "kmeans")
## *** : The Hubert index is a graphical method of determining the number of clusters.
## In the plot of Hubert index, we seek a significant knee that corresponds to a
## significant increase of the value of the measure i.e the significant peak in Hubert
## index second differences plot.
##
## *** : The D index is a graphical method of determining the number of clusters.
## In the plot of D index, we seek a significant knee (the significant peak in Dindex
## second differences plot) that corresponds to a significant increase of the value of
## the measure.
##
## *******************************************************************
## * Among all indices:
## * 4 proposed 2 as the best number of clusters
## * 11 proposed 3 as the best number of clusters
## * 2 proposed 5 as the best number of clusters
## * 1 proposed 8 as the best number of clusters
## * 1 proposed 9 as the best number of clusters
## * 4 proposed 10 as the best number of clusters
##
## ***** Conclusion *****
##
## * According to the majority rule, the best number of clusters is 3
##
##
## *******************************************************************
# Гістограма рекомендованої кількості кластерів за різними критеріями
nbclust_plot <- barplot(table(nbclust_result$Best.nc[1,]),
xlab = "Кількість кластерів", ylab = "Кількість критеріїв",
main = "Кількість кластерів")
Проведемо кластеризацію методом K-середніх з обраною кількістю кластерів.
# Встановлення оптимальної кількості кластерів (змініть за потребою на основі попереднього кроку)
optimal_k <- 4
cat(paste0("\nВиконується кластеризація методом K-середніх (k=", optimal_k, ")...\n"))
##
## Виконується кластеризація методом K-середніх (k=4)...
# Встановлення seed для відтворюваності K-means
set.seed(123)
# Виконання K-means
kmeans_result <- kmeans(data_for_clust, centers = optimal_k, nstart = 25)
# Аналіз результатів K-means
cat("\n--- Результати K-means (k=", optimal_k, ") ---\n")
##
## --- Результати K-means (k= 4 ) ---
# Розмір кластерів
cat("Розмір кластерів:\n")
## Розмір кластерів:
print(kmeans_result$size)
## [1] 54 39 102 209
# Координати центрів кластерів (центроїди)
cat("\nЦентри кластерів (центроїди):\n")
##
## Центри кластерів (центроїди):
print(kmeans_result$centers)
## Comp1 Comp2
## 1 0.144 -1.079
## 2 -1.647 -1.936
## 3 -1.049 0.540
## 4 0.782 0.376
# Загальна внутрішньокластерна сума квадратів
cat("\nЗагальна внутрішньокластерна сума квадратів (Total WCSS):", kmeans_result$tot.withinss, "\n")
##
## Загальна внутрішньокластерна сума квадратів (Total WCSS): 191
# Міжкластерна сума квадратів
cat("Міжкластерна сума квадратів (BCSS):", kmeans_result$betweenss, "\n")
## Міжкластерна сума квадратів (BCSS): 615
# Співвідношення BCSS / Total SS (чим більше, тим краще розділення)
cat("Співвідношення BCSS / Total SS:", round(kmeans_result$betweenss / kmeans_result$totss, 3), "\n")
## Співвідношення BCSS / Total SS: 0.763
# Додавання міток кластерів до датасету з оцінками
cluster_assignments <- kmeans_result$cluster
scores_clustered <- scores %>%
mutate(Cluster = as.factor(cluster_assignments)) # Додаємо стовпець Cluster
# Перевірка
head(scores_clustered)
## Comp1 Comp2 Cluster
## 1 0.872 1.1868 4
## 2 0.911 -0.0318 4
## 3 -0.955 1.2406 3
## 4 0.911 -0.0318 4
## 5 -1.190 -1.8071 2
## 6 -0.638 0.4895 3
Відобразимо респондентів на графіку розсіювання у просторі перших двох компонент, розфарбувавши точки відповідно до їхньої належності до кластеру.
# Використання factoextra для візуалізації
cluster_plot_fviz <- fviz_cluster(kmeans_result, data = data_for_clust,
geom = "point", # Показувати точки
ellipse.type = "convex", # Опуклі оболонки навколо кластерів
palette = "viridis", # Палітра кольорів
ggtheme = theme_minimal(base_size = 11), # Тема ggplot
main = "Кластеризація K-means", # Назва графіку
# Перевірте, чи pc$Vaccounted["Proportion Var", ] дійсно містить потрібні значення.
# Альтернатива для результату prcomp(): round(summary(pc)$importance[2, 1] * 100, 1)
xlab = paste0("Комп. 1 (", round(pc$Vaccounted["Proportion Var", 1] * 100, 1), "% дисп.)"),
ylab = paste0("Комп. 2 (", round(pc$Vaccounted["Proportion Var", 2] * 100, 1), "% дисп.)")
) +
# Встановлення лімітів для осі X
scale_x_continuous(limits = c(-2.5, 2.5)) +
# Встановлення лімітів для осі Y
scale_y_continuous(limits = c(-2.5, 2.5)) +
# Додаткові налаштування теми
theme(plot.title = element_text(hjust = 0.5), # Центрувати назву графіку
legend.title = element_text(size = 10), # Розмір назви легенди
legend.text = element_text(size = 9)) # Розмір тексту легенди
# Для відображення графіку (якщо потрібно)
print(cluster_plot_fviz)
# Додавання результатів кластерного аналізу до датасету
data_compl<-cbind(data, scores_clustered)
Нагадаємо: нижчі бали за шкалою Богардуса = менша соціальна дистанція = більше прийняття. Вищі бали = більша соціальна дистанція = менше прийняття / бажання дистанціюватися.
options(digits = 3)
jmv::descriptives(data=data_compl, vars=vars(WestUkr, IDP, Rus, Roma, Jews, Comp1, Comp2), median=F, missing=F,
splitBy = Cluster, freq = T)
##
## DESCRIPTIVES
##
## Descriptives
## ─────────────────────────────────────────────────────────────────────────────────────────────────────
## Cluster WestUkr IDP Rus Roma Jews Comp1 Comp2
## ─────────────────────────────────────────────────────────────────────────────────────────────────────
## N 1 54 54 54 54 54 54 54
## 2 39 39 39 39 39 39 39
## 3 102 102 102 102 102 102 102
## 4 209 209 209 209 209 209 209
## Mean 1 4.13 3.54 4.20 4.11 3.30 0.144 -1.08
## 2 1.21 1.26 2.44 4.33 1.36 -1.65 -1.94
## 3 2.14 1.72 6.59 5.42 4.77 -1.05 0.540
## 4 4.90 4.79 6.14 5.25 5.04 0.782 0.376
## Standard deviation 1 1.21 1.34 1.97 1.16 1.37 0.546 0.745
## 2 0.570 0.498 2.27 1.64 0.537 0.307 0.880
## 3 1.27 0.927 0.916 0.789 1.12 0.479 0.548
## 4 0.405 0.572 1.02 0.678 0.562 0.255 0.468
## Minimum 1 1.00 1.00 1.00 1.00 1.00 -1.01 -3.92
## 2 1.00 1.00 1.00 1.00 1.00 -1.95 -3.84
## 3 1.00 1.00 4.00 4.00 1.00 -1.97 -0.657
## 4 2.00 2.00 3.00 4.00 3.00 -0.0577 -0.505
## Maximum 1 7.00 6.00 7.00 7.00 5.00 1.04 -0.204
## 2 4.00 3.00 7.00 7.00 3.00 -0.666 -0.608
## 3 5.00 5.00 7.00 7.00 7.00 -0.135 1.98
## 4 6.00 6.00 7.00 7.00 7.00 1.52 1.91
## ─────────────────────────────────────────────────────────────────────────────────────────────────────
write_sav(data = data_compl, path = "data_compl.sav")
Аналіз дескриптивних статистик соціальної дистанції (шкала Богардуса)
Дескриптивний аналіз показників соціальної дистанції (за шкалою
Богардуса, N=404) виявив суттєві відмінності у ставленні респондентів до
п’яти цільових груп: українців із західних областей (WestUkr),
внутрішньо переміщених осіб (ВПО, IDP), росіян (Rus), ромів (Roma) та
євреїв (Jews).
Найнижчий середній рівень соціальної дистанції, що свідчить про
найбільшу загальну готовність до соціального зближення, зафіксовано щодо
ВПО (M=3.51, SD=1.68), за якими слідують українці із західних областей
(M=3.75, SD=1.65). Медіанні значення для цих груп (4.00 для ВПО та 5.00
для WestUkr) вказують, що щонайменше половина респондентів обирає
помірний або високий рівень дистанції, однак саме ці групи демонструють
найвищий рівень прийняття у вибірці. Варто відзначити, що для ВПО
максимальний зареєстрований бал дистанції становив 6, на відміну від
інших груп, де спостерігався максимум шкали (7). На протилежному полюсі
знаходяться росіяни, щодо яких виявлено найвищий середній рівень
соціальної дистанції (M=5.64, SD=1.83). Медіанне значення для цієї групи
сягає максимального балу шкали (Median=7.00), що вказує на виражене
бажання максимальної соціальної ізоляції від росіян у щонайменше
половини опитаних. Високе стандартне відхилення (найвище серед усіх
груп) свідчить про значну, хоча й менш поширену, варіативність у
відповідях щодо росіян.
Роми (M=5.05, SD=1.02) та євреї (M=4.38, SD=1.43) викликають помірно
високий рівень соціальної дистанції. Примітно, що ставлення до ромів
характеризується найнижчим стандартним відхиленням, що свідчить про
найвищий рівень консенсусу серед респондентів щодо бажаної дистанції до
цієї групи, яка переважно концентрується навколо балу 5 (Median=5.00).
Медіанне значення для євреїв також становить 5.00, однак нижче середнє
значення вказує на наявність більшої частки респондентів, готових до
ближчих контактів з євреями порівняно з ромами.
Аналіз форми розподілу показує, що для всіх п’яти груп характерна
негативна асиметрія (Skewness від -0.466 для ВПО до -1.36 для росіян).
Це свідчить про те, що, незважаючи на центральні тенденції, що часто
вказують на значну дистанцію (особливо медіани), у вибірці існує
помітний “хвіст” респондентів, які демонструють вищий рівень прийняття
(нижчі бали). Розподіли для ромів (Kurtosis=4.13), росіян (0.99) та
євреїв (0.77) є лептокуртичними, вказуючи на концентрацію відповідей
навколо центральних значень, тоді як для українців із західних областей
(-1.16) та ВПО (-1.51) розподіли платикуртичні, що відображає більшу
розпорошеність відповідей по шкалі.
Узагальнюючи, результати дескриптивного аналізу окреслюють чітку
ієрархію соціальної прийнятності у досліджуваній вибірці: від відносної
інтеграції ВПО та українців із західних областей до вираженого
соціального дистанціювання від росіян, яке, ймовірно, значною мірою
зумовлене поточним соціально-політичним контекстом. Роми та євреї
займають проміжні позиції, викликаючи загалом високий рівень соціальної
дистанції, однак зі значно вищим рівнем консенсусу у ставленні до ромів.
Наявність негативної асиметрії для всіх груп вказує на існування
сегмента населення з вищим рівнем толерантності.
Структура соціальної дистанції. Метод головних компонент виявив 2
основних виміри соціальної дистанції в Одеській області станом на липень
2023 року.
Перша компонента (Comp1), що пояснює 36.8% дисперсії, відображає
ставлення переважно до інших українців (зокрема, українців із західних
областей та ВПО), оскільки має найвищі навантаження саме на ці змінні.
Друга компонента (Comp2), що пояснює 35.1% дисперсії, пов’язана зі
ставленням до етнічних/національних “інших” (зокрема, росіян, ромів,
євреїв), маючи високі навантаження на ці змінні.
Загалом, виділені компоненти пояснюють 71.9% загальної дисперсії
вихідних показників соціальної дистанції. Надійність вимірів: Перевірка
внутрішньої узгодженості шкал, що відповідають компонентам, за допомогою
Альфи Кронбаха показала добрий рівень надійності для шкали Компоненти 1
(alpha = 0.85) та прийнятний (хоча й дещо нижчий) рівень для шкали
Компоненти 2 (alpha = 0.64).
Типологія респондентів. Кластер 1 (N=54): “Помірно дистанційовані з
певною відкритістю до ВПО та євреїв”
Характеристики: Цей кластер демонструє помірний рівень соціальної
дистанції до більшості груп. Середні бали коливаються в діапазоні ~3.3 -
4.2. Найменшу дистанцію (найбільше прийняття) ця група відчуває до
євреїв (3.30) та ВПО (3.54). Дистанція до ромів (4.11), українців із
західних областей (4.13) та росіян (4.20) є дещо вищою, але все ще
помірною.
Інтерпретація: Ця група не проявляє ані сильного прийняття, ані сильного
відторгнення до жодної з груп. Вони займають певну “середню” позицію,
дещо більше схиляючись до прийняття ВПО та Євреїв. Стандартні відхилення
є відносно високими (особливо для Росіян - 1.97), що вказує на певну
неоднорідність думок всередині цього кластера щодо різних груп. Це
відносно невеликий кластер.
Кластер 2 (N=39): “Максимально відкриті / інклюзивні”
Характеристики. Цей найменший кластер демонструє дуже низьку соціальну
дистанцію (максимальне прийняття) до Українців із західних областей
(1.21), ВПО (1.26) та євреїв (1.36). Середні бали тут близькі до
мінімально можливого (1), що означає готовність до найближчих контактів
(напр., шлюб). Дистанція до росіян (2.44) також є порівняно низькою для
загального контексту вибірки, хоча й вищою, ніж до перших трьох груп.
Найбільшу дистанцію ця група відчуває до Ромів (4.33), але й цей
показник нижчий, ніж у кластерах 3 та 4. Інтерпретація. Ця група є
найбільш відкритою та толерантною серед усіх кластерів. Вони
демонструють майже повне прийняття українців (західних та ВПО) та
євреїв. Примітною є відносно низька дистанція до росіян (середнє 2.44,
медіана 1.00), що різко контрастує з кластерами 3 та 4. Однак, високе
стандартне відхилення для росіян (2.27) при низькій медіані (1.00)
свідчить про значну поляризацію думок всередині цього кластеру щодо
росіян: багато хто висловлює максимальне прийняття (оцінка 1), але є й
ті, хто висловлює значно більшу дистанцію, що “підтягує” середнє
значення. Дистанція до ромів залишається помірною.
Кластер 3 (N=102): “Проукраїнські / антиросійські з вибірковим
прийняттям”
Характеристики: Цей кластер демонструє дуже низьку дистанцію (високе
прийняття) до ВПО (1.72) та українців із західних областей (2.14).
Водночас спостерігається надзвичайно висока соціальна дистанція (сильне
неприйняття) до росіян (6.59). Дистанція до Ромів (5.42) та євреїв
(4.77) є високою.
Інтерпретація. Ця група чітко відображає патріотичну позицію в умовах
війни: максимальна солідарність із “своїми” (ВПО та західні українці) та
максимальне відторгнення національності, яка є поширеною в
країні-агресорі (росіяни). При цьому зберігається значна дистанція до
інших міноритарних груп (ромів та євреїв). Низьке стандартне відхилення
для росіян (0.92) вказує на високий консенсус у неприйнятті цієї
групи.
Кластер 4 (N=209): “Загально дистанційовані / закриті”
Характеристики: Це найбільший кластер, який характеризується стабільно
високими показниками соціальної дистанції до всіх груп. Найменша
дистанція (але все ще висока) спостерігається до ВПО (4.79) та українців
із західних областей (4.90). Далі йдуть євреї (5.04), роми (5.25), і
найвища дистанція – до росіян (6.14). Інтерпретація. Респонденти цього
кластера схильні підтримувати значну соціальну дистанцію практично з
усіма, включно з ВПО та західними українцями. Хоча певний патерн
(найбільше неприйняття росіян, найменше – ВПО) зберігається, загальний
рівень дистанції є дуже високим для всіх. Це може вказувати на загальну
соціальну закритість, настороженість, можливо, ксенофобські настрої, або
просто небажання близьких контактів з представниками будь-яких груп,
окрім найближчого кола. Дуже низькі стандартні відхилення (крім оцінки
росіян) свідчать про високу однорідність поглядів у цій найбільшій
групі.
Джерело даних
Ilko Kucheriv Democratic Initiatives Foundation (Kyiv), Center for Political Sociology (Kyiv) (2024): Democracy, Trust in Government Institutions, War, Media Consumption: Regional Poll in Odesa Region (Ilko Kucheriv Democratic Initiatives Foundation) – Random-sample questionnaire-based face-to-face poll representative of the residents of Odesa region of Ukraine (July 2023), v. 1.0, Discuss Data, https://doi.org/10.48320/799F8957-F707-4747-97CE-BB4FBBEA1C96.