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.

comments powered by Disqus
Próximo
Anterior

Relacionados