---
title: "Human Factor 2"
author: "Grupo EGC:"
output:
flexdashboard::flex_dashboard:
orientation: columns
vertical_layout: fill
social: menu
source_code: embed
---
```{r setup, include=FALSE}
library(flexdashboard)
library(tidyverse)
library(dplyr)
library(pdftools)
library(magrittr)
library(tidyverse) # Manipulacao eficiente de dados
library(tidytext) # Manipulacao eficiente de texto
library(textreadr) # Leitura de pdf para texto
library(tm) # Pacote de mineracao de texto com stopwords
library(wordcloud) # Grafico nuvem de palavras
library(igraph)
library(ggraph)
library(ggplot2)
library(RRPP)
library(SnowballC)
library(glue)
library(purrr)
library(ngram)
## Função para ler, organizar, limpar palavras e normalizar o texto
setwd("~/Text Mining/HumanFactor2")
# Arquivo pdf
library(reader)
Pdf_P20 <- "~/Text Mining/HumanFactor2/Incendio_P20.pdf"
Pdf_P36 <- "~/Text Mining/HumanFactor2/Explosao_Naufragio_P36.pdf"
Pdf_P48 <- "~/Text Mining/HumanFactor2/P48_Incendio.pdf"
Pdf_P34 <- "~/Text Mining/HumanFactor2/Abandono_producao_P34.pdf"
Pdf_PSM <- "~/Text Mining/HumanFactor2/ExplosaoSM_110215.pdf"
Pdf_P69 <- "~/Text Mining/HumanFactor2/Fatalidade_SS_69_WestEminence.pdf"
Pdf_SM1 <- "~/Text Mining/HumanFactor2/investigacao_ExplosaoSM110215.pdf"
Pdf_PFR <- "~/Text Mining/HumanFactor2/vazamento_frade.pdf"
Pdf_P83 <- "~/Text Mining/HumanFactor2/Balroamento_obitoSS83.pdf"
Pdf_sonda <- "~/Text Mining/HumanFactor2/Explosao_obitossondanorbeviii.pdf"
Pdf_Oleo <- "~/Text Mining/HumanFactor2/ExsudacaoDeOleo.pdf"
files <- list.files(pattern = "pdf$")
.Le_Organiza <- function(arquivoPdf) {
Texto <- arquivoPdf %>%
read_pdf() %>%
as.tibble() %>%
select(text)
return(Texto)
}
P20 <- .Le_Organiza(Pdf_P20)
P36 <-.Le_Organiza(Pdf_P36)
P48 <- .Le_Organiza(Pdf_P48)
P34 <- .Le_Organiza(Pdf_P34)
PSM <- .Le_Organiza(Pdf_PSM)
P69 <- .Le_Organiza(Pdf_P69)
PSM1 <- .Le_Organiza(Pdf_SM1)
PFR <- .Le_Organiza(Pdf_PFR)
P83<- .Le_Organiza(Pdf_P83)
Psonda <- .Le_Organiza(Pdf_sonda)
POleo <- .Le_Organiza(Pdf_Oleo)
## Functon return phases reletec with a factor and 3 exemplos of these phrases
.Frases <- function(texto, vetor){
# Create our polit_pattern again by collapsing "factors"
polit_pattern <- glue_collapse(vetor, sep = "|")
# Match one or more word characters or punctuations
context <-"([\\w[:punct:]]+\\s){0,20}"
# Add this pattern in front and after the polit_pattern
polit_pattern_with_context <- glue(
"{context}({polit_pattern})\\s?{context}"
)
frases <- grep(
texto,
pattern = polit_pattern_with_context, ignore.case = TRUE, value = TRUE
)
frases <- as.data.frame.character(frases)
return(frases)
}
F22 <- c('riscos?', 'avaliação', 'verificação', 'análises?', 'avaliou', 'avaliaram')
F28 <- c("considerção", "aprovação", "consciência","aprovação", "planejamento","segurança","respeito","avaliação","permissão","segurança","risco")
F29 <- c("considerção","consciência","aprovação","planejamento","segurança","respeito","avaliação","permissão","segurança","monitor")
F51 <- c('não\\scumpriu', 'não\\spossui', 'ausentes?', 'normas?','regras?','procedimentos?','regulamentos?')
F52 <- c("alocação","jornada","cansaço","demasiado","trabalhos?")
F56 <- c("feedback","sistema")
F57 <- c('equipamentos?', 'configuração', 'dimensionamento', 'especificação','rupturas','instalação')
F58 <- c('manutenção', 'registro', 'notas')
F61 <- c("comunicação", "canais?","rádios?","esclarecimentos?","orientação")
F87 <- c('direcionou', 'ineficácia', 'comando', 'coordenação','lideranças?','tomada', 'decisão','decisões', 'responsáveis')
F104 <- c('gestão\\sde\\smudanças?', 'gerenciamento\\sde\\smudanças?')
F105 <- c("segurança")
F118 <- c('trabalho', 'permissão')
vetores_fatores <- list(F22, F28, F29, F51, F52, F56, F57, F58, F61, F87, F104, F105, F118)
# Function to return a wordcloud and 3 main prases from a factor
.Wc_3f <- function(phrases){
frequency <- freq_terms(
phrases,
top = 15,
at.least = 1,
stopwords("pt"))
wc <- wordcloud(frequency$WORD,frequency$FREQ,
max.words = 80,
colors = c("grey80", "darkgoldenrod1","tomato"))
return(phrases[1:3])
return(wc)
}
# FUNÇÃO para fazer tabela dos fatores e frases correspondentes
.Analise_fatores_tb <- function(Texto, Tipo_Acidente){
### Fator linha 51 "Regras e instruções de trabalho projetadas"
F51_Regras_projetadas <- .Frases(Texto$text,F51)
### Fator linha 22: Análise dos riscos na tomada de decisão
F22_Decisao <- .Frases(Texto$text, F22)
## Fator linha 87: Trabalho Relações de Trabalho Liderança de Equipe Capacidade de coordenação
F87_coordena <- .Frases(Texto$text, F87)
## Fator linha 58 Trabalho Condições de Trabalho Design de interfaces Inspeção / manutenção
F58_manutencao <- .Frases(Texto$text, F58)
## Fator linha 104 Organização Gestão e organização do trabalho Gerenciamento de mudanças
F104Gerir_mudanca <- .Frases(Texto$text, F104)
## Fator linha 57 Design de interfaces, Qualidade do equipamento
F57_QualiEquipamento <- .Frases(Texto$text, F57)
## Fator linha 118 Organização Gestão e organização do trabalho Planejamento e Práticas de trabalho
F118_PraticaTrabalho <- .Frases(Texto$text, F118)
## Fator linha 28 Indivíduo Competência / Repertório de Ações Habilidades não técnicas Consciência situacional Consciência e respeito pelo risco
F28_ConscienciaRespeitoRisco <- .Frases(Texto$text, F28)
## Fator linha 29 Indivíduo Competência / Repertório de Ações Habilidades não técnicas Consciência situacional Atenção aos detalhes Consciência situacional; atenção aos detalhes; falha no monitoramento do trabalho
F29_ConscienciaMonitora <- .Frases(Texto$text, F29)
## Fator linha 52 Trabalho Condições de Trabalho Design do trabalho Carga de trabalho
F52_CargaTrabalho <- .Frases(Texto$text, F52)
## Fator linha 56 Trabalho Condições de Trabalho Design de interfaces Feedback do sistema técnico
F56_FeedbackSistema <- .Frases(Texto$text, F56)
## Fator linha 61 Trabalho Condições de Trabalho Design de interfaces Informação Canais de comunicação
F61_Comunicacao <- .Frases(Texto$text, F61)
## Fator linha 105 Organização Gestão e organização do trabalho Cultura de segurança Prioridade à segurança
F105_PriorSeguranca <- .Frases(Texto$text, F105)
F22_Decisao <- F22_Decisao %>%
mutate(Fator = "F22_Decisao", text = F22_Decisao, Dimensao = "Indivíduo")
F51_Regras_projetadas <- F51_Regras_projetadas %>% mutate(Fator = "F51_Regras_projetadas", text = F51_Regras_projetadas, Dimensao = "Trabalho")
F58_manutencao <- F58_manutencao %>% mutate(Fator = "F58_manutencao", text = F58_manutencao, Dimensao = "Trabalho")
F57_QualiEquipamento <- F57_QualiEquipamento %>% mutate(Fator = "F57_QualiEquipamento", text = F57_QualiEquipamento, Dimensao = "Trabalho" )
F87_coordena <- F87_coordena %>% mutate(Fator = "F87_coordena", text = F87_coordena, Dimensao = "Organização")
F104Gerir_mudanca <- F104Gerir_mudanca %>% mutate(Fator = "F104Gerir_mudanca", text = F104Gerir_mudanca, Dimensao = "Organização")
F118_PraticaTrabalho <- F118_PraticaTrabalho %>% mutate(Fator = "F118_PraticaTrabalho", text = F118_PraticaTrabalho, Dimensao = "Trabalho")
F28_ConscienciaRespeitoRisco <- F28_ConscienciaRespeitoRisco %>% mutate(Fator = "F28_ConscienciaRespeitoRisco", text = F28_ConscienciaRespeitoRisco, Dimensao = "Indivíduo")
F29_ConscienciaMonitora <- F29_ConscienciaMonitora %>% mutate(Fator = "F29_ConscienciaMonitora", text = F29_ConscienciaMonitora, Dimensao = "Indivíduo")
F52_CargaTrabalho <- F52_CargaTrabalho %>% mutate(Fator = "F52_CargaTrabalho", text = F52_CargaTrabalho, Dimensao = "Trabalho")
F56_FeedbackSistema <- F56_FeedbackSistema %>% mutate(Fator = "F56_FeedbackSistema", text = F56_FeedbackSistema, Dimensao = "Trabalho")
F61_Comunicacao <- F61_Comunicacao %>% mutate(Fator = "F61_Comunicacao", text = F61_Comunicacao, Dimensao = "Organização")
F105_PriorSeguranca <- F105_PriorSeguranca %>% mutate(Fator = "F105_PriorSeguranca", text = F105_PriorSeguranca, Dimensao = "Trabalho")
#put together in a big data frame
Frases_por_fator <- bind_rows(F22_Decisao[,2:4],
F51_Regras_projetadas[,2:4],
F58_manutencao[,2:4],
F57_QualiEquipamento[,2:4],
F87_coordena[,2:4],
F104Gerir_mudanca[,2:4],
F118_PraticaTrabalho[,2:4],
F28_ConscienciaRespeitoRisco[,2:4],
F29_ConscienciaMonitora[,2:4],
F52_CargaTrabalho[,2:4],
F56_FeedbackSistema[,2:4],
F61_Comunicacao[,2:4],
F105_PriorSeguranca[,2:4])
Frases_por_fator <- mutate(Frases_por_fator,Tipo_Acidente = Tipo_Acidente)
return(Frases_por_fator)
}
# FUNÇÃO Grafico do documento
.Analise_Fatores_grafico <- function(Frases_por_fator){
print(
Frases_por_fator %>%
group_by(Fator, Dimensao, Tipo_Acidente) %>%
summarise(Qnt_Frases = n()) %>%
ggplot(aes(x=Qnt_Frases , y= Fator, size = Qnt_Frases, color=Dimensao)) +
geom_point(alpha=0.5) +
scale_size(range = c(.1, 20), name="Fatores no Documento")
)
}
## FUNCAO Núvem do documento
.Nuvem_Fatores <- function(texto){
library(qdap)
as.character(texto)
frequency <- freq_terms(
texto,
top = 20,
at.least = 1,
stopwords("pt"))
print(wordcloud(frequency$WORD,frequency$FREQ,
max.words = 60,
colors = c("grey80", "darkgoldenrod1","tomato")))
}
tb_P20 <- .Analise_fatores_tb(P20, "Incendio")
tb_P36 <- .Analise_fatores_tb(P36, "Naufragio")
tb_P48 <-.Analise_fatores_tb(P48, "Incendio")
tb_P34 <- .Analise_fatores_tb(P34, "Abandono_Producao")
tb_PSM <- .Analise_fatores_tb(PSM, "Explosao")
tb_P69 <- .Analise_fatores_tb(P69, "Fatalidade")
tb_PSM1 <- .Analise_fatores_tb(PSM1, "Explosao")
tb_PFR <- .Analise_fatores_tb(PFR, "Vazamento")
tb_P83 <- .Analise_fatores_tb(P83, "Balroamento")
tb_Psonda <- .Analise_fatores_tb(Psonda, "Explosao")
tb_POleo <- .Analise_fatores_tb(POleo, "ExsudaçãoDeOleo")
data <- bind_rows(tb_P36, tb_P48, tb_P20,tb_P34,tb_PSM,tb_P69,tb_PSM1,tb_PFR,tb_P83,tb_Psonda,tb_POleo)
```
Visão Geral
=======================================================================
Column {data-width=900}
-----------------------------------------------------------------------
### Fatores por documento, dimensão e Tipo de acidente
```{r}
data <- bind_rows(tb_P36, tb_P48, tb_P20,tb_P34,tb_PSM,tb_P69,tb_PSM1,tb_PFR,tb_P83,tb_Psonda,tb_POleo)
data1 <- data %>%
group_by(Fator, Dimensao, Tipo_Acidente) %>%
summarise(Qnt_Frases = n(),
)
library(plotly)
library(gapminder)
p <- data1 %>%
plot_ly(
x = ~Qnt_Frases,
y = ~Fator,
size = ~Qnt_Frases,
color = ~Fator,
frame = ~Tipo_Acidente,
text = ~Qnt_Frases
,
hoverinfo = "text",
type = 'scatter',
mode = 'markers'
) %>%
layout(
xaxis = list(
type = "log"
)
)
p
```
Visão Geral Gráficos
=======================================================================
Column {data-width=600}
-----------------------------------------------------------------------
### Fatores por documento, dimensão e Tipo de acidente
```{r}
library(packcircles)
library(ggplot2)
data <- bind_rows(tb_P36, tb_P48, tb_P20,tb_P34,tb_PSM,tb_P69,tb_PSM1,tb_PFR,tb_P83,tb_Psonda,tb_POleo)
data2 <- data %>%
select(Fator, Dimensao, Tipo_Acidente)%>%
group_by(Fator, Dimensao) %>%
summarise(count = n())
names(data2) <- c( "group","individual", "value")
data <- data2
# Generate the layout. This function return a dataframe with one line per bubble.
# It gives its center (x and y) and its radius, proportional of the value
packing <- circleProgressiveLayout(data$value, sizetype='area')
# We can add these packing information to the initial data frame
data <- cbind(data, packing)
# Check that radius is proportional to value. We don't want a linear relationship, since it is the AREA that must be proportionnal to the value
# plot(data$radius, data$value)
# The next step is to go from one center + a radius to the coordinates of a circle that
# is drawn by a multitude of straight lines.
dat.gg <- circleLayoutVertices(packing, npoints=50)
# Make the plot
ggplot() +
# Make the bubbles
geom_polygon(data = dat.gg, aes(x, y, group = id, fill=as.factor(id)), colour = "black", alpha = 0.6) +
# Add text in the center of each bubble + control its size
geom_text(data = data, aes(x, y, size=value, label = group)) +
scale_size_continuous(range = c(1,4)) +
# General theme:
theme_void() +
theme(legend.position="none")+
coord_equal()
```
Column {data-width=350}
-----------------------------------------------------------------------
### Núvem das frases dos Fatores em todos os documentos
```{r}
data <- bind_rows(tb_P36, tb_P48, tb_P20,tb_P34,tb_PSM,tb_P69,tb_PSM1,tb_PFR,tb_P83,tb_Psonda,tb_POleo)
.Nuvem_Fatores(data$text)
```
### Agrupamento de fatores de todos os documentos
```{r}
data <- bind_rows(tb_P36, tb_P48, tb_P20,tb_P34,tb_PSM,tb_P69,tb_PSM1,tb_PFR,tb_P83,tb_Psonda,tb_POleo)
data %>%
group_by(Fator, Dimensao, Tipo_Acidente) %>%
summarise(Qnt_Frases = n()) %>%
ggplot(aes(x=Qnt_Frases , y= Fator, size = Qnt_Frases, color=Tipo_Acidente)) +
geom_point(alpha=0.5) +
scale_size(range = c(.1, 20), name="Fatores no Documento")
```
Visão por Acidente
=======================================================================
Column {data-width=650}
-----------------------------------------------------------------------
### Fatores por Tipo de acidente
```{r}
data <- bind_rows(tb_P36, tb_P48, tb_P20,tb_P34,tb_PSM,tb_P69,tb_PSM1,tb_PFR,tb_P83,tb_Psonda,tb_POleo)
data3 <- data %>%
group_by(Fator, Dimensao, Tipo_Acidente) %>%
summarise(Qnt_Frases = n(),
)
library(plotly)
library(gapminder)
p <- data3 %>%
plot_ly(
x = ~Qnt_Frases,
y = ~Tipo_Acidente,
size = ~Qnt_Frases,
color = ~Tipo_Acidente,
frame = ~Dimensao,
text = ~Fator
,
hoverinfo = "text",
type = 'scatter',
mode = 'markers'
) %>%
layout(
xaxis = list(
type = "log"
)
)
p
```
Column {data-width=350}
-----------------------------------------------------------------------
### Mapa de calor por acidente
```{r}
data <- bind_rows(tb_P36, tb_P48, tb_P20,tb_P34,tb_PSM,tb_P69,tb_PSM1,tb_PFR,tb_P83,tb_Psonda,tb_POleo)
data4 <- data %>%
select(Fator, Dimensao, Tipo_Acidente)%>%
group_by(Fator, Tipo_Acidente) %>%
summarise(count = n())
ggplot(data4, aes(fill=Tipo_Acidente, y=Fator, x=count)) +
geom_bar(position="fill", stat="identity") + ggtitle("Fatores humanos por relatório de acidente")
```
### Mapa de calor dos fatores
```{r}
data <- bind_rows(tb_P36, tb_P48, tb_P20,tb_P34,tb_PSM,tb_P69,tb_PSM1,tb_PFR,tb_P83,tb_Psonda,tb_POleo)
data5 <- data %>%
select(Fator, Dimensao, Tipo_Acidente)%>%
group_by(Fator, Tipo_Acidente) %>%
summarise(count = n())
names(data5) <- c("fator_humano","plataforma", "percentual")
ggplot(data5, aes(fill=fator_humano, y=plataforma, x=percentual)) +
geom_bar(position="fill", stat="identity") + ggtitle("Fatores humanos por relatório de acidente")
```
Visão por Modelo de Análise
=======================================================================
Column {data-width=650}
-----------------------------------------------------------------------
### Fatores por Dimensão
```{r}
data <- bind_rows(tb_P36, tb_P48, tb_P20,tb_P34,tb_PSM,tb_P69,tb_PSM1,tb_PFR,tb_P83,tb_Psonda,tb_POleo)
data3 <- data %>%
group_by(Fator, Dimensao, Tipo_Acidente) %>%
summarise(Qnt_Frases = n(),
)
library(plotly)
library(gapminder)
p <- data3 %>%
plot_ly(
x = ~Qnt_Frases,
y = ~Dimensao,
size = ~Qnt_Frases,
color = ~Dimensao,
frame = ~Fator,
text = ~Tipo_Acidente
,
hoverinfo = "text",
type = 'scatter',
mode = 'markers'
) %>%
layout(
xaxis = list(
type = "log"
)
)
p
```
Column {data-width=350}
-----------------------------------------------------------------------
### Núvem de palavras dos relatório nas Dimensões Indivíduo e Organização
```{r message=FALSE}
data <- bind_rows(tb_P36, tb_P48, tb_P20,tb_P34,tb_PSM,tb_P69,tb_PSM1,tb_PFR,tb_P83,tb_Psonda,tb_POleo)
dataio <- data %>%
filter(Dimensao != "Trabalho")
.Nuvem_Fatores(dataio$text)
```
### Núvem de palavras dos relatório na Dimensão Trabalho
```{r}
library(qdap)
data <- bind_rows(tb_P36, tb_P48, tb_P20,tb_P34,tb_PSM,tb_P69,tb_PSM1,tb_PFR,tb_P83,tb_Psonda,tb_POleo)
datat <- data %>%
filter(Dimensao == "Trabalho")
frequency <- freq_terms(
datat$text,
top = 20,
at.least = 1,
stopwords("pt"))
print(wordcloud(frequency$WORD,frequency$FREQ,
max.words = 60,
colors = c("green", "blue","tomato")))
```