Описание переменных

Описание переменных Incoming Traffic:

Variables <- c("Domain", "Category", "Global Rank", "Traffic Share", "Change", "AdSense", "Time period")

Description <- c("Сайт, который ссылался на Coursera", "Автоматически присвоенная категория для данного сайта", "Частота посещаемости/популярности сайта(?)", "Доля трафика для отсылки на Coursera на данном сайте", "Процентное изменение в доле трафика за полтора года (июль 2017 - декабрь 2018)", "Есть ли на этом сайте веб-приложение для контекстной рекламы", "Месяц сбора данных")

Range <- c("-", "-", "[0; 38.000.000]", "[0; 0.065], %", "[-5; -40], %", "Yes/NA", "[07-17; 12-18]")

Var_tab <- data.frame(Variables, Description, Range)

formattable(Var_tab, 
            align =c("l","l","c"), 
            list(`Indicator Name` = formatter(
              "span", style = ~ style(color = "grey",font.weight = "bold"))))
Variables Description Range
Domain Сайт, который ссылался на Coursera
Category Автоматически присвоенная категория для данного сайта
Global Rank Частота посещаемости/популярности сайта(?) [0; 38.000.000]
Traffic Share Доля трафика для отсылки на Coursera на данном сайте [0; 0.065], %
Change Процентное изменение в доле трафика за полтора года (июль 2017 - декабрь 2018) [-5; -40], %
AdSense Есть ли на этом сайте веб-приложение для контекстной рекламы Yes/NA
Time period Месяц сбора данных [07-17; 12-18]

Описание переменных Key words:

Variables <- c("Search term", "Traffic share", "Change", "Organic", "Paid", "URL", "Position", "Volume", "CPC", "Featured", "Time Preiod")

Description <- c("Поисковой запрос в Google", "Доля трафика на этот поисковой запрос", "Процентное изменение в доле трафика за полтора года (июль 2017 - декабрь 2018)", "Доля органической выдачи по запросу(т.е. нерекламных сайтов)", "Доля неогранической выдачи(т.е рекламных сайтов)", "Ссылка на Coursera по запросу", "Ранковая позиция страницы на выдаче в Google со ссылкой на Coursera","Количество запросов за 1.5 года","Стоимость клика по данному запросу", "Есть ли на этом сайте веб-приложение для контекстной рекламы", "Месяц сбора данных")

Range <- c("-", "[0; 0.0095], %", "[-2; 28], %", "[0; 1], %", "[0; 1], %", "-", "[1; 20]", "[0; 650.000.000]", "[0; 260], $", "Yes/NA", "[07-17; 12-18]")

Var_tab1 <- data.frame(Variables, Description, Range)

formattable(Var_tab1, 
            align =c("l","l","l"), 
            list(`Indicator Name` = formatter(
              "span", style = ~ style(color = "grey",font.weight = "bold"))))
Variables Description Range
Search term Поисковой запрос в Google
Traffic share Доля трафика на этот поисковой запрос [0; 0.0095], %
Change Процентное изменение в доле трафика за полтора года (июль 2017 - декабрь 2018) [-2; 28], %
Organic Доля органической выдачи по запросу(т.е. нерекламных сайтов) [0; 1], %
Paid Доля неогранической выдачи(т.е рекламных сайтов) [0; 1], %
URL Ссылка на Coursera по запросу
Position Ранковая позиция страницы на выдаче в Google со ссылкой на Coursera [1; 20]
Volume Количество запросов за 1.5 года [0; 650.000.000]
CPC Стоимость клика по данному запросу [0; 260], $
Featured Есть ли на этом сайте веб-приложение для контекстной рекламы Yes/NA
Time Preiod Месяц сбора данных [07-17; 12-18]

Часть 1: основные агрегированные метрики:

Количество уникальных доменов:

length(unique(inc_agr$Domain))
## [1] 5985

Количество уникальных категорий:

length(unique(inc_agr$Category))
## [1] 133

Итак, у нас 133 уникальные комбинации категорий сайтов, домены которых представлены в датасете. Все домены - уникальные, т.е. существует как минимум 5985 веб страниц, с которых можно перейти на Coursera.

Category

Примерно в половине случаев категория сайта Unknown =(

Посмотрим на распределение категорий из известной половины:

top_cat = inc_agr %>% filter(Category != "Unknown") %>% group_by(Category) %>% summarise(count = n()) %>% arrange(-count) %>% top_n(10)

ggplot(top_cat)+
  geom_bar(aes(x = reorder(Category, count), y = count),stat = "identity", color = "black", alpha = 0.5)+
  theme_bw()+
  geom_label(aes(x = Category, y = count, label = count), vjust = -0.1, size = 2.5)+
  labs(title = "Топ 10 самыx популярныx категорий", x = NULL, y = NULL)+
  coord_flip()

Учитывая, что известных категорий около 3 тысяч, то по графику видим, что около 11% всех доменов с известными категориями принадлежат сайтам по карьере и образованию, а ещё около 8% - новостным и медиа порталам.

Global Rank

Посмотрим на самые популярные домены:

top_rank = inc_agr %>% select(`Global Rank`, Domain) %>%  filter(`Global Rank` != 0) %>% arrange(`Global Rank`) %>% top_n(10, -`Global Rank`)

ggplot(top_rank)+
  geom_bar(aes(x = reorder(Domain, -`Global Rank`), y = `Global Rank`),stat = "identity", color = "black", alpha = 0.5)+
  theme_bw()+
  geom_label(aes(x = Domain, y = `Global Rank`, label = `Global Rank`), vjust = -0.1, size = 2.5)+
  theme(axis.ticks = element_blank(), axis.text.y = element_blank())+
  labs(title = "Самые популярные домены", x = NULL, y = NULL)+
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Видим, что чем больше Global Rank, тем менее популярным является сайт. Интуитивно кажется правильными, что Google, Yahoo, Amazon и Yandex - самые популярные сайты по этой характеристике.

Traffic Share

С каких доменов идет больше всего трафика на Coursera?

top_traf = inc_agr %>% select(Domain, `Traffic Share`) %>% arrange(-`Traffic Share`) %>% top_n(10)

ggplot(top_traf)+
  geom_bar(aes(x = reorder(Domain, -`Traffic Share`), y = `Traffic Share`), stat = "identity", color = "black", alpha = 0.5)+
  theme_bw()+
  labs(title = "Топ 10 доменов с наибольшей долей трафика", x = NULL, y = NULL)+
  theme(axis.text.x = element_text(angle = 30, hjust = 1))+
  scale_y_continuous(breaks = 0:10*0.01)

По бар чарту видно, что наибольшую долю трафика (более 6%) Курсере приносит домен deeplearning.ai. Затем идет один из самых популярных коммюнити для программистов - github.com (странно, что не StackOverFlow :D). Также в десятку вошли: сайт с классными публикациями на разные темы - medium.com и блог Гугла.

Change

Посмотрим на самые серьезные изменения в доле трафика:

top_change = inc_agr %>% select(Domain, Change, Category) %>% arrange(-Change) %>% top_n(10, Change)

ggplot(top_change)+
  geom_bar(aes(x = reorder(Domain, -Change), y = Change), stat = "identity", color = "black", alpha = 0.5)+
  theme_bw()+
  labs(title = "Топ 10 доменов в самым значительным\nположительным изменением в трафике, %", x = NULL, y = NULL)+
  theme(axis.text.x = element_text(angle = 30, hjust = 1))+
  scale_y_continuous(breaks = 0:40*5)

Наличие контекстной рекламы на сайте

Всего в датасете 273 домена с контекстной рекламой. Посмотрим на топ 10 доменов, отсортированных по доле трафика, которую они приносят:

adv = inc_agr %>% na.omit(subset(select = c(Domain,AdSense,Category,`Traffic Share`))) %>% arrange(-`Traffic Share`) %>% top_n(10, `Traffic Share`)

ggplot(adv)+
  geom_bar(aes(x = reorder(Domain, `Traffic Share`), y = `Traffic Share`),stat = "identity", color = "black", alpha = 0.5)+
  theme_bw()+
  geom_label(aes(x = Domain, y =`Traffic Share`, label = round(`Traffic Share`,5)), vjust = -0.1, size = 2.5)+
  labs(title = "Топ 10 доменов с контекстной рекламой по доле трафика", x = NULL, y = NULL)+
  coord_flip()

Теперь поработаем с датасетом Incoming traffic по месяцам:

Всего в датасете 18 000 наблюдений. На 2017 год приходится 6 000 (июль - декабрь), и, соответственно 12 000 наблюдений - на 2018 год (январь - декабрь).

Сначала посмотрим на данные за 2017 год для примера:

year_2017 = inc_month %>% filter(str_detect(`Time Period`, "17"))

inc_month$`Time Period` = as.factor(inc_month$`Time Period`)

traffic_month = year_2017 %>% select(Domain, `Traffic Share`, `Time Period`) %>% group_by(`Time Period`) %>% arrange(-`Traffic Share`) %>% top_n(5,`Traffic Share`)

traffic1 = traffic_month %>% filter(`Time Period` == "07-17"|`Time Period`== "08-17"|`Time Period`=="09-17") %>% arrange(-`Traffic Share`)


ggplot(traffic1)+
  geom_bar(aes(x = reorder(Domain, -`Traffic Share`), y = `Traffic Share`), stat = "identity", color = "black", alpha = 0.5)+
  facet_grid(~`Time Period`, scales = "free")+
  theme_bw()+
  theme(axis.text.x = element_text(angle = 30, hjust = 1))+
  labs(title = "Топ 5 доменов, принесшие наибольшую долю трафика по месяцам", x = NULL, y = "Доля трафика, %")+
  scale_y_continuous(breaks = 0:25*0.05)

traffic2 = traffic_month %>% filter(`Time Period` == "10-17"|`Time Period`== "11-17"|`Time Period`=="12-17")%>% arrange(-`Traffic Share`) 


ggplot(traffic2)+
  geom_bar(aes(x = reorder(Domain, -`Traffic Share`), y = `Traffic Share`), stat = "identity", color = "black", alpha = 0.5)+
  facet_grid(~`Time Period`, scales = "free")+
  theme_bw()+
  theme(axis.text.x = element_text(angle = 30, hjust = 1))+
  labs(title = NULL, x = NULL, y = "Доля трафика, %")+
  scale_y_continuous(breaks = 0:10*0.01)

А теперь за 2018 год:

year_2018 = inc_month %>% filter(str_detect(`Time Period`, "18"))

inc_month$`Time Period` = as.factor(inc_month$`Time Period`)

traffic_month1 = year_2018 %>% select(Domain, `Traffic Share`, `Time Period`) %>% group_by(`Time Period`) %>% arrange(-`Traffic Share`) %>% top_n(5,`Traffic Share`)

traffi = traffic_month1 %>% filter(`Time Period` == "01-18"|`Time Period`== "02-18"|`Time Period`=="03-18"|`Time Period` == "04-18"|`Time Period` == "05-18"|`Time Period` == "06-18") %>% arrange(-`Traffic Share`)

ggplot(traffi)+
  geom_bar(aes(x = reorder(Domain, -`Traffic Share`), y = `Traffic Share`), stat = "identity", color = "black", alpha = 0.5)+
  facet_grid(~`Time Period`, scales = "free")+
  theme_bw()+
  theme(axis.text.x = element_text(angle = 30, hjust = 1))+
  labs(title = "Топ 5 доменов, принесшие наибольшую долю трафика по месяцам", x = NULL, y = "Доля трафика, %")+
  scale_y_continuous(breaks = 0:25*0.05)

traffi2 = traffic_month1 %>% filter(`Time Period` == "07-18"|`Time Period`== "08-18"|`Time Period`=="09-18"|`Time Period` == "10-18"|`Time Period` == "11-18"|`Time Period` == "12-18") %>% arrange(-`Traffic Share`)

ggplot(traffi2)+
  geom_bar(aes(x = reorder(Domain, -`Traffic Share`), y = `Traffic Share`), stat = "identity", color = "black", alpha = 0.5)+
  facet_grid(~`Time Period`, scales = "free")+
  theme_bw()+
  theme(axis.text.x = element_text(angle = 30, hjust = 1))+
  labs(title = NULL, x = NULL, y = "Доля трафика, %")+
  scale_y_continuous(breaks = 0:25*0.05)

Часть 2: работаем с категориями доменов

Но снова посмотрим на топ 10 самых популярных доменов по категориям. Разделим категории сайтов на “общую” и более “специфическую” категории (в изначальном датасете они были указаны через слэш). Отфильтруем домены с неизвестными категориями и посмотрим какие категории сайтов в итоге самые популярные:

inc_agr = inc_agr %>% separate(Category, c("Category1", "Category2"), sep = "/")
inc_month = inc_month %>% separate(Category, c("Category1", "Category2"), sep = "/")


top_cat1 = inc_agr %>% filter(Category1 != "Unknown") 
top_cat11 = top_cat1 %>% group_by(Category1) %>% summarise(count = n()) %>% arrange(-count) %>% top_n(10)


ggplot(top_cat11,aes(x = reorder(Category1, count), y = count))+
  geom_bar(stat = "identity", color = "black", alpha = 0.5)+
  theme_bw()+
  labs(title = "Топ 10 самых часто встречающихся категорий сайтов", x = NULL, y = NULL)+
  theme(axis.text.x = element_text(angle = 30, hjust = 1))+
  scale_y_continuous(breaks = 0:600*50)+
  coord_flip()+
  geom_text(aes(label = paste("n = ",count,"")), position = position_stack(vjust=0.55), size = 3.5)+
  annotate(x= 1.5, y=450, label=paste("Total = ",nrow(top_cat1)), geom="text", size= 5)

Посмотрим самые популярные домены по более спицифическим категориям:

top_cat2 = inc_agr %>% filter(Category2 != "NA") 
top_cat22 = top_cat2 %>% group_by(Category2) %>% summarise(count = n()) %>% arrange(-count) %>% top_n(10)


ggplot(top_cat22,aes(x = reorder(Category2, count), y = count))+
  geom_bar(stat = "identity", color = "black", alpha = 0.5)+
  theme_bw()+
  labs(title = "Топ 10 самых часто встречающихся\nспецифичных категорий сайтов", x = NULL, y = NULL)+
  theme(axis.text.x = element_text(angle = 30, hjust = 1))+
  scale_y_continuous(breaks = 0:600*50)+
  coord_flip()+
  geom_text(aes(label = paste("n = ",count,"")), position = position_stack(vjust=0.55), size = 3.5)+
  annotate(x= 1.5, y=300, label=paste("Total = ",nrow(top_cat2)), geom="text", size= 5)

А теперь посмотрим на общее суммарное изменение по доле трафика по месяцам:

traf_line = inc_month %>% na.omit(subset(select = c(Domain, Category1, Category2, `Time Period`, Change))) %>% group_by(`Time Period`) %>% summarise(total_traf = sum(Change))


inc_month$`Time Period` <- ordered(inc_month$`Time Period`, 
                       levels = c("07-17","08-17","09-17","10-17","11-17","12-17","01-18","02-18","03-18","04-18","05-18","06-18","07-18","08-18","09-18","10-18","11-18","12-18"))

traf_line$`Time Period` = as.factor(traf_line$`Time Period`)


ggplot(data = traf_line, aes(x = `Time Period`, y = total_traf))+
  geom_line(group = 1, alpha = 0.5)+
  theme_bw()+
  geom_point()+
  theme(axis.text.x = element_text(angle = 30, hjust = 1))+
  labs(title = "Конечное суммарное изменение по общей доле трафика\nот всех доменов по месяцам", y = "Суммарное изменение, %", x = NULL)+
  scale_y_continuous(breaks = 0:250*25)

Посмотрим на суммарную долю трафика для 5 топовых категорий сайтов по месяцам:

top = inc_month %>% filter(Category1 != "Unknown") %>% select(`Time Period`, `Traffic Share`, Category1) %>% group_by(Category1) %>% summarise(count = n()) %>% arrange(-count) %>% top_n(10)

inc_traf_m = inc_month %>% select(`Time Period`, `Traffic Share`, Category1) %>% filter(Category1 == "Career_and_Education"|Category1 == "News_and_Media"|Category1 == "Internet_and_Telecom"|Category1 == "Computer_and_Electronics"|Category1 == "Business_and_Industry") %>%  group_by(Category1, `Time Period`) %>% summarise(total_t = sum(`Traffic Share`))


ggplot(data = inc_traf_m, aes(x = as.factor(`Time Period`), y = total_t, group = as.factor(Category1)))+
  theme_bw()+
  geom_line(aes(color = as.factor(Category1)))+
  geom_point(alpha = 0.6)+
  theme(axis.text.x = element_text(angle = 30, hjust = 1))+
  labs(title = "Суммарная доля трафика\nот топ 5 категорий доменов по месяцам", y = "Суммарная доля, %", x = NULL, color = NULL)+
  scale_y_continuous(breaks = 0:10*0.05)+
  theme(legend.justification=c(1,1), legend.position=c(1,1))

А теперь посмотрим на суммарную долю трафика по топ 5 специфичeским категориям по месяцам:

top1 = inc_month %>% filter(Category2 != "NA") %>% select(`Time Period`, `Traffic Share`, Category2) %>% group_by(Category2) %>% summarise(count = n()) %>% arrange(-count) %>% top_n(10)

inc_traf_m1 = inc_month %>% select(`Time Period`, `Traffic Share`, Category2) %>% filter(Category2 == "Education"|Category2 == "Technology_News"|Category2 == "Universities_and_Colleges"|Category2 == "Software"|Category2 == "Programming") %>%  group_by(Category2, `Time Period`) %>% summarise(total_t = sum(`Traffic Share`))


ggplot(data = inc_traf_m1, aes(x = as.factor(`Time Period`), y = total_t, group = as.factor(Category2)))+
  theme_bw()+
  geom_line(aes(color = as.factor(Category2)))+
  geom_point(alpha = 0.5)+
  theme(axis.text.x = element_text(angle = 30, hjust = 1))+
  labs(title = "Суммарная доля трафика\nот топ 5 специфичных категорий доменов по месяцам", y = "Суммарная доля, %", x = NULL, color = NULL)+
  scale_y_continuous(breaks = 0:50*0.01)+
  theme(legend.position= "bottom")

Часть 3: Работаем со словами запросов

Количество поисковых запросов в изначальном агрегированном датасете:

key_agr <- read_excel("key_words_agreg.xlsx")
nrow(key_agr)
## [1] 167788

Фильтруем изначальное количество (167788) поисковых запросов: убираем все не английские слова, все цифры и всю пунктуацию. В конечном итоге осталось поисковых запросов:

#убрали все не английские символы
key_agr = key_agr[which(!grepl("[^\x01-\x7F]+", key_agr$`Search terms`)),]

#убрали все цифры
key_agr$`Search terms` = gsub("[[:digit:]]", "", key_agr$`Search terms`)

#убрали все знаки пунктуации
key_agr$`Search terms` = gsub("[[:punct:]]", "", key_agr$`Search terms`)

#удаляем строки с пустым поисковым запросом
key_agr<- key_agr[!(is.na(key_agr$`Search terms`) | 
                      key_agr$`Search terms`==""| key_agr$`Search terms`=="   "| 
                      key_agr$`Search terms`=="    "| 
                      key_agr$`Search terms`=="      "|
                      key_agr$`Search terms`==" "|
                      key_agr$`Search terms`=="   "|
                      key_agr$`Search terms`=="           "), ]
nrow(key_agr)
## [1] 154524

Также, отфильтруем только те запросы, которые непосредственно ведут на Coursera (т.е. у запроса указана URL ссылка на какую-либо веб страницу Coursera). В итоге осталось запросов:

key_agr = key_agr %>% filter(URL != "NA")
nrow(key_agr)
## [1] 89391

Делаем кластеризацию по типовым словам-маркерам:

#1
key_agr$`Search terms` = ifelse(str_detect(key_agr$`Search terms`, "science|scientist|machine learning|deep learning|computer|algorithm|cloud"), 
                                "Data Science", key_agr$`Search terms`)

#2
key_agr$`Search terms` = ifelse(str_detect(key_agr$`Search terms`, "r|python|sql"), 
                                "R/Python/SQL", key_agr$`Search terms`)

#3
key_agr$`Search terms` = ifelse(str_detect(key_agr$`Search terms`, 
                                           "java|c|php|go|scala|json|programming"), 
                                "Java/C/PHP/Go/Scala", key_agr$`Search terms`)

#4
key_agr$`Search terms` = ifelse(str_detect(key_agr$`Search terms`, "tableau|visualization|excel|power"), 
                                "Data visualization", key_agr$`Search terms`)

#5
key_agr$`Search terms` = ifelse(str_detect(key_agr$`Search terms`, "ai|artificial"), 
                                "Artificial Intelligence", key_agr$`Search terms`)

#6
key_agr$`Search terms` = ifelse(str_detect(key_agr$`Search terms`, "math|algebra|sin|lim|log|integral|sum|derivative|factor|cos"), 
                                "Mathematics", key_agr$`Search terms`)

#7
key_agr$`Search terms` = ifelse(str_detect(key_agr$`Search terms`, "analy"), 
                                "Data Analytics", key_agr$`Search terms`)

#8
key_agr$`Search terms` = ifelse(str_detect(key_agr$`Search terms`, "business|management|entrepreneurship|finance|innovat|invest|product|agile"), 
                                "Business Analytics", key_agr$`Search terms`)

#9
key_agr$`Search terms` = ifelse(str_detect(key_agr$`Search terms`, 
"regression|anova|social|statistic|overfit|model|human|hypothes|qualit|quanti"),
                          "Statistical modeling/Social Sciences", key_agr$`Search terms`)

#10
key_agr$`Search terms` = ifelse(str_detect(key_agr$`Search terms`, "big data"), 
                                "Big Data", key_agr$`Search terms`)

#11
key_agr$`Search terms` = ifelse(str_detect(key_agr$`Search terms`, 
                                           "mining|text|natural language|processing"), 
                                "Text mining/NLP", key_agr$`Search terms`)

#12
key_agr$`Search terms` = ifelse(str_detect(key_agr$`Search terms`, "android|ios"), 
                                "Android/iOS", key_agr$`Search terms`)

#13
key_agr$`Search terms` = ifelse(str_detect(key_agr$`Search terms`, 
                                          "digital|marketing|project|customer|target|ad|advertise|contextual"), 
                                "Digital Marketing", key_agr$`Search terms`)

#14
key_agr$`Search terms` = ifelse(str_detect(key_agr$`Search terms`, "design|photoshop|photo|art|creat"), 
                                "Design", key_agr$`Search terms`)

#15
key_agr$`Search terms` = ifelse(str_detect(key_agr$`Search terms`, 
"software|matlab|mat lab|neural|recommend|collaborat|linux|windows"), 
                                "Software/Hardware Engineering", key_agr$`Search terms`)

#16
key_agr$`Search terms` = ifelse(str_detect(key_agr$`Search terms`, "english"), 
                                "English", key_agr$`Search terms`)


key_agr$`Search terms` = ifelse(str_detect(key_agr$`Search terms`, "Data Science"), "Data Science",ifelse(str_detect(key_agr$`Search terms`, "R/Python/SQL"), "R/Python/SQL",ifelse(str_detect(key_agr$`Search terms`, "Java/C/PHP/Go/Scala"), "Java/C/PHP/Go/Scala",ifelse(str_detect(key_agr$`Search terms`, "Data visualization"),"Data visualization",ifelse(str_detect(key_agr$`Search terms`, "Artificial Intelligence"), "Artificial Intelligence",ifelse(str_detect(key_agr$`Search terms`, "Mathematics"), "Mathematics",ifelse(str_detect(key_agr$`Search terms`, "Data Analytics"), "Data Analytics",ifelse(str_detect(key_agr$`Search terms`, "Business Analytics"), "Business Analytics",ifelse(str_detect(key_agr$`Search terms`, "Statistical modeling/Social Sciences"),"Statistical modeling/Social Sciences",ifelse(str_detect(key_agr$`Search terms`, "Big Data"), "Big Data", ifelse(str_detect(key_agr$`Search terms`, "Text mining/NLP"), "Text mining/NLP",ifelse(str_detect(key_agr$`Search terms`, "Android/iOS"), "Android/iOS",ifelse(str_detect(key_agr$`Search terms`, "Digital Marketing"),"Digital Marketing",ifelse(str_detect(key_agr$`Search terms`, "Design"),"Design",ifelse(str_detect(key_agr$`Search terms`,"Software/Hardware Engineering"),"Software/Hardware Engineering",ifelse(str_detect(key_agr$`Search terms`,"English"), "English", "Other"))))))))))))))))

В итоге кластеризации поисковых запросов выделились 15 основных тем. Все запросы, не попавшие ни в одну из тем, сгруппированы в 16-ую тему “Other”(“Другое”).

Вот финальная таблица с запросами:

key_agr$`Search terms` = as.factor(key_agr$`Search terms`)

words = key_agr %>% group_by(`Search terms`) %>% summarise(count = n()) %>% arrange(-count)

formattable(words, 
            align =c("l","c"), 
            list(`Indicator Name` = formatter(
            "span", style = ~ style(color = "grey",font.weight = "bold"))))
Search terms count
R/Python/SQL 70335
Java/C/PHP/Go/Scala 13571
Other 3603
Mathematics 512
Digital Marketing 216
Statistical modeling/Social Sciences 215
Data Analytics 184
Design 160
Artificial Intelligence 129
Business Analytics 121
Software/Hardware Engineering 80
Data visualization 74
English 65
Big Data 50
Text mining/NLP 48
Android/iOS 28

А в этой таблице показано, каким образом отбирались слова для каждой из тем (с помощью функции str_detect из пакета stringr все запросы проверялись на наличие указанных слов/словосочетаний/части слова, затем, им присваивалась одна из 16 категорий) :

Topic <- c("R/Python/SQL","Java/C/PHP/Go/Scala","Data Visualization", "Artificial Intelligence", "Mathematics","Data Analytics","Business Analytics","Statistical modeling/Social Sciences", "Big Data","Text mining/NLP","Android/iOS","Digital Marketing","Design","Software/Hardware Engineering","English")

Words_searched <- c("r | python | sql", "java | c | php | go | scala | json | programming", "tableau | visualization | excel | power","ai | artificial","math | algebra | sin | lim | log | integral | sum | derivative | factor | cos","analy","business | management | entrepreneurship | finance | innovat | invest | product | agile","regression | anova | social | statistic | overfit | model | human | hypothes | qualit | quanti","big data","mining | text | natural language | processing","android | ios","digital | marketing | project | customer | target | ad | advertise | contextual", "design | photoshop | photo | art | creat", "software | matlab | mat lab | neural | recommend | collaborat | linux | windows","english")

Tab_words <- data.frame(Topic, Words_searched)

formattable(Tab_words, 
            align =c("l","l"), 
            list(`Indicator Name` = formatter(
            "span", style = ~ style(color = "grey",font.weight = "bold"))))
Topic Words_searched
R/Python/SQL r | python | sql
Java/C/PHP/Go/Scala java | c | php | go | scala | json | programming
Data Visualization tableau | visualization | excel | power
Artificial Intelligence ai | artificial
Mathematics math | algebra | sin | lim | log | integral | sum | derivative | factor | cos
Data Analytics analy
Business Analytics business | management | entrepreneurship | finance | innovat | invest | product | agile
Statistical modeling/Social Sciences regression | anova | social | statistic | overfit | model | human | hypothes | qualit | quanti
Big Data big data
Text mining/NLP mining | text | natural language | processing
Android/iOS android | ios
Digital Marketing digital | marketing | project | customer | target | ad | advertise | contextual
Design design | photoshop | photo | art | creat
Software/Hardware Engineering software | matlab | mat lab | neural | recommend | collaborat | linux | windows
English english

Посмотрим на трафик по категориям запросов

Посмотрим на среднее количество трафика по каждой тематике запросов. Среднее, а не суммарное, чтобы уравновесить различное количество запросов по разным тематикам (!)

top_terms_agr = key_agr %>% group_by(`Search terms`) %>% summarise(mean_traffic = mean(`Traffic Share`)) %>% arrange(-mean_traffic)

formattable(top_terms_agr, 
            align =c("l","l"), 
            list(`Indicator Name` = formatter(
            "span", style = ~ style(color = "grey",font.weight = "bold"))))
Search terms mean_traffic
Text mining/NLP 6.940714e-06
Big Data 5.977362e-06
English 4.747282e-06
Data visualization 3.979051e-06
Data Analytics 3.496426e-06
Java/C/PHP/Go/Scala 3.175816e-06
Design 2.511700e-06
Software/Hardware Engineering 2.421947e-06
Statistical modeling/Social Sciences 1.669087e-06
Digital Marketing 1.443871e-06
Other 1.404984e-06
Business Analytics 1.367735e-06
Android/iOS 1.367230e-06
R/Python/SQL 1.234195e-06
Mathematics 1.183400e-06
Artificial Intelligence 9.289813e-07

Интересные результаты! Несмотря на то, что запросов по языкам программирования, математике и маркетингу - больше, наибольшее количество трафика на Курсеру идет от запросов по вопросам обработки и анализа текста, больших данных и изучения английского.

А теперь поработаем с датасетом по поисковые запросам по месяцам. Аналогично, перекодируем все запросы в 15 основных тематик запросов, и посмотрим, какова средняя доля трафика на каждый запрос.

Количество запросов в изначальном датасете по месяцам:

key_month <- read_excel("key_words_month.xlsx")
nrow(key_month)
## [1] 402332

Количество запросов после аналогичного цикла фильтрации:

#убрали все не английские символы
key_month = key_month[which(!grepl("[^\x01-\x7F]+", key_month$`Search terms`)),]

#убрали все цифры
key_month$`Search terms` = gsub("[[:digit:]]", "", key_month$`Search terms`)

#убрали все знаки пунктуации
key_month$`Search terms` = gsub("[[:punct:]]", "", key_month$`Search terms`)

#удаляем строки с пустым поисковым запросом
key_month<- key_month[!(is.na(key_month$`Search terms`) | 
                      key_month$`Search terms`==""| key_month$`Search terms`=="   "| 
                      key_month$`Search terms`=="    "| 
                      key_month$`Search terms`=="      "|
                      key_month$`Search terms`==" "|
                      key_month$`Search terms`=="     "|
                      key_month$`Search terms`=="             "), ]

key_month = key_month %>% filter(URL != "NA")
nrow(key_month)
## [1] 161617
#1
key_month$`Search terms` = ifelse(str_detect(key_month$`Search terms`, "science|scientist|machine learning|deep learning|computer|algorithm|cloud"), 
                                "Data Science", key_month$`Search terms`)

#2
key_month$`Search terms` = ifelse(str_detect(key_month$`Search terms`, "r|python|sql"), 
                                "R/Python/SQL", key_month$`Search terms`)

#3
key_month$`Search terms` = ifelse(str_detect(key_month$`Search terms`, 
                                           "java|c|php|go|scala|json|programming"), 
                                "Java/C/PHP/Go/Scala", key_month$`Search terms`)

#4
key_month$`Search terms` = ifelse(str_detect(key_month$`Search terms`, "tableau|visualization|excel|power"), 
                                "Data visualization", key_month$`Search terms`)

#5
key_month$`Search terms` = ifelse(str_detect(key_month$`Search terms`, "ai|artificial"), 
                                "Artificial Intelligence", key_month$`Search terms`)

#6
key_month$`Search terms` = ifelse(str_detect(key_month$`Search terms`, "math|algebra|sin|lim|log|integral|sum|derivative|factor|cos"), 
                                "Mathematics", key_month$`Search terms`)

#7
key_month$`Search terms` = ifelse(str_detect(key_month$`Search terms`, "analy"), 
                                "Data Analytics", key_month$`Search terms`)

#8
key_month$`Search terms` = ifelse(str_detect(key_month$`Search terms`, "business|management|entrepreneurship|finance|innovat|invest|product|agile"), 
                                "Business Analytics", key_month$`Search terms`)

#9
key_month$`Search terms` = ifelse(str_detect(key_month$`Search terms`, 
"regression|anova|social|statistic|overfit|model|human|hypothes|qualit|quanti"),
                          "Statistical modeling/Social Sciences", key_month$`Search terms`)

#10
key_month$`Search terms` = ifelse(str_detect(key_month$`Search terms`, "big data"), 
                                "Big Data", key_month$`Search terms`)

#11
key_month$`Search terms` = ifelse(str_detect(key_month$`Search terms`, 
                                           "mining|text|natural language|processing"), 
                                "Text mining/NLP", key_month$`Search terms`)

#12
key_month$`Search terms` = ifelse(str_detect(key_month$`Search terms`, "android|ios"), 
                                "Android/iOS", key_month$`Search terms`)

#13
key_month$`Search terms` = ifelse(str_detect(key_month$`Search terms`, 
                                          "digital|marketing|project|customer|target|ad|advertise|contextual"), 
                                "Digital Marketing", key_month$`Search terms`)

#14
key_month$`Search terms` = ifelse(str_detect(key_month$`Search terms`, "design|photoshop|photo|art|creat"), 
                                "Design", key_month$`Search terms`)

#15
key_month$`Search terms` = ifelse(str_detect(key_month$`Search terms`, 
"software|matlab|mat lab|neural|recommend|collaborat|linux|windows"), 
                                "Software/Hardware Engineering", key_month$`Search terms`)

#16
key_month$`Search terms` = ifelse(str_detect(key_month$`Search terms`, "english"), 
                                "English", key_month$`Search terms`)


key_month$`Search terms` = ifelse(str_detect(key_month$`Search terms`, "Data Science"), "Data Science",ifelse(str_detect(key_month$`Search terms`, "R/Python/SQL"), "R/Python/SQL",ifelse(str_detect(key_month$`Search terms`, "Java/C/PHP/Go/Scala"), "Java/C/PHP/Go/Scala",ifelse(str_detect(key_month$`Search terms`, "Data visualization"),"Data visualization",ifelse(str_detect(key_month$`Search terms`, "Artificial Intelligence"), "Artificial Intelligence",ifelse(str_detect(key_month$`Search terms`, "Mathematics"), "Mathematics",ifelse(str_detect(key_month$`Search terms`, "Data Analytics"), "Data Analytics",ifelse(str_detect(key_month$`Search terms`, "Business Analytics"), "Business Analytics",ifelse(str_detect(key_month$`Search terms`, "Statistical modeling/Social Sciences"),"Statistical modeling/Social Sciences",ifelse(str_detect(key_month$`Search terms`, "Big Data"), "Big Data", ifelse(str_detect(key_month$`Search terms`, "Text mining/NLP"), "Text mining/NLP",ifelse(str_detect(key_month$`Search terms`, "Android/iOS"), "Android/iOS",ifelse(str_detect(key_month$`Search terms`, "Digital Marketing"),"Digital Marketing",ifelse(str_detect(key_month$`Search terms`, "Design"),"Design",ifelse(str_detect(key_month$`Search terms`,"Software/Hardware Engineering"),"Software/Hardware Engineering",ifelse(str_detect(key_month$`Search terms`,"English"), "English", "Other"))))))))))))))))

Самые часто встречающиеся запросы:

key_month$`Search terms` = as.factor(key_month$`Search terms`)

words_month = key_month %>% group_by(`Search terms`) %>% summarise(count = n()) %>% arrange(-count)

formattable(words_month, 
            align =c("l","c"), 
            list(`Indicator Name` = formatter(
            "span", style = ~ style(color = "grey",font.weight = "bold"))))
Search terms count
R/Python/SQL 123968
Java/C/PHP/Go/Scala 26337
Other 7457
Mathematics 904
Digital Marketing 431
Statistical modeling/Social Sciences 431
Design 411
Data Analytics 352
Business Analytics 250
Artificial Intelligence 228
English 202
Data visualization 197
Software/Hardware Engineering 179
Text mining/NLP 110
Big Data 94
Android/iOS 66

Посмотрим на среднюю долю трафика в датасете с поисковыми запросами по месяцам:

key_month$`Time Period` = as.factor(key_month$`Time Period`)

top_terms_month = key_month %>% group_by(`Search terms`) %>% summarise(mean_traffic = mean(`Traffic Share`)) %>% arrange(-mean_traffic) 

formattable(top_terms_month, 
            align =c("l","l"), 
            list(`Indicator Name` = formatter(
            "span", style = ~ style(color = "grey",font.weight = "bold"))))
Search terms mean_traffic
Big Data 5.358122e-05
Text mining/NLP 5.221136e-05
Data Analytics 2.789219e-05
English 2.589137e-05
Data visualization 2.524294e-05
Java/C/PHP/Go/Scala 2.460019e-05
Software/Hardware Engineering 1.854044e-05
Design 1.506666e-05
Statistical modeling/Social Sciences 9.634717e-06
R/Python/SQL 8.785534e-06
Digital Marketing 8.715528e-06
Business Analytics 8.371052e-06
Android/iOS 7.943882e-06
Mathematics 7.553240e-06
Other 6.573943e-06
Artificial Intelligence 3.435808e-06

Видим,что топ чарт немного изменился, по сравнению с агрегированными данными по запросам.

Посмотрим на изменение средней доли трафика по всем категориям запросов по месяцам:

all_traf = key_month %>% group_by(`Search terms`, `Time Period`) %>% summarise(mean_traffic = mean(`Traffic Share`))


ggplot(data = all_traf, aes(x = as.factor(`Time Period`), y = mean_traffic, group = as.factor(`Search terms`)))+
  theme_bw()+
  geom_line(aes(color = as.factor(`Search terms`)))+
  geom_point(alpha = 0.7, size = 0.7)+
  theme(axis.text.x = element_text(angle = 30, hjust = 1))+
  labs(title = "Средняя доля трафика от всех категорий запросов по месяцам", y = "Средняя доля, %", x = NULL, color = NULL)+
  scale_y_continuous(breaks = 0:10000*0.00005)+
  theme(legend.position= "bottom")

А теперь просто ради интереса и сравнения посмотрим на изменение суммарной доли трафика по всем категориям запросов по месцам(просто ради интереса):

all_traf1 = key_month %>% group_by(`Search terms`, `Time Period`) %>% summarise(sum_traffic = sum(`Traffic Share`))


ggplot(data = all_traf1, aes(x = as.factor(`Time Period`), y = sum_traffic, group = as.factor(`Search terms`)))+
  theme_bw()+
  geom_line(aes(color = as.factor(`Search terms`)))+
  geom_point(alpha = 0.7, size = 0.7)+
  theme(axis.text.x = element_text(angle = 30, hjust = 1))+
  labs(title = "Суммарная доля трафика от всех категорий запросов по месяцам", y = "Суммарная доля, %", x = NULL, color = NULL)+
  scale_y_continuous(breaks = 0:10000*0.01)+
  theme(legend.position= "bottom")

Как и предполагалось - количество наблюдений в каждой категории не дают объективно оценить количество трафика. Поскольку категории с R, Python.. и Java/C.. самые многочисленные - их суммарный трафик наибольший.

Ещё можно более подробно изучить изменения средней доли трафика топ 5 поисковых запросов по месяцам:

mean_traf = key_month %>% filter(`Search terms` == "Big Data"|`Search terms`== "Text mining/NLP"|`Search terms`== "Data Analytics"|`Search terms`== "English" |`Search terms`== "Data visualization") %>% group_by(`Search terms`, `Time Period`) %>% summarise(mean_traffic = mean(`Traffic Share`))


ggplot(data = mean_traf, aes(x = as.factor(`Time Period`), y = mean_traffic, group = as.factor(`Search terms`)))+
  theme_bw()+
  geom_line(aes(color = as.factor(`Search terms`)))+
  geom_point(alpha = 0.6)+
  theme(axis.text.x = element_text(angle = 30, hjust = 1))+
  labs(title = "Средняя доля трафика от топ 5 категорий\nпоисковых запросов по месяцам", y = "Средняя доля, %", x = NULL, color = NULL)+
  scale_y_continuous(breaks = 0:10000*0.00005)+
  theme(legend.justification=c(1,1), legend.position=c(1,1))

После прочтения сразу же напишите, что было непонятно/ не объяснено должным образом - чтобы я могла подправить :) Замечания? Предложения?