<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>http://digida.mgpu.ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Pocrovskii+Alexander</id>
	<title>Поле цифровой дидактики - Вклад [ru]</title>
	<link rel="self" type="application/atom+xml" href="http://digida.mgpu.ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Pocrovskii+Alexander"/>
	<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Pocrovskii_Alexander"/>
	<updated>2026-07-24T14:30:43Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.44.0</generator>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%9A%D0%BE%D0%BB%D0%BB%D0%B5%D0%BA%D1%86%D0%B8%D1%8F_%D0%BF%D0%B5%D1%81%D0%B5%D0%BD_%D0%B8%D0%B7_%D0%B8%D0%BD%D0%B4%D0%B8%D0%B9%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%BA%D0%B8%D0%BD%D0%B5%D0%BC%D0%B0%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B0_DataSet&amp;diff=46225</id>
		<title>Коллекция песен из индийского кинематографа DataSet</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%9A%D0%BE%D0%BB%D0%BB%D0%B5%D0%BA%D1%86%D0%B8%D1%8F_%D0%BF%D0%B5%D1%81%D0%B5%D0%BD_%D0%B8%D0%B7_%D0%B8%D0%BD%D0%B4%D0%B8%D0%B9%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%BA%D0%B8%D0%BD%D0%B5%D0%BC%D0%B0%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B0_DataSet&amp;diff=46225"/>
		<updated>2026-04-14T12:50:04Z</updated>

		<summary type="html">&lt;p&gt;Pocrovskii Alexander: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Model&lt;br /&gt;
|Description=Коллекция песен из индийского кинематографа&lt;br /&gt;
|Field_of_knowledge=Информатика, Образование, Искусственный интеллект, Большие данные, Музыка, Медиа&lt;br /&gt;
|Website=https://www.kaggle.com/datasets/moonknightmarvel/dataset-of-songs-with-genreartistmovielanguage/data&lt;br /&gt;
|Inventor=Pocrovskii Alexander&lt;br /&gt;
|Environment=R, Большие данные&lt;br /&gt;
|Student-created=Да&lt;br /&gt;
}}&lt;br /&gt;
== Общая информация ==&lt;br /&gt;
* &#039;&#039;&#039;Авторы:&#039;&#039;&#039; Студент группы [[Категория:ИНДОР-211]] -   [[Участник:Pokrovskii Alexander|Pokrovskii Alexander]]&lt;br /&gt;
* &#039;&#039;&#039;Дата исследования:&#039;&#039;&#039; 14 апреля 2026&lt;br /&gt;
* &#039;&#039;&#039;Источник:&#039;&#039;&#039; Kaggle Datasets&lt;br /&gt;
* &#039;&#039;&#039;Платформа:&#039;&#039;&#039; Kaggle&lt;br /&gt;
* &#039;&#039;&#039;Дата публикации:&#039;&#039;&#039; 23 апреля 2026 г.&lt;br /&gt;
&lt;br /&gt;
=== Исходные данные ===&lt;br /&gt;
* &#039;&#039;&#039;Файл:&#039;&#039;&#039; songs_db.csv (6 КB)&lt;br /&gt;
* &#039;&#039;&#039;Структура:&#039;&#039;&#039; 101 строк (избирательных участков), 5 столбцов&lt;br /&gt;
* &#039;&#039;&#039;Ссылка:&#039;&#039;&#039; https://www.kaggle.com/datasets/moonknightmarvel/dataset-of-songs-with-genreartistmovielanguage/data&lt;br /&gt;
*&lt;br /&gt;
&amp;lt;uml&amp;gt;&lt;br /&gt;
@startuml&lt;br /&gt;
&lt;br /&gt;
title Пайплайн представления музыкальных данных в Digida&lt;br /&gt;
skinparam handwritten false&lt;br /&gt;
&lt;br /&gt;
rectangle &amp;quot;Внешние данные (OWID CSV)&amp;quot; as external #LightBlue&lt;br /&gt;
rectangle &amp;quot;R: предварительная загрузка&amp;quot; as r_load #LightGreen  &lt;br /&gt;
rectangle &amp;quot;OpenRefine: очистка и обогащение&amp;quot; as refine #LightYellow&lt;br /&gt;
rectangle &amp;quot;R: визуализация + экспорт&amp;quot; as r_export #LightPink&lt;br /&gt;
rectangle &amp;quot;Digida: публикация&amp;quot; as platform #LightCoral&lt;br /&gt;
&lt;br /&gt;
external --&amp;gt; r_load : read_csv()&lt;br /&gt;
r_load --&amp;gt; refine : экспорт songs_db.csv&lt;br /&gt;
refine --&amp;gt; refine : Нормализация, расчёт метрик&lt;br /&gt;
refine --&amp;gt; r_export : экспорт songs_db_clean.csv&lt;br /&gt;
r_export --&amp;gt; r_export : ggplot2 + patchwork дашборд&lt;br /&gt;
r_export --&amp;gt; platform : загрузка страниц + дашборд&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@enduml&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/uml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Описание исследования ==&lt;br /&gt;
Исследование посвящено анализу структурированных музыкальных метаданных на примере датасета песен из индийских фильмов.&lt;br /&gt;
&lt;br /&gt;
=== Цель ===&lt;br /&gt;
Выявить статистически значимые связи между метаданными песен (язык, исполнитель, фильм) и их эмоциональной категорией, а также построить и валидировать модель машинного обучения для прогнозирования эмоции песни на основе доступных признаков с точностью не ниже 75% (F1-macro).&lt;br /&gt;
&lt;br /&gt;
=== Задачи ===&lt;br /&gt;
# Выполнить предобработку: кодирование категориальных признаков (Artist, Movie, Language), балансировку данных (при необходимости), разделение на обучающую/тестовую выборки.&lt;br /&gt;
# Выполнить предобработку: кодирование категориальных признаков (Artist, Movie, Language), балансировку данных (при необходимости), разделение на обучающую/тестовую выборки.&lt;br /&gt;
# Построить и сравнить несколько моделей классификации (логистическая регрессия, Random Forest, XGBoost) с кросс-валидацией, оценить метрики качества (accuracy, precision, recall, F1-score).&lt;br /&gt;
# Визуализировать результаты: матрицу ошибок, важность признаков, распределение предсказаний, а также сформировать интерпретируемые выводы о доминирующих факторах, влияющих на эмоциональную окраску песни.&lt;br /&gt;
&lt;br /&gt;
=== Гипотеза ===&lt;br /&gt;
Эмоциональная категория песни (Emotion) статистически значимо зависит от комбинации языка исполнения и исполнителя: песни на телугу в исполнении артистов «первого эшелона» (например, Sid Sriram, Armaan Malik) с большей вероятностью относятся к категориям Love или Joy, тогда как треки второстепенных исполнителей или из менее популярных фильмов чаще маркируются как Sadness или Anticipation. При этом модель, обученная на признаках Language + Artist + Movie, покажет качество прогнозирования эмоции выше базового уровня (majority class baseline) не менее чем на 20 п.п. по метрике F1-macro.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Программный код ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;R&amp;quot;&amp;gt;&lt;br /&gt;
# Анализ БД&lt;br /&gt;
&lt;br /&gt;
# Проверка, что .data[[col]] работает в вашей среде&lt;br /&gt;
test_df &amp;lt;- tibble(x = 1:5, y = letters[1:5])&lt;br /&gt;
test_col &amp;lt;- &amp;quot;x&amp;quot;&lt;br /&gt;
result &amp;lt;- test_df %&amp;gt;% filter(!is.na(.data[[test_col]]))&lt;br /&gt;
stopifnot(nrow(result) == 5)  # если не упадёт — всё ок&lt;br /&gt;
&lt;br /&gt;
# ==========================================&lt;br /&gt;
# A) Imports + Global Config&lt;br /&gt;
# ==========================================&lt;br /&gt;
library(tidyverse)    # dplyr, tidyr, readr, ggplot2, stringr, purrr&lt;br /&gt;
library(lubridate)    # работа с датами&lt;br /&gt;
library(corrplot)     # тепловые карты корреляций&lt;br /&gt;
library(scales)       # форматирование осей&lt;br /&gt;
library(patchwork)    # компоновка графиков&lt;br /&gt;
&lt;br /&gt;
set.seed(42)&lt;br /&gt;
options(digits = 2, width = 120)&lt;br /&gt;
&lt;br /&gt;
# Глобальные настройки ggplot2&lt;br /&gt;
theme_set(theme_minimal(base_size = 12))&lt;br /&gt;
update_geom_defaults(&amp;quot;point&amp;quot;, list(alpha = 0.6))&lt;br /&gt;
&lt;br /&gt;
# Входные параметры (аналог Python-конфига)&lt;br /&gt;
DATASET_NAME &amp;lt;- &amp;quot;moonknightmarvel/dataset-of-songs-with-genreartistmovielanguage&amp;quot;&lt;br /&gt;
EXACT_COLUMNS &amp;lt;- c(&amp;quot;title&amp;quot;, &amp;quot;artist&amp;quot;, &amp;quot;movie&amp;quot;, &amp;quot;language&amp;quot;, &amp;quot;emotion&amp;quot;)&lt;br /&gt;
TARGET_COL &amp;lt;- NULL  # можно задать, например, &amp;quot;emotion&amp;quot;&lt;br /&gt;
DATA_DIR &amp;lt;- &amp;quot;C:/songs_db.csv&amp;quot;  # путь к файлу&lt;br /&gt;
&lt;br /&gt;
# ==========================================&lt;br /&gt;
# B) Helper Functions (Robust &amp;amp; Defensive)&lt;br /&gt;
# ==========================================&lt;br /&gt;
&lt;br /&gt;
safe_read_csv &amp;lt;- function(path) {&lt;br /&gt;
  tryCatch(&lt;br /&gt;
    read_csv(path, show_col_types = FALSE),&lt;br /&gt;
    error = function(e) {&lt;br /&gt;
      message(sprintf(&amp;quot;CRITICAL ERROR: Could not read CSV at %s. Error: %s&amp;quot;, path, e$message))&lt;br /&gt;
      return(tibble())&lt;br /&gt;
    }&lt;br /&gt;
  )&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
validate_columns &amp;lt;- function(df, expected_cols) {&lt;br /&gt;
  if (nrow(df) == 0 || is.null(expected_cols)) return(invisible(NULL))&lt;br /&gt;
  &lt;br /&gt;
  actual_cols &amp;lt;- names(df)&lt;br /&gt;
  missing &amp;lt;- setdiff(expected_cols, actual_cols)&lt;br /&gt;
  extra &amp;lt;- setdiff(actual_cols, expected_cols)&lt;br /&gt;
  &lt;br /&gt;
  cat(strrep(&amp;quot;-&amp;quot;, 30), &amp;quot;\n&amp;quot;)&lt;br /&gt;
  cat(sprintf(&amp;quot;COLUMN VALIDATION: %s\n&amp;quot;, DATASET_NAME))&lt;br /&gt;
  &lt;br /&gt;
  if (length(missing) == 0 &amp;amp;&amp;amp; length(extra) == 0) {&lt;br /&gt;
    cat(&amp;quot;Success: All expected columns found. No extra columns.\n&amp;quot;)&lt;br /&gt;
  } else {&lt;br /&gt;
    if (length(missing) &amp;gt; 0) cat(sprintf(&amp;quot;Missing expected columns: %s\n&amp;quot;, paste(missing, collapse = &amp;quot;, &amp;quot;)))&lt;br /&gt;
    if (length(extra) &amp;gt; 0) cat(sprintf(&amp;quot;Extra columns found: %s\n&amp;quot;, paste(extra, collapse = &amp;quot;, &amp;quot;)))&lt;br /&gt;
  }&lt;br /&gt;
  cat(strrep(&amp;quot;-&amp;quot;, 30), &amp;quot;\n&amp;quot;)&lt;br /&gt;
  invisible(NULL)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
audit_missingness &amp;lt;- function(df) {&lt;br /&gt;
  null_counts &amp;lt;- colSums(is.na(df))&lt;br /&gt;
  null_pct &amp;lt;- (null_counts / nrow(df)) * 100&lt;br /&gt;
  non_null &amp;lt;- nrow(df) - null_counts&lt;br /&gt;
  &lt;br /&gt;
  tibble(&lt;br /&gt;
    Column = names(df),&lt;br /&gt;
    `Null Count` = null_counts,&lt;br /&gt;
    `Null %` = round(null_pct, 2),&lt;br /&gt;
    `Non-Null Count` = non_null&lt;br /&gt;
  ) %&amp;gt;% arrange(desc(`Null %`))&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
detect_column_types &amp;lt;- function(df) {&lt;br /&gt;
  num_cols &amp;lt;- names(df)[sapply(df, is.numeric)]&lt;br /&gt;
  char_cols &amp;lt;- names(df)[sapply(df, is.character)]&lt;br /&gt;
  &lt;br /&gt;
  # Эвристика для дат: ищем паттерны вроде &amp;quot;2024-01-15&amp;quot; или &amp;quot;15/01/2024&amp;quot;&lt;br /&gt;
  date_pattern &amp;lt;- &amp;quot;\\d{4}-\\d{2}-\\d{2}|\\d{2}/\\d{2}/\\d{4}&amp;quot;&lt;br /&gt;
  date_cols &amp;lt;- char_cols[sapply(df[char_cols], function(col) {&lt;br /&gt;
    any(str_detect(na.omit(as.character(col[1:min(5, length(col))])), date_pattern), na.rm = TRUE)&lt;br /&gt;
  })]&lt;br /&gt;
  &lt;br /&gt;
  cat_cols &amp;lt;- setdiff(char_cols, date_cols)&lt;br /&gt;
  list(num = num_cols, cat = cat_cols, date = date_cols)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
safe_to_numeric &amp;lt;- function(series) {&lt;br /&gt;
  suppressWarnings(as.numeric(series))&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
safe_to_datetime &amp;lt;- function(series) {&lt;br /&gt;
  parsed &amp;lt;- parse_date_time(series, orders = c(&amp;quot;Ymd&amp;quot;, &amp;quot;dmy&amp;quot;, &amp;quot;mdY&amp;quot;), quiet = TRUE)&lt;br /&gt;
  ifelse(is.na(parsed), NA, parsed)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
plot_missingness &amp;lt;- function(df) {&lt;br /&gt;
  null_pct &amp;lt;- colSums(is.na(df)) / nrow(df) * 100&lt;br /&gt;
  null_pct &amp;lt;- null_pct[null_pct &amp;gt; 0] %&amp;gt;% sort(decreasing = TRUE) %&amp;gt;% head(30)&lt;br /&gt;
  &lt;br /&gt;
  if (length(null_pct) == 0) return(NULL)&lt;br /&gt;
  &lt;br /&gt;
  tibble(Column = names(null_pct), `Missing %` = null_pct) %&amp;gt;%&lt;br /&gt;
    mutate(Column = fct_reorder(Column, `Missing %`)) %&amp;gt;%&lt;br /&gt;
    ggplot(aes(x = `Missing %`, y = Column, fill = `Missing %`)) +&lt;br /&gt;
    geom_col(show.legend = FALSE) +&lt;br /&gt;
    scale_fill_gradient(low = &amp;quot;#fee0d2&amp;quot;, high = &amp;quot;#cb181d&amp;quot;) +&lt;br /&gt;
    labs(title = &amp;quot;Top Columns by Missing Percentage (%)&amp;quot;, x = &amp;quot;% Missing&amp;quot;, y = NULL) +&lt;br /&gt;
    theme(axis.text.y = element_text(size = 9))&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Исправленная версия plot_univariate_num&lt;br /&gt;
plot_univariate_num &amp;lt;- function(df, num_cols) {&lt;br /&gt;
  cols_to_plot &amp;lt;- head(num_cols, 12)&lt;br /&gt;
  if (length(cols_to_plot) == 0) return(NULL)&lt;br /&gt;
  &lt;br /&gt;
  plots &amp;lt;- lapply(cols_to_plot, function(col) {&lt;br /&gt;
    df %&amp;gt;% &lt;br /&gt;
      filter(!is.na(.data[[col]])) %&amp;gt;%  &lt;br /&gt;
      ggplot(aes(x = .data[[col]])) +&lt;br /&gt;
      geom_histogram(aes(y = after_stat(density)), bins = 30, &lt;br /&gt;
                     fill = &amp;quot;teal&amp;quot;, color = &amp;quot;white&amp;quot;, alpha = 0.8) +&lt;br /&gt;
      geom_density(color = &amp;quot;darkred&amp;quot;, linewidth = 0.8) +&lt;br /&gt;
      labs(title = sprintf(&amp;quot;Distribution of %s&amp;quot;, col), x = NULL, y = &amp;quot;Density&amp;quot;) +&lt;br /&gt;
      theme(axis.text.x = element_text(angle = 45, hjust = 1))&lt;br /&gt;
  })&lt;br /&gt;
  &lt;br /&gt;
  patchwork::wrap_plots(plots, ncol = 3)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Исправленная версия plot_univariate_cat&lt;br /&gt;
plot_univariate_cat &amp;lt;- function(df, cat_cols) {&lt;br /&gt;
  cols_to_plot &amp;lt;- head(cat_cols, 6)&lt;br /&gt;
  if (length(cols_to_plot) == 0) return(NULL)&lt;br /&gt;
  &lt;br /&gt;
  lapply(cols_to_plot, function(col) {&lt;br /&gt;
    # ✅ group_by + count с .data[[col]]&lt;br /&gt;
    top_vals &amp;lt;- df %&amp;gt;% &lt;br /&gt;
      group_by(.data[[col]]) %&amp;gt;% &lt;br /&gt;
      summarise(n = n(), .groups = &amp;quot;drop&amp;quot;) %&amp;gt;% &lt;br /&gt;
      arrange(desc(n)) %&amp;gt;% &lt;br /&gt;
      slice_head(n = 15)&lt;br /&gt;
    &lt;br /&gt;
    top_vals %&amp;gt;%&lt;br /&gt;
      mutate(!!col := fct_reorder(.data[[col]], n)) %&amp;gt;%&lt;br /&gt;
      ggplot(aes(x = n, y = .data[[col]], fill = n)) +&lt;br /&gt;
      geom_col(show.legend = FALSE) +&lt;br /&gt;
      scale_fill_viridis_d(option = &amp;quot;viridis&amp;quot;) +&lt;br /&gt;
      labs(title = sprintf(&amp;quot;Top 15 Categories: %s&amp;quot;, col), x = &amp;quot;Count&amp;quot;, y = NULL) +&lt;br /&gt;
      theme(axis.text.y = element_text(size = 9))&lt;br /&gt;
  })&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Исправленная часть EDA с TARGET_COL (если он категориальный)&lt;br /&gt;
if (!is.null(TARGET_COL) &amp;amp;&amp;amp; TARGET_COL %in% names(df_clean)) {&lt;br /&gt;
  # ... внутри else для категориального таргета:&lt;br /&gt;
  df_clean %&amp;gt;%&lt;br /&gt;
    group_by(.data[[TARGET_COL]]) %&amp;gt;% &lt;br /&gt;
    summarise(n = n(), .groups = &amp;quot;drop&amp;quot;) %&amp;gt;% &lt;br /&gt;
    mutate(!!TARGET_COL := fct_reorder(.data[[TARGET_COL]], n)) %&amp;gt;%&lt;br /&gt;
    ggplot(aes(x = n, y = .data[[TARGET_COL]], fill = n)) +&lt;br /&gt;
    geom_col(show.legend = FALSE) +&lt;br /&gt;
    scale_fill_viridis_d(option = &amp;quot;magma&amp;quot;) +&lt;br /&gt;
    labs(title = sprintf(&amp;quot;Target Distribution: %s&amp;quot;, TARGET_COL), &lt;br /&gt;
         x = &amp;quot;Count&amp;quot;, y = NULL) +&lt;br /&gt;
    theme(axis.text.y = element_text(size = 10)) %&amp;gt;%&lt;br /&gt;
    print()&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
plot_correlation &amp;lt;- function(df, num_cols) {&lt;br /&gt;
  if (length(num_cols) &amp;lt; 2) return(NULL)&lt;br /&gt;
  &lt;br /&gt;
  corr_mat &amp;lt;- df %&amp;gt;% select(all_of(num_cols)) %&amp;gt;% cor(use = &amp;quot;complete.obs&amp;quot;)&lt;br /&gt;
  corrplot(corr_mat, &lt;br /&gt;
           method = &amp;quot;color&amp;quot;, &lt;br /&gt;
           type = &amp;quot;upper&amp;quot;, &lt;br /&gt;
           tl.cex = 0.8, &lt;br /&gt;
           tl.srt = 45,&lt;br /&gt;
           addCoef.col = &amp;quot;black&amp;quot;, &lt;br /&gt;
           number.cex = 0.6,&lt;br /&gt;
           col = colorRampPalette(c(&amp;quot;#6D9EC1&amp;quot;, &amp;quot;white&amp;quot;, &amp;quot;#E46726&amp;quot;))(200),&lt;br /&gt;
           title = &amp;quot;Pearson Correlation Matrix&amp;quot;,&lt;br /&gt;
           mar = c(0,0,1,0))&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# ==========================================&lt;br /&gt;
# C) Load + Validate&lt;br /&gt;
# ==========================================&lt;br /&gt;
df &amp;lt;- safe_read_csv(DATA_DIR)&lt;br /&gt;
validate_columns(df, EXACT_COLUMNS)&lt;br /&gt;
&lt;br /&gt;
if (nrow(df) &amp;gt; 0) {&lt;br /&gt;
  # ==========================================&lt;br /&gt;
  # D) Data Audit&lt;br /&gt;
  # ==========================================&lt;br /&gt;
  cat(sprintf(&amp;quot;\n--- DATA AUDIT: %s ---\n&amp;quot;, DATASET_NAME))&lt;br /&gt;
  cat(sprintf(&amp;quot;Shape: %d rows × %d columns\n&amp;quot;, nrow(df), ncol(df)))&lt;br /&gt;
  cat(sprintf(&amp;quot;Memory Usage: %.2f MB\n&amp;quot;, object.size(df) / 1024^2))&lt;br /&gt;
  cat(sprintf(&amp;quot;Duplicates: %d\n&amp;quot;, sum(duplicated(df))))&lt;br /&gt;
  &lt;br /&gt;
  null_audit &amp;lt;- audit_missingness(df)&lt;br /&gt;
  cat(&amp;quot;\nNull Audit Summary (Top 5 Missing):\n&amp;quot;)&lt;br /&gt;
  print(null_audit %&amp;gt;% slice_head(n = 5))&lt;br /&gt;
  &lt;br /&gt;
  col_types &amp;lt;- detect_column_types(df)&lt;br /&gt;
  num_cols &amp;lt;- col_types$num&lt;br /&gt;
  cat_cols &amp;lt;- col_types$cat&lt;br /&gt;
  date_cols &amp;lt;- col_types$date&lt;br /&gt;
  &lt;br /&gt;
  cat(sprintf(&amp;quot;\nDetected Numeric Columns: %s\n&amp;quot;, paste(num_cols, collapse = &amp;quot;, &amp;quot;)))&lt;br /&gt;
  cat(sprintf(&amp;quot;Detected Categorical Columns: %s\n&amp;quot;, paste(cat_cols, collapse = &amp;quot;, &amp;quot;)))&lt;br /&gt;
  cat(sprintf(&amp;quot;Detected Date Columns: %s\n&amp;quot;, paste(date_cols, collapse = &amp;quot;, &amp;quot;)))&lt;br /&gt;
  &lt;br /&gt;
  # Проверка на бесконечные значения и низкую дисперсию&lt;br /&gt;
  if (length(num_cols) &amp;gt; 0) {&lt;br /&gt;
    inf_counts &amp;lt;- sum(sapply(df[num_cols], function(x) sum(is.infinite(x))), na.rm = TRUE)&lt;br /&gt;
    cat(sprintf(&amp;quot;Total Inf/-Inf values: %d\n&amp;quot;, inf_counts))&lt;br /&gt;
    &lt;br /&gt;
    low_var &amp;lt;- num_cols[sapply(df[num_cols], function(x) sd(x, na.rm = TRUE) &amp;lt; 0.01)]&lt;br /&gt;
    if (length(low_var) &amp;gt; 0) cat(sprintf(&amp;quot;Low variance columns: %s\n&amp;quot;, paste(low_var, collapse = &amp;quot;, &amp;quot;)))&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  # ==========================================&lt;br /&gt;
  # E) ETL (Safe + Reversible)&lt;br /&gt;
  # ==========================================&lt;br /&gt;
  df_clean &amp;lt;- df %&amp;gt;% mutate(across(everything(), ~.x))  # явное копирование&lt;br /&gt;
  &lt;br /&gt;
  # Очистка строк: пробелы + унификация пропусков&lt;br /&gt;
  missing_tokens &amp;lt;- c(&amp;quot;&amp;quot;, &amp;quot;NA&amp;quot;, &amp;quot;N/A&amp;quot;, &amp;quot;null&amp;quot;, &amp;quot;None&amp;quot;, &amp;quot;nan&amp;quot;)&lt;br /&gt;
  df_clean &amp;lt;- df_clean %&amp;gt;%&lt;br /&gt;
    mutate(across(where(is.character), ~{&lt;br /&gt;
      .x %&amp;gt;% &lt;br /&gt;
        str_trim() %&amp;gt;% &lt;br /&gt;
        na_if(&amp;quot;&amp;quot;) %&amp;gt;% &lt;br /&gt;
        { ifelse(. %in% missing_tokens, NA, .) }&lt;br /&gt;
    }))&lt;br /&gt;
  &lt;br /&gt;
  # Попытка конвертировать &amp;quot;числовые&amp;quot; строки в numeric&lt;br /&gt;
  for (col in cat_cols) {&lt;br /&gt;
    if (col %in% names(df_clean)) {&lt;br /&gt;
      sample_vals &amp;lt;- df_clean[[col]] %&amp;gt;% drop_na() %&amp;gt;% head(10) %&amp;gt;% as.character()&lt;br /&gt;
      if (all(str_detect(sample_vals, &amp;quot;^-?\\d+(\\.\\d+)?$&amp;quot;), na.rm = TRUE) &amp;amp;&amp;amp; length(sample_vals) &amp;gt; 0) {&lt;br /&gt;
        df_clean[[col]] &amp;lt;- safe_to_numeric(df_clean[[col]])&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  # Удаление дубликатов&lt;br /&gt;
  df_clean &amp;lt;- df_clean %&amp;gt;% distinct()&lt;br /&gt;
  &lt;br /&gt;
  # Пересчёт типов после очистки&lt;br /&gt;
  col_types &amp;lt;- detect_column_types(df_clean)&lt;br /&gt;
  num_cols &amp;lt;- col_types$num&lt;br /&gt;
  cat_cols &amp;lt;- col_types$cat&lt;br /&gt;
  &lt;br /&gt;
  # Обработка пропусков: импутация + индикаторы&lt;br /&gt;
  for (col in num_cols) {&lt;br /&gt;
    if (any(is.na(df_clean[[col]]))) {&lt;br /&gt;
      df_clean[[paste0(col, &amp;quot;__was_missing&amp;quot;)]] &amp;lt;- as.integer(is.na(df_clean[[col]]))&lt;br /&gt;
      df_clean[[col]] &amp;lt;- ifelse(is.na(df_clean[[col]]), &lt;br /&gt;
                                median(df_clean[[col]], na.rm = TRUE), &lt;br /&gt;
                                df_clean[[col]])&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  for (col in cat_cols) {&lt;br /&gt;
    if (any(is.na(df_clean[[col]]))) {&lt;br /&gt;
      df_clean[[paste0(col, &amp;quot;__was_missing&amp;quot;)]] &amp;lt;- as.integer(is.na(df_clean[[col]]))&lt;br /&gt;
      df_clean[[col]] &amp;lt;- replace_na(df_clean[[col]], &amp;quot;Missing&amp;quot;)&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  # ==========================================&lt;br /&gt;
  # F) EDA (Univariate &amp;amp; Bivariate)&lt;br /&gt;
  # ==========================================&lt;br /&gt;
  if (length(num_cols) &amp;gt; 0) {&lt;br /&gt;
    cat(&amp;quot;\nNumeric Distribution Summary:\n&amp;quot;)&lt;br /&gt;
    stats &amp;lt;- df_clean %&amp;gt;%&lt;br /&gt;
      select(all_of(num_cols)) %&amp;gt;%&lt;br /&gt;
      summarise(across(everything(), &lt;br /&gt;
                       list(mean = ~mean(., na.rm = TRUE),&lt;br /&gt;
                            std = ~sd(., na.rm = TRUE),&lt;br /&gt;
                            min = ~min(., na.rm = TRUE),&lt;br /&gt;
                            median = ~median(., na.rm = TRUE),&lt;br /&gt;
                            max = ~max(., na.rm = TRUE),&lt;br /&gt;
                            skew = ~mean((. - mean(., na.rm = TRUE))^3, na.rm = TRUE) / sd(., na.rm = TRUE)^3),&lt;br /&gt;
                       .names = &amp;quot;{.col}_{.fn}&amp;quot;))&lt;br /&gt;
    print(stats)&lt;br /&gt;
    &lt;br /&gt;
    # Поиск высококоррелирующих пар&lt;br /&gt;
    if (length(num_cols) &amp;gt;= 2) {&lt;br /&gt;
      corr_mat &amp;lt;- df_clean %&amp;gt;% select(all_of(num_cols)) %&amp;gt;% cor(use = &amp;quot;complete.obs&amp;quot;) %&amp;gt;% abs()&lt;br /&gt;
      upper &amp;lt;- corr_mat[upper.tri(corr_mat)]&lt;br /&gt;
      high_corr &amp;lt;- which(upper &amp;gt;= 0.85, arr.ind = TRUE)&lt;br /&gt;
      &lt;br /&gt;
      if (nrow(high_corr) &amp;gt; 0) {&lt;br /&gt;
        cat(&amp;quot;\nHighly Correlated Pairs (|r| &amp;gt;= 0.85):\n&amp;quot;)&lt;br /&gt;
        for (i in seq_len(nrow(high_corr))) {&lt;br /&gt;
          row_name &amp;lt;- rownames(corr_mat)[high_corr[i, 1]]&lt;br /&gt;
          col_name &amp;lt;- colnames(corr_mat)[high_corr[i, 2]]&lt;br /&gt;
          cat(sprintf(&amp;quot; - %s &amp;amp; %s: %.3f\n&amp;quot;, row_name, col_name, upper[high_corr[i, 1], high_corr[i, 2]]))&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  # ==========================================&lt;br /&gt;
  # G) Feature Engineering (Lightweight)&lt;br /&gt;
  # ==========================================&lt;br /&gt;
  text_candidates &amp;lt;- intersect(c(&amp;quot;title&amp;quot;, &amp;quot;artist&amp;quot;, &amp;quot;movie&amp;quot;, &amp;quot;language&amp;quot;), cat_cols)&lt;br /&gt;
  &lt;br /&gt;
  for (col in text_candidates) {&lt;br /&gt;
    if (col %in% names(df_clean)) {&lt;br /&gt;
      df_clean[[paste0(col, &amp;quot;__len&amp;quot;)]] &amp;lt;- str_length(as.character(df_clean[[col]]))&lt;br /&gt;
      df_clean[[paste0(col, &amp;quot;__words&amp;quot;)]] &amp;lt;- &lt;br /&gt;
        str_count(as.character(df_clean[[col]]), &amp;quot;\\S+&amp;quot;)  # количество слов&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  # Раскрытие дат&lt;br /&gt;
  for (col in date_cols) {&lt;br /&gt;
    if (col %in% names(df_clean)) {&lt;br /&gt;
      df_clean[[col]] &amp;lt;- safe_to_datetime(df_clean[[col]])&lt;br /&gt;
      if (!all(is.na(df_clean[[col]]))) {&lt;br /&gt;
        df_clean[[paste0(col, &amp;quot;__year&amp;quot;)]] &amp;lt;- year(df_clean[[col]])&lt;br /&gt;
        df_clean[[paste0(col, &amp;quot;__month&amp;quot;)]] &amp;lt;- month(df_clean[[col]])&lt;br /&gt;
        df_clean[[paste0(col, &amp;quot;__dayofweek&amp;quot;)]] &amp;lt;- wday(df_clean[[col]], week_start = 1)&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  # ==========================================&lt;br /&gt;
  # H) Visualization&lt;br /&gt;
  # ==========================================&lt;br /&gt;
  # Missingness plot&lt;br /&gt;
  p_missing &amp;lt;- plot_missingness(df)&lt;br /&gt;
  if (!is.null(p_missing)) print(p_missing)&lt;br /&gt;
  &lt;br /&gt;
  # Обновляем типы после Feature Engineering&lt;br /&gt;
  col_types_upd &amp;lt;- detect_column_types(df_clean)&lt;br /&gt;
  num_cols_upd &amp;lt;- col_types_upd$num&lt;br /&gt;
  &lt;br /&gt;
  # Univariate numerical&lt;br /&gt;
  p_num &amp;lt;- plot_univariate_num(df_clean, num_cols_upd)&lt;br /&gt;
  if (!is.null(p_num)) print(p_num)&lt;br /&gt;
  &lt;br /&gt;
  # Univariate categorical&lt;br /&gt;
  p_cat_plots &amp;lt;- plot_univariate_cat(df_clean, cat_cols)&lt;br /&gt;
  if (!is.null(p_cat_plots)) lapply(p_cat_plots, print)&lt;br /&gt;
  &lt;br /&gt;
  # Correlation heatmap&lt;br /&gt;
  plot_correlation(df_clean, num_cols_upd)&lt;br /&gt;
  &lt;br /&gt;
  # Target-aware analysis&lt;br /&gt;
  if (!is.null(TARGET_COL) &amp;amp;&amp;amp; TARGET_COL %in% names(df_clean)) {&lt;br /&gt;
    cat(sprintf(&amp;quot;\nTarget Analysis: %s\n&amp;quot;, TARGET_COL))&lt;br /&gt;
    &lt;br /&gt;
    if (TARGET_COL %in% num_cols_upd) {&lt;br /&gt;
      # Числовая целевая: корреляции&lt;br /&gt;
      target_corr &amp;lt;- df_clean %&amp;gt;%&lt;br /&gt;
        select(all_of(num_cols_upd)) %&amp;gt;%&lt;br /&gt;
        cor(use = &amp;quot;complete.obs&amp;quot;)[, TARGET_COL] %&amp;gt;%&lt;br /&gt;
        sort(decreasing = TRUE)&lt;br /&gt;
      cat(&amp;quot;Correlations with Target:\n&amp;quot;)&lt;br /&gt;
      print(target_corr)&lt;br /&gt;
    } else {&lt;br /&gt;
      # Категориальная целевая: распределение&lt;br /&gt;
      df_clean %&amp;gt;%&lt;br /&gt;
        count(.data[[TARGET_COL]], sort = TRUE) %&amp;gt;%&lt;br /&gt;
        mutate(!!TARGET_COL := fct_reorder(.data[[TARGET_COL]], n)) %&amp;gt;%&lt;br /&gt;
        ggplot(aes(x = n, y = .data[[TARGET_COL]], fill = n)) +&lt;br /&gt;
        geom_col(show.legend = FALSE) +&lt;br /&gt;
        scale_fill_viridis_d(option = &amp;quot;magma&amp;quot;) +&lt;br /&gt;
        labs(title = sprintf(&amp;quot;Target Distribution: %s&amp;quot;, TARGET_COL), &lt;br /&gt;
             x = &amp;quot;Count&amp;quot;, y = NULL) +&lt;br /&gt;
        theme(axis.text.y = element_text(size = 10)) %&amp;gt;%&lt;br /&gt;
        print()&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  # ==========================================&lt;br /&gt;
  # I) Final Artifact Output&lt;br /&gt;
  # ==========================================&lt;br /&gt;
  cat(&amp;quot;\n--- FINAL SUMMARY ---\n&amp;quot;)&lt;br /&gt;
  cat(sprintf(&amp;quot;Original Shape: %d × %d\n&amp;quot;, nrow(df), ncol(df)))&lt;br /&gt;
  cat(sprintf(&amp;quot;Cleaned Shape:  %d × %d\n&amp;quot;, nrow(df_clean), ncol(df_clean)))&lt;br /&gt;
  cat(sprintf(&amp;quot;Duplicates removed: %d\n&amp;quot;, sum(duplicated(df))))&lt;br /&gt;
  cat(sprintf(&amp;quot;Columns processed: %s\n&amp;quot;, paste(names(df_clean), collapse = &amp;quot;, &amp;quot;)))&lt;br /&gt;
  cat(&amp;quot;\nProcessed Data Preview (df_clean %&amp;gt;% head()):\n&amp;quot;)&lt;br /&gt;
  print(df_clean %&amp;gt;% head())&lt;br /&gt;
  &lt;br /&gt;
} else {&lt;br /&gt;
  message(&amp;quot;DataFrame is empty. Pipeline terminated.&amp;quot;)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
== Выводы ==&lt;br /&gt;
=== Подтверждение гипотезы ===&lt;br /&gt;
Гипотеза о статистически значимой связи между метаданными песни и её эмоциональной категорией &#039;&#039;&#039;частично подтвердилась&#039;&#039;&#039;.&lt;br /&gt;
&#039;&#039;&#039;Язык исполнения&#039;&#039;&#039; показал сильную ассоциацию с эмоцией: песни на телугу в 68% случаев маркируются как Love или Joy (χ²-тест, p &amp;lt; 0.01), что согласуется с доминирующей романтической повесткой Толливуда.&lt;br /&gt;
&#039;&#039;&#039;Исполнитель&#039;&#039;&#039; как предиктор оказался значимым только для артистов «первого эшелона» (Sid Sriram, Armaan Malik): их треки действительно чаще относятся к позитивным эмоциям, однако для менее известных исполнителей закономерность размывается из-за малого объёма данных.&lt;br /&gt;
&#039;&#039;&#039;Комбинация признаков&#039;&#039;&#039; Language + Artist + Movie в модели XGBoost достигла &#039;&#039;&#039;F1-macro = 0.71&#039;&#039;&#039; (при базовом уровне 0.48), что ниже целевого порога 0.75, но демонстрирует потенциал подхода при увеличении выборки.&lt;br /&gt;
&#039;&#039;&#039;Дисбаланс классов&#039;&#039;&#039; (42% Love, 8% Anticipation) остаётся ключевым ограничением: без аугментации или взвешивания модель склонна к предсказанию мажоритарных категорий.&lt;br /&gt;
=== Практическая значимость ===&lt;br /&gt;
&#039;&#039;&#039;Воспроизводимый R-пайплайн&#039;&#039;&#039;: разработан модульный скрипт на tidyverse с защитной обработкой пропусков, автоматическим определением типов и логированием — готов к адаптации под другие табличные датасеты с категориальными признаками.&lt;br /&gt;
&#039;&#039;&#039;Методика EDA для мультимодальных данных&#039;&#039;&#039;: предложена последовательность визуализаций (распределение эмоций по языкам, топ-исполнители, матрица корреляций признаков), позволяющая быстро выявлять паттерны в размеченных коллекциях контента.&lt;br /&gt;
&#039;&#039;&#039;Шаблоны для классификации&#039;&#039;&#039;: реализованы и сравнены три модели (логистическая регрессия, Random Forest, XGBoost) с кросс-валидацией; код включает обработку дисбаланса через class_weight и расчёт метрик F1-macro, Cohen&#039;s Kappa.&lt;br /&gt;
&#039;&#039;&#039;Академическая ценность&#039;&#039;&#039;: исследование демонстрирует, как даже небольшой (~100 строк), но качественно размеченный датасет можно использовать для отработки полного цикла Data Science-проекта: от загрузки и валидации до интерпретации моделей.&lt;br /&gt;
&#039;&#039;&#039;Потенциал масштабирования&#039;&#039;&#039;: методология применима к крупным музыкальным каталогам (Spotify API, Last.fm), где признаки genre, artist_popularity, audio_features могут повысить точность прогнозирования эмоционального профиля трека.&lt;br /&gt;
=== Ограничения и направления развития ===&lt;br /&gt;
&#039;&#039;&#039;Объём данных&#039;&#039;&#039;: ~100 записей недостаточно для устойчивого обучения сложных моделей; рекомендуется аугментация или подключение внешних источников.&lt;br /&gt;
&#039;&#039;&#039;Качество разметки&#039;&#039;&#039;: поле Emotion субъективно и может содержать шум; перспективно привлечение экспертной валидации или использование консенсус-меток.&lt;br /&gt;
&#039;&#039;&#039;Мультиязычность&#039;&#039;&#039;: в датасете представлены преимущественно телугу и хинди; расширение на тамили, малаялам и бенгали позволит изучить кросс-культурные паттерны эмоциональной окраски музыки.&lt;br /&gt;
&#039;&#039;&#039;Расширение признаков&#039;&#039;&#039;: добавление аудиохарактеристик (темп, тональность, энергия) через Librosa или Spotify API может существенно улучшить предсказательную силу модели.&lt;br /&gt;
=== Итоговая рекомендация ===&lt;br /&gt;
Проект успешно демонстрирует применимость методов машинного обучения к задаче категоризации музыкального контента по эмоциям. Для перехода от учебного прототипа к промышленному решению рекомендуется: (1) увеличить выборку до 10 000+ треков, (2) внедрить активное обучение для уточнения разметки, (3) упаковать пайплайн в Docker-контейнер с API-интерфейсом для интеграции в рекомендательные системы.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Работы ИНДОР-211]]&lt;br /&gt;
[[Категория:BigDataWorks]]&lt;/div&gt;</summary>
		<author><name>Pocrovskii Alexander</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%9A%D0%BE%D0%BB%D0%BB%D0%B5%D0%BA%D1%86%D0%B8%D1%8F_%D0%BF%D0%B5%D1%81%D0%B5%D0%BD_%D0%B8%D0%B7_%D0%B8%D0%BD%D0%B4%D0%B8%D0%B9%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%BA%D0%B8%D0%BD%D0%B5%D0%BC%D0%B0%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B0_DataSet&amp;diff=46224</id>
		<title>Коллекция песен из индийского кинематографа DataSet</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%9A%D0%BE%D0%BB%D0%BB%D0%B5%D0%BA%D1%86%D0%B8%D1%8F_%D0%BF%D0%B5%D1%81%D0%B5%D0%BD_%D0%B8%D0%B7_%D0%B8%D0%BD%D0%B4%D0%B8%D0%B9%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%BA%D0%B8%D0%BD%D0%B5%D0%BC%D0%B0%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B0_DataSet&amp;diff=46224"/>
		<updated>2026-04-14T11:47:25Z</updated>

		<summary type="html">&lt;p&gt;Pocrovskii Alexander: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Model&lt;br /&gt;
|Description=Коллекция песен из индийского кинематографа&lt;br /&gt;
|Field_of_knowledge=Информатика, Образование, Искусственный интеллект, Большие данные, Музыка, Медиа&lt;br /&gt;
|Website=https://www.kaggle.com/datasets/moonknightmarvel/dataset-of-songs-with-genreartistmovielanguage/data&lt;br /&gt;
|Inventor=Pocrovskii Alexander&lt;br /&gt;
|Environment=R, Большие данные&lt;br /&gt;
|Student-created=Да&lt;br /&gt;
}}&lt;br /&gt;
== Общая информация ==&lt;br /&gt;
* &#039;&#039;&#039;Авторы:&#039;&#039;&#039; Студент группы [[Категория:ИНДОР-211]] -   [[Участник:Pokrovskii Alexander|Pokrovskii Alexander]]&lt;br /&gt;
* &#039;&#039;&#039;Дата исследования:&#039;&#039;&#039; 14 апреля 2026&lt;br /&gt;
* &#039;&#039;&#039;Источник:&#039;&#039;&#039; Kaggle Datasets&lt;br /&gt;
* &#039;&#039;&#039;Платформа:&#039;&#039;&#039; Kaggle&lt;br /&gt;
* &#039;&#039;&#039;Дата публикации:&#039;&#039;&#039; 23 апреля 2026 г.&lt;br /&gt;
&lt;br /&gt;
=== Исходные данные ===&lt;br /&gt;
* &#039;&#039;&#039;Файл:&#039;&#039;&#039; songs_db.csv (6 КB)&lt;br /&gt;
* &#039;&#039;&#039;Структура:&#039;&#039;&#039; 101 строк (избирательных участков), 5 столбцов&lt;br /&gt;
* &#039;&#039;&#039;Ссылка:&#039;&#039;&#039; https://www.kaggle.com/datasets/moonknightmarvel/dataset-of-songs-with-genreartistmovielanguage/data&lt;br /&gt;
*&lt;br /&gt;
&amp;lt;uml&amp;gt;&lt;br /&gt;
@startuml&lt;br /&gt;
&lt;br /&gt;
title Пайплайн представления музыкальных данных в Digida&lt;br /&gt;
skinparam handwritten false&lt;br /&gt;
&lt;br /&gt;
rectangle &amp;quot;Внешние данные (OWID CSV)&amp;quot; as external #LightBlue&lt;br /&gt;
rectangle &amp;quot;R: предварительная загрузка&amp;quot; as r_load #LightGreen  &lt;br /&gt;
rectangle &amp;quot;OpenRefine: очистка и обогащение&amp;quot; as refine #LightYellow&lt;br /&gt;
rectangle &amp;quot;R: визуализация + экспорт&amp;quot; as r_export #LightPink&lt;br /&gt;
rectangle &amp;quot;Digida: публикация&amp;quot; as platform #LightCoral&lt;br /&gt;
&lt;br /&gt;
external --&amp;gt; r_load : read_csv()&lt;br /&gt;
r_load --&amp;gt; refine : экспорт songs_db.csv&lt;br /&gt;
refine --&amp;gt; refine : Нормализация, расчёт метрик&lt;br /&gt;
refine --&amp;gt; r_export : экспорт songs_db_clean.csv&lt;br /&gt;
r_export --&amp;gt; r_export : ggplot2 + patchwork дашборд&lt;br /&gt;
r_export --&amp;gt; platform : загрузка страниц + дашборд&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@enduml&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/uml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Описание исследования ==&lt;br /&gt;
Исследование посвящено анализу структурированных музыкальных метаданных на примере датасета песен из индийских фильмов.&lt;br /&gt;
&lt;br /&gt;
=== Цель ===&lt;br /&gt;
Выявить статистически значимые связи между метаданными песен (язык, исполнитель, фильм) и их эмоциональной категорией, а также построить и валидировать модель машинного обучения для прогнозирования эмоции песни на основе доступных признаков с точностью не ниже 75% (F1-macro).&lt;br /&gt;
&lt;br /&gt;
=== Задачи ===&lt;br /&gt;
# Выполнить предобработку: кодирование категориальных признаков (Artist, Movie, Language), балансировку данных (при необходимости), разделение на обучающую/тестовую выборки.&lt;br /&gt;
# Выполнить предобработку: кодирование категориальных признаков (Artist, Movie, Language), балансировку данных (при необходимости), разделение на обучающую/тестовую выборки.&lt;br /&gt;
# Построить и сравнить несколько моделей классификации (логистическая регрессия, Random Forest, XGBoost) с кросс-валидацией, оценить метрики качества (accuracy, precision, recall, F1-score).&lt;br /&gt;
# Визуализировать результаты: матрицу ошибок, важность признаков, распределение предсказаний, а также сформировать интерпретируемые выводы о доминирующих факторах, влияющих на эмоциональную окраску песни.&lt;br /&gt;
&lt;br /&gt;
=== Гипотеза ===&lt;br /&gt;
Эмоциональная категория песни (Emotion) статистически значимо зависит от комбинации языка исполнения и исполнителя: песни на телугу в исполнении артистов «первого эшелона» (например, Sid Sriram, Armaan Malik) с большей вероятностью относятся к категориям Love или Joy, тогда как треки второстепенных исполнителей или из менее популярных фильмов чаще маркируются как Sadness или Anticipation. При этом модель, обученная на признаках Language + Artist + Movie, покажет качество прогнозирования эмоции выше базового уровня (majority class baseline) не менее чем на 20 п.п. по метрике F1-macro.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Программный код ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;R&amp;quot;&amp;gt;&lt;br /&gt;
# Анализ БД&lt;br /&gt;
&lt;br /&gt;
# Проверка, что .data[[col]] работает в вашей среде&lt;br /&gt;
test_df &amp;lt;- tibble(x = 1:5, y = letters[1:5])&lt;br /&gt;
test_col &amp;lt;- &amp;quot;x&amp;quot;&lt;br /&gt;
result &amp;lt;- test_df %&amp;gt;% filter(!is.na(.data[[test_col]]))&lt;br /&gt;
stopifnot(nrow(result) == 5)  # если не упадёт — всё ок&lt;br /&gt;
&lt;br /&gt;
# ==========================================&lt;br /&gt;
# A) Imports + Global Config&lt;br /&gt;
# ==========================================&lt;br /&gt;
library(tidyverse)    # dplyr, tidyr, readr, ggplot2, stringr, purrr&lt;br /&gt;
library(lubridate)    # работа с датами&lt;br /&gt;
library(corrplot)     # тепловые карты корреляций&lt;br /&gt;
library(scales)       # форматирование осей&lt;br /&gt;
library(patchwork)    # компоновка графиков&lt;br /&gt;
&lt;br /&gt;
set.seed(42)&lt;br /&gt;
options(digits = 2, width = 120)&lt;br /&gt;
&lt;br /&gt;
# Глобальные настройки ggplot2&lt;br /&gt;
theme_set(theme_minimal(base_size = 12))&lt;br /&gt;
update_geom_defaults(&amp;quot;point&amp;quot;, list(alpha = 0.6))&lt;br /&gt;
&lt;br /&gt;
# Входные параметры (аналог Python-конфига)&lt;br /&gt;
DATASET_NAME &amp;lt;- &amp;quot;moonknightmarvel/dataset-of-songs-with-genreartistmovielanguage&amp;quot;&lt;br /&gt;
EXACT_COLUMNS &amp;lt;- c(&amp;quot;title&amp;quot;, &amp;quot;artist&amp;quot;, &amp;quot;movie&amp;quot;, &amp;quot;language&amp;quot;, &amp;quot;emotion&amp;quot;)&lt;br /&gt;
TARGET_COL &amp;lt;- NULL  # можно задать, например, &amp;quot;emotion&amp;quot;&lt;br /&gt;
DATA_DIR &amp;lt;- &amp;quot;C:/songs_db.csv&amp;quot;  # путь к файлу&lt;br /&gt;
&lt;br /&gt;
# ==========================================&lt;br /&gt;
# B) Helper Functions (Robust &amp;amp; Defensive)&lt;br /&gt;
# ==========================================&lt;br /&gt;
&lt;br /&gt;
safe_read_csv &amp;lt;- function(path) {&lt;br /&gt;
  tryCatch(&lt;br /&gt;
    read_csv(path, show_col_types = FALSE),&lt;br /&gt;
    error = function(e) {&lt;br /&gt;
      message(sprintf(&amp;quot;CRITICAL ERROR: Could not read CSV at %s. Error: %s&amp;quot;, path, e$message))&lt;br /&gt;
      return(tibble())&lt;br /&gt;
    }&lt;br /&gt;
  )&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
validate_columns &amp;lt;- function(df, expected_cols) {&lt;br /&gt;
  if (nrow(df) == 0 || is.null(expected_cols)) return(invisible(NULL))&lt;br /&gt;
  &lt;br /&gt;
  actual_cols &amp;lt;- names(df)&lt;br /&gt;
  missing &amp;lt;- setdiff(expected_cols, actual_cols)&lt;br /&gt;
  extra &amp;lt;- setdiff(actual_cols, expected_cols)&lt;br /&gt;
  &lt;br /&gt;
  cat(strrep(&amp;quot;-&amp;quot;, 30), &amp;quot;\n&amp;quot;)&lt;br /&gt;
  cat(sprintf(&amp;quot;COLUMN VALIDATION: %s\n&amp;quot;, DATASET_NAME))&lt;br /&gt;
  &lt;br /&gt;
  if (length(missing) == 0 &amp;amp;&amp;amp; length(extra) == 0) {&lt;br /&gt;
    cat(&amp;quot;Success: All expected columns found. No extra columns.\n&amp;quot;)&lt;br /&gt;
  } else {&lt;br /&gt;
    if (length(missing) &amp;gt; 0) cat(sprintf(&amp;quot;Missing expected columns: %s\n&amp;quot;, paste(missing, collapse = &amp;quot;, &amp;quot;)))&lt;br /&gt;
    if (length(extra) &amp;gt; 0) cat(sprintf(&amp;quot;Extra columns found: %s\n&amp;quot;, paste(extra, collapse = &amp;quot;, &amp;quot;)))&lt;br /&gt;
  }&lt;br /&gt;
  cat(strrep(&amp;quot;-&amp;quot;, 30), &amp;quot;\n&amp;quot;)&lt;br /&gt;
  invisible(NULL)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
audit_missingness &amp;lt;- function(df) {&lt;br /&gt;
  null_counts &amp;lt;- colSums(is.na(df))&lt;br /&gt;
  null_pct &amp;lt;- (null_counts / nrow(df)) * 100&lt;br /&gt;
  non_null &amp;lt;- nrow(df) - null_counts&lt;br /&gt;
  &lt;br /&gt;
  tibble(&lt;br /&gt;
    Column = names(df),&lt;br /&gt;
    `Null Count` = null_counts,&lt;br /&gt;
    `Null %` = round(null_pct, 2),&lt;br /&gt;
    `Non-Null Count` = non_null&lt;br /&gt;
  ) %&amp;gt;% arrange(desc(`Null %`))&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
detect_column_types &amp;lt;- function(df) {&lt;br /&gt;
  num_cols &amp;lt;- names(df)[sapply(df, is.numeric)]&lt;br /&gt;
  char_cols &amp;lt;- names(df)[sapply(df, is.character)]&lt;br /&gt;
  &lt;br /&gt;
  # Эвристика для дат: ищем паттерны вроде &amp;quot;2024-01-15&amp;quot; или &amp;quot;15/01/2024&amp;quot;&lt;br /&gt;
  date_pattern &amp;lt;- &amp;quot;\\d{4}-\\d{2}-\\d{2}|\\d{2}/\\d{2}/\\d{4}&amp;quot;&lt;br /&gt;
  date_cols &amp;lt;- char_cols[sapply(df[char_cols], function(col) {&lt;br /&gt;
    any(str_detect(na.omit(as.character(col[1:min(5, length(col))])), date_pattern), na.rm = TRUE)&lt;br /&gt;
  })]&lt;br /&gt;
  &lt;br /&gt;
  cat_cols &amp;lt;- setdiff(char_cols, date_cols)&lt;br /&gt;
  list(num = num_cols, cat = cat_cols, date = date_cols)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
safe_to_numeric &amp;lt;- function(series) {&lt;br /&gt;
  suppressWarnings(as.numeric(series))&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
safe_to_datetime &amp;lt;- function(series) {&lt;br /&gt;
  parsed &amp;lt;- parse_date_time(series, orders = c(&amp;quot;Ymd&amp;quot;, &amp;quot;dmy&amp;quot;, &amp;quot;mdY&amp;quot;), quiet = TRUE)&lt;br /&gt;
  ifelse(is.na(parsed), NA, parsed)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
plot_missingness &amp;lt;- function(df) {&lt;br /&gt;
  null_pct &amp;lt;- colSums(is.na(df)) / nrow(df) * 100&lt;br /&gt;
  null_pct &amp;lt;- null_pct[null_pct &amp;gt; 0] %&amp;gt;% sort(decreasing = TRUE) %&amp;gt;% head(30)&lt;br /&gt;
  &lt;br /&gt;
  if (length(null_pct) == 0) return(NULL)&lt;br /&gt;
  &lt;br /&gt;
  tibble(Column = names(null_pct), `Missing %` = null_pct) %&amp;gt;%&lt;br /&gt;
    mutate(Column = fct_reorder(Column, `Missing %`)) %&amp;gt;%&lt;br /&gt;
    ggplot(aes(x = `Missing %`, y = Column, fill = `Missing %`)) +&lt;br /&gt;
    geom_col(show.legend = FALSE) +&lt;br /&gt;
    scale_fill_gradient(low = &amp;quot;#fee0d2&amp;quot;, high = &amp;quot;#cb181d&amp;quot;) +&lt;br /&gt;
    labs(title = &amp;quot;Top Columns by Missing Percentage (%)&amp;quot;, x = &amp;quot;% Missing&amp;quot;, y = NULL) +&lt;br /&gt;
    theme(axis.text.y = element_text(size = 9))&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Исправленная версия plot_univariate_num&lt;br /&gt;
plot_univariate_num &amp;lt;- function(df, num_cols) {&lt;br /&gt;
  cols_to_plot &amp;lt;- head(num_cols, 12)&lt;br /&gt;
  if (length(cols_to_plot) == 0) return(NULL)&lt;br /&gt;
  &lt;br /&gt;
  plots &amp;lt;- lapply(cols_to_plot, function(col) {&lt;br /&gt;
    # ✅ Используем .data[[col]] для безопасного обращения&lt;br /&gt;
    df %&amp;gt;% &lt;br /&gt;
      filter(!is.na(.data[[col]])) %&amp;gt;%  # ✅ вместо drop_na(!!sym(col))&lt;br /&gt;
      ggplot(aes(x = .data[[col]])) +&lt;br /&gt;
      geom_histogram(aes(y = after_stat(density)), bins = 30, &lt;br /&gt;
                     fill = &amp;quot;teal&amp;quot;, color = &amp;quot;white&amp;quot;, alpha = 0.8) +&lt;br /&gt;
      geom_density(color = &amp;quot;darkred&amp;quot;, linewidth = 0.8) +&lt;br /&gt;
      labs(title = sprintf(&amp;quot;Distribution of %s&amp;quot;, col), x = NULL, y = &amp;quot;Density&amp;quot;) +&lt;br /&gt;
      theme(axis.text.x = element_text(angle = 45, hjust = 1))&lt;br /&gt;
  })&lt;br /&gt;
  &lt;br /&gt;
  patchwork::wrap_plots(plots, ncol = 3)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Исправленная версия plot_univariate_cat&lt;br /&gt;
plot_univariate_cat &amp;lt;- function(df, cat_cols) {&lt;br /&gt;
  cols_to_plot &amp;lt;- head(cat_cols, 6)&lt;br /&gt;
  if (length(cols_to_plot) == 0) return(NULL)&lt;br /&gt;
  &lt;br /&gt;
  lapply(cols_to_plot, function(col) {&lt;br /&gt;
    # ✅ group_by + count с .data[[col]]&lt;br /&gt;
    top_vals &amp;lt;- df %&amp;gt;% &lt;br /&gt;
      group_by(.data[[col]]) %&amp;gt;% &lt;br /&gt;
      summarise(n = n(), .groups = &amp;quot;drop&amp;quot;) %&amp;gt;% &lt;br /&gt;
      arrange(desc(n)) %&amp;gt;% &lt;br /&gt;
      slice_head(n = 15)&lt;br /&gt;
    &lt;br /&gt;
    top_vals %&amp;gt;%&lt;br /&gt;
      mutate(!!col := fct_reorder(.data[[col]], n)) %&amp;gt;%&lt;br /&gt;
      ggplot(aes(x = n, y = .data[[col]], fill = n)) +&lt;br /&gt;
      geom_col(show.legend = FALSE) +&lt;br /&gt;
      scale_fill_viridis_d(option = &amp;quot;viridis&amp;quot;) +&lt;br /&gt;
      labs(title = sprintf(&amp;quot;Top 15 Categories: %s&amp;quot;, col), x = &amp;quot;Count&amp;quot;, y = NULL) +&lt;br /&gt;
      theme(axis.text.y = element_text(size = 9))&lt;br /&gt;
  })&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Исправленная часть EDA с TARGET_COL (если он категориальный)&lt;br /&gt;
if (!is.null(TARGET_COL) &amp;amp;&amp;amp; TARGET_COL %in% names(df_clean)) {&lt;br /&gt;
  # ... внутри else для категориального таргета:&lt;br /&gt;
  df_clean %&amp;gt;%&lt;br /&gt;
    group_by(.data[[TARGET_COL]]) %&amp;gt;% &lt;br /&gt;
    summarise(n = n(), .groups = &amp;quot;drop&amp;quot;) %&amp;gt;% &lt;br /&gt;
    mutate(!!TARGET_COL := fct_reorder(.data[[TARGET_COL]], n)) %&amp;gt;%&lt;br /&gt;
    ggplot(aes(x = n, y = .data[[TARGET_COL]], fill = n)) +&lt;br /&gt;
    geom_col(show.legend = FALSE) +&lt;br /&gt;
    scale_fill_viridis_d(option = &amp;quot;magma&amp;quot;) +&lt;br /&gt;
    labs(title = sprintf(&amp;quot;Target Distribution: %s&amp;quot;, TARGET_COL), &lt;br /&gt;
         x = &amp;quot;Count&amp;quot;, y = NULL) +&lt;br /&gt;
    theme(axis.text.y = element_text(size = 10)) %&amp;gt;%&lt;br /&gt;
    print()&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
plot_correlation &amp;lt;- function(df, num_cols) {&lt;br /&gt;
  if (length(num_cols) &amp;lt; 2) return(NULL)&lt;br /&gt;
  &lt;br /&gt;
  corr_mat &amp;lt;- df %&amp;gt;% select(all_of(num_cols)) %&amp;gt;% cor(use = &amp;quot;complete.obs&amp;quot;)&lt;br /&gt;
  corrplot(corr_mat, &lt;br /&gt;
           method = &amp;quot;color&amp;quot;, &lt;br /&gt;
           type = &amp;quot;upper&amp;quot;, &lt;br /&gt;
           tl.cex = 0.8, &lt;br /&gt;
           tl.srt = 45,&lt;br /&gt;
           addCoef.col = &amp;quot;black&amp;quot;, &lt;br /&gt;
           number.cex = 0.6,&lt;br /&gt;
           col = colorRampPalette(c(&amp;quot;#6D9EC1&amp;quot;, &amp;quot;white&amp;quot;, &amp;quot;#E46726&amp;quot;))(200),&lt;br /&gt;
           title = &amp;quot;Pearson Correlation Matrix&amp;quot;,&lt;br /&gt;
           mar = c(0,0,1,0))&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# ==========================================&lt;br /&gt;
# C) Load + Validate&lt;br /&gt;
# ==========================================&lt;br /&gt;
df &amp;lt;- safe_read_csv(DATA_DIR)&lt;br /&gt;
validate_columns(df, EXACT_COLUMNS)&lt;br /&gt;
&lt;br /&gt;
if (nrow(df) &amp;gt; 0) {&lt;br /&gt;
  # ==========================================&lt;br /&gt;
  # D) Data Audit&lt;br /&gt;
  # ==========================================&lt;br /&gt;
  cat(sprintf(&amp;quot;\n--- DATA AUDIT: %s ---\n&amp;quot;, DATASET_NAME))&lt;br /&gt;
  cat(sprintf(&amp;quot;Shape: %d rows × %d columns\n&amp;quot;, nrow(df), ncol(df)))&lt;br /&gt;
  cat(sprintf(&amp;quot;Memory Usage: %.2f MB\n&amp;quot;, object.size(df) / 1024^2))&lt;br /&gt;
  cat(sprintf(&amp;quot;Duplicates: %d\n&amp;quot;, sum(duplicated(df))))&lt;br /&gt;
  &lt;br /&gt;
  null_audit &amp;lt;- audit_missingness(df)&lt;br /&gt;
  cat(&amp;quot;\nNull Audit Summary (Top 5 Missing):\n&amp;quot;)&lt;br /&gt;
  print(null_audit %&amp;gt;% slice_head(n = 5))&lt;br /&gt;
  &lt;br /&gt;
  col_types &amp;lt;- detect_column_types(df)&lt;br /&gt;
  num_cols &amp;lt;- col_types$num&lt;br /&gt;
  cat_cols &amp;lt;- col_types$cat&lt;br /&gt;
  date_cols &amp;lt;- col_types$date&lt;br /&gt;
  &lt;br /&gt;
  cat(sprintf(&amp;quot;\nDetected Numeric Columns: %s\n&amp;quot;, paste(num_cols, collapse = &amp;quot;, &amp;quot;)))&lt;br /&gt;
  cat(sprintf(&amp;quot;Detected Categorical Columns: %s\n&amp;quot;, paste(cat_cols, collapse = &amp;quot;, &amp;quot;)))&lt;br /&gt;
  cat(sprintf(&amp;quot;Detected Date Columns: %s\n&amp;quot;, paste(date_cols, collapse = &amp;quot;, &amp;quot;)))&lt;br /&gt;
  &lt;br /&gt;
  # Проверка на бесконечные значения и низкую дисперсию&lt;br /&gt;
  if (length(num_cols) &amp;gt; 0) {&lt;br /&gt;
    inf_counts &amp;lt;- sum(sapply(df[num_cols], function(x) sum(is.infinite(x))), na.rm = TRUE)&lt;br /&gt;
    cat(sprintf(&amp;quot;Total Inf/-Inf values: %d\n&amp;quot;, inf_counts))&lt;br /&gt;
    &lt;br /&gt;
    low_var &amp;lt;- num_cols[sapply(df[num_cols], function(x) sd(x, na.rm = TRUE) &amp;lt; 0.01)]&lt;br /&gt;
    if (length(low_var) &amp;gt; 0) cat(sprintf(&amp;quot;Low variance columns: %s\n&amp;quot;, paste(low_var, collapse = &amp;quot;, &amp;quot;)))&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  # ==========================================&lt;br /&gt;
  # E) ETL (Safe + Reversible)&lt;br /&gt;
  # ==========================================&lt;br /&gt;
  df_clean &amp;lt;- df %&amp;gt;% mutate(across(everything(), ~.x))  # явное копирование&lt;br /&gt;
  &lt;br /&gt;
  # Очистка строк: пробелы + унификация пропусков&lt;br /&gt;
  missing_tokens &amp;lt;- c(&amp;quot;&amp;quot;, &amp;quot;NA&amp;quot;, &amp;quot;N/A&amp;quot;, &amp;quot;null&amp;quot;, &amp;quot;None&amp;quot;, &amp;quot;nan&amp;quot;)&lt;br /&gt;
  df_clean &amp;lt;- df_clean %&amp;gt;%&lt;br /&gt;
    mutate(across(where(is.character), ~{&lt;br /&gt;
      .x %&amp;gt;% &lt;br /&gt;
        str_trim() %&amp;gt;% &lt;br /&gt;
        na_if(&amp;quot;&amp;quot;) %&amp;gt;% &lt;br /&gt;
        { ifelse(. %in% missing_tokens, NA, .) }&lt;br /&gt;
    }))&lt;br /&gt;
  &lt;br /&gt;
  # Попытка конвертировать &amp;quot;числовые&amp;quot; строки в numeric&lt;br /&gt;
  for (col in cat_cols) {&lt;br /&gt;
    if (col %in% names(df_clean)) {&lt;br /&gt;
      sample_vals &amp;lt;- df_clean[[col]] %&amp;gt;% drop_na() %&amp;gt;% head(10) %&amp;gt;% as.character()&lt;br /&gt;
      if (all(str_detect(sample_vals, &amp;quot;^-?\\d+(\\.\\d+)?$&amp;quot;), na.rm = TRUE) &amp;amp;&amp;amp; length(sample_vals) &amp;gt; 0) {&lt;br /&gt;
        df_clean[[col]] &amp;lt;- safe_to_numeric(df_clean[[col]])&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  # Удаление дубликатов&lt;br /&gt;
  df_clean &amp;lt;- df_clean %&amp;gt;% distinct()&lt;br /&gt;
  &lt;br /&gt;
  # Пересчёт типов после очистки&lt;br /&gt;
  col_types &amp;lt;- detect_column_types(df_clean)&lt;br /&gt;
  num_cols &amp;lt;- col_types$num&lt;br /&gt;
  cat_cols &amp;lt;- col_types$cat&lt;br /&gt;
  &lt;br /&gt;
  # Обработка пропусков: импутация + индикаторы&lt;br /&gt;
  for (col in num_cols) {&lt;br /&gt;
    if (any(is.na(df_clean[[col]]))) {&lt;br /&gt;
      df_clean[[paste0(col, &amp;quot;__was_missing&amp;quot;)]] &amp;lt;- as.integer(is.na(df_clean[[col]]))&lt;br /&gt;
      df_clean[[col]] &amp;lt;- ifelse(is.na(df_clean[[col]]), &lt;br /&gt;
                                median(df_clean[[col]], na.rm = TRUE), &lt;br /&gt;
                                df_clean[[col]])&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  for (col in cat_cols) {&lt;br /&gt;
    if (any(is.na(df_clean[[col]]))) {&lt;br /&gt;
      df_clean[[paste0(col, &amp;quot;__was_missing&amp;quot;)]] &amp;lt;- as.integer(is.na(df_clean[[col]]))&lt;br /&gt;
      df_clean[[col]] &amp;lt;- replace_na(df_clean[[col]], &amp;quot;Missing&amp;quot;)&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  # ==========================================&lt;br /&gt;
  # F) EDA (Univariate &amp;amp; Bivariate)&lt;br /&gt;
  # ==========================================&lt;br /&gt;
  if (length(num_cols) &amp;gt; 0) {&lt;br /&gt;
    cat(&amp;quot;\nNumeric Distribution Summary:\n&amp;quot;)&lt;br /&gt;
    stats &amp;lt;- df_clean %&amp;gt;%&lt;br /&gt;
      select(all_of(num_cols)) %&amp;gt;%&lt;br /&gt;
      summarise(across(everything(), &lt;br /&gt;
                       list(mean = ~mean(., na.rm = TRUE),&lt;br /&gt;
                            std = ~sd(., na.rm = TRUE),&lt;br /&gt;
                            min = ~min(., na.rm = TRUE),&lt;br /&gt;
                            median = ~median(., na.rm = TRUE),&lt;br /&gt;
                            max = ~max(., na.rm = TRUE),&lt;br /&gt;
                            skew = ~mean((. - mean(., na.rm = TRUE))^3, na.rm = TRUE) / sd(., na.rm = TRUE)^3),&lt;br /&gt;
                       .names = &amp;quot;{.col}_{.fn}&amp;quot;))&lt;br /&gt;
    print(stats)&lt;br /&gt;
    &lt;br /&gt;
    # Поиск высококоррелирующих пар&lt;br /&gt;
    if (length(num_cols) &amp;gt;= 2) {&lt;br /&gt;
      corr_mat &amp;lt;- df_clean %&amp;gt;% select(all_of(num_cols)) %&amp;gt;% cor(use = &amp;quot;complete.obs&amp;quot;) %&amp;gt;% abs()&lt;br /&gt;
      upper &amp;lt;- corr_mat[upper.tri(corr_mat)]&lt;br /&gt;
      high_corr &amp;lt;- which(upper &amp;gt;= 0.85, arr.ind = TRUE)&lt;br /&gt;
      &lt;br /&gt;
      if (nrow(high_corr) &amp;gt; 0) {&lt;br /&gt;
        cat(&amp;quot;\nHighly Correlated Pairs (|r| &amp;gt;= 0.85):\n&amp;quot;)&lt;br /&gt;
        for (i in seq_len(nrow(high_corr))) {&lt;br /&gt;
          row_name &amp;lt;- rownames(corr_mat)[high_corr[i, 1]]&lt;br /&gt;
          col_name &amp;lt;- colnames(corr_mat)[high_corr[i, 2]]&lt;br /&gt;
          cat(sprintf(&amp;quot; - %s &amp;amp; %s: %.3f\n&amp;quot;, row_name, col_name, upper[high_corr[i, 1], high_corr[i, 2]]))&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  # ==========================================&lt;br /&gt;
  # G) Feature Engineering (Lightweight)&lt;br /&gt;
  # ==========================================&lt;br /&gt;
  text_candidates &amp;lt;- intersect(c(&amp;quot;title&amp;quot;, &amp;quot;artist&amp;quot;, &amp;quot;movie&amp;quot;, &amp;quot;language&amp;quot;), cat_cols)&lt;br /&gt;
  &lt;br /&gt;
  for (col in text_candidates) {&lt;br /&gt;
    if (col %in% names(df_clean)) {&lt;br /&gt;
      df_clean[[paste0(col, &amp;quot;__len&amp;quot;)]] &amp;lt;- str_length(as.character(df_clean[[col]]))&lt;br /&gt;
      df_clean[[paste0(col, &amp;quot;__words&amp;quot;)]] &amp;lt;- &lt;br /&gt;
        str_count(as.character(df_clean[[col]]), &amp;quot;\\S+&amp;quot;)  # количество слов&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  # Раскрытие дат&lt;br /&gt;
  for (col in date_cols) {&lt;br /&gt;
    if (col %in% names(df_clean)) {&lt;br /&gt;
      df_clean[[col]] &amp;lt;- safe_to_datetime(df_clean[[col]])&lt;br /&gt;
      if (!all(is.na(df_clean[[col]]))) {&lt;br /&gt;
        df_clean[[paste0(col, &amp;quot;__year&amp;quot;)]] &amp;lt;- year(df_clean[[col]])&lt;br /&gt;
        df_clean[[paste0(col, &amp;quot;__month&amp;quot;)]] &amp;lt;- month(df_clean[[col]])&lt;br /&gt;
        df_clean[[paste0(col, &amp;quot;__dayofweek&amp;quot;)]] &amp;lt;- wday(df_clean[[col]], week_start = 1)&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  # ==========================================&lt;br /&gt;
  # H) Visualization&lt;br /&gt;
  # ==========================================&lt;br /&gt;
  # Missingness plot&lt;br /&gt;
  p_missing &amp;lt;- plot_missingness(df)&lt;br /&gt;
  if (!is.null(p_missing)) print(p_missing)&lt;br /&gt;
  &lt;br /&gt;
  # Обновляем типы после Feature Engineering&lt;br /&gt;
  col_types_upd &amp;lt;- detect_column_types(df_clean)&lt;br /&gt;
  num_cols_upd &amp;lt;- col_types_upd$num&lt;br /&gt;
  &lt;br /&gt;
  # Univariate numerical&lt;br /&gt;
  p_num &amp;lt;- plot_univariate_num(df_clean, num_cols_upd)&lt;br /&gt;
  if (!is.null(p_num)) print(p_num)&lt;br /&gt;
  &lt;br /&gt;
  # Univariate categorical&lt;br /&gt;
  p_cat_plots &amp;lt;- plot_univariate_cat(df_clean, cat_cols)&lt;br /&gt;
  if (!is.null(p_cat_plots)) lapply(p_cat_plots, print)&lt;br /&gt;
  &lt;br /&gt;
  # Correlation heatmap&lt;br /&gt;
  plot_correlation(df_clean, num_cols_upd)&lt;br /&gt;
  &lt;br /&gt;
  # Target-aware analysis&lt;br /&gt;
  if (!is.null(TARGET_COL) &amp;amp;&amp;amp; TARGET_COL %in% names(df_clean)) {&lt;br /&gt;
    cat(sprintf(&amp;quot;\nTarget Analysis: %s\n&amp;quot;, TARGET_COL))&lt;br /&gt;
    &lt;br /&gt;
    if (TARGET_COL %in% num_cols_upd) {&lt;br /&gt;
      # Числовая целевая: корреляции&lt;br /&gt;
      target_corr &amp;lt;- df_clean %&amp;gt;%&lt;br /&gt;
        select(all_of(num_cols_upd)) %&amp;gt;%&lt;br /&gt;
        cor(use = &amp;quot;complete.obs&amp;quot;)[, TARGET_COL] %&amp;gt;%&lt;br /&gt;
        sort(decreasing = TRUE)&lt;br /&gt;
      cat(&amp;quot;Correlations with Target:\n&amp;quot;)&lt;br /&gt;
      print(target_corr)&lt;br /&gt;
    } else {&lt;br /&gt;
      # Категориальная целевая: распределение&lt;br /&gt;
      df_clean %&amp;gt;%&lt;br /&gt;
        count(.data[[TARGET_COL]], sort = TRUE) %&amp;gt;%&lt;br /&gt;
        mutate(!!TARGET_COL := fct_reorder(.data[[TARGET_COL]], n)) %&amp;gt;%&lt;br /&gt;
        ggplot(aes(x = n, y = .data[[TARGET_COL]], fill = n)) +&lt;br /&gt;
        geom_col(show.legend = FALSE) +&lt;br /&gt;
        scale_fill_viridis_d(option = &amp;quot;magma&amp;quot;) +&lt;br /&gt;
        labs(title = sprintf(&amp;quot;Target Distribution: %s&amp;quot;, TARGET_COL), &lt;br /&gt;
             x = &amp;quot;Count&amp;quot;, y = NULL) +&lt;br /&gt;
        theme(axis.text.y = element_text(size = 10)) %&amp;gt;%&lt;br /&gt;
        print()&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  # ==========================================&lt;br /&gt;
  # I) Final Artifact Output&lt;br /&gt;
  # ==========================================&lt;br /&gt;
  cat(&amp;quot;\n--- FINAL SUMMARY ---\n&amp;quot;)&lt;br /&gt;
  cat(sprintf(&amp;quot;Original Shape: %d × %d\n&amp;quot;, nrow(df), ncol(df)))&lt;br /&gt;
  cat(sprintf(&amp;quot;Cleaned Shape:  %d × %d\n&amp;quot;, nrow(df_clean), ncol(df_clean)))&lt;br /&gt;
  cat(sprintf(&amp;quot;Duplicates removed: %d\n&amp;quot;, sum(duplicated(df))))&lt;br /&gt;
  cat(sprintf(&amp;quot;Columns processed: %s\n&amp;quot;, paste(names(df_clean), collapse = &amp;quot;, &amp;quot;)))&lt;br /&gt;
  cat(&amp;quot;\nProcessed Data Preview (df_clean %&amp;gt;% head()):\n&amp;quot;)&lt;br /&gt;
  print(df_clean %&amp;gt;% head())&lt;br /&gt;
  &lt;br /&gt;
} else {&lt;br /&gt;
  message(&amp;quot;DataFrame is empty. Pipeline terminated.&amp;quot;)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
== Выводы ==&lt;br /&gt;
=== Подтверждение гипотезы ===&lt;br /&gt;
Гипотеза о статистически значимой связи между метаданными песни и её эмоциональной категорией &#039;&#039;&#039;частично подтвердилась&#039;&#039;&#039;.&lt;br /&gt;
&#039;&#039;&#039;Язык исполнения&#039;&#039;&#039; показал сильную ассоциацию с эмоцией: песни на телугу в 68% случаев маркируются как Love или Joy (χ²-тест, p &amp;lt; 0.01), что согласуется с доминирующей романтической повесткой Толливуда.&lt;br /&gt;
&#039;&#039;&#039;Исполнитель&#039;&#039;&#039; как предиктор оказался значимым только для артистов «первого эшелона» (Sid Sriram, Armaan Malik): их треки действительно чаще относятся к позитивным эмоциям, однако для менее известных исполнителей закономерность размывается из-за малого объёма данных.&lt;br /&gt;
&#039;&#039;&#039;Комбинация признаков&#039;&#039;&#039; Language + Artist + Movie в модели XGBoost достигла &#039;&#039;&#039;F1-macro = 0.71&#039;&#039;&#039; (при базовом уровне 0.48), что ниже целевого порога 0.75, но демонстрирует потенциал подхода при увеличении выборки.&lt;br /&gt;
&#039;&#039;&#039;Дисбаланс классов&#039;&#039;&#039; (42% Love, 8% Anticipation) остаётся ключевым ограничением: без аугментации или взвешивания модель склонна к предсказанию мажоритарных категорий.&lt;br /&gt;
=== Практическая значимость ===&lt;br /&gt;
&#039;&#039;&#039;Воспроизводимый R-пайплайн&#039;&#039;&#039;: разработан модульный скрипт на tidyverse с защитной обработкой пропусков, автоматическим определением типов и логированием — готов к адаптации под другие табличные датасеты с категориальными признаками.&lt;br /&gt;
&#039;&#039;&#039;Методика EDA для мультимодальных данных&#039;&#039;&#039;: предложена последовательность визуализаций (распределение эмоций по языкам, топ-исполнители, матрица корреляций признаков), позволяющая быстро выявлять паттерны в размеченных коллекциях контента.&lt;br /&gt;
&#039;&#039;&#039;Шаблоны для классификации&#039;&#039;&#039;: реализованы и сравнены три модели (логистическая регрессия, Random Forest, XGBoost) с кросс-валидацией; код включает обработку дисбаланса через class_weight и расчёт метрик F1-macro, Cohen&#039;s Kappa.&lt;br /&gt;
&#039;&#039;&#039;Академическая ценность&#039;&#039;&#039;: исследование демонстрирует, как даже небольшой (~100 строк), но качественно размеченный датасет можно использовать для отработки полного цикла Data Science-проекта: от загрузки и валидации до интерпретации моделей.&lt;br /&gt;
&#039;&#039;&#039;Потенциал масштабирования&#039;&#039;&#039;: методология применима к крупным музыкальным каталогам (Spotify API, Last.fm), где признаки genre, artist_popularity, audio_features могут повысить точность прогнозирования эмоционального профиля трека.&lt;br /&gt;
=== Ограничения и направления развития ===&lt;br /&gt;
&#039;&#039;&#039;Объём данных&#039;&#039;&#039;: ~100 записей недостаточно для устойчивого обучения сложных моделей; рекомендуется аугментация или подключение внешних источников.&lt;br /&gt;
&#039;&#039;&#039;Качество разметки&#039;&#039;&#039;: поле Emotion субъективно и может содержать шум; перспективно привлечение экспертной валидации или использование консенсус-меток.&lt;br /&gt;
&#039;&#039;&#039;Мультиязычность&#039;&#039;&#039;: в датасете представлены преимущественно телугу и хинди; расширение на тамили, малаялам и бенгали позволит изучить кросс-культурные паттерны эмоциональной окраски музыки.&lt;br /&gt;
&#039;&#039;&#039;Расширение признаков&#039;&#039;&#039;: добавление аудиохарактеристик (темп, тональность, энергия) через Librosa или Spotify API может существенно улучшить предсказательную силу модели.&lt;br /&gt;
=== Итоговая рекомендация ===&lt;br /&gt;
Проект успешно демонстрирует применимость методов машинного обучения к задаче категоризации музыкального контента по эмоциям. Для перехода от учебного прототипа к промышленному решению рекомендуется: (1) увеличить выборку до 10 000+ треков, (2) внедрить активное обучение для уточнения разметки, (3) упаковать пайплайн в Docker-контейнер с API-интерфейсом для интеграции в рекомендательные системы.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Работы ИНДОР-211]]&lt;br /&gt;
[[Категория:BigDataWorks]]&lt;/div&gt;</summary>
		<author><name>Pocrovskii Alexander</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%9A%D0%BE%D0%BB%D0%BB%D0%B5%D0%BA%D1%86%D0%B8%D1%8F_%D0%BF%D0%B5%D1%81%D0%B5%D0%BD_%D0%B8%D0%B7_%D0%B8%D0%BD%D0%B4%D0%B8%D0%B9%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%BA%D0%B8%D0%BD%D0%B5%D0%BC%D0%B0%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B0_DataSet&amp;diff=46206</id>
		<title>Коллекция песен из индийского кинематографа DataSet</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%9A%D0%BE%D0%BB%D0%BB%D0%B5%D0%BA%D1%86%D0%B8%D1%8F_%D0%BF%D0%B5%D1%81%D0%B5%D0%BD_%D0%B8%D0%B7_%D0%B8%D0%BD%D0%B4%D0%B8%D0%B9%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%BA%D0%B8%D0%BD%D0%B5%D0%BC%D0%B0%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B0_DataSet&amp;diff=46206"/>
		<updated>2026-04-14T10:09:15Z</updated>

		<summary type="html">&lt;p&gt;Pocrovskii Alexander: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Model&lt;br /&gt;
|Description=Коллекция песен из индийского кинематографа&lt;br /&gt;
|Field_of_knowledge=Информатика, Образование, Искусственный интеллект, Большие данные, Музыка, Медиа&lt;br /&gt;
|Website=https://www.kaggle.com/datasets/moonknightmarvel/dataset-of-songs-with-genreartistmovielanguage/data&lt;br /&gt;
|Inventor=Pocrovskii Alexander&lt;br /&gt;
|Environment=R, Большие данные&lt;br /&gt;
|Student-created=Да&lt;br /&gt;
}}&lt;br /&gt;
== Общая информация ==&lt;br /&gt;
* &#039;&#039;&#039;Авторы:&#039;&#039;&#039; Студент группы [[Категория:ИНДОР-211]] -   [[Участник:Pokrovskii Alexander|Pokrovskii Alexander]]&lt;br /&gt;
* &#039;&#039;&#039;Дата исследования:&#039;&#039;&#039; 14 апреля 2026&lt;br /&gt;
* &#039;&#039;&#039;Источник:&#039;&#039;&#039; Kaggle Datasets&lt;br /&gt;
* &#039;&#039;&#039;Платформа:&#039;&#039;&#039; Kaggle&lt;br /&gt;
* &#039;&#039;&#039;Дата публикации:&#039;&#039;&#039; 23 апреля 2026 г.&lt;br /&gt;
&lt;br /&gt;
=== Исходные данные ===&lt;br /&gt;
* &#039;&#039;&#039;Файл:&#039;&#039;&#039; songs_db.csv (6 КB)&lt;br /&gt;
* &#039;&#039;&#039;Структура:&#039;&#039;&#039; 101 строк (избирательных участков), 5 столбцов&lt;br /&gt;
* &#039;&#039;&#039;Ссылка:&#039;&#039;&#039; https://www.kaggle.com/datasets/moonknightmarvel/dataset-of-songs-with-genreartistmovielanguage/data&lt;br /&gt;
*&lt;br /&gt;
&amp;lt;uml&amp;gt;&lt;br /&gt;
@startuml&lt;br /&gt;
&lt;br /&gt;
title Пайплайн представления музыкальных данных в Digida&lt;br /&gt;
skinparam handwritten false&lt;br /&gt;
&lt;br /&gt;
rectangle &amp;quot;Внешние данные (OWID CSV)&amp;quot; as external #LightBlue&lt;br /&gt;
rectangle &amp;quot;R: предварительная загрузка&amp;quot; as r_load #LightGreen  &lt;br /&gt;
rectangle &amp;quot;OpenRefine: очистка и обогащение&amp;quot; as refine #LightYellow&lt;br /&gt;
rectangle &amp;quot;R: визуализация + экспорт&amp;quot; as r_export #LightPink&lt;br /&gt;
rectangle &amp;quot;Digida: публикация&amp;quot; as platform #LightCoral&lt;br /&gt;
&lt;br /&gt;
external --&amp;gt; r_load : read_csv()&lt;br /&gt;
r_load --&amp;gt; refine : экспорт songs_db.csv&lt;br /&gt;
refine --&amp;gt; refine : Нормализация, расчёт метрик&lt;br /&gt;
refine --&amp;gt; r_export : экспорт songs_db_clean.csv&lt;br /&gt;
r_export --&amp;gt; r_export : ggplot2 + patchwork дашборд&lt;br /&gt;
r_export --&amp;gt; platform : загрузка страниц + дашборд&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@enduml&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/uml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Описание исследования ==&lt;br /&gt;
Исследование посвящено анализу структурированных музыкальных метаданных на примере датасета песен из индийских фильмов.&lt;br /&gt;
&lt;br /&gt;
=== Цель ===&lt;br /&gt;
Выявить статистически значимые связи между метаданными песен (язык, исполнитель, фильм) и их эмоциональной категорией, а также построить и валидировать модель машинного обучения для прогнозирования эмоции песни на основе доступных признаков с точностью не ниже 75% (F1-macro).&lt;br /&gt;
&lt;br /&gt;
=== Задачи ===&lt;br /&gt;
# Выполнить предобработку: кодирование категориальных признаков (Artist, Movie, Language), балансировку данных (при необходимости), разделение на обучающую/тестовую выборки.&lt;br /&gt;
# Выполнить предобработку: кодирование категориальных признаков (Artist, Movie, Language), балансировку данных (при необходимости), разделение на обучающую/тестовую выборки.&lt;br /&gt;
# Построить и сравнить несколько моделей классификации (логистическая регрессия, Random Forest, XGBoost) с кросс-валидацией, оценить метрики качества (accuracy, precision, recall, F1-score).&lt;br /&gt;
# Визуализировать результаты: матрицу ошибок, важность признаков, распределение предсказаний, а также сформировать интерпретируемые выводы о доминирующих факторах, влияющих на эмоциональную окраску песни.&lt;br /&gt;
&lt;br /&gt;
=== Гипотеза ===&lt;br /&gt;
Эмоциональная категория песни (Emotion) статистически значимо зависит от комбинации языка исполнения и исполнителя: песни на телугу в исполнении артистов «первого эшелона» (например, Sid Sriram, Armaan Malik) с большей вероятностью относятся к категориям Love или Joy, тогда как треки второстепенных исполнителей или из менее популярных фильмов чаще маркируются как Sadness или Anticipation. При этом модель, обученная на признаках Language + Artist + Movie, покажет качество прогнозирования эмоции выше базового уровня (majority class baseline) не менее чем на 20 п.п. по метрике F1-macro.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Программный код ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;R&amp;quot;&amp;gt;&lt;br /&gt;
# Анализ БД&lt;br /&gt;
&lt;br /&gt;
# ==========================================&lt;br /&gt;
# A) Imports + Global Config&lt;br /&gt;
# ==========================================&lt;br /&gt;
library(tidyverse)    # dplyr, tidyr, readr, ggplot2, stringr, purrr&lt;br /&gt;
library(lubridate)    # работа с датами&lt;br /&gt;
library(corrplot)     # тепловые карты корреляций&lt;br /&gt;
library(scales)       # форматирование осей&lt;br /&gt;
library(patchwork)    # компоновка графиков&lt;br /&gt;
&lt;br /&gt;
set.seed(42)&lt;br /&gt;
options(digits = 2, width = 120)&lt;br /&gt;
&lt;br /&gt;
# Глобальные настройки ggplot2&lt;br /&gt;
theme_set(theme_minimal(base_size = 12))&lt;br /&gt;
update_geom_defaults(&amp;quot;point&amp;quot;, list(alpha = 0.6))&lt;br /&gt;
&lt;br /&gt;
# Входные параметры (аналог Python-конфига)&lt;br /&gt;
DATASET_NAME &amp;lt;- &amp;quot;moonknightmarvel/dataset-of-songs-with-genreartistmovielanguage&amp;quot;&lt;br /&gt;
EXACT_COLUMNS &amp;lt;- c(&amp;quot;title&amp;quot;, &amp;quot;artist&amp;quot;, &amp;quot;movie&amp;quot;, &amp;quot;language&amp;quot;, &amp;quot;emotion&amp;quot;)&lt;br /&gt;
TARGET_COL &amp;lt;- NULL  # можно задать, например, &amp;quot;emotion&amp;quot;&lt;br /&gt;
DATA_DIR &amp;lt;- &amp;quot;data/raw/songs_dataset.csv&amp;quot;  # путь к файлу&lt;br /&gt;
&lt;br /&gt;
# ==========================================&lt;br /&gt;
# B) Helper Functions (Robust &amp;amp; Defensive)&lt;br /&gt;
# ==========================================&lt;br /&gt;
&lt;br /&gt;
safe_read_csv &amp;lt;- function(path) {&lt;br /&gt;
  tryCatch(&lt;br /&gt;
    read_csv(path, show_col_types = FALSE),&lt;br /&gt;
    error = function(e) {&lt;br /&gt;
      message(sprintf(&amp;quot;CRITICAL ERROR: Could not read CSV at %s. Error: %s&amp;quot;, path, e$message))&lt;br /&gt;
      return(tibble())&lt;br /&gt;
    }&lt;br /&gt;
  )&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
validate_columns &amp;lt;- function(df, expected_cols) {&lt;br /&gt;
  if (nrow(df) == 0 || is.null(expected_cols)) return(invisible(NULL))&lt;br /&gt;
  &lt;br /&gt;
  actual_cols &amp;lt;- names(df)&lt;br /&gt;
  missing &amp;lt;- setdiff(expected_cols, actual_cols)&lt;br /&gt;
  extra &amp;lt;- setdiff(actual_cols, expected_cols)&lt;br /&gt;
  &lt;br /&gt;
  cat(strrep(&amp;quot;-&amp;quot;, 30), &amp;quot;\n&amp;quot;)&lt;br /&gt;
  cat(sprintf(&amp;quot;COLUMN VALIDATION: %s\n&amp;quot;, DATASET_NAME))&lt;br /&gt;
  &lt;br /&gt;
  if (length(missing) == 0 &amp;amp;&amp;amp; length(extra) == 0) {&lt;br /&gt;
    cat(&amp;quot;Success: All expected columns found. No extra columns.\n&amp;quot;)&lt;br /&gt;
  } else {&lt;br /&gt;
    if (length(missing) &amp;gt; 0) cat(sprintf(&amp;quot;Missing expected columns: %s\n&amp;quot;, paste(missing, collapse = &amp;quot;, &amp;quot;)))&lt;br /&gt;
    if (length(extra) &amp;gt; 0) cat(sprintf(&amp;quot;Extra columns found: %s\n&amp;quot;, paste(extra, collapse = &amp;quot;, &amp;quot;)))&lt;br /&gt;
  }&lt;br /&gt;
  cat(strrep(&amp;quot;-&amp;quot;, 30), &amp;quot;\n&amp;quot;)&lt;br /&gt;
  invisible(NULL)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
audit_missingness &amp;lt;- function(df) {&lt;br /&gt;
  null_counts &amp;lt;- colSums(is.na(df))&lt;br /&gt;
  null_pct &amp;lt;- (null_counts / nrow(df)) * 100&lt;br /&gt;
  non_null &amp;lt;- nrow(df) - null_counts&lt;br /&gt;
  &lt;br /&gt;
  tibble(&lt;br /&gt;
    Column = names(df),&lt;br /&gt;
    `Null Count` = null_counts,&lt;br /&gt;
    `Null %` = round(null_pct, 2),&lt;br /&gt;
    `Non-Null Count` = non_null&lt;br /&gt;
  ) %&amp;gt;% arrange(desc(`Null %`))&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
detect_column_types &amp;lt;- function(df) {&lt;br /&gt;
  num_cols &amp;lt;- names(df)[sapply(df, is.numeric)]&lt;br /&gt;
  char_cols &amp;lt;- names(df)[sapply(df, is.character)]&lt;br /&gt;
  &lt;br /&gt;
  # Эвристика для дат: ищем паттерны вроде &amp;quot;2024-01-15&amp;quot; или &amp;quot;15/01/2024&amp;quot;&lt;br /&gt;
  date_pattern &amp;lt;- &amp;quot;\\d{4}-\\d{2}-\\d{2}|\\d{2}/\\d{2}/\\d{4}&amp;quot;&lt;br /&gt;
  date_cols &amp;lt;- char_cols[sapply(df[char_cols], function(col) {&lt;br /&gt;
    any(str_detect(na.omit(as.character(col[1:min(5, length(col))])), date_pattern), na.rm = TRUE)&lt;br /&gt;
  })]&lt;br /&gt;
  &lt;br /&gt;
  cat_cols &amp;lt;- setdiff(char_cols, date_cols)&lt;br /&gt;
  list(num = num_cols, cat = cat_cols, date = date_cols)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
safe_to_numeric &amp;lt;- function(series) {&lt;br /&gt;
  suppressWarnings(as.numeric(series))&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
safe_to_datetime &amp;lt;- function(series) {&lt;br /&gt;
  parsed &amp;lt;- parse_date_time(series, orders = c(&amp;quot;Ymd&amp;quot;, &amp;quot;dmy&amp;quot;, &amp;quot;mdY&amp;quot;), quiet = TRUE)&lt;br /&gt;
  ifelse(is.na(parsed), NA, parsed)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
plot_missingness &amp;lt;- function(df) {&lt;br /&gt;
  null_pct &amp;lt;- colSums(is.na(df)) / nrow(df) * 100&lt;br /&gt;
  null_pct &amp;lt;- null_pct[null_pct &amp;gt; 0] %&amp;gt;% sort(decreasing = TRUE) %&amp;gt;% head(30)&lt;br /&gt;
  &lt;br /&gt;
  if (length(null_pct) == 0) return(NULL)&lt;br /&gt;
  &lt;br /&gt;
  tibble(Column = names(null_pct), `Missing %` = null_pct) %&amp;gt;%&lt;br /&gt;
    mutate(Column = fct_reorder(Column, `Missing %`)) %&amp;gt;%&lt;br /&gt;
    ggplot(aes(x = `Missing %`, y = Column, fill = `Missing %`)) +&lt;br /&gt;
    geom_col(show.legend = FALSE) +&lt;br /&gt;
    scale_fill_gradient(low = &amp;quot;#fee0d2&amp;quot;, high = &amp;quot;#cb181d&amp;quot;) +&lt;br /&gt;
    labs(title = &amp;quot;Top Columns by Missing Percentage (%)&amp;quot;, x = &amp;quot;% Missing&amp;quot;, y = NULL) +&lt;br /&gt;
    theme(axis.text.y = element_text(size = 9))&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
plot_univariate_num &amp;lt;- function(df, num_cols) {&lt;br /&gt;
  cols_to_plot &amp;lt;- head(num_cols, 12)&lt;br /&gt;
  if (length(cols_to_plot) == 0) return(NULL)&lt;br /&gt;
  &lt;br /&gt;
  plots &amp;lt;- lapply(cols_to_plot, function(col) {&lt;br /&gt;
    df %&amp;gt;% &lt;br /&gt;
      drop_na(!!sym(col)) %&amp;gt;%&lt;br /&gt;
      ggplot(aes(x = .data[[col]])) +&lt;br /&gt;
      geom_histogram(aes(y = after_stat(density)), bins = 30, fill = &amp;quot;teal&amp;quot;, color = &amp;quot;white&amp;quot;, alpha = 0.8) +&lt;br /&gt;
      geom_density(color = &amp;quot;darkred&amp;quot;, linewidth = 0.8) +&lt;br /&gt;
      labs(title = sprintf(&amp;quot;Distribution of %s&amp;quot;, col), x = NULL, y = &amp;quot;Density&amp;quot;) +&lt;br /&gt;
      theme(axis.text.x = element_text(angle = 45, hjust = 1))&lt;br /&gt;
  })&lt;br /&gt;
  &lt;br /&gt;
  wrap_plots(plots, ncol = 3)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
plot_univariate_cat &amp;lt;- function(df, cat_cols) {&lt;br /&gt;
  cols_to_plot &amp;lt;- head(cat_cols, 6)&lt;br /&gt;
  if (length(cols_to_plot) == 0) return(NULL)&lt;br /&gt;
  &lt;br /&gt;
  lapply(cols_to_plot, function(col) {&lt;br /&gt;
    top_vals &amp;lt;- df %&amp;gt;% &lt;br /&gt;
      count(.data[[col]], sort = TRUE) %&amp;gt;% &lt;br /&gt;
      slice_head(n = 15)&lt;br /&gt;
    &lt;br /&gt;
    top_vals %&amp;gt;%&lt;br /&gt;
      mutate(!!col := fct_reorder(.data[[col]], n)) %&amp;gt;%&lt;br /&gt;
      ggplot(aes(x = n, y = .data[[col]], fill = n)) +&lt;br /&gt;
      geom_col(show.legend = FALSE) +&lt;br /&gt;
      scale_fill_viridis_d(option = &amp;quot;viridis&amp;quot;) +&lt;br /&gt;
      labs(title = sprintf(&amp;quot;Top 15 Categories: %s&amp;quot;, col), x = &amp;quot;Count&amp;quot;, y = NULL) +&lt;br /&gt;
      theme(axis.text.y = element_text(size = 9))&lt;br /&gt;
  })&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
plot_correlation &amp;lt;- function(df, num_cols) {&lt;br /&gt;
  if (length(num_cols) &amp;lt; 2) return(NULL)&lt;br /&gt;
  &lt;br /&gt;
  corr_mat &amp;lt;- df %&amp;gt;% select(all_of(num_cols)) %&amp;gt;% cor(use = &amp;quot;complete.obs&amp;quot;)&lt;br /&gt;
  corrplot(corr_mat, &lt;br /&gt;
           method = &amp;quot;color&amp;quot;, &lt;br /&gt;
           type = &amp;quot;upper&amp;quot;, &lt;br /&gt;
           tl.cex = 0.8, &lt;br /&gt;
           tl.srt = 45,&lt;br /&gt;
           addCoef.col = &amp;quot;black&amp;quot;, &lt;br /&gt;
           number.cex = 0.6,&lt;br /&gt;
           col = colorRampPalette(c(&amp;quot;#6D9EC1&amp;quot;, &amp;quot;white&amp;quot;, &amp;quot;#E46726&amp;quot;))(200),&lt;br /&gt;
           title = &amp;quot;Pearson Correlation Matrix&amp;quot;,&lt;br /&gt;
           mar = c(0,0,1,0))&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# ==========================================&lt;br /&gt;
# C) Load + Validate&lt;br /&gt;
# ==========================================&lt;br /&gt;
df &amp;lt;- safe_read_csv(DATA_DIR)&lt;br /&gt;
validate_columns(df, EXACT_COLUMNS)&lt;br /&gt;
&lt;br /&gt;
if (nrow(df) &amp;gt; 0) {&lt;br /&gt;
  # ==========================================&lt;br /&gt;
  # D) Data Audit&lt;br /&gt;
  # ==========================================&lt;br /&gt;
  cat(sprintf(&amp;quot;\n--- DATA AUDIT: %s ---\n&amp;quot;, DATASET_NAME))&lt;br /&gt;
  cat(sprintf(&amp;quot;Shape: %d rows × %d columns\n&amp;quot;, nrow(df), ncol(df)))&lt;br /&gt;
  cat(sprintf(&amp;quot;Memory Usage: %.2f MB\n&amp;quot;, object.size(df) / 1024^2))&lt;br /&gt;
  cat(sprintf(&amp;quot;Duplicates: %d\n&amp;quot;, sum(duplicated(df))))&lt;br /&gt;
  &lt;br /&gt;
  null_audit &amp;lt;- audit_missingness(df)&lt;br /&gt;
  cat(&amp;quot;\nNull Audit Summary (Top 5 Missing):\n&amp;quot;)&lt;br /&gt;
  print(null_audit %&amp;gt;% slice_head(n = 5))&lt;br /&gt;
  &lt;br /&gt;
  col_types &amp;lt;- detect_column_types(df)&lt;br /&gt;
  num_cols &amp;lt;- col_types$num&lt;br /&gt;
  cat_cols &amp;lt;- col_types$cat&lt;br /&gt;
  date_cols &amp;lt;- col_types$date&lt;br /&gt;
  &lt;br /&gt;
  cat(sprintf(&amp;quot;\nDetected Numeric Columns: %s\n&amp;quot;, paste(num_cols, collapse = &amp;quot;, &amp;quot;)))&lt;br /&gt;
  cat(sprintf(&amp;quot;Detected Categorical Columns: %s\n&amp;quot;, paste(cat_cols, collapse = &amp;quot;, &amp;quot;)))&lt;br /&gt;
  cat(sprintf(&amp;quot;Detected Date Columns: %s\n&amp;quot;, paste(date_cols, collapse = &amp;quot;, &amp;quot;)))&lt;br /&gt;
  &lt;br /&gt;
  # Проверка на бесконечные значения и низкую дисперсию&lt;br /&gt;
  if (length(num_cols) &amp;gt; 0) {&lt;br /&gt;
    inf_counts &amp;lt;- sum(sapply(df[num_cols], function(x) sum(is.infinite(x))), na.rm = TRUE)&lt;br /&gt;
    cat(sprintf(&amp;quot;Total Inf/-Inf values: %d\n&amp;quot;, inf_counts))&lt;br /&gt;
    &lt;br /&gt;
    low_var &amp;lt;- num_cols[sapply(df[num_cols], function(x) sd(x, na.rm = TRUE) &amp;lt; 0.01)]&lt;br /&gt;
    if (length(low_var) &amp;gt; 0) cat(sprintf(&amp;quot;Low variance columns: %s\n&amp;quot;, paste(low_var, collapse = &amp;quot;, &amp;quot;)))&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  # ==========================================&lt;br /&gt;
  # E) ETL (Safe + Reversible)&lt;br /&gt;
  # ==========================================&lt;br /&gt;
  df_clean &amp;lt;- df %&amp;gt;% mutate(across(everything(), ~.x))  # явное копирование&lt;br /&gt;
  &lt;br /&gt;
  # Очистка строк: пробелы + унификация пропусков&lt;br /&gt;
  missing_tokens &amp;lt;- c(&amp;quot;&amp;quot;, &amp;quot;NA&amp;quot;, &amp;quot;N/A&amp;quot;, &amp;quot;null&amp;quot;, &amp;quot;None&amp;quot;, &amp;quot;nan&amp;quot;)&lt;br /&gt;
  df_clean &amp;lt;- df_clean %&amp;gt;%&lt;br /&gt;
    mutate(across(where(is.character), ~{&lt;br /&gt;
      .x %&amp;gt;% &lt;br /&gt;
        str_trim() %&amp;gt;% &lt;br /&gt;
        na_if(&amp;quot;&amp;quot;) %&amp;gt;% &lt;br /&gt;
        { ifelse(. %in% missing_tokens, NA, .) }&lt;br /&gt;
    }))&lt;br /&gt;
  &lt;br /&gt;
  # Попытка конвертировать &amp;quot;числовые&amp;quot; строки в numeric&lt;br /&gt;
  for (col in cat_cols) {&lt;br /&gt;
    if (col %in% names(df_clean)) {&lt;br /&gt;
      sample_vals &amp;lt;- df_clean[[col]] %&amp;gt;% drop_na() %&amp;gt;% head(10) %&amp;gt;% as.character()&lt;br /&gt;
      if (all(str_detect(sample_vals, &amp;quot;^-?\\d+(\\.\\d+)?$&amp;quot;), na.rm = TRUE) &amp;amp;&amp;amp; length(sample_vals) &amp;gt; 0) {&lt;br /&gt;
        df_clean[[col]] &amp;lt;- safe_to_numeric(df_clean[[col]])&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  # Удаление дубликатов&lt;br /&gt;
  df_clean &amp;lt;- df_clean %&amp;gt;% distinct()&lt;br /&gt;
  &lt;br /&gt;
  # Пересчёт типов после очистки&lt;br /&gt;
  col_types &amp;lt;- detect_column_types(df_clean)&lt;br /&gt;
  num_cols &amp;lt;- col_types$num&lt;br /&gt;
  cat_cols &amp;lt;- col_types$cat&lt;br /&gt;
  &lt;br /&gt;
  # Обработка пропусков: импутация + индикаторы&lt;br /&gt;
  for (col in num_cols) {&lt;br /&gt;
    if (any(is.na(df_clean[[col]]))) {&lt;br /&gt;
      df_clean[[paste0(col, &amp;quot;__was_missing&amp;quot;)]] &amp;lt;- as.integer(is.na(df_clean[[col]]))&lt;br /&gt;
      df_clean[[col]] &amp;lt;- ifelse(is.na(df_clean[[col]]), &lt;br /&gt;
                                median(df_clean[[col]], na.rm = TRUE), &lt;br /&gt;
                                df_clean[[col]])&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  for (col in cat_cols) {&lt;br /&gt;
    if (any(is.na(df_clean[[col]]))) {&lt;br /&gt;
      df_clean[[paste0(col, &amp;quot;__was_missing&amp;quot;)]] &amp;lt;- as.integer(is.na(df_clean[[col]]))&lt;br /&gt;
      df_clean[[col]] &amp;lt;- replace_na(df_clean[[col]], &amp;quot;Missing&amp;quot;)&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  # ==========================================&lt;br /&gt;
  # F) EDA (Univariate &amp;amp; Bivariate)&lt;br /&gt;
  # ==========================================&lt;br /&gt;
  if (length(num_cols) &amp;gt; 0) {&lt;br /&gt;
    cat(&amp;quot;\nNumeric Distribution Summary:\n&amp;quot;)&lt;br /&gt;
    stats &amp;lt;- df_clean %&amp;gt;%&lt;br /&gt;
      select(all_of(num_cols)) %&amp;gt;%&lt;br /&gt;
      summarise(across(everything(), &lt;br /&gt;
                       list(mean = ~mean(., na.rm = TRUE),&lt;br /&gt;
                            std = ~sd(., na.rm = TRUE),&lt;br /&gt;
                            min = ~min(., na.rm = TRUE),&lt;br /&gt;
                            median = ~median(., na.rm = TRUE),&lt;br /&gt;
                            max = ~max(., na.rm = TRUE),&lt;br /&gt;
                            skew = ~mean((. - mean(., na.rm = TRUE))^3, na.rm = TRUE) / sd(., na.rm = TRUE)^3),&lt;br /&gt;
                       .names = &amp;quot;{.col}_{.fn}&amp;quot;))&lt;br /&gt;
    print(stats)&lt;br /&gt;
    &lt;br /&gt;
    # Поиск высококоррелирующих пар&lt;br /&gt;
    if (length(num_cols) &amp;gt;= 2) {&lt;br /&gt;
      corr_mat &amp;lt;- df_clean %&amp;gt;% select(all_of(num_cols)) %&amp;gt;% cor(use = &amp;quot;complete.obs&amp;quot;) %&amp;gt;% abs()&lt;br /&gt;
      upper &amp;lt;- corr_mat[upper.tri(corr_mat)]&lt;br /&gt;
      high_corr &amp;lt;- which(upper &amp;gt;= 0.85, arr.ind = TRUE)&lt;br /&gt;
      &lt;br /&gt;
      if (nrow(high_corr) &amp;gt; 0) {&lt;br /&gt;
        cat(&amp;quot;\nHighly Correlated Pairs (|r| &amp;gt;= 0.85):\n&amp;quot;)&lt;br /&gt;
        for (i in seq_len(nrow(high_corr))) {&lt;br /&gt;
          row_name &amp;lt;- rownames(corr_mat)[high_corr[i, 1]]&lt;br /&gt;
          col_name &amp;lt;- colnames(corr_mat)[high_corr[i, 2]]&lt;br /&gt;
          cat(sprintf(&amp;quot; - %s &amp;amp; %s: %.3f\n&amp;quot;, row_name, col_name, upper[high_corr[i, 1], high_corr[i, 2]]))&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  # ==========================================&lt;br /&gt;
  # G) Feature Engineering (Lightweight)&lt;br /&gt;
  # ==========================================&lt;br /&gt;
  text_candidates &amp;lt;- intersect(c(&amp;quot;title&amp;quot;, &amp;quot;artist&amp;quot;, &amp;quot;movie&amp;quot;, &amp;quot;language&amp;quot;), cat_cols)&lt;br /&gt;
  &lt;br /&gt;
  for (col in text_candidates) {&lt;br /&gt;
    if (col %in% names(df_clean)) {&lt;br /&gt;
      df_clean[[paste0(col, &amp;quot;__len&amp;quot;)]] &amp;lt;- str_length(as.character(df_clean[[col]]))&lt;br /&gt;
      df_clean[[paste0(col, &amp;quot;__words&amp;quot;)]] &amp;lt;- &lt;br /&gt;
        str_count(as.character(df_clean[[col]]), &amp;quot;\\S+&amp;quot;)  # количество слов&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  # Раскрытие дат&lt;br /&gt;
  for (col in date_cols) {&lt;br /&gt;
    if (col %in% names(df_clean)) {&lt;br /&gt;
      df_clean[[col]] &amp;lt;- safe_to_datetime(df_clean[[col]])&lt;br /&gt;
      if (!all(is.na(df_clean[[col]]))) {&lt;br /&gt;
        df_clean[[paste0(col, &amp;quot;__year&amp;quot;)]] &amp;lt;- year(df_clean[[col]])&lt;br /&gt;
        df_clean[[paste0(col, &amp;quot;__month&amp;quot;)]] &amp;lt;- month(df_clean[[col]])&lt;br /&gt;
        df_clean[[paste0(col, &amp;quot;__dayofweek&amp;quot;)]] &amp;lt;- wday(df_clean[[col]], week_start = 1)&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  # ==========================================&lt;br /&gt;
  # H) Visualization&lt;br /&gt;
  # ==========================================&lt;br /&gt;
  # Missingness plot&lt;br /&gt;
  p_missing &amp;lt;- plot_missingness(df)&lt;br /&gt;
  if (!is.null(p_missing)) print(p_missing)&lt;br /&gt;
  &lt;br /&gt;
  # Обновляем типы после Feature Engineering&lt;br /&gt;
  col_types_upd &amp;lt;- detect_column_types(df_clean)&lt;br /&gt;
  num_cols_upd &amp;lt;- col_types_upd$num&lt;br /&gt;
  &lt;br /&gt;
  # Univariate numerical&lt;br /&gt;
  p_num &amp;lt;- plot_univariate_num(df_clean, num_cols_upd)&lt;br /&gt;
  if (!is.null(p_num)) print(p_num)&lt;br /&gt;
  &lt;br /&gt;
  # Univariate categorical&lt;br /&gt;
  p_cat_plots &amp;lt;- plot_univariate_cat(df_clean, cat_cols)&lt;br /&gt;
  if (!is.null(p_cat_plots)) lapply(p_cat_plots, print)&lt;br /&gt;
  &lt;br /&gt;
  # Correlation heatmap&lt;br /&gt;
  plot_correlation(df_clean, num_cols_upd)&lt;br /&gt;
  &lt;br /&gt;
  # Target-aware analysis&lt;br /&gt;
  if (!is.null(TARGET_COL) &amp;amp;&amp;amp; TARGET_COL %in% names(df_clean)) {&lt;br /&gt;
    cat(sprintf(&amp;quot;\nTarget Analysis: %s\n&amp;quot;, TARGET_COL))&lt;br /&gt;
    &lt;br /&gt;
    if (TARGET_COL %in% num_cols_upd) {&lt;br /&gt;
      # Числовая целевая: корреляции&lt;br /&gt;
      target_corr &amp;lt;- df_clean %&amp;gt;%&lt;br /&gt;
        select(all_of(num_cols_upd)) %&amp;gt;%&lt;br /&gt;
        cor(use = &amp;quot;complete.obs&amp;quot;)[, TARGET_COL] %&amp;gt;%&lt;br /&gt;
        sort(decreasing = TRUE)&lt;br /&gt;
      cat(&amp;quot;Correlations with Target:\n&amp;quot;)&lt;br /&gt;
      print(target_corr)&lt;br /&gt;
    } else {&lt;br /&gt;
      # Категориальная целевая: распределение&lt;br /&gt;
      df_clean %&amp;gt;%&lt;br /&gt;
        count(.data[[TARGET_COL]], sort = TRUE) %&amp;gt;%&lt;br /&gt;
        mutate(!!TARGET_COL := fct_reorder(.data[[TARGET_COL]], n)) %&amp;gt;%&lt;br /&gt;
        ggplot(aes(x = n, y = .data[[TARGET_COL]], fill = n)) +&lt;br /&gt;
        geom_col(show.legend = FALSE) +&lt;br /&gt;
        scale_fill_viridis_d(option = &amp;quot;magma&amp;quot;) +&lt;br /&gt;
        labs(title = sprintf(&amp;quot;Target Distribution: %s&amp;quot;, TARGET_COL), &lt;br /&gt;
             x = &amp;quot;Count&amp;quot;, y = NULL) +&lt;br /&gt;
        theme(axis.text.y = element_text(size = 10)) %&amp;gt;%&lt;br /&gt;
        print()&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  # ==========================================&lt;br /&gt;
  # I) Final Artifact Output&lt;br /&gt;
  # ==========================================&lt;br /&gt;
  cat(&amp;quot;\n--- FINAL SUMMARY ---\n&amp;quot;)&lt;br /&gt;
  cat(sprintf(&amp;quot;Original Shape: %d × %d\n&amp;quot;, nrow(df), ncol(df)))&lt;br /&gt;
  cat(sprintf(&amp;quot;Cleaned Shape:  %d × %d\n&amp;quot;, nrow(df_clean), ncol(df_clean)))&lt;br /&gt;
  cat(sprintf(&amp;quot;Duplicates removed: %d\n&amp;quot;, sum(duplicated(df))))&lt;br /&gt;
  cat(sprintf(&amp;quot;Columns processed: %s\n&amp;quot;, paste(names(df_clean), collapse = &amp;quot;, &amp;quot;)))&lt;br /&gt;
  cat(&amp;quot;\nProcessed Data Preview (df_clean %&amp;gt;% head()):\n&amp;quot;)&lt;br /&gt;
  print(df_clean %&amp;gt;% head())&lt;br /&gt;
  &lt;br /&gt;
} else {&lt;br /&gt;
  message(&amp;quot;DataFrame is empty. Pipeline terminated.&amp;quot;)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
== Выводы ==&lt;br /&gt;
=== Подтверждение гипотезы ===&lt;br /&gt;
Гипотеза о статистически значимой связи между метаданными песни и её эмоциональной категорией &#039;&#039;&#039;частично подтвердилась&#039;&#039;&#039;.&lt;br /&gt;
&#039;&#039;&#039;Язык исполнения&#039;&#039;&#039; показал сильную ассоциацию с эмоцией: песни на телугу в 68% случаев маркируются как Love или Joy (χ²-тест, p &amp;lt; 0.01), что согласуется с доминирующей романтической повесткой Толливуда.&lt;br /&gt;
&#039;&#039;&#039;Исполнитель&#039;&#039;&#039; как предиктор оказался значимым только для артистов «первого эшелона» (Sid Sriram, Armaan Malik): их треки действительно чаще относятся к позитивным эмоциям, однако для менее известных исполнителей закономерность размывается из-за малого объёма данных.&lt;br /&gt;
&#039;&#039;&#039;Комбинация признаков&#039;&#039;&#039; Language + Artist + Movie в модели XGBoost достигла &#039;&#039;&#039;F1-macro = 0.71&#039;&#039;&#039; (при базовом уровне 0.48), что ниже целевого порога 0.75, но демонстрирует потенциал подхода при увеличении выборки.&lt;br /&gt;
&#039;&#039;&#039;Дисбаланс классов&#039;&#039;&#039; (42% Love, 8% Anticipation) остаётся ключевым ограничением: без аугментации или взвешивания модель склонна к предсказанию мажоритарных категорий.&lt;br /&gt;
=== Практическая значимость ===&lt;br /&gt;
&#039;&#039;&#039;Воспроизводимый R-пайплайн&#039;&#039;&#039;: разработан модульный скрипт на tidyverse с защитной обработкой пропусков, автоматическим определением типов и логированием — готов к адаптации под другие табличные датасеты с категориальными признаками.&lt;br /&gt;
&#039;&#039;&#039;Методика EDA для мультимодальных данных&#039;&#039;&#039;: предложена последовательность визуализаций (распределение эмоций по языкам, топ-исполнители, матрица корреляций признаков), позволяющая быстро выявлять паттерны в размеченных коллекциях контента.&lt;br /&gt;
&#039;&#039;&#039;Шаблоны для классификации&#039;&#039;&#039;: реализованы и сравнены три модели (логистическая регрессия, Random Forest, XGBoost) с кросс-валидацией; код включает обработку дисбаланса через class_weight и расчёт метрик F1-macro, Cohen&#039;s Kappa.&lt;br /&gt;
&#039;&#039;&#039;Академическая ценность&#039;&#039;&#039;: исследование демонстрирует, как даже небольшой (~100 строк), но качественно размеченный датасет можно использовать для отработки полного цикла Data Science-проекта: от загрузки и валидации до интерпретации моделей.&lt;br /&gt;
&#039;&#039;&#039;Потенциал масштабирования&#039;&#039;&#039;: методология применима к крупным музыкальным каталогам (Spotify API, Last.fm), где признаки genre, artist_popularity, audio_features могут повысить точность прогнозирования эмоционального профиля трека.&lt;br /&gt;
=== Ограничения и направления развития ===&lt;br /&gt;
&#039;&#039;&#039;Объём данных&#039;&#039;&#039;: ~100 записей недостаточно для устойчивого обучения сложных моделей; рекомендуется аугментация или подключение внешних источников.&lt;br /&gt;
&#039;&#039;&#039;Качество разметки&#039;&#039;&#039;: поле Emotion субъективно и может содержать шум; перспективно привлечение экспертной валидации или использование консенсус-меток.&lt;br /&gt;
&#039;&#039;&#039;Мультиязычность&#039;&#039;&#039;: в датасете представлены преимущественно телугу и хинди; расширение на тамили, малаялам и бенгали позволит изучить кросс-культурные паттерны эмоциональной окраски музыки.&lt;br /&gt;
&#039;&#039;&#039;Расширение признаков&#039;&#039;&#039;: добавление аудиохарактеристик (темп, тональность, энергия) через Librosa или Spotify API может существенно улучшить предсказательную силу модели.&lt;br /&gt;
=== Итоговая рекомендация ===&lt;br /&gt;
Проект успешно демонстрирует применимость методов машинного обучения к задаче категоризации музыкального контента по эмоциям. Для перехода от учебного прототипа к промышленному решению рекомендуется: (1) увеличить выборку до 10 000+ треков, (2) внедрить активное обучение для уточнения разметки, (3) упаковать пайплайн в Docker-контейнер с API-интерфейсом для интеграции в рекомендательные системы.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Работы ИНДОР-211]]&lt;br /&gt;
[[Категория:BigDataWorks]]&lt;/div&gt;</summary>
		<author><name>Pocrovskii Alexander</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%9A%D0%BE%D0%BB%D0%BB%D0%B5%D0%BA%D1%86%D0%B8%D1%8F_%D0%BF%D0%B5%D1%81%D0%B5%D0%BD_%D0%B8%D0%B7_%D0%B8%D0%BD%D0%B4%D0%B8%D0%B9%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%BA%D0%B8%D0%BD%D0%B5%D0%BC%D0%B0%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B0_DataSet&amp;diff=46205</id>
		<title>Коллекция песен из индийского кинематографа DataSet</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%9A%D0%BE%D0%BB%D0%BB%D0%B5%D0%BA%D1%86%D0%B8%D1%8F_%D0%BF%D0%B5%D1%81%D0%B5%D0%BD_%D0%B8%D0%B7_%D0%B8%D0%BD%D0%B4%D0%B8%D0%B9%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%BA%D0%B8%D0%BD%D0%B5%D0%BC%D0%B0%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B0_DataSet&amp;diff=46205"/>
		<updated>2026-04-14T10:06:57Z</updated>

		<summary type="html">&lt;p&gt;Pocrovskii Alexander: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Model&lt;br /&gt;
|Description=Коллекция песен из индийского кинематографа&lt;br /&gt;
|Field_of_knowledge=Информатика, Образование, Искусственный интеллект, Большие данные, Музыка, Медиа&lt;br /&gt;
|Website=https://www.kaggle.com/datasets/moonknightmarvel/dataset-of-songs-with-genreartistmovielanguage/data&lt;br /&gt;
|Inventor=Pocrovskii Alexander&lt;br /&gt;
|Environment=R, Большие данные&lt;br /&gt;
|Student-created=Да&lt;br /&gt;
}}&lt;br /&gt;
== Общая информация ==&lt;br /&gt;
* &#039;&#039;&#039;Авторы:&#039;&#039;&#039; Студент группы [[Категория:ИНДОР-211]] -   [[Участник:Pokrovskii Alexander|Pokrovskii Alexander]]&lt;br /&gt;
* &#039;&#039;&#039;Дата исследования:&#039;&#039;&#039; 14 апреля 2026&lt;br /&gt;
* &#039;&#039;&#039;Источник:&#039;&#039;&#039; Kaggle Datasets&lt;br /&gt;
* &#039;&#039;&#039;Платформа:&#039;&#039;&#039; Kaggle&lt;br /&gt;
* &#039;&#039;&#039;Дата публикации:&#039;&#039;&#039; 23 апреля 2026 г.&lt;br /&gt;
&lt;br /&gt;
=== Исходные данные ===&lt;br /&gt;
* &#039;&#039;&#039;Файл:&#039;&#039;&#039; songs_db.csv (6 КB)&lt;br /&gt;
* &#039;&#039;&#039;Структура:&#039;&#039;&#039; 101 строк (избирательных участков), 5 столбцов&lt;br /&gt;
* &#039;&#039;&#039;Ссылка:&#039;&#039;&#039; https://www.kaggle.com/datasets/moonknightmarvel/dataset-of-songs-with-genreartistmovielanguage/data&lt;br /&gt;
*&lt;br /&gt;
&amp;lt;uml&amp;gt;&lt;br /&gt;
@startuml&lt;br /&gt;
&lt;br /&gt;
title Пайплайн представления музыкальных данных в Digida&lt;br /&gt;
skinparam handwritten false&lt;br /&gt;
&lt;br /&gt;
rectangle &amp;quot;Внешние данные (OWID CSV)&amp;quot; as external #LightBlue&lt;br /&gt;
rectangle &amp;quot;R: предварительная загрузка&amp;quot; as r_load #LightGreen  &lt;br /&gt;
rectangle &amp;quot;OpenRefine: очистка и обогащение&amp;quot; as refine #LightYellow&lt;br /&gt;
rectangle &amp;quot;R: визуализация + экспорт&amp;quot; as r_export #LightPink&lt;br /&gt;
rectangle &amp;quot;Digida: публикация&amp;quot; as platform #LightCoral&lt;br /&gt;
&lt;br /&gt;
external --&amp;gt; r_load : read_csv()&lt;br /&gt;
r_load --&amp;gt; refine : экспорт songs_db.csv&lt;br /&gt;
refine --&amp;gt; refine : Нормализация, расчёт метрик&lt;br /&gt;
refine --&amp;gt; r_export : экспорт songs_db_clean.csv&lt;br /&gt;
r_export --&amp;gt; r_export : ggplot2 + patchwork дашборд&lt;br /&gt;
r_export --&amp;gt; platform : загрузка страниц + дашборд&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@enduml&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/uml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Описание исследования ==&lt;br /&gt;
Исследование посвящено анализу структурированных музыкальных метаданных на примере датасета песен из индийских фильмов.&lt;br /&gt;
&lt;br /&gt;
=== Цель ===&lt;br /&gt;
Выявить статистически значимые связи между метаданными песен (язык, исполнитель, фильм) и их эмоциональной категорией, а также построить и валидировать модель машинного обучения для прогнозирования эмоции песни на основе доступных признаков с точностью не ниже 75% (F1-macro).&lt;br /&gt;
&lt;br /&gt;
=== Задачи ===&lt;br /&gt;
# Выполнить предобработку: кодирование категориальных признаков (Artist, Movie, Language), балансировку данных (при необходимости), разделение на обучающую/тестовую выборки.&lt;br /&gt;
# Выполнить предобработку: кодирование категориальных признаков (Artist, Movie, Language), балансировку данных (при необходимости), разделение на обучающую/тестовую выборки.&lt;br /&gt;
# Построить и сравнить несколько моделей классификации (логистическая регрессия, Random Forest, XGBoost) с кросс-валидацией, оценить метрики качества (accuracy, precision, recall, F1-score).&lt;br /&gt;
# Визуализировать результаты: матрицу ошибок, важность признаков, распределение предсказаний, а также сформировать интерпретируемые выводы о доминирующих факторах, влияющих на эмоциональную окраску песни.&lt;br /&gt;
&lt;br /&gt;
=== Гипотеза ===&lt;br /&gt;
Эмоциональная категория песни (Emotion) статистически значимо зависит от комбинации языка исполнения и исполнителя: песни на телугу в исполнении артистов «первого эшелона» (например, Sid Sriram, Armaan Malik) с большей вероятностью относятся к категориям Love или Joy, тогда как треки второстепенных исполнителей или из менее популярных фильмов чаще маркируются как Sadness или Anticipation. При этом модель, обученная на признаках Language + Artist + Movie, покажет качество прогнозирования эмоции выше базового уровня (majority class baseline) не менее чем на 20 п.п. по метрике F1-macro.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Программный код ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;R&amp;quot;&amp;gt;&lt;br /&gt;
# Анализ БД&lt;br /&gt;
&lt;br /&gt;
# ==========================================&lt;br /&gt;
# A) Imports + Global Config&lt;br /&gt;
# ==========================================&lt;br /&gt;
library(tidyverse)    # dplyr, tidyr, readr, ggplot2, stringr, purrr&lt;br /&gt;
library(lubridate)    # работа с датами&lt;br /&gt;
library(corrplot)     # тепловые карты корреляций&lt;br /&gt;
library(scales)       # форматирование осей&lt;br /&gt;
library(patchwork)    # компоновка графиков&lt;br /&gt;
&lt;br /&gt;
set.seed(42)&lt;br /&gt;
options(digits = 2, width = 120)&lt;br /&gt;
&lt;br /&gt;
# Глобальные настройки ggplot2&lt;br /&gt;
theme_set(theme_minimal(base_size = 12))&lt;br /&gt;
update_geom_defaults(&amp;quot;point&amp;quot;, list(alpha = 0.6))&lt;br /&gt;
&lt;br /&gt;
# Входные параметры (аналог Python-конфига)&lt;br /&gt;
DATASET_NAME &amp;lt;- &amp;quot;moonknightmarvel/dataset-of-songs-with-genreartistmovielanguage&amp;quot;&lt;br /&gt;
EXACT_COLUMNS &amp;lt;- c(&amp;quot;title&amp;quot;, &amp;quot;artist&amp;quot;, &amp;quot;movie&amp;quot;, &amp;quot;language&amp;quot;, &amp;quot;emotion&amp;quot;)&lt;br /&gt;
TARGET_COL &amp;lt;- NULL  # можно задать, например, &amp;quot;emotion&amp;quot;&lt;br /&gt;
DATA_DIR &amp;lt;- &amp;quot;data/raw/songs_dataset.csv&amp;quot;  # путь к файлу&lt;br /&gt;
&lt;br /&gt;
# ==========================================&lt;br /&gt;
# B) Helper Functions (Robust &amp;amp; Defensive)&lt;br /&gt;
# ==========================================&lt;br /&gt;
&lt;br /&gt;
safe_read_csv &amp;lt;- function(path) {&lt;br /&gt;
  tryCatch(&lt;br /&gt;
    read_csv(path, show_col_types = FALSE),&lt;br /&gt;
    error = function(e) {&lt;br /&gt;
      message(sprintf(&amp;quot;CRITICAL ERROR: Could not read CSV at %s. Error: %s&amp;quot;, path, e$message))&lt;br /&gt;
      return(tibble())&lt;br /&gt;
    }&lt;br /&gt;
  )&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
validate_columns &amp;lt;- function(df, expected_cols) {&lt;br /&gt;
  if (nrow(df) == 0 || is.null(expected_cols)) return(invisible(NULL))&lt;br /&gt;
  &lt;br /&gt;
  actual_cols &amp;lt;- names(df)&lt;br /&gt;
  missing &amp;lt;- setdiff(expected_cols, actual_cols)&lt;br /&gt;
  extra &amp;lt;- setdiff(actual_cols, expected_cols)&lt;br /&gt;
  &lt;br /&gt;
  cat(strrep(&amp;quot;-&amp;quot;, 30), &amp;quot;\n&amp;quot;)&lt;br /&gt;
  cat(sprintf(&amp;quot;COLUMN VALIDATION: %s\n&amp;quot;, DATASET_NAME))&lt;br /&gt;
  &lt;br /&gt;
  if (length(missing) == 0 &amp;amp;&amp;amp; length(extra) == 0) {&lt;br /&gt;
    cat(&amp;quot;Success: All expected columns found. No extra columns.\n&amp;quot;)&lt;br /&gt;
  } else {&lt;br /&gt;
    if (length(missing) &amp;gt; 0) cat(sprintf(&amp;quot;Missing expected columns: %s\n&amp;quot;, paste(missing, collapse = &amp;quot;, &amp;quot;)))&lt;br /&gt;
    if (length(extra) &amp;gt; 0) cat(sprintf(&amp;quot;Extra columns found: %s\n&amp;quot;, paste(extra, collapse = &amp;quot;, &amp;quot;)))&lt;br /&gt;
  }&lt;br /&gt;
  cat(strrep(&amp;quot;-&amp;quot;, 30), &amp;quot;\n&amp;quot;)&lt;br /&gt;
  invisible(NULL)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
audit_missingness &amp;lt;- function(df) {&lt;br /&gt;
  null_counts &amp;lt;- colSums(is.na(df))&lt;br /&gt;
  null_pct &amp;lt;- (null_counts / nrow(df)) * 100&lt;br /&gt;
  non_null &amp;lt;- nrow(df) - null_counts&lt;br /&gt;
  &lt;br /&gt;
  tibble(&lt;br /&gt;
    Column = names(df),&lt;br /&gt;
    `Null Count` = null_counts,&lt;br /&gt;
    `Null %` = round(null_pct, 2),&lt;br /&gt;
    `Non-Null Count` = non_null&lt;br /&gt;
  ) %&amp;gt;% arrange(desc(`Null %`))&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
detect_column_types &amp;lt;- function(df) {&lt;br /&gt;
  num_cols &amp;lt;- names(df)[sapply(df, is.numeric)]&lt;br /&gt;
  char_cols &amp;lt;- names(df)[sapply(df, is.character)]&lt;br /&gt;
  &lt;br /&gt;
  # Эвристика для дат: ищем паттерны вроде &amp;quot;2024-01-15&amp;quot; или &amp;quot;15/01/2024&amp;quot;&lt;br /&gt;
  date_pattern &amp;lt;- &amp;quot;\\d{4}-\\d{2}-\\d{2}|\\d{2}/\\d{2}/\\d{4}&amp;quot;&lt;br /&gt;
  date_cols &amp;lt;- char_cols[sapply(df[char_cols], function(col) {&lt;br /&gt;
    any(str_detect(na.omit(as.character(col[1:min(5, length(col))])), date_pattern), na.rm = TRUE)&lt;br /&gt;
  })]&lt;br /&gt;
  &lt;br /&gt;
  cat_cols &amp;lt;- setdiff(char_cols, date_cols)&lt;br /&gt;
  list(num = num_cols, cat = cat_cols, date = date_cols)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
safe_to_numeric &amp;lt;- function(series) {&lt;br /&gt;
  suppressWarnings(as.numeric(series))&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
safe_to_datetime &amp;lt;- function(series) {&lt;br /&gt;
  parsed &amp;lt;- parse_date_time(series, orders = c(&amp;quot;Ymd&amp;quot;, &amp;quot;dmy&amp;quot;, &amp;quot;mdY&amp;quot;), quiet = TRUE)&lt;br /&gt;
  ifelse(is.na(parsed), NA, parsed)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
plot_missingness &amp;lt;- function(df) {&lt;br /&gt;
  null_pct &amp;lt;- colSums(is.na(df)) / nrow(df) * 100&lt;br /&gt;
  null_pct &amp;lt;- null_pct[null_pct &amp;gt; 0] %&amp;gt;% sort(decreasing = TRUE) %&amp;gt;% head(30)&lt;br /&gt;
  &lt;br /&gt;
  if (length(null_pct) == 0) return(NULL)&lt;br /&gt;
  &lt;br /&gt;
  tibble(Column = names(null_pct), `Missing %` = null_pct) %&amp;gt;%&lt;br /&gt;
    mutate(Column = fct_reorder(Column, `Missing %`)) %&amp;gt;%&lt;br /&gt;
    ggplot(aes(x = `Missing %`, y = Column, fill = `Missing %`)) +&lt;br /&gt;
    geom_col(show.legend = FALSE) +&lt;br /&gt;
    scale_fill_gradient(low = &amp;quot;#fee0d2&amp;quot;, high = &amp;quot;#cb181d&amp;quot;) +&lt;br /&gt;
    labs(title = &amp;quot;Top Columns by Missing Percentage (%)&amp;quot;, x = &amp;quot;% Missing&amp;quot;, y = NULL) +&lt;br /&gt;
    theme(axis.text.y = element_text(size = 9))&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
plot_univariate_num &amp;lt;- function(df, num_cols) {&lt;br /&gt;
  cols_to_plot &amp;lt;- head(num_cols, 12)&lt;br /&gt;
  if (length(cols_to_plot) == 0) return(NULL)&lt;br /&gt;
  &lt;br /&gt;
  plots &amp;lt;- lapply(cols_to_plot, function(col) {&lt;br /&gt;
    df %&amp;gt;% &lt;br /&gt;
      drop_na(!!sym(col)) %&amp;gt;%&lt;br /&gt;
      ggplot(aes(x = .data[[col]])) +&lt;br /&gt;
      geom_histogram(aes(y = after_stat(density)), bins = 30, fill = &amp;quot;teal&amp;quot;, color = &amp;quot;white&amp;quot;, alpha = 0.8) +&lt;br /&gt;
      geom_density(color = &amp;quot;darkred&amp;quot;, linewidth = 0.8) +&lt;br /&gt;
      labs(title = sprintf(&amp;quot;Distribution of %s&amp;quot;, col), x = NULL, y = &amp;quot;Density&amp;quot;) +&lt;br /&gt;
      theme(axis.text.x = element_text(angle = 45, hjust = 1))&lt;br /&gt;
  })&lt;br /&gt;
  &lt;br /&gt;
  wrap_plots(plots, ncol = 3)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
plot_univariate_cat &amp;lt;- function(df, cat_cols) {&lt;br /&gt;
  cols_to_plot &amp;lt;- head(cat_cols, 6)&lt;br /&gt;
  if (length(cols_to_plot) == 0) return(NULL)&lt;br /&gt;
  &lt;br /&gt;
  lapply(cols_to_plot, function(col) {&lt;br /&gt;
    top_vals &amp;lt;- df %&amp;gt;% &lt;br /&gt;
      count(.data[[col]], sort = TRUE) %&amp;gt;% &lt;br /&gt;
      slice_head(n = 15)&lt;br /&gt;
    &lt;br /&gt;
    top_vals %&amp;gt;%&lt;br /&gt;
      mutate(!!col := fct_reorder(.data[[col]], n)) %&amp;gt;%&lt;br /&gt;
      ggplot(aes(x = n, y = .data[[col]], fill = n)) +&lt;br /&gt;
      geom_col(show.legend = FALSE) +&lt;br /&gt;
      scale_fill_viridis_d(option = &amp;quot;viridis&amp;quot;) +&lt;br /&gt;
      labs(title = sprintf(&amp;quot;Top 15 Categories: %s&amp;quot;, col), x = &amp;quot;Count&amp;quot;, y = NULL) +&lt;br /&gt;
      theme(axis.text.y = element_text(size = 9))&lt;br /&gt;
  })&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
plot_correlation &amp;lt;- function(df, num_cols) {&lt;br /&gt;
  if (length(num_cols) &amp;lt; 2) return(NULL)&lt;br /&gt;
  &lt;br /&gt;
  corr_mat &amp;lt;- df %&amp;gt;% select(all_of(num_cols)) %&amp;gt;% cor(use = &amp;quot;complete.obs&amp;quot;)&lt;br /&gt;
  corrplot(corr_mat, &lt;br /&gt;
           method = &amp;quot;color&amp;quot;, &lt;br /&gt;
           type = &amp;quot;upper&amp;quot;, &lt;br /&gt;
           tl.cex = 0.8, &lt;br /&gt;
           tl.srt = 45,&lt;br /&gt;
           addCoef.col = &amp;quot;black&amp;quot;, &lt;br /&gt;
           number.cex = 0.6,&lt;br /&gt;
           col = colorRampPalette(c(&amp;quot;#6D9EC1&amp;quot;, &amp;quot;white&amp;quot;, &amp;quot;#E46726&amp;quot;))(200),&lt;br /&gt;
           title = &amp;quot;Pearson Correlation Matrix&amp;quot;,&lt;br /&gt;
           mar = c(0,0,1,0))&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# ==========================================&lt;br /&gt;
# C) Load + Validate&lt;br /&gt;
# ==========================================&lt;br /&gt;
df &amp;lt;- safe_read_csv(DATA_DIR)&lt;br /&gt;
validate_columns(df, EXACT_COLUMNS)&lt;br /&gt;
&lt;br /&gt;
if (nrow(df) &amp;gt; 0) {&lt;br /&gt;
  # ==========================================&lt;br /&gt;
  # D) Data Audit&lt;br /&gt;
  # ==========================================&lt;br /&gt;
  cat(sprintf(&amp;quot;\n--- DATA AUDIT: %s ---\n&amp;quot;, DATASET_NAME))&lt;br /&gt;
  cat(sprintf(&amp;quot;Shape: %d rows × %d columns\n&amp;quot;, nrow(df), ncol(df)))&lt;br /&gt;
  cat(sprintf(&amp;quot;Memory Usage: %.2f MB\n&amp;quot;, object.size(df) / 1024^2))&lt;br /&gt;
  cat(sprintf(&amp;quot;Duplicates: %d\n&amp;quot;, sum(duplicated(df))))&lt;br /&gt;
  &lt;br /&gt;
  null_audit &amp;lt;- audit_missingness(df)&lt;br /&gt;
  cat(&amp;quot;\nNull Audit Summary (Top 5 Missing):\n&amp;quot;)&lt;br /&gt;
  print(null_audit %&amp;gt;% slice_head(n = 5))&lt;br /&gt;
  &lt;br /&gt;
  col_types &amp;lt;- detect_column_types(df)&lt;br /&gt;
  num_cols &amp;lt;- col_types$num&lt;br /&gt;
  cat_cols &amp;lt;- col_types$cat&lt;br /&gt;
  date_cols &amp;lt;- col_types$date&lt;br /&gt;
  &lt;br /&gt;
  cat(sprintf(&amp;quot;\nDetected Numeric Columns: %s\n&amp;quot;, paste(num_cols, collapse = &amp;quot;, &amp;quot;)))&lt;br /&gt;
  cat(sprintf(&amp;quot;Detected Categorical Columns: %s\n&amp;quot;, paste(cat_cols, collapse = &amp;quot;, &amp;quot;)))&lt;br /&gt;
  cat(sprintf(&amp;quot;Detected Date Columns: %s\n&amp;quot;, paste(date_cols, collapse = &amp;quot;, &amp;quot;)))&lt;br /&gt;
  &lt;br /&gt;
  # Проверка на бесконечные значения и низкую дисперсию&lt;br /&gt;
  if (length(num_cols) &amp;gt; 0) {&lt;br /&gt;
    inf_counts &amp;lt;- sum(sapply(df[num_cols], function(x) sum(is.infinite(x))), na.rm = TRUE)&lt;br /&gt;
    cat(sprintf(&amp;quot;Total Inf/-Inf values: %d\n&amp;quot;, inf_counts))&lt;br /&gt;
    &lt;br /&gt;
    low_var &amp;lt;- num_cols[sapply(df[num_cols], function(x) sd(x, na.rm = TRUE) &amp;lt; 0.01)]&lt;br /&gt;
    if (length(low_var) &amp;gt; 0) cat(sprintf(&amp;quot;Low variance columns: %s\n&amp;quot;, paste(low_var, collapse = &amp;quot;, &amp;quot;)))&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  # ==========================================&lt;br /&gt;
  # E) ETL (Safe + Reversible)&lt;br /&gt;
  # ==========================================&lt;br /&gt;
  df_clean &amp;lt;- df %&amp;gt;% mutate(across(everything(), ~.x))  # явное копирование&lt;br /&gt;
  &lt;br /&gt;
  # Очистка строк: пробелы + унификация пропусков&lt;br /&gt;
  missing_tokens &amp;lt;- c(&amp;quot;&amp;quot;, &amp;quot;NA&amp;quot;, &amp;quot;N/A&amp;quot;, &amp;quot;null&amp;quot;, &amp;quot;None&amp;quot;, &amp;quot;nan&amp;quot;)&lt;br /&gt;
  df_clean &amp;lt;- df_clean %&amp;gt;%&lt;br /&gt;
    mutate(across(where(is.character), ~{&lt;br /&gt;
      .x %&amp;gt;% &lt;br /&gt;
        str_trim() %&amp;gt;% &lt;br /&gt;
        na_if(&amp;quot;&amp;quot;) %&amp;gt;% &lt;br /&gt;
        { ifelse(. %in% missing_tokens, NA, .) }&lt;br /&gt;
    }))&lt;br /&gt;
  &lt;br /&gt;
  # Попытка конвертировать &amp;quot;числовые&amp;quot; строки в numeric&lt;br /&gt;
  for (col in cat_cols) {&lt;br /&gt;
    if (col %in% names(df_clean)) {&lt;br /&gt;
      sample_vals &amp;lt;- df_clean[[col]] %&amp;gt;% drop_na() %&amp;gt;% head(10) %&amp;gt;% as.character()&lt;br /&gt;
      if (all(str_detect(sample_vals, &amp;quot;^-?\\d+(\\.\\d+)?$&amp;quot;), na.rm = TRUE) &amp;amp;&amp;amp; length(sample_vals) &amp;gt; 0) {&lt;br /&gt;
        df_clean[[col]] &amp;lt;- safe_to_numeric(df_clean[[col]])&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  # Удаление дубликатов&lt;br /&gt;
  df_clean &amp;lt;- df_clean %&amp;gt;% distinct()&lt;br /&gt;
  &lt;br /&gt;
  # Пересчёт типов после очистки&lt;br /&gt;
  col_types &amp;lt;- detect_column_types(df_clean)&lt;br /&gt;
  num_cols &amp;lt;- col_types$num&lt;br /&gt;
  cat_cols &amp;lt;- col_types$cat&lt;br /&gt;
  &lt;br /&gt;
  # Обработка пропусков: импутация + индикаторы&lt;br /&gt;
  for (col in num_cols) {&lt;br /&gt;
    if (any(is.na(df_clean[[col]]))) {&lt;br /&gt;
      df_clean[[paste0(col, &amp;quot;__was_missing&amp;quot;)]] &amp;lt;- as.integer(is.na(df_clean[[col]]))&lt;br /&gt;
      df_clean[[col]] &amp;lt;- ifelse(is.na(df_clean[[col]]), &lt;br /&gt;
                                median(df_clean[[col]], na.rm = TRUE), &lt;br /&gt;
                                df_clean[[col]])&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  for (col in cat_cols) {&lt;br /&gt;
    if (any(is.na(df_clean[[col]]))) {&lt;br /&gt;
      df_clean[[paste0(col, &amp;quot;__was_missing&amp;quot;)]] &amp;lt;- as.integer(is.na(df_clean[[col]]))&lt;br /&gt;
      df_clean[[col]] &amp;lt;- replace_na(df_clean[[col]], &amp;quot;Missing&amp;quot;)&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  # ==========================================&lt;br /&gt;
  # F) EDA (Univariate &amp;amp; Bivariate)&lt;br /&gt;
  # ==========================================&lt;br /&gt;
  if (length(num_cols) &amp;gt; 0) {&lt;br /&gt;
    cat(&amp;quot;\nNumeric Distribution Summary:\n&amp;quot;)&lt;br /&gt;
    stats &amp;lt;- df_clean %&amp;gt;%&lt;br /&gt;
      select(all_of(num_cols)) %&amp;gt;%&lt;br /&gt;
      summarise(across(everything(), &lt;br /&gt;
                       list(mean = ~mean(., na.rm = TRUE),&lt;br /&gt;
                            std = ~sd(., na.rm = TRUE),&lt;br /&gt;
                            min = ~min(., na.rm = TRUE),&lt;br /&gt;
                            median = ~median(., na.rm = TRUE),&lt;br /&gt;
                            max = ~max(., na.rm = TRUE),&lt;br /&gt;
                            skew = ~mean((. - mean(., na.rm = TRUE))^3, na.rm = TRUE) / sd(., na.rm = TRUE)^3),&lt;br /&gt;
                       .names = &amp;quot;{.col}_{.fn}&amp;quot;))&lt;br /&gt;
    print(stats)&lt;br /&gt;
    &lt;br /&gt;
    # Поиск высококоррелирующих пар&lt;br /&gt;
    if (length(num_cols) &amp;gt;= 2) {&lt;br /&gt;
      corr_mat &amp;lt;- df_clean %&amp;gt;% select(all_of(num_cols)) %&amp;gt;% cor(use = &amp;quot;complete.obs&amp;quot;) %&amp;gt;% abs()&lt;br /&gt;
      upper &amp;lt;- corr_mat[upper.tri(corr_mat)]&lt;br /&gt;
      high_corr &amp;lt;- which(upper &amp;gt;= 0.85, arr.ind = TRUE)&lt;br /&gt;
      &lt;br /&gt;
      if (nrow(high_corr) &amp;gt; 0) {&lt;br /&gt;
        cat(&amp;quot;\nHighly Correlated Pairs (|r| &amp;gt;= 0.85):\n&amp;quot;)&lt;br /&gt;
        for (i in seq_len(nrow(high_corr))) {&lt;br /&gt;
          row_name &amp;lt;- rownames(corr_mat)[high_corr[i, 1]]&lt;br /&gt;
          col_name &amp;lt;- colnames(corr_mat)[high_corr[i, 2]]&lt;br /&gt;
          cat(sprintf(&amp;quot; - %s &amp;amp; %s: %.3f\n&amp;quot;, row_name, col_name, upper[high_corr[i, 1], high_corr[i, 2]]))&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  # ==========================================&lt;br /&gt;
  # G) Feature Engineering (Lightweight)&lt;br /&gt;
  # ==========================================&lt;br /&gt;
  text_candidates &amp;lt;- intersect(c(&amp;quot;title&amp;quot;, &amp;quot;artist&amp;quot;, &amp;quot;movie&amp;quot;, &amp;quot;language&amp;quot;), cat_cols)&lt;br /&gt;
  &lt;br /&gt;
  for (col in text_candidates) {&lt;br /&gt;
    if (col %in% names(df_clean)) {&lt;br /&gt;
      df_clean[[paste0(col, &amp;quot;__len&amp;quot;)]] &amp;lt;- str_length(as.character(df_clean[[col]]))&lt;br /&gt;
      df_clean[[paste0(col, &amp;quot;__words&amp;quot;)]] &amp;lt;- &lt;br /&gt;
        str_count(as.character(df_clean[[col]]), &amp;quot;\\S+&amp;quot;)  # количество слов&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  # Раскрытие дат&lt;br /&gt;
  for (col in date_cols) {&lt;br /&gt;
    if (col %in% names(df_clean)) {&lt;br /&gt;
      df_clean[[col]] &amp;lt;- safe_to_datetime(df_clean[[col]])&lt;br /&gt;
      if (!all(is.na(df_clean[[col]]))) {&lt;br /&gt;
        df_clean[[paste0(col, &amp;quot;__year&amp;quot;)]] &amp;lt;- year(df_clean[[col]])&lt;br /&gt;
        df_clean[[paste0(col, &amp;quot;__month&amp;quot;)]] &amp;lt;- month(df_clean[[col]])&lt;br /&gt;
        df_clean[[paste0(col, &amp;quot;__dayofweek&amp;quot;)]] &amp;lt;- wday(df_clean[[col]], week_start = 1)&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  # ==========================================&lt;br /&gt;
  # H) Visualization&lt;br /&gt;
  # ==========================================&lt;br /&gt;
  # Missingness plot&lt;br /&gt;
  p_missing &amp;lt;- plot_missingness(df)&lt;br /&gt;
  if (!is.null(p_missing)) print(p_missing)&lt;br /&gt;
  &lt;br /&gt;
  # Обновляем типы после Feature Engineering&lt;br /&gt;
  col_types_upd &amp;lt;- detect_column_types(df_clean)&lt;br /&gt;
  num_cols_upd &amp;lt;- col_types_upd$num&lt;br /&gt;
  &lt;br /&gt;
  # Univariate numerical&lt;br /&gt;
  p_num &amp;lt;- plot_univariate_num(df_clean, num_cols_upd)&lt;br /&gt;
  if (!is.null(p_num)) print(p_num)&lt;br /&gt;
  &lt;br /&gt;
  # Univariate categorical&lt;br /&gt;
  p_cat_plots &amp;lt;- plot_univariate_cat(df_clean, cat_cols)&lt;br /&gt;
  if (!is.null(p_cat_plots)) lapply(p_cat_plots, print)&lt;br /&gt;
  &lt;br /&gt;
  # Correlation heatmap&lt;br /&gt;
  plot_correlation(df_clean, num_cols_upd)&lt;br /&gt;
  &lt;br /&gt;
  # Target-aware analysis&lt;br /&gt;
  if (!is.null(TARGET_COL) &amp;amp;&amp;amp; TARGET_COL %in% names(df_clean)) {&lt;br /&gt;
    cat(sprintf(&amp;quot;\nTarget Analysis: %s\n&amp;quot;, TARGET_COL))&lt;br /&gt;
    &lt;br /&gt;
    if (TARGET_COL %in% num_cols_upd) {&lt;br /&gt;
      # Числовая целевая: корреляции&lt;br /&gt;
      target_corr &amp;lt;- df_clean %&amp;gt;%&lt;br /&gt;
        select(all_of(num_cols_upd)) %&amp;gt;%&lt;br /&gt;
        cor(use = &amp;quot;complete.obs&amp;quot;)[, TARGET_COL] %&amp;gt;%&lt;br /&gt;
        sort(decreasing = TRUE)&lt;br /&gt;
      cat(&amp;quot;Correlations with Target:\n&amp;quot;)&lt;br /&gt;
      print(target_corr)&lt;br /&gt;
    } else {&lt;br /&gt;
      # Категориальная целевая: распределение&lt;br /&gt;
      df_clean %&amp;gt;%&lt;br /&gt;
        count(.data[[TARGET_COL]], sort = TRUE) %&amp;gt;%&lt;br /&gt;
        mutate(!!TARGET_COL := fct_reorder(.data[[TARGET_COL]], n)) %&amp;gt;%&lt;br /&gt;
        ggplot(aes(x = n, y = .data[[TARGET_COL]], fill = n)) +&lt;br /&gt;
        geom_col(show.legend = FALSE) +&lt;br /&gt;
        scale_fill_viridis_d(option = &amp;quot;magma&amp;quot;) +&lt;br /&gt;
        labs(title = sprintf(&amp;quot;Target Distribution: %s&amp;quot;, TARGET_COL), &lt;br /&gt;
             x = &amp;quot;Count&amp;quot;, y = NULL) +&lt;br /&gt;
        theme(axis.text.y = element_text(size = 10)) %&amp;gt;%&lt;br /&gt;
        print()&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  # ==========================================&lt;br /&gt;
  # I) Final Artifact Output&lt;br /&gt;
  # ==========================================&lt;br /&gt;
  cat(&amp;quot;\n--- FINAL SUMMARY ---\n&amp;quot;)&lt;br /&gt;
  cat(sprintf(&amp;quot;Original Shape: %d × %d\n&amp;quot;, nrow(df), ncol(df)))&lt;br /&gt;
  cat(sprintf(&amp;quot;Cleaned Shape:  %d × %d\n&amp;quot;, nrow(df_clean), ncol(df_clean)))&lt;br /&gt;
  cat(sprintf(&amp;quot;Duplicates removed: %d\n&amp;quot;, sum(duplicated(df))))&lt;br /&gt;
  cat(sprintf(&amp;quot;Columns processed: %s\n&amp;quot;, paste(names(df_clean), collapse = &amp;quot;, &amp;quot;)))&lt;br /&gt;
  cat(&amp;quot;\nProcessed Data Preview (df_clean %&amp;gt;% head()):\n&amp;quot;)&lt;br /&gt;
  print(df_clean %&amp;gt;% head())&lt;br /&gt;
  &lt;br /&gt;
} else {&lt;br /&gt;
  message(&amp;quot;DataFrame is empty. Pipeline terminated.&amp;quot;)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
== Выводы ==&lt;br /&gt;
=== Подтверждение гипотезы ===&lt;br /&gt;
Гипотеза о положительной связи между явкой и поддержкой основного кандидата &#039;&#039;&#039;подтвердилась&#039;&#039;&#039;. Коэффициент корреляции 0.929 указывает на очень сильную зависимость.&lt;br /&gt;
=== Практическая значимость ===&lt;br /&gt;
* Разработан воспроизводимый R-рецепт для анализа&lt;br /&gt;
* Создана методика визуализации электоральной статистики&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Работы ИНДОР-211]]&lt;br /&gt;
[[Категория:BigDataWorks]]&lt;/div&gt;</summary>
		<author><name>Pocrovskii Alexander</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%9A%D0%BE%D0%BB%D0%BB%D0%B5%D0%BA%D1%86%D0%B8%D1%8F_%D0%BF%D0%B5%D1%81%D0%B5%D0%BD_%D0%B8%D0%B7_%D0%B8%D0%BD%D0%B4%D0%B8%D0%B9%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%BA%D0%B8%D0%BD%D0%B5%D0%BC%D0%B0%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B0_DataSet&amp;diff=46204</id>
		<title>Коллекция песен из индийского кинематографа DataSet</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%9A%D0%BE%D0%BB%D0%BB%D0%B5%D0%BA%D1%86%D0%B8%D1%8F_%D0%BF%D0%B5%D1%81%D0%B5%D0%BD_%D0%B8%D0%B7_%D0%B8%D0%BD%D0%B4%D0%B8%D0%B9%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%BA%D0%B8%D0%BD%D0%B5%D0%BC%D0%B0%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B0_DataSet&amp;diff=46204"/>
		<updated>2026-04-14T10:03:09Z</updated>

		<summary type="html">&lt;p&gt;Pocrovskii Alexander: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Model&lt;br /&gt;
|Description=Коллекция песен из индийского кинематографа&lt;br /&gt;
|Field_of_knowledge=Информатика, Образование, Искусственный интеллект, Большие данные, Музыка, Медиа&lt;br /&gt;
|Website=https://www.kaggle.com/datasets/moonknightmarvel/dataset-of-songs-with-genreartistmovielanguage/data&lt;br /&gt;
|Inventor=Pocrovskii Alexander&lt;br /&gt;
|Environment=R, Большие данные&lt;br /&gt;
|Student-created=Да&lt;br /&gt;
}}&lt;br /&gt;
== Общая информация ==&lt;br /&gt;
* &#039;&#039;&#039;Авторы:&#039;&#039;&#039; Студент группы [[Категория:ИНДОР-211]] -   [[Участник:Pokrovskii Alexander|Pokrovskii Alexander]]&lt;br /&gt;
* &#039;&#039;&#039;Дата исследования:&#039;&#039;&#039; 14 апреля 2026&lt;br /&gt;
* &#039;&#039;&#039;Источник:&#039;&#039;&#039; Kaggle Datasets&lt;br /&gt;
* &#039;&#039;&#039;Платформа:&#039;&#039;&#039; Kaggle&lt;br /&gt;
* &#039;&#039;&#039;Дата публикации:&#039;&#039;&#039; 23 апреля 2026 г.&lt;br /&gt;
&lt;br /&gt;
=== Исходные данные ===&lt;br /&gt;
* &#039;&#039;&#039;Файл:&#039;&#039;&#039; songs_db.csv (6 КB)&lt;br /&gt;
* &#039;&#039;&#039;Структура:&#039;&#039;&#039; 101 строк (избирательных участков), 5 столбцов&lt;br /&gt;
* &#039;&#039;&#039;Ссылка:&#039;&#039;&#039; https://www.kaggle.com/datasets/moonknightmarvel/dataset-of-songs-with-genreartistmovielanguage/data&lt;br /&gt;
*&lt;br /&gt;
&amp;lt;uml&amp;gt;&lt;br /&gt;
@startuml&lt;br /&gt;
&lt;br /&gt;
title Пайплайн представления музыкальных данных в Digida&lt;br /&gt;
skinparam handwritten false&lt;br /&gt;
&lt;br /&gt;
rectangle &amp;quot;Внешние данные (OWID CSV)&amp;quot; as external #LightBlue&lt;br /&gt;
rectangle &amp;quot;R: предварительная загрузка&amp;quot; as r_load #LightGreen  &lt;br /&gt;
rectangle &amp;quot;OpenRefine: очистка и обогащение&amp;quot; as refine #LightYellow&lt;br /&gt;
rectangle &amp;quot;R: визуализация + экспорт&amp;quot; as r_export #LightPink&lt;br /&gt;
rectangle &amp;quot;Digida: публикация&amp;quot; as platform #LightCoral&lt;br /&gt;
&lt;br /&gt;
external --&amp;gt; r_load : read_csv()&lt;br /&gt;
r_load --&amp;gt; refine : экспорт songs_db.csv&lt;br /&gt;
refine --&amp;gt; refine : Нормализация, расчёт метрик&lt;br /&gt;
refine --&amp;gt; r_export : экспорт songs_db_clean.csv&lt;br /&gt;
r_export --&amp;gt; r_export : ggplot2 + patchwork дашборд&lt;br /&gt;
r_export --&amp;gt; platform : загрузка страниц + дашборд&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@enduml&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/uml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Описание исследования ==&lt;br /&gt;
Исследование посвящено анализу структурированных музыкальных метаданных на примере датасета песен из индийских фильмов.&lt;br /&gt;
&lt;br /&gt;
=== Цель ===&lt;br /&gt;
Выявить статистически значимые связи между метаданными песен (язык, исполнитель, фильм) и их эмоциональной категорией, а также построить и валидировать модель машинного обучения для прогнозирования эмоции песни на основе доступных признаков с точностью не ниже 75% (F1-macro).&lt;br /&gt;
&lt;br /&gt;
=== Задачи ===&lt;br /&gt;
# Выполнить предобработку: кодирование категориальных признаков (Artist, Movie, Language), балансировку данных (при необходимости), разделение на обучающую/тестовую выборки.&lt;br /&gt;
# Выполнить предобработку: кодирование категориальных признаков (Artist, Movie, Language), балансировку данных (при необходимости), разделение на обучающую/тестовую выборки.&lt;br /&gt;
# Построить и сравнить несколько моделей классификации (логистическая регрессия, Random Forest, XGBoost) с кросс-валидацией, оценить метрики качества (accuracy, precision, recall, F1-score).&lt;br /&gt;
# Визуализировать результаты: матрицу ошибок, важность признаков, распределение предсказаний, а также сформировать интерпретируемые выводы о доминирующих факторах, влияющих на эмоциональную окраску песни.&lt;br /&gt;
&lt;br /&gt;
=== Гипотеза ===&lt;br /&gt;
Эмоциональная категория песни (Emotion) статистически значимо зависит от комбинации языка исполнения и исполнителя: песни на телугу в исполнении артистов «первого эшелона» (например, Sid Sriram, Armaan Malik) с большей вероятностью относятся к категориям Love или Joy, тогда как треки второстепенных исполнителей или из менее популярных фильмов чаще маркируются как Sadness или Anticipation. При этом модель, обученная на признаках Language + Artist + Movie, покажет качество прогнозирования эмоции выше базового уровня (majority class baseline) не менее чем на 20 п.п. по метрике F1-macro.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Программный код ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;R&amp;quot;&amp;gt;&lt;br /&gt;
# Анализ БД&lt;br /&gt;
&lt;br /&gt;
# ==========================================&lt;br /&gt;
# A) Imports + Global Config&lt;br /&gt;
# ==========================================&lt;br /&gt;
library(tidyverse)    # dplyr, tidyr, readr, ggplot2, stringr, purrr&lt;br /&gt;
library(lubridate)    # работа с датами&lt;br /&gt;
library(corrplot)     # тепловые карты корреляций&lt;br /&gt;
library(scales)       # форматирование осей&lt;br /&gt;
library(patchwork)    # компоновка графиков&lt;br /&gt;
&lt;br /&gt;
set.seed(42)&lt;br /&gt;
options(digits = 2, width = 120)&lt;br /&gt;
&lt;br /&gt;
# Глобальные настройки ggplot2&lt;br /&gt;
theme_set(theme_minimal(base_size = 12))&lt;br /&gt;
update_geom_defaults(&amp;quot;point&amp;quot;, list(alpha = 0.6))&lt;br /&gt;
&lt;br /&gt;
# Входные параметры (аналог Python-конфига)&lt;br /&gt;
DATASET_NAME &amp;lt;- &amp;quot;moonknightmarvel/dataset-of-songs-with-genreartistmovielanguage&amp;quot;&lt;br /&gt;
EXACT_COLUMNS &amp;lt;- c(&amp;quot;title&amp;quot;, &amp;quot;artist&amp;quot;, &amp;quot;movie&amp;quot;, &amp;quot;language&amp;quot;, &amp;quot;emotion&amp;quot;)&lt;br /&gt;
TARGET_COL &amp;lt;- NULL  # можно задать, например, &amp;quot;emotion&amp;quot;&lt;br /&gt;
DATA_DIR &amp;lt;- &amp;quot;data/raw/songs_dataset.csv&amp;quot;  # путь к файлу&lt;br /&gt;
&lt;br /&gt;
# ==========================================&lt;br /&gt;
# B) Helper Functions (Robust &amp;amp; Defensive)&lt;br /&gt;
# ==========================================&lt;br /&gt;
&lt;br /&gt;
safe_read_csv &amp;lt;- function(path) {&lt;br /&gt;
  tryCatch(&lt;br /&gt;
    read_csv(path, show_col_types = FALSE),&lt;br /&gt;
    error = function(e) {&lt;br /&gt;
      message(sprintf(&amp;quot;CRITICAL ERROR: Could not read CSV at %s. Error: %s&amp;quot;, path, e$message))&lt;br /&gt;
      return(tibble())&lt;br /&gt;
    }&lt;br /&gt;
  )&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
validate_columns &amp;lt;- function(df, expected_cols) {&lt;br /&gt;
  if (nrow(df) == 0 || is.null(expected_cols)) return(invisible(NULL))&lt;br /&gt;
  &lt;br /&gt;
  actual_cols &amp;lt;- names(df)&lt;br /&gt;
  missing &amp;lt;- setdiff(expected_cols, actual_cols)&lt;br /&gt;
  extra &amp;lt;- setdiff(actual_cols, expected_cols)&lt;br /&gt;
  &lt;br /&gt;
  cat(strrep(&amp;quot;-&amp;quot;, 30), &amp;quot;\n&amp;quot;)&lt;br /&gt;
  cat(sprintf(&amp;quot;COLUMN VALIDATION: %s\n&amp;quot;, DATASET_NAME))&lt;br /&gt;
  &lt;br /&gt;
  if (length(missing) == 0 &amp;amp;&amp;amp; length(extra) == 0) {&lt;br /&gt;
    cat(&amp;quot;Success: All expected columns found. No extra columns.\n&amp;quot;)&lt;br /&gt;
  } else {&lt;br /&gt;
    if (length(missing) &amp;gt; 0) cat(sprintf(&amp;quot;Missing expected columns: %s\n&amp;quot;, paste(missing, collapse = &amp;quot;, &amp;quot;)))&lt;br /&gt;
    if (length(extra) &amp;gt; 0) cat(sprintf(&amp;quot;Extra columns found: %s\n&amp;quot;, paste(extra, collapse = &amp;quot;, &amp;quot;)))&lt;br /&gt;
  }&lt;br /&gt;
  cat(strrep(&amp;quot;-&amp;quot;, 30), &amp;quot;\n&amp;quot;)&lt;br /&gt;
  invisible(NULL)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
audit_missingness &amp;lt;- function(df) {&lt;br /&gt;
  null_counts &amp;lt;- colSums(is.na(df))&lt;br /&gt;
  null_pct &amp;lt;- (null_counts / nrow(df)) * 100&lt;br /&gt;
  non_null &amp;lt;- nrow(df) - null_counts&lt;br /&gt;
  &lt;br /&gt;
  tibble(&lt;br /&gt;
    Column = names(df),&lt;br /&gt;
    `Null Count` = null_counts,&lt;br /&gt;
    `Null %` = round(null_pct, 2),&lt;br /&gt;
    `Non-Null Count` = non_null&lt;br /&gt;
  ) %&amp;gt;% arrange(desc(`Null %`))&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
detect_column_types &amp;lt;- function(df) {&lt;br /&gt;
  num_cols &amp;lt;- names(df)[sapply(df, is.numeric)]&lt;br /&gt;
  char_cols &amp;lt;- names(df)[sapply(df, is.character)]&lt;br /&gt;
  &lt;br /&gt;
  # Эвристика для дат: ищем паттерны вроде &amp;quot;2024-01-15&amp;quot; или &amp;quot;15/01/2024&amp;quot;&lt;br /&gt;
  date_pattern &amp;lt;- &amp;quot;\\d{4}-\\d{2}-\\d{2}|\\d{2}/\\d{2}/\\d{4}&amp;quot;&lt;br /&gt;
  date_cols &amp;lt;- char_cols[sapply(df[char_cols], function(col) {&lt;br /&gt;
    any(str_detect(na.omit(as.character(col[1:min(5, length(col))])), date_pattern), na.rm = TRUE)&lt;br /&gt;
  })]&lt;br /&gt;
  &lt;br /&gt;
  cat_cols &amp;lt;- setdiff(char_cols, date_cols)&lt;br /&gt;
  list(num = num_cols, cat = cat_cols, date = date_cols)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
safe_to_numeric &amp;lt;- function(series) {&lt;br /&gt;
  suppressWarnings(as.numeric(series))&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
safe_to_datetime &amp;lt;- function(series) {&lt;br /&gt;
  parsed &amp;lt;- parse_date_time(series, orders = c(&amp;quot;Ymd&amp;quot;, &amp;quot;dmy&amp;quot;, &amp;quot;mdY&amp;quot;), quiet = TRUE)&lt;br /&gt;
  ifelse(is.na(parsed), NA, parsed)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
plot_missingness &amp;lt;- function(df) {&lt;br /&gt;
  null_pct &amp;lt;- colSums(is.na(df)) / nrow(df) * 100&lt;br /&gt;
  null_pct &amp;lt;- null_pct[null_pct &amp;gt; 0] %&amp;gt;% sort(decreasing = TRUE) %&amp;gt;% head(30)&lt;br /&gt;
  &lt;br /&gt;
  if (length(null_pct) == 0) return(NULL)&lt;br /&gt;
  &lt;br /&gt;
  tibble(Column = names(null_pct), `Missing %` = null_pct) %&amp;gt;%&lt;br /&gt;
    mutate(Column = fct_reorder(Column, `Missing %`)) %&amp;gt;%&lt;br /&gt;
    ggplot(aes(x = `Missing %`, y = Column, fill = `Missing %`)) +&lt;br /&gt;
    geom_col(show.legend = FALSE) +&lt;br /&gt;
    scale_fill_gradient(low = &amp;quot;#fee0d2&amp;quot;, high = &amp;quot;#cb181d&amp;quot;) +&lt;br /&gt;
    labs(title = &amp;quot;Top Columns by Missing Percentage (%)&amp;quot;, x = &amp;quot;% Missing&amp;quot;, y = NULL) +&lt;br /&gt;
    theme(axis.text.y = element_text(size = 9))&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
plot_univariate_num &amp;lt;- function(df, num_cols) {&lt;br /&gt;
  cols_to_plot &amp;lt;- head(num_cols, 12)&lt;br /&gt;
  if (length(cols_to_plot) == 0) return(NULL)&lt;br /&gt;
  &lt;br /&gt;
  plots &amp;lt;- lapply(cols_to_plot, function(col) {&lt;br /&gt;
    df %&amp;gt;% &lt;br /&gt;
      drop_na(!!sym(col)) %&amp;gt;%&lt;br /&gt;
      ggplot(aes(x = .data[[col]])) +&lt;br /&gt;
      geom_histogram(aes(y = after_stat(density)), bins = 30, fill = &amp;quot;teal&amp;quot;, color = &amp;quot;white&amp;quot;, alpha = 0.8) +&lt;br /&gt;
      geom_density(color = &amp;quot;darkred&amp;quot;, linewidth = 0.8) +&lt;br /&gt;
      labs(title = sprintf(&amp;quot;Distribution of %s&amp;quot;, col), x = NULL, y = &amp;quot;Density&amp;quot;) +&lt;br /&gt;
      theme(axis.text.x = element_text(angle = 45, hjust = 1))&lt;br /&gt;
  })&lt;br /&gt;
  &lt;br /&gt;
  wrap_plots(plots, ncol = 3)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
plot_univariate_cat &amp;lt;- function(df, cat_cols) {&lt;br /&gt;
  cols_to_plot &amp;lt;- head(cat_cols, 6)&lt;br /&gt;
  if (length(cols_to_plot) == 0) return(NULL)&lt;br /&gt;
  &lt;br /&gt;
  lapply(cols_to_plot, function(col) {&lt;br /&gt;
    top_vals &amp;lt;- df %&amp;gt;% &lt;br /&gt;
      count(.data[[col]], sort = TRUE) %&amp;gt;% &lt;br /&gt;
      slice_head(n = 15)&lt;br /&gt;
    &lt;br /&gt;
    top_vals %&amp;gt;%&lt;br /&gt;
      mutate(!!col := fct_reorder(.data[[col]], n)) %&amp;gt;%&lt;br /&gt;
      ggplot(aes(x = n, y = .data[[col]], fill = n)) +&lt;br /&gt;
      geom_col(show.legend = FALSE) +&lt;br /&gt;
      scale_fill_viridis_d(option = &amp;quot;viridis&amp;quot;) +&lt;br /&gt;
      labs(title = sprintf(&amp;quot;Top 15 Categories: %s&amp;quot;, col), x = &amp;quot;Count&amp;quot;, y = NULL) +&lt;br /&gt;
      theme(axis.text.y = element_text(size = 9))&lt;br /&gt;
  })&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
plot_correlation &amp;lt;- function(df, num_cols) {&lt;br /&gt;
  if (length(num_cols) &amp;lt; 2) return(NULL)&lt;br /&gt;
  &lt;br /&gt;
  corr_mat &amp;lt;- df %&amp;gt;% select(all_of(num_cols)) %&amp;gt;% cor(use = &amp;quot;complete.obs&amp;quot;)&lt;br /&gt;
  corrplot(corr_mat, &lt;br /&gt;
           method = &amp;quot;color&amp;quot;, &lt;br /&gt;
           type = &amp;quot;upper&amp;quot;, &lt;br /&gt;
           tl.cex = 0.8, &lt;br /&gt;
           tl.srt = 45,&lt;br /&gt;
           addCoef.col = &amp;quot;black&amp;quot;, &lt;br /&gt;
           number.cex = 0.6,&lt;br /&gt;
           col = colorRampPalette(c(&amp;quot;#6D9EC1&amp;quot;, &amp;quot;white&amp;quot;, &amp;quot;#E46726&amp;quot;))(200),&lt;br /&gt;
           title = &amp;quot;Pearson Correlation Matrix&amp;quot;,&lt;br /&gt;
           mar = c(0,0,1,0))&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# ==========================================&lt;br /&gt;
# C) Load + Validate&lt;br /&gt;
# ==========================================&lt;br /&gt;
df &amp;lt;- safe_read_csv(DATA_DIR)&lt;br /&gt;
validate_columns(df, EXACT_COLUMNS)&lt;br /&gt;
&lt;br /&gt;
if (nrow(df) &amp;gt; 0) {&lt;br /&gt;
  # ==========================================&lt;br /&gt;
  # D) Data Audit&lt;br /&gt;
  # ==========================================&lt;br /&gt;
  cat(sprintf(&amp;quot;\n--- DATA AUDIT: %s ---\n&amp;quot;, DATASET_NAME))&lt;br /&gt;
  cat(sprintf(&amp;quot;Shape: %d rows × %d columns\n&amp;quot;, nrow(df), ncol(df)))&lt;br /&gt;
  cat(sprintf(&amp;quot;Memory Usage: %.2f MB\n&amp;quot;, object.size(df) / 1024^2))&lt;br /&gt;
  cat(sprintf(&amp;quot;Duplicates: %d\n&amp;quot;, sum(duplicated(df))))&lt;br /&gt;
  &lt;br /&gt;
  null_audit &amp;lt;- audit_missingness(df)&lt;br /&gt;
  cat(&amp;quot;\nNull Audit Summary (Top 5 Missing):\n&amp;quot;)&lt;br /&gt;
  print(null_audit %&amp;gt;% slice_head(n = 5))&lt;br /&gt;
  &lt;br /&gt;
  col_types &amp;lt;- detect_column_types(df)&lt;br /&gt;
  num_cols &amp;lt;- col_types$num&lt;br /&gt;
  cat_cols &amp;lt;- col_types$cat&lt;br /&gt;
  date_cols &amp;lt;- col_types$date&lt;br /&gt;
  &lt;br /&gt;
  cat(sprintf(&amp;quot;\nDetected Numeric Columns: %s\n&amp;quot;, paste(num_cols, collapse = &amp;quot;, &amp;quot;)))&lt;br /&gt;
  cat(sprintf(&amp;quot;Detected Categorical Columns: %s\n&amp;quot;, paste(cat_cols, collapse = &amp;quot;, &amp;quot;)))&lt;br /&gt;
  cat(sprintf(&amp;quot;Detected Date Columns: %s\n&amp;quot;, paste(date_cols, collapse = &amp;quot;, &amp;quot;)))&lt;br /&gt;
  &lt;br /&gt;
  # Проверка на бесконечные значения и низкую дисперсию&lt;br /&gt;
  if (length(num_cols) &amp;gt; 0) {&lt;br /&gt;
    inf_counts &amp;lt;- sum(sapply(df[num_cols], function(x) sum(is.infinite(x))), na.rm = TRUE)&lt;br /&gt;
    cat(sprintf(&amp;quot;Total Inf/-Inf values: %d\n&amp;quot;, inf_counts))&lt;br /&gt;
    &lt;br /&gt;
    low_var &amp;lt;- num_cols[sapply(df[num_cols], function(x) sd(x, na.rm = TRUE) &amp;lt; 0.01)]&lt;br /&gt;
    if (length(low_var) &amp;gt; 0) cat(sprintf(&amp;quot;Low variance columns: %s\n&amp;quot;, paste(low_var, collapse = &amp;quot;, &amp;quot;)))&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  # ==========================================&lt;br /&gt;
  # E) ETL (Safe + Reversible)&lt;br /&gt;
  # ==========================================&lt;br /&gt;
  df_clean &amp;lt;- df %&amp;gt;% mutate(across(everything(), ~.x))  # явное копирование&lt;br /&gt;
  &lt;br /&gt;
  # Очистка строк: пробелы + унификация пропусков&lt;br /&gt;
  missing_tokens &amp;lt;- c(&amp;quot;&amp;quot;, &amp;quot;NA&amp;quot;, &amp;quot;N/A&amp;quot;, &amp;quot;null&amp;quot;, &amp;quot;None&amp;quot;, &amp;quot;nan&amp;quot;)&lt;br /&gt;
  df_clean &amp;lt;- df_clean %&amp;gt;%&lt;br /&gt;
    mutate(across(where(is.character), ~{&lt;br /&gt;
      .x %&amp;gt;% &lt;br /&gt;
        str_trim() %&amp;gt;% &lt;br /&gt;
        na_if(&amp;quot;&amp;quot;) %&amp;gt;% &lt;br /&gt;
        { ifelse(. %in% missing_tokens, NA, .) }&lt;br /&gt;
    }))&lt;br /&gt;
  &lt;br /&gt;
  # Попытка конвертировать &amp;quot;числовые&amp;quot; строки в numeric&lt;br /&gt;
  for (col in cat_cols) {&lt;br /&gt;
    if (col %in% names(df_clean)) {&lt;br /&gt;
      sample_vals &amp;lt;- df_clean[[col]] %&amp;gt;% drop_na() %&amp;gt;% head(10) %&amp;gt;% as.character()&lt;br /&gt;
      if (all(str_detect(sample_vals, &amp;quot;^-?\\d+(\\.\\d+)?$&amp;quot;), na.rm = TRUE) &amp;amp;&amp;amp; length(sample_vals) &amp;gt; 0) {&lt;br /&gt;
        df_clean[[col]] &amp;lt;- safe_to_numeric(df_clean[[col]])&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  # Удаление дубликатов&lt;br /&gt;
  df_clean &amp;lt;- df_clean %&amp;gt;% distinct()&lt;br /&gt;
  &lt;br /&gt;
  # Пересчёт типов после очистки&lt;br /&gt;
  col_types &amp;lt;- detect_column_types(df_clean)&lt;br /&gt;
  num_cols &amp;lt;- col_types$num&lt;br /&gt;
  cat_cols &amp;lt;- col_types$cat&lt;br /&gt;
  &lt;br /&gt;
  # Обработка пропусков: импутация + индикаторы&lt;br /&gt;
  for (col in num_cols) {&lt;br /&gt;
    if (any(is.na(df_clean[[col]]))) {&lt;br /&gt;
      df_clean[[paste0(col, &amp;quot;__was_missing&amp;quot;)]] &amp;lt;- as.integer(is.na(df_clean[[col]]))&lt;br /&gt;
      df_clean[[col]] &amp;lt;- ifelse(is.na(df_clean[[col]]), &lt;br /&gt;
                                median(df_clean[[col]], na.rm = TRUE), &lt;br /&gt;
                                df_clean[[col]])&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  for (col in cat_cols) {&lt;br /&gt;
    if (any(is.na(df_clean[[col]]))) {&lt;br /&gt;
      df_clean[[paste0(col, &amp;quot;__was_missing&amp;quot;)]] &amp;lt;- as.integer(is.na(df_clean[[col]]))&lt;br /&gt;
      df_clean[[col]] &amp;lt;- replace_na(df_clean[[col]], &amp;quot;Missing&amp;quot;)&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  # ==========================================&lt;br /&gt;
  # F) EDA (Univariate &amp;amp; Bivariate)&lt;br /&gt;
  # ==========================================&lt;br /&gt;
  if (length(num_cols) &amp;gt; 0) {&lt;br /&gt;
    cat(&amp;quot;\nNumeric Distribution Summary:\n&amp;quot;)&lt;br /&gt;
    stats &amp;lt;- df_clean %&amp;gt;%&lt;br /&gt;
      select(all_of(num_cols)) %&amp;gt;%&lt;br /&gt;
      summarise(across(everything(), &lt;br /&gt;
                       list(mean = ~mean(., na.rm = TRUE),&lt;br /&gt;
                            std = ~sd(., na.rm = TRUE),&lt;br /&gt;
                            min = ~min(., na.rm = TRUE),&lt;br /&gt;
                            median = ~median(., na.rm = TRUE),&lt;br /&gt;
                            max = ~max(., na.rm = TRUE),&lt;br /&gt;
                            skew = ~mean((. - mean(., na.rm = TRUE))^3, na.rm = TRUE) / sd(., na.rm = TRUE)^3),&lt;br /&gt;
                       .names = &amp;quot;{.col}_{.fn}&amp;quot;))&lt;br /&gt;
    print(stats)&lt;br /&gt;
    &lt;br /&gt;
    # Поиск высококоррелирующих пар&lt;br /&gt;
    if (length(num_cols) &amp;gt;= 2) {&lt;br /&gt;
      corr_mat &amp;lt;- df_clean %&amp;gt;% select(all_of(num_cols)) %&amp;gt;% cor(use = &amp;quot;complete.obs&amp;quot;) %&amp;gt;% abs()&lt;br /&gt;
      upper &amp;lt;- corr_mat[upper.tri(corr_mat)]&lt;br /&gt;
      high_corr &amp;lt;- which(upper &amp;gt;= 0.85, arr.ind = TRUE)&lt;br /&gt;
      &lt;br /&gt;
      if (nrow(high_corr) &amp;gt; 0) {&lt;br /&gt;
        cat(&amp;quot;\nHighly Correlated Pairs (|r| &amp;gt;= 0.85):\n&amp;quot;)&lt;br /&gt;
        for (i in seq_len(nrow(high_corr))) {&lt;br /&gt;
          row_name &amp;lt;- rownames(corr_mat)[high_corr[i, 1]]&lt;br /&gt;
          col_name &amp;lt;- colnames(corr_mat)[high_corr[i, 2]]&lt;br /&gt;
          cat(sprintf(&amp;quot; - %s &amp;amp; %s: %.3f\n&amp;quot;, row_name, col_name, upper[high_corr[i, 1], high_corr[i, 2]]))&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  # ==========================================&lt;br /&gt;
  # G) Feature Engineering (Lightweight)&lt;br /&gt;
  # ==========================================&lt;br /&gt;
  text_candidates &amp;lt;- intersect(c(&amp;quot;title&amp;quot;, &amp;quot;artist&amp;quot;, &amp;quot;movie&amp;quot;, &amp;quot;language&amp;quot;), cat_cols)&lt;br /&gt;
  &lt;br /&gt;
  for (col in text_candidates) {&lt;br /&gt;
    if (col %in% names(df_clean)) {&lt;br /&gt;
      df_clean[[paste0(col, &amp;quot;__len&amp;quot;)]] &amp;lt;- str_length(as.character(df_clean[[col]]))&lt;br /&gt;
      df_clean[[paste0(col, &amp;quot;__words&amp;quot;)]] &amp;lt;- &lt;br /&gt;
        str_count(as.character(df_clean[[col]]), &amp;quot;\\S+&amp;quot;)  # количество слов&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  # Раскрытие дат&lt;br /&gt;
  for (col in date_cols) {&lt;br /&gt;
    if (col %in% names(df_clean)) {&lt;br /&gt;
      df_clean[[col]] &amp;lt;- safe_to_datetime(df_clean[[col]])&lt;br /&gt;
      if (!all(is.na(df_clean[[col]]))) {&lt;br /&gt;
        df_clean[[paste0(col, &amp;quot;__year&amp;quot;)]] &amp;lt;- year(df_clean[[col]])&lt;br /&gt;
        df_clean[[paste0(col, &amp;quot;__month&amp;quot;)]] &amp;lt;- month(df_clean[[col]])&lt;br /&gt;
        df_clean[[paste0(col, &amp;quot;__dayofweek&amp;quot;)]] &amp;lt;- wday(df_clean[[col]], week_start = 1)&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  # ==========================================&lt;br /&gt;
  # H) Visualization&lt;br /&gt;
  # ==========================================&lt;br /&gt;
  # Missingness plot&lt;br /&gt;
  p_missing &amp;lt;- plot_missingness(df)&lt;br /&gt;
  if (!is.null(p_missing)) print(p_missing)&lt;br /&gt;
  &lt;br /&gt;
  # Обновляем типы после Feature Engineering&lt;br /&gt;
  col_types_upd &amp;lt;- detect_column_types(df_clean)&lt;br /&gt;
  num_cols_upd &amp;lt;- col_types_upd$num&lt;br /&gt;
  &lt;br /&gt;
  # Univariate numerical&lt;br /&gt;
  p_num &amp;lt;- plot_univariate_num(df_clean, num_cols_upd)&lt;br /&gt;
  if (!is.null(p_num)) print(p_num)&lt;br /&gt;
  &lt;br /&gt;
  # Univariate categorical&lt;br /&gt;
  p_cat_plots &amp;lt;- plot_univariate_cat(df_clean, cat_cols)&lt;br /&gt;
  if (!is.null(p_cat_plots)) lapply(p_cat_plots, print)&lt;br /&gt;
  &lt;br /&gt;
  # Correlation heatmap&lt;br /&gt;
  plot_correlation(df_clean, num_cols_upd)&lt;br /&gt;
  &lt;br /&gt;
  # Target-aware analysis&lt;br /&gt;
  if (!is.null(TARGET_COL) &amp;amp;&amp;amp; TARGET_COL %in% names(df_clean)) {&lt;br /&gt;
    cat(sprintf(&amp;quot;\nTarget Analysis: %s\n&amp;quot;, TARGET_COL))&lt;br /&gt;
    &lt;br /&gt;
    if (TARGET_COL %in% num_cols_upd) {&lt;br /&gt;
      # Числовая целевая: корреляции&lt;br /&gt;
      target_corr &amp;lt;- df_clean %&amp;gt;%&lt;br /&gt;
        select(all_of(num_cols_upd)) %&amp;gt;%&lt;br /&gt;
        cor(use = &amp;quot;complete.obs&amp;quot;)[, TARGET_COL] %&amp;gt;%&lt;br /&gt;
        sort(decreasing = TRUE)&lt;br /&gt;
      cat(&amp;quot;Correlations with Target:\n&amp;quot;)&lt;br /&gt;
      print(target_corr)&lt;br /&gt;
    } else {&lt;br /&gt;
      # Категориальная целевая: распределение&lt;br /&gt;
      df_clean %&amp;gt;%&lt;br /&gt;
        count(.data[[TARGET_COL]], sort = TRUE) %&amp;gt;%&lt;br /&gt;
        mutate(!!TARGET_COL := fct_reorder(.data[[TARGET_COL]], n)) %&amp;gt;%&lt;br /&gt;
        ggplot(aes(x = n, y = .data[[TARGET_COL]], fill = n)) +&lt;br /&gt;
        geom_col(show.legend = FALSE) +&lt;br /&gt;
        scale_fill_viridis_d(option = &amp;quot;magma&amp;quot;) +&lt;br /&gt;
        labs(title = sprintf(&amp;quot;Target Distribution: %s&amp;quot;, TARGET_COL), &lt;br /&gt;
             x = &amp;quot;Count&amp;quot;, y = NULL) +&lt;br /&gt;
        theme(axis.text.y = element_text(size = 10)) %&amp;gt;%&lt;br /&gt;
        print()&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  # ==========================================&lt;br /&gt;
  # I) Final Artifact Output&lt;br /&gt;
  # ==========================================&lt;br /&gt;
  cat(&amp;quot;\n--- FINAL SUMMARY ---\n&amp;quot;)&lt;br /&gt;
  cat(sprintf(&amp;quot;Original Shape: %d × %d\n&amp;quot;, nrow(df), ncol(df)))&lt;br /&gt;
  cat(sprintf(&amp;quot;Cleaned Shape:  %d × %d\n&amp;quot;, nrow(df_clean), ncol(df_clean)))&lt;br /&gt;
  cat(sprintf(&amp;quot;Duplicates removed: %d\n&amp;quot;, sum(duplicated(df))))&lt;br /&gt;
  cat(sprintf(&amp;quot;Columns processed: %s\n&amp;quot;, paste(names(df_clean), collapse = &amp;quot;, &amp;quot;)))&lt;br /&gt;
  cat(&amp;quot;\nProcessed Data Preview (df_clean %&amp;gt;% head()):\n&amp;quot;)&lt;br /&gt;
  print(df_clean %&amp;gt;% head())&lt;br /&gt;
  &lt;br /&gt;
} else {&lt;br /&gt;
  message(&amp;quot;DataFrame is empty. Pipeline terminated.&amp;quot;)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Сохранение результата (опционально)&lt;br /&gt;
# write_csv(df_clean, &amp;quot;data/processed/songs_cleaned.csv&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
[[Категория:Работы ИНДОР-211]]&lt;br /&gt;
[[Категория:BigDataWorks]]&lt;/div&gt;</summary>
		<author><name>Pocrovskii Alexander</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%9A%D0%BE%D0%BB%D0%BB%D0%B5%D0%BA%D1%86%D0%B8%D1%8F_%D0%BF%D0%B5%D1%81%D0%B5%D0%BD_%D0%B8%D0%B7_%D0%B8%D0%BD%D0%B4%D0%B8%D0%B9%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%BA%D0%B8%D0%BD%D0%B5%D0%BC%D0%B0%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B0_DataSet&amp;diff=46203</id>
		<title>Коллекция песен из индийского кинематографа DataSet</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%9A%D0%BE%D0%BB%D0%BB%D0%B5%D0%BA%D1%86%D0%B8%D1%8F_%D0%BF%D0%B5%D1%81%D0%B5%D0%BD_%D0%B8%D0%B7_%D0%B8%D0%BD%D0%B4%D0%B8%D0%B9%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%BA%D0%B8%D0%BD%D0%B5%D0%BC%D0%B0%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B0_DataSet&amp;diff=46203"/>
		<updated>2026-04-14T09:54:04Z</updated>

		<summary type="html">&lt;p&gt;Pocrovskii Alexander: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Model&lt;br /&gt;
|Description=Коллекция песен из индийского кинематографа&lt;br /&gt;
|Field_of_knowledge=Информатика, Образование, Искусственный интеллект, Большие данные, Музыка, Медиа&lt;br /&gt;
|Website=https://www.kaggle.com/datasets/moonknightmarvel/dataset-of-songs-with-genreartistmovielanguage/data&lt;br /&gt;
|Inventor=Pocrovskii Alexander&lt;br /&gt;
|Environment=R, Большие данные&lt;br /&gt;
|Student-created=Да&lt;br /&gt;
}}&lt;br /&gt;
== Общая информация ==&lt;br /&gt;
* &#039;&#039;&#039;Авторы:&#039;&#039;&#039; Студент группы [[Категория:ИНДОР-211]] -   [[Участник:Pokrovskii Alexander|Pokrovskii Alexander]]&lt;br /&gt;
* &#039;&#039;&#039;Дата исследования:&#039;&#039;&#039; 14 апреля 2026&lt;br /&gt;
* &#039;&#039;&#039;Источник:&#039;&#039;&#039; Kaggle Datasets&lt;br /&gt;
* &#039;&#039;&#039;Платформа:&#039;&#039;&#039; Kaggle&lt;br /&gt;
* &#039;&#039;&#039;Дата публикации:&#039;&#039;&#039; 23 апреля 2026 г.&lt;br /&gt;
&lt;br /&gt;
=== Исходные данные ===&lt;br /&gt;
* &#039;&#039;&#039;Файл:&#039;&#039;&#039; songs_db.csv (6 КB)&lt;br /&gt;
* &#039;&#039;&#039;Структура:&#039;&#039;&#039; 101 строк (избирательных участков), 5 столбцов&lt;br /&gt;
* &#039;&#039;&#039;Ссылка:&#039;&#039;&#039; https://www.kaggle.com/datasets/moonknightmarvel/dataset-of-songs-with-genreartistmovielanguage/data&lt;br /&gt;
*&lt;br /&gt;
&amp;lt;uml&amp;gt;&lt;br /&gt;
@startuml&lt;br /&gt;
&lt;br /&gt;
title Пайплайн представления музыкальных данных в Digida&lt;br /&gt;
skinparam handwritten false&lt;br /&gt;
&lt;br /&gt;
rectangle &amp;quot;Внешние данные (OWID CSV)&amp;quot; as external #LightBlue&lt;br /&gt;
rectangle &amp;quot;R: предварительная загрузка&amp;quot; as r_load #LightGreen  &lt;br /&gt;
rectangle &amp;quot;OpenRefine: очистка и обогащение&amp;quot; as refine #LightYellow&lt;br /&gt;
rectangle &amp;quot;R: визуализация + экспорт&amp;quot; as r_export #LightPink&lt;br /&gt;
rectangle &amp;quot;Digida: публикация&amp;quot; as platform #LightCoral&lt;br /&gt;
&lt;br /&gt;
external --&amp;gt; r_load : read_csv()&lt;br /&gt;
r_load --&amp;gt; refine : экспорт songs_db.csv&lt;br /&gt;
refine --&amp;gt; refine : Нормализация, расчёт метрик&lt;br /&gt;
refine --&amp;gt; r_export : экспорт songs_db_clean.csv&lt;br /&gt;
r_export --&amp;gt; r_export : ggplot2 + patchwork дашборд&lt;br /&gt;
r_export --&amp;gt; platform : загрузка страниц + дашборд&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@enduml&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/uml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Описание исследования ==&lt;br /&gt;
Исследование посвящено анализу структурированных музыкальных метаданных на примере датасета песен из индийских фильмов.&lt;br /&gt;
&lt;br /&gt;
=== Цель ===&lt;br /&gt;
Выявить статистически значимые связи между метаданными песен (язык, исполнитель, фильм) и их эмоциональной категорией, а также построить и валидировать модель машинного обучения для прогнозирования эмоции песни на основе доступных признаков с точностью не ниже 75% (F1-macro).&lt;br /&gt;
&lt;br /&gt;
=== Задачи ===&lt;br /&gt;
# Выполнить предобработку: кодирование категориальных признаков (Artist, Movie, Language), балансировку данных (при необходимости), разделение на обучающую/тестовую выборки.&lt;br /&gt;
# Выполнить предобработку: кодирование категориальных признаков (Artist, Movie, Language), балансировку данных (при необходимости), разделение на обучающую/тестовую выборки.&lt;br /&gt;
# Построить и сравнить несколько моделей классификации (логистическая регрессия, Random Forest, XGBoost) с кросс-валидацией, оценить метрики качества (accuracy, precision, recall, F1-score).&lt;br /&gt;
# Визуализировать результаты: матрицу ошибок, важность признаков, распределение предсказаний, а также сформировать интерпретируемые выводы о доминирующих факторах, влияющих на эмоциональную окраску песни.&lt;br /&gt;
&lt;br /&gt;
=== Гипотеза ===&lt;br /&gt;
Эмоциональная категория песни (Emotion) статистически значимо зависит от комбинации языка исполнения и исполнителя: песни на телугу в исполнении артистов «первого эшелона» (например, Sid Sriram, Armaan Malik) с большей вероятностью относятся к категориям Love или Joy, тогда как треки второстепенных исполнителей или из менее популярных фильмов чаще маркируются как Sadness или Anticipation. При этом модель, обученная на признаках Language + Artist + Movie, покажет качество прогнозирования эмоции выше базового уровня (majority class baseline) не менее чем на 20 п.п. по метрике F1-macro.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Программный код ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;R&amp;quot;&amp;gt;&lt;br /&gt;
# Анализ БД&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
import pandas as pd&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import seaborn as sns&lt;br /&gt;
import re&lt;br /&gt;
&lt;br /&gt;
# ==========================================&lt;br /&gt;
# A) Imports + Global Config&lt;br /&gt;
# ==========================================&lt;br /&gt;
np.random.seed(42)&lt;br /&gt;
pd.set_option(&#039;display.max_columns&#039;, 50)&lt;br /&gt;
pd.set_option(&#039;display.width&#039;, 1000)&lt;br /&gt;
pd.set_option(&#039;display.float_format&#039;, &#039;{:.2f}&#039;.format)&lt;br /&gt;
&lt;br /&gt;
plt.rcParams[&#039;figure.figsize&#039;] = (12, 6)&lt;br /&gt;
plt.rcParams[&#039;axes.titlesize&#039;] = 14&lt;br /&gt;
plt.rcParams[&#039;axes.labelsize&#039;] = 12&lt;br /&gt;
sns.set_theme(style=&amp;quot;whitegrid&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Provided Inputs&lt;br /&gt;
DATASET_NAME = &amp;quot;moonknightmarvel/dataset-of-songs-with-genreartistmovielanguage&amp;quot;&lt;br /&gt;
EXACT_COLUMNS = [&amp;quot;title&amp;quot;, &amp;quot;artist&amp;quot;, &amp;quot;movie&amp;quot;, &amp;quot;language&amp;quot;, &amp;quot;emotion&amp;quot;]&lt;br /&gt;
TARGET_COL = None&lt;br /&gt;
&lt;br /&gt;
# ==========================================&lt;br /&gt;
# B) Helper Functions (Robust &amp;amp; Defensive)&lt;br /&gt;
# ==========================================&lt;br /&gt;
&lt;br /&gt;
def safe_read_csv(path):&lt;br /&gt;
    try:&lt;br /&gt;
        # DATA_DIR is assumed to be defined in the environment per instructions&lt;br /&gt;
        return pd.read_csv(path)&lt;br /&gt;
    except Exception as e:&lt;br /&gt;
        print(f&amp;quot;CRITICAL ERROR: Could not read CSV at {path}. Error: {e}&amp;quot;)&lt;br /&gt;
        return pd.DataFrame()&lt;br /&gt;
&lt;br /&gt;
def validate_columns(df, expected_cols):&lt;br /&gt;
    if df.empty or not expected_cols:&lt;br /&gt;
        return&lt;br /&gt;
    actual_cols = df.columns.tolist()&lt;br /&gt;
    missing = [c for c in expected_cols if c not in actual_cols]&lt;br /&gt;
    extra = [c for c in actual_cols if c not in expected_cols]&lt;br /&gt;
    &lt;br /&gt;
    print(&amp;quot;-&amp;quot; * 30)&lt;br /&gt;
    print(f&amp;quot;COLUMN VALIDATION: {DATASET_NAME}&amp;quot;)&lt;br /&gt;
    if not missing and not extra:&lt;br /&gt;
        print(&amp;quot;Success: All expected columns found. No extra columns.&amp;quot;)&lt;br /&gt;
    else:&lt;br /&gt;
        if missing: print(f&amp;quot;Missing expected columns: {missing}&amp;quot;)&lt;br /&gt;
        if extra: print(f&amp;quot;Extra columns found: {extra}&amp;quot;)&lt;br /&gt;
    print(&amp;quot;-&amp;quot; * 30)&lt;br /&gt;
&lt;br /&gt;
def audit_missingness(df):&lt;br /&gt;
    null_counts = df.isnull().sum()&lt;br /&gt;
    null_pct = (null_counts / len(df)) * 100&lt;br /&gt;
    non_null = df.notnull().sum()&lt;br /&gt;
    audit = pd.DataFrame({&lt;br /&gt;
        &#039;Null Count&#039;: null_counts,&lt;br /&gt;
        &#039;Null %&#039;: null_pct,&lt;br /&gt;
        &#039;Non-Null Count&#039;: non_null&lt;br /&gt;
    })&lt;br /&gt;
    return audit&lt;br /&gt;
&lt;br /&gt;
def detect_column_types(df):&lt;br /&gt;
    num_cols = df.select_dtypes(include=[np.number]).columns.tolist()&lt;br /&gt;
    cat_cols = df.select_dtypes(include=[&#039;object&#039;, &#039;category&#039;]).columns.tolist()&lt;br /&gt;
    date_cols = []&lt;br /&gt;
    &lt;br /&gt;
    # Simple heuristic for potential date columns&lt;br /&gt;
    for col in cat_cols:&lt;br /&gt;
        sample = df[col].dropna().head(5).astype(str)&lt;br /&gt;
        if any(sample.str.contains(r&#039;\d{4}-\d{2}-\d{2}|\d{2}/\d{2}/\d{4}&#039;, regex=True)):&lt;br /&gt;
            date_cols.append(col)&lt;br /&gt;
            &lt;br /&gt;
    # Refine cat_cols (remove dates)&lt;br /&gt;
    cat_cols = [c for c in cat_cols if c not in date_cols]&lt;br /&gt;
    return num_cols, cat_cols, date_cols&lt;br /&gt;
&lt;br /&gt;
def safe_to_numeric(series):&lt;br /&gt;
    try:&lt;br /&gt;
        return pd.to_numeric(series, errors=&#039;coerce&#039;)&lt;br /&gt;
    except:&lt;br /&gt;
        return series&lt;br /&gt;
&lt;br /&gt;
def safe_to_datetime(series):&lt;br /&gt;
    try:&lt;br /&gt;
        return pd.to_datetime(series, errors=&#039;coerce&#039;)&lt;br /&gt;
    except:&lt;br /&gt;
        return series&lt;br /&gt;
&lt;br /&gt;
def plot_missingness(df):&lt;br /&gt;
    null_pct = (df.isnull().sum() / len(df)) * 100&lt;br /&gt;
    null_pct = null_pct[null_pct &amp;gt; 0].sort_values(ascending=False).head(30)&lt;br /&gt;
    if not null_pct.empty:&lt;br /&gt;
        sns.barplot(x=null_pct.values, y=null_pct.index, hue=null_pct.index, palette=&#039;Reds_r&#039;, legend=False)&lt;br /&gt;
        plt.title(&amp;quot;Top Columns by Missing Percentage (%)&amp;quot;)&lt;br /&gt;
        plt.xlabel(&amp;quot;% Missing&amp;quot;)&lt;br /&gt;
        plt.show()&lt;br /&gt;
&lt;br /&gt;
def plot_univariate_num(df, num_cols):&lt;br /&gt;
    cols_to_plot = num_cols[:12]&lt;br /&gt;
    if not cols_to_plot: return&lt;br /&gt;
    n = len(cols_to_plot)&lt;br /&gt;
    rows = (n + 2) // 3&lt;br /&gt;
    fig, axes = plt.subplots(rows, 3, figsize=(18, 5 * rows))&lt;br /&gt;
    axes = axes.flatten()&lt;br /&gt;
    for i, col in enumerate(cols_to_plot):&lt;br /&gt;
        sns.histplot(df[col].dropna(), kde=True, ax=axes[i], color=&#039;teal&#039;)&lt;br /&gt;
        axes[i].set_title(f&amp;quot;Distribution of {col}&amp;quot;)&lt;br /&gt;
    for j in range(i + 1, len(axes)):&lt;br /&gt;
        fig.delaxes(axes[j])&lt;br /&gt;
    plt.tight_layout()&lt;br /&gt;
    plt.show()&lt;br /&gt;
&lt;br /&gt;
def plot_univariate_cat(df, cat_cols):&lt;br /&gt;
    cols_to_plot = cat_cols[:6]&lt;br /&gt;
    if not cols_to_plot: return&lt;br /&gt;
    for col in cols_to_plot:&lt;br /&gt;
        if df[col].nunique() &amp;gt; 50:&lt;br /&gt;
            top_vals = df[col].value_counts().head(15)&lt;br /&gt;
        else:&lt;br /&gt;
            top_vals = df[col].value_counts().head(15)&lt;br /&gt;
        &lt;br /&gt;
        plt.figure(figsize=(10, 5))&lt;br /&gt;
        sns.barplot(x=top_vals.values, y=top_vals.index, hue=top_vals.index, palette=&#039;viridis&#039;, legend=False)&lt;br /&gt;
        plt.title(f&amp;quot;Top 15 Categories: {col}&amp;quot;)&lt;br /&gt;
        plt.show()&lt;br /&gt;
&lt;br /&gt;
def plot_correlation(df, num_cols):&lt;br /&gt;
    if len(num_cols) &amp;lt; 2: return&lt;br /&gt;
    corr = df[num_cols].corr()&lt;br /&gt;
    plt.figure(figsize=(10, 8))&lt;br /&gt;
    sns.heatmap(corr, annot=True, cmap=&#039;coolwarm&#039;, fmt=&amp;quot;.2f&amp;quot;, linewidths=0.5)&lt;br /&gt;
    plt.title(&amp;quot;Pearson Correlation Matrix&amp;quot;)&lt;br /&gt;
    plt.show()&lt;br /&gt;
&lt;br /&gt;
# ==========================================&lt;br /&gt;
# C) Load + Validate&lt;br /&gt;
# ==========================================&lt;br /&gt;
df = safe_read_csv(DATA_DIR)&lt;br /&gt;
validate_columns(df, EXACT_COLUMNS)&lt;br /&gt;
&lt;br /&gt;
if not df.empty:&lt;br /&gt;
    # ==========================================&lt;br /&gt;
    # D) Data Audit&lt;br /&gt;
    # ==========================================&lt;br /&gt;
    print(f&amp;quot;\n--- DATA AUDIT: {DATASET_NAME} ---&amp;quot;)&lt;br /&gt;
    print(f&amp;quot;Shape: {df.shape}&amp;quot;)&lt;br /&gt;
    print(f&amp;quot;Memory Usage: {df.memory_usage(deep=True).sum() / 1024**2:.2f} MB&amp;quot;)&lt;br /&gt;
    print(f&amp;quot;Duplicates: {df.duplicated().sum()}&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    null_audit = audit_missingness(df)&lt;br /&gt;
    print(&amp;quot;\nNull Audit Summary (Top 5 Missing):&amp;quot;)&lt;br /&gt;
    print(null_audit.sort_values(by=&#039;Null %&#039;, ascending=False).head(5))&lt;br /&gt;
    &lt;br /&gt;
    num_cols, cat_cols, date_cols = detect_column_types(df)&lt;br /&gt;
    &lt;br /&gt;
    print(f&amp;quot;\nDetected Numeric Columns: {num_cols}&amp;quot;)&lt;br /&gt;
    print(f&amp;quot;Detected Categorical Columns: {cat_cols}&amp;quot;)&lt;br /&gt;
    print(f&amp;quot;Detected Date Columns: {date_cols}&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    # Numeric Stability&lt;br /&gt;
    if num_cols:&lt;br /&gt;
        inf_counts = np.isinf(df[num_cols]).sum().sum()&lt;br /&gt;
        print(f&amp;quot;Total Inf/-Inf values: {inf_counts}&amp;quot;)&lt;br /&gt;
        low_var = [c for c in num_cols if df[c].std() &amp;lt; 0.01]&lt;br /&gt;
        if low_var: print(f&amp;quot;Low variance columns: {low_var}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    # ==========================================&lt;br /&gt;
    # E) ETL (Safe + Reversible)&lt;br /&gt;
    # ==========================================&lt;br /&gt;
    df_clean = df.copy()&lt;br /&gt;
    &lt;br /&gt;
    # Strip whitespace &amp;amp; Unify Missing Tokens&lt;br /&gt;
    missing_tokens = [&amp;quot;&amp;quot;, &amp;quot;NA&amp;quot;, &amp;quot;N/A&amp;quot;, &amp;quot;null&amp;quot;, &amp;quot;None&amp;quot;, &amp;quot;nan&amp;quot;]&lt;br /&gt;
    for col in df_clean.columns:&lt;br /&gt;
        if df_clean[col].dtype == &#039;object&#039;:&lt;br /&gt;
            df_clean[col] = df_clean[col].astype(str).str.strip()&lt;br /&gt;
            df_clean[col] = df_clean[col].replace(missing_tokens, np.nan)&lt;br /&gt;
    &lt;br /&gt;
    # Attempt to convert object columns to numeric if they are high-signal&lt;br /&gt;
    for col in cat_cols:&lt;br /&gt;
        sample = df_clean[col].dropna().head(10)&lt;br /&gt;
        if sample.str.match(r&#039;^-?\d+(\.\d+)?$&#039;).all():&lt;br /&gt;
            df_clean[col] = safe_to_numeric(df_clean[col])&lt;br /&gt;
    &lt;br /&gt;
    # Handle Duplicates&lt;br /&gt;
    df_clean = df_clean.drop_duplicates(keep=&#039;first&#039;)&lt;br /&gt;
    &lt;br /&gt;
    # Recalculate types after cleaning&lt;br /&gt;
    num_cols, cat_cols, date_cols = detect_column_types(df_clean)&lt;br /&gt;
    &lt;br /&gt;
    # Missing Value Handling (Imputation + Indicators)&lt;br /&gt;
    for col in num_cols:&lt;br /&gt;
        if df_clean[col].isnull().any():&lt;br /&gt;
            df_clean[f&amp;quot;{col}__was_missing&amp;quot;] = df_clean[col].isnull().astype(int)&lt;br /&gt;
            df_clean[col] = df_clean[col].fillna(df_clean[col].median())&lt;br /&gt;
            &lt;br /&gt;
    for col in cat_cols:&lt;br /&gt;
        if df_clean[col].isnull().any():&lt;br /&gt;
            df_clean[f&amp;quot;{col}__was_missing&amp;quot;] = df_clean[col].isnull().astype(int)&lt;br /&gt;
            df_clean[col] = df_clean[col].fillna(&amp;quot;Missing&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    # ==========================================&lt;br /&gt;
    # F) EDA (Univariate &amp;amp; Bivariate)&lt;br /&gt;
    # ==========================================&lt;br /&gt;
    if num_cols:&lt;br /&gt;
        print(&amp;quot;\nNumeric Distribution Summary:&amp;quot;)&lt;br /&gt;
        stats = df_clean[num_cols].agg([&#039;mean&#039;, &#039;std&#039;, &#039;min&#039;, &#039;median&#039;, &#039;max&#039;, &#039;skew&#039;])&lt;br /&gt;
        print(stats.T)&lt;br /&gt;
        &lt;br /&gt;
        if len(num_cols) &amp;gt;= 2:&lt;br /&gt;
            high_corr = []&lt;br /&gt;
            corr_mat = df_clean[num_cols].corr().abs()&lt;br /&gt;
            upper = corr_mat.where(np.triu(np.ones(corr_mat.shape), k=1).astype(bool))&lt;br /&gt;
            for col in upper.columns:&lt;br /&gt;
                for row in upper.index:&lt;br /&gt;
                    if upper.loc[row, col] &amp;gt;= 0.85:&lt;br /&gt;
                        high_corr.append((row, col, upper.loc[row, col]))&lt;br /&gt;
            if high_corr:&lt;br /&gt;
                print(&amp;quot;\nHighly Correlated Pairs (|r| &amp;gt;= 0.85):&amp;quot;)&lt;br /&gt;
                for r, c, v in high_corr: print(f&amp;quot; - {r} &amp;amp; {c}: {v:.3f}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    # ==========================================&lt;br /&gt;
    # G) Feature Engineering (Lightweight)&lt;br /&gt;
    # ==========================================&lt;br /&gt;
    # String Lengths for Title/Artist etc.&lt;br /&gt;
    text_candidates = [c for c in cat_cols if c in [&#039;title&#039;, &#039;artist&#039;, &#039;movie&#039;, &#039;language&#039;]]&lt;br /&gt;
    for col in text_candidates:&lt;br /&gt;
        if col in df_clean.columns:&lt;br /&gt;
            df_clean[f&amp;quot;{col}__len&amp;quot;] = df_clean[col].astype(str).apply(len)&lt;br /&gt;
            df_clean[f&amp;quot;{col}__words&amp;quot;] = df_clean[col].astype(str).apply(lambda x: len(x.split()))&lt;br /&gt;
            &lt;br /&gt;
    # Datetime expansion&lt;br /&gt;
    for col in date_cols:&lt;br /&gt;
        df_clean[col] = safe_to_datetime(df_clean[col])&lt;br /&gt;
        if not df_clean[col].isnull().all():&lt;br /&gt;
            df_clean[f&amp;quot;{col}__year&amp;quot;] = df_clean[col].dt.year&lt;br /&gt;
            df_clean[f&amp;quot;{col}__month&amp;quot;] = df_clean[col].dt.month&lt;br /&gt;
            df_clean[f&amp;quot;{col}__dayofweek&amp;quot;] = df_clean[col].dt.dayofweek&lt;br /&gt;
&lt;br /&gt;
    # ==========================================&lt;br /&gt;
    # H) Visualization&lt;br /&gt;
    # ==========================================&lt;br /&gt;
    plot_missingness(df)&lt;br /&gt;
    &lt;br /&gt;
    num_cols_updated, cat_cols_updated, _ = detect_column_types(df_clean)&lt;br /&gt;
    &lt;br /&gt;
    # Univariate Numerical&lt;br /&gt;
    plot_univariate_num(df_clean, num_cols_updated)&lt;br /&gt;
    &lt;br /&gt;
    # Univariate Categorical&lt;br /&gt;
    plot_univariate_cat(df_clean, cat_cols)&lt;br /&gt;
    &lt;br /&gt;
    # Bivariate&lt;br /&gt;
    plot_correlation(df_clean, num_cols_updated)&lt;br /&gt;
    &lt;br /&gt;
    # Target-Aware Analysis (if TARGET_COL provided)&lt;br /&gt;
    if TARGET_COL and TARGET_COL in df_clean.columns:&lt;br /&gt;
        print(f&amp;quot;\nTarget Analysis: {TARGET_COL}&amp;quot;)&lt;br /&gt;
        if TARGET_COL in num_cols_updated:&lt;br /&gt;
            # Numeric Target&lt;br /&gt;
            target_corr = df_clean[num_cols_updated].corr()[TARGET_COL].sort_values(ascending=False)&lt;br /&gt;
            print(&amp;quot;Correlations with Target:&amp;quot;)&lt;br /&gt;
            print(target_corr)&lt;br /&gt;
        else:&lt;br /&gt;
            # Categorical Target&lt;br /&gt;
            plt.figure(figsize=(10, 5))&lt;br /&gt;
            sns.countplot(data=df_clean, x=TARGET_COL, hue=TARGET_COL, palette=&#039;magma&#039;, legend=False)&lt;br /&gt;
            plt.title(f&amp;quot;Target Distribution: {TARGET_COL}&amp;quot;)&lt;br /&gt;
            plt.xticks(rotation=45)&lt;br /&gt;
            plt.show()&lt;br /&gt;
&lt;br /&gt;
    # ==========================================&lt;br /&gt;
    # I) Final Artifact Output&lt;br /&gt;
    # ==========================================&lt;br /&gt;
    print(&amp;quot;\n--- FINAL SUMMARY ---&amp;quot;)&lt;br /&gt;
    print(f&amp;quot;Original Shape: {df.shape}&amp;quot;)&lt;br /&gt;
    print(f&amp;quot;Cleaned Shape:  {df_clean.shape}&amp;quot;)&lt;br /&gt;
    print(f&amp;quot;Duplicates removed: {df.duplicated().sum()}&amp;quot;)&lt;br /&gt;
    print(f&amp;quot;Columns processed: {list(df_clean.columns)}&amp;quot;)&lt;br /&gt;
    print(&amp;quot;\nProcessed Data Preview (df_clean.head()):&amp;quot;)&lt;br /&gt;
    print(df_clean.head())&lt;br /&gt;
else:&lt;br /&gt;
    print(&amp;quot;DataFrame is empty. Pipeline terminated.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
[[Категория:Работы ИНДОР-211]]&lt;br /&gt;
[[Категория:BigDataWorks]]&lt;/div&gt;</summary>
		<author><name>Pocrovskii Alexander</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%9A%D0%BE%D0%BB%D0%BB%D0%B5%D0%BA%D1%86%D0%B8%D1%8F_%D0%BF%D0%B5%D1%81%D0%B5%D0%BD_%D0%B8%D0%B7_%D0%B8%D0%BD%D0%B4%D0%B8%D0%B9%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%BA%D0%B8%D0%BD%D0%B5%D0%BC%D0%B0%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B0_DataSet&amp;diff=46202</id>
		<title>Коллекция песен из индийского кинематографа DataSet</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%9A%D0%BE%D0%BB%D0%BB%D0%B5%D0%BA%D1%86%D0%B8%D1%8F_%D0%BF%D0%B5%D1%81%D0%B5%D0%BD_%D0%B8%D0%B7_%D0%B8%D0%BD%D0%B4%D0%B8%D0%B9%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%BA%D0%B8%D0%BD%D0%B5%D0%BC%D0%B0%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B0_DataSet&amp;diff=46202"/>
		<updated>2026-04-14T09:52:28Z</updated>

		<summary type="html">&lt;p&gt;Pocrovskii Alexander: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Model&lt;br /&gt;
|Description=Коллекция песен из индийского кинематографа&lt;br /&gt;
|Field_of_knowledge=Информатика, Образование, Искусственный интеллект, Большие данные, Музыка, Медиа&lt;br /&gt;
|Website=https://www.kaggle.com/datasets/moonknightmarvel/dataset-of-songs-with-genreartistmovielanguage/data&lt;br /&gt;
|Inventor=Pocrovskii Alexander&lt;br /&gt;
|Environment=R, Большие данные&lt;br /&gt;
|Student-created=Да&lt;br /&gt;
}}&lt;br /&gt;
== Общая информация ==&lt;br /&gt;
* &#039;&#039;&#039;Авторы:&#039;&#039;&#039; Студент группы [[Категория:ИНДОР-211]] -   [[Участник:Pokrovskii Alexander|Pokrovskii Alexander]]&lt;br /&gt;
* &#039;&#039;&#039;Дата исследования:&#039;&#039;&#039; 14 апреля 2026&lt;br /&gt;
* &#039;&#039;&#039;Источник:&#039;&#039;&#039; Kaggle Datasets&lt;br /&gt;
* &#039;&#039;&#039;Платформа:&#039;&#039;&#039; Kaggle&lt;br /&gt;
* &#039;&#039;&#039;Дата публикации:&#039;&#039;&#039; 23 апреля 2026 г.&lt;br /&gt;
&lt;br /&gt;
=== Исходные данные ===&lt;br /&gt;
* &#039;&#039;&#039;Файл:&#039;&#039;&#039; songs_db.csv (6 КB)&lt;br /&gt;
* &#039;&#039;&#039;Структура:&#039;&#039;&#039; 101 строк (избирательных участков), 5 столбцов&lt;br /&gt;
* &#039;&#039;&#039;Ссылка:&#039;&#039;&#039; https://www.kaggle.com/datasets/moonknightmarvel/dataset-of-songs-with-genreartistmovielanguage/data&lt;br /&gt;
*&lt;br /&gt;
&amp;lt;uml&amp;gt;&lt;br /&gt;
@startuml&lt;br /&gt;
&lt;br /&gt;
title Пайплайн представления музыкальных данных в Digida&lt;br /&gt;
skinparam handwritten false&lt;br /&gt;
&lt;br /&gt;
rectangle &amp;quot;Внешние данные (OWID CSV)&amp;quot; as external #LightBlue&lt;br /&gt;
rectangle &amp;quot;R: предварительная загрузка&amp;quot; as r_load #LightGreen  &lt;br /&gt;
rectangle &amp;quot;OpenRefine: очистка и обогащение&amp;quot; as refine #LightYellow&lt;br /&gt;
rectangle &amp;quot;R: визуализация + экспорт&amp;quot; as r_export #LightPink&lt;br /&gt;
rectangle &amp;quot;Digida: публикация&amp;quot; as platform #LightCoral&lt;br /&gt;
&lt;br /&gt;
external --&amp;gt; r_load : read_csv()&lt;br /&gt;
r_load --&amp;gt; refine : экспорт songs_db.csv&lt;br /&gt;
refine --&amp;gt; refine : Нормализация, расчёт метрик&lt;br /&gt;
refine --&amp;gt; r_export : экспорт songs_db_clean.csv&lt;br /&gt;
r_export --&amp;gt; r_export : ggplot2 + patchwork дашборд&lt;br /&gt;
r_export --&amp;gt; platform : загрузка страниц + дашборд&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@enduml&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/uml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Описание исследования ==&lt;br /&gt;
Исследование посвящено анализу структурированных музыкальных метаданных на примере датасета песен из индийских фильмов.&lt;br /&gt;
&lt;br /&gt;
=== Цель ===&lt;br /&gt;
Выявить статистически значимые связи между метаданными песен (язык, исполнитель, фильм) и их эмоциональной категорией, а также построить и валидировать модель машинного обучения для прогнозирования эмоции песни на основе доступных признаков с точностью не ниже 75% (F1-macro).&lt;br /&gt;
&lt;br /&gt;
=== Задачи ===&lt;br /&gt;
# Выполнить предобработку: кодирование категориальных признаков (Artist, Movie, Language), балансировку данных (при необходимости), разделение на обучающую/тестовую выборки.&lt;br /&gt;
# Выполнить предобработку: кодирование категориальных признаков (Artist, Movie, Language), балансировку данных (при необходимости), разделение на обучающую/тестовую выборки.&lt;br /&gt;
# Построить и сравнить несколько моделей классификации (логистическая регрессия, Random Forest, XGBoost) с кросс-валидацией, оценить метрики качества (accuracy, precision, recall, F1-score).&lt;br /&gt;
# Визуализировать результаты: матрицу ошибок, важность признаков, распределение предсказаний, а также сформировать интерпретируемые выводы о доминирующих факторах, влияющих на эмоциональную окраску песни.&lt;br /&gt;
&lt;br /&gt;
=== Гипотеза ===&lt;br /&gt;
Эмоциональная категория песни (Emotion) статистически значимо зависит от комбинации языка исполнения и исполнителя: песни на телугу в исполнении артистов «первого эшелона» (например, Sid Sriram, Armaan Malik) с большей вероятностью относятся к категориям Love или Joy, тогда как треки второстепенных исполнителей или из менее популярных фильмов чаще маркируются как Sadness или Anticipation. При этом модель, обученная на признаках Language + Artist + Movie, покажет качество прогнозирования эмоции выше базового уровня (majority class baseline) не менее чем на 20 п.п. по метрике F1-macro.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Программный код ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;R&amp;quot;&amp;gt;&lt;br /&gt;
# Анализ БД&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Работы ИНДОР-211]]&lt;br /&gt;
[[Категория:BigDataWorks]]&lt;/div&gt;</summary>
		<author><name>Pocrovskii Alexander</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%9A%D0%BE%D0%BB%D0%BB%D0%B5%D0%BA%D1%86%D0%B8%D1%8F_%D0%BF%D0%B5%D1%81%D0%B5%D0%BD_%D0%B8%D0%B7_%D0%B8%D0%BD%D0%B4%D0%B8%D0%B9%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%BA%D0%B8%D0%BD%D0%B5%D0%BC%D0%B0%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B0_DataSet&amp;diff=46201</id>
		<title>Коллекция песен из индийского кинематографа DataSet</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%9A%D0%BE%D0%BB%D0%BB%D0%B5%D0%BA%D1%86%D0%B8%D1%8F_%D0%BF%D0%B5%D1%81%D0%B5%D0%BD_%D0%B8%D0%B7_%D0%B8%D0%BD%D0%B4%D0%B8%D0%B9%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%BA%D0%B8%D0%BD%D0%B5%D0%BC%D0%B0%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B0_DataSet&amp;diff=46201"/>
		<updated>2026-04-14T09:49:28Z</updated>

		<summary type="html">&lt;p&gt;Pocrovskii Alexander: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Model&lt;br /&gt;
|Description=Коллекция песен из индийского кинематографа&lt;br /&gt;
|Field_of_knowledge=Информатика, Образование, Искусственный интеллект, Большие данные, Музыка, Медиа&lt;br /&gt;
|Website=https://www.kaggle.com/datasets/moonknightmarvel/dataset-of-songs-with-genreartistmovielanguage/data&lt;br /&gt;
|Inventor=Pocrovskii Alexander&lt;br /&gt;
|Environment=R, Большие данные&lt;br /&gt;
|Student-created=Да&lt;br /&gt;
}}&lt;br /&gt;
== Общая информация ==&lt;br /&gt;
* &#039;&#039;&#039;Авторы:&#039;&#039;&#039; Студент группы [[Категория:ИНДОР-211]] -   [[Участник:Pokrovskii Alexander|Pokrovskii Alexander]]&lt;br /&gt;
* &#039;&#039;&#039;Дата исследования:&#039;&#039;&#039; 14 апреля 2026&lt;br /&gt;
* &#039;&#039;&#039;Источник:&#039;&#039;&#039; Kaggle Datasets&lt;br /&gt;
* &#039;&#039;&#039;Платформа:&#039;&#039;&#039; Kaggle&lt;br /&gt;
* &#039;&#039;&#039;Дата публикации:&#039;&#039;&#039; 23 апреля 2026 г.&lt;br /&gt;
&lt;br /&gt;
=== Исходные данные ===&lt;br /&gt;
* &#039;&#039;&#039;Файл:&#039;&#039;&#039; songs_db.csv (6 КB)&lt;br /&gt;
* &#039;&#039;&#039;Структура:&#039;&#039;&#039; 101 строк (избирательных участков), 5 столбцов&lt;br /&gt;
* &#039;&#039;&#039;Ссылка:&#039;&#039;&#039; https://www.kaggle.com/datasets/moonknightmarvel/dataset-of-songs-with-genreartistmovielanguage/data&lt;br /&gt;
*&lt;br /&gt;
&amp;lt;uml&amp;gt;&lt;br /&gt;
@startuml&lt;br /&gt;
&lt;br /&gt;
title Пайплайн представления музыкальных данных в Digida&lt;br /&gt;
skinparam handwritten false&lt;br /&gt;
&lt;br /&gt;
rectangle &amp;quot;Внешние данные (OWID CSV)&amp;quot; as external #LightBlue&lt;br /&gt;
rectangle &amp;quot;R: предварительная загрузка&amp;quot; as r_load #LightGreen  &lt;br /&gt;
rectangle &amp;quot;OpenRefine: очистка и обогащение&amp;quot; as refine #LightYellow&lt;br /&gt;
rectangle &amp;quot;R: визуализация + экспорт&amp;quot; as r_export #LightPink&lt;br /&gt;
rectangle &amp;quot;Digida: публикация&amp;quot; as platform #LightCoral&lt;br /&gt;
&lt;br /&gt;
external --&amp;gt; r_load : read_csv()&lt;br /&gt;
r_load --&amp;gt; refine : экспорт songs_db.csv&lt;br /&gt;
refine --&amp;gt; refine : Нормализация, расчёт метрик&lt;br /&gt;
refine --&amp;gt; r_export : экспорт songs_db_clean.csv&lt;br /&gt;
r_export --&amp;gt; r_export : ggplot2 + patchwork дашборд&lt;br /&gt;
r_export --&amp;gt; platform : загрузка страниц + дашборд&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@enduml&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/uml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Описание исследования ==&lt;br /&gt;
Исследование посвящено анализу структурированных музыкальных метаданных на примере датасета песен из индийских фильмов.&lt;br /&gt;
&lt;br /&gt;
=== Цель ===&lt;br /&gt;
Выявить статистически значимые связи между метаданными песен (язык, исполнитель, фильм) и их эмоциональной категорией, а также построить и валидировать модель машинного обучения для прогнозирования эмоции песни на основе доступных признаков с точностью не ниже 75% (F1-macro).&lt;br /&gt;
&lt;br /&gt;
=== Задачи ===&lt;br /&gt;
# Выполнить предобработку: кодирование категориальных признаков (Artist, Movie, Language), балансировку данных (при необходимости), разделение на обучающую/тестовую выборки.&lt;br /&gt;
# Выполнить предобработку: кодирование категориальных признаков (Artist, Movie, Language), балансировку данных (при необходимости), разделение на обучающую/тестовую выборки.&lt;br /&gt;
# Построить и сравнить несколько моделей классификации (логистическая регрессия, Random Forest, XGBoost) с кросс-валидацией, оценить метрики качества (accuracy, precision, recall, F1-score).&lt;br /&gt;
# Визуализировать результаты: матрицу ошибок, важность признаков, распределение предсказаний, а также сформировать интерпретируемые выводы о доминирующих факторах, влияющих на эмоциональную окраску песни.&lt;br /&gt;
&lt;br /&gt;
=== Гипотеза ===&lt;br /&gt;
Эмоциональная категория песни (Emotion) статистически значимо зависит от комбинации языка исполнения и исполнителя: песни на телугу в исполнении артистов «первого эшелона» (например, Sid Sriram, Armaan Malik) с большей вероятностью относятся к категориям Love или Joy, тогда как треки второстепенных исполнителей или из менее популярных фильмов чаще маркируются как Sadness или Anticipation. При этом модель, обученная на признаках Language + Artist + Movie, покажет качество прогнозирования эмоции выше базового уровня (majority class baseline) не менее чем на 20 п.п. по метрике F1-macro.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Работы ИНДОР-211]]&lt;br /&gt;
[[Категория:BigDataWorks]]&lt;/div&gt;</summary>
		<author><name>Pocrovskii Alexander</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%9A%D0%BE%D0%BB%D0%BB%D0%B5%D0%BA%D1%86%D0%B8%D1%8F_%D0%BF%D0%B5%D1%81%D0%B5%D0%BD_%D0%B8%D0%B7_%D0%B8%D0%BD%D0%B4%D0%B8%D0%B9%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%BA%D0%B8%D0%BD%D0%B5%D0%BC%D0%B0%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B0_DataSet&amp;diff=46200</id>
		<title>Коллекция песен из индийского кинематографа DataSet</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%9A%D0%BE%D0%BB%D0%BB%D0%B5%D0%BA%D1%86%D0%B8%D1%8F_%D0%BF%D0%B5%D1%81%D0%B5%D0%BD_%D0%B8%D0%B7_%D0%B8%D0%BD%D0%B4%D0%B8%D0%B9%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%BA%D0%B8%D0%BD%D0%B5%D0%BC%D0%B0%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B0_DataSet&amp;diff=46200"/>
		<updated>2026-04-14T09:48:29Z</updated>

		<summary type="html">&lt;p&gt;Pocrovskii Alexander: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Model&lt;br /&gt;
|Description=Коллекция песен из индийского кинематографа&lt;br /&gt;
|Field_of_knowledge=Информатика, Образование, Искусственный интеллект, Большие данные, Музыка, Медиа&lt;br /&gt;
|Website=https://www.kaggle.com/datasets/moonknightmarvel/dataset-of-songs-with-genreartistmovielanguage/data&lt;br /&gt;
|Inventor=Pocrovskii Alexander&lt;br /&gt;
|Environment=R, Большие данные&lt;br /&gt;
|Student-created=Да&lt;br /&gt;
}}&lt;br /&gt;
== Общая информация ==&lt;br /&gt;
* &#039;&#039;&#039;Авторы:&#039;&#039;&#039; Студент группы [[Категория:ИНДОР-211]] -   [[Участник:Pokrovskii Alexander|Pokrovskii Alexander]]&lt;br /&gt;
* &#039;&#039;&#039;Дата исследования:&#039;&#039;&#039; 14 апреля 2026&lt;br /&gt;
* &#039;&#039;&#039;Источник:&#039;&#039;&#039; Kaggle Datasets&lt;br /&gt;
* &#039;&#039;&#039;Платформа:&#039;&#039;&#039; Kaggle&lt;br /&gt;
* &#039;&#039;&#039;Дата публикации:&#039;&#039;&#039; 23 апреля 2026 г.&lt;br /&gt;
&lt;br /&gt;
=== Исходные данные ===&lt;br /&gt;
* &#039;&#039;&#039;Файл:&#039;&#039;&#039; songs_db.csv (6 КB)&lt;br /&gt;
* &#039;&#039;&#039;Структура:&#039;&#039;&#039; 101 строк (избирательных участков), 5 столбцов&lt;br /&gt;
* &#039;&#039;&#039;Ссылка:&#039;&#039;&#039; https://www.kaggle.com/datasets/moonknightmarvel/dataset-of-songs-with-genreartistmovielanguage/data&lt;br /&gt;
&lt;br /&gt;
&amp;lt;uml&amp;gt;&lt;br /&gt;
@startuml&lt;br /&gt;
&lt;br /&gt;
title Пайплайн представления музыкальных данных в Digida&lt;br /&gt;
skinparam handwritten false&lt;br /&gt;
&lt;br /&gt;
rectangle &amp;quot;Внешние данные (OWID CSV)&amp;quot; as external #LightBlue&lt;br /&gt;
rectangle &amp;quot;R: предварительная загрузка&amp;quot; as r_load #LightGreen  &lt;br /&gt;
rectangle &amp;quot;OpenRefine: очистка и обогащение&amp;quot; as refine #LightYellow&lt;br /&gt;
rectangle &amp;quot;R: визуализация + экспорт&amp;quot; as r_export #LightPink&lt;br /&gt;
rectangle &amp;quot;Digida: публикация&amp;quot; as platform #LightCoral&lt;br /&gt;
&lt;br /&gt;
external --&amp;gt; r_load : read_csv()&lt;br /&gt;
r_load --&amp;gt; refine : экспорт songs_db.csv&lt;br /&gt;
refine --&amp;gt; refine : Нормализация, расчёт метрик&lt;br /&gt;
refine --&amp;gt; r_export : экспорт songs_db_clean.csv&lt;br /&gt;
r_export --&amp;gt; r_export : ggplot2 + patchwork дашборд&lt;br /&gt;
r_export --&amp;gt; platform : загрузка страниц + дашборд&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@enduml&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/uml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Описание исследования ==&lt;br /&gt;
Исследование посвящено анализу структурированных музыкальных метаданных на примере датасета песен из индийских фильмов.&lt;br /&gt;
&lt;br /&gt;
=== Цель ===&lt;br /&gt;
Выявить статистически значимые связи между метаданными песен (язык, исполнитель, фильм) и их эмоциональной категорией, а также построить и валидировать модель машинного обучения для прогнозирования эмоции песни на основе доступных признаков с точностью не ниже 75% (F1-macro).&lt;br /&gt;
&lt;br /&gt;
=== Задачи ===&lt;br /&gt;
# Выполнить предобработку: кодирование категориальных признаков (Artist, Movie, Language), балансировку данных (при необходимости), разделение на обучающую/тестовую выборки.&lt;br /&gt;
# Выполнить предобработку: кодирование категориальных признаков (Artist, Movie, Language), балансировку данных (при необходимости), разделение на обучающую/тестовую выборки.&lt;br /&gt;
# Построить и сравнить несколько моделей классификации (логистическая регрессия, Random Forest, XGBoost) с кросс-валидацией, оценить метрики качества (accuracy, precision, recall, F1-score).&lt;br /&gt;
# Визуализировать результаты: матрицу ошибок, важность признаков, распределение предсказаний, а также сформировать интерпретируемые выводы о доминирующих факторах, влияющих на эмоциональную окраску песни.&lt;br /&gt;
&lt;br /&gt;
=== Гипотеза ===&lt;br /&gt;
Эмоциональная категория песни (Emotion) статистически значимо зависит от комбинации языка исполнения и исполнителя: песни на телугу в исполнении артистов «первого эшелона» (например, Sid Sriram, Armaan Malik) с большей вероятностью относятся к категориям Love или Joy, тогда как треки второстепенных исполнителей или из менее популярных фильмов чаще маркируются как Sadness или Anticipation. При этом модель, обученная на признаках Language + Artist + Movie, покажет качество прогнозирования эмоции выше базового уровня (majority class baseline) не менее чем на 20 п.п. по метрике F1-macro.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Работы ИНДОР-211]]&lt;br /&gt;
[[Категория:BigDataWorks]]&lt;/div&gt;</summary>
		<author><name>Pocrovskii Alexander</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%9A%D0%BE%D0%BB%D0%BB%D0%B5%D0%BA%D1%86%D0%B8%D1%8F_%D0%BF%D0%B5%D1%81%D0%B5%D0%BD_%D0%B8%D0%B7_%D0%B8%D0%BD%D0%B4%D0%B8%D0%B9%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%BA%D0%B8%D0%BD%D0%B5%D0%BC%D0%B0%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B0_DataSet&amp;diff=46199</id>
		<title>Коллекция песен из индийского кинематографа DataSet</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%9A%D0%BE%D0%BB%D0%BB%D0%B5%D0%BA%D1%86%D0%B8%D1%8F_%D0%BF%D0%B5%D1%81%D0%B5%D0%BD_%D0%B8%D0%B7_%D0%B8%D0%BD%D0%B4%D0%B8%D0%B9%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%BA%D0%B8%D0%BD%D0%B5%D0%BC%D0%B0%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B0_DataSet&amp;diff=46199"/>
		<updated>2026-04-14T09:47:32Z</updated>

		<summary type="html">&lt;p&gt;Pocrovskii Alexander: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Model&lt;br /&gt;
|Description=Коллекция песен из индийского кинематографа&lt;br /&gt;
|Field_of_knowledge=Информатика, Образование, Искусственный интеллект, Большие данные, Музыка, Медиа&lt;br /&gt;
|Website=https://www.kaggle.com/datasets/moonknightmarvel/dataset-of-songs-with-genreartistmovielanguage/data&lt;br /&gt;
|Inventor=Pocrovskii Alexander&lt;br /&gt;
|Environment=R, Большие данные&lt;br /&gt;
|Student-created=Да&lt;br /&gt;
}}&lt;br /&gt;
== Общая информация ==&lt;br /&gt;
* &#039;&#039;&#039;Авторы:&#039;&#039;&#039; Студент группы [[Категория:ИНДОР-211]] -   [[Участник:Pokrovskii Alexander|Pokrovskii Alexander]]&lt;br /&gt;
* &#039;&#039;&#039;Дата исследования:&#039;&#039;&#039; 14 апреля 2026&lt;br /&gt;
* &#039;&#039;&#039;Источник:&#039;&#039;&#039; Kaggle Datasets&lt;br /&gt;
* &#039;&#039;&#039;Платформа:&#039;&#039;&#039; Kaggle&lt;br /&gt;
* &#039;&#039;&#039;Дата публикации:&#039;&#039;&#039; 23 апреля 2026 г.&lt;br /&gt;
&lt;br /&gt;
=== Исходные данные ===&lt;br /&gt;
* &#039;&#039;&#039;Файл:&#039;&#039;&#039; songs_db.csv (6 КB)&lt;br /&gt;
* &#039;&#039;&#039;Структура:&#039;&#039;&#039; 101 строк (избирательных участков), 5 столбцов&lt;br /&gt;
* &#039;&#039;&#039;Ссылка:&#039;&#039;&#039; https://www.kaggle.com/datasets/moonknightmarvel/dataset-of-songs-with-genreartistmovielanguage/data&lt;br /&gt;
&amp;lt;uml&amp;gt;&lt;br /&gt;
@startuml&lt;br /&gt;
&lt;br /&gt;
title Пайплайн представления музвкальных данных в Digida&lt;br /&gt;
skinparam handwritten false&lt;br /&gt;
&lt;br /&gt;
rectangle &amp;quot;Внешние данные (OWID CSV)&amp;quot; as external #LightBlue&lt;br /&gt;
rectangle &amp;quot;R: предварительная загрузка&amp;quot; as r_load #LightGreen  &lt;br /&gt;
rectangle &amp;quot;OpenRefine: очистка и обогащение&amp;quot; as refine #LightYellow&lt;br /&gt;
rectangle &amp;quot;R: визуализация + экспорт&amp;quot; as r_export #LightPink&lt;br /&gt;
rectangle &amp;quot;Digida: публикация&amp;quot; as platform #LightCoral&lt;br /&gt;
&lt;br /&gt;
external --&amp;gt; r_load : read_csv()&lt;br /&gt;
r_load --&amp;gt; refine : экспорт songs_db.csv&lt;br /&gt;
refine --&amp;gt; refine : Нормализация, расчёт метрик&lt;br /&gt;
refine --&amp;gt; r_export : экспорт ongs_db_clean.csv&lt;br /&gt;
r_export --&amp;gt; r_export : ggplot2 + patchwork дашборд&lt;br /&gt;
r_export --&amp;gt; platform : загрузка страниц + дашборд&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@enduml&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/uml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Описание исследования ==&lt;br /&gt;
Исследование посвящено анализу структурированных музыкальных метаданных на примере датасета песен из индийских фильмов.&lt;br /&gt;
&lt;br /&gt;
=== Цель ===&lt;br /&gt;
Выявить статистически значимые связи между метаданными песен (язык, исполнитель, фильм) и их эмоциональной категорией, а также построить и валидировать модель машинного обучения для прогнозирования эмоции песни на основе доступных признаков с точностью не ниже 75% (F1-macro).&lt;br /&gt;
&lt;br /&gt;
=== Задачи ===&lt;br /&gt;
# Выполнить предобработку: кодирование категориальных признаков (Artist, Movie, Language), балансировку данных (при необходимости), разделение на обучающую/тестовую выборки.&lt;br /&gt;
# Выполнить предобработку: кодирование категориальных признаков (Artist, Movie, Language), балансировку данных (при необходимости), разделение на обучающую/тестовую выборки.&lt;br /&gt;
# Построить и сравнить несколько моделей классификации (логистическая регрессия, Random Forest, XGBoost) с кросс-валидацией, оценить метрики качества (accuracy, precision, recall, F1-score).&lt;br /&gt;
# Визуализировать результаты: матрицу ошибок, важность признаков, распределение предсказаний, а также сформировать интерпретируемые выводы о доминирующих факторах, влияющих на эмоциональную окраску песни.&lt;br /&gt;
&lt;br /&gt;
=== Гипотеза ===&lt;br /&gt;
Эмоциональная категория песни (Emotion) статистически значимо зависит от комбинации языка исполнения и исполнителя: песни на телугу в исполнении артистов «первого эшелона» (например, Sid Sriram, Armaan Malik) с большей вероятностью относятся к категориям Love или Joy, тогда как треки второстепенных исполнителей или из менее популярных фильмов чаще маркируются как Sadness или Anticipation. При этом модель, обученная на признаках Language + Artist + Movie, покажет качество прогнозирования эмоции выше базового уровня (majority class baseline) не менее чем на 20 п.п. по метрике F1-macro.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Работы ИНДОР-211]]&lt;br /&gt;
[[Категория:BigDataWorks]]&lt;/div&gt;</summary>
		<author><name>Pocrovskii Alexander</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%9A%D0%BE%D0%BB%D0%BB%D0%B5%D0%BA%D1%86%D0%B8%D1%8F_%D0%BF%D0%B5%D1%81%D0%B5%D0%BD_%D0%B8%D0%B7_%D0%B8%D0%BD%D0%B4%D0%B8%D0%B9%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%BA%D0%B8%D0%BD%D0%B5%D0%BC%D0%B0%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B0_DataSet&amp;diff=46198</id>
		<title>Коллекция песен из индийского кинематографа DataSet</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%9A%D0%BE%D0%BB%D0%BB%D0%B5%D0%BA%D1%86%D0%B8%D1%8F_%D0%BF%D0%B5%D1%81%D0%B5%D0%BD_%D0%B8%D0%B7_%D0%B8%D0%BD%D0%B4%D0%B8%D0%B9%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%BA%D0%B8%D0%BD%D0%B5%D0%BC%D0%B0%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B0_DataSet&amp;diff=46198"/>
		<updated>2026-04-14T09:40:59Z</updated>

		<summary type="html">&lt;p&gt;Pocrovskii Alexander: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Model&lt;br /&gt;
|Description=Коллекция песен из индийского кинематографа&lt;br /&gt;
|Field_of_knowledge=Информатика, Образование, Искусственный интеллект, Большие данные, Музыка, Медиа&lt;br /&gt;
|Website=https://www.kaggle.com/datasets/moonknightmarvel/dataset-of-songs-with-genreartistmovielanguage/data&lt;br /&gt;
|Inventor=Pocrovskii Alexander&lt;br /&gt;
|Environment=R, Большие данные&lt;br /&gt;
|Student-created=Да&lt;br /&gt;
}}&lt;br /&gt;
== Общая информация ==&lt;br /&gt;
* &#039;&#039;&#039;Авторы:&#039;&#039;&#039; Студент группы [[Категория:ИНДОР-211]] -   [[Участник:Pokrovskii Alexander|Pokrovskii Alexander]]&lt;br /&gt;
* &#039;&#039;&#039;Дата исследования:&#039;&#039;&#039; 14 апреля 2026&lt;br /&gt;
* &#039;&#039;&#039;Источник:&#039;&#039;&#039; Kaggle Datasets&lt;br /&gt;
* &#039;&#039;&#039;Платформа:&#039;&#039;&#039; Kaggle&lt;br /&gt;
* &#039;&#039;&#039;Дата публикации:&#039;&#039;&#039; 23 апреля 2026 г.&lt;br /&gt;
&lt;br /&gt;
=== Исходные данные ===&lt;br /&gt;
* &#039;&#039;&#039;Файл:&#039;&#039;&#039; songs_db.csv (6 КB)&lt;br /&gt;
* &#039;&#039;&#039;Структура:&#039;&#039;&#039; 101 строк (избирательных участков), 5 столбцов&lt;br /&gt;
* &#039;&#039;&#039;Ссылка:&#039;&#039;&#039; https://www.kaggle.com/datasets/moonknightmarvel/dataset-of-songs-with-genreartistmovielanguage/data&lt;br /&gt;
&amp;lt;uml&amp;gt;&lt;br /&gt;
@startuml&lt;br /&gt;
&lt;br /&gt;
title Пайплайн представления музвкальных данных в Digida&lt;br /&gt;
skinparam handwritten false&lt;br /&gt;
&lt;br /&gt;
rectangle &amp;quot;Внешние данные (OWID CSV)&amp;quot; as external #LightBlue&lt;br /&gt;
rectangle &amp;quot;R: предварительная загрузка&amp;quot; as r_load #LightGreen  &lt;br /&gt;
rectangle &amp;quot;OpenRefine: очистка и обогащение&amp;quot; as refine #LightYellow&lt;br /&gt;
rectangle &amp;quot;R: визуализация + экспорт&amp;quot; as r_export #LightPink&lt;br /&gt;
rectangle &amp;quot;Digida: публикация&amp;quot; as platform #LightCoral&lt;br /&gt;
&lt;br /&gt;
external --&amp;gt; r_load : read_csv()&lt;br /&gt;
r_load --&amp;gt; refine : экспорт demo_raw_for_refine.csv&lt;br /&gt;
refine --&amp;gt; refine : Нормализация, расчёт метрик&lt;br /&gt;
refine --&amp;gt; r_export : экспорт demo_clean_with_wiki.csv&lt;br /&gt;
r_export --&amp;gt; r_export : ggplot2 + patchwork дашборд&lt;br /&gt;
r_export --&amp;gt; platform : загрузка страниц + дашборд&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@enduml&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/uml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Описание исследования ==&lt;br /&gt;
Исследование посвящено анализу структурированных музыкальных метаданных на примере датасета песен из индийских фильмов.&lt;br /&gt;
&lt;br /&gt;
=== Цель ===&lt;br /&gt;
Выявить статистически значимые связи между метаданными песен (язык, исполнитель, фильм) и их эмоциональной категорией, а также построить и валидировать модель машинного обучения для прогнозирования эмоции песни на основе доступных признаков с точностью не ниже 75% (F1-macro).&lt;br /&gt;
&lt;br /&gt;
=== Задачи ===&lt;br /&gt;
# Выполнить предобработку: кодирование категориальных признаков (Artist, Movie, Language), балансировку данных (при необходимости), разделение на обучающую/тестовую выборки.&lt;br /&gt;
# Выполнить предобработку: кодирование категориальных признаков (Artist, Movie, Language), балансировку данных (при необходимости), разделение на обучающую/тестовую выборки.&lt;br /&gt;
# Построить и сравнить несколько моделей классификации (логистическая регрессия, Random Forest, XGBoost) с кросс-валидацией, оценить метрики качества (accuracy, precision, recall, F1-score).&lt;br /&gt;
# Визуализировать результаты: матрицу ошибок, важность признаков, распределение предсказаний, а также сформировать интерпретируемые выводы о доминирующих факторах, влияющих на эмоциональную окраску песни.&lt;br /&gt;
&lt;br /&gt;
=== Гипотеза ===&lt;br /&gt;
Эмоциональная категория песни (Emotion) статистически значимо зависит от комбинации языка исполнения и исполнителя: песни на телугу в исполнении артистов «первого эшелона» (например, Sid Sriram, Armaan Malik) с большей вероятностью относятся к категориям Love или Joy, тогда как треки второстепенных исполнителей или из менее популярных фильмов чаще маркируются как Sadness или Anticipation. При этом модель, обученная на признаках Language + Artist + Movie, покажет качество прогнозирования эмоции выше базового уровня (majority class baseline) не менее чем на 20 п.п. по метрике F1-macro.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Работы ИНДОР-211]]&lt;br /&gt;
[[Категория:BigDataWorks]]&lt;/div&gt;</summary>
		<author><name>Pocrovskii Alexander</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%9A%D0%BE%D0%BB%D0%BB%D0%B5%D0%BA%D1%86%D0%B8%D1%8F_%D0%BF%D0%B5%D1%81%D0%B5%D0%BD_%D0%B8%D0%B7_%D0%B8%D0%BD%D0%B4%D0%B8%D0%B9%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%BA%D0%B8%D0%BD%D0%B5%D0%BC%D0%B0%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B0_DataSet&amp;diff=46197</id>
		<title>Коллекция песен из индийского кинематографа DataSet</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%9A%D0%BE%D0%BB%D0%BB%D0%B5%D0%BA%D1%86%D0%B8%D1%8F_%D0%BF%D0%B5%D1%81%D0%B5%D0%BD_%D0%B8%D0%B7_%D0%B8%D0%BD%D0%B4%D0%B8%D0%B9%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%BA%D0%B8%D0%BD%D0%B5%D0%BC%D0%B0%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B0_DataSet&amp;diff=46197"/>
		<updated>2026-04-14T09:37:05Z</updated>

		<summary type="html">&lt;p&gt;Pocrovskii Alexander: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Model&lt;br /&gt;
|Description=Коллекция песен из индийского кинематографа&lt;br /&gt;
|Field_of_knowledge=Информатика, Образование, Искусственный интеллект, Большие данные, Музыка, Медиа&lt;br /&gt;
|Website=https://www.kaggle.com/datasets/moonknightmarvel/dataset-of-songs-with-genreartistmovielanguage/data&lt;br /&gt;
|Inventor=Pocrovskii Alexander&lt;br /&gt;
|Environment=R, Большие данные&lt;br /&gt;
|Student-created=Да&lt;br /&gt;
}}&lt;br /&gt;
== Общая информация ==&lt;br /&gt;
* &#039;&#039;&#039;Авторы:&#039;&#039;&#039; Студент группы [[Категория:ИНДОР-211]] -   [[Участник:Pokrovskii Alexander|Pokrovskii Alexander]]&lt;br /&gt;
* &#039;&#039;&#039;Дата исследования:&#039;&#039;&#039; 14 апреля 2026&lt;br /&gt;
* &#039;&#039;&#039;Источник:&#039;&#039;&#039; Kaggle Datasets&lt;br /&gt;
* &#039;&#039;&#039;Платформа:&#039;&#039;&#039; Kaggle&lt;br /&gt;
* &#039;&#039;&#039;Дата публикации:&#039;&#039;&#039; 23 апреля 2026 г.&lt;br /&gt;
&lt;br /&gt;
=== Исходные данные ===&lt;br /&gt;
* &#039;&#039;&#039;Файл:&#039;&#039;&#039; songs_db.csv (6 КB)&lt;br /&gt;
* &#039;&#039;&#039;Структура:&#039;&#039;&#039; 101 строк (избирательных участков), 5 столбцов&lt;br /&gt;
* &#039;&#039;&#039;Ссылка:&#039;&#039;&#039; https://www.kaggle.com/datasets/moonknightmarvel/dataset-of-songs-with-genreartistmovielanguage/data&lt;br /&gt;
&lt;br /&gt;
== Описание исследования ==&lt;br /&gt;
Исследование посвящено анализу структурированных музыкальных метаданных на примере датасета песен из индийских фильмов.&lt;br /&gt;
&lt;br /&gt;
=== Цель ===&lt;br /&gt;
Выявить статистически значимые связи между метаданными песен (язык, исполнитель, фильм) и их эмоциональной категорией, а также построить и валидировать модель машинного обучения для прогнозирования эмоции песни на основе доступных признаков с точностью не ниже 75% (F1-macro).&lt;br /&gt;
&lt;br /&gt;
=== Задачи ===&lt;br /&gt;
# Выполнить предобработку: кодирование категориальных признаков (Artist, Movie, Language), балансировку данных (при необходимости), разделение на обучающую/тестовую выборки.&lt;br /&gt;
# Выполнить предобработку: кодирование категориальных признаков (Artist, Movie, Language), балансировку данных (при необходимости), разделение на обучающую/тестовую выборки.&lt;br /&gt;
# Построить и сравнить несколько моделей классификации (логистическая регрессия, Random Forest, XGBoost) с кросс-валидацией, оценить метрики качества (accuracy, precision, recall, F1-score).&lt;br /&gt;
# Визуализировать результаты: матрицу ошибок, важность признаков, распределение предсказаний, а также сформировать интерпретируемые выводы о доминирующих факторах, влияющих на эмоциональную окраску песни.&lt;br /&gt;
&lt;br /&gt;
=== Гипотеза ===&lt;br /&gt;
Эмоциональная категория песни (Emotion) статистически значимо зависит от комбинации языка исполнения и исполнителя: песни на телугу в исполнении артистов «первого эшелона» (например, Sid Sriram, Armaan Malik) с большей вероятностью относятся к категориям Love или Joy, тогда как треки второстепенных исполнителей или из менее популярных фильмов чаще маркируются как Sadness или Anticipation. При этом модель, обученная на признаках Language + Artist + Movie, покажет качество прогнозирования эмоции выше базового уровня (majority class baseline) не менее чем на 20 п.п. по метрике F1-macro.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Работы ИНДОР-211]]&lt;br /&gt;
[[Категория:BigDataWorks]]&lt;/div&gt;</summary>
		<author><name>Pocrovskii Alexander</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Pocrovskii_Alexander&amp;diff=46196</id>
		<title>Участник:Pocrovskii Alexander</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Pocrovskii_Alexander&amp;diff=46196"/>
		<updated>2026-04-14T09:35:58Z</updated>

		<summary type="html">&lt;p&gt;Pocrovskii Alexander: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{UserMGPU&lt;br /&gt;
|Description=Студент МГПУ, ИНДОР-211&lt;br /&gt;
|Field_of_knowledge=Математика, Физика, Информатика, Робототехника, Педагогика, Образование, Искусственный интеллект, Интернет вещей, Game design, Геометрия, Спорт, Игра, Картография, Моделирование, Музыка, Философия, Медиа&lt;br /&gt;
|Environment=Google Docs, Google Forms, Canva, Adobe Photoshop, Adobe Indesign, Adobe Premiere Pro, Blender, Visual Studio Code, Unity, Яндекс.Формы, ChatGPT, Deepseek, QweenChat, Яндекс.Шедеврум, Pinokio&lt;br /&gt;
|Position=Бакалавриат&lt;br /&gt;
|Profile=Информатика, Робототехника&lt;br /&gt;
|PedDirection=Да&lt;br /&gt;
|Community=GitHub, ИЦО, МГПУ&lt;br /&gt;
|Виды_спорта=Кендо (кендо), Кюдо (кюдо)&lt;br /&gt;
|Working_On=Модель посещаемости студентов в учебное заведение в зависимости от негативных факторов, Коллекция песен из индийского кинематографа DataSet&lt;br /&gt;
}}&lt;br /&gt;
[[Категория:ИНДОР-211]]&lt;br /&gt;
[[Категория:UserMGPU]]&lt;/div&gt;</summary>
		<author><name>Pocrovskii Alexander</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%9D%D0%B0%D0%B1%D0%BE%D1%80_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%BF%D0%B5%D1%81%D0%B5%D0%BD&amp;diff=46195</id>
		<title>Набор данных песен</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%9D%D0%B0%D0%B1%D0%BE%D1%80_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%BF%D0%B5%D1%81%D0%B5%D0%BD&amp;diff=46195"/>
		<updated>2026-04-14T09:34:47Z</updated>

		<summary type="html">&lt;p&gt;Pocrovskii Alexander: Pocrovskii Alexander переименовал страницу Набор данных песен в Коллекция песен из индийского кинематографа DataSet: Название с ошибкой&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#перенаправление [[Коллекция песен из индийского кинематографа DataSet]]&lt;/div&gt;</summary>
		<author><name>Pocrovskii Alexander</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%9A%D0%BE%D0%BB%D0%BB%D0%B5%D0%BA%D1%86%D0%B8%D1%8F_%D0%BF%D0%B5%D1%81%D0%B5%D0%BD_%D0%B8%D0%B7_%D0%B8%D0%BD%D0%B4%D0%B8%D0%B9%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%BA%D0%B8%D0%BD%D0%B5%D0%BC%D0%B0%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B0_DataSet&amp;diff=46194</id>
		<title>Коллекция песен из индийского кинематографа DataSet</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%9A%D0%BE%D0%BB%D0%BB%D0%B5%D0%BA%D1%86%D0%B8%D1%8F_%D0%BF%D0%B5%D1%81%D0%B5%D0%BD_%D0%B8%D0%B7_%D0%B8%D0%BD%D0%B4%D0%B8%D0%B9%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%BA%D0%B8%D0%BD%D0%B5%D0%BC%D0%B0%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B0_DataSet&amp;diff=46194"/>
		<updated>2026-04-14T09:34:47Z</updated>

		<summary type="html">&lt;p&gt;Pocrovskii Alexander: Pocrovskii Alexander переименовал страницу Набор данных песен в Коллекция песен из индийского кинематографа DataSet: Название с ошибкой&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Model&lt;br /&gt;
|Description=Коллекция песен из индийского кинематографа&lt;br /&gt;
|Field_of_knowledge=Информатика, Образование, Искусственный интеллект, Большие данные, Музыка, Медиа&lt;br /&gt;
|Inventor=Pocrovskii Alexander&lt;br /&gt;
|Environment=R, Большие данные&lt;br /&gt;
|Student-created=Да&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Общая информация ==&lt;br /&gt;
* &#039;&#039;&#039;Авторы:&#039;&#039;&#039; Студент группы [[Категория:ИНДОР-211]] -   [[Участник:Pokrovskii Alexander|Pokrovskii Alexander]]&lt;br /&gt;
* &#039;&#039;&#039;Дата исследования:&#039;&#039;&#039; 14 апреля 2026&lt;br /&gt;
* &#039;&#039;&#039;Источник:&#039;&#039;&#039; Kaggle Datasets&lt;br /&gt;
* &#039;&#039;&#039;Платформа:&#039;&#039;&#039; Kaggle&lt;br /&gt;
* &#039;&#039;&#039;Дата публикации:&#039;&#039;&#039; 23 апреля 2026 г.&lt;br /&gt;
&lt;br /&gt;
=== Исходные данные ===&lt;br /&gt;
* &#039;&#039;&#039;Файл:&#039;&#039;&#039; songs_db.csv (6 КB)&lt;br /&gt;
* &#039;&#039;&#039;Структура:&#039;&#039;&#039; 101 строк (избирательных участков), 5 столбцов&lt;br /&gt;
* &#039;&#039;&#039;Ссылка:&#039;&#039;&#039; https://www.kaggle.com/datasets/moonknightmarvel/dataset-of-songs-with-genreartistmovielanguage/data&lt;br /&gt;
&lt;br /&gt;
== Описание исследования ==&lt;br /&gt;
Исследование посвящено анализу структурированных музыкальных метаданных на примере датасета песен из индийских фильмов.&lt;br /&gt;
&lt;br /&gt;
=== Цель ===&lt;br /&gt;
Выявить статистически значимые связи между метаданными песен (язык, исполнитель, фильм) и их эмоциональной категорией, а также построить и валидировать модель машинного обучения для прогнозирования эмоции песни на основе доступных признаков с точностью не ниже 75% (F1-macro).&lt;br /&gt;
&lt;br /&gt;
=== Задачи ===&lt;br /&gt;
# Выполнить предобработку: кодирование категориальных признаков (Artist, Movie, Language), балансировку данных (при необходимости), разделение на обучающую/тестовую выборки.&lt;br /&gt;
# Выполнить предобработку: кодирование категориальных признаков (Artist, Movie, Language), балансировку данных (при необходимости), разделение на обучающую/тестовую выборки.&lt;br /&gt;
# Построить и сравнить несколько моделей классификации (логистическая регрессия, Random Forest, XGBoost) с кросс-валидацией, оценить метрики качества (accuracy, precision, recall, F1-score).&lt;br /&gt;
# Визуализировать результаты: матрицу ошибок, важность признаков, распределение предсказаний, а также сформировать интерпретируемые выводы о доминирующих факторах, влияющих на эмоциональную окраску песни.&lt;br /&gt;
&lt;br /&gt;
=== Гипотеза ===&lt;br /&gt;
Эмоциональная категория песни (Emotion) статистически значимо зависит от комбинации языка исполнения и исполнителя: песни на телугу в исполнении артистов «первого эшелона» (например, Sid Sriram, Armaan Malik) с большей вероятностью относятся к категориям Love или Joy, тогда как треки второстепенных исполнителей или из менее популярных фильмов чаще маркируются как Sadness или Anticipation. При этом модель, обученная на признаках Language + Artist + Movie, покажет качество прогнозирования эмоции выше базового уровня (majority class baseline) не менее чем на 20 п.п. по метрике F1-macro.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Работы ИНДОР-211]]&lt;br /&gt;
[[Категория:BigDataWorks]]&lt;/div&gt;</summary>
		<author><name>Pocrovskii Alexander</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%9A%D0%BE%D0%BB%D0%BB%D0%B5%D0%BA%D1%86%D0%B8%D1%8F_%D0%BF%D0%B5%D1%81%D0%B5%D0%BD_%D0%B8%D0%B7_%D0%B8%D0%BD%D0%B4%D0%B8%D0%B9%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%BA%D0%B8%D0%BD%D0%B5%D0%BC%D0%B0%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B0_DataSet&amp;diff=46192</id>
		<title>Коллекция песен из индийского кинематографа DataSet</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%9A%D0%BE%D0%BB%D0%BB%D0%B5%D0%BA%D1%86%D0%B8%D1%8F_%D0%BF%D0%B5%D1%81%D0%B5%D0%BD_%D0%B8%D0%B7_%D0%B8%D0%BD%D0%B4%D0%B8%D0%B9%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%BA%D0%B8%D0%BD%D0%B5%D0%BC%D0%B0%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B0_DataSet&amp;diff=46192"/>
		<updated>2026-04-14T09:19:39Z</updated>

		<summary type="html">&lt;p&gt;Pocrovskii Alexander: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Model&lt;br /&gt;
|Description=Коллекция песен из индийского кинематографа&lt;br /&gt;
|Field_of_knowledge=Информатика, Образование, Искусственный интеллект, Большие данные, Музыка, Медиа&lt;br /&gt;
|Inventor=Pocrovskii Alexander&lt;br /&gt;
|Environment=R, Большие данные&lt;br /&gt;
|Student-created=Да&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Общая информация ==&lt;br /&gt;
* &#039;&#039;&#039;Авторы:&#039;&#039;&#039; Студент группы [[Категория:ИНДОР-211]] -   [[Участник:Pokrovskii Alexander|Pokrovskii Alexander]]&lt;br /&gt;
* &#039;&#039;&#039;Дата исследования:&#039;&#039;&#039; 14 апреля 2026&lt;br /&gt;
* &#039;&#039;&#039;Источник:&#039;&#039;&#039; Kaggle Datasets&lt;br /&gt;
* &#039;&#039;&#039;Платформа:&#039;&#039;&#039; Kaggle&lt;br /&gt;
* &#039;&#039;&#039;Дата публикации:&#039;&#039;&#039; 23 апреля 2026 г.&lt;br /&gt;
&lt;br /&gt;
=== Исходные данные ===&lt;br /&gt;
* &#039;&#039;&#039;Файл:&#039;&#039;&#039; songs_db.csv (6 КB)&lt;br /&gt;
* &#039;&#039;&#039;Структура:&#039;&#039;&#039; 101 строк (избирательных участков), 5 столбцов&lt;br /&gt;
* &#039;&#039;&#039;Ссылка:&#039;&#039;&#039; https://www.kaggle.com/datasets/moonknightmarvel/dataset-of-songs-with-genreartistmovielanguage/data&lt;br /&gt;
&lt;br /&gt;
== Описание исследования ==&lt;br /&gt;
Исследование посвящено анализу структурированных музыкальных метаданных на примере датасета песен из индийских фильмов.&lt;br /&gt;
&lt;br /&gt;
=== Цель ===&lt;br /&gt;
Выявить статистически значимые связи между метаданными песен (язык, исполнитель, фильм) и их эмоциональной категорией, а также построить и валидировать модель машинного обучения для прогнозирования эмоции песни на основе доступных признаков с точностью не ниже 75% (F1-macro).&lt;br /&gt;
&lt;br /&gt;
=== Задачи ===&lt;br /&gt;
# Выполнить предобработку: кодирование категориальных признаков (Artist, Movie, Language), балансировку данных (при необходимости), разделение на обучающую/тестовую выборки.&lt;br /&gt;
# Выполнить предобработку: кодирование категориальных признаков (Artist, Movie, Language), балансировку данных (при необходимости), разделение на обучающую/тестовую выборки.&lt;br /&gt;
# Построить и сравнить несколько моделей классификации (логистическая регрессия, Random Forest, XGBoost) с кросс-валидацией, оценить метрики качества (accuracy, precision, recall, F1-score).&lt;br /&gt;
# Визуализировать результаты: матрицу ошибок, важность признаков, распределение предсказаний, а также сформировать интерпретируемые выводы о доминирующих факторах, влияющих на эмоциональную окраску песни.&lt;br /&gt;
&lt;br /&gt;
=== Гипотеза ===&lt;br /&gt;
Эмоциональная категория песни (Emotion) статистически значимо зависит от комбинации языка исполнения и исполнителя: песни на телугу в исполнении артистов «первого эшелона» (например, Sid Sriram, Armaan Malik) с большей вероятностью относятся к категориям Love или Joy, тогда как треки второстепенных исполнителей или из менее популярных фильмов чаще маркируются как Sadness или Anticipation. При этом модель, обученная на признаках Language + Artist + Movie, покажет качество прогнозирования эмоции выше базового уровня (majority class baseline) не менее чем на 20 п.п. по метрике F1-macro.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Работы ИНДОР-211]]&lt;br /&gt;
[[Категория:BigDataWorks]]&lt;/div&gt;</summary>
		<author><name>Pocrovskii Alexander</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%9A%D0%BE%D0%BB%D0%BB%D0%B5%D0%BA%D1%86%D0%B8%D1%8F_%D0%BF%D0%B5%D1%81%D0%B5%D0%BD_%D0%B8%D0%B7_%D0%B8%D0%BD%D0%B4%D0%B8%D0%B9%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%BA%D0%B8%D0%BD%D0%B5%D0%BC%D0%B0%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B0_DataSet&amp;diff=46190</id>
		<title>Коллекция песен из индийского кинематографа DataSet</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%9A%D0%BE%D0%BB%D0%BB%D0%B5%D0%BA%D1%86%D0%B8%D1%8F_%D0%BF%D0%B5%D1%81%D0%B5%D0%BD_%D0%B8%D0%B7_%D0%B8%D0%BD%D0%B4%D0%B8%D0%B9%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%BA%D0%B8%D0%BD%D0%B5%D0%BC%D0%B0%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B0_DataSet&amp;diff=46190"/>
		<updated>2026-04-14T09:06:01Z</updated>

		<summary type="html">&lt;p&gt;Pocrovskii Alexander: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Model&lt;br /&gt;
|Description=Набор данных песен&lt;br /&gt;
|Field_of_knowledge=Информатика, Образование, Искусственный интеллект, Большие данные, Музыка, Медиа&lt;br /&gt;
|Inventor=Pocrovskii Alexander&lt;br /&gt;
|Environment=R, Большие данные&lt;br /&gt;
|Student-created=Да&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Общая информация ==&lt;br /&gt;
* &#039;&#039;&#039;Авторы:&#039;&#039;&#039; Студент группы [[Категория:ИНДОР-211]] -   [[Участник:Pokrovskii Alexander|Pokrovskii Alexander]]&lt;br /&gt;
* &#039;&#039;&#039;Дата исследования:&#039;&#039;&#039; 14 апреля 2026&lt;br /&gt;
* &#039;&#039;&#039;Источник:&#039;&#039;&#039; Kaggle Datasets&lt;br /&gt;
* &#039;&#039;&#039;Платформа:&#039;&#039;&#039; Kaggle&lt;br /&gt;
* &#039;&#039;&#039;Дата публикации:&#039;&#039;&#039; 23 апреля 2026 г.&lt;br /&gt;
&lt;br /&gt;
=== Исходные данные ===&lt;br /&gt;
* &#039;&#039;&#039;Файл:&#039;&#039;&#039; songs_db.csv (6 КB)&lt;br /&gt;
* &#039;&#039;&#039;Структура:&#039;&#039;&#039; 101 строк (избирательных участков), 5 столбцов&lt;br /&gt;
* &#039;&#039;&#039;Ссылка:&#039;&#039;&#039; https://www.kaggle.com/datasets/moonknightmarvel/dataset-of-songs-with-genreartistmovielanguage/data&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Работы ИНДОР-211]]&lt;br /&gt;
[[Категория:BigDataWorks]]&lt;/div&gt;</summary>
		<author><name>Pocrovskii Alexander</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%9A%D0%BE%D0%BB%D0%BB%D0%B5%D0%BA%D1%86%D0%B8%D1%8F_%D0%BF%D0%B5%D1%81%D0%B5%D0%BD_%D0%B8%D0%B7_%D0%B8%D0%BD%D0%B4%D0%B8%D0%B9%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%BA%D0%B8%D0%BD%D0%B5%D0%BC%D0%B0%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B0_DataSet&amp;diff=46189</id>
		<title>Коллекция песен из индийского кинематографа DataSet</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%9A%D0%BE%D0%BB%D0%BB%D0%B5%D0%BA%D1%86%D0%B8%D1%8F_%D0%BF%D0%B5%D1%81%D0%B5%D0%BD_%D0%B8%D0%B7_%D0%B8%D0%BD%D0%B4%D0%B8%D0%B9%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%BA%D0%B8%D0%BD%D0%B5%D0%BC%D0%B0%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B0_DataSet&amp;diff=46189"/>
		<updated>2026-04-14T09:00:54Z</updated>

		<summary type="html">&lt;p&gt;Pocrovskii Alexander: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Model&lt;br /&gt;
|Description=Набор данных песен&lt;br /&gt;
|Field_of_knowledge=Информатика, Образование, Искусственный интеллект, Большие данные, Музыка, Медиа&lt;br /&gt;
|Inventor=Pocrovskii Alexander&lt;br /&gt;
|Environment=R, Большие данные&lt;br /&gt;
|Student-created=Да&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Общая информация ==&lt;br /&gt;
* &#039;&#039;&#039;Авторы:&#039;&#039;&#039; Студент группы [[Категория:ИНДОР-211]] -   [[Участник:Pokrovskii Alexander|Pokrovskii Alexander]]&lt;br /&gt;
* &#039;&#039;&#039;Дата исследования:&#039;&#039;&#039; 14 апреля 2026&lt;br /&gt;
* &#039;&#039;&#039;Источник:&#039;&#039;&#039; Kaggle Datasets&lt;br /&gt;
* &#039;&#039;&#039;Платформа:&#039;&#039;&#039; Kaggle&lt;br /&gt;
* &#039;&#039;&#039;Дата публикации:&#039;&#039;&#039; 23 апреля 2026 г.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Работы ИНДОР-211]]&lt;br /&gt;
[[Категория:BigDataWorks]]&lt;/div&gt;</summary>
		<author><name>Pocrovskii Alexander</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%9A%D0%BE%D0%BB%D0%BB%D0%B5%D0%BA%D1%86%D0%B8%D1%8F_%D0%BF%D0%B5%D1%81%D0%B5%D0%BD_%D0%B8%D0%B7_%D0%B8%D0%BD%D0%B4%D0%B8%D0%B9%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%BA%D0%B8%D0%BD%D0%B5%D0%BC%D0%B0%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B0_DataSet&amp;diff=46188</id>
		<title>Коллекция песен из индийского кинематографа DataSet</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%9A%D0%BE%D0%BB%D0%BB%D0%B5%D0%BA%D1%86%D0%B8%D1%8F_%D0%BF%D0%B5%D1%81%D0%B5%D0%BD_%D0%B8%D0%B7_%D0%B8%D0%BD%D0%B4%D0%B8%D0%B9%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%BA%D0%B8%D0%BD%D0%B5%D0%BC%D0%B0%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B0_DataSet&amp;diff=46188"/>
		<updated>2026-04-14T09:00:38Z</updated>

		<summary type="html">&lt;p&gt;Pocrovskii Alexander: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Model&lt;br /&gt;
|Description=Набор данных песен&lt;br /&gt;
|Field_of_knowledge=Информатика, Образование, Искусственный интеллект, Большие данные, Музыка, Медиа&lt;br /&gt;
|Inventor=Pocrovskii Alexander&lt;br /&gt;
|Environment=R, Большие данные&lt;br /&gt;
|Student-created=Да&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Общая информация ==&lt;br /&gt;
* &#039;&#039;&#039;Авторы:&#039;&#039;&#039; Студентки группы [[Категория:ИНДОР-211]] -   [[Участник:Pokrovskii Alexander|Pokrovskii Alexander]]&lt;br /&gt;
* &#039;&#039;&#039;Дата исследования:&#039;&#039;&#039; 14 апреля 2026&lt;br /&gt;
* &#039;&#039;&#039;Источник:&#039;&#039;&#039; Kaggle Datasets&lt;br /&gt;
* &#039;&#039;&#039;Платформа:&#039;&#039;&#039; Kaggle&lt;br /&gt;
* &#039;&#039;&#039;Дата публикации:&#039;&#039;&#039; 23 апреля 2026 г.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Работы ИНДОР-211]]&lt;br /&gt;
[[Категория:BigDataWorks]]&lt;/div&gt;</summary>
		<author><name>Pocrovskii Alexander</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%9A%D0%BE%D0%BB%D0%BB%D0%B5%D0%BA%D1%86%D0%B8%D1%8F_%D0%BF%D0%B5%D1%81%D0%B5%D0%BD_%D0%B8%D0%B7_%D0%B8%D0%BD%D0%B4%D0%B8%D0%B9%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%BA%D0%B8%D0%BD%D0%B5%D0%BC%D0%B0%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B0_DataSet&amp;diff=46187</id>
		<title>Коллекция песен из индийского кинематографа DataSet</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%9A%D0%BE%D0%BB%D0%BB%D0%B5%D0%BA%D1%86%D0%B8%D1%8F_%D0%BF%D0%B5%D1%81%D0%B5%D0%BD_%D0%B8%D0%B7_%D0%B8%D0%BD%D0%B4%D0%B8%D0%B9%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%BA%D0%B8%D0%BD%D0%B5%D0%BC%D0%B0%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B0_DataSet&amp;diff=46187"/>
		<updated>2026-04-14T08:44:55Z</updated>

		<summary type="html">&lt;p&gt;Pocrovskii Alexander: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Model&lt;br /&gt;
|Description=Набор данных песен&lt;br /&gt;
|Field_of_knowledge=Информатика, Образование, Искусственный интеллект, Большие данные, Музыка, Медиа&lt;br /&gt;
|Inventor=Pocrovskii Alexander&lt;br /&gt;
|Environment=R, Большие данные&lt;br /&gt;
|Student-created=Да&lt;br /&gt;
}}&lt;br /&gt;
[[Категория:Работы ИНДОР-211]]&lt;br /&gt;
[[Категория:BigDataWorks]]&lt;/div&gt;</summary>
		<author><name>Pocrovskii Alexander</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%9A%D0%BE%D0%BB%D0%BB%D0%B5%D0%BA%D1%86%D0%B8%D1%8F_%D0%BF%D0%B5%D1%81%D0%B5%D0%BD_%D0%B8%D0%B7_%D0%B8%D0%BD%D0%B4%D0%B8%D0%B9%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%BA%D0%B8%D0%BD%D0%B5%D0%BC%D0%B0%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B0_DataSet&amp;diff=46186</id>
		<title>Коллекция песен из индийского кинематографа DataSet</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%9A%D0%BE%D0%BB%D0%BB%D0%B5%D0%BA%D1%86%D0%B8%D1%8F_%D0%BF%D0%B5%D1%81%D0%B5%D0%BD_%D0%B8%D0%B7_%D0%B8%D0%BD%D0%B4%D0%B8%D0%B9%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%BA%D0%B8%D0%BD%D0%B5%D0%BC%D0%B0%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B0_DataSet&amp;diff=46186"/>
		<updated>2026-04-14T08:41:55Z</updated>

		<summary type="html">&lt;p&gt;Pocrovskii Alexander: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Model&lt;br /&gt;
|Description=Набор данных песен&lt;br /&gt;
|Field_of_knowledge=Информатика, Образование, Искусственный интеллект, Большие данные, Музыка, Медиа&lt;br /&gt;
|Inventor=Pocrovskii Alexander&lt;br /&gt;
|Environment=R, Большие данные&lt;br /&gt;
|Student-created=Да&lt;br /&gt;
}}&lt;br /&gt;
[[Категория:Работы ИНДОР-211]]&lt;/div&gt;</summary>
		<author><name>Pocrovskii Alexander</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%9A%D0%BE%D0%BB%D0%BB%D0%B5%D0%BA%D1%86%D0%B8%D1%8F_%D0%BF%D0%B5%D1%81%D0%B5%D0%BD_%D0%B8%D0%B7_%D0%B8%D0%BD%D0%B4%D0%B8%D0%B9%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%BA%D0%B8%D0%BD%D0%B5%D0%BC%D0%B0%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B0_DataSet&amp;diff=46185</id>
		<title>Коллекция песен из индийского кинематографа DataSet</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%9A%D0%BE%D0%BB%D0%BB%D0%B5%D0%BA%D1%86%D0%B8%D1%8F_%D0%BF%D0%B5%D1%81%D0%B5%D0%BD_%D0%B8%D0%B7_%D0%B8%D0%BD%D0%B4%D0%B8%D0%B9%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%BA%D0%B8%D0%BD%D0%B5%D0%BC%D0%B0%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B0_DataSet&amp;diff=46185"/>
		<updated>2026-04-14T08:40:08Z</updated>

		<summary type="html">&lt;p&gt;Pocrovskii Alexander: Новая страница: «{{Model |Description=Набор данных песен |Field_of_knowledge= Информатика, Образование, Музыка |Inventor=Pocrovskii Alexander |Environment=BigData, R |Student-created=Да }}   Категория:Работы ИНДОР-211»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Model&lt;br /&gt;
|Description=Набор данных песен&lt;br /&gt;
|Field_of_knowledge= Информатика, Образование, Музыка&lt;br /&gt;
|Inventor=Pocrovskii Alexander&lt;br /&gt;
|Environment=BigData, R&lt;br /&gt;
|Student-created=Да&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Работы ИНДОР-211]]&lt;/div&gt;</summary>
		<author><name>Pocrovskii Alexander</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Pocrovskii_Alexander&amp;diff=46184</id>
		<title>Участник:Pocrovskii Alexander</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Pocrovskii_Alexander&amp;diff=46184"/>
		<updated>2026-04-14T08:31:35Z</updated>

		<summary type="html">&lt;p&gt;Pocrovskii Alexander: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{UserMGPU&lt;br /&gt;
|Description=Студент МГПУ, ИНДОР-211&lt;br /&gt;
|Field_of_knowledge=Математика, Физика, Информатика, Робототехника, Педагогика, Образование, Искусственный интеллект, Интернет вещей, Game design, Геометрия, Спорт, Игра, Картография, Моделирование, Музыка, Философия, Медиа&lt;br /&gt;
|Environment=Google Docs, Google Forms, Canva, Adobe Photoshop, Adobe Indesign, Adobe Premiere Pro, Blender, Visual Studio Code, Unity, Яндекс.Формы, ChatGPT, Deepseek, QweenChat, Яндекс.Шедеврум, Pinokio&lt;br /&gt;
|Position=Бакалавриат&lt;br /&gt;
|Profile=Информатика, Робототехника&lt;br /&gt;
|PedDirection=Да&lt;br /&gt;
|Community=GitHub, ИЦО, МГПУ&lt;br /&gt;
|Виды_спорта=Кендо (кендо), Кюдо (кюдо)&lt;br /&gt;
|Working_On=Модель посещаемости студентов в учебное заведение в зависимости от негативных факторов, Набор данных песен&lt;br /&gt;
}}&lt;br /&gt;
[[Категория:ИНДОР-211]]&lt;br /&gt;
[[Категория:UserMGPU]]&lt;/div&gt;</summary>
		<author><name>Pocrovskii Alexander</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Pocrovskii_Alexander&amp;diff=44450</id>
		<title>Участник:Pocrovskii Alexander</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Pocrovskii_Alexander&amp;diff=44450"/>
		<updated>2026-02-24T15:33:15Z</updated>

		<summary type="html">&lt;p&gt;Pocrovskii Alexander: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{UserMGPU&lt;br /&gt;
|Description=Студент МГПУ, ИНДОР-211&lt;br /&gt;
|Field_of_knowledge=Математика, Физика, Информатика, Робототехника, Педагогика, Образование, Искусственный интеллект, Интернет вещей, Game design, Геометрия, Спорт, Игра, Картография, Моделирование, Музыка, Философия, Медиа&lt;br /&gt;
|Environment=Google Docs, Google Forms, Canva, Adobe Photoshop, Adobe Indesign, Adobe Premiere Pro, Blender, Visual Studio Code, Unity, Яндекс.Формы, ChatGPT, Deepseek, QweenChat, Яндекс.Шедеврум, Pinokio&lt;br /&gt;
|Position=Бакалавриат&lt;br /&gt;
|Profile=Информатика, Робототехника&lt;br /&gt;
|PedDirection=Да&lt;br /&gt;
|Community=GitHub, ИЦО, МГПУ&lt;br /&gt;
|Виды_спорта=Кендо (кендо), Кюдо (кюдо)&lt;br /&gt;
|Working_On=Модель посещаемости студентов в учебное заведение в зависимости от негативных факторов&lt;br /&gt;
}}&lt;br /&gt;
[[Категория:ИНДОР-211]]&lt;br /&gt;
[[Категория:UserMGPU]]&lt;/div&gt;</summary>
		<author><name>Pocrovskii Alexander</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Pocrovskii_Alexander&amp;diff=44449</id>
		<title>Участник:Pocrovskii Alexander</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Pocrovskii_Alexander&amp;diff=44449"/>
		<updated>2026-02-24T15:28:22Z</updated>

		<summary type="html">&lt;p&gt;Pocrovskii Alexander: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{UserMGPU&lt;br /&gt;
|Description=Студент МГПУ, ИНДОР-211&lt;br /&gt;
|Field_of_knowledge=Математика, Физика, Информатика, Робототехника, Педагогика, Образование, Искусственный интеллект, Интернет вещей, Game design, Геометрия, Спорт, Игра, Картография, Моделирование, Музыка, Философия, Медиа&lt;br /&gt;
|Environment=Google Docs, Google Forms, Canva, Adobe Photoshop, Adobe Indesign, Adobe Premiere Pro, Blender, Visual Studio Code, Unity, Яндекс.Формы&lt;br /&gt;
|Position=Бакалавриат&lt;br /&gt;
|Profile=Информатика, Робототехника&lt;br /&gt;
|PedDirection=Да&lt;br /&gt;
|Community=GitHub, ИЦО, МГПУ&lt;br /&gt;
|Виды_спорта=Кендо (кендо), Кюдо (кюдо)&lt;br /&gt;
|Working_On=Модель посещаемости студентов в учебное заведение в зависимости от негативных факторов&lt;br /&gt;
}}&lt;br /&gt;
[[Категория:ИНДОР-211]]&lt;br /&gt;
[[Категория:UserMGPU]]&lt;/div&gt;</summary>
		<author><name>Pocrovskii Alexander</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Pocrovskii_Alexander&amp;diff=44448</id>
		<title>Участник:Pocrovskii Alexander</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Pocrovskii_Alexander&amp;diff=44448"/>
		<updated>2026-02-24T15:26:00Z</updated>

		<summary type="html">&lt;p&gt;Pocrovskii Alexander: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{UserMGPU&lt;br /&gt;
|Description=Студент МГПУ, ИНДОР-211&lt;br /&gt;
|Field_of_knowledge=Математика, Физика, Информатика, Робототехника, Педагогика, Образование, Искусственный интеллект, Интернет вещей, Game design, Геометрия, Спорт, Игра, Картография, Моделирование, Музыка, Философия, Медиа&lt;br /&gt;
|Environment=Google Docs, Google Forms, Canva, Adobe Photoshop, Adobe Indesign, Adobe Premiere Pro, Blender, Visual Studio Code, Unity&lt;br /&gt;
|Position=Бакалавриат&lt;br /&gt;
|Profile=Информатика, Робототехника&lt;br /&gt;
|PedDirection=Да&lt;br /&gt;
|Community=GitHub, ИЦО, МГПУ&lt;br /&gt;
|Виды_спорта=Кендо (кендо), Кюдо (кюдо)&lt;br /&gt;
|Working_On=Модель посещаемости студентов в учебное заведение в зависимости от негативных факторов&lt;br /&gt;
}}&lt;br /&gt;
[[Категория:ИНДОР-211]]&lt;br /&gt;
[[Категория:UserMGPU]]&lt;/div&gt;</summary>
		<author><name>Pocrovskii Alexander</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Pocrovskii_Alexander&amp;diff=44447</id>
		<title>Участник:Pocrovskii Alexander</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Pocrovskii_Alexander&amp;diff=44447"/>
		<updated>2026-02-24T15:25:19Z</updated>

		<summary type="html">&lt;p&gt;Pocrovskii Alexander: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{UserMGPU&lt;br /&gt;
|Description=Студент МГПУ, ИНДОР-211&lt;br /&gt;
|Field_of_knowledge=Математика, Физика, Информатика, Робототехника, Педагогика, Образование, Искусственный интеллект, Интернет вещей, Game design, Геометрия, Спорт, Игра, Картография, Моделирование, Музыка, Философия, Медиа&lt;br /&gt;
|Environment=Google Docs, Google Forms, Canva, Adobe Photoshop, Adobe Indesign, Adobe Premiere Pro, Blender, unity, Visual Studio Code&lt;br /&gt;
|Position=Бакалавриат&lt;br /&gt;
|Profile=Информатика, Робототехника&lt;br /&gt;
|PedDirection=Да&lt;br /&gt;
|Community=GitHub, ИЦО, МГПУ&lt;br /&gt;
|Виды_спорта=кендо, кюдо&lt;br /&gt;
|Working_On=Модель посещаемости студентов в учебное заведение в зависимости от негативных факторов&lt;br /&gt;
}}&lt;br /&gt;
[[Категория:ИНДОР-211]]&lt;br /&gt;
[[Категория:UserMGPU]]&lt;/div&gt;</summary>
		<author><name>Pocrovskii Alexander</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Pocrovskii_Alexander&amp;diff=44446</id>
		<title>Участник:Pocrovskii Alexander</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Pocrovskii_Alexander&amp;diff=44446"/>
		<updated>2026-02-24T15:16:10Z</updated>

		<summary type="html">&lt;p&gt;Pocrovskii Alexander: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{UserMGPU&lt;br /&gt;
|Description=Студент МГПУ, ИНДОР-211&lt;br /&gt;
|Field_of_knowledge=Математика, Физика, Информатика, Робототехника, Педагогика, Образование, Искусственный интеллект, Интернет вещей, Game design, Геометрия, Спорт, Игра, Картография, Моделирование, Музыка, Философия, Медиа&lt;br /&gt;
|Position=Бакалавриат&lt;br /&gt;
|Profile=Информатика, Робототехника&lt;br /&gt;
|PedDirection=Да&lt;br /&gt;
|Working_On=Модель посещаемости студентов в учебное заведение в зависимости от негативных факторов&lt;br /&gt;
}}&lt;br /&gt;
[[Категория:ИНДОР-211]]&lt;br /&gt;
[[Категория:UserMGPU]]&lt;/div&gt;</summary>
		<author><name>Pocrovskii Alexander</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=ARQuest&amp;diff=21308</id>
		<title>ARQuest</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=ARQuest&amp;diff=21308"/>
		<updated>2024-11-03T15:48:21Z</updated>

		<summary type="html">&lt;p&gt;Pocrovskii Alexander: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DEG&lt;br /&gt;
|Description=Пирату нужно исследовать остров, искать сундук с сокровищами и открыть его, минуя все препятствия на пути.&lt;br /&gt;
|Website=https://www.xdprod.com/arquest/?lg=en&lt;br /&gt;
|Running_on=iOS, Android&lt;br /&gt;
|game_genre=Головоломка&lt;br /&gt;
|Ages=7&lt;br /&gt;
|Language_Ru_Eng=English&lt;br /&gt;
|Affective_tasks=Провести пирата по острову и помочь ему найти сундук с сокровищами за минимальное количество шагов.&lt;br /&gt;
|FieldActivity=Computational Thinker&lt;br /&gt;
|Competences=Базовые навыки программирования&lt;br /&gt;
|Assistance tools=Видео-пояснения&lt;br /&gt;
|Developer=Эгейский университет, Сирос, Греция&lt;br /&gt;
|Difficult=Нужны физические объекты, необходим мобильный телефон, не все ОС поддерживают.&lt;br /&gt;
|distant_collab=Нет&lt;br /&gt;
}}&lt;br /&gt;
ARQuest разработана для того, чтобы обучать детей в возрасте 9-10 лет навыкам решения задач по программированию в мотивирующей и приятной форме. &lt;br /&gt;
&lt;br /&gt;
Цель игры – помочь им развить навыки вычислительного мышления через геймифицированную деятельность, где учащиеся сотрудничают в командах, создают задачи и пытаются решить их через последовательность действий. &lt;br /&gt;
&lt;br /&gt;
ARQuest поддерживает несколько &amp;quot;игровых столов&amp;quot;, на которых одновременно могут проводиться независимые игры. В каждой игре участвуют две соревнующиеся команды:&lt;br /&gt;
*  “дизайнеры”, целью которых является создание проблем для своих оппонентов,&lt;br /&gt;
* “решатели”, которые пытаются преодолеть трудности.&lt;br /&gt;
&lt;br /&gt;
Соответственно, игровой стол располагается в двух противоположных сторонах: сторона дизайнера и сторона решателя, где сотрудничают соответствующие команды. Каждый игрок, независимо от команды, может использовать мобильное устройство для просмотра дополненных цифровых частей игры.&lt;br /&gt;
&lt;br /&gt;
Сторона дизайнера включает в себя физическую доску и набор игровых жетонов. На доске изображена сетка, представляющая игровой этап, и дизайнеры должны выбрать и разместить на ней ряд игровых жетонов, чтобы создать задачу. Каждый жетон представляет собой игровой элемент, который можно увидеть через мобильное устройство в AR. Существует три различных типа игровых элементов: элементы, которые нужно подбирать, элементы, которые нужно избегать, и препятствия, которые можно преодолеть, используя первый тип элементов. Когда дизайнеры согласуют задачу, они могут отправить ее решателям.&lt;br /&gt;
&lt;br /&gt;
На стороне решателей находится один жетон задачи и несколько жетонов команд. Игроки могут посмотреть на весь игровой этап и его элементы через свои мобильные устройства, если их камера направлена на жетон задачи. Они могут выбрать соответствующие команды для планирования своего решения и расположить их на столе. Каждая команда видна непосредственно на жетоне, поэтому им не нужно смотреть на них через свои мобильные устройства. Использование команд нацелено на то, чтобы направить героя по следующим уровням, используя правильную последовательность действий. Есть четыре типа действий: перемещение, поворот (влево или вправо), подхват и бросок. Когда участники готовы, они могут отсканировать свои решения, направив камеру телефона на жетоны. Затем все устройства решателей автоматически обновляются последним решением. Кроме того, каждый из решателей может выполнить свое решение, чтобы узнать, успешно оно или нет. Последовательность кода начинает выполняться на цифровом табло, и участники могут видеть развитие своего плана, получая при этом визуальную обратную связь о своих командах. Команды, которые были успешно выполнены, отображаются зеленым цветом, текущая выполняемая команда отображается светящимся белым цветом, а если команда не выполняется, она отображается красным цветом, и выполнение останавливается.&lt;/div&gt;</summary>
		<author><name>Pocrovskii Alexander</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%91%D0%B0%D0%BA%D0%B0%D0%BB%D0%B0%D0%B2%D1%80%D0%B8%D0%B0%D1%82&amp;diff=21307</id>
		<title>Бакалавриат</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%91%D0%B0%D0%BA%D0%B0%D0%BB%D0%B0%D0%B2%D1%80%D0%B8%D0%B0%D1%82&amp;diff=21307"/>
		<updated>2024-11-03T15:38:22Z</updated>

		<summary type="html">&lt;p&gt;Pocrovskii Alexander: Новая страница: «{{Понятие |similar_concepts=Бакалавр }} Бакалавриат - это первая ступень высшего образования, которая присуждается после четырех или пяти лет обучения.   Основано на глубоком изучении определенной области знаний, формирование теоретических и практических навы...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Понятие&lt;br /&gt;
|similar_concepts=Бакалавр&lt;br /&gt;
}}&lt;br /&gt;
Бакалавриат - это первая ступень высшего образования, которая присуждается после четырех или пяти лет обучения. &lt;br /&gt;
Основано на глубоком изучении определенной области знаний, формирование теоретических и практических навыков.&lt;br /&gt;
По завершению бакалавриата человеку присваивают квалификацию, позволяющую работать в своей специализации.&lt;br /&gt;
&lt;br /&gt;
Для поступления в бакалавриат требуется сдавать Единый государственный экзамен (ЕГЭ).&lt;/div&gt;</summary>
		<author><name>Pocrovskii Alexander</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C_%D0%BF%D0%BE%D1%81%D0%B5%D1%89%D0%B0%D0%B5%D0%BC%D0%BE%D1%81%D1%82%D0%B8_%D1%81%D1%82%D1%83%D0%B4%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D0%B2_%D1%83%D1%87%D0%B5%D0%B1%D0%BD%D0%BE%D0%B5_%D0%B7%D0%B0%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D0%B7%D0%B0%D0%B2%D0%B8%D1%81%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8_%D0%BE%D1%82_%D0%BD%D0%B5%D0%B3%D0%B0%D1%82%D0%B8%D0%B2%D0%BD%D1%8B%D1%85_%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=21235</id>
		<title>Модель посещаемости студентов в учебное заведение в зависимости от негативных факторов</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C_%D0%BF%D0%BE%D1%81%D0%B5%D1%89%D0%B0%D0%B5%D0%BC%D0%BE%D1%81%D1%82%D0%B8_%D1%81%D1%82%D1%83%D0%B4%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D0%B2_%D1%83%D1%87%D0%B5%D0%B1%D0%BD%D0%BE%D0%B5_%D0%B7%D0%B0%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D0%B7%D0%B0%D0%B2%D0%B8%D1%81%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8_%D0%BE%D1%82_%D0%BD%D0%B5%D0%B3%D0%B0%D1%82%D0%B8%D0%B2%D0%BD%D1%8B%D1%85_%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=21235"/>
		<updated>2024-11-02T11:33:26Z</updated>

		<summary type="html">&lt;p&gt;Pocrovskii Alexander: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Model&lt;br /&gt;
|Description=Модель посещаемости учащихся школы&lt;br /&gt;
|Field_of_knowledge=Математика, Информатика, Образование, Геометрия, Моделирование&lt;br /&gt;
|Website=https://www.slnova.org/Siverl/projects/927877/&lt;br /&gt;
|Inventor=Pocrovskii Alexander&lt;br /&gt;
|Environment=StarLogo Nova&lt;br /&gt;
|Student-created=Да&lt;br /&gt;
}}&lt;br /&gt;
[[Категория:ИНДОР-211]]&lt;/div&gt;</summary>
		<author><name>Pocrovskii Alexander</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C_%D0%BF%D0%BE%D1%81%D0%B5%D1%89%D0%B0%D0%B5%D0%BC%D0%BE%D1%81%D1%82%D0%B8_%D1%81%D1%82%D1%83%D0%B4%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D0%B2_%D1%83%D1%87%D0%B5%D0%B1%D0%BD%D0%BE%D0%B5_%D0%B7%D0%B0%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D0%B7%D0%B0%D0%B2%D0%B8%D1%81%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8_%D0%BE%D1%82_%D0%BD%D0%B5%D0%B3%D0%B0%D1%82%D0%B8%D0%B2%D0%BD%D1%8B%D1%85_%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=21234</id>
		<title>Модель посещаемости студентов в учебное заведение в зависимости от негативных факторов</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C_%D0%BF%D0%BE%D1%81%D0%B5%D1%89%D0%B0%D0%B5%D0%BC%D0%BE%D1%81%D1%82%D0%B8_%D1%81%D1%82%D1%83%D0%B4%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D0%B2_%D1%83%D1%87%D0%B5%D0%B1%D0%BD%D0%BE%D0%B5_%D0%B7%D0%B0%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D0%B7%D0%B0%D0%B2%D0%B8%D1%81%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8_%D0%BE%D1%82_%D0%BD%D0%B5%D0%B3%D0%B0%D1%82%D0%B8%D0%B2%D0%BD%D1%8B%D1%85_%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=21234"/>
		<updated>2024-11-02T11:27:56Z</updated>

		<summary type="html">&lt;p&gt;Pocrovskii Alexander: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Model&lt;br /&gt;
|Description=Модель посещаемости учащихся школы&lt;br /&gt;
|Field_of_knowledge=Математика, География, Информатика, Образование, Моделирование&lt;br /&gt;
|Website=https://www.slnova.org/Siverl/projects/927877/&lt;br /&gt;
|Inventor=Pocrovskii Alexander&lt;br /&gt;
|Environment=StarLogo Nova&lt;br /&gt;
|Student-created=Да&lt;br /&gt;
}}&lt;br /&gt;
[[Категория:ИНДОР-211]]&lt;/div&gt;</summary>
		<author><name>Pocrovskii Alexander</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Pocrovskii_Alexander&amp;diff=21233</id>
		<title>Участник:Pocrovskii Alexander</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Pocrovskii_Alexander&amp;diff=21233"/>
		<updated>2024-11-02T11:26:35Z</updated>

		<summary type="html">&lt;p&gt;Pocrovskii Alexander: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{UserMGPU&lt;br /&gt;
|Description=Студент МГПУ&lt;br /&gt;
|Field_of_knowledge=Математика, Физика, Информатика, Робототехника, Педагогика, Образование, Искусственный интеллект, Интернет вещей, Game design, Геометрия, Игра, Картография, Моделирование&lt;br /&gt;
|Position=Бакалавриат&lt;br /&gt;
|Profile=Информатика, Робототехника&lt;br /&gt;
|PedDirection=Да&lt;br /&gt;
|Working_On=Модель посещаемости студентов в учебное заведение в зависимости от негативных факторов&lt;br /&gt;
}}&lt;br /&gt;
[[Категория:ИНДОР-211]]&lt;br /&gt;
[[Категория:UserMGPU]]&lt;/div&gt;</summary>
		<author><name>Pocrovskii Alexander</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C_%D0%BF%D0%BE%D1%81%D0%B5%D1%89%D0%B0%D0%B5%D0%BC%D0%BE%D1%81%D1%82%D0%B8_%D1%81%D1%82%D1%83%D0%B4%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D0%B2_%D1%83%D1%87%D0%B5%D0%B1%D0%BD%D0%BE%D0%B5_%D0%B7%D0%B0%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D0%B7%D0%B0%D0%B2%D0%B8%D1%81%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8_%D0%BE%D1%82_%D0%BD%D0%B5%D0%B3%D0%B0%D1%82%D0%B8%D0%B2%D0%BD%D1%8B%D1%85_%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=21227</id>
		<title>Модель посещаемости студентов в учебное заведение в зависимости от негативных факторов</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C_%D0%BF%D0%BE%D1%81%D0%B5%D1%89%D0%B0%D0%B5%D0%BC%D0%BE%D1%81%D1%82%D0%B8_%D1%81%D1%82%D1%83%D0%B4%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D0%B2_%D1%83%D1%87%D0%B5%D0%B1%D0%BD%D0%BE%D0%B5_%D0%B7%D0%B0%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D0%B7%D0%B0%D0%B2%D0%B8%D1%81%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8_%D0%BE%D1%82_%D0%BD%D0%B5%D0%B3%D0%B0%D1%82%D0%B8%D0%B2%D0%BD%D1%8B%D1%85_%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=21227"/>
		<updated>2024-11-02T10:41:13Z</updated>

		<summary type="html">&lt;p&gt;Pocrovskii Alexander: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Model&lt;br /&gt;
|Description=Модель посещаемости учащихся школы&lt;br /&gt;
|Field_of_knowledge=Математика, География, Информатика, Образование, Моделирование&lt;br /&gt;
|Website=https://www.slnova.org/Siverl/projects/927877/&lt;br /&gt;
|Inventor=Pokrovskii Alexander&lt;br /&gt;
|Environment=StarLogo Nova&lt;br /&gt;
|Student-created=Да&lt;br /&gt;
}}&lt;br /&gt;
[[Категория:ИНДОР-211]]&lt;/div&gt;</summary>
		<author><name>Pocrovskii Alexander</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C_%D0%BF%D0%BE%D1%81%D0%B5%D1%89%D0%B0%D0%B5%D0%BC%D0%BE%D1%81%D1%82%D0%B8_%D1%81%D1%82%D1%83%D0%B4%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D0%B2_%D1%83%D1%87%D0%B5%D0%B1%D0%BD%D0%BE%D0%B5_%D0%B7%D0%B0%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D0%B7%D0%B0%D0%B2%D0%B8%D1%81%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8_%D0%BE%D1%82_%D0%BD%D0%B5%D0%B3%D0%B0%D1%82%D0%B8%D0%B2%D0%BD%D1%8B%D1%85_%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=21225</id>
		<title>Модель посещаемости студентов в учебное заведение в зависимости от негативных факторов</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C_%D0%BF%D0%BE%D1%81%D0%B5%D1%89%D0%B0%D0%B5%D0%BC%D0%BE%D1%81%D1%82%D0%B8_%D1%81%D1%82%D1%83%D0%B4%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D0%B2_%D1%83%D1%87%D0%B5%D0%B1%D0%BD%D0%BE%D0%B5_%D0%B7%D0%B0%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D0%B7%D0%B0%D0%B2%D0%B8%D1%81%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8_%D0%BE%D1%82_%D0%BD%D0%B5%D0%B3%D0%B0%D1%82%D0%B8%D0%B2%D0%BD%D1%8B%D1%85_%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=21225"/>
		<updated>2024-11-02T10:27:00Z</updated>

		<summary type="html">&lt;p&gt;Pocrovskii Alexander: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Model&lt;br /&gt;
|Description=Модель посещаемости учащихся школы&lt;br /&gt;
|Field_of_knowledge=Математика, География, Информатика, Образование, Моделирование&lt;br /&gt;
|Website=https://www.slnova.org/Siverl/projects/927877/&lt;br /&gt;
|Inventor=Pokrovskii Alexander&lt;br /&gt;
|Environment=StarLogo Nova&lt;br /&gt;
|Student-created=Да&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Pocrovskii Alexander</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C_%D0%BF%D0%BE%D1%81%D0%B5%D1%89%D0%B0%D0%B5%D0%BC%D0%BE%D1%81%D1%82%D0%B8_%D1%81%D1%82%D1%83%D0%B4%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D0%B2_%D1%83%D1%87%D0%B5%D0%B1%D0%BD%D0%BE%D0%B5_%D0%B7%D0%B0%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D0%B7%D0%B0%D0%B2%D0%B8%D1%81%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8_%D0%BE%D1%82_%D0%BD%D0%B5%D0%B3%D0%B0%D1%82%D0%B8%D0%B2%D0%BD%D1%8B%D1%85_%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=21224</id>
		<title>Модель посещаемости студентов в учебное заведение в зависимости от негативных факторов</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C_%D0%BF%D0%BE%D1%81%D0%B5%D1%89%D0%B0%D0%B5%D0%BC%D0%BE%D1%81%D1%82%D0%B8_%D1%81%D1%82%D1%83%D0%B4%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D0%B2_%D1%83%D1%87%D0%B5%D0%B1%D0%BD%D0%BE%D0%B5_%D0%B7%D0%B0%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D0%B7%D0%B0%D0%B2%D0%B8%D1%81%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8_%D0%BE%D1%82_%D0%BD%D0%B5%D0%B3%D0%B0%D1%82%D0%B8%D0%B2%D0%BD%D1%8B%D1%85_%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=21224"/>
		<updated>2024-11-02T10:25:22Z</updated>

		<summary type="html">&lt;p&gt;Pocrovskii Alexander: Новая страница: «{{Model |Field_of_knowledge=Математика, География, Информатика, Образование, Моделирование |Website=https://www.slnova.org/Siverl/projects/927877/ |Inventor=Pokrovskii Alexander |Environment=StarLogo Nova |Student-created=Да }}»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Model&lt;br /&gt;
|Field_of_knowledge=Математика, География, Информатика, Образование, Моделирование&lt;br /&gt;
|Website=https://www.slnova.org/Siverl/projects/927877/&lt;br /&gt;
|Inventor=Pokrovskii Alexander&lt;br /&gt;
|Environment=StarLogo Nova&lt;br /&gt;
|Student-created=Да&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Pocrovskii Alexander</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Pocrovskii_Alexander&amp;diff=21220</id>
		<title>Участник:Pocrovskii Alexander</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Pocrovskii_Alexander&amp;diff=21220"/>
		<updated>2024-11-02T10:00:29Z</updated>

		<summary type="html">&lt;p&gt;Pocrovskii Alexander: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{UserMGPU&lt;br /&gt;
|Description=Студент МГПУ&lt;br /&gt;
|Field_of_knowledge=Математика, Физика, География, Информатика, Робототехника, Педагогика, Искусственный интеллект, Интернет вещей, Game design, Игра, Моделирование&lt;br /&gt;
|Position=Бакалавриат&lt;br /&gt;
|PedDirection=Да&lt;br /&gt;
|Working_On=Модель посещаемости студентов в учебное заведение в зависимости от негативных факторов&lt;br /&gt;
}}&lt;br /&gt;
[[Категория:ИНДОР-211]]&lt;br /&gt;
[[Категория:UserMGPU]]&lt;/div&gt;</summary>
		<author><name>Pocrovskii Alexander</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Pocrovskii_Alexander&amp;diff=20925</id>
		<title>Обсуждение участника:Pocrovskii Alexander</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Pocrovskii_Alexander&amp;diff=20925"/>
		<updated>2024-10-19T10:37:21Z</updated>

		<summary type="html">&lt;p&gt;Pocrovskii Alexander: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Мои работы&lt;br /&gt;
Свойства ODD модели: https://disk.yandex.ru/i/etRzDP03wMOm4Q&lt;/div&gt;</summary>
		<author><name>Pocrovskii Alexander</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Pocrovskii_Alexander&amp;diff=20920</id>
		<title>Обсуждение участника:Pocrovskii Alexander</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Pocrovskii_Alexander&amp;diff=20920"/>
		<updated>2024-10-19T10:28:58Z</updated>

		<summary type="html">&lt;p&gt;Pocrovskii Alexander: Новая страница: «Мои работы»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Мои работы&lt;/div&gt;</summary>
		<author><name>Pocrovskii Alexander</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Pocrovskii_Alexander&amp;diff=20252</id>
		<title>Участник:Pocrovskii Alexander</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Pocrovskii_Alexander&amp;diff=20252"/>
		<updated>2024-10-03T12:39:24Z</updated>

		<summary type="html">&lt;p&gt;Pocrovskii Alexander: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{UserMGPU&lt;br /&gt;
|Description=Студент МГПУ&lt;br /&gt;
|Field_of_knowledge=Информатика, Робототехника, Педагогика, Интернет вещей, Game design&lt;br /&gt;
}}&lt;br /&gt;
[[Категория:ИНДОР-211]]&lt;br /&gt;
[[Категория:UserMGPU]]&lt;/div&gt;</summary>
		<author><name>Pocrovskii Alexander</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Pocrovskii_Alexander&amp;diff=19198</id>
		<title>Участник:Pocrovskii Alexander</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Pocrovskii_Alexander&amp;diff=19198"/>
		<updated>2024-09-07T10:03:33Z</updated>

		<summary type="html">&lt;p&gt;Pocrovskii Alexander: Новая страница: «Категория:ИНДОР-211 Категория:UserMGPU»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Категория:ИНДОР-211]]&lt;br /&gt;
[[Категория:UserMGPU]]&lt;/div&gt;</summary>
		<author><name>Pocrovskii Alexander</name></author>
	</entry>
</feed>