1 - Preparação do ambiente

Carregando as bibliotecas necessárias para análise e visualização:

library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   4.0.0     ✔ tibble    3.3.0
## ✔ lubridate 1.9.4     ✔ tidyr     1.3.1
## ✔ purrr     1.1.0     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors

2 - Importação e Visualização Inicial dos Dados

Como o arquivo usa “;” como separador de campos e “.” como separador decimal, usamos read_delim(). Essa função permite definir explicitamente o delimitador e o formato decimal, garantindo que valores como 4.53 e 4.33 sejam lidos corretamente. Observação: Antes da importação, o arquivo CSV foi corrigido manualmente para remover quebras de linha inconsistentes, garantindo que todas as linhas sejam lidas corretamente.

#Importando dados
dados_po <- read_delim(
  "C:/Users/shain/Documents/Yevenb/dewafio_2/desafio2-diagnostico_editado.csv",
  delim = ";",
  locale = locale(decimal_mark = ".", encoding = "UTF-8")
)
## Rows: 42 Columns: 18
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ";"
## chr  (14): id, nome, email, telefone, atua_como_po, tempo_experiencia, tipo_...
## dbl   (2): knowledge_score, challenge_score
## dttm  (2): data_resposta, created_at
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
#Visualizando o meu dataset
head(dados_po)
## # A tibble: 6 × 18
##   id     nome  email telefone atua_como_po tempo_experiencia tipo_empresa q5_q11
##   <chr>  <chr> <chr> <chr>    <chr>        <chr>             <chr>        <chr> 
## 1 ANON_… ANON… ANON… ANON_TE… sim_oficial  mais_2a           "Porto segu… "{\"q…
## 2 ANON_… ANON… ANON… ANON_TE… sim_oficial  mais_2a           "Startup, G… "{\"q…
## 3 ANON_… ANON… ANON… ANON_TE… transição    menos_6m          "Startup e … "{\"q…
## 4 ANON_… ANON… ANON… ANON_TE… sim_oficial  mais_2a           "Startup"    "{\"q…
## 5 ANON_… ANON… ANON… ANON_TE… sim_oficial  mais_2a           "Erp, e-com… "{\"q…
## 6 ANON_… ANON… ANON… ANON_TE… sim_parcial  mais_2a           "Edtech, Va… "{\"q…
## # ℹ 10 more variables: q12_q17 <chr>, q18_areas_desenvolvimento <chr>,
## #   q19_formato_apoio <chr>, q20_nivel_jornada <chr>, comentario <chr>,
## #   knowledge_score <dbl>, challenge_score <dbl>, trilha <chr>,
## #   data_resposta <dttm>, created_at <dttm>

3 - Limpeza e Padronização dos Dados

3.1 Apagando colunas desnecessárias

dados_po <- dados_po %>%
  select(-nome, -email, -telefone, -q5_q11, -q12_q17)

3.2 Correção dos Tipos de Dados das Colunas

Definindo Tipos de Dados de acordo com os dados que temos usando as.numeric e também a library lubridate. O lubridate usa ymd_hms para converter strings complexas de data e consegue lidar com os microssegundos (.760088) e o fuso horário (+00)

library(lubridate)
dados_po <- dados_po %>% 
  mutate(
    knowledge_score = as.numeric(knowledge_score),
    data_resposta = ymd_hms(data_resposta, tz = "UTC"),
    created_at = ymd_hms(created_at, tz = "UTC")
  )

3.3 Expandindo coluna em formato de lista

A coluna “q18_areas_desenvolvimento” possui várias respostas dentro de um vetor entre colchetes. Queremos extrair esses dados de modo que seja possível contabilizar a frequência de cada área de desenvolvimento citada. Para isso vamos remover os colchetes, deixando o formato “item1”,“item2”,“item3”. Depois vamos usar o separador “,” (aspas-vírgula-aspas) para gerar uma linha para cada valor. O novo dataframe para essa extensão vai se chamar df_areas.

dados_areas <-dados_po %>% 
  select(id, q18_areas_desenvolvimento) %>% 
  mutate(
    q18_areas_desenvolvimento=q18_areas_desenvolvimento %>% 
      str_remove_all("\\[|\\]") %>% #Remove colchetes
      str_trim() #Remove espaços extras
  ) %>% 
  separate_rows(q18_areas_desenvolvimento, sep='","') %>% 
  mutate(
    q18_areas_desenvolvimento = q18_areas_desenvolvimento %>% 
      str_remove_all('"') %>%  #Remove aspas literais
      str_trim()) #Limpa espaços

# O dataframe resultante (df_areas) agora possui uma linha por id e por área de desenvolvimento

4 - Exportação dos Dados Limpos

Para exportar os dataframes finais (dados_po e dados_areas) em formato .csv, foi utilizada a função write_csv() do pacote readr.
Optou-se por essa função em vez da base write.csv() por alguns motivos:

  • Codificação UTF-8: evita problemas com acentuação (como “Análise”, “Jornada”, “Desenvolvimento”) no Tableau e em outros softwares.
  • Maior desempenho: write_csv() é mais rápida e eficiente para grandes volumes de dados.
  • Sintaxe mais limpa: não é necessário definir row.names = FALSE, pois a função já ignora nomes de linha por padrão.

O código de exportação ficou assim:

write_csv(dados_po, "C:/Users/shain/Documents/Yevenb/dewafio_2/edit_analise_po.csv")
write_csv(dados_areas, "C:/Users/shain/Documents/Yevenb/dewafio_2/edit_analise_po_areas.csv")

5 - Resumo dos Processos Realizados

🧩 Importação dos Dados

  • Função usada: read_delim()

    • Motivo: permite especificar delimitador de campo (;) e separador decimal (.) explicitamente.
    • Configuração: locale(decimal_mark = ".", encoding = "UTF-8") garante leitura correta de números decimais e caracteres especiais.
  • Observação: Antes da importação, o arquivo CSV foi corrigido manualmente para remover quebras de linha inconsistentes, garantindo que todas as linhas sejam lidas corretamente.

🧹 Limpeza e Padronização

  • Remoção de colunas irrelevantes:

    • select(-nome, -email, -telefone, -q5_q11, -q12_q17)
  • Correção de tipos de dados:

    • as.numeric() → converte knowledge_score para formato numérico.
    • ymd_hms() (lubridate) → transforma data_resposta e created_at em formato de data-hora padrão (YYYY-MM-DD HH:MM:SS), reconhecendo microssegundos e fuso horário (+00).

🧮 Explosão de Coluna com Múltiplas Respostas

  • Funções usadas:

    • str_remove_all() → remove colchetes e aspas de strings com múltiplos itens.
    • separate_rows() → divide respostas em linhas separadas (dados_areas).
  • Resultado:

    • Permite analisar a frequência de áreas citadas e realizar cruzamentos no Tableau.

💾 Exportação dos Dados

  • Função usada: write_csv() (readr)

    • Mantém codificação UTF-8 e é mais rápida/limpa que write.csv().

    • Arquivos gerados:

      • analise_po_final.csv — base principal (dados_po).
      • analise_po_areas.csv — base expandida (dados_areas).

6 - Resumo das Funções e Sintaxe Utilizadas

Função Pacote Descrição
read_delim() readr Lê arquivos CSV com delimitador ; e separador decimal ..
select() dplyr Seleciona ou exclui colunas de um dataframe.
mutate() dplyr Cria ou transforma colunas dentro de um dataframe.
as.numeric() Base R Converte valores para tipo numérico.
ymd_hms() lubridate Converte strings complexas em objetos de data-hora (POSIXct).
str_remove_all() stringr Remove padrões de texto com expressões regulares.
separate_rows() tidyr Expande listas ou valores separados por delimitadores em várias linhas.
write_csv() readr Exporta dataframes para .csv com codificação UTF-8.

🧠 Conclusão: Com os dados limpos, padronizados e exportados, foi possível estruturar um conjunto de bases (dados_po e dados_areas) adequadas para exploração e visualização no Tableau, garantindo integridade e consistência nas análises da Jornada de Product Owners.