Описательная статистика R Карпов
Использование R в описательной статистике
Проанализируем очищенный от служебного текста текст статьи из Википедии, посвящённой интернету вещей. https://ru.wikipedia.org/wiki/Интернет_вещей
Код программы
# Подключаем библиотеки
library(tidyverse)
library(tidytext)
library(wordcloud)
library(ggplot2)
# Читаем текст
text_data <- read_lines("topic.txt") %>%
enframe(name = "line", value = "text")
# Добавляем разделы для группировки
sections <- text_data %>%
mutate(section = ifelse(str_detect(text, "^(История|Технологии|Приложения|Тенденции|Прогнозы|Литература|Ссылки)$"), text, NA)) %>%
fill(section, .direction = "down") %>%
filter(!is.na(section), section != text, text != "")
# Токенизация
tokens <- sections %>%
unnest_tokens(word, text) %>%
anti_join(stop_words, by = "word") %>%
filter(!str_detect(word, "[0-9]+")) # убираем числа
# ============================================
# 1. Type-Token Ratio
# ============================================
total_words <- nrow(tokens)
unique_words <- n_distinct(tokens$word)
tt_ratio <- unique_words / total_words * 100
cat("Общее количество слов:", total_words, "\n")
cat("Уникальных слов:", unique_words, "\n")
cat("Type-Token Ratio:", round(tt_ratio, 2), "%\n\n")
# ============================================
# 2. Частотный анализ (топ-20 слов)
# ============================================
word_freq <- tokens %>%
count(word, sort = TRUE)
cat("Топ-20 самых частотных слов:\n")
print(word_freq %>% head(20))
# Визуализация топ-20 слов
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)
# Облако слов
set.seed(123)
wordcloud(words = word_freq$word,
freq = word_freq$n,
max.words = 100,
random.order = FALSE,
colors = brewer.pal(8, "Dark2"))
# ============================================
# 3. Биграммы (частоты пар слов)
# ============================================
bigrams <- sections %>%
unnest_tokens(bigram, text, token = "ngrams", n = 2) %>%
separate(bigram, c("word1", "word2"), sep = " ") %>%
filter(!word1 %in% stop_words$word,
!word2 %in% stop_words$word) %>%
count(word1, word2, sort = TRUE)
cat("\nТоп-15 самых частотных биграмм:\n")
print(bigrams %>% head(15))
# Визуализация топ-15 биграмм
bigrams_plot <- bigrams %>%
head(15) %>%
unite(bigram, word1, word2, sep = " ") %>%
ggplot(aes(x = reorder(bigram, n), y = n)) +
geom_bar(stat = "identity", fill = "coral") +
coord_flip() +
labs(title = "Топ-15 биграмм", x = "Биграмма", y = "Частота") +
theme_minimal()
print(bigrams_plot)
# Тепловая карта биграмм (матрица)
bigram_matrix <- bigrams %>%
head(30) %>%
mutate(word1 = as.factor(word1),
word2 = as.factor(word2))
if(nrow(bigram_matrix) > 0) {
p_heatmap <- ggplot(bigram_matrix, aes(x = word1, y = word2, fill = n)) +
geom_tile() +
scale_fill_gradient(low = "white", high = "red") +
labs(title = "Тепловая карта биграмм") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
print(p_heatmap)
}
# ============================================
# 4. Сравнение частот между разделами
# ============================================
section_word_freq <- tokens %>%
filter(section %in% c("История", "Технологии", "Приложения")) %>%
count(section, word, sort = TRUE) %>%
group_by(section) %>%
top_n(10, n) %>%
ungroup()
p_sections <- ggplot(section_word_freq, aes(x = reorder(word, n), y = n, fill = section)) +
geom_bar(stat = "identity", position = "dodge") +
facet_wrap(~section, scales = "free") +
coord_flip() +
labs(title = "Топ-10 слов по разделам", x = "Слово", y = "Частота") +
theme_minimal()
print(p_sections)
# ============================================
# 5. Статистика по разделам (исправленная)
# ============================================
section_stats <- tokens %>%
group_by(section) %>%
summarise(
total_words = n(),
unique_words = n_distinct(word),
tt_ratio = unique_words / total_words * 100
) %>%
arrange(desc(total_words))
cat("\nСтатистика по разделам:\n")
print(section_stats)
# Визуализация TTR по разделам
p_ttr <- ggplot(section_stats, aes(x = reorder(section, tt_ratio), y = tt_ratio, fill = section)) +
geom_bar(stat = "identity") +
coord_flip() +
labs(title = "Лексическое разнообразие (TTR) по разделам",
x = "Раздел", y = "Type-Token Ratio (%)") +
theme_minimal() +
theme(legend.position = "none")
print(p_ttr)
# ============================================
# 6. Распределение длин предложений
# ============================================
sentence_lengths <- sections %>%
mutate(sentence = str_extract_all(text, "[^.!?]+")) %>%
unnest(sentence) %>%
mutate(length = str_count(sentence, "\\w+")) %>%
filter(length > 0)
# Boxplot длины предложений
p_boxplot <- ggplot(sentence_lengths, aes(x = section, y = length, fill = section)) +
geom_boxplot() +
coord_flip() +
labs(title = "Распределение длины предложений по разделам",
x = "Раздел", y = "Количество слов в предложении") +
theme_minimal() +
theme(legend.position = "none")
print(p_boxplot)
# Гистограмма общей длины предложений
p_hist <- ggplot(sentence_lengths, aes(x = length)) +
geom_histogram(binwidth = 5, fill = "steelblue", color = "white") +
labs(title = "Распределение длины предложений",
x = "Длина предложения (слова)", y = "Частота") +
theme_minimal()
print(p_hist)
# ============================================
# 7. Дополнительная статистика
# ============================================
cat("\n=== Общая статистика текста ===\n")
cat("Количество разделов:", n_distinct(tokens$section), "\n")
cat("Средняя длина предложения:", round(mean(sentence_lengths$length), 2), "слов\n")
cat("Медианная длина предложения:", median(sentence_lengths$length), "слов\n")
cat("Минимальная длина предложения:", min(sentence_lengths$length), "слов\n")
cat("Максимальная длина предложения:", max(sentence_lengths$length), "слов\n")
# Наиболее частотные слова в каждом разделе
cat("\n=== Наиболее характерные слова по разделам ===\n")
top_words_by_section <- tokens %>%
group_by(section) %>%
count(word) %>%
top_n(5, n) %>%
arrange(section, desc(n))
print(top_words_by_section)
Вывод программы
Общее количество слов: 4137 Уникальных слов: 1941 Type-Token Ratio: 46.92 %
Топ-20 самых частотных слов:
1 и 170 2 в 147 3 вещей 89 4 для 87 5 интернета 64 6 на 51 7 с 51 8 как 47 9 к 37 10 или 31 11 также 28 12 могут 23 13 по 23 14 может 22 15 системы 22 16 данных 21 17 устройств 21 18 интернет 19 19 которые 19 20 устройства 19
Топ-15 самых частотных биграмм:
1 интернета вещей 64 2 интернет вещей 12 3 вещей в 10 4 с помощью 10 5 а также 9 6 такие как 9 7 могут быть 8 8 может быть 8 9 устройства интернета 7 10 в этом 6 11 для обеспечения 6 12 за счет 6 13 передачи данных 6 14 таких как 6 15 умного дома 6
Статистика по разделам: 1 Приложения 3369 1596 47.4 2 Технологии 404 275 68.1 3 История 364 279 76.6
Общая статистика текста
Количество разделов: 3 Средняя длина предложения: 20.57 слов Медианная длина предложения: 20 слов Минимальная длина предложения: 1 слов Максимальная длина предложения: 91 слов
Наиболее характерные слова по разделам
1 История в 15 2 История вещей 11 3 История и 11 4 История как 8 5 История с 7 6 Приложения и 154 7 Приложения в 118 8 Приложения для 75 9 Приложения вещей 69 10 Приложения интернета 54 11 Технологии в 14 12 Технологии вещей 9 13 Технологии для 9 14 Технологии как 8 15 Технологии средства 7
Результаты анализа
Текст обладает достаточно высоким лексическим разнообразием (почти половина слов уникальны). Это характерно для научно-технических статей, где используется разнообразная терминология.
В тексте доминирует терминология, связанная с устройствами, сетями и передачей данных. Союз «и» лидирует, что указывает на перечислительный стиль изложения.
Ключевой биграммой является "интернета вещей", так как она встречается 64 раза, что подтверждает центральную тему.
Характерны вводные обороты: такие как, а также, с помощью Выделяется сочетание умного дома — важная прикладная область.
Выводы по разделам:
«Приложения» — самый большой раздел (81% текста). Низший TTR (47.4%) объясняется повторяемостью терминов (умный дом, медицина, транспорт, сельское хозяйство). Стиль — описательный и перечислительный.
«Технологии» — высокое разнообразие (68.1%). Используются узкоспециализированные термины (RFID, 6LoWPAN, PLC, ZigBee, сенсоры, идентификация).
«История» — самое высокое лексическое разнообразие (76.6%). Хронологический нарратив использует разные времена, названия организаций, имена и уникальные формулировки.
Типичное предложение содержит ~20 слов (норма для научно-технического текста)
Присутствуют экстремально длинные предложения (до 91 слова), что характерно для перечислений и сложных конструкций в технической литературе
Короткие предложения (1 слово) — вероятно, заголовки подразделов
Таким образом, на основании этого анализа можно заключить, что данный текст - это научно-техническая статья среднего уровня сложности с хорошим лексическим разнообразием.
Раздел «Приложения» занимает более 80% объёма и имеет описательный, перечислительный характер.
Разделы «История» и «Технологии» короткие, но терминологически насыщенные — в них выше TTR.
Ключевая тема — интернет вещей (устойчивая биграмма, частота 64).
Стиль характеризуется: длинными предложениями (до 91 слова), вводными оборотами (такие как, а также, с помощью), обилием союза и.
Текст пригоден для дальнейшего семантического анализа, извлечения сущностей (имена, технологии, организации) и построения тематических моделей.
