1. Введение и постановка задачи

Переменная V16 — это вопрос с множественным выбором: «Какие природные явления стали более частыми в летний период?»

Ответы закодированы как бинарные переменные V16_1 – V16_9 (0/1), где каждый пункт соответствует определённому природному явлению. Для анализа соответствий строится таблица сопряжённости «Регион и Природное явление».

2. Загрузка данных и подготовка

# Установка и загрузка пакетов
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 исключена, так как это категория «другое» с текстовыми ответами.

3. Построение таблицы сопряжённости

# Исключаем 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 — Таблица сопряжённости: Регион × Природные явления (V16)
Жара/зной Засуха Ливни/грозы Град Наводнения Лесные пожары Сильный ветер Пыльные бури Заморозки
Регион 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

Комментарий: Таблица сопряжённости показывает, сколько респондентов в каждом регионе отметили то или иное природное явление как ставшее более частым. Это входные данные для анализа соответствий.

4. Профили строк и столбцов

# Профили строк (доли по строкам)
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)
Таблица 2 — Профили строк (доли по регионам, %)
Жара/зной Засуха Ливни/грозы Град Наводнения Лесные пожары Сильный ветер Пыльные бури Заморозки
Регион 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)
Таблица 3 — Профили столбцов (доли по явлениям, %)
Жара/зной Засуха Ливни/грозы Град Наводнения Лесные пожары Сильный ветер Пыльные бури Заморозки
Регион 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

Комментарий: Профили строк показывают распределение ответов внутри каждого региона. Профили столбцов — как каждое явление распределено между регионами. Различия в профилях — основа для анализа соответствий.

5. Тест хи-квадрат

# Тест хи-квадрат на независимость строк и столбцов
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, связь значима и анализ соответствий имеет смысл.

6. Анализ соответствий (CA)

# Выполнение анализа соответствий
res.ca <- CA(ct, graph = FALSE)

Комментарий: Анализ соответствий выполнен с помощью функции CA() из пакета FactoMineR. Метод разлагает таблицу сопряжённости на главные измерения, которые объясняют отклонения наблюдаемых частот от ожидаемых (при условии независимости).

7. Собственные значения и инерция

eig <- get_eigenvalue(res.ca)

kable(round(eig, 4), caption = "Таблица 4 — Собственные значения и объяснённая инерция") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Таблица 4 — Собственные значения и объяснённая инерция
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 — Доли объяснённой инерции по измерениям

Рис. 1 — Доли объяснённой инерции по измерениям

Комментарий: Инерция — аналог дисперсии в анализе соответствий. Она измеряет общую силу связи между строками и столбцами. Первое измерение объясняет наибольшую долю инерции.

8. Результаты по строкам (регионам)

# Координаты строк
row_coord <- res.ca$row$coord
kable(round(row_coord, 4), caption = "Таблица 5 — Координаты регионов") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Таблица 5 — Координаты регионов
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)
Таблица 6 — Вклады регионов в измерения (%)
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)
Таблица 7 — Качество представления регионов (cos²)
Dim 1 Dim 2
Регион 1 0.9959 0.0041
Регион 2 0.8911 0.1089
Регион 3 0.0987 0.9013

Комментарий: Координаты показывают положение каждого региона в пространстве соответствий. Вклады — какой регион больше всего определяет данное измерение. Cos² — насколько хорошо регион представлен в пространстве выбранных измерений.

9. Результаты по столбцам (природным явлениям)

# Координаты столбцов
col_coord <- res.ca$col$coord
kable(round(col_coord, 4), caption = "Таблица 8 — Координаты природных явлений") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Таблица 8 — Координаты природных явлений
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)
Таблица 9 — Вклады явлений в измерения (%)
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)
Таблица 10 — Качество представления явлений (cos²)
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

Комментарий: Аналогичные показатели для столбцов (природных явлений). Явления с высоким вкладом в определённое измерение — ключевые для интерпретации этого измерения. Близость явления к региону на карте указывает на их ассоциацию.

10. Визуализации

10.1. Карта строк (регионов)

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

Рис. 2 — Карта регионов в пространстве CA

Комментарий: Карта строк показывает, как регионы различаются по профилю ответов на вопрос о природных явлениях. Удалённые друг от друга регионы имеют наиболее различающиеся паттерны ответов.

10.2. Карта столбцов (природных явлений)

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

Рис. 3 — Карта природных явлений в пространстве CA

Комментарий: Карта столбцов показывает, как природные явления группируются в пространстве соответствий. Близко расположенные явления имеют сходный профиль распределения по регионам.

10.3. Биплот (совмещённая карта)

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 — Биплот: регионы и природные явления

Рис. 4 — Биплот: регионы и природные явления

Комментарий: Биплот — ключевая визуализация анализа соответствий. Он совмещает регионы (красные точки) и природные явления (зелёные точки) в общем пространстве. Близость региона к явлению означает, что в данном регионе это явление отмечается чаще, чем в среднем по выборке. Удалённость от центра (начала координат) указывает на выраженное отклонение от среднего профиля.

11. Вклады в измерения

fviz_contrib(res.ca, choice = "col", axes = 1,
             title = "Вклады явлений в измерение 1") +
  theme_minimal()
Рис. 5 — Вклады природных явлений в измерение 1

Рис. 5 — Вклады природных явлений в измерение 1

fviz_contrib(res.ca, choice = "col", axes = 2,
             title = "Вклады явлений в измерение 2") +
  theme_minimal()
Рис. 6 — Вклады природных явлений в измерение 2

Рис. 6 — Вклады природных явлений в измерение 2

Комментарий: Столбиковые диаграммы вкладов показывают, какие явления больше всего определяют каждое измерение. Красная пунктирная линия — порог равномерного вклада. Явления выше линии вносят вклад выше среднего.

12. Сводка и выводы

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 |

Основные выводы:

  1. Тест хи-квадрат подтверждает статистически значимую связь между регионом проживания и восприятием участившихся природных явлений.

  2. Первое измерение объясняет основную долю инерции и, вероятно, отражает различие между регионами по типу доминирующих климатических угроз (например, засуха/жара vs. ветер/осадки).

  3. Второе измерение может отражать более тонкие различия, связанные с редкими явлениями (град, лесные пожары).

  4. Биплот позволяет наглядно определить, какие природные явления ассоциируются с какими регионами, что имеет практическое значение для адаптации к климатическим изменениям.

  5. Анализ соответствий эффективно снижает размерность таблицы сопряжённости, сохраняя ключевую информацию о связи между регионами и природными явлениями.


Анализ выполнен с использованием пакетов FactoMineR и factoextra в R.