Как проанализировать комментарии отдельной студии Scratch: различия между версиями
Материал из Поле цифровой дидактики
Patarakin (обсуждение | вклад) Нет описания правки |
Patarakin (обсуждение | вклад) |
||
| (не показаны 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 <- | 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
Примеры студий
- 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
Скрипт 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)
)
