O projeto tem como objetivo a manipulação e análise de dados. Serão abordados 5 tarefas que envolvem a análise de dois banco de dados.
Primeiramente, vamos carregar os pacotes que serão necessários para o desenvolvimento do projeto.
# Carregar pacotes
library(tidyverse)
library(kableExtra)
library(dbplyr)
library(sqldf)
library(RH2)
library(plotly)
Em seguida, iremos ler os datasets.
# Ler datasets
consumo <- readxl::read_xlsx('consumo.xlsx')
conteudo <- readxl::read_xlsx('conteudo.xlsx')
Durante o teste será necessario a manipulaçao do dataset consumo de acordo com o mês e com os minutos consumidos. Portanto, vamos criar essas variáveis auxiliares.
Inicialmente, a primeira variável auxiliar mês será inserida no dataet consumo. Além disso, vamos adicionar uma variável auxiliar para a data.
# Criar dataset mes
mes <- sqldf("select month(data) as valor_mes from consumo")
# Inserir variável mes
consumo$mes <- mes$valor_mes
# Inserir variável data_aux
consumo$data_aux <- as.character(consumo$data)
# Reordenar o dataset
consumo <- consumo[c(1:3,6,5,4)]
Agora, os datasets serão transformados em databases para que a manipulação dos dados possa ser desenvolvida em SQL.
Após a transformação, a segunda variável auxiliar minutos_consumidos será inserida no database consumo.
# Transformar datasets em databases
consumo <- memdb_frame(consumo, .name = 'consumo')
conteudo <- memdb_frame(conteudo, .name = 'conteudo')
# Inserir variável minuto
consumo <- consumo %>%
mutate('minutos_consumidos' = horas_consumidas * 60)
# Imprimir query
consumo %>% show_query()
## <SQL>
## SELECT `id_user`, `id_conteudo`, `data`, `data_aux`, `mes`, `horas_consumidas`, `horas_consumidas` * 60.0 AS `minutos_consumidos`
## FROM `consumo`
Para concluir a introdução, vamos verificar como ficaram os dois databases que serão utilizados neste teste. Para isso, as primeiras linhas dos dois databases serão impressas.
# Imprimir cabeçalhos dos databases
# Consumo
consumo %>%
select(-c(data)) %>%
head() %>%
kable() %>%
kable_styling(bootstrap_options = c('striped','hover','condensed','responsive'), full_width = F)
id_user | id_conteudo | data_aux | mes | horas_consumidas | minutos_consumidos |
---|---|---|---|---|---|
150 | 10406 | 2019-07-07 | 7 | 0.2725694 | 16.35416 |
139 | 10352 | 2019-11-24 | 11 | 0.5881346 | 35.28808 |
182 | 10206 | 2019-07-26 | 7 | 0.8201295 | 49.20777 |
199 | 10835 | 2019-11-10 | 11 | 0.2426171 | 14.55702 |
185 | 10406 | 2019-11-19 | 11 | 0.9750948 | 58.50569 |
144 | 10777 | 2019-11-09 | 11 | 0.5271769 | 31.63061 |
# Conteudo
conteudo %>%
head() %>%
kable() %>%
kable_styling(bootstrap_options = c('striped','hover','condensed','responsive'), full_width = F)
id_conteudo | conteudo | categoria |
---|---|---|
10406 | A | novela |
10352 | B | serie |
10206 | C | novela |
10835 | D | serie |
Após essas manipulação inicial dos datasets, as 6 tarefas propostas pelo teste podem ser realizadas.
Quantidade de horas consumidas e plays por categoria.
total_horas_e_play <- consumo %>%
left_join(conteudo, by = 'id_conteudo') %>%
group_by(categoria) %>%
summarise('horas_consumidas' = sum(horas_consumidas, na.rm = TRUE),
'play' = n()) %>%
filter(!is.na(categoria)) %>%
ungroup()
# Imprimir query
total_horas_e_play %>% show_query()
## <SQL>
## SELECT *
## FROM (SELECT `categoria`, SUM(`horas_consumidas`) AS `horas_consumidas`, COUNT(*) AS `play`
## FROM (SELECT `id_user`, `LHS`.`id_conteudo` AS `id_conteudo`, `data`, `data_aux`, `mes`, `horas_consumidas`, `minutos_consumidos`, `conteudo`, `categoria`
## FROM (SELECT `id_user`, `id_conteudo`, `data`, `data_aux`, `mes`, `horas_consumidas`, `horas_consumidas` * 60.0 AS `minutos_consumidos`
## FROM `consumo`) AS `LHS`
## LEFT JOIN `conteudo` AS `RHS`
## ON (`LHS`.`id_conteudo` = `RHS`.`id_conteudo`)
## )
## GROUP BY `categoria`)
## WHERE (NOT(((`categoria`) IS NULL)))
Vamos checar o resultado da Tarefa 1.
# Imprimir tabela
total_horas_e_play %>%
kable() %>%
kable_styling(bootstrap_options = c('striped','hover','condensed','responsive'), full_width = F)
categoria | horas_consumidas | play |
---|---|---|
novela | 3.698361 | 9 |
serie | 7.275524 | 13 |
Ranking de novelas com mais horas consumidas por mês.
# Gerar query
ranking_novela <- consumo %>%
left_join(conteudo, by = 'id_conteudo') %>%
group_by(mes, id_conteudo) %>%
summarise('horas_consumidas' = sum(horas_consumidas, na.rm = TRUE)) %>%
arrange(desc(mes), desc(horas_consumidas)) %>%
ungroup()
# Imprimir query
ranking_novela %>% show_query()
## <SQL>
## SELECT `mes`, `id_conteudo`, SUM(`horas_consumidas`) AS `horas_consumidas`
## FROM (SELECT `id_user`, `LHS`.`id_conteudo` AS `id_conteudo`, `data`, `data_aux`, `mes`, `horas_consumidas`, `minutos_consumidos`, `conteudo`, `categoria`
## FROM (SELECT `id_user`, `id_conteudo`, `data`, `data_aux`, `mes`, `horas_consumidas`, `horas_consumidas` * 60.0 AS `minutos_consumidos`
## FROM `consumo`) AS `LHS`
## LEFT JOIN `conteudo` AS `RHS`
## ON (`LHS`.`id_conteudo` = `RHS`.`id_conteudo`)
## )
## GROUP BY `mes`, `id_conteudo`
## ORDER BY `mes` DESC, `horas_consumidas` DESC
Vamos checar o resultado da Tarefa 2.
# Imprimir tabela
ranking_novela %>%
kable() %>%
kable_styling(bootstrap_options = c('striped','hover','condensed','responsive'), full_width = F)
mes | id_conteudo | horas_consumidas |
---|---|---|
11 | 10352 | 3.3546381 |
11 | 10406 | 0.9750948 |
11 | 10835 | 0.6962910 |
11 | 10777 | 0.5271769 |
10 | 10406 | 0.5778600 |
10 | 10352 | 0.1633538 |
9 | 10352 | 0.5413416 |
9 | 10777 | 0.4206381 |
8 | 10777 | 0.8182963 |
8 | 10835 | 0.7963525 |
8 | 10352 | 0.6050598 |
7 | 10406 | 1.1302770 |
7 | 10835 | 1.1184877 |
7 | 10206 | 1.0151295 |
Conteúdo de primeiro play do usuário.
# Gerar query
primeiro_play <- consumo %>%
left_join(conteudo, by = 'id_conteudo') %>%
group_by(id_user) %>%
filter(data == min(data, na.rm = TRUE)) %>%
ungroup()
# Imprimir query
primeiro_play %>% show_query()
## <SQL>
## SELECT `id_user`, `id_conteudo`, `data`, `data_aux`, `mes`, `horas_consumidas`, `minutos_consumidos`, `conteudo`, `categoria`
## FROM (SELECT `id_user`, `id_conteudo`, `data`, `data_aux`, `mes`, `horas_consumidas`, `minutos_consumidos`, `conteudo`, `categoria`, MIN(`data`) OVER (PARTITION BY `id_user`) AS `q01`
## FROM (SELECT `id_user`, `LHS`.`id_conteudo` AS `id_conteudo`, `data`, `data_aux`, `mes`, `horas_consumidas`, `minutos_consumidos`, `conteudo`, `categoria`
## FROM (SELECT `id_user`, `id_conteudo`, `data`, `data_aux`, `mes`, `horas_consumidas`, `horas_consumidas` * 60.0 AS `minutos_consumidos`
## FROM `consumo`) AS `LHS`
## LEFT JOIN `conteudo` AS `RHS`
## ON (`LHS`.`id_conteudo` = `RHS`.`id_conteudo`)
## ))
## WHERE (`data` = `q01`)
Vamos checar o resultado da Tarefa 3.
# Imprimir tabela
primeiro_play %>%
select(-c(id_conteudo, data, mes, horas_consumidas, minutos_consumidos)) %>%
kable() %>%
kable_styling(bootstrap_options = c('striped','hover','condensed','responsive'), full_width = F)
id_user | data_aux | conteudo | categoria |
---|---|---|---|
136 | 2019-07-18 | C | novela |
139 | 2019-11-24 | B | serie |
144 | 2019-07-03 | A | novela |
150 | 2019-07-07 | A | novela |
182 | 2019-07-26 | C | novela |
185 | 2019-07-21 | D | serie |
199 | 2019-07-24 | A | novela |
Minutos por play para cada usuário.
# Gerar query
play_minutos <- consumo %>%
group_by(id_user) %>%
summarise('minutos_consumidos' = sum(minutos_consumidos, na.rm = TRUE),
'play' = n()) %>%
mutate('minutos_por_play' = minutos_consumidos/play) %>%
ungroup()
# Imprimir query
play_minutos %>% show_query()
## <SQL>
## SELECT `id_user`, `minutos_consumidos`, `play`, `minutos_consumidos` / `play` AS `minutos_por_play`
## FROM (SELECT `id_user`, SUM(`minutos_consumidos`) AS `minutos_consumidos`, COUNT(*) AS `play`
## FROM (SELECT `id_user`, `id_conteudo`, `data`, `data_aux`, `mes`, `horas_consumidas`, `horas_consumidas` * 60.0 AS `minutos_consumidos`
## FROM `consumo`)
## GROUP BY `id_user`)
Vamos checar o resultado da Tarefa 4.
# Imprimir tabela
play_minutos %>%
kable() %>%
kable_styling(bootstrap_options = c('striped','hover','condensed','responsive'), full_width = F)
id_user | minutos_consumidos | play | minutos_por_play |
---|---|---|---|
136 | 52.33049 | 3 | 17.44350 |
139 | 35.28808 | 1 | 35.28808 |
144 | 178.71787 | 6 | 29.78631 |
150 | 60.23956 | 3 | 20.07985 |
182 | 142.07717 | 3 | 47.35906 |
185 | 132.41731 | 4 | 33.10433 |
199 | 163.32934 | 5 | 32.66587 |
Qual a categoria mais consumida para cada usuário.
total_categoria <- consumo %>%
left_join(conteudo, by = 'id_conteudo') %>%
count(id_user, categoria) %>%
filter(!is.na(categoria))
# Imprimir query
total_categoria %>% show_query()
## <SQL>
## SELECT *
## FROM (SELECT `id_user`, `categoria`, COUNT(*) AS `n`
## FROM (SELECT `id_user`, `LHS`.`id_conteudo` AS `id_conteudo`, `data`, `data_aux`, `mes`, `horas_consumidas`, `minutos_consumidos`, `conteudo`, `categoria`
## FROM (SELECT `id_user`, `id_conteudo`, `data`, `data_aux`, `mes`, `horas_consumidas`, `horas_consumidas` * 60.0 AS `minutos_consumidos`
## FROM `consumo`) AS `LHS`
## LEFT JOIN `conteudo` AS `RHS`
## ON (`LHS`.`id_conteudo` = `RHS`.`id_conteudo`)
## )
## GROUP BY `id_user`, `categoria`)
## WHERE (NOT(((`categoria`) IS NULL)))
Vamos checar o resultado da Tarefa 5.
# Imprimir tabela
total_categoria %>%
kable() %>%
kable_styling(bootstrap_options = c('striped','hover','condensed','responsive'), full_width = F)
id_user | categoria | n |
---|---|---|
136 | novela | 1 |
136 | serie | 2 |
139 | serie | 1 |
144 | novela | 3 |
144 | serie | 2 |
150 | novela | 2 |
150 | serie | 1 |
182 | novela | 1 |
182 | serie | 2 |
185 | novela | 1 |
185 | serie | 3 |
199 | novela | 1 |
199 | serie | 2 |
Conte uma história com os dados! Não precisa ser nada complexo. O objetivo é entendermos como você lida com informações e as analisa.
plot <- ggplot(consumo %>%
left_join(conteudo, by = 'id_conteudo') %>%
filter(!is.na(categoria)),
aes(x = as.Date(data_aux, format = '%Y-%m-%d'),
y = minutos_consumidos,
col = as.factor(categoria))) +
geom_line()+
geom_point(aes(text = paste('Minutos Consumidos:', round(minutos_consumidos,2),
'<br>Categoria:', categoria,
'<br>Data:', data_aux)),
size = 0.5) +
xlab('Data') +
ylab('Minutos Consumidos') +
labs(col = 'Categoria') +
theme_minimal()
ggplotly(plot, tooltip = 'text')
O gráfico criado mostra que no período entre os meses de Agosto e Outubro de 2019 houve uma grande diferença entre a os minutos consumidos das categorias serie e novela.