Проект StackExchange, неделя 3
Цели текущей недели
- продолжить исследование своего StackExchange Project, используя средства визуализации и агрегации данных
- начать подготовку итогового отчёта по проекту, систематизировав работу по первым трём неделям и делая содержательные выводы по проекту.
Начиная с этой недели, задание на неделю устанавливает минимальный уровень требований, ваша задача -- изучить и раскрыть особенности своего проекта, задавая содержательные вопросы и используя весь спектр доступных вам средств R и дополнительное чтение для получения на них ответов.
Выполнение отчёта
В связи с неудовлетворительным качеством оформления отчётов, начиная с этой недели мы устанавливаем единый формат отчётов.
- Начиная выполнять задание, скопируйте каталог с шаблоном отчёта
~/materials/stackexchange/00report в свой домашний каталог.
- перейдите в скопированный каталог и установите его в качестве рабочего (меню
More -- Set as a working directory).
- Скопируйте в него файл с бейджамии (badges.csv) для вашего проекта.
- Используя указания в шаблоне отчёта, набирайте код внутри соответствующих окружений.
- По нажатию кнопки Knit HTML RStudio автоматически будет выполнять ваш программный код и вставлять результаты выполнения (текст, таблицы, графики) в отчёт.
- В целях отладки, вы можете выполнять код вручную в консоли R, но рекомендуется набирать его прямо в отчёте и посылать в консоль с помощью кнопки Run или клавиш Control-Enter (по умолчанию выполняют текущую строку кода или выделенный текст).
- В отчёт должен идти только окончательный код. Ручная вставка результатов выполнения и кода на R учитываться не будет.
- Сдача отчёта осуществляется следующим образом:
- в каталог ~/project/ИМЯ_ВАШЕГО_ПРОЕКТА нужно положить следующие файлы:
- файл badges.csv с данными по бейжам для вашего проекта
- файл report.Rmd с отчётом по проекту
- файл report.html, автоматически сгенерированный нажатием кнопки Knit HTML из файла report.Rmd.
- Внимание! Весь код, таблицы с результатами и картинки в отчёте должны быть сгенерированы автоматически.
- Никакие прочие файлы проверяться не будут. Будьте внимательны.
- Проверьте, что при заходе из браузера на страничку doctor10.nosoc.io/projects/ИМЯ_ВАШЕГО_ПРОЕКТА отображается ваш отчёт со всеми иллюстрациями и таблицами.
Задание
0. Подготовка данных.
Загрузите данные своего проекта. Опишите построчно преобразования в нижеприведённом коде (здесь и далее нажмите на синюю полосу для просмотра кода)
library(dplyr)
library(ggplot2)
library(scales)
library(vcd)
badges <- read.csv("badges.csv", header=F)
names(badges) <- c("transID", "userID", "badge", "date")
badges[["userID"]] <- as.factor(badges[["userID"]])
badges[["badge"]] <- as.factor(badges[["badge"]])
badges[["date"]] <- as.POSIXct(badges[["date"]])
badges[["month"]] <- cut(badges[["date"]], "1 month")
badges[["year"]] <- cut(badges[["date"]], "1 year", labels=unique(strftime(badges$date,"%Y")))
1. Изучение динамики получения пользователями бейджей на проекте
Источники:
1.1
- Постройте график числа выданных бейджей по месяцам, исправив код где нужно.
library(ggplot2)
library(scales)
graph = ggplot(badges, aes(date, ..count..))
graph = graph + geom_histogram(fill='green', color="black", alpha=0.2)
graph = graph + scale_x_datetime(labels = date_format("%m-%Y"), breaks="2 month", minor_breaks = date_breaks("1 month"))
graph = graph + theme_bw()
graph = graph + theme(axis.text.x = element_text(angle = 90, hjust = 1))
graph = graph + labs(title = "Получение бейджей по месяцам (проект CrossValidated)", x="Дата", y="Кол-во бейджей")
graph
1.2
- Опишите назначение каждой строки и значение каждого из аргументов (см. источники)
1.3
- С помощью пакета
dplyr создайте data.frame с информацией по бейджам для первого пользователя из ТОП-10.
- Постройте график числа выданных бейджей по месяцам для этого пользователя
- Установите основные метки оси X с разбиением в 1 месяц, вспомогательные метки в 1 неделю.
- Измените цвет заливки столбцов и цвет контура столбцов.
- Соответствующим образом исправьте подписи графика
1.4 Прокомментируйте динамику получения пользователями бейджей на проекте в обоих случаях
2. Структура динамики получения бейджей
2.0 Подготовка данных. Деление на кластеры
Проанализируем качественно-временную структуру получения бейджей.
Для этого разобьём бейджи на 7 групп по частотности.
by_badge <- group_by(badges, badge)
badge.freq <- arrange(dplyr::summarise(by_badge, count=length(unique((userID)))), count)
## разбиение на кластеры
clusters <- kmeans(badge.freq$count, centers=7)
badge.freq$kmeans_break <- factor(clusters$cluster, labels=round(clusters$center,0))
badge.freq$kmeans_break <- reorder(badge.freq$kmeans_break, clusters$centers[clusters$cluster], mean)
levels(badge.freq$kmeans_break) <- 1:7
badge.freq$kmeans_break <- factor(badge.freq$kmeans_break)
## конец разбиения на кластеры
- Построчно прокомментируйте код (кроме блока разбиения на кластеры). Используйте справку по функциям и пошаговые выполнение, проверяя входы и выходы.
- Приведите top и bottom-10 таблицы badge.freq. Прокомментируйте
- (**) Прокомментируйте блок разбиения на кластеры, используя справку и информацию о методе k-средних
- (**) В чём возможные преимущества и недостатки разбиения на группы с использованием кластеризации по сравнению с равномерным разбиением с помощью
cut?
Hint:
Разобранный пример кластеризации http://mnemstudio.org/clustering-k-means-example-1.htm (у нас всё ещё проще, так как координата всего одна).
И картинка в помощь (Вертикальные линии на картинке — получившиеся центры ваших кластеров):
g <- ggplot(data=badge.freq) + geom_density(aes(count))
g <- g + geom_vline(xintercept = clusters$centers, color=clusters$centers)
g
2.1 Общая качественно-временная структура получения бейджей
Добавим к набору данных о бейджах информацию о группе частостности и проанализируем изменения по группам частотности во времени.
badges.clust <- plyr::join(badges, badge.freq)
plot.new()
mosaic(year ~ kmeans_break, data=badges.clust, gp = shading_max)
2.2 (*) Персональная качественно-временная структура получения бейджей
- С помощью пакета
dplyr создайте data.frame с информацией по бейджам из набора данных с категорией бейджей (badges.clust) для пользователя с максимальным числом бейджей.
- Постройте мозаичный график (см. 2.1). Измените масштаб делений по времени на полгода, 3 или 2 месяца, при необходимости (создайте соответствующий столбец при помощи функции
cut).
- (*) О чём говорит нам такой график для конкретного пользователя и в чем отличие от анализа динамики в целом? Прокомментируйте
- (**) Используйте график из 1.3, чтобы проиллюстрировать динамику бейджей по категориям для этого пользователя в натуральных единицах. Для этого перенесите
fill из geom_histogram в aes и укажите ему фактор категории бейджей в качестве значения. Какую дополнительную информацию несёт этот график по сравнению с мозаичным, а какую стало получить сложнее?