Описательная статистика R Климова

Материал из Поле цифровой дидактики

Использование R в описательной статистике

Проанализируем очищенный от служебного текста текст статьи из Википедии, посвящённой аниме. https://ru.wikipedia.org/wiki/Аниме

Код программы

library(tidyverse)
library(tidytext)
library(ggplot2)

cat("Загрузка данных из файла...\n")
text <- readLines("Аниме.txt", encoding = "UTF-8") %>%
  paste(collapse = "\n")

if (!grepl("[.!?]$", text)) {
  text <- paste0(text, ".")
}

cat("✅ Статья загружена\n")
cat("Размер текста:", nchar(text), "символов\n")
cat("Количество строк:", str_count(text, "\n") + 1, "\n\n")

tokens_df <- data.frame(text = text) %>%
  unnest_tokens(word, text) %>%
  # Убираем стоп-слова
  anti_join(data.frame(word = stopwords::stopwords("ru")), by = "word") %>%
  # Убираем числа и слишком короткие слова (1-2 символа)
  filter(!str_detect(word, "^[0-9]+$"), str_length(word) > 2)

cat("=== 1. ОБЩАЯ СТАТИСТИКА ===\n")
total_tokens <- nrow(tokens_df)
unique_tokens <- n_distinct(tokens_df$word)
ttr <- unique_tokens / total_tokens * 100

cat("Всего слов (токенов):", total_tokens, "\n")
cat("Уникальных слов:", unique_tokens, "\n")
cat(sprintf("Type-Token Ratio (TTR): %.2f%%\n\n", ttr))

word_freq <- tokens_df %>%
  count(word, sort = TRUE) %>%
  mutate(percentage = n / sum(n) * 100)

cat("=== 2. ТОП-30 САМЫХ ЧАСТОТНЫХ СЛОВ ===\n")
print(word_freq %>% head(30))

p1 <- ggplot(word_freq %>% head(20), aes(x = reorder(word, n), y = n)) +
  geom_bar(stat = "identity", fill = "steelblue") +
  coord_flip() +
  labs(title = "Топ-20 самых частотных слов в статье «Аниме»",
       x = "Слово", y = "Частота") +
  theme_minimal()
print(p1)

bigrams_df <- data.frame(text = text) %>%
  unnest_tokens(bigram, text, token = "ngrams", n = 2) %>%
  separate(bigram, c("word1", "word2"), sep = " ") %>%
  filter(!word1 %in% stopwords::stopwords("ru"),
         !word2 %in% stopwords::stopwords("ru"),
         str_length(word1) > 2, str_length(word2) > 2) %>%
  count(word1, word2, sort = TRUE)

cat("\n=== 3. ТОП-20 БИГРАММ ===\n")
print(bigrams_df %>% head(20))

sentences_df <- data.frame(text = text) %>%
  mutate(sentences = str_split(text, "[.!?;]+")) %>%
  unnest(sentences) %>%
  mutate(
    sentence = trimws(sentences),
    word_count = str_count(sentence, "\\S+")
  ) %>%
  filter(word_count > 0)

cat("\n=== 4. СТАТИСТИКА ДЛИНЫ ПРЕДЛОЖЕНИЙ ===\n")
cat(sprintf("Средняя длина предложения: %.2f слов\n", mean(sentences_df$word_count)))
cat(sprintf("Медианная длина предложения: %.0f слов\n", median(sentences_df$word_count)))
cat(sprintf("Минимальная длина: %d слов\n", min(sentences_df$word_count)))
cat(sprintf("Максимальная длина: %d слов\n", max(sentences_df$word_count)))
cat(sprintf("Стандартное отклонение: %.2f\n", sd(sentences_df$word_count)))

p2 <- ggplot(sentences_df, aes(x = 1, y = word_count)) +
  geom_boxplot(fill = "lightblue") +
  labs(title = "Распределение длины предложений в статье «Аниме»",
       x = "", y = "Количество слов в предложении") +
  theme_minimal() +
  theme(axis.text.x = element_blank())
print(p2)

p3 <- ggplot(sentences_df, aes(x = word_count)) +
  geom_histogram(binwidth = 5, fill = "steelblue", color = "white") +
  labs(title = "Гистограмма длины предложений",
       x = "Длина предложения (слова)", y = "Частота") +
  theme_minimal()
print(p3)

cat("\n=== АНАЛИЗ ЗАВЕРШЕН! ===\n")

Вывод программы

Загрузка данных из файла... ✅ Статья загружена Размер текста: 40503 символов Количество строк: 1

1. ОБЩАЯ СТАТИСТИКА

Всего слов (токенов): 3955 Уникальных слов: 2455 Type-Token Ratio (TTR): 62.07%

2. ТОП-30 САМЫХ ЧАСТОТНЫХ СЛОВ

1         аниме 149  3.7673831
2        обычно  34  0.8596713
3    персонажей  23  0.5815424
4         также  19  0.4804046
5       сериала  18  0.4551201
6         серий  16  0.4045512
7      например  15  0.3792668
8  произведения  15  0.3792668
9         серии  15  0.3792668
10       японии  15  0.3792668
11          ova  14  0.3539823
12     анимации  14  0.3539823
13         году  14  0.3539823
14    аудитории  13  0.3286979
15     сериалов  12  0.3034134
16        часто  12  0.3034134
17       волосы  11  0.2781290
18        могут  11  0.2781290
19       сериал  11  0.2781290
20        часть  11  0.2781290
21     являются  11  0.2781290
22         англ  10  0.2528445
23 используется  10  0.2528445
24        манги  10  0.2528445
25      сериалы  10  0.2528445
26        глаза   9  0.2275601
27      зрителя   9  0.2275601
28        слово   9  0.2275601
29       сюжета   9  0.2275601
30     японской   9  0.2275601

3. ТОП-20 БИГРАММ

1  представляет     собой 5
2         аниме    обычно 4
3         аниме  сериалов 4
4       главных    героев 4
5        других     стран 4
6         слово     аниме 4
7       целевой аудитории 4
8         часть     аниме 4
9      японской  анимации 4
10    animation  анимация 3
11     nбольшая     часть 3
12      shounen adventure 3
13          the     shell 3
14        аниме   сериалы 3
15        аниме      стал 3
16        имеют     глаза 3
17        одной     серии 3
18       сейлор       мун 3
19     японском     языке 3
20         1996      году 2

4. СТАТИСТИКА ДЛИНЫ ПРЕДЛОЖЕНИЙ

Средняя длина предложения: 16.63 слов
Медианная длина предложения: 15 слов
Минимальная длина: 1 слов
Максимальная длина: 56 слов
Стандартное отклонение: 9.31

Анализ текста статьи

Общая статистика

Показатель Значение
Объём текста 40 503 символа
Всего слов (токенов) 3 955
Уникальных слов 2 455
Type-Token Ratio (TTR) 62.07%

Вывод: TTR = 62,07% — очень высокий показатель лексического разнообразия. Для текста объёмом почти 4 000 слов это означает, что статья написана богатым языком с активным использованием разнообразной терминологии, что характерно для энциклопедических статей.

Топ-10 самых частотных слов

Ранг Слово Частота Доля
1 аниме 149 3,77%
2 обычно 34 0,86%
3 персонажей 23 0,58%
4 также 19 0,48%
5 сериала 18 0,46%
6 серий 16 0,40%
7 например 15 0,38%
8 произведения 15 0,38%
9 серии 15 0,38%
10 японии 15 0,38%

Группы характерных слов по темам

Форматы и структура:

  • сериала (18), серий (16), серии (15), сериалов (12), сериал (11), сериалы (10)
  • OVA (14)
  • фильм

Персонажи и визуальный стиль:

  • персонажей (23), персонажи
  • волосы (11), глаза (9)
  • рисунок

Аудитория и восприятие:

  • аудитории (13), зрителя (9)

Временные маркеры:

  • году (14) — указание на исторические даты

Язык и терминология:

  • англ (10) — англоязычные термины
  • слово (9) — лингвистический комментарий

Наиболее устойчивые биграммы

Биграмма Частота Интерпретация
представляет собой 5 Ввод определений
аниме обычно 4 Обобщающие утверждения
аниме сериалов 4 Указание на формат
главных героев 4 Описание персонажей
других стран 4 Сравнительный контекст
слово аниме 4 Этимологический комментарий
целевой аудитории 4 Маркетинговая/социологическая рамка
японской анимации 4 Уточнение происхождения
shounen adventure 3 Жанровая терминология
сейлор мун 3 Конкретный пример

Статистика длины предложений

Показатель Значение Интерпретация
Средняя длина 16,63 слов Оптимальная для научно-публицистического текста
Медианная длина 15 слов Половина предложений короче 15 слов
Минимальная длина 1 слово Короткие вставки, восклицания, подписи
Максимальная длина 56 слов Сложные предложения с перечислениями
Стандартное отклонение 9,31 Большой разброс — от очень коротких до длинных

Итоговые выводы

  1. Тематическое ядро статьи составляют слова: аниме, сериал, персонажи, Япония, анимация. Это полностью соответствует теме.
  1. Высокий TTR (62%) свидетельствует о:
    • профессиональном, литературном стиле изложения;
    • отсутствии навязчивых повторений;
    • широком охвате темы (история, эстетика, форматы, распространение).
  1. Частотность слов обычно, например, также указывает на:
    • обобщающий, энциклопедический характер;
    • богатую иллюстративную базу (примеры);
    • логически связное изложение.
  1. Биграммы показывают, что статья:
    • даёт определения («представляет собой»);
    • сравнивает с другими странами;
    • использует профессиональную жанровую терминологию («shounen adventure»);
    • приводит конкретные примеры («сейлор мун»).
  1. Длина предложений (средняя 17 слов, максимум 56) типична для русскоязычного научно-публицистического текста. Наличие как коротких, так и длинных предложений делает текст динамичным, но местами сложным для восприятия.