Perfil do Engenheiro Florestal usuário do R - Análise do questionário

Havia quase dois anos que eu não postava por aqui. Foi muito interessante observar que, apesar do tempo sem postar, o fluxo de novos visitantes no blog foi contínuo, demonstrando que o interesse pela aplicação da linguagem R na área florestal é crescente. Por conta disso, resolvi criar um grupo no WhatsApp para reunir Engenheiros Florestais utilizadores do R, para compartilhamento de experiências, materiais, cursos, aplicações, pacotes, dúvidas, etc. Para minha surpresa, o grupo lotou em poucos dias.

Foi então que tive a ideia de elaborar um breve questionário para gerar uma interação e averiguar como e por quem a linguagem R tem sido utilizada na área florestal. Na tentativa de incentivar o preenchimento, me comprometi a compartilhar os resultados e o código utilizado em toda a análise.

A análise a seguir pode servir de auxílio aos colegas que estão buscando se aperfeiçõar na prática de programar em R, uma vez que busco utilizar diversos procedimentos de tratamento e manipulação de dados, bem como aplicar alguns conceitos básicos de data storytelling utilizando o pacote ggplot2. A fonte de dados é uma planilha do Google Sheets, cópia da versão original vinculada ao formulário, contendo todas as respostas para as 6 perguntas obrigatórias (primeira seção). Vamos à análise.

Análise das respostas

Participaram do levantamento engenheiros florestais das cinco regiões do Brasil e também do exterior. Ao todo houveram 98 respostas ao questionário, sendo a maioria advindas de colegas que atuam nas regiões Sul, Nordeste e Sudeste.

#######################
# Aquisição dos dados #
#######################

# Instalar/carregar pacotes necessarios
library("googlesheets4")
library("tidyverse")
library("devtools")
library("brazilmaps")
library("sf")
library("cowplot")
library("forcats")
library("treemapify")

# Paleta de cores para os graficos
paleta6 <- c("#9FB6CD","#AF9FCD","#CD9FC3","#CDA29F","#CDCA9F","#A9CD9F","#9FCDBD")

# Importar planilha de respostas e renomear colunas (obs: sera preciso fazer login em sua conta google)
respostas <-
  read_sheet("1en5995QQbPsIRElA8SDivjquLR0Od2bhghHmil7VIWM") %>%
  rename(
    Regiao = 2,
    Ocupacao = 3,
    FreqUso = 4,
    NivelCon = 5,
    SubArea = 6,
    Dificuldades = 7
  )
########################
# Respostas por região #
########################
regioes <- brazilmaps::get_brmap(geo = 'Region')

respostas %>%
  group_by(Regiao) %>%
  summarise(n = n()) %>%
  mutate(
    desc_rg = case_when(
      Regiao == 'Fora do Brasil' ~ 'EXTERIOR',
      TRUE ~ toupper(str_split(Regiao, '- ', simplify = T)[, 2])
    )
  ) %>%
  arrange(-n) %>%
  right_join(regioes) %>%
  st_as_sf() %>%
  ggplot() +
  geom_sf(aes(fill = n), color = 'white', size=.5, show.legend = F) +
  geom_sf_text(aes(label = n), color='gray20')+
  labs(title = 'Quantidade de respostas por região de atuação',
       subtitle = 'Os respondentes se concentraram nas regiões sul, sudeste e nordeste.\nTivemos poucos respondentes da região norte do país.',
       caption = paste0('Participantes que atuam no exterior: ',
                        respostas %>% 
                          filter(Regiao == 'Fora do Brasil') %>% 
                          nrow()))+
  scale_fill_gradient(high = 'slategrey', low = 'slategray3')+
  theme_map(font_size = 12)+
  theme(plot.title.position = 'plot')

Cerca de 87% dos participantes do levantamento atuam no setor privado ou no meio acadêmico como graduandos ou pós-graduandos. Ao todo, tivemos a participação de dois professores do Ensino Superior, dois servidores públicos (exceto professores), cinco autônomos e quatro colegas que estão em busca de uma oportunidade de trabalho.

##########################
# Respostas por ocupação #
##########################
respostas %>%
  group_by(Ocupacao) %>%
  summarise(n = n()) %>% 
  mutate(n_rel = round(n/sum(n)*100),
         Ocup_label = case_when(
           Ocupacao == 'Acadêmico de graduação' ~ paste0('Graduando'),
           Ocupacao == 'Acadêmico de pós-graduação' ~ paste0('Pós-Graduando'),
           Ocupacao == 'Profissional autônomo' ~ paste0('Autônomo'),
           Ocupacao == 'Profissional de instituição privada (exceto professor)' ~ paste0('Setor Privado'),
           Ocupacao == 'Profissional de instituição pública  (exceto professor)' ~ paste0('Servidor público'),
           Ocupacao == 'Em busca de oportunidades' ~ paste0('Buscando oportunidade'),
           TRUE ~ paste0('Professor do Ensino Superior')
         )) %>% 
  mutate(Ocup_label = gsub('(.{1,20})(\\s|$)', '\\1\n', Ocup_label)) %>% 
  mutate(Ocup_label = paste0(Ocup_label,round(n_rel,1),'%')) %>% 
  arrange(-n) %>% 
  ggplot(aes(area = n, fill = n, label = Ocup_label))+
  geom_treemap(show.legend = F, color = 'white')+
  geom_treemap_text(colour = "gray20",
                    place = "centre",
                    size = 11)+
  scale_fill_gradient(high = 'slategrey', low = 'slategray3')+
  labs(title = 'Ocupação dos participantes',
       subtitle = 'A maioria dos respondentes são profissionais que atuam em instituições privadas.\nAcadêmicos de graduação e da pós também tiverem expressiva participação.')+
  theme_minimal_vgrid(font_size = 12)+
  theme(axis.title = element_blank(),
        plot.title.position = 'plot',
        axis.text.x = element_blank(),
        panel.grid.major = element_blank(),
        axis.text.y = element_text(size = 10))

Quanto à frequência de utilização da linguagem R no trabalho/pesquisa/estudo, 37 participantes declararam utilizar o R frequentemente ou mesmo como principal ferramenta de tabalho. A classe de usuário mais expressiva foi a de usuários ocasionais, com 29 representantes. Seis colegas afirmaram nunca ter utilizado o R. Entendo que neste caso podem ser considerados usuários em potencial, uma vez que demonstraram interesse sobre o assunto.

################################
# Análise da frequência de uso #
################################
respostas %>% 
  group_by(FreqUso) %>% 
  summarise(n = n()) %>% 
  mutate(FreqUso = factor(FreqUso)) %>% 
  mutate(n_rel = n/sum(n)*100,
         FreqUso = factor(FreqUso, 
                          levels = unique(FreqUso)[c(2,1,5,4,3)],
                          labels = c('Nunca usou',
                                     'Já teve contato, mas não aplica',
                                     'Usa ocasionalmente',
                                     'Usa frequentemente',
                                     'Usa como principal ferramenta'),
                          ordered = T)) %>% 
  arrange(-n) %>% 
  mutate(fill = case_when(row_number()==1~'darkorange',
                          TRUE~paleta6[1])) %>% 
  arrange(FreqUso) %>% 
  ggplot()+
  geom_bar(aes(x=FreqUso,y=n_rel, fill = fill), stat = 'identity')+
  geom_text(aes(x=FreqUso, y=n_rel, label = paste0(round(n_rel,1),'%')), hjust = 1,nudge_y = -.5, color = 'black', size = 3)+
  scale_x_discrete(limits = levels('FreqUso'))+
  scale_y_continuous(expand = c(0,0))+
  scale_fill_identity()+
  coord_flip()+
  labs(title = 'Frequência de utilização do R',
       subtitle = 'A maioria dos respondentes afirmou utilizar o R ocasionalmente.\nUm a cada dez participantes utiliza a linguagem como principal ferramenta.')+
  theme_minimal_vgrid(font_size = 12)+
  theme(axis.title = element_blank(),
        plot.title.position = 'plot',
        axis.text.x = element_blank(),
        axis.text.y = element_text(size = 10),
        panel.grid.major = element_blank())

Ao todo 42 colegas declararam possuir domínio do R a nível básico. Considerei como básico o conhecimento necessário para rodar scripts prontos, carregar e salvar bases de dados, plotar e calcular estatísticas básicas. Dezenove participantes alegaram não possuir domínio nenhum sobre o R, sendo estre grupo formado por colegas que nunca utilizaram a linguagem ou já tiveram contato, mas não aplicam atualmente. Quatro dos 98 participantes indicaram ter um domínio mais avançado da linguagem, com conhecimentos em desenvolvimento de pacotes, aplicações e APIs, elaboração de relatórios automatizados e capacidade de extrair e utilizar de maneira automática dados “presos” ou mesmo “escondidos” na web por meio de webscrapping.

#############################################
# Respostas quanto ao nível de conhecimento #
#############################################
respostas %>% 
  group_by(NivelCon) %>% 
  summarise(n = n()) %>% 
  mutate(labels = gsub('(.{1,50})(\\s|$)', '\\1\n', NivelCon)) %>% 
  mutate(n_rel = n/sum(n)*100,
         labels = factor(labels,
                           levels = unique(labels)[c(3,5,2,4,1)],
                           ordered = T)) %>% 
  arrange(-n) %>% 
  mutate(fill = case_when(row_number()==1~'darkorange',
                          TRUE~paleta6[1])) %>% 
  arrange(labels) %>%
  ggplot()+
  geom_bar(aes(x=labels,y=n_rel, fill = fill), stat = 'identity')+
  geom_text(aes(x=labels, y=n_rel, label = paste0(round(n_rel,1),'%')), hjust = 1,nudge_y = -.5, size = 3, color = 'black')+
  scale_x_discrete(limits = rev(levels('labels')))+
  scale_y_continuous(expand = c(0,0))+
  scale_fill_identity()+
  coord_flip()+
  labs(title = 'Nível de conhecimento na linguagem R',
       subtitle = 'A maioria dos participantes declara ter conhecimentos básicos em R.')+
  theme_minimal_vgrid(font_size = 12)+
  theme(axis.title = element_blank(),
        plot.title.position = 'plot',
        axis.text.x = element_blank(),
        panel.grid.major = element_blank(),
        axis.text.y = element_text(size = 8))

Mais da metade dos participantes afirma utilizar (ou ter a intenção de utilizar) o R em rotinas de inventário florestal e modelagem do crescimento e produção.
Minha percepção é que o domínio de uma linguagem de programação e a capacidade de automatização de procedimentos de análise e processamento de dados tem sido não só um diferencial, mas por vezes, um requisito básico para atuação nas áreas de planejamento e de mensuração de empresas de base florestal. Estas empresas atualmente geram e consomem grandes quantidades de dados e informações, as vezes em curto espaço de tempo, para basear decisões nos âmbitos operacional, tático e estratégico.

##########################
# Sub areas de aplicação #
##########################
respostas %>%
  mutate(SubArea = str_replace(SubArea,'colheita, ','colheita/')) %>% 
  separate_rows(SubArea, sep = ', ') %>% 
  mutate(SubArea = case_when(SubArea %in% c('Análises florísticas/fitossociológicas',
                                            'SIG e geoprocessamento',
                                            'Inventário florestal e modelagem do crescimento e da produção',
                                            'Planejamento tático/estratégico',
                                            'Análise experimental',
                                            'Climatologia e monitoramento de incêndios',
                                            'Operações florestais (colheita, estradas)',
                                            'Silvicultura/Viveiros')~SubArea,
                             TRUE ~ 'Outras'
                             
  )) %>% 
  group_by(SubArea) %>% 
  summarise(n = n()) %>% 
  mutate(n_rel = n/nrow(respostas)*100,
         labels = gsub('(.{1,25})(\\s|$)', '\\1\n', SubArea)) %>% 
  mutate(labels = reorder(labels, n)) %>%
  arrange(-n) %>%
  mutate(fill = case_when(row_number()==1~'darkorange',
                          TRUE~paleta6[1])) %>% 
  ggplot(aes(area = n, fill = n, label = labels))+
  geom_bar(aes(x=labels,y=n_rel, fill = fill), stat = 'identity')+
  geom_text(aes(x=labels, y=n_rel, label = paste0(round(n_rel,1),'%')), hjust = 1,nudge_y = -.5, color = 'black',
            size = 3)+
  scale_x_discrete(limits = rev(levels('labels')))+
  scale_y_continuous(expand = c(0,0))+
  scale_fill_identity()+
  annotate('text',x=4, y=18,hjust=0,size=3,
           label = 'Outras áreas citadas: Anatomia da madeira, Dendrocronologia, Economia,\nEcofisiologia, Controle de produção e Melhoramento e Biotecnologia Florestal')+
  coord_flip()+
  labs(title = 'Aplicação da linguagem R nas sub-áreas da Engenharia Florestal',
       subtitle = 'As principal área de aplicação é a de inventário / mensuração florestal.\nGeoprocessamento e análise experimental também estão entre as principais.')+
  theme_minimal_vgrid(font_size = 12)+
  theme(axis.title = element_blank(),
        plot.title.position = 'plot',
        axis.text.x = element_blank(),
        panel.grid.major = element_blank(),
        axis.text.y = element_text(size = 9))

A cada dez participantes do levantamento, quatro afirmaram ter dificuldades em aprender a programar. Isso é compreensível já que na formação do engenheiro florestal não há um enfoque para o desenvolvimento de habilidades de programação, visto que nossa área de atuação é bastante ampla e para muitos a rotina de campo é mais frequente que a de escritório.
Há uma tendência cada vez maior da utilização do R em algumas disciplinas que trabalham com dados, ou mesmo a inclusão de disciplinas específicas para desenvolvimento dessas habilidades nos cursos de graduação e pós-graduação.
Independente da existência de disciplinas específicas na grade currícular, o aprendizado de uma linguagem de programação é similar ao aprendizado de um idioma, e se dá pelo estudo, prática, e constância de utilização. O autodidatismo é outra característica importante para quem busca se desenvolver nesta área.

###########################
# Principais dificuldades #
###########################
outras_dificuldades <- str_replace_all(respostas$Dificuldades,
            'Não tenho tempo/empenho|Tenho dificuldade com programação|Não encontro material didático disponível sobre linguagem R aplicada a área florestal|Não encontro cursos de R voltados à área florestal|Não sinto dificuldade|',
            '') %>% as_tibble() %>% 
  mutate(value = case_when(nchar(value)>6~value,
                           TRUE ~ NA_character_)) %>% 
  drop_na() %>% nrow()


tempoempenho <- grep('Não tenho tempo/empenho',respostas$Dificuldades) %>% length()
programacao <- grep('Tenho dificuldade com programação',respostas$Dificuldades) %>% length()
matdidatico <- grep('Não encontro material didático disponível sobre linguagem R aplicada a área florestal',respostas$Dificuldades) %>% length()
cursos <- grep('Não encontro cursos de R voltados à área florestal',respostas$Dificuldades) %>% length()
nao <- grep('Não sinto dificuldade',respostas$Dificuldades) %>% length()

tibble(Dificuldade = c('Não tenho tempo/empenho',
                       'Tenho dificuldade com programação',
                       'Não encontro material didático disponível sobre linguagem R aplicada a área florestal',
                       'Não encontro cursos de R voltados à área florestal',
                       'Não sinto dificuldade',
                       'Outras'),
       n = c(tempoempenho, programacao, matdidatico, cursos, nao, outras_dificuldades)) %>% 
  mutate(n_rel = n/nrow(respostas)*100,
         labels = gsub('(.{1,30})(\\s|$)', '\\1\n', Dificuldade)) %>% 
  mutate(labels = reorder(labels, n)) %>%
  arrange(-n) %>%
  mutate(fill = case_when(row_number()==1~'darkorange',
                          TRUE~paleta6[1])) %>% 
  ggplot(aes(area = n, fill = n, label = labels))+
  geom_bar(aes(x=labels,y=n_rel, fill = fill), stat = 'identity')+
  geom_text(aes(x=labels, y=n_rel, label = paste0(round(n_rel,1),'%')), hjust = 1,nudge_y = -.5, color = 'black', size = 3)+
  annotate('text',x=1, y=7,hjust=0,label = 'Outras dificuldades apontadas se referem à aplicação da linguagem no ambiente corporativo\nquando a ferramenta dominante é outra, deficiência em conhecimentos estatísticos e\nlíngua inglesa, falta de prática e alterações frequentes de versões de pacotes.',
           size=3)+
  scale_x_discrete(limits = rev(levels('labels')))+
  scale_y_continuous(expand = c(0,0))+
  scale_fill_identity()+
  coord_flip()+
  labs(title = 'Principais dificuldades no aprendizado da linguagem R',
       subtitle = 'A principal dificuldade apontada pelos participantes se refere à pratica de programação.\nFalta de tempo e/ou empenho também é uma das principais dificuldades apontadas.')+
  theme_minimal_vgrid(font_size = 12)+
  theme(axis.title = element_blank(),
        plot.title.position = 'plot',
        axis.text.x = element_blank(),
        panel.grid.major = element_blank(),
        axis.text.y = element_text(size = 9))

A comunidade R é bastante ampla e existe muito material disponível na internet para apoiar o aprendizado. Aqui no blog procuro compartilhar um pouco do que desenvolvo e que se aplica à área florestal. A maior parte do que aprendi a fazer no R veio de exemplos compartilhados na internet que na maioria das vezes não eram florestais. Foi o estudo, a prática e a constância de utilização que me permitiram direcionar o que aprendi (e continuo aprendendo) de maneira dispersa, ao desenvolvimento de soluções para os problemas que preciso atacar no meu trabalho diário - florestal.

Bom, cumpro aqui meu combinado de disponibilizar os resultados e códigos de análise do formulário. Deixo meu obrigado à todos os colegas que responderam o questionário. Até a próxima!

Avatar
Sérgio Costa
MSc. Engenheiro Florestal

Mestre em Engenharia Florestal pela Universidade Federal do Paraná, atualmente trabalha como Especialista em Modelagem de Dados na Arauco Forest Brasil.

Próximo
Anterior

Relacionados