Introdução à Ciência de Dados

Mestrado Profissional em Administração

Prof. Washington Santos da Silva

IFMG - Campus Formiga

24 de abril de 2025

Diário de Bordo

O que vimos até aqui?

  • Aula 1 ✅

    • Apresentação da Disciplina ✅
    • Introdução e Contextualização ✅
    • O que é Ciência de Dados? ✅
    • Pesquisa Reproduzível e Ciência de Dados ✅
    • Papéis Profissionais ✅
    • Aplicações ✅
    • Habilidades Interpessoais e Analíticas ✅
    • Apresentação da Disciplina ✅
    • Configurações: Git/GitHub ✅
  • Aula 2 ✅

    • Metodologia CRISP-DM ✅
    • Tipos de Análise de Dados ✅
    • Introdução ao RStudio e criação do seu Projeto da Disciplina ✅
    • Introdução ao Sistema de Publicação Quarto ✅
    • Introdução ao Git e GitHub: controle de versão e criação do seu repositório no GitHub ✅
  • Aula 3 ✅

    • Breve Revisão sobre o RStudio ✅
    • Sistema de Publicação Quarto: (Cont.) ✅
    • Introdução ao Git e GitHub: (Cont.) ✅
    • Sessão Prática: Fluxo de trabalho integrando RStudio/Quarto/R/Git/GitHub ✅

Nesta Aula

Tópicos

  • Conceitos de Variáveis e Observações em Estatística

  • Conceito de Dados Organizados (Tidy Data)

  • Tipos atômicos e classes principais de dados da linguagem R

  • Abordar os Tipos de Dados Tradicionais em Finanças

    • Dados em Secção-Cruzada (ou Transversal) (Cross-Section Data)
    • Dados em Secções-Cruzadas Combinadas (Pooled Cross-Section Data)
    • Dados em Séries Temporais (Time Series Data)
    • Dados em Painel (ou Longitudinais) (Panel Data)
  1. Importação e Preparação de Dados Típicos de Finanças com exemplos práticos.

Diretrizes para Aulas Mais Produtivas

⌨️ Código com método:

95% dos erros são evitáveis com:

  • Atenção na digitação
  • Respeitar a sequência lógica de etapas
  • Revisão antes de pedir ajuda

🤝 Inteligência colaborativa:

  • Compartilhe conhecimento
  • Resolva questões técnicas simples com colegas próximos
  • Reserve ao professor as dúvidas conceituais complexas

💪 Capacidade de Resolver Problemas

Cada erro resolvido é uma evolução da sua habilidade analítica

CRISP-DM - Fases 2 e 3

As Fases 2 (Compreensão dos Dados) e 3 (Preparação dos dados) consomem entre 60-80% do tempo de um projeto de análise ou ciência de dados

Conceito de Variáveis e Observações

Variáveis e Observações

Conceitos Fundamentais

  • Variáveis: Características ou atributos que podem ser medidos ou observados

    • Exemplos em Finanças: Retorno de ações, Valor de mercado, Indicadores financeiros
  • Observações: Unidades ou casos individuais para os quais as variáveis são registradas

    • Exemplos em Finanças: Países, Empresas, Setor Econômico, Pessoas etc.
  • Intuição: Se as variáveis são “o que” medimos, as observações são “sobre quem” ou “sobre o que” estamos medindo.

Conceito Estatístico: Observações

Definição

Em Estatística, uma observação representa uma unidade amostral individual dentro de um conjunto de dados.

  • Cada observação corresponde a um elemento específico da população ou amostra (por exemplo, uma pessoa, uma empresa, um país)

  • Cada observação contém valores para diversas variáveis, formando um registro completo de características para aquela unidade específica

  • O conjunto de todas as observações constitui o conjunto de dados que analisamos.

  • Intuição: Se as variáveis são “o que” medimos, as observações são “sobre quem” ou “sobre o que” estamos medindo.

Conceito Estatístico de Variável

Variável

Em Estatística, uma variável é uma característica que pode variar em valor entre os indivíduos de uma amostra ou população.

  • Qualquer característica que podemos medir para os elementos de uma população (ou amostra) é chamada de variável.

  • O termo reflete o fato de que os valores da característica variam entre os elementos de uma população.

Tipos de Variáveis

Variáveis Quantitativas/Numéricas

Definição

  • Uma variável é chamada de quantitativa quando a escala de medição possui valores numéricos que representam diferentes magnitudes da variável.

  • Variáveis quantitativas são frequentemente chamadas de numéricas.

  • Uma variável quantitativa é discreta se puder assumir um conjunto de valores distintos, como os inteiros não negativos \((0, 1, 2, 3, \ldots)\).

  • Uma variável quantitativa é contínua se puder assumir um continuum infinito de possíveis valores de números reais, pelo menos teoricamete.

  • Na prática, arredondamos variáveis contínuas ao medi-las, de modo que a medida real é discreta. Ainda assim, estas variáveis são tratadas como variáveis contínuas.

  • Os métodos de análise estatística dependem da escala de medição (tipo) de uma variável de interesse.

Variáveis Qualitativas/Categóricas

Definição

Uma variável é chamada de categórica quando a escala de medição é um conjunto de categorias.

  • Variáveis categóricas cque possuem apenas duas categorias, como empregado (sim ou não), são também chamadas de binárias.

  • Variáveis categóricas são frequentemente chamadas de qualitativas.

  • Variáveis categóricas possuem dois tipos de escalas de medição: nominal e ordinal.

  • Escala Nominal: Quando as categorias nõa possuem uma hierarquia. Exemplos: cor, sexo, racá, etc.

  • Escala Ordinal: Quando as categorias possuem uma hierarquia natural. Exemplos: Nível de Escolaridade (Fundamental, Médio e Superior). Score de Crédito (risco pequeno, risco moderado, alto risco), etc.

  • Os métodos de análise estatística dependem da escala de medição (tipo) de uma variável de interesse.

Dados e Dados Organizados (Tidy Data)

Conjunto de Dados

Conceitos Fundamentais

  • Conjunto de Dados: Coleção estruturada de variáveis e observações

  • Normalmente os conjuntos de dados são organizados em formato tabular (linhas e colunas)

Conjunto de Dados Organizados

┌─────────────────────────────────────────┐
│                                         │
│          Variáveis (Colunas)            │
│    ┌──────┬──────┬──────┬──────┐        │
│    │ Var1 │ Var2 │ Var3 │ Var4 │        │
│    ├──────┼──────┼──────┼──────┤        │
│    │  •   │  •   │  •   │  •   │  Obs1  │
│    ├──────┼──────┼──────┼──────┤        │
│ O  │  •   │  •   │  •   │  •   │  Obs2  │
│ b  ├──────┼──────┼──────┼──────┤        │
│ s  │  •   │  •   │  •   │  •   │  Obs3  │
│ e  ├──────┼──────┼──────┼──────┤        │
│ r  │  •   │  •   │  •   │  •   │  Obs4  │
│ v  ├──────┼──────┼──────┼──────┤        │
│ a  │  •   │  •   │  •   │  •   │  Obs5  │
│ ç  ├──────┼──────┼──────┼──────┤        │
│ õ  │  •   │  •   │  •   │  •   │  Obs6  │
│ e  ├──────┼──────┼──────┼──────┤        │
│ s  │  •   │  •   │  •   │  •   │  Obs7  │
│    ├──────┼──────┼──────┼──────┤        │
│    │  •   │  •   │  •   │  •   │  Obs8  │
│    └──────┴──────┴──────┴──────┘        │
│                                         │
└─────────────────────────────────────────┘

Conjunto de Dados Organizados

Conceito de Dados Organizados (Tidy Data)

O conceito de Tidy Data (Dados Organizados) foi formalizado por Hadley Wickham.

Um arquivo de dados organizado possui a seguinte estrutura:

  • Cada linha representa uma observação individual
  • Cada coluna representa uma variável específica
  • Cada célula contém um valor de uma variável para uma observação específica

Esta estrutura facilita a:

  • Visualização e modelagem estatística
  • Manipulação consistente dos dados
  • Reprodutibilidade das análises

Princípios do Tidy Data

Benefícios de Dados Organizados

  • Consistência: Estrutura uniforme para todos os conjuntos de dados

  • Adequação para Ferramentas: Formato apropriado para linguagens e softwares de análise de dados.

  • Facilidade para operações comuns:

    • Filtragem de observações
    • Seleção de variáveis
    • Criação de novas variáveis
    • Agregação de dados
    • Junção de múltiplas tabelas
  • Melhoria na comunicação: Estrutura clara que facilita documentação

Dados Organizados vs. Desorganizados

Dados Desorganizados:

| País     | 2020 | 2021 | 2022 |
|----------|------|------|------|
| Brasil   | 2.3  | 3.1  | 1.8  |
| Argentina| 1.5  | 2.7  | 0.9  |
| Chile    | 2.9  | 3.5  | 2.0  |

Problemas:

  • Variável (ano) está nas colunas
  • Não segue o princípio “uma coluna, uma variável”

Dados Organizados

Dados Organizados:

| País     | Ano  | PIB  |
|----------|------|------|
| Brasil   | 2020 | 2.3  |
| Brasil   | 2021 | 3.1  |
| Brasil   | 2022 | 1.8  |
| Argentina| 2020 | 1.5  |
| Argentina| 2021 | 2.7  |
| Argentina| 2022 | 0.9  |
| Chile    | 2020 | 2.9  |
| Chile    | 2021 | 3.5  |
| Chile    | 2022 | 2.0  |

Características:

  • Cada variável está em uma coluna
  • Cada observação está em uma linha
  • Cada célula contém um valor

Problemas Comuns em Dados não organizados

Tipos de “Desorganização”

  1. Colunas como valores: Nomes de colunas contendo valores de variáveis

    • Ex: Colunas nomeadas com anos (2020, 2021, 2022)
  2. Múltiplas variáveis em uma coluna: Uma coluna contendo mais de uma variável

    • Ex: “Nome_Empresa (Ticker)” combinando nome e código
  3. Variáveis em linhas e colunas: Inconsistência na localização das variáveis

    • Ex: Alguns indicadores financeiros nas colunas, outros nas linhas

Exemplos Prático em Finanças

Dados financeiros não organizados:

| Empresa  | Lucro20 | Lucro21 | ROE20 | ROE21 |
|----------|---------|---------|-------|-------|
| PETR4    | 40.1    | 106.7   | 0.84  | 0.19  |
| VALE3    | 24.9    | 121.2   | 0.16  | 0.36  |
| ITUB4    | 18.9    | 26.9    | 0.17  | 0.18  |

Problema:

  • Indicadores e anos nas colunas (mais de uma variável em cada coluna).

Exemplos Prático em Finanças

Nota

Dados financeiros organizados:

| Empresa | Ano  | Indicador | Valor |
|---------|------|-----------|-------|
| PETR4   | 2020 | Lucro     | 40.1  |
| PETR4   | 2021 | Lucro     | 106.7 |
| PETR4   | 2020 | ROE       | 0.84  |
| PETR4   | 2021 | ROE       | 0.19  |
| VALE3   | 2020 | Lucro     | 24.9  |
| VALE3   | 2021 | Lucro     | 121.2 |
| VALE3   | 2020 | ROE       | 0.16  |
| VALE3   | 2021 | ROE       | 0.36  |
| ITUB4   | 2020 | Lucro     | 18.9  |
| ITUB4   | 2021 | Lucro     | 26.9  |
| ITUB4   | 2020 | ROE       | 0.16  |
| ITUB4   | 2021 | ROE       | 0.18  |

Características:

  • Cada variável está em uma coluna
  • Cada observação está em uma linha
  • Cada célula contém um valor

Tidy Data

Organizando Dados para Análise

Por que a absoluta maioria dos arquivos de dados não são organizados (tidy)?

  • Por que a maioria das pessoas não está familiarizada com os princípios da organização de dados para análise.

  • Planilhas de dados são frequentemente organizadas para tornar a entrada a mais fácil possível e/ou pensando em apresentar os dados, não em um formato adequado para armazenamento e análise

  • Isso significa que, para a maioria das análises reais, precisamos fazer alguns ajustes em dados elaborados por terceiros.

  • A primeira etapa é sempre descobrir quais são as observações e as variáveis associadas a cada observação.

Horror Stories

Aviso

  • Os perigos das planilhas eletrônicas são reais!

European Spreadsheet Risks Interest Group

  • O European Spreadsheet Risks Interest Group (EuSpRIG) é uma organização que se dedica ao estudo, pesquisa e mitigação dos riscos associados ao uso de planilhas eletrônicas em ambientes empresariais e de pesquisa

  • Site mantido pelo EuSpRIG: Horror Stories: Spreadsheet mistakes – news stories

Data Organization in Spreadsheets (Broman e Woo, 2018)

Recomendações práticas para organizar os dados em planilhas.

  • Seja consistente

  • Escolha bons nomes para as variáveis

  • Escreva datas conforme a Norma ISO 8601: YYYY-MM-DD

  • Sem células vazias

  • Coloque apenas um valor nas células

  • Crie a estrutura correta para os dados

  • Crie um dicionário dos dados

  • Sem cálculos nos arquivos dos dados brutos

  • Não use cor ou realce como um dado.

  • Faça backups

  • Use validação dos dados para evitar erros

  • Salve os dados em arquivos de texto simples

Tipos Básicos e Classes de Dados em R

Tipos e Classes de Dados

A Importância de Conhecer Tipos e Classes de Dados

  • Se os métodos de análise estatística dependem da escala de medição (tipo) de uma variável de interesse, compreender os tipos e classes de dados da linguagem R (ou de qualquer outra) é fundamental.

  • Cada tipo de análise ou de gráfico exige que as variáveis sejam de um tipo ou classe específicos e estejam organizadas em uma estrutura de dados específica.

  • Na prática da ciência ou análise de dados, estima-se que analistas e cientistas dedicam entre 60% a 80% do tempo de um projeto à importação, limpeza e preparação dos dados antes de iniciar as análises.

Tipos/Classes Principais

Tipo Classe Descrição
double numeric armazena valores reais (números com casas decimais)
integer numeric armazena valores inteiros (números sem casas decimais)
character character armazena valores de texto (caracteres)
logical logical armazena valores lógicos (TRUE/FALSE)
NA Not Available: representa valores faltantes
NaN Not a Number: exemplo: 0/0
Inf Infinity: exemplo: 1/0

Dicas

  • O tipo atômico se refere a como R armazena o objeto internamente.
  • A classe se refere a como R trata um objeto em operações e funções.

Tipos Atômicos Principais

  • Após importarmos um arquivo de dados e verificarmos como R entendeu cada coluna/variável importada, precisamos converter os tipos definidos para classes adequadas para análises posteriores.
Tipo Converter para a Classe Função para Conversão
double numeric as.numeric()
integer numeric (ou integer) as.numeric (ou as.integer)
character factor as.factor

Classe factor

Descrição

  • A classe factor da linguagem R é apropriada para representar variáveis categóricas nominais ou ordinais.
# Vetor de texto com dados brutos
estado_civil <- c(
  "Casado", "Solteiro", "Divorciado", "Solteiro",
  "Casado", "Viúvo", "Solteiro", "Divorciado"
)

# Convertendo para fator (variável categórica nominal)
estado_civil_fator <- factor(estado_civil)

# Vizualizando o objetoa
estado_civil_fator
[1] Casado     Solteiro   Divorciado Solteiro   Casado     Viúvo      Solteiro  
[8] Divorciado
Levels: Casado Divorciado Solteiro Viúvo
# verificando a classe
class(estado_civil_fator)
[1] "factor"

Classe factor

# Vetor de texto com dados brutos
escolaridade <- c(
  "Médio", "Fundamental", "Superior", "Superior",
  "Médio", "Pós-graduação", "Fundamental", "Médio"
)

# Convertendo para fator ordenado com níveis explícitos
escolaridade_fator <- factor(escolaridade,
  levels = c("Fundamental", "Médio", "Superior", "Pós-graduação"),
  ordered = TRUE # indica que é um fator ordenado
)

# Visualizando o fator e sua estrutura
escolaridade_fator
[1] Médio         Fundamental   Superior      Superior      Médio        
[6] Pós-graduação Fundamental   Médio        
Levels: Fundamental < Médio < Superior < Pós-graduação
# verificando a classe
class(escolaridade_fator)
[1] "ordered" "factor" 

Exemplo: Relatório JungLivert

Verificando a estrutura dos dados

  • Após importar os dados, analisamos o tipo de cada variável (coluna) importada.
# Importa o arquivo de dados

## Define o caminho relativo do arquivo no projeto RStudio
caminho <- here::here("data/raw/productionlog_sample.csv")

## Importa o arquivo com a funçào read_csv
dados_destilaria <- readr::read_csv(caminho)

# Verificar a estrutura dos dados
dplyr::glimpse(dados_destilaria)
Rows: 21
Columns: 8
$ DAY          <dbl> 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, NA, 6, 6, 7, 7, 8, 8, 9, 9,…
$ MONTH        <dbl> 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, NA, 4, 4, 4, 4, 4, 4, 4, 4,…
$ MANUFACTURER <chr> "Leonard", "Carlson", "Leonard", "Carlson", "Leonard", "C…
$ PRODUCT      <chr> "Junglivet", "Junglivet Premium", "Junglivet", "Junglivet…
$ SHIFT        <chr> "Morning", "Evening", "Morning", "Evening", "Morning", "E…
$ COLOR        <dbl> 0.27, 0.27, 0.28, 0.32, 0.32, 0.28, 0.29, 0.29, 0.33, 0.2…
$ MALTING      <chr> "Inhouse", "Burns Best Ltd.", "Inhouse", "Inhouse", "Matr…
$ TASTING      <dbl> 895, 879, 938, 900, 917, 900, 934, 951, 852, 850, NA, 991…

Exemplo: Relatório JungLivert

dados_destilaria_limpos <- dados_destilaria %>%
  select(-MONTH) %>%
  rename(
    dia = DAY,
    mestre_responsavel = MANUFACTURER,
    tipo_produto = PRODUCT,
    turno = SHIFT,
    cor = COLOR,
    fornecedor_malte = MALTING,
    indicador_qualidade = TASTING,
  ) %>%
  # Em seguidda, convertemos cada variável para classes adequadas
  mutate(
    dia = as.numeric(dia),
    mestre_responsavel = as.factor(mestre_responsavel),
    tipo_produto = as.factor(tipo_produto),
    turno = as.factor(turno),
    cor = as.numeric(cor),
    fornecedor_malte = as.factor(fornecedor_malte),
    indicador_qualidade = as.numeric(indicador_qualidade)
  ) %>%
  drop_na()

Estruturas de Dados Principais

Vetor

  • Estrutura fundamental em R: todos os tipos básicos são armazenados como vetores

  • Definição: Coleção de elementos do mesmo tipo de dados

  • Criação com a função c() (concatenate/combine):

Vetores - exemplos

# cria um vetor numérico manualmente
idades <- c(22, 25, 19, 30, 27)
idades
[1] 22 25 19 30 27
# cria um vetor de caracteres
nomes <- c("Ana", "Bruno", "Carla", "Daniel", "Eduarda")
nomes
[1] "Ana"     "Bruno"   "Carla"   "Daniel"  "Eduarda"
# cria um vetor lógico
aprovados <- c(TRUE, FALSE, TRUE, TRUE, FALSE)
aprovados
[1]  TRUE FALSE  TRUE  TRUE FALSE

Estruturas de Dados Principais

Data Frames e Tibbles

  • Data frame: Estrutura tabular (similar a uma planilha Excel)

    • Coleção de vetores de mesmo comprimento mas que podem ser de tipos diferentes

    • Cada coluna = um vetor = uma variável

    • Cada linha = uma observação

  • Tibble: Versão moderna de data frame do pacote tibble (parte do tidyverse)

    • Mais consistente e previsível que as data frames

    • Inclui o tipo de cada coluna ao imprimir

    • Não converte strings em fatores automaticamente

Data Frames e Tibbles

Representação Visual

Exemplo de data frame/tibble

# cria vetores manualmente
idades <- c(22, 25, 19, 30, 27)
nomes <- c("Ana", "Bruno", "Carla", "Daniel", "Eduarda")
aprovados <- c(TRUE, FALSE, TRUE, TRUE, FALSE)

# a funcao data.frame cria uma data frame usando os vetores
dados <- data.frame(idades, nomes, aprovados)

# exibe a data frame criada
dados
  idades   nomes aprovados
1     22     Ana      TRUE
2     25   Bruno     FALSE
3     19   Carla      TRUE
4     30  Daniel      TRUE
5     27 Eduarda     FALSE

Exemplo de data frame/tibble

# head exibe as 6 primeiras linhas de um objeto
head(dados_destilaria_limpos)
# A tibble: 6 × 7
    dia mestre_responsavel tipo_produto      turno     cor fornecedor_malte
  <dbl> <fct>              <fct>             <fct>   <dbl> <fct>           
1     1 Leonard            Junglivet         Morning  0.27 Inhouse         
2     1 Carlson            Junglivet Premium Evening  0.27 Burns Best Ltd. 
3     2 Leonard            Junglivet         Morning  0.28 Inhouse         
4     2 Carlson            Junglivet         Evening  0.32 Inhouse         
5     3 Leonard            Junglivet         Morning  0.32 Matro Ltd.      
6     3 Carlson            Junglivet         Evening  0.28 Inhouse         
# ℹ 1 more variable: indicador_qualidade <dbl>

Acessando uma Coluna/Variável

# acesse com $
dados_destilaria_limpos$indicador_qualidade
 [1] 895 879 938 900 917 900 934 951 852 850 991 950 863 936 996 978 989 999 831
[20] 822

Acessando uma Coluna/Variável

# acesse com $
dados_destilaria_limpos$fornecedor_malte
 [1] Inhouse         Burns Best Ltd. Inhouse         Inhouse        
 [5] Matro Ltd.      Inhouse         Inhouse         Matro Ltd.     
 [9] Matro Ltd.      Inhouse         Inhouse         Inhouse        
[13] Burns Best Ltd. Burns Best Ltd. Burns Best Ltd. Matro Ltd.     
[17] Inhouse         Inhouse         Burns Best Ltd. Matro Ltd.     
Levels: Burns Best Ltd. Inhouse Matro Ltd.

data frame e tibble

# exibe a estrutura dos dados
class(dados_destilaria_limpos)
[1] "tbl_df"     "tbl"        "data.frame"

Data Frames e Tibbles

  • Ao importar dados, todo objeto lido por R como uma data frame, também será uma tibble.

Tipos de Dados Tradicionais em Finanças

Dados em Secção-Cruzada

Definição

  • Dados em secção-cruzada (cross-sectional data) referem-se a dados coletados de várias entidades (unidades de observação) (como empresas, indivíduos, etc.) em um único ponto no tempo.

  • Esses dados capturam um instantâneo das variáveis de interesse associadas às entidades, permitindo a análise das diferenças entre entidades em um momento particular. A análise de secção-cruzada é útil para identificar padrões, correlações e comparações entre diferentes unidades observadas ao mesmo tempo, mas não captura mudanças ou dinâmicas ao longo do tempo.

Exemplo

empresa lucro ativo divida
A 500 2000 1500
B 600 2200 1600
C 550 2100 1550

Dados em Secções-Cruzadas Combinadas

Definição

  • Dados de secções-cruzadas combinadas (pooled cross-sectional data) referem-se a dados coletados de diferentes entidades em diferentes pontos no tempo, onde as entidades podem não ser as mesmas em cada ponto no tempo.

  • Essa estrutura permite a análise das mudanças no tempo em diferentes grupos de entidades, possibilitando a investigação de tendências e padrões temporais sem a necessidade de rastrear as mesmas unidades observacionais continuamente.

Exemplo

ano empresa lucro ativo divida
2020 A 500 2000 1500
2020 B 600 2200 1600
2023 C 550 2100 1550
2023 D 620 2250 1620

Dados de Séries Temporais

Definição

  • Dados de séries temporais (time series data) referem-se a dados coletados ao longo do tempo (em geral, em intervalos regulares) sobre uma (série univariada) ou mais variáveis (série multivariada) de uma entidade.

  • Essa estrutura é fundamental para identificar padrões sazonais, ciclos econômicos, e tendências de longo prazo, bem como para realizar previsões futuras com base no comportamento passado. Este tipo de dados é amplamente utilizado em finanças, economia, meteorologia, e outras áreas onde a dimensão temporal é fundamental para a análise.

Exemplo

data preco volume
2020-01-01 100 1500
2020-02-01 105 1600
2020-03-01 102 1550
2020-04-01 108 1650

Dados em Painel

Definição

  • Dados em painel (panel data) referem-se a dados coletados de várias entidades ao longo de múltiplos períodos de tempo (em intervalos regulares).

  • Essa estrutura permite a análise das variáveis ao longo do tempo e entre entidades , fornecendo uma visão mais detalhada e dinâmica das relações entre variáveis do que as análises de secção-cruzada ou séries temporais isoladamente.

Exemplo

ano empresa lucro ativo divida
2020 A 500 2000 1500
2021 A 600 2200 1600
2022 A 400 1900 1300
2020 B 550 2100 1550
2021 B 620 2250 1620
2022 B 400 2150 1350
2020 C 550 2100 1550
2021 C 620 2250 1620
2022 C 400 2150 1350

Ou:

ano empresa lucro ativo divida
2020 A 500 2000 1500
2020 B 550 2100 1550
2020 C 550 2100 1550
2021 A 600 2200 1600
2021 B 620 2250 1620
2021 C 620 2250 1620
2022 A 400 1900 1300
2022 B 400 2150 1350
2022 C 400 2150 1350

Dados em Painel

Painel Balanceado

  • Um painel é considerado balanceado quando cada entidade é observada em todos os períodos de tempo. Ou seja, não há dados faltantes para nenhuma entidade em nenhum período.

Painel Desbalanceado

  • Um painel é desbalanceado quando algumas entidades têm observações faltantes em um ou mais períodos de tempo. Isto é, nem todas as entidades são observadas em todos os períodos.

Importação e Preparação de Dados Típicos de Finanças

Dados em Secção-Cruzada

Formato Típico

  • O arquivo dados_artigo_reveduc.xlsx contém uma secção-cruzada referente ao ano de 2017 contendo informações sobre todos os 83 estudantes regularmente matriculados no curso Técnico Integrado em Informática em 2017 ofertado pelo IFMG – Campus Formiga.

  • Os dados foram utilizados em um artigo, aceito para publicação, cujo objetivo foi identificar se fatores socioeconômicos e o fato dos estudantes serem ou não cotistas impactaram o rendimento acadêmico dos estudantes, medido pelo coeficiente de rendimento acadêmico global.

Dados em Secção-Cruzada

Importação do arquivo

  • Importe o arquivo dados_artigo_reveduc.xlsx utlizando a função readxl::read_xlsx e nomeie o objeto como dados_artigo:
library(here)
library(readxl)

# define o caminho relativo do arquivo unemployment.csv
path_dados_artigo <- here::here("data/raw/dados_artigo_reveduc.xlsx")

# importa o arquivo
dados_artigo <- readxl::read_xlsx(path_dados_artigo)

# verifica a estrutura do objeto
dplyr::glimpse(dados_artigo)
Rows: 83
Columns: 8
$ turma                            <chr> "2014.1", "2014.1", "2014.1", "2015.1…
$ cotas                            <chr> "A0", "A0", "A0", "A0", "L1", "A0", "…
$ periodo_letivo                   <chr> "2017", "2017", "2017", "2017", "2017…
$ onde_estudou                     <chr> "Sempe em Escola Publica", "Parte Esc…
$ sexo                             <chr> "Masculino", "Feminino", "Masculino",…
$ cor                              <chr> "Branca", "Branca", "Parda", "Parda",…
$ renda_familiar                   <dbl> 3, 2, 1, 1, 4, 2, 2, 2, 2, 3, 3, 4, 3…
$ coeficiente_rendimento_academico <dbl> 68, 6, 83, 83, 76, 70, 70, 70, 70, 70…

Estatísticas básicas:

summary(dados_artigo)
    turma              cotas           periodo_letivo     onde_estudou      
 Length:83          Length:83          Length:83          Length:83         
 Class :character   Class :character   Class :character   Class :character  
 Mode  :character   Mode  :character   Mode  :character   Mode  :character  
                                                                            
                                                                            
                                                                            
     sexo               cor            renda_familiar 
 Length:83          Length:83          Min.   :0.000  
 Class :character   Class :character   1st Qu.:2.000  
 Mode  :character   Mode  :character   Median :2.000  
                                       Mean   :2.699  
                                       3rd Qu.:3.500  
                                       Max.   :7.000  
 coeficiente_rendimento_academico
 Min.   : 6.00                   
 1st Qu.:70.00                   
 Median :73.00                   
 Mean   :72.41                   
 3rd Qu.:76.00                   
 Max.   :92.00                   

Dados em Secção-Cruzada

Preparação dos Dados

# pacotes necessarios
library(dplyr)

# Alterando a classe/tipo das colunas
dados_artigo_analise <- dados_artigo |>
  transmute(
    turma = as.factor(turma),
    cotas = as.factor(cotas),
    periodo_letivo = as.factor(periodo_letivo),
    onde_estudou = as.factor(onde_estudou),
    sexo = as.factor(sexo),
    cor = as.factor(cor),
    renda_familiar = as.integer(renda_familiar),
    cra = as.numeric(coeficiente_rendimento_academico)
  )

# verifica a estrutura do objeto
dplyr::glimpse(dados_artigo_analise)
Rows: 83
Columns: 8
$ turma          <fct> 2014.1, 2014.1, 2014.1, 2015.1, 2014.1, 2014.1, 2014.1,…
$ cotas          <fct> A0, A0, A0, A0, L1, A0, A0, A0, A0, L5, A0, A0, A0, A0,…
$ periodo_letivo <fct> 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2…
$ onde_estudou   <fct> "Sempe em Escola Publica", "Parte Escola Pública, Parte…
$ sexo           <fct> Masculino, Feminino, Masculino, Masculino, Masculino, M…
$ cor            <fct> Branca, Branca, Parda, Parda, Branca, Branca, Branca, B…
$ renda_familiar <int> 3, 2, 1, 1, 4, 2, 2, 2, 2, 3, 3, 4, 3, 3, 5, 2, 1, 1, 7…
$ cra            <dbl> 68, 6, 83, 83, 76, 70, 70, 70, 70, 70, 73, 79, 74, 74, …

Estatísticas básicas:

summary(dados_artigo_analise)
    turma    cotas   periodo_letivo
 2014.1:23   A0:41   2017:83       
 2015.1:25   L1: 7                 
 2016.1:35   L2:15                 
             L5:12                 
             L6: 8                 
                                   
                                        onde_estudou        sexo        cor    
 Parte Escola Pública, Parte Escola Particular: 9    Feminino :26   Branca:47  
 Sempe em Escola Publica                      :71    Masculino:57   Parda :28  
 Sempre em Escola Particular                  : 3                   Preta : 8  
                                                                               
                                                                               
                                                                               
 renda_familiar       cra       
 Min.   :0.000   Min.   : 6.00  
 1st Qu.:2.000   1st Qu.:70.00  
 Median :2.000   Median :73.00  
 Mean   :2.699   Mean   :72.41  
 3rd Qu.:3.500   3rd Qu.:76.00  
 Max.   :7.000   Max.   :92.00  

Dados de Séries Temporais

Caso 1: Arquivo de Dados Não Contém Datas

  • O arquivo unemployment.csv contém 63 dados mensais sobre a taxa de desemprego civil dos EUA como porcentagem da força de trabalho para os anos 2012-2017, obtidos da base da dados do Federal Reserve Bank of Saint Louis.

Dados de Séries Temporais

  • Importe o arquivo unemployment.csv utlizando a função readr::read_csv() e nomeie o objeto como dados_desemeprego.
# pacotes necessários
library(readr)
library(xts)

# define o caminho relativo do arquivo unemployment.csv
path_unemployment <- here::here("data/raw/unemployment.csv")

# importa o arquivo
dados_desemprego <- readr::read_csv(path_unemployment)

# verifica a estrutura do objeto
dplyr::glimpse(dados_desemprego)
Rows: 63
Columns: 1
$ Unemployment <dbl> 8.8, 8.7, 8.4, 7.7, 7.9, 8.4, 8.6, 8.2, 7.6, 7.5, 7.4, 7.…

Verificando a classe do objeto:

# verifica a classe do objeto
class(dados_desemprego)
[1] "spec_tbl_df" "tbl_df"      "tbl"         "data.frame" 

Dados de Séries Temporais

  • Transforme dados_desemprego para a classe ts (de time series) indicando que os dados são mensais e o primeiro período é janeiro de 2012 e nomeie o objeto como desemprego_ts:
# converte a data frame dados_desemprego em um objeto da classe ts
desemprego_ts <- ts(dados_desemprego, start = c(2012, 1), frequency = 12)

# verifica a classe do objeto
class(desemprego_ts)
[1] "ts"
  • Visualizando o conteúdo do objeto:
desemprego_ts
     Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
2012 8.8 8.7 8.4 7.7 7.9 8.4 8.6 8.2 7.6 7.5 7.4 7.6
2013 8.5 8.1 7.6 7.1 7.3 7.8 7.7 7.3 7.0 7.0 6.6 6.5
2014 7.0 7.0 6.8 5.9 6.1 6.3 6.5 6.3 5.7 5.5 5.5 5.4
2015 6.1 5.8 5.6 5.1 5.3 5.5 5.6 5.2 4.9 4.8 4.8 4.8
2016 5.3 5.2 5.1 4.7 4.5 5.1 5.1 5.0 4.8 4.7 4.4 4.5
2017 5.1 4.9 4.6                                    

Dados de Séries Temporais

Utilizando a função as.xts do pacote xts, converta o objeto desemprego_ts para um objeto da classe xts e nomeie este objeto como desemprego_xts.:

# converte o objeto desemprego_ts para um objeto da classe xts
desemprego_xts <- as.xts(desemprego_ts)

# verifcica a classe do objeto
class(desemprego_xts)
[1] "xts" "zoo"
  • Visualizando o conteúdo do objeto:
desemprego_xts
         Unemployment
Jan 2012          8.8
Feb 2012          8.7
Mar 2012          8.4
Apr 2012          7.7
May 2012          7.9
Jun 2012          8.4
Jul 2012          8.6
Aug 2012          8.2
Sep 2012          7.6
Oct 2012          7.5
Nov 2012          7.4
Dec 2012          7.6
Jan 2013          8.5
Feb 2013          8.1
Mar 2013          7.6
Apr 2013          7.1
May 2013          7.3
Jun 2013          7.8
Jul 2013          7.7
Aug 2013          7.3
Sep 2013          7.0
Oct 2013          7.0
Nov 2013          6.6
Dec 2013          6.5
Jan 2014          7.0
Feb 2014          7.0
Mar 2014          6.8
Apr 2014          5.9
May 2014          6.1
Jun 2014          6.3
Jul 2014          6.5
Aug 2014          6.3
Sep 2014          5.7
Oct 2014          5.5
Nov 2014          5.5
Dec 2014          5.4
Jan 2015          6.1
Feb 2015          5.8
Mar 2015          5.6
Apr 2015          5.1
May 2015          5.3
Jun 2015          5.5
Jul 2015          5.6
Aug 2015          5.2
Sep 2015          4.9
Oct 2015          4.8
Nov 2015          4.8
Dec 2015          4.8
Jan 2016          5.3
Feb 2016          5.2
Mar 2016          5.1
Apr 2016          4.7
May 2016          4.5
Jun 2016          5.1
Jul 2016          5.1
Aug 2016          5.0
Sep 2016          4.8
Oct 2016          4.7
Nov 2016          4.4
Dec 2016          4.5
Jan 2017          5.1
Feb 2017          4.9
Mar 2017          4.6

Dados de Séries Temporais

É sempre fundamental analisar gráficos de séries temporais:

plot(desemprego_xts)

Dados de Séries Temporais

Caso 2: Arquivo de Dados Contém Datas

  • O arquivo ipeadata[06-04-2021-04-16].csv, obtido no site ipeadata contém dados diários sobre a taxa de câmbio real/dólar, sendo que a primeira coluna contém os dias.

Dados de Séries Temporais

  • Importe o arquivo ipeadata[06-04-2021-04-16].csv utlizando a função readr::read_csv() e nomeie o objeto importado como dados_cambio.

  • Podemos definir que a primeira coluna são dias usando o argumento col_type() da funcão readr::read_csv2():

# define o caminho relativo do arquivo
path_cambio <- here::here("data/raw/ipeadata[06-04-2021-04-16].csv")

# importa o arquivo ipeadata[06-04-2021-04-16].csv
dados_cambio <- readr::read_csv2(
  path_cambio,
  na = c(" "),
  skip = 1,
  locale = locale(decimal_mark = ","),
  col_names = c("dia", "real_dolar"),
  col_types = cols(dia = col_date(format = "%d/%m/%Y"), real_dolar = col_double())
)

# verifica a estrutura do objeto
dplyr::glimpse(dados_cambio)
Rows: 13,243
Columns: 3
$ dia        <date> 1985-01-02, 1985-01-03, 1985-01-04, 1985-01-05, 1985-01-06…
$ real_dolar <dbl> 1.152000e-09, 1.152000e-09, 1.152000e-09, NA, NA, 1.173818e…
$ X3         <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…

Verificando se há dados faltantes:

summary(dados_cambio)
      dia               real_dolar       X3         
 Min.   :1985-01-02   Min.   :0.000   Mode:logical  
 1st Qu.:1994-01-25   1st Qu.:0.186   NA's:13243    
 Median :2003-02-18   Median :1.819                 
 Mean   :2003-02-18   Mean   :1.775                 
 3rd Qu.:2012-03-12   3rd Qu.:2.671                 
 Max.   :2021-04-05   Max.   :5.937                 
                      NA's   :4171                  

Dados de Séries Temporais

  • Elimine a coluna X3 e retire os dados faltantes (NA):
dados_cambio_limpos <- dados_cambio %>%
  select(dia, real_dolar) %>%
  drop_na()
summary(dados_cambio_limpos)
      dia               real_dolar    
 Min.   :1985-01-02   Min.   :0.0000  
 1st Qu.:1994-02-07   1st Qu.:0.1858  
 Median :2003-02-26   Median :1.8190  
 Mean   :2003-02-24   Mean   :1.7745  
 3rd Qu.:2012-03-19   3rd Qu.:2.6707  
 Max.   :2021-04-05   Max.   :5.9366  

Dados de Séries Temporais

  • Utilizando a função as.xts do pacote xts, converta o objeto dados_cambio_limpos para um objeto da classe xts e nomeie este objeto como cambio_xts.
cambio_xts <- as.xts(dados_cambio_limpos, order_by = dados_cambio_limpos$dia)
class(cambio_xts)
[1] "xts" "zoo"
  • Visualizando o conteúdo do objeto:
cambio_xts
             real_dolar
1985-01-02 1.152000e-09
1985-01-03 1.152000e-09
1985-01-04 1.152000e-09
1985-01-07 1.173818e-09
1985-01-08 1.173818e-09
1985-01-09 1.173818e-09
1985-01-10 1.173818e-09
1985-01-11 1.200364e-09
1985-01-14 1.200364e-09
1985-01-15 1.200364e-09
       ...             
2021-03-22 5.526300e+00
2021-03-23 5.494500e+00
2021-03-24 5.532400e+00
2021-03-25 5.657900e+00
2021-03-26 5.703600e+00
2021-03-29 5.791900e+00
2021-03-30 5.763600e+00
2021-03-31 5.696700e+00
2021-04-01 5.684300e+00
2021-04-05 5.657300e+00

Dados de Séries Temporais

  • É sempre fundamental analisar gráficos de séries temporais:
plot(cambio_xts, main = "Taxa Diária de Câmbio R$/Dólar")

Dados em Painel

Dados em Painel com o Pacote plm

  • O arquivo Data_AgricultureClimate.csv contém um painel envolvendo 568 municípios paulistas com informações anuais (1990 a 2014) para o valor da produção agrícola (em R$), área agrícola, temperatura média e precipitação total no ano.

Estes dados foram utilizados no artigo de Maia, Miyamoto e Garcia (2018).

O arquivo contém as seguintes variáveis:

  • ano: 1990 a 2014
  • munic: código do município no IBGE
  • vtotal: valor total da produçao agropecuária (R$)
  • areatotal: área agrícola no município
  • tempano: temperatura média no ano
  • precano: precipitacao total no ano

Os autores estimaram variações para o seguinte modelo para as variáveis em estudo:

\[ log(vtotal) = log(areatotal) + tempano + precano + erro \]

Dados em Painel

  • Importe o arquivo Data_AgricultureClimate.csv usando a função readr::read_csv e nomeie o objeto importando como dados_agri.
# pacotes necessários
library(plm)

# define o caminho relativo do arquivo unemployment.csv
path_agri <- here::here("data/raw/Data_AgricultureClimate.csv")

# importa o arquivo
dados_agri <- readr::read_csv(path_agri)

# verifica a estrutura do objeto
dplyr::glimpse(dados_agri)
Rows: 14,200
Columns: 8
$ ano       <dbl> 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, …
$ vtotal    <dbl> 1264258.8, 737239.9, 1381728.0, 1547278.9, 1383899.7, 163200…
$ areatotal <dbl> 1388970, 1235817, 1059597, 941193, 991584, 972081, 1063953, …
$ tempano   <dbl> 22.86265, 23.21814, 22.73152, 23.19672, 23.60301, 23.55167, …
$ tempanodp <dbl> 4.272846, 3.081071, 3.306779, 3.720999, 3.519357, 2.998808, …
$ precano   <dbl> 1316.3407, 1414.5173, 1389.9879, 1319.8478, 1160.3283, 1492.…
$ precanodp <dbl> 10.838446, 12.051548, 10.824051, 9.625086, 10.305651, 11.647…
$ munic     <dbl> 3500105, 3500105, 3500105, 3500105, 3500105, 3500105, 350010…

Dados em Painel

  • Declare o objeto como uma df para dados em painel usando a função pdata.frame() do pacote plm, nomeie o objeto criado como agri_pd e exiba a estrutura dos dados em painel usando a função pdim, também do pacote plm:
agri_pd <- pdata.frame(dados_agri, index = c("munic", "ano"))
pdim(agri_pd)
Balanced Panel: n = 568, T = 25, N = 14200
  • Exibe as primeiras 26 obeservações do objeto agri_pd
head(agri_pd, 26)
              ano    vtotal areatotal  tempano tempanodp   precano precanodp
3500105-1990 1990 1264258.8   1388970 22.86265  4.272846 1316.3407 10.838446
3500105-1991 1991  737239.9   1235817 23.21814  3.081071 1414.5173 12.051548
3500105-1992 1992 1381728.0   1059597 22.73152  3.306779 1389.9879 10.824051
3500105-1993 1993 1547278.9    941193 23.19672  3.720999 1319.8478  9.625086
3500105-1994 1994 1383899.7    991584 23.60301  3.519357 1160.3283 10.305651
3500105-1995 1995 1632009.4    972081 23.55167  2.998808 1492.4040 11.647982
3500105-1996 1996 1910847.5   1063953 23.02875  3.409370 1152.8168  9.131358
3500105-1997 1997 1843234.7   1081377 23.31529  3.296005 1567.5603 10.897275
3500105-1998 1998 1812944.3   1046529 23.19375  3.455135 1389.1166  9.438434
3500105-1999 1999 2051107.5   1094841 23.47183  3.518524  980.5187  7.462520
3500105-2000 2000 1326583.7    969804 23.27866  3.855466 1268.0232  8.863539
3500105-2001 2001 2484606.3   1234827 23.63068  3.524630 1290.8452  9.092621
3500105-2002 2002 3081434.7   1445895 24.46877  3.400730 1026.9569  8.730663
3500105-2003 2003 2546356.2   1342341 23.49745  3.403117 1180.7192  8.541839
3500105-2004 2004 2503896.5   1463121 23.04267  3.649041 1224.7500  9.831753
3500105-2005 2005 2861892.0   1419561 23.41364  3.296626 1247.0122  9.437955
3500105-2006 2006 3008258.9   1273536 23.80656  3.295634 1511.0146 11.559646
3500105-2007 2007 3909081.1   1403127 24.15558  3.471190 1282.3023  9.389535
3500105-2008 2008 3452473.9   1560042 23.34564  3.164526 1083.7051  8.418116
3500105-2009 2009 3702484.3   1592217 23.35703  3.509578 1940.9464 14.676315
3500105-2010 2010 3326064.9   1571823 23.09775  3.375724 1312.7949 10.246465
3500105-2011 2011 3284135.7   1525095 22.95209  3.536957 1130.9613  8.458459
3500105-2012 2012 3603019.6   1514700 23.34242  3.645005 1269.6732 10.613371
3500105-2013 2013 3572662.4   1501038 22.53909  3.439130 1277.4219 11.539546
3500105-2014 2014 2756874.7   1415898 23.16971  3.339900 1117.6440  8.803157
3500204-1990 1990 1042861.2    607860 23.03726  3.703297 1314.6804  9.024720
               munic
3500105-1990 3500105
3500105-1991 3500105
3500105-1992 3500105
3500105-1993 3500105
3500105-1994 3500105
3500105-1995 3500105
3500105-1996 3500105
3500105-1997 3500105
3500105-1998 3500105
3500105-1999 3500105
3500105-2000 3500105
3500105-2001 3500105
3500105-2002 3500105
3500105-2003 3500105
3500105-2004 3500105
3500105-2005 3500105
3500105-2006 3500105
3500105-2007 3500105
3500105-2008 3500105
3500105-2009 3500105
3500105-2010 3500105
3500105-2011 3500105
3500105-2012 3500105
3500105-2013 3500105
3500105-2014 3500105
3500204-1990 3500204

Atualizando os Repositórios

Instruções

  1. No terminal do RStudio, verifique quais arquivos/pastas foram modificados ou criados com:
git status
  1. Você pode adicionar todos os arquivos de uma vez com:
git add .
  1. Execute git status novamente para confirmar que todos os arquivos foram adicionados (aparecerão em verde sob “Changes to be committed”):
git status
  1. Se tudo estiver em verde, faça um commit com uma mensagem descritiva:
git commit -m "atualizacoes aula 8"
  1. Se algum arquivo ou pasta ainda aparecer em vermelho após o segundo git status, adicione as pastas/arquivos um por um:
git add relatorios/04-relatorio/04-relatorio.qmd
  1. Execute git status novamente e faça o commit quando todos os arquivos estiverem em verde:
git commit -m "atualizacoes aula 8"
  1. Envie o repositório local atualizado para o GitHub:
git push origin main

Referências

BROMAN, K. W.; WOO, K. H. Data Organization in Spreadsheets. The American Statistician, v. 72, n. 1, p. 2–10, 2018.
MAIA, A. G.; MIYAMOTO, B. C. B.; GARCIA, J. R. Climate change and agriculture: do environmental preservation and ecosystem services matter? Ecological Economics, v. 152, p. 27–39, 2018.