Как проанализировать комментарии отдельной студии Scratch: различия между версиями

Материал из Поле цифровой дидактики
Нет описания правки
 
(не показаны 4 промежуточные версии этого же участника)
Строка 1: Строка 1:
== Примеры студий ==
* https://scratch.mit.edu/studios/30570341
* https://scratch.mit.edu/studios/25967793
* https://scratch.mit.edu/studios/26107498/
* https://scratch.mit.edu/studios/34688866 (Jap)
== Базовый скрипт ==
== Базовый скрипт ==
[[Как оценить командность в студиях Scratch]]
[[Как оценить командность в студиях Scratch]]
Строка 7: Строка 13:


# === Шаг 1. Укажи здесь ID своей студии ===
# === Шаг 1. Укажи здесь ID своей студии ===
studio_id <- 4945817      # ЗАМЕНИ на свой ID студии
studio_id <- 26107498    # ЗАМЕНИ на свой ID студии
studio_lang <- "en"      # можно указать язык для себя (en, ru, ...)
studio_lang <- "en"      # можно указать язык для себя (en, ru, ...)


Строка 85: Строка 91:


studio_team_profile_one
studio_team_profile_one
###################
library(ggplot2)
# === Визуализация 1: роли авторов ===
author_roles_df <- tibble::tibble(
  role = c("Only studio", "Only projects", "Both places"),
  count = c(
    studio_team_profile_one$n_only_studio,
    studio_team_profile_one$n_only_projects,
    studio_team_profile_one$n_both
  )
)
ggplot(author_roles_df, aes(x = role, y = count)) +
  geom_col(fill = "steelblue") +
  labs(
    title = paste("Author roles in studio", studio_id),
    x = "Role",
    y = "Number of authors"
  ) +
  theme_minimal()
# === Визуализация 2: длина комментариев в студии и проектах ===
studio_text_stats <- comments_analysis$studio_text_stats
project_text_stats <- comments_analysis$project_text_stats
len_df <- dplyr::bind_rows(
  studio_text_stats |>
    dplyr::select(n_chars) |>
    dplyr::mutate(place = "Studio"),
  project_text_stats |>
    dplyr::select(n_chars) |>
    dplyr::mutate(place = "Projects")
)
ggplot(len_df, aes(x = place, y = n_chars)) +
  geom_boxplot(fill = "lightblue") +
  coord_cartesian(ylim = c(0, quantile(len_df$n_chars, 0.95, na.rm = TRUE))) +
  labs(
    title = paste("Comment length in studio vs projects (", studio_id, ")", sep = ""),
    x = "Where",
    y = "Comment length (characters)"
  ) +
  theme_minimal()
#########################################
library(dplyr)
library(igraph)
# Берём только нужные поля и убираем дубликаты
edges_author_project <- project_comments |>
  select(author_username, project_id) |>
  distinct()
# Вершины-авторы
authors <- edges_author_project |>
  distinct(author_username) |>
  mutate(
    name = paste0("author:", author_username),
    type = "author"
  ) |>
  select(name, type)
# Вершины-проекты
projects <- edges_author_project |>
  distinct(project_id) |>
  mutate(
    name = paste0("project:", project_id),
    type = "project"
  ) |>
  select(name, type)
# Узел студии (опционально)
studio_node <- tibble(
  name = paste0("studio:", studio_id),
  type = "studio"
)
vertices <- bind_rows(authors, projects, studio_node)
# Рёбра автор–проект
edges_ap <- edges_author_project |>
  mutate(
    from = paste0("author:", author_username),
    to  = paste0("project:", project_id)
  ) |>
  select(from, to)
# Рёбра студия–проект (одна студия ко всем своим проектам)
edges_sp <- projects |>
  transmute(
    from = studio_node$name,
    to  = name
  )
edges_all <- bind_rows(edges_ap, edges_sp)
g <- graph_from_data_frame(
  d = edges_all,
  vertices = vertices,
  directed = FALSE
)
# Простейшая раскладка и цвета по типу вершины
V(g)$color <- ifelse(
  V(g)$type == "author",  "lightblue",
  ifelse(V(g)$type == "project", "orange", "red")  # студия – красная
)
V(g)$size <- ifelse(
  V(g)$type == "studio", 15,
  ifelse(V(g)$type == "project", 8, 5)
)
V(g)$label <- NA  # для больших студий лучше без подписей
plot(
  g,
  layout = layout_with_fr(g),
  vertex.color = V(g)$color,
  vertex.size  = V(g)$size,
  main = paste("Author–project–studio graph for studio", studio_id)
)


</syntaxhighlight>
</syntaxhighlight>

Текущая версия от 14:53, 31 марта 2026

Примеры студий

Базовый скрипт

Как оценить командность в студиях Scratch

Скрипт R

source("Scratch_API_core.R", encoding = "UTF-8")

# === Шаг 1. Укажи здесь ID своей студии ===
studio_id <- 26107498     # ЗАМЕНИ на свой ID студии
studio_lang <- "en"       # можно указать язык для себя (en, ru, ...)

message("Analyzing studio: ", studio_id, " (", studio_lang, ")")

# === Шаг 2. Проекты студии ===
studio_projects <- get_studio_projects(studio_id, verbose = TRUE)

# Посмотрим, что получилось
studio_projects |> glimpse()

# === Шаг 3. Анализ комментариев студии и проектов ===

comments_analysis <- analyze_studio_comments(
  studio_id       = studio_id,
  studio_projects = studio_projects,
  verbose         = TRUE
)

# В comments_analysis лежит список с несколькими таблицами:
names(comments_analysis)

studio_comments   <- comments_analysis$studio_comments
project_comments  <- comments_analysis$project_comments
authors_overlap   <- comments_analysis$authors_overlap
studio_text_stats <- comments_analysis$studio_text_stats
project_text_stats <- comments_analysis$project_text_stats
summary_metrics   <- comments_analysis$summary_metrics


studio_comments   |> glimpse()
project_comments  |> glimpse()
authors_overlap   |> glimpse()
str(summary_metrics)

# === Шаг 4. Профиль "teamwork" для одной студии ===

studio_team_metrics <- tibble(
  studio_id           = studio_id,
  lang                = studio_lang,
  n_authors_total     = summary_metrics$n_authors_total,
  n_only_studio       = summary_metrics$n_only_studio,
  n_only_projects     = summary_metrics$n_only_projects,
  n_both              = summary_metrics$n_both,
  share_only_studio   = summary_metrics$share_only_studio,
  share_only_projects = summary_metrics$share_only_projects,
  share_both          = summary_metrics$share_both,
  mean_len_studio     = summary_metrics$mean_len_studio,
  mean_len_project    = summary_metrics$mean_len_project
)

studio_team_metrics






# === Шаг 5. Ремиксная активность в студии ===

remix_stats <- get_studio_remix_stats(
  studio_id       = studio_id,
  studio_projects = studio_projects,
  verbose         = TRUE
)

remix_stats


# === Шаг 6. Полный профиль teamwork для одной студии ===

studio_team_profile_one <- studio_team_metrics |>
  left_join(
    remix_stats,
    by = "studio_id"
  )

studio_team_profile_one

 ###################
library(ggplot2)

# === Визуализация 1: роли авторов ===

author_roles_df <- tibble::tibble(
  role = c("Only studio", "Only projects", "Both places"),
  count = c(
    studio_team_profile_one$n_only_studio,
    studio_team_profile_one$n_only_projects,
    studio_team_profile_one$n_both
  )
)

ggplot(author_roles_df, aes(x = role, y = count)) +
  geom_col(fill = "steelblue") +
  labs(
    title = paste("Author roles in studio", studio_id),
    x = "Role",
    y = "Number of authors"
  ) +
  theme_minimal()


# === Визуализация 2: длина комментариев в студии и проектах ===

studio_text_stats <- comments_analysis$studio_text_stats
project_text_stats <- comments_analysis$project_text_stats

len_df <- dplyr::bind_rows(
  studio_text_stats |>
    dplyr::select(n_chars) |>
    dplyr::mutate(place = "Studio"),
  project_text_stats |>
    dplyr::select(n_chars) |>
    dplyr::mutate(place = "Projects")
)

ggplot(len_df, aes(x = place, y = n_chars)) +
  geom_boxplot(fill = "lightblue") +
  coord_cartesian(ylim = c(0, quantile(len_df$n_chars, 0.95, na.rm = TRUE))) +
  labs(
    title = paste("Comment length in studio vs projects (", studio_id, ")", sep = ""),
    x = "Where",
    y = "Comment length (characters)"
  ) +
  theme_minimal()

#########################################
library(dplyr)
library(igraph)

# Берём только нужные поля и убираем дубликаты
edges_author_project <- project_comments |>
  select(author_username, project_id) |>
  distinct()

# Вершины-авторы
authors <- edges_author_project |>
  distinct(author_username) |>
  mutate(
    name = paste0("author:", author_username),
    type = "author"
  ) |>
  select(name, type)

# Вершины-проекты
projects <- edges_author_project |>
  distinct(project_id) |>
  mutate(
    name = paste0("project:", project_id),
    type = "project"
  ) |>
  select(name, type)

# Узел студии (опционально)
studio_node <- tibble(
  name = paste0("studio:", studio_id),
  type = "studio"
)

vertices <- bind_rows(authors, projects, studio_node)


# Рёбра автор–проект
edges_ap <- edges_author_project |>
  mutate(
    from = paste0("author:", author_username),
    to   = paste0("project:", project_id)
  ) |>
  select(from, to)

# Рёбра студия–проект (одна студия ко всем своим проектам)
edges_sp <- projects |>
  transmute(
    from = studio_node$name,
    to   = name
  )

edges_all <- bind_rows(edges_ap, edges_sp)

g <- graph_from_data_frame(
  d = edges_all,
  vertices = vertices,
  directed = FALSE
)

# Простейшая раскладка и цвета по типу вершины
V(g)$color <- ifelse(
  V(g)$type == "author",  "lightblue",
  ifelse(V(g)$type == "project", "orange", "red")  # студия – красная
)

V(g)$size <- ifelse(
  V(g)$type == "studio", 15,
  ifelse(V(g)$type == "project", 8, 5)
)

V(g)$label <- NA  # для больших студий лучше без подписей


plot(
  g,
  layout = layout_with_fr(g),
  vertex.color = V(g)$color,
  vertex.size  = V(g)$size,
  main = paste("Author–project–studio graph for studio", studio_id)
)