<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>http://digida.mgpu.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%90%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7_%D0%BD%D0%B0%D0%B8%D0%B1%D0%BE%D0%BB%D0%B5%D0%B5_%D0%BF%D0%BE%D1%81%D0%B5%D1%89%D0%B0%D0%B5%D0%BC%D1%8B%D1%85_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86_%D0%BF%D0%BE%D1%80%D1%82%D0%B0%D0%BB%D0%B0</id>
	<title>Анализ наиболее посещаемых страниц портала - История изменений</title>
	<link rel="self" type="application/atom+xml" href="http://digida.mgpu.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%90%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7_%D0%BD%D0%B0%D0%B8%D0%B1%D0%BE%D0%BB%D0%B5%D0%B5_%D0%BF%D0%BE%D1%81%D0%B5%D1%89%D0%B0%D0%B5%D0%BC%D1%8B%D1%85_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86_%D0%BF%D0%BE%D1%80%D1%82%D0%B0%D0%BB%D0%B0"/>
	<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%90%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7_%D0%BD%D0%B0%D0%B8%D0%B1%D0%BE%D0%BB%D0%B5%D0%B5_%D0%BF%D0%BE%D1%81%D0%B5%D1%89%D0%B0%D0%B5%D0%BC%D1%8B%D1%85_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86_%D0%BF%D0%BE%D1%80%D1%82%D0%B0%D0%BB%D0%B0&amp;action=history"/>
	<updated>2026-10-08T23:21:51Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%90%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7_%D0%BD%D0%B0%D0%B8%D0%B1%D0%BE%D0%BB%D0%B5%D0%B5_%D0%BF%D0%BE%D1%81%D0%B5%D1%89%D0%B0%D0%B5%D0%BC%D1%8B%D1%85_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86_%D0%BF%D0%BE%D1%80%D1%82%D0%B0%D0%BB%D0%B0&amp;diff=46013&amp;oldid=prev</id>
		<title>Гренадер Дмитрий: /* Результат */</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%90%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7_%D0%BD%D0%B0%D0%B8%D0%B1%D0%BE%D0%BB%D0%B5%D0%B5_%D0%BF%D0%BE%D1%81%D0%B5%D1%89%D0%B0%D0%B5%D0%BC%D1%8B%D1%85_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86_%D0%BF%D0%BE%D1%80%D1%82%D0%B0%D0%BB%D0%B0&amp;diff=46013&amp;oldid=prev"/>
		<updated>2026-04-13T16:03:33Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Результат&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw-interface=&quot;&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Предыдущая версия&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Версия от 19:03, 13 апреля 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l317&quot;&gt;Строка 317:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 317:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;6) Строит и сохраняет 4 графика в папке saved_plots_page_views.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;6) Строит и сохраняет 4 графика в папке saved_plots_page_views.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Файл:Подборка.png|&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;мини&lt;/del&gt;]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Файл:Подборка.png|&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;800px&lt;/ins&gt;]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Файл:Результат.png|&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;мини&lt;/del&gt;]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Файл:Результат.png|&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;800px&lt;/ins&gt;]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;----&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;----&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Категория:BigDataWorks]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Категория:BigDataWorks]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Категория: RRecipe]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Категория: RRecipe]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Гренадер Дмитрий</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%90%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7_%D0%BD%D0%B0%D0%B8%D0%B1%D0%BE%D0%BB%D0%B5%D0%B5_%D0%BF%D0%BE%D1%81%D0%B5%D1%89%D0%B0%D0%B5%D0%BC%D1%8B%D1%85_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86_%D0%BF%D0%BE%D1%80%D1%82%D0%B0%D0%BB%D0%B0&amp;diff=46012&amp;oldid=prev</id>
		<title>Гренадер Дмитрий: Новая страница: «=== Код === &lt;syntaxhighlight lang=&quot;R&quot; line&gt;  library(httr) library(jsonlite) library(dplyr) library(lubridate) library(tidyr) library(ggplot2) library(patchwork)  # Корректный URL API api_url &lt;- &quot;https://digida.mgpu.ru/api.php&quot;  # Безопасное определение функции (если ещё не существует) if (!exists(&quot;get_mw_data&quot;)) {   get_mw_data &lt;- function(action, params) {     query_params &lt;- c(action = action, fo...»</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%90%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7_%D0%BD%D0%B0%D0%B8%D0%B1%D0%BE%D0%BB%D0%B5%D0%B5_%D0%BF%D0%BE%D1%81%D0%B5%D1%89%D0%B0%D0%B5%D0%BC%D1%8B%D1%85_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86_%D0%BF%D0%BE%D1%80%D1%82%D0%B0%D0%BB%D0%B0&amp;diff=46012&amp;oldid=prev"/>
		<updated>2026-04-13T16:02:51Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: «=== Код === &amp;lt;syntaxhighlight lang=&amp;quot;R&amp;quot; line&amp;gt;  library(httr) library(jsonlite) library(dplyr) library(lubridate) library(tidyr) library(ggplot2) library(patchwork)  # Корректный URL API api_url &amp;lt;- &amp;quot;https://digida.mgpu.ru/api.php&amp;quot;  # Безопасное определение функции (если ещё не существует) if (!exists(&amp;quot;get_mw_data&amp;quot;)) {   get_mw_data &amp;lt;- function(action, params) {     query_params &amp;lt;- c(action = action, fo...»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;=== Код ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;R&amp;quot; line&amp;gt;&lt;br /&gt;
&lt;br /&gt;
library(httr)&lt;br /&gt;
library(jsonlite)&lt;br /&gt;
library(dplyr)&lt;br /&gt;
library(lubridate)&lt;br /&gt;
library(tidyr)&lt;br /&gt;
library(ggplot2)&lt;br /&gt;
library(patchwork)&lt;br /&gt;
&lt;br /&gt;
# Корректный URL API&lt;br /&gt;
api_url &amp;lt;- &amp;quot;https://digida.mgpu.ru/api.php&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Безопасное определение функции (если ещё не существует)&lt;br /&gt;
if (!exists(&amp;quot;get_mw_data&amp;quot;)) {&lt;br /&gt;
  get_mw_data &amp;lt;- function(action, params) {&lt;br /&gt;
    query_params &amp;lt;- c(action = action, format = &amp;quot;json&amp;quot;, params)&lt;br /&gt;
    response &amp;lt;- GET(api_url, query = query_params)&lt;br /&gt;
    &lt;br /&gt;
    # Дополнительная проверка типа ответа&lt;br /&gt;
    if (http_type(response) != &amp;quot;application/json&amp;quot;) {&lt;br /&gt;
      warning(&amp;quot;Ответ не в формате JSON&amp;quot;)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    stop_for_status(response)&lt;br /&gt;
    fromJSON(content(response, &amp;quot;text&amp;quot;))&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# === ДИАГНОСТИКА API ===&lt;br /&gt;
print(&amp;quot;=== ДИАГНОСТИКА API DIGIDA ===&amp;quot;)&lt;br /&gt;
print(&amp;quot;Проверяем доступность API...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Шаг 1: базовый запрос для проверки API&lt;br /&gt;
data_loaded &amp;lt;- FALSE&lt;br /&gt;
page_views &amp;lt;- NULL&lt;br /&gt;
&lt;br /&gt;
tryCatch({&lt;br /&gt;
  test_response &amp;lt;- get_mw_data(&amp;quot;query&amp;quot;, list(&lt;br /&gt;
    meta = &amp;quot;siteinfo&amp;quot;,&lt;br /&gt;
    siprop = &amp;quot;general&amp;quot;&lt;br /&gt;
  ))&lt;br /&gt;
  print(&amp;quot;✓ API доступно!&amp;quot;)&lt;br /&gt;
  print(paste(&amp;quot;Название сайта:&amp;quot;, test_response$query$general$sitename))&lt;br /&gt;
}, error = function(e) {&lt;br /&gt;
  stop(paste(&amp;quot;❌ API недоступно:&amp;quot;, e$message, &amp;quot;\nПроверьте URL:&amp;quot;, api_url))&lt;br /&gt;
})&lt;br /&gt;
&lt;br /&gt;
# Шаг 2: пробуем получить данные через recentchanges (косвенный показатель активности)&lt;br /&gt;
tryCatch({&lt;br /&gt;
  print(&amp;quot;Пробуем получить данные о недавних изменениях...&amp;quot;)&lt;br /&gt;
  page_views &amp;lt;- get_mw_data(&amp;quot;query&amp;quot;, list(&lt;br /&gt;
    list = &amp;quot;recentchanges&amp;quot;,&lt;br /&gt;
    rclimit = &amp;quot;1000&amp;quot;,&lt;br /&gt;
    rcprop = &amp;quot;title|timestamp|user|comment&amp;quot;,&lt;br /&gt;
    rcshow = &amp;quot;!bot&amp;quot;,&lt;br /&gt;
    rcend = format(Sys.Date() - 365, &amp;quot;%Y%m%d%H%M%S&amp;quot;)&lt;br /&gt;
  ))&lt;br /&gt;
  &lt;br /&gt;
  if (!is.null(page_views$query$recentchanges)) {&lt;br /&gt;
    print(&amp;quot;✓ Данные получены через recentchanges&amp;quot;)&lt;br /&gt;
    data_loaded &amp;lt;- TRUE&lt;br /&gt;
  } else {&lt;br /&gt;
    warning(&amp;quot;В ответе API нет данных recentchanges&amp;quot;)&lt;br /&gt;
  }&lt;br /&gt;
}, error = function(e) {&lt;br /&gt;
  print(paste(&amp;quot;Ошибка при запросе recentchanges:&amp;quot;, e$message))&lt;br /&gt;
})&lt;br /&gt;
&lt;br /&gt;
if (!data_loaded) {&lt;br /&gt;
  stop(&amp;quot;Не удалось получить данные. Проверьте доступность API и параметры запроса.&amp;quot;)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Проверка прав на запись в текущей директории&lt;br /&gt;
can_write &amp;lt;- file.access(getwd(), mode = 2) == 0&lt;br /&gt;
if (!can_write) {&lt;br /&gt;
  stop(&amp;quot;Нет прав на запись в текущую рабочую директорию. Выберите другую папку.&amp;quot;)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# === ОЧИСТКА ДАННЫХ ===&lt;br /&gt;
clean_data &amp;lt;- page_views$query$recentchanges %&amp;gt;%&lt;br /&gt;
  as_tibble() %&amp;gt;%&lt;br /&gt;
  mutate(&lt;br /&gt;
    timestamp = parse_date_time(&lt;br /&gt;
      timestamp,&lt;br /&gt;
      orders = c(&amp;quot;YmdHMS&amp;quot;, &amp;quot;YmdHM&amp;quot;, &amp;quot;ymdHMS&amp;quot;, &amp;quot;ymdHM&amp;quot;, &amp;quot;U&amp;quot;),&lt;br /&gt;
      quiet = TRUE&lt;br /&gt;
    ),&lt;br /&gt;
    date = as.Date(timestamp),&lt;br /&gt;
    day_of_week = wday(timestamp, label = TRUE, abbr = FALSE),&lt;br /&gt;
    hour_of_day = hour(timestamp),&lt;br /&gt;
    month = month(timestamp, label = TRUE)&lt;br /&gt;
  ) %&amp;gt;%&lt;br /&gt;
  filter(!is.na(timestamp), date &amp;gt;= Sys.Date() - 365) %&amp;gt;%&lt;br /&gt;
  select(title, timestamp, date, day_of_week, hour_of_day, month, user)&lt;br /&gt;
&lt;br /&gt;
# Проверка на пустые данные&lt;br /&gt;
if (nrow(clean_data) == 0) {&lt;br /&gt;
  stop(&amp;quot;Очищенные данные пусты. Проверьте параметры запроса к API и формат дат.&amp;quot;)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
print(paste(&amp;quot;Обработано записей о действиях:&amp;quot;, nrow(clean_data)))&lt;br /&gt;
&lt;br /&gt;
# === АГРЕГАЦИЯ И АНАЛИЗ ===&lt;br /&gt;
page_summary &amp;lt;- clean_data %&amp;gt;%&lt;br /&gt;
  group_by(title) %&amp;gt;%&lt;br /&gt;
  summarise(&lt;br /&gt;
    total_actions = n(),&lt;br /&gt;
    unique_users = n_distinct(user),&lt;br /&gt;
    first_action = min(timestamp),&lt;br /&gt;
    last_action = max(timestamp)&lt;br /&gt;
  ) %&amp;gt;%&lt;br /&gt;
  arrange(desc(total_actions))&lt;br /&gt;
&lt;br /&gt;
top_pages &amp;lt;- page_summary %&amp;gt;% head(10)&lt;br /&gt;
&lt;br /&gt;
monthly_views &amp;lt;- clean_data %&amp;gt;%&lt;br /&gt;
  group_by(month) %&amp;gt;%&lt;br /&gt;
  summarise(total_actions = n())&lt;br /&gt;
&lt;br /&gt;
weekly_views &amp;lt;- clean_data %&amp;gt;%&lt;br /&gt;
  group_by(day_of_week) %&amp;gt;%&lt;br /&gt;
  summarise(actions = n())&lt;br /&gt;
&lt;br /&gt;
hourly_views &amp;lt;- clean_data %&amp;gt;%&lt;br /&gt;
  group_by(hour_of_day) %&amp;gt;%&lt;br /&gt;
  summarise(actions = n())&lt;br /&gt;
&lt;br /&gt;
# === ПОСТРОЕНИЕ ГРАФИКОВ ===&lt;br /&gt;
p1 &amp;lt;- ggplot(monthly_views, aes(x = month, y = total_actions)) +&lt;br /&gt;
  geom_bar(stat = &amp;quot;identity&amp;quot;, fill = &amp;quot;steelblue&amp;quot;) +&lt;br /&gt;
  labs(title = &amp;quot;Динамика активности по месяцам&amp;quot;,&lt;br /&gt;
       x = &amp;quot;Месяц&amp;quot;, y = &amp;quot;Количество действий&amp;quot;) +&lt;br /&gt;
  theme_minimal()&lt;br /&gt;
&lt;br /&gt;
p2 &amp;lt;- ggplot(weekly_views, aes(x = day_of_week, y = actions)) +&lt;br /&gt;
  geom_bar(stat = &amp;quot;identity&amp;quot;, fill = &amp;quot;darkgreen&amp;quot;) +&lt;br /&gt;
  labs(title = &amp;quot;Активность по дням недели&amp;quot;,&lt;br /&gt;
       x = &amp;quot;День недели&amp;quot;, y = &amp;quot;Количество действий&amp;quot;) +&lt;br /&gt;
  theme_minimal()&lt;br /&gt;
&lt;br /&gt;
p3 &amp;lt;- ggplot(hourly_views, aes(x = hour_of_day, y = actions)) +&lt;br /&gt;
  geom_line(color = &amp;quot;red&amp;quot;, size = 1) +&lt;br /&gt;
  labs(title = &amp;quot;Активность по часам суток&amp;quot;,&lt;br /&gt;
       x = &amp;quot;Час дня&amp;quot;, y = &amp;quot;Количество действий&amp;quot;) +&lt;br /&gt;
  scale_x_continuous(breaks = 0:23) +&lt;br /&gt;
  theme_minimal()&lt;br /&gt;
&lt;br /&gt;
combined_plot &amp;lt;- (p1 | p2) / p3&lt;br /&gt;
&lt;br /&gt;
# === СОХРАНЕНИЕ РЕЗУЛЬТАТОВ ===&lt;br /&gt;
# Создаём папку для сохранения графиков&lt;br /&gt;
output_dir &amp;lt;- &amp;quot;saved_plots_page_views&amp;quot;&lt;br /&gt;
if (!dir.exists(output_dir)) {&lt;br /&gt;
  dir.create(output_dir)&lt;br /&gt;
  print(paste(&amp;quot;Создана папка для графиков:&amp;quot;, output_dir))&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Функция для безопасного сохранения графиков&lt;br /&gt;
safe_save_plot &amp;lt;- function(plot_obj, filename, width, height, dpi = 300) {&lt;br /&gt;
  if (!inherits(plot_obj, &amp;quot;ggplot&amp;quot;)) {&lt;br /&gt;
    print(paste(&amp;quot;Предупреждение: объект не является графиком ggplot — пропуск сохранения&amp;quot;, filename))&lt;br /&gt;
    return(FALSE)&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  full_path &amp;lt;- file.path(output_dir, filename)&lt;br /&gt;
  &lt;br /&gt;
  tryCatch({&lt;br /&gt;
    ggsave(&lt;br /&gt;
      filename = full_path,&lt;br /&gt;
      plot = plot_obj,&lt;br /&gt;
      width = width,&lt;br /&gt;
      height = height,&lt;br /&gt;
      dpi = dpi,&lt;br /&gt;
      device = &amp;quot;png&amp;quot;&lt;br /&gt;
    )&lt;br /&gt;
    print(paste(&amp;quot;График сохранён:&amp;quot;, normalizePath(full_path)))&lt;br /&gt;
    TRUE&lt;br /&gt;
  }, error = function(e) {&lt;br /&gt;
    print(paste(&amp;quot;Ошибка сохранения&amp;quot;, filename, &amp;quot;:&amp;quot;, e$message))&lt;br /&gt;
    FALSE&lt;br /&gt;
  })&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Сохранение всех графиков&lt;br /&gt;
print(&amp;quot;Начинаем сохранение графиков...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Объединённый график&lt;br /&gt;
safe_save_plot(&lt;br /&gt;
  combined_plot,&lt;br /&gt;
  &amp;quot;activity_analysis_2023_2024.png&amp;quot;,&lt;br /&gt;
  width = 12,&lt;br /&gt;
  height = 8&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
# График по месяцам&lt;br /&gt;
safe_save_plot(&lt;br /&gt;
  p1,&lt;br /&gt;
  &amp;quot;monthly_activity_2023_2024.png&amp;quot;,&lt;br /&gt;
  width = 8,&lt;br /&gt;
  height = 6&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
# График по дням недели&lt;br /&gt;
safe_save_plot(&lt;br /&gt;
  p2,&lt;br /&gt;
  &amp;quot;weekly_activity_2023_2024.png&amp;quot;,&lt;br /&gt;
  width = 8,&lt;br /&gt;
  height = 6&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
# График по часам&lt;br /&gt;
safe_save_plot(&lt;br /&gt;
  p3,&lt;br /&gt;
  &amp;quot;hourly_activity_2023_2024.png&amp;quot;,&lt;br /&gt;
  width = 8,&lt;br /&gt;
  height = 6&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
# Экспорт топ‑10 страниц в CSV&lt;br /&gt;
write.csv(top_pages,&lt;br /&gt;
          file.path(output_dir, &amp;quot;top_10_most_active_pages_2023_2024.csv&amp;quot;),&lt;br /&gt;
          row.names = FALSE)&lt;br /&gt;
print(&amp;quot;Топ‑10 самых активных страниц сохранён в CSV.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Дополнительно: сохраняем полную статистику по страницам&lt;br /&gt;
write.csv(page_summary,&lt;br /&gt;
          file.path(output_dir, &amp;quot;full_page_activity_summary_2023_2024.csv&amp;quot;),&lt;br /&gt;
          row.names = FALSE)&lt;br /&gt;
print(&amp;quot;Полная статистика активности страниц сохранена в CSV.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# === ВЫВОД РЕЗУЛЬТАТОВ В КОНСОЛЬ ===&lt;br /&gt;
print(&amp;quot;\n=== РЕЗУЛЬТАТЫ АНАЛИЗА ===&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Топ-10 самых активных страниц:&amp;quot;)&lt;br /&gt;
print(top_pages)&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;\nОбщая статистика:&amp;quot;)&lt;br /&gt;
print(paste(&amp;quot;Всего обработано действий:&amp;quot;, nrow(clean_data)))&lt;br /&gt;
print(paste(&amp;quot;Уникальных страниц:&amp;quot;, n_distinct(clean_data$title)))&lt;br /&gt;
print(paste(&amp;quot;Уникальных пользователей:&amp;quot;, n_distinct(clean_data$user)))&lt;br /&gt;
print(paste(&amp;quot;Период анализа:&amp;quot;, min(clean_data$date), &amp;quot;по&amp;quot;, max(clean_data$date)))&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;\nАктивность по месяцам:&amp;quot;)&lt;br /&gt;
print(monthly_views)&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;\nАктивность по дням недели:&amp;quot;)&lt;br /&gt;
print(weekly_views)&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;\nАктивность по часам суток:&amp;quot;)&lt;br /&gt;
print(hourly_views)&lt;br /&gt;
&lt;br /&gt;
# === ДОПОЛНИТЕЛЬНАЯ ДИАГНОСТИКА ===&lt;br /&gt;
print(&amp;quot;\n=== ДОПОЛНИТЕЛЬНАЯ ДИАГНОСТИКА ===&amp;quot;)&lt;br /&gt;
print(&amp;quot;Первые 10 записей исходных данных:&amp;quot;)&lt;br /&gt;
print(head(page_views$query$recentchanges, 10))&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;\nСтруктура очищенных данных:&amp;quot;)&lt;br /&gt;
str(clean_data)&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;\nСтатистика пропущенных значений:&amp;quot;)&lt;br /&gt;
print(sapply(clean_data, function(x) sum(is.na(x))))&lt;br /&gt;
&lt;br /&gt;
# === ПРОВЕРКА СОХРАНЁННЫХ ФАЙЛОВ ===&lt;br /&gt;
print(&amp;quot;\n---&amp;quot;)&lt;br /&gt;
print(&amp;quot;Проверка сохранённых файлов:&amp;quot;)&lt;br /&gt;
saved_files &amp;lt;- list.files(output_dir, pattern = &amp;quot;.png|.csv&amp;quot;, full.names = TRUE)&lt;br /&gt;
if (length(saved_files) &amp;gt; 0) {&lt;br /&gt;
  print(&amp;quot;Успешно сохранены файлы:&amp;quot;)&lt;br /&gt;
  for (file in saved_files) {&lt;br /&gt;
    file_info &amp;lt;- file.info(file)&lt;br /&gt;
    print(paste(basename(file), &amp;quot;-&amp;quot;, file_info$size, &amp;quot;байт&amp;quot;))&lt;br /&gt;
  }&lt;br /&gt;
} else {&lt;br /&gt;
  print(&amp;quot;Файлы не найдены в папке&amp;quot;, output_dir)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# === ФИНАЛЬНОЕ СООБЩЕНИЕ ===&lt;br /&gt;
print(&amp;quot;\n&amp;quot; + &amp;quot;=&amp;quot;*50)&lt;br /&gt;
print(&amp;quot;АНАЛИЗ АКТИВНОСТИ СТРАНИЦ ЗАВЕРШЁН УСПЕШНО!&amp;quot;)&lt;br /&gt;
print(&amp;quot;=&amp;quot;*50)&lt;br /&gt;
&lt;br /&gt;
# Дополнительная информация для пользователя&lt;br /&gt;
print(&amp;quot;\nИНФОРМАЦИЯ ДЛЯ ДАЛЬНЕЙШЕЙ РАБОТЫ:&amp;quot;)&lt;br /&gt;
print(&amp;quot;- Графики сохранены в папке:&amp;quot;, output_dir)&lt;br /&gt;
print(&amp;quot;- Основные результаты:&amp;quot;)&lt;br /&gt;
print(&amp;quot;  * top_10_most_active_pages_2023_2024.csv — топ-10 страниц&amp;quot;)&lt;br /&gt;
print(&amp;quot;  * full_page_activity_summary_2023_2024.csv — полная статистика&amp;quot;)&lt;br /&gt;
print(&amp;quot;- Для повторного запуска скрипта:&amp;quot;)&lt;br /&gt;
print(&amp;quot;  * проверьте актуальность URL API&amp;quot;)&lt;br /&gt;
print(&amp;quot;  * при необходимости измените параметры запросов (лимиты, даты)&amp;quot;)&lt;br /&gt;
print(&amp;quot;  * убедитесь в наличии прав на запись в рабочую директорию&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# === ОЧИСТКА ПАМЯТИ (опционально) ===&lt;br /&gt;
# Удаляем большие объекты, если они больше не нужны&lt;br /&gt;
rm(page_views, clean_data)&lt;br /&gt;
gc()  # сборщик мусора — освобождает память&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;\nПамять очищена. Скрипт завершён.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Результат ===&lt;br /&gt;
1)Проверяет доступность API — выполняет тестовый запрос к серверу &lt;br /&gt;
&lt;br /&gt;
2) Загружает данные о недавних изменениях на страницах из API за последний год (365 дней) — собирает сведения о действиях пользователей (редактирование страниц) с фильтрацией ботов.&lt;br /&gt;
&lt;br /&gt;
3) Очищает и структурирует данные.&lt;br /&gt;
&lt;br /&gt;
4) Анализирует активность по разным временным периодам.&lt;br /&gt;
&lt;br /&gt;
5) Выполняет агрегацию по страницам — группирует данные по названию страницы и рассчитывает.&lt;br /&gt;
&lt;br /&gt;
6) Строит и сохраняет 4 графика в папке saved_plots_page_views.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Подборка.png|мини]]&lt;br /&gt;
[[Файл:Результат.png|мини]]&lt;br /&gt;
----&lt;br /&gt;
[[Категория:BigDataWorks]]&lt;br /&gt;
[[Категория: RRecipe]]&lt;/div&gt;</summary>
		<author><name>Гренадер Дмитрий</name></author>
	</entry>
</feed>