Как провести сравнительный анализ поведения на поле цифровой дидактики (R)

Материал из Поле цифровой дидактики
Описание Мы собрали датасет о действиях участников на площадке digiga и хотим провести анализ этого датасета с демонстрацией возможностей среды R
  • 120px-Pipe_Digida2026.png
Область знаний Информатика, Большие данные
Область использования (ISTE)
Возрастная категория 21


Поясняющее видео
Близкие рецепту понятия
Среды и средства для приготовления рецепта: R, Digida2026


Датасет Digida2026 - собран и размещен на GitHub

getwd()
library(tidyverse)
library(ggplot2)

students <- read_csv("https://raw.githubusercontent.com/patarakin/stat-data/refs/heads/main/datasets/csv/users7_activity_with_categories.csv", 
                     show_col_types = FALSE)

# rm(students)

students

# --- Pipe
students |> head()

###-- Select
students %>% 
select(username, n_total_edits, days_active, edits_articles, 
       n_files_uploaded, discipline) 

###-- Select + Filter

students %>% 
  select(username, n_total_edits, days_active, edits_articles, 
         n_files_uploaded, discipline) %>% 
  filter(n_total_edits > 10) %>% 
  filter(days_active < 2)

### --- Select + Mutate
## -    edit_per_day -активность в день 
# pct_articles - активность на страницах (0), а не в пространстве обсуждений


students %>% 
  select(username, n_total_edits, days_active, edits_articles, 
         n_files_uploaded, discipline) %>% 
  mutate(
    edit_per_day = round(n_total_edits / days_active, 2),  
    pct_articles = round(edits_articles / n_total_edits * 100, 1)
  )

### + Groupby 
students %>% 
  select(username, n_total_edits, days_active, edits_articles, 
         n_files_uploaded, discipline) %>% 
  mutate(
    edit_per_day = round(n_total_edits / days_active, 2),  
    pct_articles = round(edits_articles / n_total_edits * 100, 1)
  )  %>% 
  group_by(discipline)


#--- Groupby  + Summarize

students %>% 
  select(username, n_total_edits, days_active, edits_articles, 
         n_files_uploaded, discipline) %>% 
  mutate(
    edit_per_day = round(n_total_edits / days_active, 2),  
    pct_articles = round(edits_articles / n_total_edits * 100, 1) 
  )  %>% 
  filter(days_active > 0) %>% 
  group_by(discipline) %>% 
  summarise(
    n_students = n(),
    mean_edits = round(mean(n_total_edits), 1),
    mean_edit_per_day = round(mean(edit_per_day), 2),
    total_files = sum(n_files_uploaded),
    mean_pct_articles = round(mean(pct_articles), 1),
    .groups = "drop"
  ) %>%
  arrange(desc(n_students))

 #--------------------


students_analysis <- students %>% 
  select(username, n_total_edits, days_active, edits_articles, 
         n_files_uploaded, discipline) %>% 
  filter(days_active > 0) %>% 
  mutate(
    edit_per_day = round(n_total_edits / days_active, 2),  
    pct_articles = round(edits_articles / n_total_edits * 100, 1)
  )

##  

glimpse(students_analysis)

unique(students_analysis$discipline)


summary(students_analysis$edit_per_day)

p <- ggplot(students_analysis, aes(x = discipline, y = edit_per_day)) +
  geom_boxplot()

print(p)

p <- ggplot(students_analysis, aes(x = discipline, y = edit_per_day)) +
  geom_boxplot()

print(p)

students_analysis <- students %>% 
  select(discipline, n_total_edits, days_active) %>% 
  filter(days_active > 0) %>% 
  mutate(
    edit_per_day = n_total_edits / days_active
  )

ggplot(students_analysis, aes(x = discipline, y = edit_per_day)) +
  geom_boxplot()

##   ggplot
students_analysis %>%
  ggplot(aes(x = discipline, y = edit_per_day, fill = discipline)) +
  geom_boxplot() +
  labs(
    title = "Edit frequency per day by discipline",
    x = "Discipline", 
    y = "Edits per day"
  ) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Основные глаголы преобразования данных

Функция Что делает С чем работает Простой пример (R)
select() Выбирает (оставляет) нужные столбцы датафрейма; остальные отбрасывает. Столбцы (переменные)
students |> 
  select(username, n_total_edits, discipline)
filter() Оставляет строки, которые удовлетворяют логическому условию (фильтрация наблюдений). Строки (наблюдения)
students |> 
  filter(n_total_edits > 50, discipline == "Филология")
mutate() Добавляет новые столбцы или изменяет существующие, вычисляя их из других переменных. Столбцы (новые или изменённые переменные)
students |>
  mutate(
    edit_per_day = n_total_edits / days_active,
    pct_articles = edits_articles / n_total_edits * 100
  )
group_by() Задаёт группировку по одной или нескольким переменным; изменяет "структуру вычислений", но не сами данные. Группы строк (по категориям)
students |>
  group_by(discipline)
summarise() Строит сводку по группам: сворачивает много строк в одну строку на группу (средние, суммы и т.п.). Группы (после group_by())
students |>
  group_by(discipline) |>
  summarise(
    mean_edits = mean(n_total_edits, na.rm = TRUE),
    n_students = n()
  )