---
title: "STM freelance"
author: "Ivan Mishalkin"
date: ""
output: html_document
---

```{r,comment=NA, setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```

###Будем Использовать STM для анализа фриланс проектов

```{r,comment=NA,message=F, warning=F}
library(readr)
library(stm)
data = read.csv("/students/iamishalkin/coursework/finaldf.csv") # загружаем датасет с названием сообщения, полным текстом, датой
colnames(data)[3]='documents'
```

####STM позволяет разметить новые документы, которые модель ни разу не видела

Поэтому разобьем выборку на обучающую и тестовую

```{r,comment=NA,message=F, warning=F}
smp_size <- floor(0.75 * nrow(data))
set.seed(123)
train_ind <- sample(seq_len(nrow(data)), size = smp_size)
train <-data[train_ind, ]
test <- data[-train_ind, ]
```

###Длина описания

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

```{r,comment=NA,message=F, warning=F}
library(qdap)
data$len=wc(data$documents)#количество слов в документе

lenlm=lm(answers~len, data=data)
summary(lenlm)

sqlenlm=lm(answers~len+I(len*len), data=data)
summary(sqlenlm)
```

Судя по первой модели количество откликов не может быть больше 16, что на самом деле не так.

```{r,comment=NA,message=F, warning=F}
library(ggplot2)
ggplot(data)+geom_histogram(aes(answers), binwidth=1)
```

В модели с включением квадрата от длины описания коэффициент при квадратичном члене не значим, а знаки при коэффициентах отличны от того, что мы наблюдали. 

Мы попробовали отобразить взаимосвязь между длиной описания и количества откликов. На графике для каждой длины посчитано среднее количество откликов. 

```{r,comment=NA,message=F, warning=F}
library(dplyr)
data %>% group_by(len) %>% summarise(answers=mean(answers)) %>% arrange(len) %>% ggplot()+geom_point(aes(x=len, y=answers))
```

На графике ниже отображены все точки и они соответствуют распределению количества слов в проекте

```{r,comment=NA,message=F, warning=F}
ggplot(data)+geom_point(aes(x=len, y=answers), size=0.5)
```

```{r,comment=NA,message=F, warning=F}
ggplot(data)+geom_histogram(aes(len), binwidth=1)
```

Из этого всего следует, что длина объявления вряд ли имеет большое влияние на количество откликов.

###Структура предложений 

Далее посмотрим по категориям, в каком соотношении предлагаются проекты различной тематики

```{r,comment=NA,message=F, warning=F}
cats=table(data$category)
ggplot(data)+geom_bar(aes(x=category, y=..count..))+theme(axis.text.x = element_text(angle = 20, hjust = 1))
```

Самое большое количество предложений относится к ИТ сфере, далее следует дизайн, за ним проекты связанные с текстом, далее продажи и маркетинг и, наконец business services

###Дни недели

Проверим, влияет ли день недели, в который было опубликован проект на количество откликов.

```{r,comment=NA,message=F, warning=F}
data$day <- weekdays(as.Date(data$published))
dwka <- format(as.Date(data$published) , "%a")
dwkn <- as.numeric( format(as.Date(data$published) , "%w") ) # numeric version
dwkn[which(dwkn==0)]=7
data$day=dwka

ggplot(data)+geom_bar(aes(x=reorder(day,dwkn), y=..count.., fill=category), position = 'dodge')
```

Во-первых, в выходные публикуется меньше проектов и это верно для всех категорий

```{r,comment=NA,message=F, warning=F}
data %>% group_by(day) %>% summarise(average_responses=mean(answers))%>%ggplot()+geom_bar(aes(x=reorder(day,c(7,1,0,4,6,2,3)),y=average_responses),stat='identity')+xlab('weekday')
```

Тем не менее среднее количество откликов кажется не намного меньше, чем в другие дни. Проверим это формальными тестами

```{r,comment=NA,message=F, warning=F}
M <- aov(answers~day, data = data)
summary(M)
```

Проведя дисперсионный анализ мы выяснили, что разница между средними все таки есть и она статистически значимая. Чтобы понять, какие именно дни недели отличаются по количеству отзывов проведем тест Тьюки

```{r,comment=NA,message=F, warning=F}
TukeyHSD(M)
```

Видно, что суббота значимо отличается почти от всех дней недели(последний столбец)

###STM

Подготовим тексты для stm

```{r,comment=NA,message=F, warning=F}
processedtr=textProcessor(data$documents[train_ind], metadata =data[train_ind,],stem=F, language='en')
processedte=textProcessor(data$documents[-train_ind], metadata =data[-train_ind,],stem=F, language='en')
outtr <- prepDocuments(processedtr$documents, processedtr$vocab, processedtr$meta)
outte <- prepDocuments(processedte$documents, processedtr$vocab, processedte$meta[,-1])
```

Язык выбран английский, так как textProcessor попутно убирает стоп-слова.Так как русские стоп слова уже были убраны ставить язык русский смысла не имело.

Далее собственно обучение модели

```{r,comment=NA,message=F, warning=F}
#poliblogPrevFit <- stm(documents = outtr$documents, vocab =outtr$vocab,
#                       K = 50, prevalence =~ answers, seed=123,
#                       max.em.its = 1000, data = outtr$meta,
#                       init.type = "Spectral")
load('/students/iamishalkin/coursework/predstm/50topics_w_pred.RData')

```

Из обязательных параметров необходимо было указать документы, словарь и количество тем. Чтобы задействовать мета данные необходимо указать prevalence. max.em.its можно указать побольше, если алгоритм не будет знчительно улучшаться, он сам остановится.

###Быстрая визуализация всех топиков

Можно построить облако слов, чтобы сходу понять, о чем каждый топик
```{r,comment=NA,message=F, warning=F}
#par(mfrow=c(2,5))
#for (i in 1:50) {
#cloud(poliblogPrevFit, topic=i, max.words = 35)  
#}
```

![](/students/iamishalkin/1.png)
![](/students/iamishalkin/2.png)
![](/students/iamishalkin/3.png)
![](/students/iamishalkin/4.png)
![](/students/iamishalkin/5.png)

Так, на наших данных получилось:

1 тема: что-то про обучение, образование

2 тема: что-то не очень связное, проверим далее

3 тема: что-то связанное с электронной почтой

4 тема: ремонт и около

5 тема: пока что тоже не очень ясно

6 тема: тоже на дальнейший анализ

7 тема: что-то по оформлению/ доработке веб страницы

8 тема: что-то связанное с деятельностью внутри фирмы, что-то организаторское

9 тема: задания связанные с cms

10 тема: вероятно, что-то связанное с мобильными приложениями на iphone

11 тема: не очень ясно пока

12 тема: мешанина

13 тема: необходимо что-то размещать/постить, отзывы и прочее

14 тема: основное слово сайт

15 тема: интернет магазин

16 тема: основное слово email, но контекст не ясен

17 тема: пректы связанные с покупкой чего-то

18 тема: автомобильные проекты

19 тема: заполнение каких-то таблиц, форм

20 тема: требует уточнения

21 тема: разработка мобильных приложений/игр

22 тема: что-то вроде личного кабинета

23 тема: английские проекты выделились в одну группу

24 тема: настройка

25 тема: детали дизайнерских проектов

26 тема: оформление баннера

27 тема: внедрение каких-то систем в предприятие

28 тема: разработать лендинг 

29 тема: работа с файлами, загрузка/выгрузка

30 тема: обработка фото

31 тема: написание некоего скрипта

32 тема: не ясно

33 тема: работа с видео

34 тема: SMM

35 тема: общие термины, связанные с требованиями к кандидатам

36 тема: доработка сайта

37 тема: работа с текстом

38 тема: съемка видео

39 тема: гастрономические темы

40 тема: языки программирования/навыки

41 тема: чертеж

42 тема: SEO/исковая оптимизация

43 тема: общие слова

44 тема: требования к кандидату

45 тема: поиск связанный с путешествиями

46 тема: описание условий

47 тема: что-то связанное с мебелью

48 тема: не ясно

49 тема: настройка контекстной рекламы

50 тема: общие слова


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

Следующая функция поможет увидеть самый репрезентативный документ для конкретной темы

```{r,comment=NA,message=F, warning=F}
findThoughts(poliblogPrevFit, texts = as.character(train$documents), topics=2)
```

Также иногда полезно увидеть слова наилучшим образом представляющие данную  тему

```{r,comment=NA,message=F, warning=F}
labelTopics(poliblogPrevFit, topics =2)
```


Данная функция предлагает 4 трактовки "наилучшим образом представляет"

Highest Prob-слова у которых наивысшая вероятность встретиться в данной теме

FREX- слова которыми топики отличаются от других

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

Судя по всему, во вторую тему перешли все частовстречаемые слова.

То же можно сделать для других непонятных тем

###Lasso регрессия


```{r,comment=NA,message=F, warning=F, fig.width=10}
par(mfrow=c(1,1))
stmlasso <- topicLasso(answers ~ 1, data=outtr$meta,stmobj=poliblogPrevFit,xlim = c(-105,105))
```



![](/students/iamishalkin/stmwords.png)


Этот график по оси х отображает коэффициент при соответствующе теме.

Также можно попробовать предсказать ожидаемые отклики

Размечаем новые данные

```{r,comment=NA,message=F, warning=F}
stm_test=fitNewDocuments(poliblogPrevFit, outte$documents)
```

```{r,comment=NA,message=F, warning=F}
pred <- predict(stmlasso, newx=stm_test$theta)
```














