--- title: "Tabelas e graficos relatorio VPE" author: "IPEDF" date: "2025-05-08" output: word_document latex_engine: xelatex keep_tex: true --- ```{r setup, include=FALSE} knitr::opts_chunk$set( echo = FALSE, message = FALSE, warning = FALSE, fig.width = 10.5, # Largura em polegadas fig.height = 5.5 # Altura em polegadas ) options(encoding = "UTF-8") ``` ```{r} ## Tabelas e graficos do relatorio library(dplyr) library(data.table) library(readxl) library(writexl) library(tidyr) library(ggplot2) library(forcats) library(scales) ``` # Carregando dados ```{r} dados_enf <- read_xlsx("base enfermeiros.xlsx") dados_tec <- read_xlsx("base técnicos e auxiliares.xlsx") dados <- rbind(dados_enf, dados_tec) dados <- dados %>% filter(P2002 != "Outros") rm(dados_enf, dados_tec) ## Salvar base # write_xlsx(dados, "dados_todos.xlsx") ``` # 8.1 Panorama geral ### > Texto: Total de profissionais que sofreram pelo menos uma violência ```{r} ## Variaveis: # Agressão Física: P3002 == "Sim" # Agressão Verbal: P4001 == "Sim" # Assédio Moral: P5001 == "Sim" # Assédio Sexual: P6001 == "Sim" # 1. Criar variável indicadora de pelo menos uma violência df_auxiliar <- dados %>% mutate(sofreu_violencia = if_else( P3002 == "Sim" | P4001 == "Sim" | P5001 == "Sim" | P6001 == "Sim", TRUE, FALSE )) # 2. Calcular proporção em relação ao total de respondentes válidos percentual_violencia <- df_auxiliar %>% summarise( total_respondentes = n(), total_violencia = sum(sofreu_violencia, na.rm = TRUE), percentual = round(total_violencia / total_respondentes * 100, 1) ) # 4. Exibir tabela knitr::kable(percentual_violencia) ``` ### > Tabela 1: Percentual de profissionais de enfermagem vítimas por tipo de violência ```{r} ## Variaveis: # Agressão Física: P3002 == "Sim" # Agressão Verbal: P4001 == "Sim" # Assédio Moral: P5001 == "Sim" # Assédio Sexual: P6001 == "Sim" # 1. Criar indicadores binários de violência df_auxiliar <- dados %>% mutate( violencia_verbal = if_else(P4001 == "Sim", 1, 0), assedio_moral = if_else(P5001 == "Sim", 1, 0), violencia_fisica = if_else(P3002 == "Sim", 1, 0), assedio_sexual = if_else(P6001 == "Sim", 1, 0) ) # 2. Calcular total de respondentes válidos n_total <- nrow(df_auxiliar) # 3. Calcular percentuais resultado <- df_auxiliar %>% summarise( `Violência verbal` = mean(violencia_verbal, na.rm = TRUE) * 100, `Assédio moral` = mean(assedio_moral, na.rm = TRUE) * 100, `Violência física` = mean(violencia_fisica, na.rm = TRUE) * 100, `Assédio sexual` = mean(assedio_sexual, na.rm = TRUE) * 100 ) %>% mutate(across(everything(), round, 1)) %>% mutate(`Total (n = ...)` = paste0("Total (n = ", n_total, ")")) %>% select(`Total (n = ...)`, everything()) # 4. Exibir tabela knitr::kable(resultado) ``` ### > Tabela 2: Distribuição dos tipos de violência por categoria profissional ```{r} ## Variaveis: # Profissão: P2002: # "Técnica(o) de enfermagem" e "Auxiliar de enfermagem" como "Auxiliar e técnica(o) de enfermagem" # "Enfermeira(o)" Como "Enfermeira(o)" # Agressão Física: P3002 == "Sim" # Agressão Verbal: P4001 == "Sim" # Assédio Moral: P5001 == "Sim" # Assédio Sexual: P6001 == "Sim" # 1. Criar df_auxiliar com recodificação e filtros df_auxiliar <- dados %>% mutate( profissao = case_when( P2002 %in% c("Técnica(o) de enfermagem", "Auxiliar de enfermagem") ~ "Auxiliar e técnica(o) de enfermagem", P2002 == "Enfermeira(o)" ~ "Enfermeira(o)", TRUE ~ NA_character_ ), violencia_verbal = if_else(P4001 == "Sim", 1, 0), assedio_moral = if_else(P5001 == "Sim", 1, 0), violencia_fisica = if_else(P3002 == "Sim", 1, 0), assedio_sexual = if_else(P6001 == "Sim", 1, 0) ) %>% filter(!is.na(profissao)) # 2. Calcular proporções e incluir (n) resultado <- df_auxiliar %>% group_by(profissao) %>% summarise( n = n(), `Violência verbal` = mean(violencia_verbal, na.rm = TRUE) * 100, `Assédio moral` = mean(assedio_moral, na.rm = TRUE) * 100, `Violência física` = mean(violencia_fisica, na.rm = TRUE) * 100, `Assédio sexual` = mean(assedio_sexual, na.rm = TRUE) * 100, .groups = "drop" ) %>% mutate(across(where(is.numeric), round, 1)) %>% mutate(profissao = paste0(profissao, " (n = ", n, ")")) %>% select(-n) # remove a coluna n depois de embutir no nome knitr::kable(resultado) ``` ### > Tabela 3: Distribuição dos tipos de violência por gênero ```{r} # 1. Criar base auxiliar com gênero e indicadores de violência df_genero <- dados %>% filter(P1002 %in% c("Mulher", "Homem")) %>% # manter apenas categorias válidas mutate( genero = P1002, violencia_verbal = if_else(P4001 == "Sim", 1, 0), assedio_moral = if_else(P5001 == "Sim", 1, 0), violencia_fisica = if_else(P3002 == "Sim", 1, 0), assedio_sexual = if_else(P6001 == "Sim", 1, 0) ) # 2. Calcular proporções por gênero tabela_genero <- df_genero %>% group_by(genero) %>% summarise( n = n(), `Violência verbal` = mean(violencia_verbal, na.rm = TRUE) * 100, `Assédio moral` = mean(assedio_moral, na.rm = TRUE) * 100, `Violência física` = mean(violencia_fisica, na.rm = TRUE) * 100, `Assédio sexual` = mean(assedio_sexual, na.rm = TRUE) * 100, .groups = "drop" ) %>% mutate(across(where(is.numeric), round, 1)) %>% mutate(genero = paste0(genero, " (n = ", n, ")")) %>% select(-n) # remove coluna n após embutir no rótulo # 3. Exibir tabela knitr::kable(tabela_genero) ``` ### > Tabela 4: Frequência de situações de violência presenciadas nos últimos 12 meses ```{r} ## Variaveis: # Presenciou Agressão Física: P3020 # Presenciou Violência Verbal: P4020 # Presenciou Assédio Moral: P5020 # Presenciou Assédio Sexual: P6020 # Possibilidades de resposta: "Não", "Sim, uma vez", "Sim, duas ou mais vezes" # 1. Selecionar e renomear as variáveis df_auxiliar <- dados %>% select( `Agressão física` = P3020, `Violência verbal` = P4020, `Assédio moral` = P5020, `Assédio sexual` = P6020 ) # 2. Reorganizar em formato longo resultado <- df_auxiliar %>% pivot_longer(cols = everything(), names_to = "tipo_violencia", values_to = "resposta") %>% filter(resposta %in% c("Não", "Sim, uma vez", "Sim, duas ou mais vezes")) %>% count(tipo_violencia, resposta, name = "n") %>% group_by(tipo_violencia) %>% mutate( total = sum(n), percentual = round(n / total * 100, 1) ) %>% ungroup() # 3. Adicionar (n) no nome da linha resultado <- resultado %>% mutate(tipo_violencia = paste0(tipo_violencia, " (n = ", total, ")")) %>% select(-total) # 4. Converter para formato wide resultado <- resultado%>% pivot_wider( names_from = resposta, values_from = c(n, percentual), names_glue = "{resposta} ({.value})" ) knitr::kable(resultado) ``` ### > Figura 1: Preocupação sobre a ocorrência de violência no local de trabalho ```{r} ## O quanto você está preocupado com situações de violência em seu local de trabalho? #P7001 # 1. Criar vetor com ordem desejada dos fatores ordem_preocupacao <- c( "Nem um pouco preocupado", "Pouco preocupado", "Moderadamente preocupado", "Muito preocupado", "Extremamente preocupado" ) # 2. Criar tabela com contagem e percentual tabela_preocupacao <- dados %>% filter(!is.na(P7001)) %>% count(P7001, name = "n") %>% mutate( percentual = round(n / sum(n) * 100, 1), P7001 = factor(P7001, levels = ordem_preocupacao) ) %>% arrange(P7001) # 3. Gráfico ggplot(tabela_preocupacao, aes(x = percentual, y = fct_rev(P7001))) + geom_col(fill = "#4C78A8", width = 0.6) + geom_text(aes(label = paste0(percentual, "%")), hjust = -0.1, size = 4.2) + scale_x_continuous(limits = c(0, max(tabela_preocupacao$percentual) + 10)) + labs( x = NULL, y = NULL, title = NULL ) + theme_minimal(base_size = 17) + theme( panel.grid.major.y = element_blank(), panel.grid.minor = element_blank() ) ``` ### > Tabela 5: Perfil do agressor por violência sofrida ```{r} ## Calcular a frequencia relativa em relação ao total de agressores relatados ## Variaveis: # sofreu violência # Agressor da violência Física: P3005 # Agressor da Agressão Verbal: P4004 # Agressor da Assédio Moral: P5004 # Agressor da Assédio Sexual: P6004 # 1. Reorganizar variáveis e padronizar "Familiar de paciente" para "Familiar" df_longo <- dados %>% select( `Agressão física` = P3005, `Agressão verbal` = P4004, `Assédio moral` = P5004, `Assédio sexual` = P6004 ) %>% mutate(across(everything(), ~ ifelse(.x == "Familiar", "Familiar de paciente", .x))) %>% pivot_longer(cols = everything(), names_to = "tipo_violencia", values_to = "agressor") %>% filter(!is.na(agressor)) # 2. Total de marcações por tipo de violência totais_marcacoes <- df_longo %>% count(tipo_violencia, name = "total_marcacoes") # 3. Frequência de cada agressor por tipo df_formatado <- df_longo %>% group_by(tipo_violencia, agressor) %>% summarise(n = n(), .groups = "drop") %>% left_join(totais_marcacoes, by = "tipo_violencia") %>% mutate(percentual = round(n / total_marcacoes * 100, 1)) # 4. Criar rótulo com total de marcações df_formatado <- df_formatado %>% mutate(tipo_label = paste0(tipo_violencia, " (marcações = ", total_marcacoes, ")")) # 5. Pivotar para formato wide resultado <- df_formatado %>% select(tipo_label, agressor, n, percentual) %>% pivot_wider( names_from = tipo_label, values_from = c(percentual, n), names_glue = "{tipo_label} ({.value})", values_fill = 0 ) # 6. Exibir tabela knitr::kable(resultado) ``` ### > Tabela 6: Locais de trabalho relacionados aos relatos das violências ```{r} # Calcular frequencia relativa # (ex.: de todas as pessoas que sofreram violência física, quantas ocorreram ) # Agressão sofrida # Agressão Física: P3002 == "Sim" # Agressão Verbal: P4001 == "Sim" # Assédio Moral: P5001 == "Sim" # Assédio Sexual: P6001 == "Sim" ## Quais são os seus locais de trabalho? # P2005.other. == "Sim": Outros # P2005.SQ001. == "Sim": Hospital # P2005.SQ002. == "Sim": Unidade básica de saúde (UBS), Posto de saúde, AMA ou semelhantes # P2005.SQ003. == "Sim": Pronto socorro, UPA # P2005.SQ004. == "Sim": Casas de repouso ou semelhantes # P2005.SQ005. == "Sim": Serviços de saúde do trabalhador # P2005.SQ006. == "Sim": Instituição de ensino # P2005.SQ007. == "Sim": Domicílio particular # P2005.SQ008. == "Sim": Clínicas particulares # 1. Selecionar e renomear as colunas de local de trabalho colunas_locais <- c( "P2005.other.", "P2005.SQ001.", "P2005.SQ002.", "P2005.SQ003.", "P2005.SQ004.", "P2005.SQ005.", "P2005.SQ006.", "P2005.SQ007.", "P2005.SQ008." ) rotulos <- tibble::tibble( local = colunas_locais, rotulo = c( "Outros", "Hospital", "UBS / Posto de saúde / AMA", "Pronto socorro / UPA", "Casas de repouso", "Saúde do trabalhador", "Instituição de ensino", "Domicílio particular", "Clínicas particulares" ) ) # 2. Criar base com informações de violência e locais df_longo <- dados %>% mutate( fisica = if_else(P3002 == "Sim", 1, 0), verbal = if_else(P4001 == "Sim", 1, 0), moral = if_else(P5001 == "Sim", 1, 0), sexual = if_else(P6001 == "Sim", 1, 0) ) %>% select(all_of(colunas_locais), fisica, verbal, moral, sexual) # 3. Transformar em formato longo para os locais df_locais <- df_longo %>% pivot_longer(cols = all_of(colunas_locais), names_to = "local", values_to = "presenca") %>% filter(presenca == "Sim") %>% select(-presenca) # 4. Calcular totais de vítimas por tipo de violência totais <- colSums(df_longo[, c("fisica", "verbal", "moral", "sexual")], na.rm = TRUE) # 5. Agrupar e contar ocorrências por local tabela_freq <- df_locais %>% group_by(local) %>% summarise( `fisica (n)` = sum(fisica, na.rm = TRUE), `verbal (n)` = sum(verbal, na.rm = TRUE), `moral (n)` = sum(moral, na.rm = TRUE), `sexual (n)` = sum(sexual, na.rm = TRUE), .groups = "drop" ) %>% mutate( `fisica (%)` = round(`fisica (n)` / totais["fisica"] * 100, 1), `verbal (%)` = round(`verbal (n)` / totais["verbal"] * 100, 1), `moral (%)` = round(`moral (n)` / totais["moral"] * 100, 1), `sexual (%)` = round(`sexual (n)` / totais["sexual"] * 100, 1) ) %>% left_join(rotulos, by = "local") %>% select(rotulo, everything(), -local) # 6. Renomear colunas com (n = x) colnames(tabela_freq) <- c( "Local de trabalho", paste0("Agressão física (n = ", totais["fisica"], ") (n)"), paste0("Agressão verbal (n = ", totais["verbal"], ") (n)"), paste0("Assédio moral (n = ", totais["moral"], ") (n)"), paste0("Assédio sexual (n = ", totais["sexual"], ") (n)"), paste0("Agressão física (n = ", totais["fisica"], ") (%)"), paste0("Agressão verbal (n = ", totais["verbal"], ") (%)"), paste0("Assédio moral (n = ", totais["moral"], ") (%)"), paste0("Assédio sexual (n = ", totais["sexual"], ") (%)") ) # 7. Visualizar knitr::kable(tabela_freq) ``` ### > Tabela 7: Local de ocorrência das situações de violência ```{r} # Calcular frequencia relativa # (ex.: das agressões fisicas sofridas em todos os locais, quantas ocorreram na recepção) # Agressão sofrida # Agressão Física: P3002 == "Sim" # Agressão Verbal: P4001 == "Sim" # Assédio Moral: P5001 == "Sim" # Assédio Sexual: P6001 == "Sim" ## Onde ocorreu o incidente? # P3010.other. == "Sim": Outros # P3010.SQ001. == "Sim": Recepção # P3010.SQ002. == "Sim": Sala de triagem # P3010.SQ003. == "Sim": Sala de procedimentos/medicação # P3010.SQ004. == "Sim": Unidade de Terapia Intensiva (UTI) # P3010.SQ005. == "Sim": Centro cirúrgico # P3010.SQ006. == "Sim": Ala de internação # P3010.SQ007. == "Sim": Consultório # P3010.SQ008. == "Sim": Ambulatório # P3010.SQ009. == "Sim": Corredores ou alas de circulação comum # P3010.SQ010. == "Sim": Estacionamento # P3010.SQ011. == "Sim": Refeitório # P3010.SQ012. == "Sim": Vestiário # P3010.SQ013. == "Sim": Área de descanso # P3010.SQ014. == "Sim": Domicílio do paciente # 1. Definir colunas por tipo de violência colunas_fisica <- c("P3010.other.", "P3010.SQ001.", "P3010.SQ002.", "P3010.SQ003.", "P3010.SQ004.", "P3010.SQ005.", "P3010.SQ006.", "P3010.SQ007.", "P3010.SQ008.", "P3010.SQ009.", "P3010.SQ010.", "P3010.SQ011.", "P3010.SQ012.", "P3010.SQ013.", "P3010.SQ014.") colunas_verbal <- gsub("P3010", "P4010", colunas_fisica) colunas_moral <- gsub("P3010", "P5010", colunas_fisica) colunas_sexual <- gsub("P3010", "P6010", colunas_fisica) rotulos <- tibble::tibble( var = colunas_fisica, rotulo = c( "Outros", "Recepção", "Sala de triagem", "Sala de procedimentos/medicação", "UTI", "Centro cirúrgico", "Ala de internação", "Consultório", "Ambulatório", "Corredores / circulação", "Estacionamento", "Refeitório", "Vestiário", "Área de descanso", "Domicílio do paciente" ) ) # 2. Função auxiliar para gerar tabela para cada tipo gerar_tabela_local <- function(data, colunas, filtro, rotulos, nome_tipo) { data %>% filter(.data[[filtro]] == "Sim") %>% select(all_of(colunas)) %>% pivot_longer(cols = everything(), names_to = "var", values_to = "valor") %>% filter(valor == "Sim") %>% count(var, name = "n") %>% left_join(rotulos, by = "var") %>% mutate( tipo = nome_tipo, total = sum(n), perc = round(n / total * 100, 1) ) %>% select(rotulo, tipo, n, perc, total) } # Criar rotulos para cada tipo de violência rotulos_fisica <- rotulos rotulos_verbal <- rotulos %>% mutate(var = gsub("P3010", "P4010", var)) rotulos_moral <- rotulos %>% mutate(var = gsub("P3010", "P5010", var)) rotulos_sexual <- rotulos %>% mutate(var = gsub("P3010", "P6010", var)) # 3. Aplicar para cada tipo de violência tabela_fisica <- gerar_tabela_local(dados, colunas_fisica, "P3002", rotulos_fisica, "Agressão física") tabela_verbal <- gerar_tabela_local(dados, colunas_verbal, "P4001", rotulos_verbal, "Agressão verbal") tabela_moral <- gerar_tabela_local(dados, colunas_moral, "P5001", rotulos_moral, "Assédio moral") tabela_sexual <- gerar_tabela_local(dados, colunas_sexual, "P6001", rotulos_sexual, "Assédio sexual") # 4. Unir todas tabela_tudo <- bind_rows(tabela_fisica, tabela_verbal, tabela_moral, tabela_sexual) # 5. Tabela de frequências absolutas (n) tabela_n <- tabela_tudo %>% mutate(col = paste0(tipo, " (n = ", total, ") (n)")) %>% select(`Local de ocorrência` = rotulo, col, valor = n) %>% pivot_wider(names_from = col, values_from = valor, values_fill = 0) # 6. Tabela de percentuais tabela_perc <- tabela_tudo %>% mutate(col = paste0(tipo, " (n = ", total, ") (%)")) %>% select(`Local de ocorrência` = rotulo, col, valor = perc) %>% pivot_wider(names_from = col, values_from = valor, values_fill = 0) # 7. Juntar as duas tabela_wide <- left_join(tabela_n, tabela_perc, by = "Local de ocorrência") knitr::kable(tabela_wide) ``` ### > Figura 2: Turnos de ocorrência das violências ```{r} ## Em qual turno ocorreu o incidente? # P3009 para agressão fisica # P4008 para agressão verbal # P5008 para agressão moral # P6008 para agressão sexual # 1. Selecionar e renomear variáveis dos turnos por tipo de violência df_turno <- dados %>% select( `Violência física` = P3009, `Agressão verbal` = P4008, `Assédio moral` = P5008, `Assédio sexual` = P6008 ) %>% mutate(across(everything(), ~ ifelse(.x %in% c("Manhã", "Tarde", "Noite"), .x, NA))) %>% pivot_longer(cols = everything(), names_to = "tipo_violencia", values_to = "turno") %>% filter(!is.na(turno)) # 2. Frequência relativa df_turno_freq <- df_turno %>% group_by(tipo_violencia, turno) %>% summarise(n = n(), .groups = "drop") %>% group_by(tipo_violencia) %>% mutate(percentual = round(n / sum(n) * 100, 1)) # 3. Aplicar ordem personalizada df_turno_freq <- df_turno_freq %>% mutate( tipo_violencia = factor(tipo_violencia, levels = c( "Assédio sexual", "Assédio moral", "Agressão verbal", "Violência física" )), turno = factor(turno, levels = c("Manhã", "Tarde", "Noite")) ) # 4. Gráfico de barras horizontais agrupadas com rótulos ggplot(df_turno_freq, aes(x = tipo_violencia, y = percentual, fill = turno)) + geom_bar(stat = "identity", position = position_dodge(width = 0.9), color = "white") + geom_text(aes(label = paste0(percentual, "%")), position = position_dodge(width = 0.9), hjust = -0.1, size = 4.2) + coord_flip() + scale_fill_manual(values = c( "Manhã" = "#4F81BD", # azul "Tarde" = "#F79646", # laranja "Noite" = "#8064A2" # roxo )) + labs( x = NULL, y = NULL, fill = NULL, title = NULL ) + theme_minimal(base_size = 17) + theme( legend.position = "bottom", axis.text = element_text(size = 15) ) + ylim(0, max(df_turno_freq$percentual) + 10) ``` ### > Tabela 8: Reações da vítima depois da violência sofrida ```{r} # Calcular frequencia absoluta em relação ao total de vitimas # Agressão sofrida # Agressão Física: P3002 == "Sim" # Agressão Verbal: P4001 == "Sim" # Assédio Moral: P5001 == "Sim" # Assédio Sexual: P6001 == "Sim" ## Como você reagiu logo após o ocorrido? # P3011.SQ001. == "Sim": Não tive reação # P3011.SQ002. == "Sim": Discuti com a pessoa # P3011.SQ003. == "Sim": Pedi para a pessoa parar # P3011.SQ004. == "Sim": Tentei fingir que nada aconteceu # P3011.SQ005. == "Sim": Tentei me defender fisicamente # P3011.SQ006. == "Sim": Pedi transferência # 1. Função para gerar colunas com prefixo colunas_reacao <- function(prefixo) { paste0(prefixo, c(".SQ001.", ".SQ002.", ".SQ003.", ".SQ004.", ".SQ005.", ".SQ006.")) } # 2. Rótulos das reações rotulos_reacao <- tibble::tibble( cod = c(".SQ001.", ".SQ002.", ".SQ003.", ".SQ004.", ".SQ005.", ".SQ006."), rotulo = c( "Não tive reação", "Discuti com a pessoa", "Pedi para a pessoa parar", "Fingi que nada aconteceu", "Me defendi fisicamente", "Pedi transferência" ) ) # 3. Função para gerar a tabela (adaptada para colunas faltantes) gerar_tabela_reacao <- function(data, prefixo, filtro, rotulos, nome_tipo) { # Listar colunas que realmente existem na base colunas_completas <- colunas_reacao(prefixo) colunas_presentes <- colunas_completas[colunas_completas %in% names(data)] # Calcular total de vítimas total <- data %>% filter(.data[[filtro]] == "Sim") %>% nrow() # Montar tabela data %>% filter(.data[[filtro]] == "Sim") %>% select(all_of(colunas_presentes)) %>% pivot_longer(cols = everything(), names_to = "var", values_to = "valor") %>% filter(valor == "Sim") %>% count(var, name = "n") %>% mutate(cod = stringr::str_extract(var, "\\.SQ[0-9]{3}\\.")) %>% left_join(rotulos, by = "cod") %>% mutate( tipo = nome_tipo, total = total, perc = round(n / total * 100, 1) ) %>% select(rotulo, tipo, n, perc, total) } # 4. Gerar tabelas para cada tipo tabela_fisica <- gerar_tabela_reacao(dados, "P3011", "P3002", rotulos_reacao, "Agressão física") tabela_verbal <- gerar_tabela_reacao(dados, "P4011", "P4001", rotulos_reacao, "Agressão verbal") tabela_moral <- gerar_tabela_reacao(dados, "P5011", "P5001", rotulos_reacao, "Assédio moral") tabela_sexual <- gerar_tabela_reacao(dados, "P6011", "P6001", rotulos_reacao, "Assédio sexual") # 5. Unir todas tabela_tudo <- bind_rows(tabela_fisica, tabela_verbal, tabela_moral, tabela_sexual) # 6. Separar tabelas de n e % tabela_n <- tabela_tudo %>% mutate(col = paste0(tipo, " (n = ", total, ") (n)")) %>% select(`Reação da vítima` = rotulo, col, valor = n) %>% pivot_wider(names_from = col, values_from = valor, values_fill = 0) tabela_perc <- tabela_tudo %>% mutate(col = paste0(tipo, " (n = ", total, ") (%)")) %>% select(`Reação da vítima` = rotulo, col, valor = perc) %>% pivot_wider(names_from = col, values_from = valor, values_fill = 0) # 7. Juntar final tabela_final <- left_join(tabela_n, tabela_perc, by = "Reação da vítima") # 8. Visualizar knitr::kable(tabela_final) ``` # 8.2 Agressao Verbal ### > Figura 3: Frequência da agressão verbal nos últimos 12 meses ```{r} # tabela com frequencia absoluta (total é a quantidade de pessoas que sofreram violencia verbal) # Nos últimos 12 meses, você sofreu agressão verbal em seu ambiente de trabalho? # P4002 == "Sim" # Nos últimos 12 meses, quantas vezes você foi agredida(o) verbalmente? # P4002: "Uma vez", "Duas vezes", "Três vezes", " Quatro vezes ou mais", "Não me lembro", "Prefiro não responder" # 1. Filtrar apenas quem sofreu agressão verbal dados_filtrados <- dados %>% filter(P4001 == "Sim") # 2. Total de vítimas total_vitimas <- nrow(dados_filtrados) # 3. Definir ordem desejada das respostas ordem_manual <- c( "Uma vez", "Duas vezes", "Três vezes", "Quatro vezes ou mais", "Não me lembro", "Prefiro não responder" ) # 4. Tabela com frequência absoluta e percentual tabela <- dados_filtrados %>% filter(!is.na(P4002)) %>% count(P4002, name = "n") %>% mutate( percentual = round(n / total_vitimas * 100, 1), P4002 = factor(P4002, levels = ordem_manual) ) # 5. Gráfico com ordenação manual (ggplot(tabela, aes(x = P4002, y = n)) + geom_col(fill = "#377eb8", width = 0.7) + geom_text(aes(label = paste0(percentual, "%")), vjust = -0.5, size = 4.2) + labs(x = NULL, y = NULL) + scale_y_continuous(expand = expansion(mult = c(0, 0.1))) + theme_minimal(base_size = 13) + theme( panel.grid.major.x = element_blank(), panel.grid.minor = element_blank() )) ``` ### > Texto: Distribuição da agressão verbal por agressor ```{r} # tabela com frequencia relativa (forçar somar 100%) # Considerando o último episódio de agressão verbal sofrida por você, quem foi o agressor(a)? # P4004 # 1. Filtrar respostas válidas (quem sofreu agressão verbal e respondeu o agressor) dados_filtrados <- dados %>% filter(P4001 == "Sim", !is.na(P4004)) # 2. Calcular total de respostas válidas total_respostas <- nrow(dados_filtrados) # 3. Tabela de frequência relativa (força soma de 100%) tabela <- dados_filtrados %>% count(P4004, name = "n") %>% mutate( percentual = round(n / total_respostas * 100, 1) ) %>% arrange(desc(percentual)) # 4. Gráfico (ggplot(tabela, aes(x = percentual / 100, y = fct_reorder(P4004, percentual))) + geom_col(fill = "#377eb8", width = 0.7) + geom_text(aes(label = paste0(percentual, "%")), hjust = -0.1, size = 4.2) + scale_x_continuous(labels = scales::percent_format(accuracy = 10), limits = c(0, 1)) + labs(x = NULL, y = NULL) + theme_minimal(base_size = 13) + theme( panel.grid.major.y = element_blank(), panel.grid.minor = element_blank() )) ``` ### > Figura 4: Distribuição da agressão verbal por categoria profissional do agressor ```{r} # tabela com frequencia relativa (total de agressores que trabalham diretamente com a pessoa) # Caso seu(sua) agressor(a) trabalhe diretamente com você, qual a profissão dele(a)? # P4006 # 1. Filtrar quem sofreu agressão verbal e respondeu a profissão do agressor dados_filtrados <- dados %>% filter(P4001 == "Sim", !is.na(P4006)) # alterar de assistente para auxiliar de enfermagem dados_filtrados <- dados_filtrados %>% mutate( P4006 = ifelse(P4006 == "Assistente de enfermagem", "Auxiliar de enfermagem", P4006) ) # 2. Total de respostas válidas total_respostas <- nrow(dados_filtrados) # 3. Tabela de frequência relativa tabela <- dados_filtrados %>% count(P4006, name = "n") %>% mutate( percentual = round(n / total_respostas * 100, 1) ) %>% arrange(desc(percentual)) # 4. Gráfico (ggplot(tabela, aes(x = percentual / 100, y = fct_reorder(P4006, percentual))) + geom_col(fill = "#377eb8", width = 0.7) + geom_text(aes(label = paste0(percentual, "%")), hjust = -0.1, size = 4.2) + scale_x_continuous(labels = scales::percent_format(accuracy = 10), limits = c(0, 1)) + labs(x = NULL, y = NULL) + theme_minimal(base_size = 13) + theme( panel.grid.major.y = element_blank(), panel.grid.minor = element_blank() )) ``` ### > Texto: Sexo do agressor ```{r} # Pegunta de resposta única # Frequencia absoluta # universo: total de pessoas que sofreram violência verbal ## Qual era o sexo do(a) agressor(a)? # Selecionar a variável coluna_simples <- "P4007" rotulos <- tibble::tibble( opcao = c("Masculino", "Feminino"), rotulo = c("Masculino", "Feminino") ) # 1. Criar tabela de frequências tabela <- dados %>% filter(!is.na(.data[[coluna_simples]])) %>% count(opcao = .data[[coluna_simples]], name = "n") %>% left_join(rotulos, by = "opcao") # 2. Calcular universo total_respostas <- sum(tabela$n) # 3. Calcular percentual relativo ao total de respostas tabela <- tabela %>% mutate(percentual = round((n / total_respostas) * 100, 1)) %>% arrange(desc(percentual)) linha_total <- tibble::tibble( opcao = "Total", n = total_respostas, percentual = 100, rotulo = "Total" ) tabela <- bind_rows(tabela, linha_total) # 4. Visualizar knitr::kable(tabela) ``` ### > Texto: Forma da agressao ```{r} # Pegunta de resposta única # Frequencia absoluta # universo: total de pessoas que sofreram violência verbal ## De que maneira ocorreu a agressão verbal? # Selecionar a variável coluna_simples <- "P4009" # 1. Criar tabela de frequências tabela <- dados %>% filter(!is.na(.data[[coluna_simples]])) %>% count(opcao = .data[[coluna_simples]], name = "n") # 2. Calcular universo total_respostas <- sum(tabela$n) # 3. Calcular percentual relativo ao total de respostas tabela <- tabela %>% mutate(percentual = round((n / total_respostas) * 100, 1)) %>% arrange(desc(percentual)) linha_total <- tibble::tibble( opcao = "Total", n = total_respostas, percentual = 100 ) tabela <- bind_rows(tabela, linha_total) # 4. Visualizar knitr::kable(tabela) ``` # 8.3 Assédio Moral ### > Figura 5: Frequência do assédio moral nos últimos 12 meses ```{r} # tabela com frequencia absoluta (total é a quantidade de pessoas que sofreram assédio moral) # Nos últimos 12 meses, você sofreu assédio moral em seu ambiente de trabalho? # P5001 == "Sim" # Nos últimos 12 meses, quantas vezes você sofreu assédio moral? # P5002: "Uma vez", "Duas vezes", "Três vezes", " Quatro vezes ou mais", "Não me lembro", "Prefiro não responder" # 1. Filtrar apenas quem sofreu assédio moral dados_filtrados <- dados %>% filter(P5001 == "Sim") # 2. Total de vítimas total_vitimas <- nrow(dados_filtrados) # 3. Definir ordem desejada ordem_manual <- c( "Uma vez", "Duas vezes", "Três vezes", "Quatro vezes ou mais", "Não me lembro", "Prefiro não responder" ) # 4. Criar tabela com n e % tabela <- dados_filtrados %>% filter(!is.na(P5002)) %>% count(P5002, name = "n") %>% mutate( percentual = round(n / total_vitimas * 100, 1), P5002 = factor(P5002, levels = ordem_manual) ) # 5. Gráfico (ggplot(tabela, aes(x = P5002, y = n)) + geom_col(fill = "#377eb8", width = 0.7) + geom_text(aes(label = paste0(percentual, "%")), vjust = -0.5, size = 4.2) + labs(x = NULL, y = NULL) + scale_y_continuous(expand = expansion(mult = c(0, 0.1))) + theme_minimal(base_size = 13) + theme( panel.grid.major.x = element_blank(), panel.grid.minor = element_blank() )) ``` ### > Texto: Sexo do agressor ```{r} # Pegunta de resposta única # Frequencia absoluta # universo: total de pessoas que sofreram violência verbal ## Qual era o sexo do(a) agressor(a)? # Selecionar a variável coluna_simples <- "P4007" rotulos <- tibble::tibble( opcao = c("Masculino", "Feminino"), rotulo = c("Masculino", "Feminino") ) # 1. Criar tabela de frequências tabela <- dados %>% filter(!is.na(.data[[coluna_simples]])) %>% count(opcao = .data[[coluna_simples]], name = "n") %>% left_join(rotulos, by = "opcao") # 2. Calcular universo total_respostas <- sum(tabela$n) # 3. Calcular percentual relativo ao total de respostas tabela <- tabela %>% mutate(percentual = round((n / total_respostas) * 100, 1)) %>% arrange(desc(percentual)) linha_total <- tibble::tibble( opcao = "Total", n = total_respostas, percentual = 100, rotulo = "Total" ) tabela <- bind_rows(tabela, linha_total) # 4. Visualizar knitr::kable(tabela) ``` ### > Figura 6: Distribuição do assédio moral por categoria profissional do agressor ```{r} # tabela com frequencia relativa (total de agressores que trabalham diretamente com a pessoa) # Caso seu(sua) agressor(a) trabalhe diretamente com você, qual a profissão dele(a)? # P5006 # 1. Filtrar quem sofreu agressão verbal e respondeu a profissão do agressor dados_filtrados <- dados %>% filter(P5001 == "Sim", !is.na(P5006)) # alterar de assistente para auxiliar de enfermagem dados_filtrados <- dados_filtrados %>% mutate( P5006 = ifelse(P5006 == "Assistente de enfermagem", "Auxiliar de enfermagem", P5006) ) # 2. Total de respostas válidas total_respostas <- nrow(dados_filtrados) # 3. Tabela de frequência relativa tabela <- dados_filtrados %>% count(P5006, name = "n") %>% mutate( percentual = round(n / total_respostas * 100, 1) ) %>% arrange(desc(percentual)) # 4. Gráfico (ggplot(tabela, aes(x = percentual / 100, y = fct_reorder(P5006, percentual))) + geom_col(fill = "#377eb8", width = 0.7) + geom_text(aes(label = paste0(percentual, "%")), hjust = -0.1, size = 4.2) + scale_x_continuous(labels = scales::percent_format(accuracy = 10), limits = c(0, 1)) + labs(x = NULL, y = NULL) + theme_minimal(base_size = 13) + theme( panel.grid.major.y = element_blank(), panel.grid.minor = element_blank() )) ``` ### > Texto: Sexo do agressor ```{r} # Pegunta de resposta única # Frequencia absoluta # universo: total de pessoas que sofreram assédio moral ## Qual era o sexo do(a) agressor(a)? # Selecionar a variável coluna_simples <- "P5007" # 1. Criar tabela de frequências tabela <- dados %>% filter(!is.na(.data[[coluna_simples]])) %>% count(opcao = .data[[coluna_simples]], name = "n") # 2. Calcular universo total_respostas <- sum(tabela$n) # 3. Calcular percentual relativo ao total de respostas tabela <- tabela %>% mutate(percentual = round((n / total_respostas) * 100, 1)) %>% arrange(desc(percentual)) linha_total <- tibble::tibble( opcao = "Total", n = total_respostas, percentual = 100 ) tabela <- bind_rows(tabela, linha_total) # 4. Visualizar knitr::kable(tabela) ``` ### > Texto: Forma da agressao ```{r} # Pegunta de resposta única # Frequencia absoluta # universo: total de pessoas que sofreram violência verbal ## De que maneira ocorreu a agressão verbal? # Selecionar a variável coluna_simples <- "P5009" # 1. Criar tabela de frequências tabela <- dados %>% filter(!is.na(.data[[coluna_simples]])) %>% count(opcao = .data[[coluna_simples]], name = "n") # 2. Calcular universo total_respostas <- sum(tabela$n) # 3. Calcular percentual relativo ao total de respostas tabela <- tabela %>% mutate(percentual = round((n / total_respostas) * 100, 1)) %>% arrange(desc(percentual)) linha_total <- tibble::tibble( opcao = "Total", n = total_respostas, percentual = 100 ) tabela <- bind_rows(tabela, linha_total) # 4. Visualizar knitr::kable(tabela) ``` # 8.4 Assédio Sexual ### > Figura 7: Frequência do assédio sexual nos últimos 12 meses ```{r} # tabela com frequencia absoluta (total é a quantidade de pessoas que sofreram assédio sexual) # Nos últimos 12 meses, você sofreu assédio sexual em seu ambiente de trabalho? # P6001 == "Sim" # Nos últimos 12 meses, quantas vezes você sofreu assédio sexual? # P6002: "Uma vez", "Duas vezes", "Três vezes", " Quatro vezes ou mais", "Não me lembro", "Prefiro não responder" # 1. Filtrar apenas quem sofreu assédio sexual dados_filtrados <- dados %>% filter(P6001 == "Sim") # 2. Total de vítimas total_vitimas <- nrow(dados_filtrados) # 3. Definir ordem desejada ordem_manual <- c( "Uma vez", "Duas vezes", "Três vezes", "Quatro vezes ou mais", "Não me lembro", "Prefiro não responder" ) # 4. Criar tabela com n e % tabela <- dados_filtrados %>% filter(!is.na(P6002)) %>% count(P6002, name = "n") %>% mutate( percentual = round(n / total_vitimas * 100, 1), P6002 = factor(P6002, levels = ordem_manual) ) # 5. Gráfico (ggplot(tabela, aes(x = P6002, y = n)) + geom_col(fill = "#377eb8", width = 0.7) + geom_text(aes(label = paste0(percentual, "%")), vjust = -0.5, size = 4.2) + labs(x = NULL, y = NULL) + scale_y_continuous(expand = expansion(mult = c(0, 0.1))) + theme_minimal(base_size = 13) + theme( panel.grid.major.x = element_blank(), panel.grid.minor = element_blank() )) ``` ### > Figura 8: Distribuição do assédio sexual segundo o perfil dos agressores ```{r} # tabela com frequencia relativa (forçar somar 100%) # Considerando o último episódio de agressão sexual sofrido por você, quem foi o agressor(a)? # P6004 # 1. Filtrar quem sofreu assédio sexual e respondeu o agressor dados_filtrados <- dados %>% filter(P6001 == "Sim", !is.na(P6004)) # 2. Total de respostas válidas total_respostas <- nrow(dados_filtrados) # 3. Calcular frequência relativa tabela <- dados_filtrados %>% count(P6004, name = "n") %>% mutate( percentual = round(n / total_respostas * 100, 1) ) %>% arrange(desc(percentual)) # 4. Criar gráfico (ggplot(tabela, aes(x = percentual / 100, y = fct_reorder(P6004, percentual))) + geom_col(fill = "#377eb8", width = 0.7) + geom_text(aes(label = paste0(percentual, "%")), hjust = -0.1, size = 4.2) + scale_x_continuous(labels = scales::percent_format(accuracy = 10), limits = c(0, 1)) + labs(x = NULL, y = NULL) + theme_minimal(base_size = 13) + theme( panel.grid.major.y = element_blank(), panel.grid.minor = element_blank() )) ``` ### > Texto: Distribuição da agressão sexual por categoria profissional do agressor ```{r} # tabela com frequencia relativa (total de agressores que trabalham diretamente com a pessoa) # Caso seu(sua) agressor(a) trabalhe diretamente com você, qual a profissão dele(a)? # P6006 # 1. Filtrar quem sofreu assédio sexual e respondeu a profissão do agressor dados_filtrados <- dados %>% filter(P6001 == "Sim", !is.na(P6006)) # 2. Total de respostas válidas total_respostas <- nrow(dados_filtrados) # 3. Tabela de frequência relativa tabela <- dados_filtrados %>% count(P6006, name = "n") %>% mutate( percentual = round(n / total_respostas * 100, 1) ) %>% arrange(desc(percentual)) # 4. Gráfico (ggplot(tabela, aes(x = percentual / 100, y = fct_reorder(P6006, percentual))) + geom_col(fill = "#377eb8", width = 0.7) + geom_text(aes(label = paste0(percentual, "%")), hjust = -0.1, size = 4.2) + scale_x_continuous(labels = scales::percent_format(accuracy = 10), limits = c(0, 1)) + labs(x = NULL, y = NULL) + theme_minimal(base_size = 13) + theme( panel.grid.major.y = element_blank(), panel.grid.minor = element_blank() )) ``` ### > Texto: Sexo do agressor ```{r} # Pegunta de resposta única # Frequencia absoluta # universo: total de pessoas que sofreram violência física # Selecionar a variável coluna_simples <- "P6008" rotulos <- tibble::tibble( opcao = c("Masculino", "Feminino", "Prefere não dizer", "Outro"), rotulo = c("Masculino", "Feminino", "Prefere não dizer", "Outro") ) # 1. Criar tabela de frequências tabela <- dados %>% filter(!is.na(.data[[coluna_simples]])) %>% count(opcao = .data[[coluna_simples]], name = "n") %>% left_join(rotulos, by = "opcao") # 2. Calcular universo total_respostas <- sum(tabela$n) # 3. Calcular percentual relativo ao total de respostas tabela <- tabela %>% mutate(percentual = round((n / total_respostas) * 100, 1)) %>% arrange(desc(percentual)) linha_total <- tibble::tibble( opcao = "Total", n = total_respostas, percentual = 100, rotulo = "Total" ) (tabela <- bind_rows(tabela, linha_total)) ``` # 8.5 Violência Física ### > Figura 9: Frequência da violência física nos últimos 12 meses ```{r} # tabela com frequencia absoluta (total é a quantidade de pessoas que sofreram agressão física) # Nos últimos 12 meses, você sofreu violência física no seu ambiente de trabalho? # P3002 == "Sim" # Nos últimos 12 meses, quantas vezes você foi agredida(o) fisicamente no seu ambiente de trabalho? # P3003: "Uma vez", "Duas vezes", "Três vezes", " Quatro vezes ou mais", "Não me lembro", "Prefiro não responder" # 1. Filtrar apenas quem sofreu agressão física dados_filtrados <- dados %>% filter(P3002 == "Sim") # 2. Total de vítimas total_vitimas <- nrow(dados_filtrados) # 3. Ordem desejada das categorias ordem_manual <- c( "Uma vez", "Duas vezes", "Três vezes", "Quatro vezes ou mais", "Não me lembro", "Prefiro não responder" ) # 4. Tabela de frequência tabela <- dados_filtrados %>% filter(!is.na(P3003)) %>% count(P3003, name = "n") %>% mutate( percentual = round(n / total_vitimas * 100, 1), P3003 = factor(P3003, levels = ordem_manual) ) # 5. Gráfico (ggplot(tabela, aes(x = P3003, y = n)) + geom_col(fill = "#377eb8", width = 0.7) + geom_text(aes(label = paste0(percentual, "%")), vjust = -0.5, size = 4.2) + labs(x = NULL, y = NULL) + scale_y_continuous(expand = expansion(mult = c(0, 0.1))) + theme_minimal(base_size = 13) + theme( panel.grid.major.x = element_blank(), panel.grid.minor = element_blank() )) ``` ### > texto: Distribuição da violência física segundo o perfil dos agressores ```{r} # tabela com frequencia relativa (forçar somar 100%) # Considerando o último episódio de violência física sofrido por você, quem foi o agressor(a)? # P3005 # 1. Filtrar quem sofreu violência física e respondeu o agressor dados_filtrados <- dados %>% filter(P3002 == "Sim", !is.na(P3005)) # 2. Total de respostas válidas total_respostas <- nrow(dados_filtrados) # 3. Calcular frequência relativa tabela <- dados_filtrados %>% count(P3005, name = "n") %>% mutate( percentual = round(n / total_respostas * 100, 1) ) %>% arrange(desc(percentual)) # 4. Criar gráfico (ggplot(tabela, aes(x = percentual / 100, y = fct_reorder(P3005, percentual))) + geom_col(fill = "#377eb8", width = 0.7) + geom_text(aes(label = paste0(percentual, "%")), hjust = -0.1, size = 4.2) + scale_x_continuous(labels = scales::percent_format(accuracy = 10), limits = c(0, 1)) + labs(x = NULL, y = NULL) + theme_minimal(base_size = 13) + theme( panel.grid.major.y = element_blank(), panel.grid.minor = element_blank() )) ``` ### > Texto: Sexo do agressor ```{r} # Pegunta de resposta única # Frequencia absoluta # universo: total de pessoas que sofreram violência física ## Qual era o sexo do(a) agressor(a)? # Selecionar a variável coluna_simples <- "P3008" # 1. Criar tabela de frequências tabela <- dados %>% filter(!is.na(.data[[coluna_simples]])) %>% count(opcao = .data[[coluna_simples]], name = "n") # 2. Calcular universo total_respostas <- sum(tabela$n) # 3. Calcular percentual relativo ao total de respostas tabela <- tabela %>% mutate(percentual = round((n / total_respostas) * 100, 1)) %>% arrange(desc(percentual)) linha_total <- tibble::tibble( opcao = "Total", n = total_respostas, percentual = 100 ) tabela <- bind_rows(tabela, linha_total) # 4. Visualizar knitr::kable(tabela) ``` # 8.6 Os fatores que contribuem para situações de violência ### > Figura 10: Fatores que contribuem para violência X Tipos de violências ```{r, fig.width= 12, fig.height=10} # Fatores que contribuem para violência física: ## Na sua opinião, o que contribui para que situações de violência XX ocorram contra profissionais da enfermagem? # SQ001 == "Sim": Trabalhar diretamente com o público # SQ002 == "Sim": Falta de precisão na atribuição de papeis e responsabilidades # SQ003 == "Sim": Falta de segurança no ambiente de trabalho # SQ004 == "Sim": Superlotação das unidades de atendimento # SQ005 == "Sim": Longo tempo de espera por atendimento # SQ006 == "Sim": Número reduzido de trabalhadores # SQ007 == "Sim": Falta de medicamentos e outros equipamentos # SQ008 == "Sim": Falta de incentivo às denúncias # SQ009 == "Sim": Diferenças/hierarquia entre as profissões fatores <- paste0(".SQ", sprintf("%03d", 1:9), ".") rotulos <- tibble::tibble( cod = fatores, rotulo = c( "Trabalhar diretamente com o público", "Falta de precisão nas atribuições", "Falta de segurança", "Superlotação", "Longo tempo de espera", "Número reduzido de trabalhadores", "Falta de medicamentos/equipamentos", "Falta de incentivo às denúncias", "Diferenças/hierarquia entre profissões" ) ) # 2. Função para montar tabela por tipo gerar_tabela_fatores <- function(data, filtro, prefixo, nome_tipo) { colunas <- paste0(prefixo, fatores) colunas_presentes <- colunas[colunas %in% names(data)] total <- data %>% filter(.data[[filtro]] == "Sim") %>% nrow() data %>% filter(.data[[filtro]] == "Sim") %>% select(all_of(colunas_presentes)) %>% pivot_longer(cols = everything(), names_to = "var", values_to = "valor") %>% filter(valor == "Sim") %>% count(var, name = "n") %>% mutate( cod = stringr::str_extract(var, "\\.SQ[0-9]{3}\\."), tipo = nome_tipo, percentual = round(n / total * 100, 1) ) %>% left_join(rotulos, by = "cod") %>% select(tipo, rotulo, percentual) } # Gerar tabelas para cada tipo de violência tabela_fisica <- gerar_tabela_fatores(dados, "P3002", "P3022", "Violência física") tabela_verbal <- gerar_tabela_fatores(dados, "P4001", "P4022", "Agressão verbal") tabela_moral <- gerar_tabela_fatores(dados, "P5001", "P5022", "Assédio moral") tabela_sexual <- gerar_tabela_fatores(dados, "P6001", "P6022", "Assédio sexual") # Unir todas tabela_final <- bind_rows(tabela_fisica, tabela_verbal, tabela_moral, tabela_sexual) (ggplot(tabela_final, aes(x = percentual / 100, y = fct_reorder(rotulo, percentual), fill = tipo)) + geom_col(position = "dodge", width = 0.7) + geom_text(aes(label = paste0(percentual, "%")), position = position_dodge(width = 0.7), hjust = -0.1, size = 3.8) + scale_x_continuous(labels = scales::percent_format(accuracy = 10), expand = expansion(mult = c(0, 0.1))) + scale_fill_manual( values = c( "Violência física" = "#4C78A8", # Azul "Agressão verbal" = "#F58518", # Laranja "Assédio moral" = "#B8B8B8", # Cinza "Assédio sexual" = "#FFB000" # Amarelo ) ) + labs(x = NULL, y = NULL, fill = NULL) + theme_minimal(base_size = 13) + theme( panel.grid.major.y = element_blank(), panel.grid.minor = element_blank(), legend.position = "bottom" )) ``` ```{r} # Função para calcular a média de marcações por pessoa entre vítimas media_marcacoes <- function(data, filtro, prefixo) { colunas <- paste0(prefixo, fatores) colunas_presentes <- colunas[colunas %in% names(data)] dados_filtrados <- data %>% filter(.data[[filtro]] == "Sim") %>% select(all_of(colunas_presentes)) media <- dados_filtrados %>% mutate(across(everything(), ~ ifelse(. == "Sim", 1, 0))) %>% rowSums(na.rm = TRUE) %>% mean() return(round(media, 2)) } # Calcular para cada tipo de violência media_fisica <- media_marcacoes(dados, "P3002", "P3022") media_verbal <- media_marcacoes(dados, "P4001", "P4022") media_moral <- media_marcacoes(dados, "P5001", "P5022") media_sexual <- media_marcacoes(dados, "P6001", "P6022") # Mostrar resultados resultado <- tibble::tibble( `Tipo de violência` = c("Violência física", "Agressão verbal", "Assédio moral", "Assédio sexual"), `Média de fatores assinalados` = c(media_fisica, media_verbal, media_moral, media_sexual) ) knitr::kable(resultado) ``` # 8.7 Impactos da violência ### > Tabela 9: Consequências relatadas por tipo de violência vivenciada ```{r} # Calcular frequencia absoluta em relação ao total de pessoas que testemunharam a violência # Agressão sofrida: # Agressão Física: P3002 == "Sim" # Agressão Verbal: P4001 == "Sim" # Assédio Moral: P5001 == "Sim" # Assédio Sexual: P6001 == "Sim" ## Quais foram as consequências para você após sofrer a violência física? # P3015.SQ001. == "Sim": Ansiedade # P3015.SQ002. == "Sim": Baixa autoestima # P3015.SQ003. == "Sim": Dor # P3015.SQ004. == "Sim": Estresse # P3015.SQ005. == "Sim": Lesão # P3015.SQ006. == "Sim": Medo # P3015.SQ007. == "Sim": Perda da concentração # P3015.SQ008. == "Sim": Raiva # P3015.SQ009. == "Sim": Sentimento de inferioridade # P3015.SQ010. == "Sim": Tristeza # P3015.SQ011. == "Sim": Ganho/perda de peso repentino # P3015.SQ012. == "Sim": Necessidade de uso de medicação por recomendação médica # P3015.SQ013. == "Sim": Desmotivação para ir ao trabalho/local do ocorrido ## Quais foram as consequências para você após sofrer a agressão verbal? # P4015.SQ001. == "Sim": Ansiedade # P4015.SQ002. == "Sim": Baixa autoestima # P4015.SQ003. == "Sim": Dor # P4015.SQ004. == "Sim": Estresse # P4015.SQ005. == "Sim": Medo # P4015.SQ006. == "Sim": Perda da concentração # P4015.SQ007. == "Sim": Raiva # P4015.SQ008. == "Sim": Sentimento de inferioridade # P4015.SQ009. == "Sim": Tristeza # P4015.SQ010. == "Sim": Ganho/perda de peso repentino # P4015.SQ011. == "Sim": Necessidade de uso de medicação por recomendação médica ## Quais foram as consequências para você após sofrer o assédio moral? # P5015.SQ001. == "Sim": Ansiedade # P5015.SQ002. == "Sim": Baixa autoestima # P5015.SQ003. == "Sim": Dor # P5015.SQ004. == "Sim": Estresse # P5015.SQ005. == "Sim": Lesão # P5015.SQ006. == "Sim": Medo # P5015.SQ007. == "Sim": Perda da concentração # P5015.SQ008. == "Sim": Raiva # P5015.SQ009. == "Sim": Sentimento de inferioridade # P5015.SQ010. == "Sim": Tristeza # P5015.SQ011. == "Sim": Ganho/perda de peso repentino # P5015.SQ012. == "Sim": Necessidade de uso de medicação por recomendação médica ## Quais foram as consequências para você após sofrer o assédio sexual? # P6015.SQ001. == "Sim": Ansiedade # P6015.SQ002. == "Sim": Baixa autoestima # P6015.SQ003. == "Sim": Dor # P6015.SQ004. == "Sim": Estresse # P6015.SQ005. == "Sim": Medo # P6015.SQ006. == "Sim": Perda da concentração # P6015.SQ007. == "Sim": Raiva # P6015.SQ008. == "Sim": Sentimento de inferioridade # P6015.SQ009. == "Sim": Tristeza # P6015.SQ010. == "Sim": Ganho/perda de peso repentino # P6015.SQ011. == "Sim": Necessidade de uso de medicação por recomendação médica library(dplyr) library(tidyr) library(stringr) library(tibble) # 1. Rótulos separados por tipo de violência rotulos_fisica <- tibble( cod = paste0(".SQ", str_pad(1:13, 3, pad = "0"), "."), rotulo = c( "Ansiedade", "Baixa autoestima", "Dor", "Estresse", "Lesão", "Medo", "Perda da concentração", "Raiva", "Sentimento de inferioridade", "Tristeza", "Ganho/perda de peso repentino", "Uso de medicação (recomendação médica)", "Desmotivação para ir ao trabalho" ) ) rotulos_verbal <- tibble( cod = paste0(".SQ", str_pad(1:11, 3, pad = "0"), "."), rotulo = c( "Ansiedade", "Baixa autoestima", "Dor", "Estresse", "Medo", "Perda da concentração", "Raiva", "Sentimento de inferioridade", "Tristeza", "Ganho/perda de peso repentino", "Uso de medicação (recomendação médica)" ) ) rotulos_moral <- tibble( cod = paste0(".SQ", str_pad(1:12, 3, pad = "0"), "."), rotulo = c( "Ansiedade", "Baixa autoestima", "Dor", "Estresse", "Lesão", "Medo", "Perda da concentração", "Raiva", "Sentimento de inferioridade", "Tristeza", "Ganho/perda de peso repentino", "Uso de medicação (recomendação médica)" ) ) rotulos_sexual <- tibble( cod = paste0(".SQ", str_pad(1:11, 3, pad = "0"), "."), rotulo = c( "Ansiedade", "Baixa autoestima", "Dor", "Estresse", "Medo", "Perda da concentração", "Raiva", "Sentimento de inferioridade", "Tristeza", "Ganho/perda de peso repentino", "Uso de medicação (recomendação médica)" ) ) # 2. Função genérica para processar cada tipo gerar_tabela_tipo <- function(data, filtro_var, prefixo, tipo_nome, rotulos_tipo) { colunas <- paste0(prefixo, ".SQ", str_pad(1:nrow(rotulos_tipo), 3, pad = "0"), ".") colunas_presentes <- colunas[colunas %in% names(data)] total <- data %>% filter(.data[[filtro_var]] == "Sim") %>% nrow() data %>% filter(.data[[filtro_var]] == "Sim") %>% select(all_of(colunas_presentes)) %>% pivot_longer(cols = everything(), names_to = "variavel", values_to = "valor") %>% filter(valor == "Sim") %>% count(variavel, name = "n") %>% mutate( cod = str_extract(variavel, "\\.SQ[0-9]{3}\\."), tipo = tipo_nome, total = total, perc = round(n / total * 100, 1) ) %>% left_join(rotulos_tipo, by = "cod") %>% filter(!is.na(rotulo)) %>% select(`Consequência relatada` = rotulo, tipo, `n (absoluto)` = n, `percentual (%)` = perc, total) } # 3. Calcular separadamente tabela_fisica <- gerar_tabela_tipo(dados, "P3002", "P3015", "Violência física", rotulos_fisica) tabela_verbal <- gerar_tabela_tipo(dados, "P4001", "P4015", "Violência verbal", rotulos_verbal) tabela_moral <- gerar_tabela_tipo(dados, "P5001", "P5015", "Assédio moral", rotulos_moral) tabela_sexual <- gerar_tabela_tipo(dados, "P6001", "P6015", "Assédio sexual", rotulos_sexual) # 4. Juntar todas as tabelas tabela_final <- bind_rows(tabela_fisica, tabela_verbal, tabela_moral, tabela_sexual) # 5. Converter para formato wide tabela_n <- tabela_final %>% mutate(col = paste0(tipo, " (n = ", total, ") (n)")) %>% select(`Consequência relatada`, col, valor = `n (absoluto)`) %>% pivot_wider(names_from = col, values_from = valor, values_fill = 0) tabela_perc <- tabela_final %>% mutate(col = paste0(tipo, " (n = ", total, ") (%)")) %>% select(`Consequência relatada`, col, valor = `percentual (%)`) %>% pivot_wider(names_from = col, values_from = valor, values_fill = 0) # 6. Tabela final completa tabela_wide <- left_join(tabela_n, tabela_perc, by = "Consequência relatada") # 7. Exibir resultado knitr::kable(tabela_wide) ``` Média de marcações: ```{r} # 1. Função para calcular média de marcações calcular_media_marcacoes <- function(data, filtro, prefixo) { colunas <- names(data)[startsWith(names(data), prefixo)] data %>% filter(.data[[filtro]] == "Sim") %>% select(all_of(colunas)) %>% mutate(across(everything(), ~ ifelse(. == "Sim", 1, 0))) %>% rowSums(na.rm = TRUE) %>% mean() %>% round(2) } # 2. Calcular para cada tipo de violência media_fisica <- calcular_media_marcacoes(dados, "P3002", "P3015") media_verbal <- calcular_media_marcacoes(dados, "P4001", "P4015") media_moral <- calcular_media_marcacoes(dados, "P5001", "P5015") media_sexual <- calcular_media_marcacoes(dados, "P6001", "P6015") # 3. Montar tabela final media_consequencias <- tibble::tibble( `Tipo de violência` = c("Violência física", "Violência verbal", "Assédio moral", "Assédio sexual"), `Média de consequências assinaladas` = c(media_fisica, media_verbal, media_moral, media_sexual) ) # 4. Exibir knitr::kable(media_consequencias) ``` ### > Tabela 10: Distribuição dos sentimentos relatados por tipo de violência presenciada ```{r} # Calcular frequencia absoluta em relação ao total de pessoas que testemunharam a violência # Agressão presenciada # Agressão Física: P3020 == "Sim" # Agressão Verbal: P4020 == "Sim" # Assédio Moral: P5020 == "Sim" # Assédio Sexual: P6020 == "Sim" ## O que você sentiu após presenciar o ocorrido? # .SQ001. == "Sim": Desconforto # .SQ002. == "Sim": Culpa # .SQ003. == "Sim": Medo # .SQ004. == "Sim": Raiva # .SQ005. == "Sim": Sentimento de impotência # .SQ006. == "Sim": Sentimento de injustiça # .SQ007. == "Sim": Tristeza # 1. Sufixos das colunas de sentimentos sufixos_sentimentos <- paste0(".SQ", stringr::str_pad(1:7, 3, pad = "0"), ".") # 2. Rótulos dos sentimentos rotulos_sentimentos <- tibble::tibble( sufixo = sufixos_sentimentos, rotulo = c( "Desconforto", "Culpa", "Medo", "Raiva", "Sentimento de impotência", "Sentimento de injustiça", "Tristeza" ) ) # 3. Lista de prefixos por tipo de violência tipos_violencia <- tibble::tibble( tipo = c("Agressão física", "Agressão verbal", "Assédio moral", "Assédio sexual"), filtro = c("P3020", "P4020", "P5020", "P6020"), prefixo = c("P3021", "P4021", "P5021", "P6021") ) # 4. Função para gerar tabela de sentimentos gerar_tabela_sentimentos <- function(data, filtro, prefixo, nome_tipo) { colunas <- paste0(prefixo, sufixos_sentimentos) colunas_presentes <- colunas[colunas %in% names(data)] # Considerar apenas quem respondeu "Sim, uma vez" ou "Sim, duas ou mais vezes" data_filtrada <- data %>% filter(.data[[filtro]] %in% c("Sim, uma vez", "Sim, duas ou mais vezes")) total <- nrow(data_filtrada) data_filtrada %>% select(all_of(colunas_presentes)) %>% pivot_longer(cols = everything(), names_to = "var", values_to = "valor") %>% filter(valor == "Sim") %>% mutate( sufixo = stringr::str_extract(var, "\\.SQ[0-9]{3}\\."), tipo = nome_tipo ) %>% count(tipo, sufixo, name = "n") %>% mutate( total = total, perc = round(n / total * 100, 1) ) %>% left_join(rotulos_sentimentos, by = "sufixo") %>% select(rotulo, tipo, n, perc, total) } # 5. Aplicar a todos os tipos de violência tabela_tudo <- purrr::pmap_dfr(tipos_violencia, function(tipo, filtro, prefixo) { gerar_tabela_sentimentos(dados, filtro, prefixo, tipo) }) # 6. Tabela wide (com colunas (n) e (%)) tabela_n <- tabela_tudo %>% mutate(col = paste0(tipo, " (n = ", total, ") (n)")) %>% select(`Sentimento relatado` = rotulo, col, valor = n) %>% pivot_wider(names_from = col, values_from = valor, values_fill = 0) tabela_perc <- tabela_tudo %>% mutate(col = paste0(tipo, " (n = ", total, ") (%)")) %>% select(`Sentimento relatado` = rotulo, col, valor = perc) %>% pivot_wider(names_from = col, values_from = valor, values_fill = 0) # 7. Juntar e exibir tabela_final <- left_join(tabela_n, tabela_perc, by = "Sentimento relatado") knitr::kable(tabela_final) ``` Média de Marcações: ```{r} # 1. Função auxiliar para gerar os nomes das colunas de múltiplas alternativas colunas_consequencia <- function(prefixo) { paste0(prefixo, ".SQ", stringr::str_pad(1:13, 3, pad = "0"), ".") } # 2. Função para calcular a média de marcações por pessoa que sofreu violência media_consequencias <- function(data, filtro, prefixo) { colunas <- colunas_consequencia(prefixo) colunas_presentes <- colunas[colunas %in% names(data)] data %>% filter(.data[[filtro]] == "Sim") %>% select(all_of(colunas_presentes)) %>% mutate(across(everything(), ~ ifelse(. == "Sim", 1, 0))) %>% rowSums(na.rm = TRUE) %>% mean() %>% round(2) } # 3. Calcular para cada tipo de violência media_fisica <- media_consequencias(dados, "P3002", "P3015") media_verbal <- media_consequencias(dados, "P4001", "P4015") media_moral <- media_consequencias(dados, "P5001", "P5015") media_sexual <- media_consequencias(dados, "P6001", "P6015") # 4. Tabela final tibble::tibble( `Tipo de violência` = c("Agressão física", "Agressão verbal", "Assédio moral", "Assédio sexual"), `Média de consequências assinaladas` = c(media_fisica, media_verbal, media_moral, media_sexual) ) ``` ```{r} ## Mapa de calor tabela_final <- tabela_final %>% select(-"Agressão física (n = 309) (n)", -"Agressão verbal (n = 482) (n)", -"Assédio moral (n = 339) (n)" , -"Assédio sexual (n = 108) (n)") # 1. Transformar para formato longo tabela_long <- tabela_final %>% pivot_longer( cols = -`Sentimento relatado`, names_to = "Tipo de violência", values_to = "Percentual" ) # 2. Criar o mapa de calor ggplot(tabela_long, aes(x = `Tipo de violência`, y = `Sentimento relatado`, fill = Percentual)) + geom_tile(color = "white") + geom_text(aes(label = paste0(Percentual, "%")), color = "black", size = 4) + scale_fill_gradientn( colours = c("#ffffff", "#A1D99B", "#238B45") ) + labs( x = NULL, y = NULL, fill = "Percentual (%)", title = NULL ) + theme_minimal(base_size = 13) + theme( axis.text.x.top = element_text(size = 12, face = "bold"), axis.text.y = element_text(size = 12, face = "bold"), axis.text.x.bottom = element_blank(), axis.ticks.x.bottom = element_blank(), axis.line.x.bottom = element_blank(), panel.grid = element_blank(), legend.position = "none" ) + scale_x_discrete(position = "top") ``` ### > Tabela 11: Situação laboral das vítimas após episódios de violência ```{r} # Calcular frequencia absoluta # Agressão sofrida # Agressão Física: P3002 == "Sim" # Agressão Verbal: P4001 == "Sim" # Assédio Moral: P5001 == "Sim" # Assédio Sexual: P6001 == "Sim" ## (situação laboral após o episodio de violência) ## Após o episódio de agressão verbal você: # Agressão Física: P3014 # Agressão Verbal: P4014 # Assédio Moral: P5014 # Assédio Sexual: P6014 # 1. Função para padronizar respostas de situação laboral padronizar_situacao <- function(x) { case_when( grepl("continu", x, ignore.case = TRUE) ~ "Continuei trabalhando", grepl("algum tempo", x, ignore.case = TRUE) ~ "Fui liberada(o) algum tempo após o incidente", grepl("logo após", x, ignore.case = TRUE) ~ "Fui liberada(o) logo após o incidente", TRUE ~ x ) } # 2. Função principal gerar_tabela_situacao_laboral <- function(data, var, filtro, nome_tipo) { dados_filtrados <- data %>% filter(.data[[filtro]] == "Sim", !is.na(.data[[var]])) %>% mutate(situacao = padronizar_situacao(.data[[var]])) total <- nrow(dados_filtrados) dados_filtrados %>% count(situacao, name = "n") %>% mutate( tipo = nome_tipo, total = total, perc = round(n / total * 100, 1) ) %>% select(situacao, tipo, n, perc, total) } # 3. Aplicar para cada tipo de violência tabela_fisica <- gerar_tabela_situacao_laboral(dados, "P3014", "P3002", "Agressão física") tabela_verbal <- gerar_tabela_situacao_laboral(dados, "P4014", "P4001", "Agressão verbal") tabela_moral <- gerar_tabela_situacao_laboral(dados, "P5014", "P5001", "Assédio moral") tabela_sexual <- gerar_tabela_situacao_laboral(dados, "P6014", "P6001", "Assédio sexual") # 4. Unir e formatar tabela_tudo <- bind_rows(tabela_fisica, tabela_verbal, tabela_moral, tabela_sexual) # Tabelas separadas por (n) e (%) tabela_n <- tabela_tudo %>% mutate(col = paste0(tipo, " (n = ", total, ") (n)")) %>% select(`Situação laboral após a violência` = situacao, col, valor = n) %>% pivot_wider(names_from = col, values_from = valor, values_fill = 0) tabela_perc <- tabela_tudo %>% mutate(col = paste0(tipo, " (n = ", total, ") (%)")) %>% select(`Situação laboral após a violência` = situacao, col, valor = perc) %>% pivot_wider(names_from = col, values_from = valor, values_fill = 0) # Final tabela_final <- left_join(tabela_n, tabela_perc, by = "Situação laboral após a violência") # Visualizar knitr::kable(tabela_final) ``` # 8.8 Medidas tomadas em situações de violências ## 3.8.1. Denúncias e registros formais ### > Texto: quantidade de denúncia por tipo de violência ```{r} # calcular proporção da população que não denunciou: # Agressão sofrida # Agressão Física: P3002 == "Sim" # Agressão Verbal: P4001 == "Sim" # Assédio Moral: P5001 == "Sim" # Assédio Sexual: P6001 == "Sim" ## Você registrou/denunciou o incidente? # Agressão Física: P3013B == "Sim" # Agressão Verbal: P4013B == "Sim" # Assédio Moral: P5013B == "Sim" # Assédio Sexual: P6013B == "Sim" # 1. Função para gerar tabela por tipo de violência gerar_tabela_denuncia <- function(data, filtro_violencia, var_denuncia, nome_tipo) { total <- data %>% filter(.data[[filtro_violencia]] == "Sim", !is.na(.data[[var_denuncia]])) %>% nrow() data %>% filter(.data[[filtro_violencia]] == "Sim", !is.na(.data[[var_denuncia]])) %>% count(resposta = .data[[var_denuncia]], name = "n") %>% mutate( tipo = nome_tipo, total = total, percentual = round(n / total * 100, 1) ) } # 2. Aplicar a função para cada tipo de violência tabela_fisica <- gerar_tabela_denuncia(dados, "P3002", "P3013B", "Violência física") tabela_verbal <- gerar_tabela_denuncia(dados, "P4001", "P4013B", "Violência verbal") tabela_moral <- gerar_tabela_denuncia(dados, "P5001", "P5013B", "Assédio moral") tabela_sexual <- gerar_tabela_denuncia(dados, "P6001", "P6013B", "Assédio sexual") # 3. Unir as tabelas tabela_tudo <- bind_rows(tabela_fisica, tabela_verbal, tabela_moral, tabela_sexual) # 4. Gráfico com o mesmo modelo salvo ggplot(tabela_tudo, aes(y = fct_reorder(tipo, percentual), x = percentual / 100, fill = resposta)) + geom_col(position = "stack", width = 0.7) + geom_text(aes(label = paste0(percentual, "%")), position = position_stack(vjust = 0.5), size = 4.2, color = "white") + scale_x_continuous(labels = scales::percent_format(), expand = expansion(mult = c(0, 0.05))) + scale_fill_manual( values = c("Sim" = "#4C78A8", # azul "Não" = "#F58518") # laranja ) + labs(x = NULL, y = NULL, fill = NULL) + theme_minimal(base_size = 13) + theme( panel.grid.major.y = element_blank(), panel.grid.minor = element_blank(), legend.position = "bottom" ) ``` ### > Figura 11: Distribuição das fontes de incentivo à denúncia no local de trabalho ```{r} ## De quem parte o incentivo para a denúncia da violência no seu local de trabalho? # P7003.SQ002. == "Sim": Da chefia e/ou supervisor # P7003.SQ003. == "Sim": Da equipe de Recursos Humanos (RH) # P7003.SQ004. == "Sim": Dos colegas de trabalho # P7003.SQ005. == "Sim": Dos comitês de ética e segurança # P7003.SQ006. == "Sim": Dos sindicatos e associações profissionais # Existe algum incentivo para a denúncia da violência no seu local de trabalho? # P7003B == "Sim" # 1. Selecionar colunas da pergunta múltipla colunas <- paste0("P7003.SQ", stringr::str_pad(2:6, 3, pad = "0"), ".") # 2. Dicionário de rótulos rotulos <- tibble::tibble( opcao = colunas, rotulo = c( "Da chefia e/ou supervisor", "Da equipe de Recursos Humanos (RH)", "Dos colegas de trabalho", "Dos comitês de ética e segurança", "Dos sindicatos e associações profissionais" ) ) # 3. Calcular total de respondentes que disseram "Sim" para P7003B total_respostas <- dados %>% filter(P7003B == "Sim") %>% select(all_of(colunas)) %>% filter(if_any(everything(), ~ !is.na(.))) %>% nrow() # 4. Calcular frequência de marcações apenas entre quem respondeu "Sim" à P7003B tabela <- dados %>% filter(P7003B == "Sim") %>% select(all_of(colunas)) %>% summarise(across(everything(), ~ sum(. == "Sim", na.rm = TRUE))) %>% pivot_longer(cols = everything(), names_to = "opcao", values_to = "n") %>% left_join(rotulos, by = "opcao") %>% mutate( percentual = round(n / total_respostas * 100, 1) ) %>% arrange(desc(percentual)) # 5. Gráfico (ggplot(tabela, aes(x = percentual / 100, y = fct_reorder(rotulo, percentual))) + geom_col(fill = "#377eb8", width = 0.7) + geom_text(aes(label = paste0(percentual, "%")), hjust = -0.1, size = 4.2) + scale_x_continuous(labels = scales::percent_format(accuracy = 10), expand = expansion(mult = c(0, 0.1))) + labs(x = NULL, y = NULL) + theme_minimal(base_size = 13) + theme( panel.grid.major.y = element_blank(), panel.grid.minor = element_blank() )) ``` ### > Tabela 13: Distribuição dos motivos de não ter denunciado por tipo de violência ```{r} # Calcular frequencia absoluta em relação ao total de vitimas # Agressão sofrida # Agressão Física: P3002 == "Sim" # Agressão Verbal: P4001 == "Sim" # Assédio Moral: P5001 == "Sim" # Assédio Sexual: P6001 == "Sim" ## Por que você não denunciou o incidente? # P3016.SQ001. == "Sim": Não foi importante # P3016.SQ002. == "Sim": Senti vergonha # P3016.SQ003. == "Sim": Senti culpa # P3016.SQ004. == "Sim": Não sabia a quem denunciar # P3016.SQ005. == "Sim": Fiquei com medo de consequências negativas # P3016.SQ006. == "Sim": Pensei que não seriam tomadas providências # 1. Função para gerar colunas da pergunta múltipla colunas_motivo_n_denuncia <- function(prefixo) { paste0(prefixo, c(".SQ001.", ".SQ002.", ".SQ003.", ".SQ004.", ".SQ005.", ".SQ006.")) } # 2. Dicionário de rótulos rotulos_motivo_n_denuncia <- tibble::tibble( cod = c(".SQ001.", ".SQ002.", ".SQ003.", ".SQ004.", ".SQ005.", ".SQ006."), rotulo = c( "Não foi importante", "Senti vergonha", "Senti culpa", "Não sabia a quem denunciar", "Fiquei com medo de consequências negativas", "Pensei que não seriam tomadas providências" ) ) # 3. Função para gerar a tabela gerar_tabela_motivo <- function(data, prefixo, filtro, rotulos, nome_tipo) { colunas_completas <- colunas_motivo_n_denuncia(prefixo) colunas_presentes <- colunas_completas[colunas_completas %in% names(data)] total <- data %>% filter(.data[[filtro]] == "Sim") %>% nrow() data %>% filter(.data[[filtro]] == "Sim") %>% select(all_of(colunas_presentes)) %>% pivot_longer(cols = everything(), names_to = "var", values_to = "valor") %>% filter(valor == "Sim") %>% count(var, name = "n") %>% mutate(cod = stringr::str_extract(var, "\\.SQ[0-9]{3}\\.")) %>% left_join(rotulos, by = "cod") %>% mutate( tipo = nome_tipo, total = total, perc = round(n / total * 100, 1) ) %>% select(rotulo, tipo, n, perc, total) } # 4. Aplicar por tipo de violência tabela_fisica <- gerar_tabela_motivo(dados, "P3016", "P3002", rotulos_motivo_n_denuncia, "Agressão física") tabela_verbal <- gerar_tabela_motivo(dados, "P4016", "P4001", rotulos_motivo_n_denuncia, "Agressão verbal") tabela_moral <- gerar_tabela_motivo(dados, "P5016", "P5001", rotulos_motivo_n_denuncia, "Assédio moral") tabela_sexual <- gerar_tabela_motivo(dados, "P6016", "P6001", rotulos_motivo_n_denuncia, "Assédio sexual") # 5. Unir todas tabela_tudo <- bind_rows(tabela_fisica, tabela_verbal, tabela_moral, tabela_sexual) # 6. Separar tabelas de n e % tabela_n <- tabela_tudo %>% mutate(col = paste0(tipo, " (n = ", total, ") (n)")) %>% select(`Motivo da não denúncia` = rotulo, col, valor = n) %>% pivot_wider(names_from = col, values_from = valor, values_fill = 0) tabela_perc <- tabela_tudo %>% mutate(col = paste0(tipo, " (n = ", total, ") (%)")) %>% select(`Motivo da não denúncia` = rotulo, col, valor = perc) %>% pivot_wider(names_from = col, values_from = valor, values_fill = 0) # 7. Juntar final tabela_final <- left_join(tabela_n, tabela_perc, by = "Motivo da não denúncia") # 8. Visualizar knitr::kable(tabela_final) ``` Média de Marcações: ```{r} # Função para calcular média de marcações media_marcacoes_motivo <- function(data, filtro, prefixo) { colunas <- colunas_motivo_n_denuncia(prefixo) colunas_presentes <- colunas[colunas %in% names(data)] data %>% filter(.data[[filtro]] == "Sim") %>% select(all_of(colunas_presentes)) %>% mutate(across(everything(), ~ ifelse(. == "Sim", 1, 0))) %>% rowSums(na.rm = TRUE) %>% mean() %>% round(2) } # Calcular para cada tipo de violência media_fisica <- media_marcacoes_motivo(dados, "P3002", "P3016") media_verbal <- media_marcacoes_motivo(dados, "P4001", "P4016") media_moral <- media_marcacoes_motivo(dados, "P5001", "P5016") media_sexual <- media_marcacoes_motivo(dados, "P6001", "P6016") # Exibir resultados tibble::tibble( `Tipo de violência` = c("Agressão física", "Agressão verbal", "Assédio moral", "Assédio sexual"), `Média de motivos assinalados` = c(media_fisica, media_verbal, media_moral, media_sexual) ) ``` ### > Texto: Existem procedimentos para a denúncia ```{r} # Existem procedimentos para a denúncia de casos de violência em seu local de trabalho? # P7002 == "Sim" table(dados$P7002) 362/(340+362) ``` ## 3.8.2. Estratégias internas ## 3.8.3. Rede de apoio para as vítimas ### > Figura 12: Apoio acionado pelas vítimas, por tipo de violência ```{r} # Calcular frequencia absoluta em relação ao total de vitimas # Agressão sofrida # Violência física: P3002 == "Sim" # Agressão Verbal: P4001 == "Sim" # Assédio Moral: P5001 == "Sim" # Assédio Sexual: P6001 == "Sim" ## Logo após o ocorrido, você contou para alguém? # P3012.SQ001.== "Sim": Amigos # P3012.SQ002.== "Sim": Colegas de trabalho # P3012.SQ003.== "Sim": Familiar # P3012.SQ004.== "Sim": Chefe # P3012.SQ005.== "Sim": Ninguém # 1. Função para gerar colunas com prefixo colunas_contou <- function(prefixo) { paste0(prefixo, c(".SQ001.", ".SQ002.", ".SQ003.", ".SQ004.", ".SQ005.")) } # 2. Rótulos das respostas rotulos_contou <- tibble::tibble( cod = c(".SQ001.", ".SQ002.", ".SQ003.", ".SQ004.", ".SQ005."), rotulo = c( "Amigos", "Colegas de trabalho", "Familiar", "Chefe", "Ninguém" ) ) # 3. Função para gerar a tabela gerar_tabela_contou <- function(data, prefixo, filtro, rotulos, nome_tipo) { colunas_completas <- colunas_contou(prefixo) colunas_presentes <- colunas_completas[colunas_completas %in% names(data)] total <- data %>% filter(.data[[filtro]] == "Sim") %>% nrow() data %>% filter(.data[[filtro]] == "Sim") %>% select(all_of(colunas_presentes)) %>% pivot_longer(cols = everything(), names_to = "var", values_to = "valor") %>% filter(valor == "Sim") %>% count(var, name = "n") %>% mutate(cod = stringr::str_extract(var, "\\.SQ[0-9]{3}\\.")) %>% left_join(rotulos, by = "cod") %>% mutate( tipo = nome_tipo, total = total, perc = round(n / total * 100, 1) ) %>% select(rotulo, tipo, n, perc, total) } # 4. Gerar tabelas por tipo de violência tabela_fisica <- gerar_tabela_contou(dados, "P3012", "P3002", rotulos_contou, "Violência física") tabela_verbal <- gerar_tabela_contou(dados, "P4012", "P4001", rotulos_contou, "Agressão verbal") tabela_moral <- gerar_tabela_contou(dados, "P5012", "P5001", rotulos_contou, "Assédio moral") tabela_sexual <- gerar_tabela_contou(dados, "P6012", "P6001", rotulos_contou, "Assédio sexual") # 5. Unir todas tabela_tudo <- bind_rows(tabela_fisica, tabela_verbal, tabela_moral, tabela_sexual) # 6. Visualizar tabela final wide (opcional) library(tidyr) tabela_n <- tabela_tudo %>% mutate(col = paste0(tipo, " (n = ", total, ") (n)")) %>% select(`Para quem contou` = rotulo, col, valor = n) %>% pivot_wider(names_from = col, values_from = valor, values_fill = 0) tabela_perc <- tabela_tudo %>% mutate(col = paste0(tipo, " (n = ", total, ") (%)")) %>% select(`Para quem contou` = rotulo, col, valor = perc) %>% pivot_wider(names_from = col, values_from = valor, values_fill = 0) tabela_final <- left_join(tabela_n, tabela_perc, by = "Para quem contou") knitr::kable(tabela_final) # 7. Gráfico ggplot(tabela_tudo, aes(x = perc / 100, y = fct_reorder(rotulo, perc), fill = tipo)) + geom_col(position = "dodge", width = 0.7) + geom_text(aes(label = paste0(perc, "%")), position = position_dodge(width = 0.7), hjust = -0.1, size = 4.2) + scale_x_continuous(labels = scales::percent_format(accuracy = 1), expand = expansion(mult = c(0, 0.1))) + scale_fill_manual(values = c( "Violência física" = "#4C78A8", "Agressão verbal" = "#F58518", "Assédio moral" = "#B8B8B8", "Assédio sexual" = "#FFB000" )) + labs(x = NULL, y = NULL, fill = NULL) + theme_minimal(base_size = 13) + theme( panel.grid.major.y = element_blank(), panel.grid.minor = element_blank(), legend.position = "bottom" ) ``` ### > Figura 13: Suporte da chefia X Tipos de violências sofridas ```{r} # Calcular frequencia relativa em relação ao total de respostas # Agressão sofrida # Agressão Física: P3002 == "Sim" # Agressão Verbal: P4001 == "Sim" # Assédio Moral: P5001 == "Sim" # Assédio Sexual: P6001 == "Sim" ## Sua chefia, coordenação ou supervisor(a) ofereceu ajuda? # P3018B == "Sim": Sim # P3018B == "Não": Não # 1. Função para gerar tabela por tipo de violência gerar_tabela_suporte <- function(data, filtro, var_suporte, nome_tipo) { total <- data %>% filter(.data[[filtro]] == "Sim", !is.na(.data[[var_suporte]])) %>% nrow() data %>% filter(.data[[filtro]] == "Sim", !is.na(.data[[var_suporte]])) %>% count(resposta = .data[[var_suporte]], name = "n") %>% mutate( tipo = nome_tipo, total = total, percentual = round(n / total * 100, 1) ) } # 2. Aplicar a função para cada tipo tabela_fisica <- gerar_tabela_suporte(dados, "P3002", "P3018B", "Violência física") tabela_verbal <- gerar_tabela_suporte(dados, "P4001", "P4018B", "Agressão Verbal") tabela_moral <- gerar_tabela_suporte(dados, "P5001", "P5018B", "Assédio moral") tabela_sexual <- gerar_tabela_suporte(dados, "P6001", "P6018B", "Assédio sexual") # 3. Unir tabelas tabela_tudo <- bind_rows(tabela_fisica, tabela_verbal, tabela_moral, tabela_sexual) # 4. Gráfico ggplot(tabela_tudo, aes(y = fct_reorder(tipo, percentual), x = percentual / 100, fill = resposta)) + geom_col(position = "stack", width = 0.7) + geom_text(aes(label = paste0(percentual, "%")), position = position_stack(vjust = 0.5), size = 4.2, color = "white") + scale_x_continuous(labels = scales::percent_format(), expand = expansion(mult = c(0, 0.05))) + scale_fill_manual( values = c("Sim" = "#4C78A8", # azul "Não" = "#F58518") # laranja ) + labs(x = NULL, y = NULL, fill = "Resposta") + theme_minimal(base_size = 13) + theme( panel.grid.major.y = element_blank(), panel.grid.minor = element_blank() ) ``` ## 3.8.4. Providências aplicadas aos agressores ### > Tabela 14: Consequências aplicadas ao agressor, por tipo de violência sofrida ```{r} # Calcular frequencia relativa em relação a ter denunciado ## Agressão sofrida # Agressão Física: P3002 == "Sim" # Agressão Verbal: P4001 == "Sim" # Assédio Moral: P5001 == "Sim" # Assédio Sexual: P6001 == "Sim" ## Você registrou/denunciou o incidente? # P3013B == "Sim"" # Calcular frequencia absoluta em relação ao total de vitimas # Agressão sofrida # Agressão Física: P3002 == "Sim" # Agressão Verbal: P4001 == "Sim" # Assédio Moral: P5001 == "Sim" # Assédio Sexual: P6001 == "Sim" ## Qual providência foi tomada contra o(a) agressor(a)? # P3017.SQ002. == "Sim": Sofreu advertência verbal # P3017.SQ003. == "Sim": Seu tratamento foi interrompido # P3017.SQ004. == "Sim": Foi transferido(a) de setor # P3017.SQ005. == "Sim": Houve registro policial # P3017.SQ006. == "Sim": Foi processado(a) # P3017.SQ007. == "Sim": Foi demitido(a) # P3017.SQ008. == "Sim": Não sei # 1. Função para gerar colunas colunas_consequencia_agressor <- function(prefixo) { paste0(prefixo, c(".SQ002.", ".SQ003.", ".SQ004.", ".SQ005.", ".SQ006.", ".SQ007.", ".SQ008.")) } # 2. Dicionário de rótulos rotulos_consequencia_agressor <- tibble::tibble( cod = c(".SQ002.", ".SQ003.", ".SQ004.", ".SQ005.", ".SQ006.", ".SQ007.", ".SQ008."), rotulo = c( "Sofreu advertência verbal", "Seu tratamento foi interrompido", "Foi transferido(a) de setor", "Houve registro policial", "Foi processado(a)", "Foi demitido(a)", "Não sei" ) ) # 3. Função para gerar a tabela gerar_tabela_consequencias <- function(data, prefixo, filtro, rotulos, nome_tipo) { colunas_completas <- colunas_consequencia_agressor(prefixo) colunas_presentes <- colunas_completas[colunas_completas %in% names(data)] total <- data %>% filter(.data[[filtro]] == "Sim") %>% nrow() data %>% filter(.data[[filtro]] == "Sim") %>% select(all_of(colunas_presentes)) %>% pivot_longer(cols = everything(), names_to = "var", values_to = "valor") %>% filter(valor == "Sim") %>% count(var, name = "n") %>% mutate(cod = stringr::str_extract(var, "\\.SQ[0-9]{3}\\.")) %>% left_join(rotulos, by = "cod") %>% mutate( tipo = nome_tipo, total = total, perc = round(n / total * 100, 1) ) %>% select(rotulo, tipo, n, perc, total) } # 4. Aplicar por tipo de violência tabela_fisica <- gerar_tabela_consequencias(dados, "P3017", "P3002", rotulos_consequencia_agressor, "Agressão física") tabela_verbal <- gerar_tabela_consequencias(dados, "P4017", "P4001", rotulos_consequencia_agressor, "Agressão verbal") tabela_moral <- gerar_tabela_consequencias(dados, "P5017", "P5001", rotulos_consequencia_agressor, "Assédio moral") tabela_sexual <- gerar_tabela_consequencias(dados, "P6017", "P6001", rotulos_consequencia_agressor, "Assédio sexual") # 5. Unir todas tabela_tudo <- bind_rows(tabela_fisica, tabela_verbal, tabela_moral, tabela_sexual) # 6. Separar tabelas de n e % tabela_n <- tabela_tudo %>% mutate(col = paste0(tipo, " (n = ", total, ") (n)")) %>% select(`Consequência aplicada ao agressor` = rotulo, col, valor = n) %>% pivot_wider(names_from = col, values_from = valor, values_fill = 0) tabela_perc <- tabela_tudo %>% mutate(col = paste0(tipo, " (n = ", total, ") (%)")) %>% select(`Consequência aplicada ao agressor` = rotulo, col, valor = perc) %>% pivot_wider(names_from = col, values_from = valor, values_fill = 0) # 7. Juntar final tabela_final <- left_join(tabela_n, tabela_perc, by = "Consequência aplicada ao agressor") # 8. Visualizar knitr::kable(tabela_final) ``` ### > Figura 14: Satisfação em relação à forma como o incidente foi tratado X Tipo de violências sofridas ```{r, fig.width= 10, fig.height=12} # Calcular frequencia absoluta em relação ao total de vitimas # Agressão sofrida # Agressão Física: P3002 == "Sim" # Agressão Verbal: P4001 == "Sim" # Assédio Moral: P5001 == "Sim" # Assédio Sexual: P6001 == "Sim" ## Avalie o seu grau de satisfação em relação à forma como o incidente foi tratado # P3019 para violência física # P4019 para violência verbal # P5019 para violência moral # P6019 para violência sexual # 1. Função para gerar a tabela de satisfação por tipo gerar_tabela_satisfacao <- function(data, filtro_violencia, var_satisfacao, nome_tipo) { data %>% filter(.data[[filtro_violencia]] == "Sim", !is.na(.data[[var_satisfacao]])) %>% count(satisfacao = .data[[var_satisfacao]], name = "n") %>% mutate( tipo = nome_tipo, total = sum(n), perc = round(n / total * 100, 1) ) } # 2. Aplicar a função para cada tipo de violência tabela_fisica <- gerar_tabela_satisfacao(dados, "P3002", "P3019", "Violência física") tabela_verbal <- gerar_tabela_satisfacao(dados, "P4001", "P4019", "Agressão verbal") tabela_moral <- gerar_tabela_satisfacao(dados, "P5001", "P5019", "Assédio moral") tabela_sexual <- gerar_tabela_satisfacao(dados, "P6001", "P6019", "Assédio sexual") # 3. Unir todas as tabelas tabela_tudo <- bind_rows(tabela_fisica, tabela_verbal, tabela_moral, tabela_sexual) # 4. Gráfico de barras horizontais empilhadas tabela_tudo$satisfacao <- factor(tabela_tudo$satisfacao, levels = c( "Totalmente satisfeita(o)", "Satisfeita(o)", "Indiferente", "Insatisfeita(o)", "Totalmente insatisfeita(o)" ) ) ggplot(tabela_tudo, aes(x = tipo, y = perc / 100, fill = satisfacao)) + geom_col(width = 0.7) + geom_text(aes(label = paste0(perc, "%")), position = position_stack(vjust = 0.5), color = "black", size = 4.7) + scale_y_continuous(labels = scales::percent_format(accuracy = 1)) + scale_fill_manual(values = c( "Totalmente insatisfeita(o)" = "#E57373", "Insatisfeita(o)" = "#FC8D59", "Indiferente" = "#FEE08B", "Satisfeita(o)" = "#91CF60", "Totalmente satisfeita(o)" = "#1A9850" )) + labs(x = NULL, y = NULL, fill = NULL) + theme_minimal(base_size = 13) + theme( axis.text.x = element_text(size = 15, angle = 45, hjust = 1), axis.text.y = element_text(size = 15), legend.text = element_text(size = 15), legend.position = "bottom", legend.box = "vertical", legend.margin = margin(t = 10) ) + guides(fill = guide_legend(nrow = 2, byrow = TRUE)) ``` ## 3.8.5. Campanhas e medidas de prevenção à violência existentes nos locais de trabalho ### > Figura 15: Campanhas contra violência no local de trabalho ```{r} ## Nos lugares em que você trabalha, existem campanhas específicas para os temas abaixo? # P7004.SQ001. == "Sim": Saúde e segurança # P7004.SQ002. == "Sim": Combate à violência física # P7004.SQ003. == "Sim": Combate à agressão verbal # P7004.SQ004. == "Sim": Combate à intimidação/agressão moral # P7004.SQ005. == "Sim": Combate ao assédio sexual # P7004.SQ006. == "Sim": Combate à discriminação # P7004.SQ007. == "Sim": Combate à ameaça # 1. Selecionar colunas da pergunta múltipla colunas <- paste0("P7004.SQ", stringr::str_pad(1:7, 3, pad = "0"), ".") # 2. Dicionário de rótulos rotulos <- tibble::tibble( opcao = colunas, rotulo = c( "Saúde e segurança", "Combate à violência física", "Combate à agressão verbal", "Combate à intimidação/agressão moral", "Combate ao assédio sexual", "Combate à discriminação", "Combate à ameaça" ) ) # 3. Calcular total de respondentes válidos total_respostas <- dados %>% select(all_of(colunas)) %>% filter(if_any(everything(), ~ !is.na(.))) %>% nrow() # 4. Calcular frequência de marcações tabela <- dados %>% select(all_of(colunas)) %>% summarise(across(everything(), ~ sum(. == "Sim", na.rm = TRUE))) %>% pivot_longer(cols = everything(), names_to = "opcao", values_to = "n") %>% left_join(rotulos, by = "opcao") %>% mutate( percentual = round(n / total_respostas * 100, 1) ) %>% arrange(desc(percentual)) # 5. Gráfico (ggplot(tabela, aes(x = percentual / 100, y = fct_reorder(rotulo, percentual))) + geom_col(fill = "#377eb8", width = 0.7) + geom_text(aes(label = paste0(percentual, "%")), hjust = -0.1, size = 4.2) + scale_x_continuous(labels = scales::percent_format(accuracy = 10), expand = expansion(mult = c(0, 0.1))) + labs(x = NULL, y = NULL) + theme_minimal(base_size = 13) + theme( panel.grid.major.y = element_blank(), panel.grid.minor = element_blank() )) ``` Média de Marcações: ```{r} media_marcacoes <- dados %>% select(all_of(colunas)) %>% filter(if_any(everything(), ~ !is.na(.))) %>% mutate(across(everything(), ~ ifelse(. == "Sim", 1, 0))) %>% rowSums(na.rm = TRUE) %>% mean() %>% round(2) media_marcacoes ``` ### > Figura 16: Medidas para lidar com a violência no local de trabalho ```{r} ## No seu local de trabalho, existem quais medidas para lidar com os diferentes tipos de violência? # P7005.SQ001. == "Sim": Presença de seguranças # P7005.SQ002. == "Sim": Sistema de vigilância (câmeras, detector de metal etc.) # P7005.SQ003. == "Sim": Fechaduras em áreas de acesso exclusivo da equipe # P7005.SQ004. == "Sim": Controle do acesso à instituição # P7005.SQ005. == "Sim": Registro e protocolo de pacientes agressivos # P7005.SQ006. == "Sim": Uso rigoroso de uniforme # P7005.SQ007. == "Sim": Limitação do trabalho solitário # P7005.SQ008. == "Sim": Treinamento/capacitação para enfrentar violências # P7005.SQ009. == "Sim": Investimento em desenvolvimento de recursos humanos, etc. # P7005.SQ010. == "Sim": Sistema para alertas de situações de violência # 0. Selecionar colunas da pergunta múltipla colunas <- paste0("P7005.SQ", stringr::str_pad(1:10, 3, pad = "0"), ".") # 1. Dicionário de rótulos rotulos <- tibble::tibble( opcao = colunas, rotulo = c( "Presença de seguranças", "Sistema de vigilância (câmeras, detector de metal etc.)", "Fechaduras em áreas de acesso exclusivo da equipe", "Controle do acesso à instituição", "Registro e protocolo de pacientes agressivos", "Uso rigoroso de uniforme", "Limitação do trabalho solitário", "Treinamento/capacitação para enfrentar violências", "Investimento em desenvolvimento de recursos humanos", "Sistema para alertas de situações de violência" ) ) # 2. Calcular total de respondentes válidos total_respostas <- dados %>% select(all_of(colunas)) %>% filter(if_any(everything(), ~ !is.na(.))) %>% nrow() # 3. Calcular frequência de marcações tabela <- dados %>% select(all_of(colunas)) %>% summarise(across(everything(), ~ sum(. == "Sim", na.rm = TRUE))) %>% pivot_longer(cols = everything(), names_to = "opcao", values_to = "n") %>% left_join(rotulos, by = "opcao") %>% mutate( rotulo = enc2utf8(rotulo), # remover acentos se necessário percentual = round(n / total_respostas * 100, 1) ) %>% arrange(desc(percentual)) # 4. Gráfico (ggplot(tabela, aes(x = percentual / 100, y = fct_reorder(rotulo, percentual))) + geom_col(fill = "#377eb8", width = 0.7) + geom_text(aes(label = paste0(percentual, "%")), hjust = -0.1, size = 4.2) + scale_x_continuous(labels = scales::percent_format(accuracy = 10), expand = expansion(mult = c(0, 0.1))) + labs(x = NULL, y = NULL) + theme_minimal(base_size = 13) + theme( panel.grid.major.y = element_blank(), panel.grid.minor = element_blank() )) ``` Média de Marcações: ```{r} # 1. Selecionar colunas da pergunta múltipla colunas <- paste0("P7005.SQ", stringr::str_pad(1:10, 3, pad = "0"), ".") # 2. Filtrar respondentes válidos respondentes <- dados %>% select(all_of(colunas)) %>% filter(if_any(everything(), ~ !is.na(.))) # 3. Converter "Sim" em 1, somar por linha e tirar a média media_marcacoes <- respondentes %>% mutate(across(everything(), ~ ifelse(. == "Sim", 1, 0))) %>% rowSums(na.rm = TRUE) %>% mean() # 4. Arredondar e exibir media_marcacoes <- round(media_marcacoes, 2) media_marcacoes ``` ## 3.8.6. Sugestões para o enfrentamento de situações de violência nos locais de trabalho ### > Figura 17: Medidas para prevenção de situações de violência contra profissionais de enfermagem ```{r} ## Na sua opinião, quais medidas ajudariam a prevenir e combater situações de violência contra as profissionais da enfermagem no local de trabalho? # P7006.SQ001. == "Sim": Contratar mais profissionais # P7006.SQ002. == "Sim": Reduzir tempo de espera dos pacientes # P7006.SQ003. == "Sim": Melhorar atendimento ao público # P7006.SQ004. == "Sim": Iluminação adequada # P7006.SQ005. == "Sim": Abrir margem para devolutivas do paciente # P7006.SQ006. == "Sim": Sistema para alertas de situações de violência # P7006.SQ007. == "Sim": Identificação dos visitantes # P7006.SQ008. == "Sim": Instalar fechaduras em áreas de acesso exclusivo da equipe # P7006.SQ009. == "Sim": Instalar sistema de vigilância (câmeras, detector de metal etc.) # P7006.SQ010. == "Sim": Limitação do trabalho solitário # P7006.SQ011. == "Sim": Capacitação para situações de violência # P7006[SQ012] == "Sim": Presença de seguranças] # 0. Selecionar colunas colunas <- paste0("P7006.SQ", stringr::str_pad(1:12, 3, pad = "0"), ".") # 1. Dicionário de rótulos rotulos <- tibble::tibble( opcao = colunas, rotulo = c( "Contratar mais profissionais", "Reduzir tempo de espera dos pacientes", "Melhorar atendimento ao público", "Iluminação adequada", "Abrir margem para devolutivas do paciente", "Sistema para alertas de situações de violência", "Identificação dos visitantes", "Instalar fechaduras em áreas de acesso exclusivo da equipe", "Instalar sistema de vigilância (câmeras, detector de metal etc.)", "Limitação do trabalho solitário", "Capacitação para situações de violência", "Presença de seguranças" ) ) # 2. Calcular total de respondentes válidos total_respostas <- dados %>% select(all_of(colunas)) %>% filter(if_any(everything(), ~ !is.na(.))) %>% nrow() # 3. Calcular frequência de marcações tabela <- dados %>% select(all_of(colunas)) %>% summarise(across(everything(), ~ sum(. == "Sim", na.rm = TRUE))) %>% pivot_longer(cols = everything(), names_to = "opcao", values_to = "n") %>% left_join(rotulos, by = "opcao") %>% mutate( rotulo = enc2utf8(rotulo), percentual = round(n / total_respostas * 100, 1) ) %>% arrange(desc(percentual)) # 4. Gráfico (ggplot(tabela, aes(x = percentual / 100, y = fct_reorder(rotulo, percentual))) + geom_col(fill = "#377eb8", width = 0.7) + geom_text(aes(label = paste0(percentual, "%")), hjust = -0.1, size = 4.2) + scale_x_continuous(labels = scales::percent_format(accuracy = 10), expand = expansion(mult = c(0, 0.1))) + labs(x = NULL, y = NULL) + theme_minimal(base_size = 13) + theme( panel.grid.major.y = element_blank(), panel.grid.minor = element_blank() )) ``` Média de Marcações: ```{r} # 1. Selecionar colunas da pergunta múltipla colunas <- paste0("P7006.SQ", stringr::str_pad(1:12, 3, pad = "0"), ".") # 2. Filtrar respondentes válidos (quem respondeu pelo menos um item) respondentes <- dados %>% select(all_of(colunas)) %>% filter(if_any(everything(), ~ !is.na(.))) # 3. Converter "Sim" em 1 e somar por linha (por pessoa) media_marcacoes <- respondentes %>% mutate(across(everything(), ~ ifelse(. == "Sim", 1, 0))) %>% rowSums(na.rm = TRUE) %>% mean() # 4. Exibir resultado media_marcacoes <- round(media_marcacoes, 2) media_marcacoes ``` ### > ?: Tipo de suporte ```{r} # Calcular o tipo de suporte que foi oferecido pela chefia # Agressão sofrida # Agressão Física: P3002 == "Sim" # Agressão Verbal: P4001 == "Sim" # Assédio Moral: P5001 == "Sim" # Assédio Sexual: P6001 == "Sim" ## Qual a ajuda oferecida pela sua chefia, coordenação ou supervisor(a)? # P3018.SQ002. == "Sim": Ofereceu suporte para denunciar/reportar o ocorrido # P3018.SQ003. == "Sim": Ofereceu apoio piscológico # 1. Função para calcular frequência relativa por total de marcações (não por vítima) gerar_tabela_total_marcacoes <- function(data, filtro_violencia, vars_suporte, nome_tipo) { data %>% filter(.data[[filtro_violencia]] == "Sim") %>% select(all_of(vars_suporte)) %>% pivot_longer(cols = everything(), names_to = "variavel", values_to = "resposta") %>% filter(resposta == "Sim") %>% count(variavel, name = "n") %>% mutate( tipo = nome_tipo, total_marcacoes = sum(n), percentual = round(n / total_marcacoes * 100, 1) ) } # 2. Variáveis por tipo de violência (com ponto no final!) vars_fisica <- c("P3018.SQ002.", "P3018.SQ003.") vars_verbal <- c("P4018.SQ002.", "P4018.SQ003.") vars_moral <- c("P5018.SQ002.", "P5018.SQ003.") vars_sexual <- c("P6018.SQ002.", "P6018.SQ003.") # 3. Aplicar a função para cada tipo tabela_fisica <- gerar_tabela_total_marcacoes(dados, "P3002", vars_fisica, "Violência física") tabela_verbal <- gerar_tabela_total_marcacoes(dados, "P4001", vars_verbal, "Violência verbal") tabela_moral <- gerar_tabela_total_marcacoes(dados, "P5001", vars_moral, "Assédio moral") tabela_sexual <- gerar_tabela_total_marcacoes(dados, "P6001", vars_sexual, "Assédio sexual") # 4. Unir tudo tabela_tudo <- bind_rows(tabela_fisica, tabela_verbal, tabela_moral, tabela_sexual) # 5. Rótulos dos tipos de suporte rotulos <- tibble::tibble( variavel = c("P3018.SQ002.", "P3018.SQ003.", "P4018.SQ002.", "P4018.SQ003.", "P5018.SQ002.", "P5018.SQ003.", "P6018.SQ002.", "P6018.SQ003."), suporte = c("Suporte para denunciar", "Apoio psicológico", "Suporte para denunciar", "Apoio psicológico", "Suporte para denunciar", "Apoio psicológico", "Suporte para denunciar", "Apoio psicológico") ) # 6. Juntar com os rótulos tabela_tudo <- tabela_tudo %>% left_join(rotulos, by = "variavel") # 7. Gráfico ggplot(tabela_tudo, aes(y = fct_reorder(tipo, -percentual), x = percentual / 100, fill = suporte)) + geom_col(position = "stack", width = 0.7) + geom_text(aes(label = paste0(percentual, "%")), position = position_stack(vjust = 0.5), size = 4.2, color = "white") + scale_x_continuous(labels = scales::percent_format(accuracy = 1), expand = expansion(mult = c(0, 0.05))) + scale_fill_manual( values = c("Suporte para denunciar" = "#4C78A8", "Apoio psicológico" = "#F58518") ) + labs( x = NULL, y = NULL, fill = NULL ) + theme_minimal(base_size = 13) + theme( panel.grid.major.y = element_blank(), panel.grid.minor = element_blank(), legend.position = "bottom", legend.box = "vertical", legend.margin = margin(t = 10) ) ``` ### > ?: Locais de denúncia X Tipos de violências sofridas ```{r} # Calcular frequencia relativa em relação a ter denunciado ## Agressão sofrida # Agressão Física: P3002 == "Sim" # Agressão Verbal: P4001 == "Sim" # Assédio Moral: P5001 == "Sim" # Assédio Sexual: P6001 == "Sim" ## Você registrou/denunciou o incidente? # P3013B == "Sim"" ## Se você registrou/denunciou o incidente, onde o registro foi feito? # P3013.SQ002.== "Sim": RH/Canal de denúncias da instituição # P3013.SQ003.== "Sim": Delegacia # P3013.SQ004.== "Sim": Ministério Público do Trabalho # P3013.SQ005.== "Sim": Sindicato e associações # P3013.SQ006.== "Sim": Ouvidorias e Plataformas Governamentais # P3013.SQ007.== "Sim": Conselhos profissionais # P3013.SQ008.== "Sim": Secretaria de Saúde # 0. Configurar variáveis e rótulos colunas_denuncia <- paste0("P3013.SQ", stringr::str_pad(2:8, width = 3, pad = "0"), ".") rotulos_denuncia <- tibble::tibble( cod = colunas_denuncia, rotulo = c( "RH/Canal de denúncias da instituição", "Delegacia", "Ministério Público do Trabalho", "Sindicato e associações", "Ouvidorias e Plataformas Governamentais", "Conselhos profissionais", "Secretaria de Saúde" ) ) # 1. Função para gerar a tabela por tipo de violência gerar_tabela_denuncia <- function(data, filtro_violencia, filtro_denunciou, prefixo, nome_tipo) { colunas_presentes <- colunas_denuncia[colunas_denuncia %in% names(data)] total <- data %>% filter(.data[[filtro_violencia]] == "Sim", .data[[filtro_denunciou]] == "Sim") %>% nrow() data %>% filter(.data[[filtro_violencia]] == "Sim", .data[[filtro_denunciou]] == "Sim") %>% select(all_of(colunas_presentes)) %>% pivot_longer(cols = everything(), names_to = "var", values_to = "valor") %>% filter(valor == "Sim") %>% count(var, name = "n") %>% mutate( cod = var, tipo = nome_tipo, total = total, perc = round(n / total * 100, 1) ) %>% left_join(rotulos_denuncia, by = "cod") %>% select(`Local de denúncia` = rotulo, tipo, n, perc, total) } # 2. Gerar tabelas para cada tipo tabela_fisica <- gerar_tabela_denuncia(dados, "P3002", "P3013B", "P3013", "Agressão física") tabela_verbal <- gerar_tabela_denuncia(dados, "P4001", "P4013B", "P3013", "Agressão verbal") tabela_moral <- gerar_tabela_denuncia(dados, "P5001", "P5013B", "P3013", "Assédio moral") tabela_sexual <- gerar_tabela_denuncia(dados, "P6001", "P6013B", "P3013", "Assédio sexual") # 3. Unir tudo tabela_tudo <- bind_rows(tabela_fisica, tabela_verbal, tabela_moral, tabela_sexual) # 4. Organizar em formato largo tabela_n <- tabela_tudo %>% mutate(col = paste0(tipo, " (n = ", total, ") (n)")) %>% select(`Local de denúncia`, col, valor = n) %>% pivot_wider(names_from = col, values_from = valor, values_fill = 0) tabela_perc <- tabela_tudo %>% mutate(col = paste0(tipo, " (n = ", total, ") (%)")) %>% select(`Local de denúncia`, col, valor = perc) %>% pivot_wider(names_from = col, values_from = valor, values_fill = 0) # 5. Tabela final tabela_final <- left_join(tabela_n, tabela_perc, by = "Local de denúncia") # 6. Exibir knitr::kable(tabela_final) ``` ### > ?: Situação laboral das vítimas após episódios de violência ```{r} ## Variaveis: # Considera tipico Agressão Física: P3001 == "Sim" # Considera tipico Agressão Verbal: P4003 == "Sim" # Considera tipico Assédio Moral: P5003 == "Sim" # Considera tipico Assédio Sexual: P6003 == "Sim" ## Agressão sofrida # Agressão Física: P3002 == "Sim" # Agressão Verbal: P4001 == "Sim" # Assédio Moral: P5001 == "Sim" # Assédio Sexual: P6001 == "Sim" # 1. Criar um dataframe separado para cada tipo de violência (com filtro por vítima) fisica <- dados %>% filter(P3002 == "Sim") %>% select(tipo_violencia = P3001) %>% mutate(tipo = "Agressão física") verbal <- dados %>% filter(P4001 == "Sim") %>% select(tipo_violencia = P4003) %>% mutate(tipo = "Agressão verbal") moral <- dados %>% filter(P5001 == "Sim") %>% select(tipo_violencia = P5003) %>% mutate(tipo = "Assédio moral") sexual <- dados %>% filter(P6001 == "Sim") %>% select(tipo_violencia = P6003) %>% mutate(tipo = "Assédio sexual") # 2. Juntar todos os tipos df_completo <- bind_rows(fisica, verbal, moral, sexual) # 3. Calcular frequência e percentual resultado <- df_completo %>% filter(tipo_violencia %in% c("Sim", "Não")) %>% count(tipo, tipo_violencia, name = "n") %>% group_by(tipo) %>% mutate( total = sum(n), percentual = round(n / total * 100, 1) ) %>% ungroup() # 4. Reformular nome com total (n) resultado <- resultado %>% mutate(tipo = paste0(tipo, " (n = ", total, ")")) %>% select(-total) # 5. Converter para formato wide resultado <- resultado %>% pivot_wider( names_from = tipo_violencia, values_from = c(n, percentual), names_glue = "{tipo_violencia} ({.value})", values_fill = 0 ) # 6. Exibir tabela knitr::kable(resultado) ``` ### > ?: Existem procedimentos para a denúncia ```{r} # Existem procedimentos para a denúncia de casos de violência em seu local de trabalho? # P7002 == "Sim" table(dados$P7002) 362/(340+362) ``` ### > ?: Fonte de incentivo a denuncia ```{r} # Existe algum incentivo para a denúncia da violência no seu local de trabalho? # P7003B == "Sim" table(dados$P7003B) 484/(484+218) ``` Média de Marcações: ```{r} media_marcacoes <- dados %>% select(all_of(colunas)) %>% filter(if_any(everything(), ~ !is.na(.))) %>% mutate(across(everything(), ~ ifelse(. == "Sim", 1, 0))) %>% rowSums(na.rm = TRUE) %>% mean() %>% round(2) media_marcacoes ``` #### > ? ```{r} # Calcular frequencia relativa em relação a ter denunciado ## Agressão sofrida # Agressão Física: P3002 == "Sim" # Agressão Verbal: P4001 == "Sim" # Assédio Moral: P5001 == "Sim" # Assédio Sexual: P6001 == "Sim" ## Você registrou/denunciou o incidente? # P3013B == "Sim"" ## Qual providência foi tomada contra o(a) agressor(a)? # P3017.SQ002. == "Sim": Sofreu advertência verbal # P3017.SQ003. == "Sim": Seu tratamento foi interrompido # P3017.SQ004. == "Sim": Foi transferido(a) de setor # P3017.SQ005. == "Sim": Houve registro policial # P3017.SQ006. == "Sim": Foi processado(a) # P3017.SQ007. == "Sim": Foi demitido(a) # P3017.SQ008. == "Sim": Não sei # 0. Variáveis e rótulos colunas_providencia <- paste0("P3017.SQ", stringr::str_pad(2:8, width = 3, pad = "0"), ".") rotulos_providencia <- tibble::tibble( cod = colunas_providencia, rotulo = c( "Advertência verbal", "Interrupção do tratamento", "Transferência de setor", "Registro policial", "Processo judicial", "Demissão", "Não sei" ) ) # 1. Função para gerar a tabela por tipo gerar_tabela_providencia <- function(data, filtro_violencia, filtro_denunciou, nome_tipo) { colunas_presentes <- colunas_providencia[colunas_providencia %in% names(data)] total <- data %>% filter(.data[[filtro_violencia]] == "Sim", .data[[filtro_denunciou]] == "Sim") %>% nrow() data %>% filter(.data[[filtro_violencia]] == "Sim", .data[[filtro_denunciou]] == "Sim") %>% select(all_of(colunas_presentes)) %>% pivot_longer(cols = everything(), names_to = "var", values_to = "valor") %>% filter(valor == "Sim") %>% count(var, name = "n") %>% mutate( cod = var, tipo = nome_tipo, total = total, perc = round(n / total * 100, 1) ) %>% left_join(rotulos_providencia, by = "cod") %>% select(`Providência adotada` = rotulo, tipo, n, perc, total) } # 2. Gerar tabelas para cada tipo de violência tabela_fisica <- gerar_tabela_providencia(dados, "P3002", "P3013B", "Violência física") tabela_verbal <- gerar_tabela_providencia(dados, "P4001", "P4013B", "Violência verbal") tabela_moral <- gerar_tabela_providencia(dados, "P5001", "P5013B", "Assédio moral") tabela_sexual <- gerar_tabela_providencia(dados, "P6001", "P6013B", "Assédio sexual") # 3. Juntar todas tabela_tudo <- bind_rows(tabela_fisica, tabela_verbal, tabela_moral, tabela_sexual) # 4. Tabela larga: frequências absolutas tabela_n <- tabela_tudo %>% mutate(col = paste0(tipo, " (n = ", total, ") (n)")) %>% select(`Providência adotada`, col, valor = n) %>% pivot_wider(names_from = col, values_from = valor, values_fill = 0) # 5. Tabela larga: percentuais tabela_perc <- tabela_tudo %>% mutate(col = paste0(tipo, " (n = ", total, ") (%)")) %>% select(`Providência adotada`, col, valor = perc) %>% pivot_wider(names_from = col, values_from = valor, values_fill = 0) # 6. Unir e exibir tabela_final <- left_join(tabela_n, tabela_perc, by = "Providência adotada") # 7. Visualizar knitr::kable(tabela_final) ```