Проект StackExchange, неделя 3

Цели текущей недели

Начиная с этой недели, задание на неделю устанавливает минимальный уровень требований, ваша задача -- изучить и раскрыть особенности своего проекта, задавая содержательные вопросы и используя весь спектр доступных вам средств R и дополнительное чтение для получения на них ответов.

Выполнение отчёта

В связи с неудовлетворительным качеством оформления отчётов, начиная с этой недели мы устанавливаем единый формат отчётов.

Задание

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

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)
## конец разбиения на кластеры

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 (*) Персональная качественно-временная структура получения бейджей