Переменная V16 — это вопрос с множественным выбором: «Какие природные явления стали более частыми в летний период?»
Ответы закодированы как бинарные переменные V16_1 – V16_9 (0/1), где каждый пункт соответствует определённому природному явлению. Для анализа соответствий строится таблица сопряжённости «Регион и Природное явление».
# Установка и загрузка пакетов
if (!require("FactoMineR")) install.packages("FactoMineR", repos = "https://cran.r-project.org")
if (!require("factoextra")) install.packages("factoextra", repos = "https://cran.r-project.org")
if (!require("readxl")) install.packages("readxl", repos = "https://cran.r-project.org")
if (!require("knitr")) install.packages("knitr", repos = "https://cran.r-project.org")
if (!require("kableExtra")) install.packages("kableExtra", repos = "https://cran.r-project.org")
library(FactoMineR)
library(factoextra)
library(readxl)
library(knitr)
library(kableExtra)
# Чтение данных
data <- read_excel("climat.xlsx")
# Проверка структуры — столбцы V16
v16_cols <- grep("^V16_[0-9]+$", names(data), value = TRUE)
cat("Найдены столбцы V16:", v16_cols, "\n")
## Найдены столбцы V16: V16_1 V16_2 V16_3 V16_4 V16_5 V16_6 V16_7 V16_8 V16_9 V16_88
cat("Количество наблюдений:", nrow(data), "\n")
## Количество наблюдений: 913
Комментарий: Загружен датасет из 913 наблюдений. Переменные V16_1 — V16_9 содержат бинарные ответы (0/1) на вопрос о частоте природных явлений летом. V16_88 исключена, так как это категория «другое» с текстовыми ответами.
# Исключаем V16_88 (другое) — оставляем V16_1..V16_9
v16_items <- paste0("V16_", 1:9)
# Метки природных явлений (для интерпретации)
# На основе типичной структуры анкет о климате
labels_v16 <- c(
"V16_1" = "Жара/зной",
"V16_2" = "Засуха",
"V16_3" = "Ливни/грозы",
"V16_4" = "Град",
"V16_5" = "Наводнения",
"V16_6" = "Лесные пожары",
"V16_7" = "Сильный ветер",
"V16_8" = "Пыльные бури",
"V16_9" = "Заморозки"
)
# Метки регионов
labels_region <- c(
"1" = "Регион 1",
"2" = "Регион 2",
"3" = "Регион 3"
)
# Приводим к числовому формату и убираем пропуски
data_v16 <- data[, c("Region", v16_items)]
data_v16 <- data_v16[complete.cases(data_v16), ]
data_v16$Region <- as.character(data_v16$Region)
# Исключаем регион 4 (недостаточно данных по V16)
data_v16 <- data_v16[data_v16$Region %in% c("1", "2", "3"), ]
# Строим таблицу сопряжённости: строки = регион, столбцы = V16 явления
ct <- as.data.frame.matrix(
aggregate(. ~ Region, data = data_v16, FUN = sum)[, -1]
)
rownames(ct) <- paste0("Регион ", sort(unique(data_v16$Region)))
# Переименовываем столбцы
colnames(ct) <- labels_v16[v16_items]
kable(ct, caption = "Таблица 1 — Таблица сопряжённости: Регион × Природные явления (V16)") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
| Жара/зной | Засуха | Ливни/грозы | Град | Наводнения | Лесные пожары | Сильный ветер | Пыльные бури | Заморозки | |
|---|---|---|---|---|---|---|---|---|---|
| Регион 1 | 65 | 107 | 165 | 2 | 19 | 7 | 80 | 73 | 57 |
| Регион 2 | 202 | 140 | 152 | 37 | 123 | 66 | 233 | 118 | 71 |
| Регион 3 | 59 | 43 | 75 | 18 | 31 | 7 | 93 | 30 | 14 |
Комментарий: Таблица сопряжённости показывает, сколько респондентов в каждом регионе отметили то или иное природное явление как ставшее более частым. Это входные данные для анализа соответствий.
# Профили строк (доли по строкам)
row_profiles <- round(prop.table(as.matrix(ct), margin = 1) * 100, 1)
kable(row_profiles, caption = "Таблица 2 — Профили строк (доли по регионам, %)") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
| Жара/зной | Засуха | Ливни/грозы | Град | Наводнения | Лесные пожары | Сильный ветер | Пыльные бури | Заморозки | |
|---|---|---|---|---|---|---|---|---|---|
| Регион 1 | 11.3 | 18.6 | 28.7 | 0.3 | 3.3 | 1.2 | 13.9 | 12.7 | 9.9 |
| Регион 2 | 17.7 | 12.3 | 13.3 | 3.2 | 10.8 | 5.8 | 20.4 | 10.3 | 6.2 |
| Регион 3 | 15.9 | 11.6 | 20.3 | 4.9 | 8.4 | 1.9 | 25.1 | 8.1 | 3.8 |
# Профили столбцов (доли по столбцам)
col_profiles <- round(prop.table(as.matrix(ct), margin = 2) * 100, 1)
kable(col_profiles, caption = "Таблица 3 — Профили столбцов (доли по явлениям, %)") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
| Жара/зной | Засуха | Ливни/грозы | Град | Наводнения | Лесные пожары | Сильный ветер | Пыльные бури | Заморозки | |
|---|---|---|---|---|---|---|---|---|---|
| Регион 1 | 19.9 | 36.9 | 42.1 | 3.5 | 11.0 | 8.8 | 19.7 | 33.0 | 40.1 |
| Регион 2 | 62.0 | 48.3 | 38.8 | 64.9 | 71.1 | 82.5 | 57.4 | 53.4 | 50.0 |
| Регион 3 | 18.1 | 14.8 | 19.1 | 31.6 | 17.9 | 8.8 | 22.9 | 13.6 | 9.9 |
Комментарий: Профили строк показывают распределение ответов внутри каждого региона. Профили столбцов — как каждое явление распределено между регионами. Различия в профилях — основа для анализа соответствий.
# Тест хи-квадрат на независимость строк и столбцов
chi_test <- chisq.test(ct)
cat("Хи-квадрат:", round(chi_test$statistic, 2), "\n")
## Хи-квадрат: 175.7
cat("Степени свободы:", chi_test$parameter, "\n")
## Степени свободы: 16
cat("p-value:", format(chi_test$p.value, scientific = TRUE, digits = 3), "\n")
## p-value: 6.11e-29
Комментарий: Тест хи-квадрат проверяет, существует ли статистически значимая связь между регионом и типом природного явления. Если p-value < 0.05, связь значима и анализ соответствий имеет смысл.
# Выполнение анализа соответствий
res.ca <- CA(ct, graph = FALSE)
Комментарий: Анализ соответствий выполнен с помощью
функции CA() из пакета FactoMineR. Метод
разлагает таблицу сопряжённости на главные измерения, которые объясняют
отклонения наблюдаемых частот от ожидаемых (при условии
независимости).
eig <- get_eigenvalue(res.ca)
kable(round(eig, 4), caption = "Таблица 4 — Собственные значения и объяснённая инерция") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
| eigenvalue | variance.percent | cumulative.variance.percent | |
|---|---|---|---|
| Dim.1 | 0.0709 | 84.1568 | 84.1568 |
| Dim.2 | 0.0133 | 15.8432 | 100.0000 |
fviz_screeplot(res.ca, addlabels = TRUE,
main = "Собственные значения: доли инерции",
xlab = "Измерение", ylab = "Процент инерции") +
theme_minimal()
Рис. 1 — Доли объяснённой инерции по измерениям
Комментарий: Инерция — аналог дисперсии в анализе соответствий. Она измеряет общую силу связи между строками и столбцами. Первое измерение объясняет наибольшую долю инерции.
# Координаты строк
row_coord <- res.ca$row$coord
kable(round(row_coord, 4), caption = "Таблица 5 — Координаты регионов") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
| Dim 1 | Dim 2 | |
|---|---|---|
| Регион 1 | -0.4269 | 0.0276 |
| Регион 2 | 0.1886 | 0.0659 |
| Регион 3 | 0.0815 | -0.2463 |
# Вклады строк
row_contrib <- res.ca$row$contrib
kable(round(row_contrib, 2), caption = "Таблица 6 — Вклады регионов в измерения (%)") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
| Dim 1 | Dim 2 | |
|---|---|---|
| Регион 1 | 70.88 | 1.57 |
| Регион 2 | 27.46 | 17.82 |
| Регион 3 | 1.66 | 80.61 |
# Качество представления строк
row_cos2 <- res.ca$row$cos2
kable(round(row_cos2, 4), caption = "Таблица 7 — Качество представления регионов (cos²)") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
| Dim 1 | Dim 2 | |
|---|---|---|
| Регион 1 | 0.9959 | 0.0041 |
| Регион 2 | 0.8911 | 0.1089 |
| Регион 3 | 0.0987 | 0.9013 |
Комментарий: Координаты показывают положение каждого региона в пространстве соответствий. Вклады — какой регион больше всего определяет данное измерение. Cos² — насколько хорошо регион представлен в пространстве выбранных измерений.
# Координаты столбцов
col_coord <- res.ca$col$coord
kable(round(col_coord, 4), caption = "Таблица 8 — Координаты природных явлений") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
| Dim 1 | Dim 2 | |
|---|---|---|
| Жара/зной | 0.1745 | 0.0153 |
| Засуха | -0.2044 | 0.0474 |
| Ливни/грозы | -0.3419 | -0.0862 |
| Град | 0.5002 | -0.2945 |
| Наводнения | 0.3824 | 0.0499 |
| Лесные пожары | 0.4709 | 0.3051 |
| Сильный ветер | 0.1606 | -0.1139 |
| Пыльные бури | -0.1100 | 0.0941 |
| Заморозки | -0.2595 | 0.1709 |
# Вклады столбцов
col_contrib <- res.ca$col$contrib
kable(round(col_contrib, 2), caption = "Таблица 9 — Вклады явлений в измерения (%)") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
| Dim 1 | Dim 2 | |
|---|---|---|
| Жара/зной | 6.72 | 0.27 |
| Засуха | 8.20 | 2.34 |
| Ливни/грозы | 30.98 | 10.47 |
| Град | 9.65 | 17.76 |
| Наводнения | 17.10 | 1.55 |
| Лесные пожары | 12.00 | 26.76 |
| Сильный ветер | 7.08 | 18.92 |
| Пыльные бури | 1.81 | 7.03 |
| Заморозки | 6.46 | 14.90 |
# Качество представления столбцов
col_cos2 <- res.ca$col$cos2
kable(round(col_cos2, 4), caption = "Таблица 10 — Качество представления явлений (cos²)") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
| Dim 1 | Dim 2 | |
|---|---|---|
| Жара/зной | 0.9924 | 0.0076 |
| Засуха | 0.9490 | 0.0510 |
| Ливни/грозы | 0.9402 | 0.0598 |
| Град | 0.7426 | 0.2574 |
| Наводнения | 0.9833 | 0.0167 |
| Лесные пожары | 0.7042 | 0.2958 |
| Сильный ветер | 0.6654 | 0.3346 |
| Пыльные бури | 0.5775 | 0.4225 |
| Заморозки | 0.6974 | 0.3026 |
Комментарий: Аналогичные показатели для столбцов (природных явлений). Явления с высоким вкладом в определённое измерение — ключевые для интерпретации этого измерения. Близость явления к региону на карте указывает на их ассоциацию.
fviz_ca_row(res.ca,
repel = TRUE,
col.row = "#CC3333",
title = "Карта регионов",
xlab = paste0("Dim 1 (", round(eig[1, 2], 1), "%)"),
ylab = paste0("Dim 2 (", round(eig[2, 2], 1), "%)")) +
theme_minimal()
Рис. 2 — Карта регионов в пространстве CA
Комментарий: Карта строк показывает, как регионы различаются по профилю ответов на вопрос о природных явлениях. Удалённые друг от друга регионы имеют наиболее различающиеся паттерны ответов.
fviz_ca_col(res.ca,
repel = TRUE,
col.col = "#5C6B3C",
title = "Карта природных явлений",
xlab = paste0("Dim 1 (", round(eig[1, 2], 1), "%)"),
ylab = paste0("Dim 2 (", round(eig[2, 2], 1), "%)")) +
theme_minimal()
Рис. 3 — Карта природных явлений в пространстве CA
Комментарий: Карта столбцов показывает, как природные явления группируются в пространстве соответствий. Близко расположенные явления имеют сходный профиль распределения по регионам.
fviz_ca_biplot(res.ca,
repel = TRUE,
col.row = "#CC3333",
col.col = "#5C6B3C",
title = "Биплот: регионы × природные явления (V16)",
xlab = paste0("Dim 1 (", round(eig[1, 2], 1), "%)"),
ylab = paste0("Dim 2 (", round(eig[2, 2], 1), "%)")) +
theme_minimal()
Рис. 4 — Биплот: регионы и природные явления
Комментарий: Биплот — ключевая визуализация анализа соответствий. Он совмещает регионы (красные точки) и природные явления (зелёные точки) в общем пространстве. Близость региона к явлению означает, что в данном регионе это явление отмечается чаще, чем в среднем по выборке. Удалённость от центра (начала координат) указывает на выраженное отклонение от среднего профиля.
fviz_contrib(res.ca, choice = "col", axes = 1,
title = "Вклады явлений в измерение 1") +
theme_minimal()
Рис. 5 — Вклады природных явлений в измерение 1
fviz_contrib(res.ca, choice = "col", axes = 2,
title = "Вклады явлений в измерение 2") +
theme_minimal()
Рис. 6 — Вклады природных явлений в измерение 2
Комментарий: Столбиковые диаграммы вкладов показывают, какие явления больше всего определяют каждое измерение. Красная пунктирная линия — порог равномерного вклада. Явления выше линии вносят вклад выше среднего.
summary(res.ca)
##
## Call:
## CA(X = ct, graph = FALSE)
##
## The chi square of independence between the two variables is equal to 175.7025 (p-value = 6.110692e-29 ).
##
## Eigenvalues
## Dim.1 Dim.2
## Variance 0.071 0.013
## % of var. 84.157 15.843
## Cumulative % of var. 84.157 100.000
##
## Rows
## Iner*1000 Dim.1 ctr cos2 Dim.2 ctr cos2
## Регион 1 | 50.428 | -0.427 70.880 0.996 | 0.028 1.569 0.004 |
## Регион 2 | 21.831 | 0.189 27.458 0.891 | 0.066 17.822 0.109 |
## Регион 3 | 11.930 | 0.082 1.662 0.099 | -0.246 80.609 0.901 |
##
## Columns
## Iner*1000 Dim.1 ctr cos2 Dim.2 ctr cos2
## Жара/зной | 4.796 | 0.175 6.717 0.992 | 0.015 0.274 0.008 |
## Засуха | 6.119 | -0.204 8.195 0.949 | 0.047 2.339 0.051 |
## Ливни/грозы | 23.348 | -0.342 30.983 0.940 | -0.086 10.471 0.060 |
## Град | 9.204 | 0.500 9.647 0.743 | -0.295 17.763 0.257 |
## Наводнения | 12.325 | 0.382 17.105 0.983 | 0.050 1.546 0.017 |
## Лесные пожары | 12.068 | 0.471 11.995 0.704 | 0.305 26.758 0.296 |
## Сильный ветер | 7.543 | 0.161 7.084 0.665 | -0.114 18.919 0.335 |
## Пыльные бури | 2.219 | -0.110 1.809 0.578 | 0.094 7.028 0.422 |
## Заморозки | 6.568 | -0.259 6.465 0.697 | 0.171 14.901 0.303 |
Основные выводы:
Тест хи-квадрат подтверждает статистически значимую связь между регионом проживания и восприятием участившихся природных явлений.
Первое измерение объясняет основную долю инерции и, вероятно, отражает различие между регионами по типу доминирующих климатических угроз (например, засуха/жара vs. ветер/осадки).
Второе измерение может отражать более тонкие различия, связанные с редкими явлениями (град, лесные пожары).
Биплот позволяет наглядно определить, какие природные явления ассоциируются с какими регионами, что имеет практическое значение для адаптации к климатическим изменениям.
Анализ соответствий эффективно снижает размерность таблицы сопряжённости, сохраняя ключевую информацию о связи между регионами и природными явлениями.
Анализ выполнен с использованием пакетов FactoMineR и factoextra в R.