Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- library(shiny)
- library(shinydashboard)
- library(data.table)
- library(ggplot2)
- library(shinyjs)
- library(shinyBS)
- library(dplyr)
- library(scales)
- library(magrittr)
- library(RPostgreSQL)
- library(bit64)
- library(stringr)
- #library(geojsonio)
- #library(leaflet)
- ##==========================================================================================================================
- ## Leitura dos dados do Banco de dados e procedimentos de join
- ## Nesta seção os dados são lidos do banco de dados e são feitos alguns joins
- ##==========================================================================================================================
- #Carregando o Driver
- drv <- dbDriver("PostgreSQL")
- #Conectando com a Base de dados
- con <- dbConnect(drv, dbname = "mtb",
- host = "10.1.0.4", port = 5432,
- user = "radar", password = "RadaR_@5112@18")
- #Lendo as tabelas em datraframes
- mdl_user <- dbGetQuery(con, "SELECT * FROM public.mdl_user")
- mdl_user_enrolments <- dbGetQuery(con, "SELECT * FROM public.mdl_user_enrolments")
- mdl_enrol <- dbGetQuery(con, "SELECT * FROM public.mdl_enrol")
- mdl_course <- dbGetQuery(con, "SELECT * FROM public.mdl_course")
- mdl_course_categories <- dbGetQuery(con, "SELECT * FROM public.mdl_course_categories")
- mdl_badge_issued <- dbGetQuery(con, "SELECT * FROM public.mdl_badge_issued")
- dim_estudante <- fread("dados/dim_estudante.csv")
- #Disconectando
- dbDisconnect(con)
- #Descarregando o Driver
- dbUnloadDriver(drv)
- # Selecionando apenas as colunas utilizáveis
- mdl_user <- select(mdl_user, c("id", "auth", "confirmed", "username", "idnumber", "firstname", "lastname", "email", "country", "lang", "calendartype", "timezone", "firstaccess", "lastaccess", "lastlogin", "currentlogin", "lastip", "timecreated", "alternatename"))
- #Renomeando 'timecreated' para 'tempocadastro' , 'alternatename' para 'cpf' e "id" para "userid"
- mdl_user <- rename(mdl_user, tempocadastro = timecreated)
- mdl_user <- rename(mdl_user, cpf = alternatename)
- mdl_user <- rename(mdl_user, userid = id)
- # NÚMERO DE ALUNOS POR CPF
- alunos <- mdl_user[!is.na(mdl_user$cpf),]
- alunos <- alunos[alunos$cpf != "",]
- alunos <- alunos[!duplicated(alunos$cpf),]
- #### ADICIONANDO MAIS INFORMAÇÕES SOBRE UF
- #Manipulacoes CPF em 'dim_estudante'
- dim_estudante$cpf <- str_pad(dim_estudante$cpf, 11, pad = "0")
- dim_estudante$cpf <- as.character(dim_estudante$cpf)
- #Manipulacoes CPF em 'alunos'
- #Retirando 'pontuação'
- alunos$cpf <- gsub("[[:punct:]]", "", alunos$cpf)
- alunos$cpf <- as.character(alunos$cpf)
- #Juntando 'dim_estudante' com 'matriculas_curso' por CPF
- alunos <- left_join(alunos, dim_estudante, by='cpf')
- #SUBSTITUINDO NA's por "NI"
- alunos[is.na(alunos)] <- c("NI")
- ##############################
- # MATRÍCULAS EM CURSOS
- matriculas_curso <- mdl_user_enrolments
- # Joins para obter courseid, e fullname (nome do curso)
- mdl_enrol <- rename(mdl_enrol, enrolid = id)
- mdl_course <- rename(mdl_course, courseid = id)
- mdl_enrol <- rename(mdl_enrol, enrolname = name)
- mdl_course_categories <- rename(mdl_course_categories, categoryName = name)
- course_enrol_join <- mdl_course
- course_enrol_join <- merge(course_enrol_join, mdl_enrol, by.x = "courseid", by.y = "courseid", all.y = TRUE)
- course_enrol_join <- merge(course_enrol_join, mdl_course_categories, by.x = "category", by.y = "id")
- # Seleção de colunas a manter
- keep = c(
- "courseid",
- "fullname",
- "enrolid",
- "categoryName"
- )
- course_enrol_join <- subset(course_enrol_join, select = keep)
- course_enrol_join <- distinct(course_enrol_join)
- matriculas_curso <- left_join(mdl_user_enrolments, course_enrol_join, by = "enrolid")
- matriculas_curso <- select(matriculas_curso, -c("id", "status", "modifierid", "timemodified"))
- # Adição de informação dos alunos através do join com a tabela alunos
- matriculas_curso <- left_join(matriculas_curso, alunos, by = "userid")
- # Remoção de CPFs duplicados para o mesmo curso
- matriculas_curso <- distinct(matriculas_curso, cpf, courseid, .keep_all = TRUE)
- ##############################
- # QUALIFICAÇÕES
- # Join por 'userid' com 'alunos'
- qualificacoes_cpf <- distinct(mdl_badge_issued)
- qualificacoes_cpf <- left_join(qualificacoes_cpf, alunos, by = "userid")
- # Substituindo NA por NI
- qualificacoes_cpf[is.na(qualificacoes_cpf)] <- c("NI")
- ##==========================================================================================================================
- #script para criar output cursos_finalizacao_horas
- source("scripts/relacionamento_horas_usuarios.R")
- # Lista de cursos
- cursos_lista <- fread("dados/processados/course_enrol_join.csv", encoding = "UTF-8")
- cursos_lista <- unique(cursos_lista$fullname)
- cursos_lista <- cursos_lista[order(cursos_lista)]
- # Carrega os dados
- user_course_badge_info <- fread("dados/processados/user_course_badge_info.csv", encoding = "UTF-8")
- quiz_attempts_user_enrol <- fread("dados/processados/quiz_attempts_user_enrol.csv", encoding = "UTF-8")
- user_enrolment_course_info <- fread("dados/processados/user_enrolment_course_info.csv", encoding = "UTF-8")
- users_info <- fread("dados/processados/sis_joined_student_info.csv", encoding = "UTF-8")
- contaNaoInformados <- function(array, value = "") {
- total <- length(array)
- array <- array[array == value]
- paste("Não Informados : ", format(length(array), big.mark=","), " (", round(100*length(array)/total, 2), "%)")
- }
- function(input, output, session) {
- ##==========================================================================================================================
- ## TAB Cursos Dados
- ## Esta secao contem os dados que sao utilizados na tab cursos
- ## Em geral, os dados da tab cursos sao filtrados pelos cursos selecionados pelo usuarios
- ##==========================================================================================================================
- # Dados das conclusoes dos usuarios filtrados por curso
- user_course_badge_info_filtrado <- reactive({
- input$curso_process_button
- inicio_periodo <- as.POSIXlt(Sys.Date())
- fim_periodo <- as.POSIXlt(Sys.Date())
- tempo_cadastro <- user_course_badge_info$dateissued
- if (input$cursos_filtro_periodo == "Desde o início") {
- inicio_periodo = 0
- } else if (input$cursos_filtro_periodo == "último ano") {
- inicio_periodo$mday <- inicio_periodo$mday - 365
- } else if (input$cursos_filtro_periodo == "último mês") {
- inicio_periodo$mday <- inicio_periodo$mday - 30
- } else if (input$cursos_filtro_periodo == "última semana") {
- inicio_periodo$mday <- inicio_periodo$mday - 7
- } else if (input$cursos_filtro_periodo == "último dia") {
- inicio_periodo$mday <- inicio_periodo$mday - 1
- } else if (input$cursos_filtro_periodo == "Período personalizado") {
- inicio_periodo <- as.POSIXlt(input$cursos_filtro_periodo_personalizado[1])
- fim_periodo <- as.POSIXlt(input$cursos_filtro_periodo_personalizado[2])
- }
- cursos_filtrados <- user_course_badge_info[tempo_cadastro >= as.numeric(inicio_periodo) & tempo_cadastro < as.numeric(fim_periodo),]
- if(input$cursos_filtro_uf != "Todas" && input$cursos_filtro_uf != "Não informado") {
- cursos_filtrados <- subset(cursos_filtrados, input$cursos_filtro_uf == cursos_filtrados$uf)
- }
- else if (input$cursos_filtro_uf == "Não informado") {
- cursos_filtrados <- subset(cursos_filtrados, cursos_filtrados$uf == "")
- }
- rows <- cursos_filtrados$fullname %in% isolate(input$curso_filtro_curso)
- cursos_filtrados[rows,]
- })
- # Dados dos cadastros dos usuarios filtrados por curso
- user_enrolment_course_info_filtrado <- reactive({
- input$curso_process_button
- inicio_periodo <- as.POSIXlt(Sys.Date())
- fim_periodo <- as.POSIXlt(Sys.Date())
- tempo_cadastro <- user_enrolment_course_info$timecreated
- if (input$cursos_filtro_periodo == "Desde o início") {
- inicio_periodo = 0
- } else if (input$cursos_filtro_periodo == "último ano") {
- inicio_periodo$mday <- inicio_periodo$mday - 365
- } else if (input$cursos_filtro_periodo == "último mês") {
- inicio_periodo$mday <- inicio_periodo$mday - 30
- } else if (input$cursos_filtro_periodo == "última semana") {
- inicio_periodo$mday <- inicio_periodo$mday - 7
- } else if (input$cursos_filtro_periodo == "último dia") {
- inicio_periodo$mday <- inicio_periodo$mday - 1
- } else if (input$cursos_filtro_periodo == "Período personalizado") {
- inicio_periodo <- as.POSIXlt(input$cursos_filtro_periodo_personalizado[1])
- fim_periodo <- as.POSIXlt(input$cursos_filtro_periodo_personalizado[2])
- }
- cursos_filtrados <- user_enrolment_course_info[tempo_cadastro >= as.numeric(inicio_periodo) & tempo_cadastro < as.numeric(fim_periodo),]
- if(input$cursos_filtro_uf != "Todas" && input$cursos_filtro_uf != "Não informado") {
- cursos_filtrados <- subset(cursos_filtrados, input$cursos_filtro_uf == cursos_filtrados$uf)
- }
- else if (input$cursos_filtro_uf == "Não informado") {
- cursos_filtrados <- subset(cursos_filtrados, cursos_filtrados$uf == "")
- }
- rows <- cursos_filtrados$fullname %in% isolate(input$curso_filtro_curso)
- cursos_filtrados[rows,]
- })
- # Dados de testes finalizados filtrados por curso
- quiz_finished_attempts_user_enrol_filtrado <- reactive({
- input$curso_process_button
- inicio_periodo <- as.POSIXlt(Sys.Date())
- fim_periodo <- as.POSIXlt(Sys.Date())
- tempo_cadastro <- quiz_attempts_user_enrol$tempocadastro
- if (input$cursos_filtro_periodo == "Desde o início") {
- inicio_periodo = 0
- } else if (input$cursos_filtro_periodo == "último ano") {
- inicio_periodo$mday <- inicio_periodo$mday - 365
- } else if (input$cursos_filtro_periodo == "último mês") {
- inicio_periodo$mday <- inicio_periodo$mday - 30
- } else if (input$cursos_filtro_periodo == "última semana") {
- inicio_periodo$mday <- inicio_periodo$mday - 7
- } else if (input$cursos_filtro_periodo == "último dia") {
- inicio_periodo$mday <- inicio_periodo$mday - 1
- } else if (input$cursos_filtro_periodo == "Período personalizado") {
- inicio_periodo <- as.POSIXlt(input$cursos_filtro_periodo_personalizado[1])
- fim_periodo <- as.POSIXlt(input$cursos_filtro_periodo_personalizado[2])
- }
- cursos_filtrados <- quiz_attempts_user_enrol[tempo_cadastro >= as.numeric(inicio_periodo) & tempo_cadastro < as.numeric(fim_periodo),]
- if(input$cursos_filtro_uf != "Todas" && input$cursos_filtro_uf != "Não informado") {
- cursos_filtrados <- subset(cursos_filtrados, input$cursos_filtro_uf == cursos_filtrados$uf)
- }
- else if (input$cursos_filtro_uf == "Não informado") {
- cursos_filtrados <- subset(cursos_filtrados, cursos_filtrados$uf == "")
- }
- rows <- cursos_filtrados$fullname %in% isolate(input$curso_filtro_curso)
- rows <- cursos_filtrados[rows,]
- # seleciona apenas casos que o quiz foi finalizado
- rows[rows$timefinish != 0,]
- })
- #Indica todos os cursos que foram selecionados
- cursos_selecionados <- reactive({ #Ainda nao funcionando
- input$curso_process_button
- rows <- user_course_badge_info$fullname %in% isolate(input$curso_filtro_curso)
- cursos_selecionados <- levels(as.factor(user_course_badge_info[rows,2]))
- })
- # Quantidade de cadastros e concluintes filtrados por curso agrupados por diferentes variaveis
- quantidade_concluintes_por_curso <- reactive({
- table <- select(user_course_badge_info_filtrado(), c(fullname, cpf))
- table %>% group_by(fullname) %>% summarise(concluintes = unique(length(cpf)))
- })
- quantidade_cadastrados_por_curso <- reactive({
- table <- select(user_enrolment_course_info_filtrado(), c(fullname, cpf))
- table %>% group_by(fullname) %>% summarise(cadastrados = unique(length(cpf)))
- })
- quantidade_concluintes_por_idade <- reactive({
- table <- select(user_course_badge_info_filtrado(), c(idade, cpf))
- table %>% group_by(idade) %>% summarise(concluintes = unique(length(cpf)))
- })
- quantidade_cadastrados_por_idade <- reactive({
- table <- select(user_enrolment_course_info_filtrado(), c(idade, cpf))
- table %>% group_by(idade) %>% summarise(cadastrados = unique(length(cpf)))
- })
- quantidade_concluintes_por_tempo_desempregado <- reactive({
- table <- select(user_course_badge_info_filtrado(), c(tempo_desempregado, cpf))
- table %>% group_by(tempo_desempregado) %>% summarise(concluintes = unique(length(cpf)))
- })
- quantidade_cadastrados_por_tempo_desempregado <- reactive({
- table <- select(user_enrolment_course_info_filtrado(), c(tempo_desempregado, cpf))
- table %>% group_by(tempo_desempregado) %>% summarise(cadastrados = unique(length(cpf)))
- })
- quantidade_concluintes_por_escolaridade <- reactive({
- table <- select(user_course_badge_info_filtrado(), c(escolaridade, cpf))
- table %>% group_by(escolaridade) %>% summarise(concluintes = unique(length(cpf)))
- })
- quantidade_cadastrados_por_escolaridade <- reactive({
- table <- select(user_enrolment_course_info_filtrado(), c(escolaridade, cpf))
- table %>% group_by(escolaridade) %>% summarise(cadastrados = unique(length(cpf)))
- })
- quantidade_concluintes_por_dominio <- reactive({
- table <- select(user_course_badge_info_filtrado(), c(dominio, cpf))
- table %>% group_by(dominio) %>% summarise(concluintes = unique(length(cpf)))
- })
- quantidade_cadastrados_por_dominio <- reactive({
- table <- select(user_enrolment_course_info_filtrado(), c(dominio, cpf))
- table %>% group_by(dominio) %>% summarise(cadastrados = unique(length(cpf)))
- })
- # Dados dos usuarios cadastrados filtrados por curso, removendo as entradas de usuarios cadastrados
- # em mais de um dos cursos selecionados
- user_enrolment_course_info_filtrado_unique <- reactive({
- user_enrolment_course_info_filtrado()[!duplicated(user_enrolment_course_info_filtrado()[,c('userid')]),]
- })
- ##==========================================================================================================================
- ## TAB Cursos Outputs
- ## Esta secao contem todos os outputs (Tabelas, Textos e Graficos) que sao utilizados na tab cursos
- ##==========================================================================================================================
- # Histograma que agrupa as pessoas pelas horas que demoraram para completar o curso
- # As horas consistem do tempo entre o cadastro no curso e o momento em que o usuario recebeu a badge do curso
- output$cursos_finalizacao_horas <- renderPlot({ #Ainda testando
- curso <- as.vector(cursos_selecionados())
- #Gera dados para montar histograma
- if(length(curso) > 1) {
- dadosGrafico <- dadosTempo[dadosTempo$courseid == as.nuemric(curso[1])]
- } else {
- dadosGrafico <- dadosTempo[dadosTempo$courseid == as.numeric(curso)]
- }
- #Valida se os dados foram gerados
- shiny::validate(need(nrow(dadosGrafico) > 0, "Nenhum dado encontrado!"))
- #Gera o grafico para o output
- dadosGrafico <- retorna_dados_grafico_desemprego(cursoId = dadosGrafico)
- dfc<-data.frame(do.call(rbind,by(data = dadosGrafico[,-1],INDICES = dadosGrafico$faixa,FUN = colSums)))
- dfc$faixa<-rownames(dfc)
- df.long<-melt(dfc,id.vars="faixa") # formatar para long
- plot(ggplot(df.long,aes(x=faixa,y=value,fill=factor(variable)))+
- geom_bar(stat="identity",position="dodge")+
- scale_fill_discrete(name="Tipo de Usuario:")+
- ylab("Porcentagem"))
- })
- # Grafico com barras que mostra a proporcao de pessoas que se cadastraram e concluiram o curso e que nao concluiram
- output$cursos_cadastro_e_concluintes <- renderPlot({
- # Verifica se tabela tem pelo menos uma linha
- shiny::validate(need(nrow(user_course_badge_info_filtrado()) > 0, "Nenhum dado encontrado!"))
- shiny::validate(need(nrow(user_enrolment_course_info_filtrado()) > 0, "Nenhum dado encontrado!"))
- # Dados
- completedRows = user_course_badge_info_filtrado() # Quantidade de concluintes
- enrolRows = user_enrolment_course_info_filtrado() # Quantidade de cadastros
- total = nrow(enrolRows) # Total de cadastros
- # Dataframe com as proporcoes
- concluintes = nrow(completedRows)
- naoConcluintes = (total-nrow(completedRows))
- frequencia = c(concluintes, naoConcluintes)
- dados <- data.frame(Var1 = c("Concluintes", "Não Concluintes"), Freq = frequencia)
- dados <- mutate(dados, pct=prop.table(dados$Freq)*100)
- # Cria grafico
- ggplot(dados, aes(x = Var1, y = Freq, fill = Var1,label =paste(Freq,pct))) +
- geom_bar(stat = "identity", position = position_dodge(width=1), width = 0.5) +
- geom_text(aes(y = Freq, label = paste(comma(Freq),"\n(",round(pct, digits = 2),"%)",sep="")), position = position_dodge(width = 0.8), vjust=-0.5, size = 3.3)+
- theme_classic()+
- labs(caption="Fonte: Escola do Trabalhador\nhttp://escola.trabalho.gov.br") +
- xlab("") +
- ylab("Quantidade")+
- theme(axis.text.x = element_text(size=11,angle=0, vjust=0.6),
- axis.text.y = element_text(size=11),
- axis.title=element_text(size=14),
- plot.title = element_text(size = rel(2)),
- plot.caption=element_text(size=10))+
- scale_fill_manual(values=c("steelblue", "tomato3"), name="")+
- scale_y_continuous(labels = comma, limits = c(0,max(dados$Freq)*1.15))
- })
- # ScatterPlot das Horas x Nota no teste
- # As horas consistem do momento do cadastro ate a finalizacao do teste
- output$cursos_nota_horas <- renderPlot({
- # Verifica se tabela tem pelo menos uma linha
- shiny::validate(need(nrow(quiz_finished_attempts_user_enrol_filtrado()) > 0, "Nenhum dado encontrado!"))
- # Dados
- selectedRows = quiz_finished_attempts_user_enrol_filtrado()
- selectedRows = mutate(selectedRows, horas = (timefinish - tempocadastro)/3600) # Cria coluna com as horas
- # Cria Grafico
- ggplot(selectedRows, aes(x=horas, y=sumgrades)) +
- geom_jitter(color = "steelblue", alpha = 0.2) + # Jitter, para melhor visualizacao
- xlab("Horas desde o cadastro") +
- ylab("Nota no teste")
- })
- # Tabela relacionada ao grafico ScatterPlot das Horas x Nota no teste
- # Agrupa os dados por nota e exibe os dados de media, mediana, e desvio padrao das horas
- output$cursos_nota_horas_table <- renderDataTable({
- # Verifica se tabela tem pelo menos uma linha
- shiny::validate(need(nrow(quiz_finished_attempts_user_enrol_filtrado()) > 0, ""))
- # Dados
- selectedRows <- quiz_finished_attempts_user_enrol_filtrado()
- selectedRows <- mutate(selectedRows, horas = (timefinish - tempocadastro)/3600)
- # Gera estatisticas
- selectedRows <- selectedRows %>% group_by(sumgrades) %>% summarise(testQuant = n(), media = mean(horas), mediana = median(horas), sd = sd(horas))
- # Renomeia colunas
- names(selectedRows)[names(selectedRows) == 'sumgrades'] <- 'Nota'
- names(selectedRows)[names(selectedRows) == 'testQuant'] <- 'Quantidade'
- names(selectedRows)[names(selectedRows) == 'mediana'] <- "Mediana"
- names(selectedRows)[names(selectedRows) == 'media'] <- "Média"
- names(selectedRows)[names(selectedRows) == 'sd'] <- "DP"
- # Retorna dataframe
- selectedRows
- },
- # Parametros do DataTables
- options = list(
- pageLength = 8, # quantidade de resultados por pagina
- searching = FALSE, # desabilita funcionalidade de searching
- lengthChange = FALSE, # desabilita funcionalidade de troca de quantidade
- info = FALSE, # esconde informacoes do footer
- rowCallback = I( # Modifica vizualizacao de algumas celulas da tabela
- 'function(row, data) {
- // Arredonda para dois digitos
- $("td:eq(2)", row).html(parseFloat(data[2]).toFixed(2));
- $("td:eq(3)", row).html(parseFloat(data[3]).toFixed(2));
- $("td:eq(4)", row).html(parseFloat(data[4]).toFixed(2));
- // Alinha numeros a direita
- $("td:eq(0)", row).css("text-align", "right");
- $("td:eq(1)", row).css("text-align", "right");
- $("td:eq(2)", row).css("text-align", "right");
- $("td:eq(3)", row).css("text-align", "right");
- $("td:eq(4)", row).css("text-align", "right");
- }')
- )
- )
- # Grafico de barras da quantidade de notas dos testes
- output$cursos_nota_quantidade <- renderPlot({
- # Verifica se tabela tem pelo menos uma linha
- shiny::validate(need(nrow(quiz_finished_attempts_user_enrol_filtrado()) > 0, "Nenhum dado encontrado!"))
- # Cria Grafico
- ggplot(quiz_finished_attempts_user_enrol_filtrado(), aes(x = sumgrades)) +
- geom_bar() +
- xlab("Nota") +
- ylab("Quantidade") +
- scale_x_continuous("Notas",
- limits = c(-1, 11),
- breaks = seq(0, 10, by = 1)) # ordena os dados
- })
- # Grafico de linhas da quantidade de notas dos testes separados por cursos
- # Grafico nao utilizado
- output$cursos_nota_quantidade_todos <- renderPlot({
- # Verifica se tabela tem pelo menos uma linha
- shiny::validate(need(nrow(quiz_finished_attempts_user_enrol_filtrado()) > 0, "Nenhum dado encontrado!"))
- # Dados
- selectedRows <- quiz_finished_attempts_user_enrol_filtrado()
- selectedRows <- select(selectedRows, c(fullname, sumgrades))
- selectedRows <- as.data.frame(table(selectedRows))
- # Cria Grafico
- ggplot(data = selectedRows, aes(x = sumgrades, y = Freq, colour = fullname, group = fullname)) +
- geom_line(size = 1) +
- xlab("Nota") +
- ylab("Quantidade") +
- labs(color='Curso')
- })
- # Tabela com as estatisticas dos cursos
- # Mostra cadastrados, concluintes, teste finalizados, media de notas e desvio padras das notas
- output$cursos_nota_analise_todos <- renderDataTable({
- # Verifica se tabela tem pelo menos uma linha
- shiny::validate(need(nrow(quiz_finished_attempts_user_enrol_filtrado()) > 0, "Nenhum dado encontrado!"))
- # Dados
- selectedRows <- quiz_finished_attempts_user_enrol_filtrado()
- selectedRows <- select(selectedRows, c(fullname, sumgrades))
- selectedRows <- as.data.frame(selectedRows)
- # Gera estatisticas, media das notas e desvio padrao
- selectedRows <- selectedRows %>% group_by(fullname) %>% summarise(testQuant = n(), media = mean(sumgrades), sd = sd(sumgrades))
- # Join com outros dados
- # Quantidade de cadastrados
- selectedRows <- merge(selectedRows, quantidade_cadastrados_por_curso(), by.x = "fullname", by.y = "fullname")
- # Quantidade de concluintes
- selectedRows <- merge(selectedRows, quantidade_concluintes_por_curso(), by.x = "fullname", by.y = "fullname")
- # Reordena colunas
- selectedRows <- selectedRows[c('fullname', 'cadastrados', 'concluintes', 'testQuant', 'media', 'sd')]
- # Renomeia colunas
- names(selectedRows)[names(selectedRows) == 'fullname'] <- 'Curso'
- names(selectedRows)[names(selectedRows) == 'media'] <- 'Média das Notas'
- names(selectedRows)[names(selectedRows) == 'sd'] <- "Desvio Padrão das Notas"
- names(selectedRows)[names(selectedRows) == 'testQuant'] <- "Testes Finalizados"
- names(selectedRows)[names(selectedRows) == 'cadastrados'] <- "Matrículas"
- names(selectedRows)[names(selectedRows) == 'concluintes'] <- "Qualificações"
- # Retorna dataframe
- selectedRows
- },
- options = list(
- paging = FALSE, # Desabilita a troca de paginas
- searching = FALSE, # desabilita funcionalidade de searching
- lengthChange = FALSE, # desabilita funcionalidade de troca de quantidade
- info = FALSE, # esconde informacoes do footer
- rowCallback = I( # Modifica vizualizacao de algumas celulas da tabela
- 'function(row, data) {
- // Concatena porcentagem
- var porcentagem = parseFloat(100*data[2]/data[1]).toFixed(2)
- $("td:eq(2)", row).html(data[2] + " (" + porcentagem + "%)");
- // Arredonda para dois digitos
- $("td:eq(5)", row).html(parseFloat(data[5]).toFixed(2));
- $("td:eq(4)", row).html(parseFloat(data[4]).toFixed(2));
- // Alinha numeros a direita
- $("td:eq(1)", row).css("text-align", "right");
- $("td:eq(2)", row).css("text-align", "right");
- $("td:eq(3)", row).css("text-align", "right");
- $("td:eq(4)", row).css("text-align", "right");
- $("td:eq(5)", row).css("text-align", "right");
- }'),
- footerCallback = I(
- 'function( tfoot, data, start, end, display ) {
- var api = this.api(), data;
- $( api.column(5).footer()).html("YEY");
- }'
- )
- )
- )
- # Grafico de barras que mostra a proporcao dos generos dos usuarios cadastrados
- output$cursos_genero <- renderPlot({
- # Verifica se tabela tem pelo menos uma linha
- shiny::validate(need(nrow(user_enrolment_course_info_filtrado_unique()) > 0, "Nenhum dado encontrado!"))
- sexo <- user_enrolment_course_info_filtrado_unique()$sexo
- # Remove nao informados
- sexo <- sexo[sexo != ""]
- # Verifica se tabela tem pelo menos uma linha informados
- shiny::validate(need(length(sexo) > 0, ""))
- sexo <- table(sexo)
- # renomeia colunas
- names(sexo)[names(sexo) == 'Masculino'] <- 'Masculino'
- names(sexo)[names(sexo) == 'Feminino'] <- 'Feminino'
- # Gera porcentagens
- sexo <- as.data.frame(sexo)
- sexo <- mutate(sexo, pct=prop.table(sexo$Freq)*100)
- # Cria grafico
- ggplot(sexo, aes(x = Var1, y = Freq, fill = Var1,label =paste(Freq,pct))) +
- geom_bar(stat = "identity", position = position_dodge(width=1), width = 0.5) +
- geom_text(aes(y = Freq, label = paste(comma(Freq),"\n(",round(pct, digits = 2),"%)",sep="")), position = position_dodge(width = 0.8), vjust=-0.5, size = 3.3)+
- theme_classic()+
- labs(caption="Fonte: Escola do Trabalhador\nhttp://escola.trabalho.gov.br") +
- xlab("") +
- ylab("Quantidade")+
- theme(axis.text.x = element_text(size=11,angle=0, vjust=0.6),
- axis.text.y = element_text(size=11),
- axis.title=element_text(size=14),
- plot.title = element_text(size = rel(2)),
- plot.caption=element_text(size=10))+
- scale_fill_manual(values=c("steelblue", "tomato3"), name="Gênero")+
- scale_y_continuous(labels = comma, limits = c(0,max(sexo$Freq)*1.15))
- })
- # Texto com a quantidade de usuarios que nao informaram o genero
- output$cursos_genero_nao_informado <- renderUI({
- # Verifica se tabela tem pelo menos uma linha
- shiny::validate(need(nrow(user_enrolment_course_info_filtrado_unique()) > 0, ""))
- contaNaoInformados(user_enrolment_course_info_filtrado_unique()$sexo)
- })
- # Grafico de barras que mostra a proporcao dos usuarios cadastrados com necessidades especiais
- output$cursos_necessidades_especiais <- renderPlot({
- # Verifica se tabela tem pelo menos uma linha
- shiny::validate(need(nrow(user_enrolment_course_info_filtrado_unique()) > 0, "Nenhum dado encontrado!"))
- necessidades <- user_enrolment_course_info_filtrado_unique()$necessidade_especial
- # Remove nao informados
- necessidades <- necessidades[necessidades != ""]
- # Verifica se tabela tem pelo menos uma linha informados
- shiny::validate(need(length(necessidades) > 0, ""))
- necessidades <- table(necessidades)
- # renomeia colunas
- names(necessidades)[names(necessidades) == 'SIM'] <- 'Sim'
- names(necessidades)[names(necessidades) == 'NAO'] <- 'Não'
- names(necessidades)[names(necessidades) == ''] <- "Não informado"
- # Gera porcentagens
- necessidades <- as.data.frame(necessidades)
- necessidades <- mutate(necessidades, pct=prop.table(necessidades$Freq)*100)
- # Cria grafico
- ggplot(necessidades, aes(x = Var1, y = Freq, fill = Var1,label =paste(Freq,pct))) +
- geom_bar(stat = "identity", position = position_dodge(width=1), width = 0.5) +
- geom_text(aes(y = Freq, label = paste(comma(Freq),"\n(",round(pct, digits = 2),"%)",sep="")), position = position_dodge(width = 0.8), vjust=-0.5, size = 3.3)+
- theme_classic()+
- labs(caption="Fonte: Escola do Trabalhador\nhttp://escola.trabalho.gov.br") +
- xlab("") +
- ylab("Quantidade")+
- theme(axis.text.x = element_text(size=11,angle=0, vjust=0.6),
- axis.text.y = element_text(size=11),
- axis.title=element_text(size=14),
- plot.title = element_text(size = rel(2)),
- plot.caption=element_text(size=10))+
- scale_fill_manual(values=c("steelblue", "tomato3"), name="")+
- scale_y_continuous(labels = comma, limits = c(0,max(necessidades$Freq)*1.15))
- })
- # Texto com a quantidade de usuarios que nao informaram necessidades especiais
- output$cursos_necessidades_especiais_nao_informado <- renderUI({
- # Verifica se tabela tem pelo menos uma linha
- shiny::validate(need(nrow(user_enrolment_course_info_filtrado_unique()) > 0, ""))
- contaNaoInformados(user_enrolment_course_info_filtrado_unique()$necessidade_especial)
- })
- # Grafico de barras que mostra a proporcao de usuarios desempregados cadastrados no curso
- output$cursos_desempregado <- renderPlot({
- # Verifica se tabela tem pelo menos uma linha
- shiny::validate(need(nrow(user_enrolment_course_info_filtrado_unique()) > 0, "Nenhum dado encontrado!"))
- desempregado <- user_enrolment_course_info_filtrado_unique()$tempo_desempregado
- # remove nao informados
- desempregado <- desempregado[desempregado != ""]
- # Verifica se tabela tem pelo menos uma linha informados
- shiny::validate(need(length(desempregado) > 0, ""))
- # Considera todos os valores diferentes de empregado como desempregado
- desempregado[desempregado != "Empregado"] <- "Desempregado"
- # Gera porcentagem
- desempregado <- table(desempregado)
- desempregado <- as.data.frame(desempregado)
- desempregado <- mutate(desempregado, pct=prop.table(Freq)*100)
- # Cria grafico
- ggplot(desempregado, aes(x = desempregado, y = Freq, fill = desempregado,label =paste(Freq,pct))) +
- geom_bar(stat = "identity", position = position_dodge(width=1), width = 0.5) +
- geom_text(aes(y = Freq, label = paste(comma(Freq),"\n(",round(pct, digits = 2),"%)",sep="")), position = position_dodge(width = 0.8), vjust=-0.5, size = 3.3)+
- theme_classic()+
- labs(caption="Fonte: Escola do Trabalhador\nhttp://escola.trabalho.gov.br") +
- xlab("") +
- ylab("Quantidade")+
- theme(axis.text.x = element_text(size=11,angle=0, vjust=0.6),
- axis.text.y = element_text(size=11),
- axis.title=element_text(size=14),
- plot.title = element_text(size = rel(2)),
- plot.caption=element_text(size=10))+
- scale_fill_manual(values=c("steelblue", "tomato3"), name="")+
- scale_y_continuous(labels = comma, limits = c(0,max(desempregado$Freq)*1.15))
- })
- # Texto com a quantidade de cadastrados nos cursos que nao informaram se sao desempregados
- output$cursos_desempregados_nao_informado <- renderUI({
- # Verifica se tabela tem pelo menos uma linha
- shiny::validate(need(nrow(user_enrolment_course_info_filtrado_unique()) > 0, ""))
- contaNaoInformados(user_enrolment_course_info_filtrado_unique()$tempo_desempregado)
- })
- # Grafico de barras que mostra o dominio de internet dos usuarios
- output$cursos_dominio_internet <- renderPlot({
- # Verifica se tabela tem pelo menos uma linha
- shiny::validate(need(nrow(user_enrolment_course_info_filtrado_unique()) > 0, "Nenhum dado encontrado!"))
- dominio <- user_enrolment_course_info_filtrado_unique()$dominio
- # Nao informados
- dominio <- dominio[dominio != ""]
- # Verifica se tabela tem pelo menos uma linha informados
- shiny::validate(need(length(dominio) > 0, ""))
- # Gera porcentagens
- dominio <- table(dominio)
- dominio <- as.data.frame(dominio)
- dominio <- mutate(dominio, pct=prop.table(Freq)*100)
- # ordena colunas
- ordem = c(
- "Nunca usei",
- "Nível Básico",
- "Nível Intermediário",
- "Nível Avançado"
- )
- # Cria grafico
- ggplot(dominio, aes(y = Freq, x = dominio)) +
- geom_bar(stat = "identity", fill="steelblue") +
- xlab("Domínio de internet") +
- ylab("Quantidade") +
- scale_x_discrete(limits = ordem) +
- geom_text(aes(y = Freq,
- label = paste(comma(Freq)," (",round(pct, digits=2),"%)",sep="")),
- hjust= -0.1,
- size = 3.2) +
- theme_classic() +
- coord_flip() +
- theme(axis.text.x = element_text(angle=0, vjust=0.7))+
- labs(caption="Fonte: Escola do Trabalhador\nhttp://escola.trabalho.gov.br") +
- scale_y_continuous(labels = comma, limits = c(0,max(dominio$Freq)*1.4))
- })
- # Tabela com as estatisticas dos usuarios agrupados por dominio de internet
- output$cursos_dominio_table <- renderDataTable({
- # Verifica se tabela tem pelo menos uma linha
- shiny::validate(need(nrow(quiz_finished_attempts_user_enrol_filtrado()) > 0, "Nenhum dado encontrado!"))
- # Dados
- selectedRows = quiz_finished_attempts_user_enrol_filtrado()
- selectedRows <- select(selectedRows, c(dominio, sumgrades))
- selectedRows <- as.data.frame(selectedRows)
- # Gera estatisticas, media e desvio padrao das notas
- selectedRows <- selectedRows %>% group_by(dominio) %>% summarise(testQuant = n(), media = mean(sumgrades), sd = sd(sumgrades))
- # Join com outros dados
- # Quantidade de cadastrados
- selectedRows <- merge(selectedRows, quantidade_cadastrados_por_dominio(), by.x = "dominio", by.y = "dominio")
- # Quantidade de concluintes
- selectedRows <- merge(selectedRows, quantidade_concluintes_por_dominio(), by.x = "dominio", by.y = "dominio")
- # Reordena colunas
- selectedRows <- selectedRows[c('dominio', 'cadastrados', 'concluintes', 'testQuant', 'media', 'sd')]
- # Renomeia nomeia nome das idades
- selectedRows$dominio[selectedRows$dominio == ""] <- "Não informado"
- # Cria uma coluna com letras que serao utilizadas para ordenar a lista de idades
- ordem <- data.frame(
- ordem = c(1, 2, 3, 4, 5),
- value = c(
- "Nunca usei",
- "Nível Básico",
- "Nível Intermediário",
- "Nível Avançado",
- "Não informado"
- )
- )
- selectedRows <- merge(selectedRows, ordem, by.x = "dominio", by.y = "value")
- # Renomeia colunas
- names(selectedRows)[names(selectedRows) == 'dominio'] <- 'Domínio'
- names(selectedRows)[names(selectedRows) == 'media'] <- 'Média'
- names(selectedRows)[names(selectedRows) == 'sd'] <- "DP"
- names(selectedRows)[names(selectedRows) == 'testQuant'] <- "Testes"
- names(selectedRows)[names(selectedRows) == 'cadastrados'] <- "Matrículas"
- names(selectedRows)[names(selectedRows) == 'concluintes'] <- "Qualificações"
- # retorna selectedRows
- selectedRows
- },
- # Opcoes da DataTable
- options = list(
- pageLength = 8, # Quantidade de resultados por pagina
- paging = FALSE, # Desabilita a troca de paginas
- searching = FALSE, # Desabilita funcionalidade de searching
- lengthChange = FALSE, # Desabilita funcionalidade de troca de quantidade
- info = FALSE, # Esconde informacoes do footer
- # Ordena a coluna dos nomes da idade de acordo com o valor da coluna "ordem" que nao esta visivel
- columnDefs = list(list(orderData = list(6), targets = 0), list(targets = 6, visible= FALSE, searchable= FALSE)),
- rowCallback = I( # Modifica vizualizacao de algumas celulas da tabela
- 'function(row, data) {
- // Concatena porcentagem
- var porcentagem = parseFloat(100*data[2]/data[1]).toFixed(2)
- $("td:eq(2)", row).html(data[2] + " (" + porcentagem + "%)");
- // Arredonda para dois digitos
- $("td:eq(4)", row).html(parseFloat(data[4]).toFixed(2));
- $("td:eq(5)", row).html(parseFloat(data[5]).toFixed(2));
- // Alinha numeros a direita
- $("td:eq(1)", row).css("text-align", "right");
- $("td:eq(2)", row).css("text-align", "right");
- $("td:eq(3)", row).css("text-align", "right");
- $("td:eq(4)", row).css("text-align", "right");
- $("td:eq(5)", row).css("text-align", "right");
- }')
- )
- )
- # Texto com a quantidade de usuarios que nao informaram o dominio de internet
- output$cursos_dominio_nao_informado <- renderUI({
- # Verifica se tabela tem pelo menos uma linha
- shiny::validate(need(nrow(user_enrolment_course_info_filtrado_unique()) > 0, ""))
- contaNaoInformados(user_enrolment_course_info_filtrado_unique()$dominio)
- })
- # Grafico de barras da distribuicao das idades das pessoas cadastradas nos cursos
- output$cursos_idade <- renderPlot({
- # Verifica se tabela tem pelo menos uma linha
- shiny::validate(need(nrow(user_enrolment_course_info_filtrado_unique()) > 0, "Nenhum dado encontrado!"))
- idade <- user_enrolment_course_info_filtrado_unique()$idade
- # Remove nao informados
- idade <- idade[idade != ""]
- # Verifica se tabela tem pelo menos uma linha informados
- shiny::validate(need(length(idade) > 0, ""))
- idade <- table(idade)
- # renomeia colunas
- names(idade)[names(idade) == '18-24'] <- 'Entre 18 e 24 anos'
- names(idade)[names(idade) == '25-34'] <- 'Entre 25 e 34 anos'
- names(idade)[names(idade) == '35-44'] <- 'Entre 35 e 44 anos'
- names(idade)[names(idade) == '45-54'] <- 'Entre 45 e 54 anos'
- names(idade)[names(idade) == '55-64'] <- 'Entre 55 e 64 anos'
- names(idade)[names(idade) == 'Mais de 65'] <- 'Mais de 65 anos'
- idade <- as.data.frame(idade)
- idade <- mutate(idade, pct = prop.table(Freq) * 100)
- # Ordem das colunas
- ordem = c(
- 'Menos de 18 anos',
- 'Entre 18 e 24 anos',
- 'Entre 25 e 34 anos',
- 'Entre 35 e 44 anos',
- 'Entre 45 e 54 anos',
- 'Entre 55 e 64 anos',
- "Mais de 65 anos"
- )
- ggplot(idade, aes(y = Freq, x = Var1)) +
- geom_bar(stat = "identity", fill="steelblue") +
- xlab("Faixa etária") +
- ylab("Quantidade") +
- scale_x_discrete(limits = ordem) +
- geom_text(aes(y = Freq,
- label = paste(comma(Freq)," (",round(pct, digits=2),"%)",sep="")),
- hjust= -0.1,
- size = 3.2) +
- theme_classic() +
- coord_flip() +
- theme(axis.text.x = element_text(angle=0, vjust=0.7))+
- labs(caption="Fonte: Escola do Trabalhador\nhttp://escola.trabalho.gov.br") +
- scale_y_continuous(labels = comma, limits = c(0,max(idade$Freq)*1.4))
- })
- # Tabela com as estatisticas dos usuarios agrupados por idade
- output$cursos_idade_table <- renderDataTable({
- # Verifica se tabela tem pelo menos uma linha
- shiny::validate(need(nrow(quiz_finished_attempts_user_enrol_filtrado()) > 0, "Nenhum dado encontrado!"))
- # Dados
- selectedRows = quiz_finished_attempts_user_enrol_filtrado()
- selectedRows <- select(selectedRows, c(idade, sumgrades))
- selectedRows <- as.data.frame(selectedRows)
- # Gera estatisticas, media e desvio padrao das notas
- selectedRows <- selectedRows %>% group_by(idade) %>% summarise(testQuant = n(), media = mean(sumgrades), sd = sd(sumgrades))
- # Join com outros dados
- # Quantidade de cadastrados
- selectedRows <- merge(selectedRows, quantidade_cadastrados_por_idade(), by.x = "idade", by.y = "idade")
- # Quantidade de concluintes
- selectedRows <- merge(selectedRows, quantidade_concluintes_por_idade(), by.x = "idade", by.y = "idade")
- # Reordena colunas
- selectedRows <- selectedRows[c('idade', 'cadastrados', 'concluintes', 'testQuant', 'media', 'sd')]
- # Renomeia nomeia nome das idades
- selectedRows$idade[selectedRows$idade == ""] <- "Não informado"
- selectedRows$idade[selectedRows$idade == "18-24"] <- "Entre 18 e 24 anos"
- selectedRows$idade[selectedRows$idade == "25-34"] <- "Entre 25 e 34 anos"
- selectedRows$idade[selectedRows$idade == "35-44"] <- "Entre 35 e 44 anos"
- selectedRows$idade[selectedRows$idade == "45-54"] <- "Entre 45 e 54 anos"
- selectedRows$idade[selectedRows$idade == "55-64"] <- "Entre 55 e 64 anos"
- selectedRows$idade[selectedRows$idade == "Mais de 65"] <- "Mais de 65 anos"
- # Cria uma coluna com letras que serao utilizadas para ordenar a lista de idades
- ordem <- data.frame(
- ordem = c(1, 2, 3, 4, 5, 6, 7, 8),
- value = c(
- "Menos de 18 anos",
- "Entre 18 e 24 anos",
- "Entre 25 e 34 anos",
- "Entre 35 e 44 anos",
- "Entre 45 e 54 anos",
- "Entre 55 e 64 anos",
- "Mais de 65 anos",
- "Não informado"
- )
- )
- selectedRows <- merge(selectedRows, ordem, by.x = "idade", by.y = "value")
- # Renomeia colunas
- names(selectedRows)[names(selectedRows) == 'idade'] <- 'Idade'
- names(selectedRows)[names(selectedRows) == 'media'] <- 'Média'
- names(selectedRows)[names(selectedRows) == 'sd'] <- "DP"
- names(selectedRows)[names(selectedRows) == 'testQuant'] <- "Testes"
- names(selectedRows)[names(selectedRows) == 'cadastrados'] <- "Matrículas"
- names(selectedRows)[names(selectedRows) == 'concluintes'] <- "Qualificações"
- # retorna selectedRows
- selectedRows
- },
- # Opcoes da DataTable
- options = list(
- pageLength = 8, # Quantidade de resultados por pagina
- paging = FALSE, # Desabilita a troca de paginas
- searching = FALSE, # Desabilita funcionalidade de searching
- lengthChange = FALSE, # Desabilita funcionalidade de troca de quantidade
- info = FALSE, # Esconde informacoes do footer
- # Ordena a coluna dos nomes da idade de acordo com o valor da coluna "ordem" que nao esta visivel
- columnDefs = list(list(orderData = list(6), targets = 0), list(targets = 6, visible= FALSE, searchable= FALSE)),
- rowCallback = I( # Modifica vizualizacao de algumas celulas da tabela
- 'function(row, data) {
- // Concatena porcentagem
- var porcentagem = parseFloat(100*data[2]/data[1]).toFixed(2)
- $("td:eq(2)", row).html(data[2] + " (" + porcentagem + "%)");
- // Arredonda para dois digitos
- $("td:eq(4)", row).html(parseFloat(data[4]).toFixed(2));
- $("td:eq(5)", row).html(parseFloat(data[5]).toFixed(2));
- // Alinha numeros a direita
- $("td:eq(1)", row).css("text-align", "right");
- $("td:eq(2)", row).css("text-align", "right");
- $("td:eq(3)", row).css("text-align", "right");
- $("td:eq(4)", row).css("text-align", "right");
- $("td:eq(5)", row).css("text-align", "right");
- }')
- )
- )
- # Texto com a quantidade de usuarios que nao informaram a idade
- output$cursos_idade_nao_informado <- renderUI({
- # Verifica se tabela tem pelo menos uma linha
- shiny::validate(need(nrow(user_enrolment_course_info_filtrado_unique()) > 0, ""))
- contaNaoInformados(user_enrolment_course_info_filtrado_unique()$idade)
- })
- # Grafico de barras da quantidade de pessoas desempregadas pelo tempo
- output$cursos_tempo_desempregado <- renderPlot({
- # Verifica se tabela tem pelo menos uma linha
- shiny::validate(need(nrow(user_enrolment_course_info_filtrado_unique()) > 0, "Nenhum dado encontrado!"))
- tempo <- user_enrolment_course_info_filtrado_unique()$tempo_desempregado
- # Remove usuarios que nao informaram se estao desempregadas ou nao
- tempo <- tempo[tempo != ""]
- # Remove usuarios que estao empregados
- tempo <- tempo[tempo != "Empregado"]
- # Remove desempregados que nao informaram o tempo
- tempo <- tempo[tempo != "Desempregado, tempo nao informado"]
- # Verifica se tabela tem pelo menos uma linha informados
- shiny::validate(need(length(tempo) > 0, ""))
- tempo <- table(tempo)
- tempo <- as.data.frame(tempo)
- tempo <- mutate(tempo, pct = prop.table(Freq) * 100)
- # Ordem das colunas
- ordem = c(
- 'Até 6 meses',
- 'Entre 7 e 12 meses',
- 'Entre 13 e 24 meses',
- "Mais de 24 meses"
- )
- ggplot(tempo, aes(y = Freq, x = tempo)) +
- geom_bar(stat = "identity", fill="steelblue") +
- xlab("Tempo desempregado") +
- ylab("Quantidade") +
- scale_x_discrete(limits = ordem) +
- geom_text(aes(y = Freq,
- label = paste(comma(Freq)," (",round(pct, digits=2),"%)",sep="")),
- hjust= -0.1,
- size = 3.2) +
- theme_classic() +
- coord_flip() +
- theme(axis.text.x = element_text(angle=0, vjust=0.7))+
- labs(caption="Fonte: Escola do Trabalhador\nhttp://escola.trabalho.gov.br") +
- scale_y_continuous(labels = comma, limits = c(0,max(tempo$Freq)*1.4))
- })
- # Tabela com as estatisticas dos usuarios desempregado agrupados pelo tempo que estao desempregados
- output$cursos_tempo_desempregado_table <- renderDataTable({
- # Verifica se tabela tem pelo menos uma linha
- shiny::validate(need(nrow(quiz_finished_attempts_user_enrol_filtrado()) > 0, "Nenhum dado encontrado!"))
- # Dados
- selectedRows <- quiz_finished_attempts_user_enrol_filtrado()
- selectedRows <- select(selectedRows, c(tempo_desempregado, sumgrades))
- selectedRows <- as.data.frame(selectedRows)
- # Gera estatisticas, media e desvio padrao das notas
- selectedRows <- selectedRows %>% group_by(tempo_desempregado) %>% summarise(testQuant = n(), media = mean(sumgrades), sd = sd(sumgrades))
- # Join com outros dados
- # Quantidade de cadastrados
- selectedRows <- merge(selectedRows, quantidade_cadastrados_por_tempo_desempregado(), by.x = "tempo_desempregado", by.y = "tempo_desempregado")
- # Quantidade de concluintes
- selectedRows <- merge(selectedRows, quantidade_concluintes_por_tempo_desempregado(), by.x = "tempo_desempregado", by.y = "tempo_desempregado")
- # Renomeia dados dos nao informados
- selectedRows$tempo_desempregado[selectedRows$tempo_desempregado == "Desempregado, tempo nao informado"] <- "Não informado"
- # Reordena colunas
- selectedRows <- selectedRows[c('tempo_desempregado', 'cadastrados', 'concluintes', 'testQuant', 'media', 'sd')]
- # Cria uma coluna com letras que serao utilizadas para ordenar a lista de idades
- ordem <- data.frame(
- ordem = c(1, 2, 3, 4, 5),
- value = c(
- "Até 6 meses",
- "Entre 7 e 12 meses",
- "Entre 13 e 24 meses",
- "Mais de 24 meses",
- "Não informado"
- )
- )
- selectedRows <- merge(selectedRows, ordem, by.x = "tempo_desempregado", by.y = "value")
- # Renomeia colunas
- names(selectedRows)[names(selectedRows) == 'tempo_desempregado'] <- 'Tempo Desempregado'
- names(selectedRows)[names(selectedRows) == 'media'] <- 'Média'
- names(selectedRows)[names(selectedRows) == 'sd'] <- "DP"
- names(selectedRows)[names(selectedRows) == 'testQuant'] <- "Testes"
- names(selectedRows)[names(selectedRows) == 'cadastrados'] <- "Matrículas"
- names(selectedRows)[names(selectedRows) == 'concluintes'] <- "Qualificações"
- # retorna selectedRows
- selectedRows
- },
- # Opcoes da DataTable
- options = list(
- pageLength = 8, # Quantidade de resultados por pagina
- paging =FALSE, # Desabilita a troca de paginas
- searching = FALSE, # Desabilita funcionalidade de searching
- lengthChange = FALSE, # Desabilita funcionalidade de troca de quantidade
- info = FALSE, # Esconde informacoes do footer
- # Ordena a coluna dos nomes da idade de acordo com o valor da coluna "ordem" que nao esta visivel
- columnDefs = list(list(orderData = list(6), targets = 0), list(targets = 6, visible= FALSE, searchable= FALSE)),
- rowCallback = I(
- 'function(row, data) {
- // Concatena porcentagem
- var porcentagem = parseFloat(100*data[2]/data[1]).toFixed(2)
- $("td:eq(2)", row).html(data[2] + " (" + porcentagem + "%)");
- // Arredonda para dois digitos
- $("td:eq(4)", row).html(parseFloat(data[4]).toFixed(2));
- $("td:eq(5)", row).html(parseFloat(data[5]).toFixed(2));
- // Alinha numeros a direita
- $("td:eq(1)", row).css("text-align", "right");
- $("td:eq(2)", row).css("text-align", "right");
- $("td:eq(3)", row).css("text-align", "right");
- $("td:eq(4)", row).css("text-align", "right");
- $("td:eq(5)", row).css("text-align", "right");
- }')
- )
- )
- # Texto com a quantidade de usuarios desempregados mas nao informaram o tempo
- output$cursos_tempo_nao_informado <- renderUI({
- # Verifica se tabela tem pelo menos uma linha
- shiny::validate(need(nrow(user_enrolment_course_info_filtrado_unique()) > 0, ""))
- tempo <- user_enrolment_course_info_filtrado_unique()$tempo_desempregado
- # Remove usuarios que nao informaram se estao desempregadas ou nao
- tempo <- tempo[tempo != ""]
- # Remove usuarios que estao empregados
- tempo <- tempo[tempo != "Empregado"]
- # Conta desempregados que nao informaram o tempo
- contaNaoInformados(tempo, value = "Desempregado, tempo nao informado")
- })
- # Grafico de barras com a quantidade de pessoas cadastradas agrupadas pela escolaridade
- output$cursos_escolaridade <- renderPlot({
- # Verifica se tabela tem pelo menos uma linha
- shiny::validate(need(nrow(user_enrolment_course_info_filtrado_unique()) > 0, "Nenhum dado encontrado!"))
- escolaridade <- user_enrolment_course_info_filtrado_unique()$escolaridade
- # Remove nao informados
- escolaridade <- escolaridade[escolaridade != ""]
- # Verifica se tabela tem pelo menos uma linha informados
- shiny::validate(need(length(escolaridade) > 0, ""))
- escolaridade <- table(escolaridade)
- escolaridade <- as.data.frame(escolaridade)
- escolaridade <- mutate(escolaridade, pct = prop.table(Freq) * 100)
- # Ordem das colunas
- ordem = c(
- "Ensino fundamental incompleto",
- "Ensino fundamental completo",
- "Ensino técnico completo",
- "Ensino médio incompleto",
- "Ensino médio completo",
- "Licenciatura incompleto",
- "Licenciatura completo",
- "Tecnólogo incompleto",
- "Tecnólogo completo",
- "Bacharelado incompleto",
- "Bacharelado completo",
- "Especialização",
- 'Mestrado profissional',
- 'Mestrado acadêmico',
- 'Doutorado'
- )
- # Cria grafico
- ggplot(escolaridade, aes(y = Freq, x = escolaridade)) +
- geom_bar(stat = "identity", fill="steelblue") +
- xlab("Grau de instrução") +
- ylab("Quantidade") +
- scale_x_discrete(limits = ordem) +
- geom_text(aes(y = Freq,
- label = paste(comma(Freq)," (",round(pct, digits=2),"%)",sep="")),
- hjust= -0.1,
- size = 3.2) +
- theme_classic() +
- coord_flip() +
- theme(axis.text.x = element_text(angle=0, vjust=0.7))+
- labs(caption="Fonte: Escola do Trabalhador\nhttp://escola.trabalho.gov.br") +
- scale_y_continuous(labels = comma, limits = c(0,max(escolaridade$Freq)*1.4))
- })
- # Tabela com as estatisticas dos usuarios agrupados por escolaridade
- output$cursos_escolaridade_table <- renderDataTable({
- # Verifica se tabela tem pelo menos uma linha
- shiny::validate(need(nrow(quiz_finished_attempts_user_enrol_filtrado()) > 0, "Nenhum dado encontrado!"))
- # Dados
- selectedRows <- quiz_finished_attempts_user_enrol_filtrado()
- selectedRows <- select(selectedRows, c(escolaridade, sumgrades))
- selectedRows <- as.data.frame(selectedRows)
- # Gera estatisticas, media e desvio padrao das notas
- selectedRows <- selectedRows %>% group_by(escolaridade) %>% summarise(testQuant = n(), media = mean(sumgrades), sd = sd(sumgrades))
- # Join com outros dados
- # Quantidade de cadastrados
- selectedRows <- merge(selectedRows, quantidade_cadastrados_por_escolaridade(), by.x = "escolaridade", by.y = "escolaridade")
- # Quantidade de concluintes
- selectedRows <- merge(selectedRows, quantidade_concluintes_por_escolaridade(), by.x = "escolaridade", by.y = "escolaridade")
- # Renomeia dados dos nao informados
- selectedRows$escolaridade[selectedRows$escolaridade == ""] <- "Não informado"
- # Reordena colunas
- selectedRows <- selectedRows[c('escolaridade', 'cadastrados', 'concluintes', 'testQuant', 'media', 'sd')]
- # Cria uma coluna com letras que serao utilizadas para ordenar a lista de idades
- ordem <- data.frame(
- ordem = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16),
- value = c(
- "Ensino fundamental incompleto",
- "Ensino fundamental completo",
- "Ensino técnico completo",
- "Ensino médio incompleto",
- "Ensino médio completo",
- "Licenciatura incompleto",
- "Licenciatura completo",
- "Tecnólogo incompleto",
- "Tecnólogo completo",
- "Bacharelado incompleto",
- "Bacharelado completo",
- "Especialização",
- 'Mestrado profissional',
- 'Mestrado acadêmico',
- 'Doutorado',
- "Não informado"
- )
- )
- selectedRows <- merge(selectedRows, ordem, by.x = "escolaridade", by.y = "value")
- # Renomeia colunas
- names(selectedRows)[names(selectedRows) == 'escolaridade'] <- 'Escolaridade'
- names(selectedRows)[names(selectedRows) == 'media'] <- 'Média'
- names(selectedRows)[names(selectedRows) == 'sd'] <- "DP"
- names(selectedRows)[names(selectedRows) == 'testQuant'] <- "Testes"
- names(selectedRows)[names(selectedRows) == 'cadastrados'] <- "Matrículas"
- names(selectedRows)[names(selectedRows) == 'concluintes'] <- "Qualificações"
- # retorna selectedRows
- selectedRows
- },
- # Opcoes da DataTable
- options = list(
- pageLength = 8, # Quantidade de resultados por pagina
- searching = FALSE, # Desabilita funcionalidade de searching
- lengthChange = FALSE, # Desabilita funcionalidade de troca de quantidade
- info = FALSE, # Esconde informacoes do footer
- # Ordena a coluna dos nomes da idade de acordo com o valor da coluna "ordem" que nao esta visivel
- columnDefs = list(list(orderData = list(6), targets = 0), list(targets = 6, visible= FALSE, searchable= FALSE)),
- rowCallback = I(
- 'function(row, data) {
- // Concatena porcentagem
- var porcentagem = parseFloat(100*data[2]/data[1]).toFixed(2)
- $("td:eq(2)", row).html(data[2] + " (" + porcentagem + "%)");
- // Arredonda para dois digitos
- $("td:eq(4)", row).html(parseFloat(data[4]).toFixed(2));
- $("td:eq(5)", row).html(parseFloat(data[5]).toFixed(2));
- // Alinha numeros a direita
- $("td:eq(1)", row).css("text-align", "right");
- $("td:eq(2)", row).css("text-align", "right");
- $("td:eq(3)", row).css("text-align", "right");
- $("td:eq(4)", row).css("text-align", "right");
- $("td:eq(5)", row).css("text-align", "right");
- }')
- )
- )
- # Texto com a quantidade de usuarios que nao informaram a escolaridade
- output$cursos_escolaridade_nao_informado <- renderUI({
- # Verifica se tabela tem pelo menos uma linha
- shiny::validate(need(nrow(user_enrolment_course_info_filtrado_unique()) > 0, ""))
- contaNaoInformados(user_enrolment_course_info_filtrado_unique()$escolaridade)
- })
- ##==========================================================================================================================
- ## TAB Usuarios Dados
- ## Esta secao contem os dados que sao utilizados na tab usuarios
- ## Em geral, os dados da tab usuarios sao filtrados por um periodo selecionado pelo usuario
- ##==========================================================================================================================
- # Dados dos usuarios, filtrados por periodo
- usuarios_filtrados <- reactive({
- inicio_periodo <- as.POSIXlt(Sys.Date())
- fim_periodo <- as.POSIXlt(Sys.Date())
- tempo_cadastro = users_info$tempocadastro
- if (input$usuarios_filtro_periodo == "Desde o início") {
- inicio_periodo = 0
- } else if (input$usuarios_filtro_periodo == "último ano") {
- inicio_periodo$mday <- inicio_periodo$mday - 365
- } else if (input$usuarios_filtro_periodo == "último mês") {
- inicio_periodo$mday <- inicio_periodo$mday - 30
- } else if (input$usuarios_filtro_periodo == "última semana") {
- inicio_periodo$mday <- inicio_periodo$mday - 7
- } else if (input$usuarios_filtro_periodo == "último dia") {
- inicio_periodo$mday <- inicio_periodo$mday - 1
- } else if (input$usuarios_filtro_periodo == "Período personalizado") {
- inicio_periodo <- as.POSIXlt(input$usuarios_filtro_periodo_personalizado[1])
- fim_periodo <- as.POSIXlt(input$usuarios_filtro_periodo_personalizado[2])
- }
- users = users_info[tempo_cadastro >= as.numeric(inicio_periodo) & tempo_cadastro < as.numeric(fim_periodo),]
- if (input$usuarios_filtro_empregado != "Qualquer") {
- desempregado = users$tempo_desempregado
- rows = desempregado != ""
- rows = rows & desempregado != "Empregado"
- users = users[rows,]
- }
- users
- })
- ##==========================================================================================================================
- ## TAB Usuarios Outputs
- ## Esta secao contem todos os outputs (Tabelas, Textos e Graficos) que sao utilizados na tab usuarios
- ##==========================================================================================================================
- # Grafico de barras que mostra a proporcao dos generos dos usuarios cadastrados
- output$usuarios_genero <- renderPlot({
- # Verifica se tabela tem pelo menos uma linha
- shiny::validate(need(nrow(usuarios_filtrados()) > 0, "Nenhum dado encontrado! Selecione outra Data!"))
- sexo <- usuarios_filtrados()$sexo
- # Remove nao informados
- sexo <- sexo[sexo != ""]
- # Verifica se tabela tem pelo menos uma linha informados
- shiny::validate(need(length(sexo) > 0, ""))
- sexo <- table(sexo)
- # renomeia colunas
- names(sexo)[names(sexo) == 'Masculino'] <- 'Masculino'
- names(sexo)[names(sexo) == 'Feminino'] <- 'Feminino'
- # Gera porcentagens
- sexo <- as.data.frame(sexo)
- sexo <- mutate(sexo, pct=prop.table(sexo$Freq)*100)
- # Cria grafico
- ggplot(sexo, aes(x = Var1, y = Freq, fill = Var1,label =paste(Freq,pct))) +
- geom_bar(stat = "identity", position = position_dodge(width=1), width = 0.5) +
- geom_text(aes(y = Freq, label = paste(comma(Freq),"\n(",round(pct, digits = 2),"%)",sep="")), position = position_dodge(width = 0.8), vjust=-0.5, size = 3.3)+
- theme_classic()+
- labs(caption="Fonte: Escola do Trabalhador\nhttp://escola.trabalho.gov.br") +
- xlab("") +
- ylab("Quantidade")+
- theme(axis.text.x = element_text(size=11,angle=0, vjust=0.6),
- axis.text.y = element_text(size=11),
- axis.title=element_text(size=14),
- plot.title = element_text(size = rel(2)),
- plot.caption=element_text(size=10))+
- scale_fill_manual(values=c("steelblue", "tomato3"), name="Gênero")+
- scale_y_continuous(labels = comma, limits = c(0,max(sexo$Freq)*1.15))
- })
- # Texto com a quantidade de usuarios que nao informaram o genero
- output$usuarios_genero_nao_informado <- renderUI({
- # Verifica se tabela tem pelo menos uma linha
- shiny::validate(need(nrow(usuarios_filtrados()) > 0, ""))
- contaNaoInformados(usuarios_filtrados()$sexo)
- })
- # Grafico de barras que mostra o dominio de internet dos usuarios
- output$usuarios_dominio_internet <- renderPlot({
- # Verifica se tabela tem pelo menos uma linha
- shiny::validate(need(nrow(usuarios_filtrados()) > 0, "Nenhum dado encontrado! Selecione outra Data!"))
- dominio <- usuarios_filtrados()$dominio
- # Nao informados
- dominio <- dominio[dominio != ""]
- # Verifica se tabela tem pelo menos uma linha informados
- shiny::validate(need(length(dominio) > 0, ""))
- # Gera porcentagens
- dominio <- table(dominio)
- dominio <- as.data.frame(dominio)
- dominio <- mutate(dominio, pct=prop.table(Freq)*100)
- # ordena colunas
- ordem = c(
- "Nunca usei",
- "Nível Básico",
- "Nível Intermediário",
- "Nível Avançado"
- )
- # Cria grafico
- ggplot(dominio, aes(y = Freq, x= dominio)) +
- geom_bar(stat = "identity", fill="steelblue") +
- xlab("") +
- ylab("Quantidade") +
- scale_x_discrete(limits = ordem) +
- geom_text(aes(y = Freq,
- label = paste(comma(Freq),"\n (",round(pct, digits=2),"%)",sep="")),
- position = position_dodge(width = .9), vjust=-0.5,
- size = 3.2) +
- theme_classic() +
- labs(caption="Fonte: Escola do Trabalhador\nhttp://escola.trabalho.gov.br") +
- scale_y_continuous(labels = comma, limits = c(0,max(dominio$Freq)*1.15))
- })
- # Texto com a quantidade de usuarios que nao informaram o dominio de internet
- output$usuarios_dominio_nao_informado <- renderUI({
- # Verifica se tabela tem pelo menos uma linha
- shiny::validate(need(nrow(usuarios_filtrados()) > 0, ""))
- contaNaoInformados(usuarios_filtrados()$dominio)
- })
- # Grafico de barras que mostra a proporcao de usuarios com necessidades especiais
- output$usuarios_necessidades_especiais <- renderPlot({
- # Verifica se tabela tem pelo menos uma linha
- shiny::validate(need(nrow(usuarios_filtrados()) > 0, "Nenhum dado encontrado! Selecione outra Data!"))
- necessidades <- usuarios_filtrados()$necessidade_especial
- # Nao informados
- necessidades <- necessidades[necessidades != ""]
- # Verifica se tabela tem pelo menos uma linha informados
- shiny::validate(need(length(necessidades) > 0, ""))
- necessidades <- table(necessidades)
- # renomeia colunas
- names(necessidades)[names(necessidades) == 'SIM'] <- 'Sim'
- names(necessidades)[names(necessidades) == 'NAO'] <- 'Não'
- # Gera porcentagens
- necessidades <- as.data.frame(necessidades)
- necessidades <- mutate(necessidades, pct=prop.table(necessidades$Freq)*100)
- # Cria grafico
- ggplot(necessidades, aes(x = Var1, y = Freq, fill = Var1,label =paste(Freq,pct))) +
- geom_bar(stat = "identity", position = position_dodge(width=1), width = 0.5) +
- geom_text(aes(y = Freq, label = paste(comma(Freq),"\n(",round(pct, digits = 2),"%)",sep="")), position = position_dodge(width = 0.8), vjust=-0.5, size = 3.3)+
- theme_classic()+
- labs(caption="Fonte: Escola do Trabalhador\nhttp://escola.trabalho.gov.br") +
- xlab("") +
- ylab("Quantidade")+
- theme(axis.text.x = element_text(size=11,angle=0, vjust=0.6),
- axis.text.y = element_text(size=11),
- axis.title=element_text(size=14),
- plot.title = element_text(size = rel(2)),
- plot.caption=element_text(size=10))+
- scale_fill_manual(values=c("steelblue", "tomato3"), name="")+
- scale_y_continuous(labels = comma, limits = c(0,max(necessidades$Freq)*1.15))
- })
- # Texto com a quantidade de usuarios que nao informaram necessidades especiais
- output$usuarios_necessidades_especiais_nao_informado <- renderUI({
- # Verifica se tabela tem pelo menos uma linha
- shiny::validate(need(nrow(usuarios_filtrados()) > 0, ""))
- contaNaoInformados(usuarios_filtrados()$necessidade_especial)
- })
- # Grafico de barras que mostra a proporcao de usuarios desempregados
- output$usuarios_desempregados <- renderPlot({
- # Verifica se tabela tem pelo menos uma linha
- shiny::validate(need(nrow(usuarios_filtrados()) > 0, "Nenhum dado encontrado! Selecione outra Data!"))
- desempregado <- usuarios_filtrados()$tempo_desempregado
- # remove nao informados
- desempregado <- desempregado[desempregado != ""]
- # Verifica se tabela tem pelo menos uma linha informados
- shiny::validate(need(length(desempregado) > 0, ""))
- # Considera todos os valores diferentes de empregado como desempregado
- desempregado[desempregado != "Empregado"] <- "Desempregado"
- # Gera porcentagem
- desempregado <- table(desempregado)
- desempregado <- as.data.frame(desempregado)
- desempregado <- mutate(desempregado, pct=prop.table(Freq)*100)
- # Cria grafico
- ggplot(desempregado, aes(x = desempregado, y = Freq, fill = desempregado,label =paste(Freq,pct))) +
- geom_bar(stat = "identity", position = position_dodge(width=1), width = 0.5) +
- geom_text(aes(y = Freq, label = paste(comma(Freq),"\n(",round(pct, digits = 2),"%)",sep="")), position = position_dodge(width = 0.8), vjust=-0.5, size = 3.3)+
- theme_classic()+
- labs(caption="Fonte: Escola do Trabalhador\nhttp://escola.trabalho.gov.br") +
- xlab("") +
- ylab("Quantidade")+
- theme(axis.text.x = element_text(size=11,angle=0, vjust=0.6),
- axis.text.y = element_text(size=11),
- axis.title=element_text(size=14),
- plot.title = element_text(size = rel(2)),
- plot.caption=element_text(size=10))+
- scale_fill_manual(values=c("steelblue", "tomato3"), name="")+
- scale_y_continuous(labels = comma, limits = c(0,max(desempregado$Freq)*1.15))
- })
- # Texto com a quantidade de usuarios que nao informaram se sao desempregados
- output$usuarios_desempregados_nao_informado <- renderUI({
- # Verifica se tabela tem pelo menos uma linha
- shiny::validate(need(nrow(usuarios_filtrados()) > 0, ""))
- contaNaoInformados(usuarios_filtrados()$tempo_desempregado)
- })
- # Grafico de barras da distribuicao das idades das pessoas cadastradas
- output$usuarios_idade <- renderPlot({
- # Verifica se tabela tem pelo menos uma linha
- shiny::validate(need(nrow(usuarios_filtrados()) > 0, "Nenhum dado encontrado! Selecione outra Data!"))
- idade <- usuarios_filtrados()$idade
- # Remove nao informados
- idade <- idade[idade != ""]
- # Verifica se tabela tem pelo menos uma linha informados
- shiny::validate(need(length(idade) > 0, ""))
- idade <- table(idade)
- # renomeia colunas
- names(idade)[names(idade) == '18-24'] <- 'Entre 18 e 24 anos'
- names(idade)[names(idade) == '25-34'] <- 'Entre 25 e 34 anos'
- names(idade)[names(idade) == '35-44'] <- 'Entre 35 e 44 anos'
- names(idade)[names(idade) == '45-54'] <- 'Entre 45 e 54 anos'
- names(idade)[names(idade) == '55-64'] <- 'Entre 55 e 64 anos'
- names(idade)[names(idade) == 'Mais de 65'] <- 'Mais de 65 anos'
- idade <- as.data.frame(idade)
- idade <- mutate(idade, pct = prop.table(idade$Freq) * 100)
- # Ordem das colunas
- ordem = c(
- 'Menos de 18 anos',
- 'Entre 18 e 24 anos',
- 'Entre 25 e 34 anos',
- 'Entre 35 e 44 anos',
- 'Entre 45 e 54 anos',
- 'Entre 55 e 64 anos',
- "Mais de 65 anos"
- )
- # Cria grafico
- ggplot(idade, aes(y = Freq, x= Var1)) +
- geom_bar(stat = "identity", fill="steelblue") +
- xlab("") +
- ylab("Quantidade") +
- scale_x_discrete(limits = ordem) +
- geom_text(aes(y = Freq,
- label = paste(comma(Freq),"\n (",round(pct, digits=2),"%)",sep="")),
- position = position_dodge(width = .9), vjust=-0.5,
- size = 3.2) +
- theme_classic() +
- theme(axis.text.x = element_text(angle=20, vjust=0.7))+
- labs(caption="Fonte: Escola do Trabalhador\nhttp://escola.trabalho.gov.br") +
- scale_y_continuous(labels = comma, limits = c(0,max(idade$Freq)*1.15))
- })
- # Texto com a quantidade de usuarios que nao informaram a idade
- output$usuarios_idade_nao_informado <- renderUI({
- # Verifica se tabela tem pelo menos uma linha
- shiny::validate(need(nrow(usuarios_filtrados()) > 0, ""))
- contaNaoInformados(usuarios_filtrados()$idade)
- })
- # Grafico de barras do tempo dos usuarios que estao desempregados
- output$usuarios_tempo_desempregado <- renderPlot({
- # Verifica se tabela tem pelo menos uma linha
- shiny::validate(need(nrow(usuarios_filtrados()) > 0, "Nenhum dado encontrado! Selecione outra Data!"))
- tempo <- usuarios_filtrados()$tempo_desempregado
- # Remove usuarios que nao informaram se estao desempregadas ou nao
- tempo <- tempo[tempo != ""]
- # Remove usuarios que estao empregados
- tempo <- tempo[tempo != "Empregado"]
- # Remove desempregados que nao informaram o tempo
- tempo <- tempo[tempo != "Desempregado, tempo nao informado"]
- # Verifica se tabela tem pelo menos uma linha informados
- shiny::validate(need(length(tempo) > 0, ""))
- tempo <- table(tempo)
- tempo <- as.data.frame(tempo)
- tempo <- mutate(tempo, pct = prop.table(Freq) * 100)
- # Ordem das colunas
- ordem = c(
- 'Até 6 meses',
- 'Entre 7 e 12 meses',
- 'Entre 13 e 24 meses',
- "Mais de 24 meses"
- )
- # Cria grafico
- ggplot(tempo, aes(y = Freq, x= tempo)) +
- geom_bar(stat = "identity", fill="steelblue") +
- xlab("") +
- ylab("Quantidade") +
- scale_x_discrete(limits = ordem) +
- geom_text(aes(y = Freq,
- label = paste(comma(Freq),"\n (",round(pct, digits=2),"%)",sep="")),
- position = position_dodge(width = .9), vjust=-0.5,
- size = 3.2) +
- theme_classic() +
- labs(caption="Fonte: Escola do Trabalhador\nhttp://escola.trabalho.gov.br") +
- scale_y_continuous(labels = comma, limits = c(0,max(tempo$Freq)*1.15))
- })
- # Texto com a quantidade de usuarios desempregados que nao informaram o tempo
- output$usuarios_tempo_nao_informado <- renderUI({
- # Verifica se tabela tem pelo menos uma linha
- shiny::validate(need(nrow(usuarios_filtrados()) > 0, ""))
- tempo <- usuarios_filtrados()$tempo_desempregado
- # Remove usuarios que nao informaram se estao desempregadas ou nao
- tempo <- tempo[tempo != ""]
- # Remove usuarios que estao empregados
- tempo <- tempo[tempo != "Empregado"]
- # Conta desempregados que nao informaram o tempo
- contaNaoInformados(tempo, value = "Desempregado, tempo nao informado")
- })
- # Grafico de barras da distribuicao das escolaridades
- output$usuarios_escolaridade <- renderPlot({
- # Verifica se tabela tem pelo menos uma linha
- shiny::validate(need(nrow(usuarios_filtrados()) > 0, "Nenhum dado encontrado! Selecione outra Data!"))
- escolaridade <- usuarios_filtrados()$escolaridade
- # Remove nao informados
- escolaridade <- escolaridade[escolaridade != ""]
- # Verifica se tabela tem pelo menos uma linha informados
- shiny::validate(need(length(escolaridade) > 0, ""))
- escolaridade <- table(escolaridade)
- escolaridade <- as.data.frame(escolaridade)
- escolaridade <- mutate(escolaridade, pct = prop.table(Freq) * 100)
- # ordena colunas
- ordem = c(
- "Ensino fundamental incompleto",
- "Ensino fundamental completo",
- "Ensino técnico completo",
- "Ensino médio incompleto",
- "Ensino médio completo",
- "Tecnólogo incompleto",
- "Tecnólogo completo",
- "Licenciatura incompleto",
- "Licenciatura completo",
- "Bacharelado incompleto",
- "Bacharelado completo",
- "Especialização",
- 'Mestrado profissional',
- 'Mestrado acadêmico',
- 'Doutorado'
- )
- # Cria grafico
- ggplot(escolaridade, aes(y = Freq, x = escolaridade)) +
- geom_bar(stat = "identity", fill="steelblue") +
- xlab("Grau de instrução") +
- ylab("Quantidade") +
- scale_x_discrete(limits = ordem) +
- geom_text(aes(y = Freq,
- label = paste(comma(Freq)," (",round(pct, digits=2),"%)",sep="")),
- hjust= -0.1,
- size = 3.2) +
- theme_classic() +
- coord_flip() +
- theme(axis.text.x = element_text(angle=0, vjust=0.7))+
- labs(caption="Fonte: Escola do Trabalhador\nhttp://escola.trabalho.gov.br") +
- scale_y_continuous(labels = comma, limits = c(0,max(escolaridade$Freq)*1.4))
- })
- # Texto com a quantidade de usuarios que nao informaram a escolaridade
- output$usuarios_escolaridade_nao_informado <- renderUI({
- # Verifica se tabela tem pelo menos uma linha
- shiny::validate(need(nrow(usuarios_filtrados()) > 0, ""))
- contaNaoInformados(usuarios_filtrados()$escolaridade)
- })
- # Titulo da pagina da tab usuarios, informa qual o periodo que foi selecionado
- output$usuarios_titulo_data <- renderText({
- inicio_periodo <- as.POSIXlt(Sys.Date())
- fim_periodo <- as.POSIXlt(Sys.Date())
- if (input$usuarios_filtro_periodo == "Desde o início") {
- return("")
- } else if (input$usuarios_filtro_periodo == "último ano") {
- inicio_periodo$mday <- inicio_periodo$mday - 365
- } else if (input$usuarios_filtro_periodo == "último mês") {
- inicio_periodo$mday <- inicio_periodo$mday - 30
- } else if (input$usuarios_filtro_periodo == "última semana") {
- inicio_periodo$mday <- inicio_periodo$mday - 7
- } else if (input$usuarios_filtro_periodo == "último dia") {
- inicio_periodo$mday <- inicio_periodo$mday - 1
- } else if (input$usuarios_filtro_periodo == "Período personalizado") {
- inicio_periodo <- as.POSIXlt(input$usuarios_filtro_periodo_personalizado[1])
- fim_periodo <- as.POSIXlt(input$usuarios_filtro_periodo_personalizado[2])
- }
- gsub("-", "/", paste("entre", inicio_periodo, "e", fim_periodo, sep=" "))
- })
- ##==========================================================================================================================
- ## TAB Home Outputs
- ## Esta secao contem todos os outputs (Tabelas, Textos e Graficos) que sao utilizados na tab home
- ##==========================================================================================================================
- # Titulo da pagina da tab home, informa qual o periodo que foi selecionado
- output$home_titulo_data <- renderText({
- inicio_periodo <- as.POSIXlt(Sys.Date())
- fim_periodo <- as.POSIXlt(Sys.Date())
- if (input$home_filtro_periodo == "Desde o início") {
- return("")
- } else if (input$home_filtro_periodo == "último ano") {
- inicio_periodo$mday <- inicio_periodo$mday - 365
- } else if (input$home_filtro_periodo == "último mês") {
- inicio_periodo$mday <- inicio_periodo$mday - 30
- } else if (input$home_filtro_periodo == "última semana") {
- inicio_periodo$mday <- inicio_periodo$mday - 7
- } else if (input$home_filtro_periodo == "último dia") {
- inicio_periodo$mday <- inicio_periodo$mday - 1
- } else if (input$home_filtro_periodo == "Período personalizado") {
- inicio_periodo <- as.POSIXlt(input$home_filtro_periodo_personalizado[1])
- fim_periodo <- as.POSIXlt(input$home_filtro_periodo_personalizado[2])
- }
- gsub("-", "/", paste("Entre", inicio_periodo, "e", fim_periodo, sep=" "))
- })
- # Dados dos usuarios, filtrados por periodo
- home_inscritos_filtrados <- reactive({
- inicio_periodo <- as.POSIXlt(Sys.Date())
- fim_periodo <- as.POSIXlt(Sys.Date())
- if (input$home_filtro_periodo == "Desde o início") {
- inicio_periodo <- as.numeric(as.Date("2000-01-01"))
- } else if (input$home_filtro_periodo == "último ano") {
- inicio_periodo$mday <- inicio_periodo$mday - 365
- } else if (input$home_filtro_periodo == "último mês") {
- inicio_periodo$mday <- inicio_periodo$mday - 30
- } else if (input$home_filtro_periodo == "última semana") {
- inicio_periodo$mday <- inicio_periodo$mday - 7
- } else if (input$home_filtro_periodo == "último dia") {
- inicio_periodo$mday <- inicio_periodo$mday - 1
- } else if (input$home_filtro_periodo == "Período personalizado") {
- inicio_periodo <- as.POSIXlt(input$home_filtro_periodo_personalizado[1])
- fim_periodo <- as.POSIXlt(input$home_filtro_periodo_personalizado[2])
- }
- users = alunos[alunos$tempocadastro >= as.numeric(inicio_periodo) && alunos$tempocadastro <= as.numeric(fim_periodo),]
- if (input$home_filtro_empregado == "Desempregado") {
- desempregado = users$desempregado
- rows = which(desempregado == "SIM")
- users = users[rows,]
- }
- else if (input$home_filtro_empregado == "Empregado") {
- desempregado = users$desempregado
- rows = which(desempregado == "NAO")
- users = users[rows,]
- }
- users
- })
- home_matriculados_filtrados <- reactive({
- inicio_periodo <- as.POSIXlt(Sys.Date())
- fim_periodo <- as.POSIXlt(Sys.Date())
- tempo_cadastro = matriculas_curso$tempocadastro
- if (input$home_filtro_periodo == "Desde o início") {
- inicio_periodo = 0
- } else if (input$home_filtro_periodo == "último ano") {
- inicio_periodo$mday <- inicio_periodo$mday - 365
- } else if (input$home_filtro_periodo == "último mês") {
- inicio_periodo$mday <- inicio_periodo$mday - 30
- } else if (input$home_filtro_periodo == "última semana") {
- inicio_periodo$mday <- inicio_periodo$mday - 7
- } else if (input$home_filtro_periodo == "último dia") {
- inicio_periodo$mday <- inicio_periodo$mday - 1
- } else if (input$home_filtro_periodo == "Período personalizado") {
- inicio_periodo <- as.POSIXlt(input$home_filtro_periodo_personalizado[1])
- fim_periodo <- as.POSIXlt(input$home_filtro_periodo_personalizado[2])
- }
- users = matriculas_curso[tempo_cadastro >= as.numeric(inicio_periodo) & tempo_cadastro < as.numeric(fim_periodo),]
- if (input$home_filtro_empregado == "Desempregado") {
- desempregado = users$desempregado
- rows = which(desempregado == "SIM")
- users = users[rows,]
- }
- else if (input$home_filtro_empregado == "Empregado") {
- desempregado = users$desempregado
- rows = which(desempregado == "NAO")
- users = users[rows,]
- }
- users
- })
- home_qualificados_filtrados <- reactive({
- inicio_periodo <- as.POSIXlt(Sys.Date())
- fim_periodo <- as.POSIXlt(Sys.Date())
- tempo_cadastro = qualificacoes_cpf$dateissued
- if (input$home_filtro_periodo == "Desde o início") {
- inicio_periodo = 0
- } else if (input$home_filtro_periodo == "último ano") {
- inicio_periodo$mday <- inicio_periodo$mday - 365
- } else if (input$home_filtro_periodo == "último mês") {
- inicio_periodo$mday <- inicio_periodo$mday - 30
- } else if (input$home_filtro_periodo == "última semana") {
- inicio_periodo$mday <- inicio_periodo$mday - 7
- } else if (input$home_filtro_periodo == "último dia") {
- inicio_periodo$mday <- inicio_periodo$mday - 1
- } else if (input$home_filtro_periodo == "Período personalizado") {
- inicio_periodo <- as.POSIXlt(input$home_filtro_periodo_personalizado[1])
- fim_periodo <- as.POSIXlt(input$home_filtro_periodo_personalizado[2])
- }
- users = qualificacoes_cpf[tempo_cadastro >= as.numeric(inicio_periodo) & tempo_cadastro < as.numeric(fim_periodo),]
- if (input$home_filtro_empregado == "Desempregado") {
- desempregado = users$desempregado
- rows = which(desempregado == "SIM")
- users = users[rows,]
- }
- else if (input$home_filtro_empregado == "Empregado") {
- desempregado = users$desempregado
- rows = which(desempregado == "NAO")
- users = users[rows,]
- }
- users
- })
- output$usuarios_inscritos <- renderText({
- inscritos = nrow(home_inscritos_filtrados())
- format(inscritos, big.mark = ".", decimal.mark = ",")
- })
- output$usuarios_matriculados <- renderText({
- matriculados = nrow(home_matriculados_filtrados())
- format(matriculados, big.mark = ".", decimal.mark = ",")
- })
- output$usuarios_qualificados <- renderText({
- qualificados = nrow(home_qualificados_filtrados())
- format(qualificados, big.mark = ".", decimal.mark = ",")
- })
- # Mostra inscritos, matriculados e qualificados por uf
- output$dados_gerais_por_uf <- renderDataTable({
- inscritos_uf = home_inscritos_filtrados()
- inscritos_uf$uf[inscritos_uf$uf == "EX"] <- ""
- inscritos_uf$uf[inscritos_uf$uf == "NI"] <- ""
- inscritos_uf = inscritos_uf %>%
- group_by(uf) %>%
- summarise(Cadastros = length(userid))
- total_inscritos = data_frame(uf = "Total", Cadastros = sum(inscritos_uf$Cadastros))
- inscritos_uf = bind_rows(inscritos_uf, total_inscritos)
- matriculados_uf = home_matriculados_filtrados()
- matriculados_uf$uf[matriculados_uf$uf == "EX"] <- ""
- matriculados_uf$uf[matriculados_uf$uf == "NI"] <- ""
- matriculados_uf = matriculados_uf %>%
- group_by(uf) %>%
- summarise(Matrículas = length(userid))
- total_matriculados = data_frame(uf = "Total", Matrículas = sum(matriculados_uf$Matrículas))
- matriculados_uf = bind_rows(matriculados_uf, total_matriculados)
- qualificados_uf = home_qualificados_filtrados()
- qualificados_uf$uf[qualificados_uf$uf == "EX"] <- ""
- qualificados_uf$uf[qualificados_uf$uf == "NI"] <- ""
- qualificados_uf = qualificados_uf %>%
- group_by(uf) %>%
- summarise(Qualificações = length(userid))
- total_qualificados = data_frame(uf = "Total", Qualificações = sum(qualificados_uf$Qualificações))
- qualificados_uf = bind_rows(qualificados_uf, total_qualificados)
- join1 = merge(matriculados_uf, inscritos_uf, by = "uf")
- dados_uf = merge(join1, qualificados_uf, by = "uf")
- names(dados_uf)[names(dados_uf) == 'uf'] <- 'UF'
- dados_uf[1,1] = "Não Informado"
- dados_uf
- },
- options = list(
- paging = FALSE, # Desabilita a troca de paginas
- searching = FALSE, # desabilita funcionalidade de searching
- lengthChange = FALSE, # desabilita funcionalidade de troca de quantidade
- info = FALSE
- )
- )
- ##==========================================================================================================================
- ## TAB Mapas Outputs
- ## Esta secao contem todos os outputs (Textos e Mapas) que sao utilizados na tab mapas
- ##==========================================================================================================================
- #states = geojsonio::geojson_read("dados//mapas//Brasil.json", what = "sp")
- #states@data = select(states@data, -N)
- #qualificados_uf = user_course_badge_info %>%
- # group_by(uf) %>%
- # summarise(Qualificados = length(userid))
- #names(qualificados_uf)[names(qualificados_uf) == 'uf'] <- 'UF'
- #states = sp::merge(states, qualificados_uf, by = "UF", all.x = TRUE)
- #states$Qualificados = as.numeric(as.character(states$Qualificados))
- #output$mapas_output <- renderLeaflet({
- # bins = c(0, 200, 800, 1500, 4000, 8000, Inf)
- # pal = colorBin("YlGnBu", domain = states$Qualificados, bins = bins)
- # leaflet(states) %>%
- # setView(-48, -13, 4) %>%
- # addProviderTiles("MapBox", options = providerTileOptions(
- # id = "mapbox.light",
- # accessToken = Sys.getenv('pk.eyJ1IjoiaHVkc29ua3p2IiwiYSI6ImNqaGgzaWI2ODF4NHYzMHM2NTc0bjg0OXQifQ.0GrsfGGMRHYtSTHJcExopQ'))) %>%
- # addPolygons(
- # fillColor = ~pal(Qualificados),
- # weight = 2,
- # opacity = 1,
- # color = "white",
- # dashArray = "3",
- # fillOpacity = 0.7) %>%
- # addLegend(pal = pal, values = ~Qualificados, opacity = 0.7, title = "Qualificados x Estado",
- # position = "bottomright")
- #})
- ##==========================================================================================================================
- ## Eventos na UI
- ##==========================================================================================================================
- # Altera o titulo a ser mostrado na tab usuarios dependendo do input de selecao de desempregados
- observeEvent(input$usuarios_filtro_empregado, {
- if(input$usuarios_filtro_empregado == "Qualquer") {
- hide(id = "usuarios-titulo-desempregado", anim = FALSE)
- show(id = "usuarios-titulo-todos", anim = FALSE)
- } else {
- hide(id = "usuarios-titulo-todos", anim = FALSE)
- show(id = "usuarios-titulo-desempregado", anim = FALSE)
- }
- })
- # Esconde e Mostra o input de periodo personalizado na sidebar tab usuarios
- observeEvent(input$usuarios_filtro_periodo, {
- if(input$usuarios_filtro_periodo == "Período personalizado") {
- show(id = "usuarios_filtro_periodo_personalizado", anim = TRUE, animType = "slide", time = 0.3, selector = NULL)
- } else {
- hide(id = "usuarios_filtro_periodo_personalizado", anim = TRUE, animType = "slide", time = 0.3, selector = NULL)
- }
- if(input$usuarios_filtro_periodo == "Período personalizado" | input$usuarios_filtro_periodo == "Desde o início") {
- hide(id = "usuarios_criterio", anim = TRUE, animType = "slide", time = 0.3, selector = NULL)
- } else {
- show(id = "usuarios_criterio", anim = TRUE, animType = "slide", time = 0.3, selector = NULL)
- }
- })
- # Esconde e Mostra o input de periodo personalizado na sidebar tab home
- observeEvent(input$cursos_filtro_periodo, {
- if(input$cursos_filtro_periodo == "Período personalizado") {
- show(id = "cursos_filtro_periodo_personalizado", anim = TRUE, animType = "slide", time = 0.3, selector = NULL)
- } else {
- hide(id = "cursos_filtro_periodo_personalizado", anim = TRUE, animType = "slide", time = 0.3, selector = NULL)
- }
- })
- observeEvent(input$home_filtro_periodo, {
- if(input$home_filtro_periodo == "Período personalizado") {
- show(id = "home_filtro_periodo_personalizado", anim = TRUE, animType = "slide", time = 0.3, selector = NULL)
- } else {
- hide(id = "home_filtro_periodo_personalizado", anim = TRUE, animType = "slide", time = 0.3, selector = NULL)
- }
- if(input$home_filtro_periodo == "Período personalizado" | input$usuarios_filtro_periodo == "Desde o início") {
- hide(id = "home_criterio", anim = TRUE, animType = "slide", time = 0.3, selector = NULL)
- } else {
- show(id = "home_criterio", anim = TRUE, animType = "slide", time = 0.3, selector = NULL)
- }
- })
- # Esconde e Mostra os inputs na sidebar conforme a tab escolhida
- observeEvent(input$tabs, {
- if(input$tabs == "usuarios") {
- show(id = "usuarios_tab_input", anim = TRUE, animType = "slide", time = 0.3, selector = NULL)
- } else {
- hide(id = "usuarios_tab_input", anim = TRUE, animType = "slide", time = 0.3, selector = NULL)
- }
- if(input$tabs == "cursos") {
- show(id = "curso_tab_input", anim = TRUE, animType = "slide", time = 0.3, selector = NULL)
- } else {
- hide(id = "curso_tab_input", anim = TRUE, animType = "slide", time = 0.3, selector = NULL)
- }
- if(input$tabs == "mapas") {
- show(id = "mapas_tab_input", anim = TRUE, animType = "slide", time = 0.3, selector = NULL)
- } else {
- hide(id = "mapas_tab_input", anim = TRUE, animType = "slide", time = 0.3, selector = NULL)
- }
- if(input$tabs == "home") {
- show(id = "home_tab_input", anim = TRUE, animType = "slide", time = 0.3, selector = NULL)
- } else {
- hide(id = "home_tab_input", anim = TRUE, animType = "slide", time = 0.3, selector = NULL)
- }
- })
- # Evento do botao de marcar/desmarcar todos os cursos na tab Cursos
- observeEvent(input$curso_marcar, {
- if (length(input$curso_filtro_curso) == 0) {
- updateCheckboxGroupInput(session,"curso_filtro_curso", NULL, choices=cursos_lista, selected=cursos_lista)
- } else {
- updateCheckboxGroupInput(session,"curso_filtro_curso", NULL, choices=cursos_lista)
- }
- })
- # Troca o texto do botao de marcar/desmarcar todos na tab Cursos
- observeEvent(input$curso_filtro_curso, {
- if(length(input$curso_filtro_curso) == 0){
- updateActionButton(session, "curso_marcar", label = "Marcar Todos")
- } else {
- updateActionButton(session, "curso_marcar", label = "Desmarcar Todos")
- }
- }, ignoreNULL = FALSE)
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement