Esta página destina-se aqueles que desejam realizar análises estatísticas utilizando o RStudio. Para deixar a explicação mais leve, as explicações e exemplos serão orientados à execução, e muitos conceitos que fundamentam a Estatística e a programação não serão abordados.
Trabalharemos a Estatística como uma ramo da Matemática Aplicada que
é utilizada para compreender os dados e investigar como eles variam,
criando modelos. Considerando a conjuntura atual, a capacidade de
trabalhar com grande quantidade de dados é um diferencial. As pessoas
que desenvolvem a competência de utilizar a ferramenta computacional
para trabalhar dados, inclusive em grandes quantidades, torna-se
diferenciada ao passo que consegue extrair evidências que apoiam suas
decisões.
Assim a Estatística e o R podem disponibilizam ferramentas que permitem
ao pesquisador ou analista realizar descobertas e validá-las a partir
dos dados.
A descrição dos dados é realizada por meio da Estatística Descritiva que
permiti organizar, resumir e apresntar de forma fácil uma grande
quantidade de dados. Se bem utilizada, pode ser uma grande facilitadora
para o entendimento dos fenômenos estudados.
Por sua vez, a Estatística Inferencial, ou Inferência Estatística, a
MOdelagem também são ramos que contribuem para a tomada de decisão e,
portanto, são de extrema valia para os pesquisadores e analistas.
Assim, a compreensão da Estatística permite que o tomador de decisões
explorar mais profundamente as ferramentas que estão ao seu alcance lhe
dando uma melhor compreensão de sua utilização, permitindo que chegue a
melhores resultados e, consequentemente, aprimorando a sua
competência.
Uma população (ou universo) é o conjunto de todos os elementos
(pessoas, objetos, eventos, medidas) que compartilham pelo menos uma
característica comum de interesse para o pesquisador. Ela representa o
“todo”. Ela pode ser finita, todos os alunos matriculados em uma
Universidade em 2025, ou infinita, com todos os possíveis resultados de
lançamentos de uma moeda.
Por sua vez, uma amostra é é um subconjunto representativo extraído da
população. Como raramente temos recursos ou tempo para observar toda a
população, trabalhamos com a amostra para realizar a inferência sobre a
população.
Uma amostra deve ter representatividade,
para que as conclusões sejam válidas, deve ser selecionada de forma que
reflita fielmente as características da população. e os Estimadores
(veja no próximo tópico) representam as características numéricas da
amostra.
Parâmetro é uma medida numérica que descreve uma
característica de toda a população. Ele é um valor fixo, porém, na
maioria das vezes, é desconhecido, pois é impossível medir todos os
indivíduos de um grupo imenso.
Geralmente representados por letras gregas como \(\mu\) (média populacional) ou \(\sigma\) (desvio padrão
populacional).
Exemplo: a média da altura de todos os brasileiros. Para se obter esses
dados teríamos que ter em tempo real a alturade toda população,
considerando os recém-nascidos e os que acabaram de morrer. Mesmo com a
digitalização da sociedade esse tipo de dado é de difícil
obtenção.
Estimador é uma regra ou fórmula matemática que
utilizamos em uma amostra para avaliar o valor do parâmetro
populacional. Ele é uma variável aleatória, pois seu resultado depende
de qual amostra você coletou.
Estimativa: É o valor numérico específico que o estimador produz após
você aplicar os dados da amostra na fórmula.
Geralmente representados por letras latinas com um “chapéu” ou barra,
como \(\bar{X}\) (média amostral) ou
\(\hat{p}\) (proporção amostral).
| Conceito | Refere-se a… | Natureza | Símbolo Típico |
|---|---|---|---|
| Parâmetro | População | Fixo e Desconhecido | Letras Gregas (\(\mu, \sigma, \pi\)) |
| Estimador | Amostra | Variável (Fórmula) | Letras Latinas (\(\bar{X}, S, \hat{p}\)) |
Tabela: Diferenças Fundamentais entre Parâmetro e Estimador
No R utilizamos o comando ‘sample(’populacao’, size = ‘tamnhano da
amostra’)’ para obtermos uma amostra de uma base de dados. Esse comando
é muito utilizado, por exemplo, para treinamento de modelos.
Para se escolher a técnica de análise de dados é essencial saber como
eles são entendidos e medidos ou registrados.Para isso utilizaremos as
seguintes definições:
1. Escalas Não Métricas (Qualitativas)
Estas escalas medem características ou categorias. Não são sujeitas às propriedades matemáticas de soma ou média.
Escala Nominal - é o nível mais baixo de mensuração. Serve apenas para identificar ou categorizar. Os números atribuídos são apenas rótulos.
Exemplo: Sexo (1=Masc, 2=Fem), Estado Civil, CEP.
Nesse tipo de dado é possível contar frequências (Moda).
Escala Ordinal - além de categorizar, esta escala estabelece uma ordem ou ranking. Sabemos que uma categoria é “maior” ou “melhor” que a outra, mas não sabemos o quanto exatamente.
Exemplos: nível de escolaridade, ranking de preferência de marcas, classe social.
É possível calcular mediana e cálculos de ordem.
2.Escalas Métricas (Quantitativas)
Nessas escalas os números possuem valor matemático real e permitem operações aritméticas.
Escala Intervalar - a ordem e a distância entre os pontos é constante. No entanto, o zero é arbitrário (não significa ausência total da característica).
Exemplo: Temperatura em Celsius (0°C não significa “sem temperatura”).
O que você pode fazer: Média, desvio padrão e a maioria das correlações.
Escala de Razão (Ratio) - é o nível mais alto de medida, porque possui todas as características das anteriores e tem um zero absoluto (o zero significa inexistência).
Exemplo: Peso, altura, idade, faturamento, tempo de reação.
O que você pode fazer: Todas as operações matemáticas, incluindo razões (ex: “A empresa X fatura o dobro da empresa Y”).
| Escala | Tipo de Dado | Propriedade Principal | Exemplo Prático |
|---|---|---|---|
| Nominal | Não Métrico | Identificação / Categoria | Tipo de Sangue |
| Ordinal | Não Métrico | Ordem / Ranking | Nível de Satisfação |
| Intervalar | Métrico | Distância Constante | Temperatura (°C) |
| Razão | Métrico | Zero Absoluto | Renda Mensal ($) |
Erro de medida é o grau em que os valores observados não são
representativos dos valores “verdadeiros”. Nenhum instrumento de medida
— seja um questionário de satisfação ou um sensor físico — é
perfeito.
Exemplos:
uso de escalas de inadequadas – exemplo: dobro da temperatura em ºC.
Imprecisão do instrumento: perguntas mal formuladas em um questionário que confundem o respondente.
Influências externas: O humor do respondente no dia, cansaço ou fatores ambientais.
Ao avaliar o grau de erro de medida, o pesquisador deve considerar duas importantes características:
Validade é o grau em que uma medida representa
precisamente aquilo que se espera.
A garantia da validade começa com uma compreensão direta do que deve ser
medido e então realizar a medida tão “correta” e precisa quanto
possível.No entanto, valores exatos não garantem validade.
Uma boa dica em um questionário, por exemplo, é atentar para a pergunta
“correta”.
Confiabilidade é o grau em que a variável
observada mede o valor “verdadeiro” e está “livre de erro”.
Se a mesma medida for feita repetidamente, por exemplo, medidas mais
confiáveis mostrarão maior consistência do que medidas menos
confiáveis.
O pesquisador sempre deve avaliar as variáveis empregadas e, se medidas
alternativas válidas estão disponíveis, escolher a variável com a maior
confiabilidade.
O Impacto do Erro de Medida O grande alerta dos autores é que o erro de medida não é apenas um detalhe estatístico; ele altera fundamentalmente as conclusões da pesquisa de três formas principais:
A. Redução da Validade e Confiabilidade O impacto mais direto é que o erro “suja” a variável. Se o erro for muito alto, a variável deixa de representar o conceito que você quer estudar.
Exemplo: Se você mede “Estresse” com perguntas ambíguas, pode estar medindo “Cansaço” por erro de design.
B. Atenuação das Correlações (O efeito “Esponja”) Este é um impacto técnico vital para a pós-graduação: o erro de medida enfraquece as relações entre as variáveis.
Se a Variável A causa a Variável B, mas ambas têm muito erro de medida, a correlação estatística entre elas parecerá muito menor do que é na realidade. O erro “absorve” a força da relação.
C. Distorção dos Modelos de Regressão Em modelos multivariados, o erro de medida pode levar a resultados falsos:
Pode tornar uma variável importante em algo “não significante”.
Pode superestimar o efeito de uma variável em detrimento de outra.
| Conceito | Definição por Hair et al. | Impacto Principal |
|---|---|---|
| Erro de Medida | Diferença entre o valor observado e o real. | Diminui a precisão da descoberta científica. |
| Impacto na Relação | Efeito de atenuação (enfraquecimento). | Subestima a força das correlações reais. |
| Impacto no Modelo | Viés nos coeficientes. | Pode ocultar variáveis que são realmente importantes. |
Tabela: Resumo sobre Erro de Medida (Fonte: Hair et al., 2009)
Como mitigar o erro de medida Hair e Black sugerem
que, para reduzir o impacto do erro de medida, o pesquisador deve:
Usar Múltiplos Indicadores- em vez de uma única pergunta para medir um
conceito, use 3 ou 4 (o que chamamos de variáveis latentes).
Testar a Confiabilidade - sempre calcular o Alfa de Cronbach ou a
Confiabilidade Composta no RStudio antes de avançar para modelos
complexos.
O que são Dados em Pesquisa?
Dados são informações brutas, fatos, números ou observações que
coletamos e analisamos para responder a uma pergunta de pesquisa, testar
uma hipótese, analisar ou explorar um fenômeno.
A forma como esses dados são coletados — ou por quem foram coletados
originalmente — define se eles são primários ou secundários.
Dados Primários:
Imagine que você quer saber a opinião dos estudantes da sua universidade
sobre o ensino à distância. Se você mesmo criar uma pesquisa e aplicá-la
diretamente a esses estudantes, estará coletando dados primários.
Definição - dados Primários são informações coletadas
diretamente pelo pesquisador (ou por sua equipe) para um objetivo
específico de pesquisa que ele próprio definiu. São dados
originais, que não existiam antes de serem coletados
para o seu estudo.
Características Principais
Originalidade: São gerados pela primeira vez.
Especificidade: Coletados para resolver um problema ou responder a uma
pergunta de pesquisa específica do pesquisador.
Controle: O pesquisador tem total controle sobre o método de coleta,
amostragem e a forma como os dados são registrados.
Vantagens de se utilizar dados primários
Relevância - são perfeitamente alinhados aos objetivos da sua
pesquisa.
Atualidade - geralmente mais recentes e atualizados.
Precisão e Confiabilidade - você conhece a metodologia de coleta e pode
verificar a fonte.
Exclusividade - podem oferecer insights únicos que não estão disponíveis
em outras fontes.
Desvantagensde se utilizar dados primários
Custo: Frequentemente mais caros para coletar (recursos financeiros e
humanos).
Tempo: Demandam mais tempo para planejamento, coleta e
processamento.
Esforço: Requerem um grande investimento de energia e
planejamento.
Exemplos de métodos de coleta de dados primários
Pesquisas (questionários, enquetes).
Entrevistas (individuais ou em grupo).
Experimentos.
Observações diretas.
Grupos focais.
Diários de campo.
Dados secundários
Imagine que você quer entender o impacto do ensino à distância no
desempenho acadêmico dos estudantes universitários no Brasil, e para
isso, você utiliza relatórios do Ministério da Educação ou artigos
científicos que já analisaram esse tema. Neste caso, você está
utilizando dados secundários.
Definição - são informações que já foram coletadas,
processadas e publicadas por outra pessoa ou instituição para um
propósito diferente da sua pesquisa atual. Você os está
“reutilizando”.
Características Principais Pré-existência: já estão
disponíveis, não são coletados por você.
Propósito Diferente: foram coletados para um objetivo que não era
originalmente o seu. Acesso: geralmente mais fácil de acessar.
Vantagens de se utilizar dados secundários
Custo-Efetividade: muito mais baratos ou até gratuitos.
Economia de Tempo: a coleta já foi feita, poupando tempo valioso.
Acesso a Grandes Amostras: permite analisar dados de grandes populações
ou em escalas geográficas amplas.
Análise de Tendências: úteis para identificar tendências históricas ou
fazer comparações.
Contexto: Podem fornecer um contexto importante antes de uma pesquisa
primária.
Desvantagens de se utilizar dados secundários
Relevância Limitada: Podem não se encaixar perfeitamente nos seus
objetivos de pesquisa.
Acurácia e Confiabilidade: Você não teve controle sobre a coleta; a
qualidade pode variar. Atualidade: Podem estar desatualizados.
Disponibilidade: Nem sempre contêm as variáveis ou o nível de detalhe
que você precisa.
Viés: A metodologia original pode ter vieses que você não consegue
controlar.
Exemplos de fontes de dados secundários
Relatórios governamentais (IBGE, Banco Central, Ministério da Saúde,
etc.).
Artigos científicos e teses.
Livros e publicações periódicas.
Bancos de dados online (acadêmicos, comerciais).
Registros internos de empresas (vendas, RH).
Notícias e mídias sociais.
Censo demográfico.
| Característica | Dados Primários | Dados Secundários |
|---|---|---|
| Origem | Coletados pelo próprio pesquisador. | Coletados por outros para outro propósito. |
| Custo | Geralmente alto. | Geralmente baixo ou gratuito. |
| Controle | Alto controle sobre a metodologia. | Nenhum controle sobre a metodologia original. |
| Atualidade | Geralmente muito atual. | Pode estar desatualizado. |
A Linguagem R foi criada em 1991 por Ross Ihaka e Robert Gentleman no
Departamento de Estatística da Universidade de Auckland, na Nova
Zelândia. Ela é derivado da linguagem comercial S desenvolvida nos Bell
Labs na década de 1970, o que lhe confere uma base sólida e intrínseca
para a computação estatística e gráfica.
Em 1993 houve o anúncio público do R que enfrentava fárias restrições
por ser derivada de uma linguagem comercializada. Por causa desse
problema, seus criadores decidiram adotar o GNU General Public License,
tornando o R um software livre. Isso permitiu que a linguagem fosse
amplamente utilizada e desenvolvida pela comunidade, tendo a sua
primeria versão (1.0.0) sido lançada em 2000.
Essa herança significa que o R foi projetado desde o início com
estatísticos e pesquisadores em mente, incorporando estruturas de dados
e funções otimizadas para manipulação, análise e visualização de dados
de forma nativa. Sua sintaxe facilita as operações matriciais e
vetoriais, comuns em estatística. Isso o torna uma ferramenta robusta e
flexível para desenvolvimento de novos métodos estatísticos, simulações
e análise de dados, sendo amplamente adotado em universidades e centros
de pesquisa.
Atualmente, o R é oferecido de forma gratuita a partiri dos
Comprehensive R Archive Network (CRAN) e é compatível
com sistemas operacionais como Linux, Mac e Windows, além de poder ser
operado diretamente na nuvem. Uma grande comunidade ativa oferece
suporte, documentação e recursos de aprendizado abundantes que aliada à
sua arquitetura de pacotes permite o desenvolvimento de funcionalidades
especializadas, tornando o R adaptável a praticamente qualquer domínio
de análise (econometria, bioinformática, aprendizado de máquina, etc.),
o que o tornou um software com Capacidades Gráficas Avançadas, com
ferramentas poderosas para visualização de dados, desde gráficos básicos
até visualizações interativas complexas.
O RStudio é um Ambiente de Desenvolvimento Integrado
(IDE), também ofertado gratuitamente, que oferece ferramentas
para aumentar a produtividade dos desenvolvedores. Também possui versões
pagas que disponibilizam mais recursos.
Antes da instalação do RStudio, é necessário
instalar o R.
A instalação do R é simples e é possível a
partir dos links:
Repositório geral
R para
Windows
R para Mac
R para linux
O R dispõe de ampla documentação que pode ser encontrada em:
Perguntas e
respostas
De forma similar, a instalação do RStudio é
simples. Sugiro a versão free desktop.
Ao acessar o link, você irá perceber que existem 4 versões, sendo duas
para desktop e duas para servidores. O RStudio Desktop, com o qual
trabalharemos, destina-se aqueles que irão atuar individualmente; já os
servidores, são para aqueles que trabalharão em equipes e com
compartilhamento de informações, ou ainda, para uma empresa com muitos
usuários do aplicativo.
As versões pagas possuem mais recursos e suporte. Preste atenção para
baixar a solução pretendida (RStudio
Desktop).
Atente para escolher a versão para o sistema operacional de seu
computador.
Após instalar o R, então instale o RStudio.
Vídeo - Instalando o RStudio.
Você ainda tem a oportunidade de trabalhar com o RStudio na web. Isso
facilita àqueles que não têm uma estação de trabalho fixa e precisam
salvar seus arquivos na nuvem, e também, aqueles que tem limitações de
desempenho em seus computadores pessoais, ou ainda, aqueles que utilizam
um computador do trabalho que tem restrições para instalar
programas.
Fique atento porque a versão free do RStudio Cloud
tem limite de tempo para utilização. Portanto,
fique logado somente o tempo em que estiver trabalhando, deslogando logo
em seguida.
Para acessar o RStudio na nuvem, acesse o link RStudio Cloud, faça seu cadastro e
comece a trabalhar.
Vídeo entenda o RStudio Cloud - Entenda o RStudio Cloud
O RStudio apresenta 4 grandes ambientes:
1. um local onde escreveremos os códigos; 2. um console em que veremos
os resultados de nossos códigos; 3. um ambiente no qual podemos ver o
estados de nossas variáveis; e 4. um pequeno navegador.
Cada um desses ambientes é dividido em abas com diversas
funcionalidades. Para entender melhor, veja o vídeo a seguir.
Vídeo conhecendo o RStudio - Conhecendo o RStudio.
Pacotes no R são extensões da linguagem que agrupam funções, dados e
documentação em um formato padronizado. Eles servem para expandir as
capacidades básicas do R, permitindo realizar tarefas específicas como
gráficos avançados, análise geoespacial ou bioestatística, sem precisar
escrever códigos complexos.
Eles podem ser encontrados em repositórios em diversas partes do mundo,
os CRAN que podem ser acessados pela internet normal https://cran.rstudio.org/. No entanto, no RStudio existe
um caminho mais fácil, onde você pode acessar o menu Tools, Install
Packages e digitar o nome do pacote desejado.
Esses pacotes são baixados e instalados no seu computador em um local
específico, a biblioteca (library) onde ficam todos os pacotes.
Os pacotes contém:
Funções: Códigos prontos para executar ações (ex: ggplot() para
gráficos). Documentação: Manuais e arquivos de ajuda que explicam como
usar as funções. Dados: Conjuntos de dados de exemplo para prática e
testes. Metadados: Arquivos como o DESCRIPTION, que listam a versão,
autor e dependências do pacote.
Depois de instalados, eles precisam ser “ligados” ou “chamados” para que
funicionem no seu código, por isso, como boa prática, recomendo que logo
no início de seu programa você crie um espaço para chama-los. Eles são
“chamados” com o comando
library(nome_do_pacote).
Neste tópico iremos entender os tipos de dados e as operações básicas.
No RStudio é possível se editar os programas e salvá-los. O editor do
RStudio destaca as palavras reservadas (comandos) , facilitando o seu
gerenciamento.
Recomendo que seja definida uma pasta onde devem ser guardados todos os
códigos produzidos, isso facilitará a sua recuperação e a manutenção de
um histórico de trabalho.
Sempre que for iniciar um código, faça um cabeçalho, indicando quem está escrevendo (no caso, você), a data de criação e alteração, o local, e a finalidade do código. Utilize o comando “#” no início da linha para para que essas informações não sejam entendidas como uma instrução ao computador.
O comentário serve para explicar algo sobre o código e é muito utilizado para a permitir o entendimento da lógica do programador.
# Isto é um comentário. O comentário é utilizado para documentar o código, explicando a lógica e ideias do programador.
Identificador é o nome pelo qual chamaremos um endereço na memória do computador. Esse endereço pode conter uma variável, uma estrutura de dados com diversos registros ou funções. A seguir vamos entender cada um desses nomes.
Preste bastante atenção: o RStudio é case sensitive,
distingue as letras maiúsculas das minúsculas do nome desses
identificadores, então, CUIDADO tenha muita
atenção na atribuição dos nomes pois a digitação trocada de um caracter
pode gerar erro no seu código. Por exemplo: se você digitar x é
diferente do que digitar X.
Os identificadores também não podem ser iniciados com números ou
**“_”, por exemplo, os identificadores são
INVÁLIDOS:**:
1_media_idade
‘_media’
Uma boa prática para quando for necessário identificar a variável com
mais de uma palavra é ressaltar essas palavras com a primeira letra
maiúscula ou separá-las como , por exemplo:
MediaIdade - essa notação é chamada de CamelCase;
ou
media_idade - essa notação é chamada de snake_case.
A escolha de bons identificadores é crucial para a
legibilidade, manutenibilidade e
colaboração em projetos de R. Nomes descritivos e
consistentes tornam o código mais fácil de entender não apenas para quem
o escreveu (seja semanas ou meses depois), mas também para outros
membros da equipe. Identificadores claros reduzem a ambiguidade,
minimizam a necessidade de comentários e diminuem a probabilidade de
erros de lógica ou de refatoração. Em projetos de longo prazo, a
manutenção e a expansão do código são significativamente facilitadas
quando as variáveis e funções possuem nomes que refletem claramente seu
propósito e conteúdo, aderindo a convenções de estilo (como snake_case
ou camelCase).
De forma bastante simples, podemos entender uma variável em
programação é um espaço de memória onde se armazenam dados para serem
utilizados nas instruções (algoritmos).
O R trabalha com os seguintes tipos básicos de dados que podem ser
organizados em estruturas de dados como vetores, matrizes, data frames e
listas:
numéricos - não fazem distinção aparente entre inteiros ou reais, e a notação é em inglês, o “.” (ponto) separa a fração e a “,” (vírgula) separa os decimais.
Os tipos de dados numéricos são:
int - inteiros - utilizam menos memória e são representados por um ‘L’ após o numeral, ‘5L’, ;
dbl - representa números de ponto flutuante, ou números
reais. Ocupam mais memória. Exemplo: Atribuindo o valor 5 a uma variável
x:
x <- 5L para inteiro, ou
y <- 5 para flutuante.
x <- 5L # variável x recebe o numeral 5 inteiro
x
## [1] 5
y <- 5
y
## [1] 5
Ao criar uma variável o computador cria um endereço capaz de
armazenar dados. Esse endereço é o nome da variável, no caso ‘x’ e
‘y’.
Ambas as variáveis armazenam o valor 5, porém ‘x’ por ser inteiro, ocupa
menos espaço de memória, enquanto ‘y’ permite cálculos mais
precisos.
Essa diferença de espaço de memória é insignificante quando trabalhamos
com poucos dados, mas pode ser bastante relevante quando se trabalha com
grande quantidade de dados.
textos - armazenam valor em letras ou texto.
a <- "O RStudio é uma ferramenta poderosa." # variável a armazena texto
a
## [1] "O RStudio é uma ferramenta poderosa."
lógicos - armazenam verdadeiro (TRUE) ou falso (FALSE).
Em R, os valores booleanos TRUE e FALSE são a
própria essência do tipo de dado logical. Ou seja, o tipo
de dado logical é o que armazena esses valores
booleanos.
# 1. Criar as variáveis
verdadeiro <- TRUE
falso <- FALSE
2 # Imprimir
## [1] 2
print(verdadeiro) # Tipo é logical
## [1] TRUE
print(as.numeric(verdadeiro)) # Converte para numérico
## [1] 1
print(as.numeric(falso)) # Converte para numérico
## [1] 0O R tem uma capacidade de coerção implícita que permite que
logical seja tratado como numérico em certas operações: *
TRUE é convertido para 1. * FALSE
é convertido para 0. Exemplo:
# 1. Criar as variáveis
verdadeiro <- TRUE
falso <- FALSE
# 2. Realizar os cálculos com os valores implícitos das variáveis booleanas
soma <- verdadeiro + verdadeiro + falso + falso + verdadeiro
3 # Imprimir o resultado do passo '2'
## [1] 3
print(soma) # Será apresentado o valor de 'verdadeiros' da sentença aritmética.
## [1] 3
datas - existem funções criadas para trabalharem com esse tipo de dados, facilitando muito as operações, em especial as séries temporais e os gráficos. As datas podem ser representadas por dois tipos de dados.
# 1. Criar as variáveis
data_inicio <- as.Date("2026-01-26")
data_fim <- as.Date("2026-02-10")
# 2. Realizar os cálculos com as datas
diferenca_dias <- data_fim - data_inicio
3 # Imprimir a diferença calculada em '2'
## [1] 3
print(diferenca_dias)
## Time difference of 15 days
- dttm - representa datas e horas (uma data + uma hora). É utilizado o pacote **`lubridate`** e que possui o objeto 'POSIXct'.
Exemplo: Em muitas análises financeiras ou de séries temporais, é fundamental manipular datas e horas. Veja como você extrairia o ano, o mês e a hora desse objeto.
# 1. Criar um objeto POSIXct (data e hora)
data_hora <- as.POSIXct("2026-01-26 08:15:00", tz = "UTC")
2 # Imprimir a variável 'data_hora'
## [1] 2
print(data_hora)
## [1] "2026-01-26 08:15:00 UTC"
# 3. Extrair ano, mês e hora
ano <- format(data_hora, "%Y")
mes <- format(data_hora, "%m")
hora <- format(data_hora, "%H")
4 # Imprimir os resultados
## [1] 4
print(ano)
## [1] "2026"
print(mes)
## [1] "01"
print(hora)
## [1] "08"
fator - é um tipo de dado que o R utiliza para representar as variáveis categóricas, facilitando a criação de gráficos e as análises estatísticas. É utilizado em vetor, por isso, caso você não conheça sobre vetores no R, para melhor compreensão veja o tópico seguinte ‘Vetores’ antes.
# 1. Criar um vetor com os níveis de qualidade dos equipamentos.
qualidade_raw <- c("Bom", "Regular", "Bom", "Ruim","Regular","Bom","Bom")
# 2. Definir os níveis em ordem
niveis_qualidade <- c("Bom", "Regular", "Ruim")
# 3. Converter para fator com níveis ordenados
qualidade_fator <- factor(qualidade_raw, levels = niveis_qualidade, ordered = TRUE)
4 # Imprimir resultados
## [1] 4
print(qualidade_fator)
## [1] Bom Regular Bom Ruim Regular Bom Bom
## Levels: Bom < Regular < Ruim
print(levels(qualidade_fator))
## [1] "Bom" "Regular" "Ruim"Para formulação de análises e gráficos, é muito útil o comando ‘table’ que faz a contagem dos fatores. Exemplo:
table(qualidade_fator)
## qualidade_fator
## Bom Regular Ruim
## 4 2 1
Vetores - podem armazenar números, caracter, boolenos, ou textos - os vetores armazenam apenas dados de um mesmo tipo.
Criando um vetor de números:
vetor <- c(10, 20, 30, 40, 50)
vetor <- c(10, 20, 30, 40, 50) # um vetor contendo 5 números
vetor
## [1] 10 20 30 40 50
# para chamar apenas um dado armazenado no vetor, utilize a notação vetor[posição].
vetor[2] # vai chamar o dado armazenado na segunda posição, no caso, o número 20
## [1] 20
Criando um vetor com nomes:
vetor_a <- c(“aluno”, “idade”, “série”)
vetor_a <- c("aluno", "idade", "série") # um vetor contendo 3 nomes
vetor_a
## [1] "aluno" "idade" "série"
vetor_a[3] # chamando o dado da terceira posição, no caso a palavra "série"
## [1] "série"
1:10 - este comando cria uma sequência de números variando de 1 até
10.
Caso essa sequencia seja adicionada ao uma variável, criaremos um vetor
de 10 posições com essa sequência.
x <- 1:10 x <- seq(1:10) - este comando é similar ao de cima, no
entanto ele pode ser incrementado com alguns argumento.
x <- seq(from = 1, to = 50, by = 2)
1:10
## [1] 1 2 3 4 5 6 7 8 9 10
x <- 1:10
x
## [1] 1 2 3 4 5 6 7 8 9 10
x <- seq(1:10)
x
## [1] 1 2 3 4 5 6 7 8 9 10
seq(from = 1, to = 10, by = 2)
## [1] 1 3 5 7 9
seq(from = 5, to = -5, by = -2)
## [1] 5 3 1 -1 -3 -5
seq(from = 1, to = 3, by = 0.2)
## [1] 1.0 1.2 1.4 1.6 1.8 2.0 2.2 2.4 2.6 2.8 3.0
Podemos criar repetição de nomes ou números com o comando:
rep(“nome”, 5)
De forma similar, podemos atribuir essa repetição à uma variável,
criando um vetor:
x <- rep(“nome”, 5)
rep("nome", 5)
## [1] "nome" "nome" "nome" "nome" "nome"
x <- rep("nome", 5)
x[3]
## [1] "nome"
rep(7, 5)
## [1] 7 7 7 7 7
Podemos criar uma sequência de datas.
# 1. Criando uma variável com o tipo data
data_inicio <- as.Date("2023-01-01")
# 2. Criando a sequência de datas por mês com 24 meses
sequencia_datas_2023 <- seq(from = data_inicio, by = "month", length.out = 24)
3 # Imprimindo a sequencia de dados criada
## [1] 3
print(sequencia_datas_2023)
## [1] "2023-01-01" "2023-02-01" "2023-03-01" "2023-04-01" "2023-05-01"
## [6] "2023-06-01" "2023-07-01" "2023-08-01" "2023-09-01" "2023-10-01"
## [11] "2023-11-01" "2023-12-01" "2024-01-01" "2024-02-01" "2024-03-01"
## [16] "2024-04-01" "2024-05-01" "2024-06-01" "2024-07-01" "2024-08-01"
## [21] "2024-09-01" "2024-10-01" "2024-11-01" "2024-12-01"
Matrizes - armazenam matricialmente diversos dados de um mesmo tipo (ou texto, ou número ou booleano).
Vídeo criando vetores e matrizes - Criando vetores e matrizes
Criando uma matriz chamada mat:
mat <- matrix(data = c(10, 20, 30, 40), nrow = 2, ncol =
2)
data = representa os dados que serão inseridos na matriz.
c(10, 20, 30, 40) são os dados, no caso um conjunto de 4
números.
nrow = 2 indica que a matriz terá duas linhas.
ncol = 2 indica que a matriz terá duas colunas.
Como padrão, os dados serão organizados por coluna, ou seja, o
preenchimento da matriz será realizado preenchendo-se a 1ª coluna e
depois a 2ª coluna.
mat <- matrix(data = c(10, 20, 30, 40), nrow = 2, ncol = 2) # uma matriz de 2 linhas e 2 colunas de zeros
mat
## [,1] [,2]
## [1,] 10 30
## [2,] 20 40
# para chamar apenas um dado armazenado na matriz, utilize a notação matriz[linha, coluna]
mat[2,1] # chamará o valor armazenado na segunda linha e primeira coluna, no caso, o valor 20
## [1] 20
Criando uma matriz de texto chamada mat_a:
mat_a <- matrix(data = “aluno”, nrow = 2, ncol = 2)
1
## [1] 1
mat_a <- matrix(data = "aluno", nrow = 2, ncol = 2) # uma matriz de texto com a palavra aluno repetida 4 vezes.
mat_a
## [,1] [,2]
## [1,] "aluno" "aluno"
## [2,] "aluno" "aluno"
2
## [1] 2
mat_a1 <- matrix(data = c("aluno","classe","professor","teste"), nrow = 2, ncol = 2) # uma matriz de texto com as palavras aluno, classe, professor e teste.
# lembre-se que o preenchimento da matriz se dará por coluna
mat_a1
## [,1] [,2]
## [1,] "aluno" "professor"
## [2,] "classe" "teste"
mat_a1[2,1] # irá retornar o dado da 2ª linha 1ª coluna, no caso o valor 'classe'.
## [1] "classe"
3
## [1] 3
# para fazer o preenchimento por linha utilize a instrução byrow
mat_a1 <- matrix(data = c("aluno","classe","professor","teste"), nrow = 2, ncol = 2, byrow=TRUE)
mat_a1
## [,1] [,2]
## [1,] "aluno" "classe"
## [2,] "professor" "teste"
mat_a1[2,1] # irá retornar o dado da 2ª linha 1ª coluna, no caso o valor 'professor'.
## [1] "professor"
Podemos atribuir nomes às colunas e linhas de uma matriz
colnames(mat) <- c(“linha1”, “linha2”))
O comando acima atribui os nomes coluna1 e coluna2 para as colunas da
matriz.
colnames(mat) <- c("coluna1", "coluna2")
mat
## coluna1 coluna2
## [1,] 10 30
## [2,] 20 40
rownames(mat) <- c(“linha1”, “linha2”))
O comando acima atribui os nomes linha1 e linha 2 para as linhas da
matriz.
rownames(mat) <- c("linha1", "linha2")
mat
## coluna1 coluna2
## linha1 10 30
## linha2 20 40
Também podemos criar os nomes das coluna diretamente na matriz
dados <- c(10, 12, 11, 13, 8, 9, 10, 13, 12, 18, 17, 19)
# 2. Criando a matriz
matriz <- matrix(dados,
nrow = 3, ncol = 4, byrow = TRUE,
dimnames = list(
c("Linha A", "Linha B", "Linha C"),
c("Coluna1", "Coluna2", "Coluna3", "Coluna4")))
# O nome da linhas é o primeiro vetor da lista; e as colunas o segundo vetor da lista
# Para entender o que é uma lista, veja o proximo tópico, 'Listas'
3 # Imprimindo a matriz
## [1] 3
print(matriz)
## Coluna1 Coluna2 Coluna3 Coluna4
## Linha A 10 12 11 13
## Linha B 8 9 10 13
## Linha C 12 18 17 19
As matrizes podem ser acessadas pelo número de suas linhas e
colunas.
As matrizes que possuem nomes podem ser chamdas pelos nomes de suas
linhas e colunas.
Criando uma matriz para praticar a chamada.
# Criando uma matriz com 3 disciplinas e 5 alunos
# este comando gerará um "warnnig" porque a sequencia 6:9 não é múltiplo de 5 (quantidade de linhas da matriz), mas foi feito propositalmente para haver variação de notas entre os alunos e disciplinas.
notas <- matrix(6:9, nrow = 5, ncol = 3)
notas
## [,1] [,2] [,3]
## [1,] 6 7 8
## [2,] 7 8 9
## [3,] 8 9 6
## [4,] 9 6 7
## [5,] 6 7 8
# Atribuindo nomes às colunas e linhas
colnames(notas) <- c("disciplina1", "disciplina2", "disciplina3")
rownames(notas) <- c("aluno1", "aluno2", "aluno3", "aluno4", "aluno5")
notas
## disciplina1 disciplina2 disciplina3
## aluno1 6 7 8
## aluno2 7 8 9
## aluno3 8 9 6
## aluno4 9 6 7
## aluno5 6 7 8
# Chamando a nota do aluno2, disciplina3. Repare que os nomes aparecem entre aspas dentro dos colchetes.
notas[2,3]
## [1] 9
ou,
notas["aluno2", "disciplina3"]
## [1] 9
# Chamando todas as notas do aluno3
notas[3,]
## disciplina1 disciplina2 disciplina3
## 8 9 6
ou,
notas["aluno3",]
## disciplina1 disciplina2 disciplina3
## 8 9 6
# Chamando as colunas, no caso, as notas de uma disciplina
notas[,2]
## aluno1 aluno2 aluno3 aluno4 aluno5
## 7 8 9 6 7
ou,
notas[,"disciplina2"]
## aluno1 aluno2 aluno3 aluno4 aluno5
## 7 8 9 6 7
Ainda podemos chamar mais de uma linha (ou coluna) simultâneamente
utilizando o intervalo desejado no comando c(incio:fim), no
caso de serem sequenciais. Ou ainda, c(linha x, linha y, linha
z). Ou ainda, a combinação de ambos: c(incio:fim, linha
x).
Acessando as linhas 1 e 2 e a coluna 2
notas[c(1:2), 2]
## aluno1 aluno2
## 7 8
ou,
notas[c(1:2), "disciplina2"]
## aluno1 aluno2
## 7 8
Acessando as linhas 1, 2 e 5 e a coluna 2
notas[c(1:2,5), 2]
## aluno1 aluno2 aluno5
## 7 8 7
ou,
notas[c(1:2,5), "disciplina2"]
## aluno1 aluno2 aluno5
## 7 8 7
Acessando as linhas 1 e 2 e as colunas 2 e 3.
notas[1:2, c(2:3)]
## disciplina2 disciplina3
## aluno1 7 8
## aluno2 8 9
Em matrizes numéricas é possível somar suas linas ou colunas.
# 1. Criando a matriz para exemplificar
matriz <- matrix(c(10, 12, 11, 13, 8, 9, 10, 13, 12, 18, 17, 19),
nrow = 3, ncol = 4, byrow = TRUE,
dimnames = list(
c("Linha A", "Linha B", "Linha C"),
c("Coluna1", "Coluna2", "Coluna3", "Coluna4")))
2 # Imprimindo a matriz
## [1] 2
matriz
## Coluna1 Coluna2 Coluna3 Coluna4
## Linha A 10 12 11 13
## Linha B 8 9 10 13
## Linha C 12 18 17 19
3 # Realizando a soma de linhas
## [1] 3
rowSums(matriz)
## Linha A Linha B Linha C
## 46 40 66
4 # Realizando a soma de colunas
## [1] 4
colSums(matriz)
## Coluna1 Coluna2 Coluna3 Coluna4
## 30 39 38 45
Data.frame é uma estrutura de dados similar a matriz. No entanto,
cada coluna pode ter um tipo distinto de variável, por exemplo, uma
coluna com tipo texto e outra com tipo numérico.
Criando um data.frame chamado df:
df <- data.frame(nome = c(“Adriano”, “José”, “Maria”, “Ana”), idade =
c(55, 15, 23, 35))
# um data.frame com duas colunas, a primeira com nomes, e a segunda com idades.
# relembrando: os data.frames são tabelas que armazenam diversos tipos de dados - atenção, uma coluna, também chamada de variável, pode armazenar apenas um tipo de dado.
df <- data.frame(nome = c("Adriano", "José", "Maria", "Ana"), idade = c(55, 15, 23, 35))
df
## nome idade
## 1 Adriano 55
## 2 José 15
## 3 Maria 23
## 4 Ana 35
Os data.frames, de forma similar às matrizes, podem receber nomes para as colunas e linhas. Os comandos são similares aos das matrizes.
colnames(df) <- c(“NOMES”, “IDADES”)
rownames(df) <- rep(“Aluno”,7)
# Atribuindo nomes às colunas e linhas de um data.frame df
colnames(df) <- c("NOMES", "IDADES")
rownames(df) <- c("Aluno1","Aluno2", "Aluno3", "Aluno4")
df
## NOMES IDADES
## Aluno1 Adriano 55
## Aluno2 José 15
## Aluno3 Maria 23
## Aluno4 Ana 35
Também, de forma similar à matriz, podemos realizar as chamadas de um data.frame.
df[“Aluno1”,“IDADES”]
df["Aluno1","IDADES"]
## [1] 55
Ou ainda, podemos realizar as chamadas das colunas utilizando o “$”.
df$NOMES
## [1] "Adriano" "José" "Maria" "Ana"
Ou ainda, podemos realizar as chamadas das colunas utilizando o “$” e a linha desejada entre colchetes.
df$NOMES[3]
## [1] "Maria"
| Método | Retorno Padrão | Uso Principal |
|---|---|---|
df$col |
Vetor | Uso rápido no console e cálculos simples. |
df[, "col"] |
Vetor | Programação e seleção dinâmica. |
df["col"] |
Data-frame | Quando você precisa manter a estrutura de tabela. |
df[[1]] |
Vetor | Extração segura dentro de listas ou loops. |
Lista é um tipo de variável que pode conter diversos tipos de dados, variáveis numéricas, texto, matrizes e df.
Criando uma lista chamada de lista utilizando as variáveis criadas anteriormente: lista <- list(a, x, vetor, vetor_a, mat, mat_a, df)
# Criando uma lista chamada 'lista'
lista <- list(texto = a,
vet = vetor,
vet_a = vetor_a,
mat_num = mat,
mat_nom = mat_a,
df =df)
# uma lista armazena diversos tipos de estruturas de dados
# neste caso, a lista armazenou estruturas de dados criadas nos exemplos anteriores, uma variável contendo um nome (a), uma variável contendo um número (x), uma variável contendo um vetor (vetor), uma variável contendo um vetor de nomes (vetor_a), uma matriz (mat), e um data.frame (df)
print(lista)
## $texto
## [1] "O RStudio é uma ferramenta poderosa."
##
## $vet
## [1] 10 20 30 40 50
##
## $vet_a
## [1] "aluno" "idade" "série"
##
## $mat_num
## coluna1 coluna2
## linha1 10 30
## linha2 20 40
##
## $mat_nom
## [,1] [,2]
## [1,] "aluno" "aluno"
## [2,] "aluno" "aluno"
##
## $df
## NOMES IDADES
## Aluno1 Adriano 55
## Aluno2 José 15
## Aluno3 Maria 23
## Aluno4 Ana 35
1 # Chamando o elemento 'a' da lista criada acima
## [1] 1
print(lista$texto)
## [1] "O RStudio é uma ferramenta poderosa."
2 # Chamando o 'vetor_a' da lista.
## [1] 2
print(lista$vet_a)
## [1] "aluno" "idade" "série"
3 # Chamando o 'df' da lista
## [1] 3
print(lista$df)
## NOMES IDADES
## Aluno1 Adriano 55
## Aluno2 José 15
## Aluno3 Maria 23
## Aluno4 Ana 35
1 # chamando o conteúdo de lista$texto
## [1] 1
lista[["texto"]]
## [1] "O RStudio é uma ferramenta poderosa."
2 # Chamando o conteúdo de lista$df - utilizarei o 'print' para melhor visualização
## [1] 2
print(lista[["df"]])
## NOMES IDADES
## Aluno1 Adriano 55
## Aluno2 José 15
## Aluno3 Maria 23
## Aluno4 Ana 35
Também podemos chamar o conteúdo da ‘gaveta’ pelo seu número sequencial.
1 # chamando o conteúdo de lista$texto
## [1] 1
lista[[1]]
## [1] "O RStudio é uma ferramenta poderosa."
Quando a gaveta tem subdivisões, para chamar o conteúdo de suas subdiviões, utilize dois estágios, primeiro chame a gaveta, e depois chame o seu conteúdo conforme os padrões utilizados para data.frame, matriz, vetor,….
1 # Chamando o dado que está na linha 1 e coluna 2 do df da lista
## [1] 1
lista$df[1,2]
## [1] 55
2 # Chamando a coluna 1 do df da lista - utilizei o print para facilitar a visualização
## [1] 2
print(lista$d[,1])
## [1] "Adriano" "José" "Maria" "Ana"
Resumo Visual
| Comando | O que você está fazendo? | Resultado Prático |
|---|---|---|
lista[1] |
Selecionando uma fatia da lista (a gaveta fechada). | Uma nova Lista (menor). |
lista[[1]] |
Abrindo a gaveta e pegando o conteúdo. | O objeto original (Vetor, DF, etc). |
lista$temp |
Acessando o conteúdo através do nome. | O objeto original (igual ao [[ ]]). |
Tabela: Resumo Visual de Acesso a Listas no R
* [[ ]] é usado para extrair um
único elemento de uma lista pelo seu nome ou posição, e
o resultado é o próprio elemento (sem a estrutura de lista). Por
exemplo, minha_lista[[1]] ou
minha_lista[["temp"]] retornaria o vetor
c(22.5, 23.1, 21.9). * []
(colchete simples) é usado para extrair sub-listas (uma
ou mais partes da lista). O resultado é sempre outra lista. Por exemplo,
minha_lista[1] retornaria uma lista contendo o vetor
temperaturas. * $ é uma forma
sintática abreviada de [[ ]] para acessar elementos
nomeados, mas não funciona com índices numéricos ou variáveis para o
nome.
Portanto, quando se quer extrair o conteúdo real de um elemento
da lista (não uma sub-lista) e você sabe o nome ou a posição,
[[ ]] é o método mais explícito e robusto. Ele também
permite o uso de variáveis para especificar o nome do elemento, o que
$ não permite (ex:
nome_elemento <- "temp"; minha_lista[[nome_elemento]]).
Dica de Ouro: Se você estiver na dúvida sobre o que tem dentro da lista, use o comando str(lista). Ele mostra a estrutura completa e “desenha” os caminhos para você.
Os comando básicos são utilizados na maioria das atividades de quem
trabalha com o RStudio.
O comando para limpar as variáveis é:
rm(VARIÁVEL1, VARIÁVEL2,…)
x <- 3 # Criando a variável x
y <- 5 # Criando a variável y
rm(x,y)
#print(x) # Comando gerará a mensagem: 'Erro: objeto 'x' não encontrado'
#print(y) # Comando gerará a mensagem: 'Erro: objeto 'y' não encontrado'
O comando para limpar todas as variáveis do ambiente é:
rm(list=ls())
Explicação: * ls(): Retorna um vetor de
strings com os nomes de todos os objetos no ambiente atual. *
rm(list = ...): A função rm() aceita um
argumento list que recebe um vetor de nomes de objetos a
serem removidos. Ao passar ls() para list,
você efetivamente remove todos os objetos listados.
Por que é uma boa prática: Limpar o ambiente antes
de iniciar um novo script ou análise é uma boa prática para garantir a
reprodutibilidade, evitar conflitos de
nomes e gerenciar a memória. *
Reprodutibilidade: Garante que o script será executado
exatamente da mesma forma em qualquer máquina, sem depender de objetos
remanescentes de sessões anteriores que podem não ser recriados. *
Evitar Conflitos: Previne que variáveis ou funções com
o mesmo nome de sessões anteriores interfiram ou sobrescrevam resultados
inesperadamente. * Gerenciamento de Memória: Libera a
memória RAM ocupada por objetos grandes e não mais necessários, o que é
crucial ao trabalhar com conjuntos de dados extensos ou em ambientes com
recursos limitados.
As variáveis podem ser limpas por meio do ícone da vassoura na aba
“Enviroument”
Para limpar a memória utilizada pelo programa utiliza-se o
comando:
gc(full = TRUE)
rm(list=ls())
gc(full = TRUE)
## used (Mb) gc trigger (Mb) max used (Mb)
## Ncells 1404968 75.1 2470880 132 2470880 132.0
## Vcells 2421583 18.5 8388608 64 4658677 35.6
As variáveis podem receber diversos tipos de dados, mas NÃO É POSSÍVEL FAZER OPERAÇÕES ARITIMÉTICAS COM TEXTO
x <- 2 y <- “O valor de x é:”
z <- x + y - essa operação gerará erro
O comando paste concatena (junta) as duas variáveis
z <- paste(y, x)
print(z)
Exemplos
Exemplo:
x <- 2
y <- "O valor de x é: "
paste(y, x)
## [1] "O valor de x é: 2"
Exemplo:
x <- 2
y <- "Posso concatenar números - "
paste(y, x, " - e textos")
## [1] "Posso concatenar números - 2 - e textos"
O comando paste0() é um comando de concatenação similar ao paste(), no entanto ele não cria espaços entre palavras.
Exemplo:
1 #paste("A","dri","a","no")
## [1] 1
paste("A","dri","a","no")
## [1] "A dri a no"
2 #paste0("A","dri","a","no")
## [1] 2
paste0("A","dri","a","no")
## [1] "Adriano"
O comando cat também imprime na tela, mas ele pode concatenar
direto
cat(“O valor de x é:”, x)
Exemplo:
cat("O valor de x é: ", x)
## O valor de x é: 2
O comando ‘trimws()’ remove os espaços em branco
extras do início e do final de uma string. O comando ‘toupper()’
transforma todas as letras para maiúscula.
1 # Texto com espaços
## [1] 1
texto_original <- " Estatística com R "
print(texto_original)
## [1] " Estatística com R "
2 # Remover espaços em branco do início e fim
## [1] 2
texto_sem_espacos_extras <- trimws(texto_original)
print(texto_sem_espacos_extras)
## [1] "Estatística com R"
3 # Transformar para maiúsculas
## [1] 3
texto_maiusculo <- toupper(texto_sem_espacos_extras)
print(texto_maiusculo)
## [1] "ESTATÍSTICA COM R"
4 # Transformar para minúsculas
## [1] 4
texto_minusculo <- tolower(texto_sem_espacos_extras)
print(texto_minusculo)
## [1] "estatística com r"
O comando ‘grep()’ localiza um padrão
# 1. Criando um vetor de nomes
frutas <- c("Maçã", "Banana", "Laranja", "Caju", "Graviola")
# 2. Buscar onde aparece o termo "aju"
resultado <- grep(pattern = "aju", x = frutas, ignore.case = TRUE)
3 # O resultado é '[1] 4' - pois "Caju" é o quarto elemento
## [1] 3
print(resultado)
## [1] 4
# 4. Prar retornar o nome que contém o reultado, inclua o parâmetro 'value = TRUE'
resultado <- grep(pattern = "aju", x = frutas, ignore.case = TRUE, value = TRUE)
5 # Imprimindo o novo resultado
## [1] 5
print(resultado)
## [1] "Caju"
O comando getwd() verifica o caminho da pasta em que você se
encontra.
O comando setwd() permite que você vá para a pasta de
trabalho desejada.
setwd(“C:/Users/ADRIANO
LAURO/OneDrive/Documentos/Adriano/Trabalho/R/Dados/”)
Uma forma de encontrar o caminho de sua pasta de trabalho é copiando
o endereço no Windows Explorer. Mas cuidado, nesse caso é necessário
mudar as barras invertidas (típicas do Windows) para barras
normais.
Utilize novamente o comando getwd() para verificar se você
está na pasta desejada.
Outra forma é utilizando a library this_path - path em
inglês é “caminho”. Essa biblioteca tem funções que facilitam a
organização do trabalho. Veja os exemplos:
Chamando a biblioteca para poder utilizar suas funções:
library(this.path)
Colocando o caminho da pasta atual em uma variável chamada
“caminho_atual”:
caminho_atual <- this.dir()
Sugere-se, para trabalhar com base de dados ou arquivos, que se crie uma
pasta para os códigos fontes, uma pasta para as bases de dados ou
arquivos e, uma pasta para os resultados. Desta forma os arquivos ficam
organizados e facilitam o entendimento dos trabalhos e pesquisas.
Atenção! É necessário criar as pastas! Utilize o
Windows Explores ou o navegador do próprio RStudio (Files - normalmente
no canto inferior direito) para fazer isso. Os comandos abaixo NÃO criam
as pastas, somente direcionam guardam os seus endereços.
Caminho para as bases de dados ou arquivos:
caminho_bases <- paste0(path, “/Bases/”)
Observação: o comando paste0() é um comando de
concatenação similar ao paste(), que retira os espaços entre
palavras. Neste caso, ele serve para evitar erro com espaços
desnecessários no caminho.
Caminho para os resultados (arquivos gerados com os resultados) -
gráficos, tabelas,…:
caminho_resultados <- paste0(path, “/Resultados/”)
Caminho para guardar os códigos fonte:
caminho_R <- paste0(path, “/R/”)
Observação: para criar uma variável subindo o nível
(indo para a pasta de cima) da pasta atual, utilize o comando:
caminho_nivel_acima <- paste(rev(rev(strsplit(caminho_atual,
“/”)[[1]])[-1]), collapse = “/”)
O comando acima utiliza as funções paste() de concatena (junta)
textos;
A função strsplit() que separa as palavras de um texto - no
caso, separa as palavras separadas pela barra “/”; e
A função rev() que inverte a ordem de um vetor - no caso, ela
foi utilizada para tirar a última pasta do caminho, invertendo a ordem
do vetor, retirando o primeiro campo e depois, voltando à ordem
normal.
Exemplos
Para saber em que pasta você está trabalhando, utilize o comando getwd()
getwd()
## [1] "C:/Users/ADRIANO LAURO/OneDrive/Documentos/Adriano/Trabalho/R"
Para saber o que tem na pasta em que voce está trabalhando:
dir()
dir() # os resultados foram omitidos. Faça o teste você, no seu computador.
Você pode copiar esse caminho e ajustar a pasta desejada para o seu
trabalho.
Para configurar a pasta onde vamos trabalhar, utilize o comando setwd,
por exemplo:
setwd(“C:/Users/Documents/R/”)
setwd("~/Adriano/Trabalho/R")
O comando print imprime no console o que está entre
parentesis:
print(“Aluno”)
print("aluno")
## [1] "aluno"
x <- 5
print(x)
## [1] 5
Os operadores do R são
Exemplos de operações aritiméticas básicas
No R não é preciso declarar a variável
x <- 2 y <- 3
x <- 2
y <- 3
x
## [1] 2
y
## [1] 3
Operadores aritiméticos
x + y
## [1] 5
x - y
## [1] -1
Exemplo:
x * y
## [1] 6
Exemplo:
x / y
## [1] 0.6666667
Exemplo:
x ^ y # ou
## [1] 8
x ** y
## [1] 8
Exemplo:
y %% x # retorna o resto da divisão de 3 por 2, que é 1
## [1] 1
As variáveis numéricas do R se comunicam, isso quer dizer que o R entende número como número e que não precisamos distinguir o que é real e o que é inteiro.
x <- 1.34566932
y <- 1
z <- x + y
z
## [1] 2.345669
As operações de comparação retornam os valores TRUE (verdadeiro) ou FALSE (falso)
Exemplos de operações básicas de comparação
x <- 2
y <- 3
z <- 2
x == y # vai retornar FALSE, 2 é diferente de 3
## [1] FALSE
Exemplo:
x != y # vai retornar TRUE, 2 é diferente de 3
## [1] TRUE
Exemplo:
x < y # vai retornar TRUE, 2 é menor do que 3
## [1] TRUE
Exemplo:
x > y # vai retornar FALSE, 2 é menor do que 3
## [1] FALSE
Exemplo:
x >= y # vai retornar FALSE, 2 é menor do que 3
## [1] FALSE
Exemplo:
y >= y # vai retornar TRUE, 2 é igual a 2
## [1] TRUE
Exemplo:
y <= y # vai retornar TRUE, 2 é igual a 2
## [1] TRUE
Serão apresentados os dois principais comandos, readline(), para leitura de textos e scan(), para leitura de números.
O comando readline() lê uma informação texto da tela do prompt
print(“Digite um valor:”)
x <- readline()
Mas, preste atenção! O readline() lê string, não número. Se for digitado número, o computador entenderá esse número como texto.
print(x)
Exemplo
Execute os comandos no seu computador
print("Digite um valor: ")
## [1] "Digite um valor: "
x <- readline() # preste atenção! O readline() lê string, não número
print(x) # O retorno é "" porque não houve digitação no console
## [1] ""
Para ler número, utilize a função scan()
cat(“Digite um valor:”)
x <- scan(nmax = 1)
Exemplo
Execute os comandos no seu computador
cat("Digite um valor: ")
## Digite um valor:
x <- scan(nmax = 1)
x
## numeric(0)
Como não houve digitação no console, o retorno é ## numeric(0)
Os operadores lógicos são:
Uma boa forma de entender esses operadores é por meio da Tabela Verdade
tv <- data.frame(Variáveis = c("Verdadeiro", "Verdadeiro", "Verdadeiro", "Verdadeiro", "Falso", "Falso", " ", " "),
Operador = c("&","|","&","|","&","|", "!","!"),
Variáveis2 = c("Verdadeiro", "Verdadeiro","Falso", "Falso", "Falso","Falso", "Verdadeiro","Falso"),
Resultado = c("Verdadeiro", "Verdadeiro","Falso", "Verdadeiro","Falso","Falso", "Falso", "Verdadeiro") )
tv
## Variáveis Operador Variáveis2 Resultado
## 1 Verdadeiro & Verdadeiro Verdadeiro
## 2 Verdadeiro | Verdadeiro Verdadeiro
## 3 Verdadeiro & Falso Falso
## 4 Verdadeiro | Falso Verdadeiro
## 5 Falso & Falso Falso
## 6 Falso | Falso Falso
## 7 ! Verdadeiro Falso
## 8 ! Falso Verdadeiro
TRUE & TRUE
## [1] TRUE
TRUE | TRUE
## [1] TRUE
TRUE & FALSE
## [1] FALSE
TRUE | FALSE
## [1] TRUE
FALSE & FALSE
## [1] FALSE
FALSE | FALSE
## [1] FALSE
A criação de números aleatórios pode atender diversas distribuições de probabilidade.
Normal:
rnorm(100, mean = 7, sd = 1)
Onde 100 é a quantidade de números gerados;
mean = 7 é a média em torno da qual os números serão criados;
sd = 1 é o desvio padrão a partir do qual os números serão criados.
Uniforme: runif(n = 10, min = 5, max = 20) n = 10 - quantidade de números gerados min = 5 - valor mínimo gerado max = 20 - valor máximo gerado
Binomial: rbinom(quantidade, tamanho, probabilidade)
Exemplos
Exemplo distribuição normal
rnorm(10, mean = 7, sd = 1)
## [1] 7.592303 8.137859 6.405439 7.784065 7.054821 7.739420 7.106292 5.997949
## [9] 8.827817 7.953034
# Plotando o histograma para melhor entendimento
hist(rnorm(n = 1000, mean = 5, sd = 2))
Exemplo distribuição uniforme
runif(n = 10, min = 5, max = 20) # Criando 10 números (n), com valor mínimo de 5 e valor máximo de 20
## [1] 8.762709 8.985373 13.076303 7.516682 7.638943 14.733989 17.986945
## [8] 17.534702 8.326584 7.573492
# Plotando o histograma para melhor entendimento
hist(runif(n = 1000, min = 5, max = 20))
Exemplo distribuição binomial
rbinom(10, 50, 0.5)
## [1] 30 27 23 29 27 27 21 28 23 25
# Plotando o histograma para melhor entendimento
hist(rbinom(1000, 50, 0.7))
As funções estatísticas básicas são, normalmente, aplicadas à vetores,
matrizes, data-frames ou variáveis de uma lista.
Para exemplificar utilizaremos um vetor de x de 1 a 10, uma
matriz chamada mat, e um data-frame disponível no R chamado
mtcars.
Os dados são:
# Vetor x
x <- 1:10
x
## [1] 1 2 3 4 5 6 7 8 9 10
# Matriz mat
mat <- matrix(1:25, nrow = 5, ncol = 5)
mat
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 6 11 16 21
## [2,] 2 7 12 17 22
## [3,] 3 8 13 18 23
## [4,] 4 9 14 19 24
## [5,] 5 10 15 20 25
# Data-frame mtcars - apresentando apenas as 3 primeiras linhas
head(mtcars, 3)
## mpg cyl disp hp drat wt qsec vs am gear carb
## Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
## Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
## Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
As funções estatísticas básicas são:
max(x) identifica o valor máximo de um vetor
ou matriz.
Exemplos:
# Maior número do vetor x
max(x)
## [1] 10
# Maior número de mat
max(mat)
## [1] 25
# Maior número da 4 coluna de mat
max(mat[,4])
## [1] 20
# Maior número da terceira linha de mat
max(mat[3,])
## [1] 23
# Maior valor da variável hp no data-frame mtcars
max(mtcars$hp)
## [1] 335
min(x) identifica o menor valor de um vetor ou
matriz.
Exemplos:
# Menor número do vetor x
min(x)
## [1] 1
# Menor número de mat
min(mat)
## [1] 1
# Menor número da 4 coluna de mat
min(mat[,4])
## [1] 16
# Menor número da terceira linha de mat
min(mat[3,])
## [1] 3
# Menor valor da variável hp no data-frame mtcars
min(mtcars$hp)
## [1] 52
mean(x) calcula a média dos valores de um
vetor ou matriz.
Exemplos:
# Média dos números do vetor x
mean(x)
## [1] 5.5
# Média dos números de mat
mean(mat)
## [1] 13
# Média dos valores da quarta coluna de mat
mean(mat[,4])
## [1] 18
# Média dos números da terceira linha de mat
mean(mat[3,])
## [1] 13
# Média dos valores da variável hp no data-frame mtcars
mean(mtcars$hp)
## [1] 146.6875
median(x) calcula a mediana dos valores de um
vetor ou matriz.
Exemplos:
# Mediana dos números do vetor x
median(x)
## [1] 5.5
# Mediana dos números de mat
median(mat)
## [1] 13
# Mediana dos valores da quarta coluna de mat
median(mat[,4])
## [1] 18
# Mediana dos números da terceira linha de mat
median(mat[3,])
## [1] 13
# Mediana dos valores da variável hp no data-frame mtcars
median(mtcars$hp)
## [1] 123
sd(x) identifica o desvio padrão (standart
error) dos valores de um vetor ou matriz.
Exemplos:
# Desvio-padrão dos valores do vetor x
sd(x)
## [1] 3.02765
# Desvio-padrão dos valores de mat
sd(mat)
## [1] 7.359801
# Desvio-padrão dos valores da 4 coluna de mat
sd(mat[,4])
## [1] 1.581139
# Desvio-padrão dos valores da terceira lina de mat
sd(mat[3,])
## [1] 7.905694
# Desvio-padrão dos valores da variável hp no data-frame mtcars
sd(mtcars$hp)
## [1] 68.56287
summary(x) calcula um sumários estatístico dos
valores de um vetor ou matriz: quartis, média, máximo e mínimo
Exemplos:
# Sumário estatístico dos valores do vetor x
summary(x)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.00 3.25 5.50 5.50 7.75 10.00
# Sumário estatístico dos valores de mat
summary(mat)
## V1 V2 V3 V4 V5
## Min. :1 Min. : 6 Min. :11 Min. :16 Min. :21
## 1st Qu.:2 1st Qu.: 7 1st Qu.:12 1st Qu.:17 1st Qu.:22
## Median :3 Median : 8 Median :13 Median :18 Median :23
## Mean :3 Mean : 8 Mean :13 Mean :18 Mean :23
## 3rd Qu.:4 3rd Qu.: 9 3rd Qu.:14 3rd Qu.:19 3rd Qu.:24
## Max. :5 Max. :10 Max. :15 Max. :20 Max. :25
# Sumário estatístico dos valores da 4 coluna de mat
summary(mat[,4])
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 16 17 18 18 19 20
# Sumário estatístico dos valores da terceira lina de mat
summary(mat[3,])
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 3 8 13 13 18 23
# Sumário estatístico dos valores da variável hp no data-frame mtcars
summary(mtcars$hp)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 52.0 96.5 123.0 146.7 180.0 335.0
# Sumário estatístico dos do data-frame mtcars
summary(mtcars)
## mpg cyl disp hp
## Min. :10.40 Min. :4.000 Min. : 71.1 Min. : 52.0
## 1st Qu.:15.43 1st Qu.:4.000 1st Qu.:120.8 1st Qu.: 96.5
## Median :19.20 Median :6.000 Median :196.3 Median :123.0
## Mean :20.09 Mean :6.188 Mean :230.7 Mean :146.7
## 3rd Qu.:22.80 3rd Qu.:8.000 3rd Qu.:326.0 3rd Qu.:180.0
## Max. :33.90 Max. :8.000 Max. :472.0 Max. :335.0
## drat wt qsec vs
## Min. :2.760 Min. :1.513 Min. :14.50 Min. :0.0000
## 1st Qu.:3.080 1st Qu.:2.581 1st Qu.:16.89 1st Qu.:0.0000
## Median :3.695 Median :3.325 Median :17.71 Median :0.0000
## Mean :3.597 Mean :3.217 Mean :17.85 Mean :0.4375
## 3rd Qu.:3.920 3rd Qu.:3.610 3rd Qu.:18.90 3rd Qu.:1.0000
## Max. :4.930 Max. :5.424 Max. :22.90 Max. :1.0000
## am gear carb
## Min. :0.0000 Min. :3.000 Min. :1.000
## 1st Qu.:0.0000 1st Qu.:3.000 1st Qu.:2.000
## Median :0.0000 Median :4.000 Median :2.000
## Mean :0.4062 Mean :3.688 Mean :2.812
## 3rd Qu.:1.0000 3rd Qu.:4.000 3rd Qu.:4.000
## Max. :1.0000 Max. :5.000 Max. :8.000
hist(x) faz um histograma dos valores de um
vetor ou matriz
Exemplos:
# Histograma dos valores da variável hp no data-frame mtcars
hist(mtcars$hp)
Exemplos
Cálculos estatísticos com vetor contendo números que compõem uma distribuição uniforme.
# Distribuição uniforme
y <- runif(10000, min = 0, max = 100)
max(y)
## [1] 99.97182
min(y)
## [1] 0.01220796
mean(y)
## [1] 50.28688
sd(y)
## [1] 28.79386
summary(y)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.01221 25.24631 50.54768 50.28688 75.41182 99.97182
hist(y)
Outro exemplo - cálculos estatísticos com vetor contendo números que
compõem uma distribuição normal
# Vetor contendo 10000 elemento compondo uma distribuição normal com média 10 e desvio-padrão 2
y <- rnorm(10000, 10, 2)
max(y)
## [1] 18.27792
min(y)
## [1] 2.028323
mean(y)
## [1] 9.998184
sd(y)
## [1] 2.023092
hist(y)
summary(y)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 2.028 8.629 10.001 9.998 11.371 18.278
round(número a ser arredondado, quantidade de casas
decimais) - arredonda para a quantidade de casas decimais
desejada.
round(0.9384,1)
## [1] 0.9
round(0.9499999999,3)
## [1] 0.95
floor(número) - arredonda para o primeiro
número inteiro inferior.
floor(0.93)
## [1] 0
floor(8.67)
## [1] 8
floor(-5.84)
## [1] -6
ceiling(número) - arredonda para o primeiro
número inteiro superior.
ceiling(10.93)
## [1] 11
ceiling(-5.84)
## [1] -5
trunc(número) - retira as casas decimais do
número.
trunc(0.93)
## [1] 0
trunc(10.93)
## [1] 10
O R automaticamente insere a notação científica para números muito
grandes. Para forçar que os números não apareçam em notação científica,
utilize o comando:
options(scipen = 999)
num <- 1234789012388889999999221
print(num)
## [1] 1.234789e+24
# Aplicando o comando "options(scipen = 999)"
options(scipen = 20)
print(num)
## [1] 1234789012388889965462200
Os comandos de decisão são aqueles que permitem a escolha do caminho
que se pretende seguir para a elaboração de um programa. Em outras
palavras, são aqueles que decidem entre situações distintas.
Eles utilizam basicamente os comandos if, else,
else if e ifelse. Veja como cada um deles
funciona.
Esses comando são utilizados com os operadores de comparação:
- ” == ” igual
- ” != ” diferente
- ” > ” maior
- ” >= ” maior ou igual
- ” < ” menor
- ” <= ” menor ou igual
Eles também podem ser compostos com operadores lógicos:
O comando if compara duas variáveis e decide o caminho a
tomar considerando o resultado.
Os comandos a serem executados após a decisão devem estar entre chaves
({ }).
Sua estrutura básica é:
Veja o exemplo.
x <- 2
y <- 3
if(x < y){
cat("x é menor do que y e seu valor é:", x, "- o valor de y é: ", y)
}
## x é menor do que y e seu valor é: 2 - o valor de y é: 3
Quando se deseja incluir um caminho alternativo ao comando
if utiliza-se o comando else.
Sua estrutura básica é:
Veja o exemplo.
x <- 4
y <- 3
if(x < y){
cat("x é menor do que y e seu valor é: ", x,"- o valor de y é: ", y)
} else {
cat("x é maior do que y e seu valor é: ", x ,"- o valor de y é: ", y)
}
## x é maior do que y e seu valor é: 4 - o valor de y é: 3
Quando se deseja incluir diversos caminhos alternativos ao comando
if, utiliza-se o comando else if. Neste caso, é
necessário incluir a condição.
Sua estrutura básica é:
Veja o exemplo.
x <- "c"
if(x == "a"){
cat("x é menor do que zero")
} else if(x == "b"){
cat("x é maior do que 0")
} else if(x == "0"){
cat("x é igual a zero")
} else if(x == "0"){
cat("x não é 'a', nem 'b', nem '0'.")
}
# Sugere-se que o usuário altere os valoes de x e y e veja o comportamento da função.
A função ifelse é uma forma mais direta de executar o
comando de decisão. Neste caso, não será possível incluir uma sequência
de comandos se verdadeiro ou falso, será possível incluir apenas o valor
do resultado da comparação.
Sua estrutura básica é:
Veja o exemplo:
x <- 4
y <- 3
ifelse(x < y, x ,y)
## [1] 3
Os comandos de repetição ou loop mais comuns são:
- for
- while
- repeat
Assim como os comandos de decisão, esses comandos são utilizados com os
operadores de comparação:
- ” == ” igual
- ” != ” diferente
- ” > ” maior
- ” >= ” maior ou igual
- ” < ” menor
- ” <= ” menor ou igual
Eles também podem ser compostos com operadores lógicos:
Vamos estudar cada um deles.
A sintaxe básica do for é:
for ( vetor a ser percorrido ){
sequência de comandos
}
Este comando repete o código entre chaves obedecendo a condição entre
parêntesis.
Exemplo:
for(i in 1:5){
print(i)
}
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5
A sintaxe básica do while é:
while(condição){
sequência de comandos
}
“While” significa “enquanto”. Ou seja, os comandos entre chaves serão
executados enquanto a condição entre parêntesis for verdadeira.
Atenção: é necessário definir a variável que vai gerar a
condição antes de entrar no loop e garantir que essa variável atingirá
uma condição diferente de “verdadeiro” durante o loop. Caso isso não
ocorra o while entrará em loop infinito e exigirá interrupção forçada
por parte do programador.
Exemplo:
i <- 1
while (i <= 5) {
print(i)
i <- i+1
}
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5
O comando “repeat” se diferencia do “while” porque o teste da
condição de parada está no fim dos comando, enquanto no comando “while”
está no início da sequencia de comandos.
Veja sua sintaxe:
i <- 1 repeat {
sequência de comandos
if (Condição para que a repetição pare) break()
}
De forma similar ao comando “while” é necessário criar uma variável para
teste da condição de parada antes do início do loop. E, dentro do loop é
necessário assegurar que a condição de parada irá ocorrer, caso
contrário o programa entrará em loop contínuo e exigirá ação do
programador para forçar a parada.
Veja o exemplo:
i <- 1
repeat{
print(i)
i <- i+1
if(i == 6) break
}
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5
Atenção: sugere-se manter o incremento de “i” logo acima do
teste da condição de parada para evitar dificuldades de
interpretação.
Video Criando funções
Quando desejamos realizar uma bloco de comandos repetidamente para gerar um resultado específico, criamos uma função. Podemos dizer, a grosso modo que uma função é um programa dentro de um programa principal e é criada para “economizar” linhas de código, padronizar procedimentos, facilitar a escrita e o entendimento do programa.
A sintaxe básica da função é:
identificador = function( argumento1, argumento2, …){
código
código
código
return( argumentos de retorno )
}
Alguns cuidados você deve ter ao criar uma função:
- Identificador - deve obedecer as mesmas regras do
identificador das variáveis, ou seja, diferencia as letras maiúsculas e
minúsculas, não pode começar com números, deve seguir um padrão que
facilite a identificação de sua ação e de que é uma função.
- argumentos - os argumentos podem ser estruturas numéricas, de
texto, vetores, matrizes ou data-frames. É importante que esses comandos
sejam compreendidos e tenham um padrão para que não ocorram erros nos
comandos internos da função. Caso um argumento seja destinado a receber
um valor numérico e receba um texto, na execução interno da função
ocorrerá um erro. Esse tipo de situação deve ser tratado.
- comandos - seguem os mesmos padrões dos comandos de um
programa, com loops, comandos de decisão,….
- return - este comando retorna ao programa de onde é chamada o
resultado do processamento executado dentro da função.
Veja o exemplo:
# Criando a função
maior <- function(a, b){
ifelse( a>b, return(a), return(b))
}
# Chamando a função
a <- 5
b <- 10
c <- 15
maior(a,b)
## [1] 10
maior(c,a)
## [1] 15
# Função com string
nome_completo <- function(primeiro_nome, segundo_nome){
return(cat(primeiro_nome, segundo_nome))
}
nome_completo("Adriano", "Lauro")
## Adriano Lauro
Esta seção permitirá a você ler dados de planilhas ou tabelas para
que sejam trabalhados no R.
Existem muitas bases de dados de acesso livre disponíveis para pesquisas
e análises que poderão ser acessadas com as instruções abaixo.
Também é possível copiar uma tabela do Excel ou do Word e carrega-la
diretamente no RStudio.
Os mais comuns tipos de dados disponíveis são aqueles organizados em
forma de tabelas.
Essas dados podem ser guardados em uma infinidade de formatos, sendo os
mais conhecidos “.txt”, “.dat”, “.csv”, “.xls”, “.xlsx”.
O comando básico para a leitura desses dados é o
read.table. Desse comando derivam diversos outros como
o read.csv, read.csv2,…
Normalmente, quando se lê um arquivo, “jogamos” essas informações em uma
variável tipo data-frame, mas existem tipos de dados
oriundos de bibliotecas específicas, como por exemplo a
tibble que é oriunda do tydverse, ou o
rds, xt, ou
xts.específicos para séries temporais.
Os principais pacotes para leitura e gravação de arquivos de dados
(Planilhas) são, para planilhas no Excel, readxl e openxlsx. Para
arquivos txt ou csv, o readr.
library(readr)
library(readxl)
library(openxlsx)
O R permite que se leia diversos tipos de dados e os armazene em uma variável. É possível ler formatos de dados oriundos de banco de dados, planilhas, textos, links,… Ele ainda pode se conectar diretamente a um banco de dados.
O read.table é um pacote que pode realizar essas ações e seus
parâmetros são:
“file =” - aqui é atribuído o caminho do arquivo no seu
computador (também pode ser o caminho da internet).
“sep =” - indica o separador das colunas. As colunas
são separadas por ponto e vírgula; por vírgulas; por “|”; ou por espaços
“. Para identificar como elas estão separadas, tente abrir o
arquivo”.csv”, “.txt”, “.dat” em um editor de textos tipo o notepad,
wordpad, notepad++, ou vi, e identifique qual símbolo é utilizado. Outra
forma de fazer isso é identificando o formato em um dicionário de dados
ou instruções “leiame”, “readme”.
Os arquivos “.xls”, ou “.xlsx” são lidos por pacotes específicos
(readxl) e não é necessário a identificação dos separadores. Ao serem
abertos por editores de texto apresentarão uma série de símbolos
ilegíveis. Portanto, essa técnica de abertura no editor de textos não
pode ser utilizada para esses tipos de arquivos.
A principal função para a leitura de dados na web é a
read.table.
No entanto, os dados estão armazenados em muitos formatos e as funções
disponíveis não são cambiáveis para cada tipo com facilidade.E,
frequentemente, os sites são reestruturados e específica.
Os dados abertos do governo, por exemplo, o usuário para acessá-los deve
estar logado na conta .gov.
Muitos dados gevernamentais já disponibilizam ferramentas de
visualização no próprio site. Tais ferramentas facilitam a visualização
por grande parte das pessoas, mas dificultam o acesso dos dados raiz, os
chamados microdados, por criarem novos ‘degraus’ para seu acesso.
Por esses motivos, as leituras de dados da web devem ser específicas,
considerando todas as características do arquivo e da página.
Uma ação recomendada é, quando a base de dados for necessária para uma
pesquisa, que seja baixada, juntamente com os arquivos de metadados,
quando existirem, e sejam registrados os dados de acesso.
A leitura direta é recomendada para casos atualizados
frequentemente.
O Google Drive e One Drive disponibilizam pacotes para a leiltura de
dados em suas bases, inclusive com autenticação. Essa pode ser uma boa
solucção para quem quer compartilhar dados, permitindo a autenticação
dos usuários.
Os pacotes são:
* Microsoft365R;
install.packages(“Microsoft365R”); e library(Microsoft365R);
* googledrive
install.packages(“googledrive”); e library(googledrive)
* googlesheets4 - para leitura de planilhas do
Google install.packages(“googlesheets4”); e library(googlesheets4)
Ao ler o arquivo do computador, fique atento ao endereço onde esse
arquivo se encontra, ou seja, a pasta dele.
Existem diversas formas de encontrar esse caminho no seu computador. Uma
delas é utilizando o navegador do RStudio, aba “Files” (normalmente, no
quadrante inferior esquerdo do RStudio) e encontrar o arquivo desejado.
Feito isso, clique na engrenagem e em “Copy Folder Path for Clipboard” e
cole esse caminho no argumento “file” da função
read.table.
Atenção! Caso esteja utilizando o Windows e copie o
endereço do Windows Explorer ou de um navegador, é necessário atentar
para as barras. No Windows as barras são invertidas e no R elas devem
ser normais, como em um navegador da internet.
DICA!
Você pode utilizar a interface gráfica do RStudio para carregar o arquivo desejado. Acesse o ambiente “File” que, normalmente, fica no canto inferior direito, encontre o seu arquivo e clique sobre ele com o botão esquerdo do mouse. Irá surgir uma caixa com “Import Dataset…”.
Clique sobre “Import Dataset” e irá surgir a caixa de diálago (abaixo).
Observe você tem o caminho da pasta no seu computador onde se encontra o arquivo (1); o cabeçalho e como os dados estão separados (2); e o comando utilizado para a importação de dados (3).
No exemplo acima, as coluna não foram reconhecidas. Nesse caso, altere o campo “Delimeter” para “Semicolon” (ponto e vírgula) e as colunas passarão a ser reconhecidas. Após isso importe o arquivo.
Recomendo que você copie o código de importação e inclua no código que você está elaborando para tornar o processo mais ágil, evitando ter que abrir essa caixa toda vez que for importar o arquivo.
Outro ponto de atenção é quanto ao caminho. Algumas vezes no código apresentado em (3) o caminho surge sem o “~/” inicial - inclua esses caracteres caso o código não funicione. Em (1) o caminho aparece completo, é dessa forma que deve ser chamado no seu comando.
# Lendo o mesmo arquivo no computador - neste caso, utilizei o endereço da internet para baixar o arquivo
library(readr)
qualidade_ar <- read_delim("~/Adriano/Trabalho/R/dados/airquality.csv",
delim = ";", escape_double = FALSE, trim_ws = TRUE)
## Rows: 153 Columns: 6
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ";"
## dbl (6): Ozone, Solar.R, Wind, Temp, Month, Day
##
## ℹ 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.
O procedimento é similar ao da leitura de um arquivo .csv, o que muda é o pacote e a função. Observe o exemplo.
# Carregando o pacote
library(readxl)
# Aleitura do arquivo Excel deve utilizar uma outra função, a read_excel
qualidade_ar <- read_excel("~/Adriano/Trabalho/R/dados/airquality.xlsx")
# O comando acima pode ser incrementando incluindo-se o nome da planilha do arquivo Excel, caso exista mais de uma. Neste caso, utilize o comando:
qualidade_ar <- read_excel("~/Adriano/Trabalho/R/dados/airquality.xlsx", sheet = "airquality")
Também é possível ler uma tabela de um arquivo Word ou Excel. Para
isso basta copiar a tabela (Ctrl + C) e depois chamar o comando:
tabela <- read.table(file = “clipboard”, sep = “, header=TRUE)
Veja o passo-a-passo:
Selecione e copie os dados (no Word ou Excel) que deseja importar para o R (Ctrl + C).
Execute o seguinte código abaixo para importar os dados
copiados:
tabela <- read.table(file = “clipboard”, sep = “,
header=TRUE)
Quando copiamos os dados eles ficam armazenados no clipboard (uma memória) do nosso computador, então o R le esses dados em forma de tabela e os coloca na variável desejadas, no caso, “tabela”.
Para salvar os dados em um arquivo no seu computador é possível utilizar os comandos write.table ou write.csv2.
write.table(qualidade_ar, file = “C:/Users/ADRIANO LAURO/OneDrive/Documentos/Adriano/Trabalho/R/Dados/qualidade_ar2.csv”, sep = “;”)
Para ver documentação sobre write.table, clique no link.
O pacote writexl possui a função write_xlsx2 utilizada para salvar data-frames em formato planilha Excel, conforme apresentado no exemplo abaixo. Não esqueça de realizar a instalação e o carregamento do pacote antes de tentar utilizar a função.
# Instalando e carregando o pacote
# install.packages("writexl")
library(writexl)
# Salvando em .csv
write.table(qualidade_ar, file = "C:/Users/ADRIANO LAURO/OneDrive/Documentos/Adriano/Trabalho/R/dados/qualidade_ar2.csv", sep = ";")
# Salvando em .txt
write.table(qualidade_ar, file = "C:/Users/ADRIANO LAURO/OneDrive/Documentos/Adriano/Trabalho/R/dados/qualidade_ar2.txt", sep = ";")
# Salvando em .xlsx
write_xlsx(qualidade_ar, "C:/Users/ADRIANO LAURO/OneDrive/Documentos/Adriano/Trabalho/R/dados/qualidade_ar2")
Existem duas formas de manipulação de dados, a nativa, com comandos
básicos do R e a biblioteca dplyr, que faz parte de um conjunto maior de
pacotes chamados tydverse (incluí entre outros o ggplot e dplyr).
O dplyr é uma biblioteca muito utilizada que facilita a manipulação
dos dados de tabelas. Seus comando tem semelhanças com comandos SQL e
com funcionalidades do Excel, o que facilita o entendimento.
A forma de utilização é intuitiva e muitos usuários têm maior facilidade
para a compreensão dos seus códigos.
Para a condução das atividades serão utilizadas as bases de dados do
já existentes no R. Para saber quais são essas bases digite
“data()” no console.
Ao instalar o pacote tydverse serão incluídas outras bases de dados à
esse conjunto.
# Instale e carregue o pacote dplyr
library(dplyr)
# Conhecendo as bases de dados do R
data()
# A apresentação dos dados foi omitida para não poluir o documento
# Digite esse comando para verificar a variedade de bases disponíveis
Utilizaremos a “storms” por possuir diferentes tipos de dados.
Para visualizar essa base de dados utilize os comandos:
storms - os primeiros registros (linhas - também chamadas de casos ou
observações)
# Digite storms e os dados serão apresentados no console
storms
head(storms, 2) - as 2 primeiras linhas
# Comando apresenta as 2 primeiras linhas
head(storms, 2)
## # A tibble: 2 × 13
## name year month day hour lat long status category wind pressure
## <chr> <dbl> <dbl> <int> <dbl> <dbl> <dbl> <fct> <dbl> <int> <int>
## 1 Amy 1975 6 27 0 27.5 -79 tropical de… NA 25 1013
## 2 Amy 1975 6 27 6 28.5 -79 tropical de… NA 25 1013
## # ℹ 2 more variables: tropicalstorm_force_diameter <int>,
## # hurricane_force_diameter <int>
tail(storms,2) - visualizara as 6 últimas linhas
# Comando apresenta as 2 últimas linhas
tail(storms, 2)
## # A tibble: 2 × 13
## name year month day hour lat long status category wind pressure
## <chr> <dbl> <dbl> <int> <dbl> <dbl> <dbl> <fct> <dbl> <int> <int>
## 1 Nicole 2022 11 11 12 33.2 -84.6 tropical d… NA 25 999
## 2 Nicole 2022 11 11 18 35.4 -83.8 other low NA 25 1000
## # ℹ 2 more variables: tropicalstorm_force_diameter <int>,
## # hurricane_force_diameter <int>
dim(storms) - as dimensões da tabela (linhas e colunas)
# Comando apresenta o tamanho da base
dim(storms)
## [1] 19537 13
colnames(storms) - visualizará os nomes das colunas
# Comando apresenta o nome das colunas da base
colnames(storms)
## [1] "name" "year"
## [3] "month" "day"
## [5] "hour" "lat"
## [7] "long" "status"
## [9] "category" "wind"
## [11] "pressure" "tropicalstorm_force_diameter"
## [13] "hurricane_force_diameter"
# Comando apresenta o nome das colunas e os seus tipos de dados
glimpse(storms)
## Rows: 19,537
## Columns: 13
## $ name <chr> "Amy", "Amy", "Amy", "Amy", "Amy", "Amy",…
## $ year <dbl> 1975, 1975, 1975, 1975, 1975, 1975, 1975,…
## $ month <dbl> 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,…
## $ day <int> 27, 27, 27, 27, 28, 28, 28, 28, 29, 29, 2…
## $ hour <dbl> 0, 6, 12, 18, 0, 6, 12, 18, 0, 6, 12, 18,…
## $ lat <dbl> 27.5, 28.5, 29.5, 30.5, 31.5, 32.4, 33.3,…
## $ long <dbl> -79.0, -79.0, -79.0, -79.0, -78.8, -78.7,…
## $ status <fct> tropical depression, tropical depression,…
## $ category <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
## $ wind <int> 25, 25, 25, 25, 25, 25, 25, 30, 35, 40, 4…
## $ pressure <int> 1013, 1013, 1013, 1013, 1012, 1012, 1011,…
## $ tropicalstorm_force_diameter <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
## $ hurricane_force_diameter <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
O R permite a manipulação e seleção de linhas e colunas na forma
nativa, mas a maioria das operações podem ser realizadas por meio dos
comandos do pacote dplyr.
Para melhor entendimento, vamos utilizar o data.frame “df” que contém
os dados abaixo. Para você criar esse data.frame copie o código
abaixo.
df <- data.frame(NOME = c("VENDEDOR 1", "VENDEDOR 2","VENDEDOR 3","VENDEDOR 4","VENDEDOR 5","VENDEDOR 6","VENDEDOR 7"),
Salario_Base = c(1800, 2500, 2500, 3000,3500, 4000, 5000),
Vendas = c(20000,30000,25000,15000,27000,30000,NA))
| NOME | Salario_Base | Vendas |
|---|---|---|
| VENDEDOR 1 | 1800 | 20000 |
| VENDEDOR 2 | 2500 | 30000 |
| VENDEDOR 3 | 2500 | 25000 |
| VENDEDOR 4 | 3000 | 15000 |
| VENDEDOR 5 | 3500 | 27000 |
| VENDEDOR 6 | 4000 | 30000 |
| VENDEDOR 7 | 5000 | NA |
Chamando todo o df:
df[,] # não se preenche o local das linhas e colunas, chama-se todas as linhas ou colunas.
## NOME Salario_Base Vendas
## 1 VENDEDOR 1 1800 20000
## 2 VENDEDOR 2 2500 30000
## 3 VENDEDOR 3 2500 25000
## 4 VENDEDOR 4 3000 15000
## 5 VENDEDOR 5 3500 27000
## 6 VENDEDOR 6 4000 30000
## 7 VENDEDOR 7 5000 NA
Chamada a linha 2:
df[2,] # preenche-se o espaço das linhas com o número do registro que se quer
## NOME Salario_Base Vendas
## 2 VENDEDOR 2 2500 30000
Chamada a linhaS 2, 3 e 4:
df[c(2,3,4),] # utiliza-se a função c() contendo os itens ou o intervalo desejado.
## NOME Salario_Base Vendas
## 2 VENDEDOR 2 2500 30000
## 3 VENDEDOR 3 2500 25000
## 4 VENDEDOR 4 3000 15000
df[c(2:4),] # mesmo resultado do comando acima
## NOME Salario_Base Vendas
## 2 VENDEDOR 2 2500 30000
## 3 VENDEDOR 3 2500 25000
## 4 VENDEDOR 4 3000 15000
Chamada a coluna 1:
df[,1] # chamando todas as linhas da coluna 1
## [1] "VENDEDOR 1" "VENDEDOR 2" "VENDEDOR 3" "VENDEDOR 4" "VENDEDOR 5"
## [6] "VENDEDOR 6" "VENDEDOR 7"
Chamando a linha 3, coluna 1:
df[3,1]
## [1] "VENDEDOR 3"
A coluna também pode ser chamada por seu nome:
df$NOME # chamando todas as linhas da coluna cujo nome é "NOME".
## [1] "VENDEDOR 1" "VENDEDOR 2" "VENDEDOR 3" "VENDEDOR 4" "VENDEDOR 5"
## [6] "VENDEDOR 6" "VENDEDOR 7"
Chamando a linha 3 da coluna “NOME”:
df$NOME[3]
## [1] "VENDEDOR 3"
Chamando as linhas 3, 4 e 5 da coluna “NOME”:
df$NOME[c(3:5)]
## [1] "VENDEDOR 3" "VENDEDOR 4" "VENDEDOR 5"
Chamando colunas 1 e 2 e todas suas linhas:
df[,c(1,2)]
## NOME Salario_Base
## 1 VENDEDOR 1 1800
## 2 VENDEDOR 2 2500
## 3 VENDEDOR 3 2500
## 4 VENDEDOR 4 3000
## 5 VENDEDOR 5 3500
## 6 VENDEDOR 6 4000
## 7 VENDEDOR 7 5000
Chamando colunas 1 e 3, linhas 5:
df[5,c(1,3)]
## NOME Vendas
## 5 VENDEDOR 5 27000
É possível utilizar condições para definição de um subconjunto do
data.frame.
Veja o exemplo:
Chamando todas as linhas cujo valor da coluna 2 (salario_base) é menor
do que 2900:
df[df$Salario_Base < 2900,]
## NOME Salario_Base Vendas
## 1 VENDEDOR 1 1800 20000
## 2 VENDEDOR 2 2500 30000
## 3 VENDEDOR 3 2500 25000
No caso acima, a condição de comparação da coluna é colocada na
posição da linha.
Outra forma de escrever o mesmo comando:
df[df[,2] < 2900,]
## NOME Salario_Base Vendas
## 1 VENDEDOR 1 1800 20000
## 2 VENDEDOR 2 2500 30000
## 3 VENDEDOR 3 2500 25000
É possível combinar condições de diversas colunas:
df[df$Salario_Base < 2900 & df$Vendas > 25000,]
## NOME Salario_Base Vendas
## 2 VENDEDOR 2 2500 30000
É possível chamar dados tipo texto:
df[df$NOME == "VENDEDOR 4",]
## NOME Salario_Base Vendas
## 4 VENDEDOR 4 3000 15000
Para se criar uma linha devemos atribuir os valores para cada coluna
dessa nova linha:
Veja o exemplo:
df[8,] <- c("Vendedor 8", 1000, 10000) # cuidado
A atualização de dados existentes pode ser feita atribuindo-se o novo
valor à posição referenciadas.
Exemplo - atualizando o salário base do vendedor 8:
df[8,2] <- 1920
df[8,]
## NOME Salario_Base Vendas
## 8 Vendedor 8 1920 10000
Ou:
df$Salario_Base[8] <- 1920
df[8,]
## NOME Salario_Base Vendas
## 8 Vendedor 8 1920 10000
df$Perc_comissao <- 5 # todas as linhas dessa nova coluna receberão o valor 5
colnames(df)
## [1] "NOME" "Salario_Base" "Vendas" "Perc_comissao"
É possível criar colunas com valores compostos das demais
colunas.
Criaremos uma coluna “Salario” cujo valor é salario_base + (Vendas *
Perc_comissao/100).
Veja o exemplo:
# Para fazer essa operação temos que transformar os dados das colunas 2 e 3 que eram de "chr" para numérico. Isso é feito com os comandos abaixo.
df[,2] <- as.numeric((df[,2]))
df[,3] <- as.numeric((df[,3]))
# Agora criamos a nova coluna
df$Salario <- df$Salario_Base + df$Vendas*df$Perc_comissao/100
O comando rbind é utilizado para unir linhas de bases de tabelas
distintas. Para sua utilização é fundamental que a quantidade de colunas
seja a mesma.
Vamos supor que tenhamos uma outra tabela com mais três vendedores que
foram adicionados ao grupo de colaboradores e queremos unir essas
tabelas.
Veja essa tabela:
## NOME Salario_Base Vendas Perc_comissao Salario
## 1 VENDEDOR 8 1800 18000 5 2700
## 2 VENDEDOR 9 2500 20000 5 3500
## 3 VENDEDOR 10 2500 19000 5 3450
O comando para unir as linhas (as tabelas) é
rbind(tabela, tabela_nova).
Veja o exemplo.
Veja essa tabela:
rbind(df,df2)
## NOME Salario_Base Vendas Perc_comissao Salario
## 1 VENDEDOR 1 1800 20000 5 2800
## 2 VENDEDOR 2 2500 30000 5 4000
## 3 VENDEDOR 3 2500 25000 5 3750
## 4 VENDEDOR 4 3000 15000 5 3750
## 5 VENDEDOR 5 3500 27000 5 4850
## 6 VENDEDOR 6 4000 30000 5 5500
## 7 VENDEDOR 7 5000 NA 5 NA
## 8 Vendedor 8 1920 10000 5 2420
## 9 VENDEDOR 8 1800 18000 5 2700
## 10 VENDEDOR 9 2500 20000 5 3500
## 11 VENDEDOR 10 2500 19000 5 3450
O comando cbind() é similar ao
rbind(), no entanto ele une as colunas.
Nesse caso é necessário que as colunas tenham a mesma quantidade de
linhas.
Vamos supor que queremos adicionar uma coluna com o percentual da
comissão dos vendedores, com percentual de 5%.
Veja essa coluna.
# Como o df tem 8 linhas, tenho que criar uma coluna com 8 repetições de 0.05
Percentual_comissao <- rep(0.05,8)
A sintaxe do comando é cbind(tabela,
coluna_nova), ou cbind(coluna,
coluna_nova).
Veja o exemplo:
cbind(df, Percentual_comissao)
## NOME Salario_Base Vendas Perc_comissao Salario Percentual_comissao
## 1 VENDEDOR 1 1800 20000 5 2800 0.05
## 2 VENDEDOR 2 2500 30000 5 4000 0.05
## 3 VENDEDOR 3 2500 25000 5 3750 0.05
## 4 VENDEDOR 4 3000 15000 5 3750 0.05
## 5 VENDEDOR 5 3500 27000 5 4850 0.05
## 6 VENDEDOR 6 4000 30000 5 5500 0.05
## 7 VENDEDOR 7 5000 NA 5 NA 0.05
## 8 Vendedor 8 1920 10000 5 2420 0.05
Muitas vezes as bases de dados possuem registros que não possuem
dados em determinada coluna. A falta desses dados pode gerar erros em
operações e análises estatísticas, por isso é importante saber
trata-los.
Existe uma série de comandos para realizar a identificação e
tratamento dos NA, “Not Available” (não disponível).
na.omit - remove elementos ‘NA’ do vetor.
Repare que no comando abaixo o registro 7 será eliminado.
# Comando remove a linha 7 df porque possui um valor 'NA'
na.omit(df)
## NOME Salario_Base Vendas Perc_comissao Salario
## 1 VENDEDOR 1 1800 20000 5 2800
## 2 VENDEDOR 2 2500 30000 5 4000
## 3 VENDEDOR 3 2500 25000 5 3750
## 4 VENDEDOR 4 3000 15000 5 3750
## 5 VENDEDOR 5 3500 27000 5 4850
## 6 VENDEDOR 6 4000 30000 5 5500
## 8 Vendedor 8 1920 10000 5 2420
Caso você queira salvar o df sem esse valor, utilize o comando
abaixo.
# Comando remove a linha 7 df porque possui um valor 'NA' e carrega em df1
df1 <- na.omit(df)
is.na - retorna um vetor lógico indicando
quais os elementos não ‘NA’. Normalmente, esse comando é utilizado em
condicionais para identificação e/ou alteração de dados.
is.na(df)
## NOME Salario_Base Vendas Perc_comissao Salario
## 1 FALSE FALSE FALSE FALSE FALSE
## 2 FALSE FALSE FALSE FALSE FALSE
## 3 FALSE FALSE FALSE FALSE FALSE
## 4 FALSE FALSE FALSE FALSE FALSE
## 5 FALSE FALSE FALSE FALSE FALSE
## 6 FALSE FALSE FALSE FALSE FALSE
## 7 FALSE FALSE TRUE FALSE TRUE
## 8 FALSE FALSE FALSE FALSE FALSE
Para substituir um valor ‘NA’ por outro, utilize o comando abaixo.
Observe a linha 7.
df[is.na(df)] <- 0
df
## NOME Salario_Base Vendas Perc_comissao Salario
## 1 VENDEDOR 1 1800 20000 5 2800
## 2 VENDEDOR 2 2500 30000 5 4000
## 3 VENDEDOR 3 2500 25000 5 3750
## 4 VENDEDOR 4 3000 15000 5 3750
## 5 VENDEDOR 5 3500 27000 5 4850
## 6 VENDEDOR 6 4000 30000 5 5500
## 7 VENDEDOR 7 5000 0 5 0
## 8 Vendedor 8 1920 10000 5 2420
O pacote dplyr é um pacote que facilita a manipulação de dados das
tabelas.
Carregando as bibliotecas necessárias “dplyr”. Portando a instale e
depois carregue.
install.packages(“dplyr”)
library(dplyr)
As bibliotecas abaixo são necessárias para o carregamento dos
dados:
install.packages(“readr”) - leitura de arquivos
install.packages(“reshape2”) - gráficos
install.packages(“readxl”) - leitura de arquivos formato Excel
Por fim, a biblioteca “stringr” será necessária para manipulação de
textos.
install.packages(“stringr”)
library(stringr)
# Depois de instalar, carregue a biblioteca
library(dplyr)
# Outras bibliotecas são utilizadas em conjunto para a manipulação de dados
# Sugiro que carregue todas
library(stringr)
library(readr)
library(reshape2)
library(readxl)
O símbolo “%>%”, chamados de pipe (pronuncia-se paipe) conduz a
operação para o comando subsequente
select() - seleciona ou remove colunas
documentação em https://dplyr.tidyverse.org/reference/select.html
arrange() - muda a posição das linhas do dataframe baseado em uma
ou mais colunas - ordenar, classificar em ordem crescente ou
decrescente.
documentação - https://dplyr.tidyverse.org/reference/arrange.html
filter() - permite criação de filtros baseado em um ou mais
critérios - atual nas linhas.
documentação - https://dplyr.tidyverse.org/reference/filter.html
mutate() - cria novas colunas que são funções de colunas já
existentes no dataframe.
documentação - https://dplyr.tidyverse.org/reference/mutate.html
group_by() - organiza por grupos - as funções são aplicadas nos
grupos
documentação - https://dplyr.tidyverse.org/reference/group_by.html
summarise() - aplicada para “resumir”
documentação - https://dplyr.tidyverse.org/reference/summarise.html
Agora vamos exercitar cada um desses comandos. Para isso, vamos
salvar essa base de dados em uma variável. Esse é o procedimento normal
quando trabalhamos com cados carregados de uma planilha ou base de
dados.
Utilizaremos a tibble storms, mas os comandos também funcionam para
data.frames.
Conhecendo nossa base de dados.
glimpse(storms) # nomes das colunas
## Rows: 19,537
## Columns: 13
## $ name <chr> "Amy", "Amy", "Amy", "Amy", "Amy", "Amy",…
## $ year <dbl> 1975, 1975, 1975, 1975, 1975, 1975, 1975,…
## $ month <dbl> 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,…
## $ day <int> 27, 27, 27, 27, 28, 28, 28, 28, 29, 29, 2…
## $ hour <dbl> 0, 6, 12, 18, 0, 6, 12, 18, 0, 6, 12, 18,…
## $ lat <dbl> 27.5, 28.5, 29.5, 30.5, 31.5, 32.4, 33.3,…
## $ long <dbl> -79.0, -79.0, -79.0, -79.0, -78.8, -78.7,…
## $ status <fct> tropical depression, tropical depression,…
## $ category <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
## $ wind <int> 25, 25, 25, 25, 25, 25, 25, 30, 35, 40, 4…
## $ pressure <int> 1013, 1013, 1013, 1013, 1012, 1012, 1011,…
## $ tropicalstorm_force_diameter <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
## $ hurricane_force_diameter <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
Além do nome das colunas e quantidade de linhas, esse comando
apresenta os tipos de dados de cada coluna.
Para escolher as colunas (variáveis) com que trabalharei, utilizo o
select.
# Este comando retorna todas as linhas dessas duas colunas
storms %>%
select(name, year)
## # A tibble: 19,537 × 2
## name year
## <chr> <dbl>
## 1 Amy 1975
## 2 Amy 1975
## 3 Amy 1975
## 4 Amy 1975
## 5 Amy 1975
## 6 Amy 1975
## 7 Amy 1975
## 8 Amy 1975
## 9 Amy 1975
## 10 Amy 1975
## # ℹ 19,527 more rows
# Retorna apenas as 5 primeiras linhas
storms %>%
select(name, year) %>%
head(5)
## # A tibble: 5 × 2
## name year
## <chr> <dbl>
## 1 Amy 1975
## 2 Amy 1975
## 3 Amy 1975
## 4 Amy 1975
## 5 Amy 1975
É possível renomear as colunas com o select. Observe que o nome das
colunas da variável não mudou, o que mudou foi o nome das colunas
selecionadas e retornadas.
# seleciona as 6 últimas linhas da tabela e renomeia como "nome" e "ano"
storms %>%
select(nome = name, ano = year) %>%
tail(10)
## # A tibble: 10 × 2
## nome ano
## <chr> <dbl>
## 1 Nicole 2022
## 2 Nicole 2022
## 3 Nicole 2022
## 4 Nicole 2022
## 5 Nicole 2022
## 6 Nicole 2022
## 7 Nicole 2022
## 8 Nicole 2022
## 9 Nicole 2022
## 10 Nicole 2022
É possível criar uma nova tabela a partir da seleção realizada.
Veja o exemplo:
nova_tabela <- storms %>%
select(nome = name, ano = year) %>%
tail(15)
# Esta nova variável, chamada "nova_tabela" vai conter apenas as 2 colunas (renomeadas) e 6 útlimas linhas selecionadas (tail)
print(nova_tabela)
## # A tibble: 15 × 2
## nome ano
## <chr> <dbl>
## 1 Nicole 2022
## 2 Nicole 2022
## 3 Nicole 2022
## 4 Nicole 2022
## 5 Nicole 2022
## 6 Nicole 2022
## 7 Nicole 2022
## 8 Nicole 2022
## 9 Nicole 2022
## 10 Nicole 2022
## 11 Nicole 2022
## 12 Nicole 2022
## 13 Nicole 2022
## 14 Nicole 2022
## 15 Nicole 2022
É possível excluir uma coluna, ao invés de selecionar.
Veja o exemplo:
# Vai retornar as 12 colunas da tabela (exceto a coluna "name"), 6 últimas linhas (tail)
storms %>%
select(-name) %>%
tail(5)
## # A tibble: 5 × 12
## year month day hour lat long status category wind pressure
## <dbl> <dbl> <int> <dbl> <dbl> <dbl> <fct> <dbl> <int> <int>
## 1 2022 11 10 19 29.2 -83 tropical storm NA 40 989
## 2 2022 11 11 0 30.1 -84 tropical storm NA 35 992
## 3 2022 11 11 6 31.2 -84.6 tropical depressi… NA 30 996
## 4 2022 11 11 12 33.2 -84.6 tropical depressi… NA 25 999
## 5 2022 11 11 18 35.4 -83.8 other low NA 25 1000
## # ℹ 2 more variables: tropicalstorm_force_diameter <int>,
## # hurricane_force_diameter <int>
Vendo as dimensões do retorno do comando anterior.
Veja o exemplo:
storms %>%
select(-name) %>%
tail() %>%
dim()
## [1] 6 12
É possível retirar várias colunas, para isso utilize a expressão
“-c(coluna, coluna, coluna,…)”.
Veja o exemplo.
storms %>%
select(-c(lat, long, status, wind, tropicalstorm_force_diameter)) %>%
tail
## # A tibble: 6 × 8
## name year month day hour category pressure hurricane_force_diameter
## <chr> <dbl> <dbl> <int> <dbl> <dbl> <int> <int>
## 1 Nicole 2022 11 10 18 NA 989 0
## 2 Nicole 2022 11 10 19 NA 989 0
## 3 Nicole 2022 11 11 0 NA 992 0
## 4 Nicole 2022 11 11 6 NA 996 0
## 5 Nicole 2022 11 11 12 NA 999 0
## 6 Nicole 2022 11 11 18 NA 1000 0
# Mesmo comando com outra forma de escrever, gerando o mesmo resultado
storms %>%
select(-lat, -long, -status, -wind, -tropicalstorm_force_diameter) %>%
tail
## # A tibble: 6 × 8
## name year month day hour category pressure hurricane_force_diameter
## <chr> <dbl> <dbl> <int> <dbl> <dbl> <int> <int>
## 1 Nicole 2022 11 10 18 NA 989 0
## 2 Nicole 2022 11 10 19 NA 989 0
## 3 Nicole 2022 11 11 0 NA 992 0
## 4 Nicole 2022 11 11 6 NA 996 0
## 5 Nicole 2022 11 11 12 NA 999 0
## 6 Nicole 2022 11 11 18 NA 1000 0
storms %>%
select(-c(lat, long, status, wind, tropicalstorm_force_diameter)) %>%
tail %>%
dim
## [1] 6 8
É possível selecionar colunas com características desejadas como, por
exemplo, aquelas que possuem somente dados numérios.
Veja os exemplos:
# Retorna todas as colunas que possuem dados numéricos.
storms %>%
select_if(is.numeric) %>%
tail
## # A tibble: 6 × 11
## year month day hour lat long category wind pressure
## <dbl> <dbl> <int> <dbl> <dbl> <dbl> <dbl> <int> <int>
## 1 2022 11 10 18 29 -82.8 NA 40 989
## 2 2022 11 10 19 29.2 -83 NA 40 989
## 3 2022 11 11 0 30.1 -84 NA 35 992
## 4 2022 11 11 6 31.2 -84.6 NA 30 996
## 5 2022 11 11 12 33.2 -84.6 NA 25 999
## 6 2022 11 11 18 35.4 -83.8 NA 25 1000
## # ℹ 2 more variables: tropicalstorm_force_diameter <int>,
## # hurricane_force_diameter <int>
É possível selecionar colunas cujo nome comece ou contenha “algumas letras”
# Retorna as colunas que começam com a letra "l".
storms %>%
select(starts_with("l")) %>%
tail
## # A tibble: 6 × 2
## lat long
## <dbl> <dbl>
## 1 29 -82.8
## 2 29.2 -83
## 3 30.1 -84
## 4 31.2 -84.6
## 5 33.2 -84.6
## 6 35.4 -83.8
O comando select pode ser associado com a função distinct. A função
“distinct” retorna as linhas únicas de uma determinada coluna.
Veja o exemplo:
# O comando irá apresentar o nome das tempestades registradas
storms %>%
select(name) %>%
distinct
## # A tibble: 260 × 1
## name
## <chr>
## 1 Amy
## 2 Blanche
## 3 Caroline
## 4 Doris
## 5 Eloise
## 6 Faye
## 7 Gladys
## 8 Hallie
## 9 Belle
## 10 Dottie
## # ℹ 250 more rows
# O comando irá apresentar o status das tempestades registradas
storms %>%
select(status) %>%
distinct
## # A tibble: 9 × 1
## status
## <fct>
## 1 tropical depression
## 2 tropical storm
## 3 extratropical
## 4 hurricane
## 5 subtropical storm
## 6 subtropical depression
## 7 disturbance
## 8 other low
## 9 tropical wave
# O comando irá apresentar o minimo da coluna wind
storms %>%
select(wind) %>%
min
## [1] 10
# O comando irá apresentar o máximo da coluna wind
storms %>%
select(wind) %>%
max
## [1] 165
Este comando classifica a tabela de acordo de forma crescente da
coluna selecionada.
Veja o exemplo:
# Classificando em ordem crescente
storms %>%
arrange(wind) %>%
select(name, wind) %>%
distinct %>%
head
## # A tibble: 6 × 2
## name wind
## <chr> <int>
## 1 Bonnie 10
## 2 Charley 10
## 3 AL031987 10
## 4 Arlene 10
## 5 Bob 10
## 6 Alberto 10
# Classificando em ordem decrescente
storms %>%
arrange(desc(wind)) %>%
select(name, wind) %>%
distinct %>%
head
## # A tibble: 6 × 2
## name wind
## <chr> <int>
## 1 Allen 165
## 2 Gilbert 160
## 3 Wilma 160
## 4 Dorian 160
## 5 Allen 155
## 6 Gilbert 155
Esta função filtra AS LINHAS em função do valor da coluna. Ele é similar ao filtro utilizado no Excel.
# Filtra todas as LINHAS cujo valor na coluna year é maior do que 2015
# Neste caso, o comando retorna as 13 colunas e 1868 linhas com o filtro "year > 2015"
storms %>%
filter(year > 2015)
## # A tibble: 4,193 × 13
## name year month day hour lat long status category wind pressure
## <chr> <dbl> <dbl> <int> <dbl> <dbl> <dbl> <fct> <dbl> <int> <int>
## 1 Alex 2016 1 7 0 26.6 -75.3 extratropi… NA 40 1010
## 2 Alex 2016 1 7 6 27.6 -74.7 extratropi… NA 45 1003
## 3 Alex 2016 1 7 12 28.7 -73.8 extratropi… NA 50 997
## 4 Alex 2016 1 7 18 30 -72.5 extratropi… NA 55 987
## 5 Alex 2016 1 8 0 31.4 -70.6 extratropi… NA 55 986
## 6 Alex 2016 1 8 6 32.4 -68.8 extratropi… NA 55 986
## 7 Alex 2016 1 8 12 33 -67.1 extratropi… NA 45 991
## 8 Alex 2016 1 8 18 33.5 -65 extratropi… NA 45 991
## 9 Alex 2016 1 9 0 34 -62.9 extratropi… NA 45 991
## 10 Alex 2016 1 9 6 34.5 -60.5 extratropi… NA 50 991
## # ℹ 4,183 more rows
## # ℹ 2 more variables: tropicalstorm_force_diameter <int>,
## # hurricane_force_diameter <int>
É possível utilizar diversos filtros em um único comando. Para isso, separe os filtros com vírgulas. Veja o exemplo:
# Filtra todas as LINHAS cujos valores nas colunas year é igual a 2015, wind é maior do que 50, e pressure menor ou igual a 1000.
# Neste caso, o comando reotrna as 13 colunas e 61 linhas.
storms %>% filter(year == 2015, wind > 50, pressure <= 1000)
## # A tibble: 66 × 13
## name year month day hour lat long status category wind pressure
## <chr> <dbl> <dbl> <int> <dbl> <dbl> <dbl> <fct> <dbl> <int> <int>
## 1 Danny 2015 8 20 0 11.7 -42.5 tropical s… NA 55 1000
## 2 Danny 2015 8 20 6 11.9 -43.5 tropical s… NA 60 998
## 3 Danny 2015 8 20 12 12.3 -44.4 hurricane 1 65 995
## 4 Danny 2015 8 20 18 12.8 -45.3 hurricane 1 75 990
## 5 Danny 2015 8 21 0 13.2 -46.2 hurricane 2 85 981
## 6 Danny 2015 8 21 6 13.5 -47 hurricane 2 95 973
## 7 Danny 2015 8 21 12 13.8 -47.8 hurricane 3 110 960
## 8 Danny 2015 8 21 18 14.3 -48.6 hurricane 3 105 966
## 9 Danny 2015 8 22 0 14.7 -49.4 hurricane 2 95 973
## 10 Danny 2015 8 22 6 15 -50.3 hurricane 2 85 980
## # ℹ 56 more rows
## # ℹ 2 more variables: tropicalstorm_force_diameter <int>,
## # hurricane_force_diameter <int>
Utilize os seguintes operadores para comparação:
==, !=, >, >=, <, <=
É possível compor o comando filter com o select e todos os
outros.
Veja o exemplo:
# Utiliza o filtro do exemplo anterior com o comando select
# Neste caso, como o filtro é aplicado em colunas que não estão no select deve vir antes, caso contrário ocorrerá um erro: o filtro não encontrará a coluna, pois ela não foi selecionada.
storms %>%
filter(year == 2015, wind > 50, pressure <= 1000) %>%
select(name, year, month)
## # A tibble: 66 × 3
## name year month
## <chr> <dbl> <dbl>
## 1 Danny 2015 8
## 2 Danny 2015 8
## 3 Danny 2015 8
## 4 Danny 2015 8
## 5 Danny 2015 8
## 6 Danny 2015 8
## 7 Danny 2015 8
## 8 Danny 2015 8
## 9 Danny 2015 8
## 10 Danny 2015 8
## # ℹ 56 more rows
Observe que as colunas selecionadas podem ser diferentes das que se
aplica o filtro.
Podemos utilizar a mesma coluna mais de uma vez para definir um
intervalo de interesse.
Veja o exemplo:
# A coluna wind com valores maiores que 50 e menores que 70
storms %>%
filter(wind > 50, wind < 60)
## # A tibble: 1,106 × 13
## name year month day hour lat long status category wind pressure
## <chr> <dbl> <dbl> <int> <dbl> <dbl> <dbl> <fct> <dbl> <int> <int>
## 1 Amy 1975 6 30 6 35.6 -70.8 tropica… NA 55 998
## 2 Amy 1975 7 3 0 37.7 -62.8 tropica… NA 55 986
## 3 Amy 1975 7 3 6 38.2 -61.2 tropica… NA 55 986
## 4 Amy 1975 7 3 12 39.3 -59.6 tropica… NA 55 986
## 5 Caroline 1975 8 31 18 24.8 -98 tropica… NA 55 993
## 6 Doris 1975 8 30 0 35.3 -48.9 tropica… NA 55 997
## 7 Doris 1975 8 30 6 35.3 -48.5 tropica… NA 55 997
## 8 Doris 1975 8 30 12 35.3 -48 tropica… NA 55 997
## 9 Doris 1975 8 30 18 35 -47.1 tropica… NA 55 997
## 10 Eloise 1975 9 16 12 19.4 -67.5 tropica… NA 55 1002
## # ℹ 1,096 more rows
## # ℹ 2 more variables: tropicalstorm_force_diameter <int>,
## # hurricane_force_diameter <int>
Quando a coluna tem valores de texto, devemos utilizar esses valores
entre aspas.
Veja os exemplos:
# A coluna status cujos valores são de "tropical storm"
storms %>%
filter(status != "tropical storm")
## # A tibble: 12,707 × 13
## name year month day hour lat long status category wind pressure
## <chr> <dbl> <dbl> <int> <dbl> <dbl> <dbl> <fct> <dbl> <int> <int>
## 1 Amy 1975 6 27 0 27.5 -79 tropical… NA 25 1013
## 2 Amy 1975 6 27 6 28.5 -79 tropical… NA 25 1013
## 3 Amy 1975 6 27 12 29.5 -79 tropical… NA 25 1013
## 4 Amy 1975 6 27 18 30.5 -79 tropical… NA 25 1013
## 5 Amy 1975 6 28 0 31.5 -78.8 tropical… NA 25 1012
## 6 Amy 1975 6 28 6 32.4 -78.7 tropical… NA 25 1012
## 7 Amy 1975 6 28 12 33.3 -78 tropical… NA 25 1011
## 8 Amy 1975 6 28 18 34 -77 tropical… NA 30 1006
## 9 Amy 1975 7 4 12 47 -48 extratro… NA 45 995
## 10 Blanche 1975 7 24 0 26 -68.4 tropical… NA 20 1014
## # ℹ 12,697 more rows
## # ℹ 2 more variables: tropicalstorm_force_diameter <int>,
## # hurricane_force_diameter <int>
# A coluna status cujos valores são de "tropical storm"
storms %>%
filter(status != "tropical storm", status != "hurricane")
## # A tibble: 7,904 × 13
## name year month day hour lat long status category wind pressure
## <chr> <dbl> <dbl> <int> <dbl> <dbl> <dbl> <fct> <dbl> <int> <int>
## 1 Amy 1975 6 27 0 27.5 -79 tropical… NA 25 1013
## 2 Amy 1975 6 27 6 28.5 -79 tropical… NA 25 1013
## 3 Amy 1975 6 27 12 29.5 -79 tropical… NA 25 1013
## 4 Amy 1975 6 27 18 30.5 -79 tropical… NA 25 1013
## 5 Amy 1975 6 28 0 31.5 -78.8 tropical… NA 25 1012
## 6 Amy 1975 6 28 6 32.4 -78.7 tropical… NA 25 1012
## 7 Amy 1975 6 28 12 33.3 -78 tropical… NA 25 1011
## 8 Amy 1975 6 28 18 34 -77 tropical… NA 30 1006
## 9 Amy 1975 7 4 12 47 -48 extratro… NA 45 995
## 10 Blanche 1975 7 24 0 26 -68.4 tropical… NA 20 1014
## # ℹ 7,894 more rows
## # ℹ 2 more variables: tropicalstorm_force_diameter <int>,
## # hurricane_force_diameter <int>
Também é possível criar filtros a partir do fragmento de uma expressão ou palavra.Para isso, é necessário utilizar a função string_detect Veja o exemplo:
# A coluna status cujos valores contém o fragamento de palavra "trop"
storms %>%
filter(str_detect(status, "trop"))
## # A tibble: 13,110 × 13
## name year month day hour lat long status category wind pressure
## <chr> <dbl> <dbl> <int> <dbl> <dbl> <dbl> <fct> <dbl> <int> <int>
## 1 Amy 1975 6 27 0 27.5 -79 tropical d… NA 25 1013
## 2 Amy 1975 6 27 6 28.5 -79 tropical d… NA 25 1013
## 3 Amy 1975 6 27 12 29.5 -79 tropical d… NA 25 1013
## 4 Amy 1975 6 27 18 30.5 -79 tropical d… NA 25 1013
## 5 Amy 1975 6 28 0 31.5 -78.8 tropical d… NA 25 1012
## 6 Amy 1975 6 28 6 32.4 -78.7 tropical d… NA 25 1012
## 7 Amy 1975 6 28 12 33.3 -78 tropical d… NA 25 1011
## 8 Amy 1975 6 28 18 34 -77 tropical d… NA 30 1006
## 9 Amy 1975 6 29 0 34.4 -75.8 tropical s… NA 35 1004
## 10 Amy 1975 6 29 6 34 -74.8 tropical s… NA 40 1002
## # ℹ 13,100 more rows
## # ℹ 2 more variables: tropicalstorm_force_diameter <int>,
## # hurricane_force_diameter <int>
ATENÇÃO! Este comando é CASE SENSITIVE, ou seja, distingue as
letras maiúsculas e minúsculas.
Veja o exemplo:
# O mesmo comando anterio com o fragmento "Trop" com o "T" maiúsculo, retorna zero linhas.
storms %>%
filter(str_detect(status, "Trop"))
## # A tibble: 0 × 13
## # ℹ 13 variables: name <chr>, year <dbl>, month <dbl>, day <int>, hour <dbl>,
## # lat <dbl>, long <dbl>, status <fct>, category <dbl>, wind <int>,
## # pressure <int>, tropicalstorm_force_diameter <int>,
## # hurricane_force_diameter <int>
Podemos combinar os diversos filtros para obter os resultados
desejados.
Veja o exemplo:
# Utiliza o filtro do exemplo anterior com o comando select
# Neste caso, como o filtro é aplicado em colunas que não estão no select deve vir antes, caso contrário ocorrerá um erro: o filtro não encontrará a coluna, pois ela não foi selecionada.
storms %>%
filter(year == 2015, wind > 50, wind < 1000, str_detect(status, "trop") ) %>%
select(name, year, month, starts_with("l"))
## # A tibble: 16 × 5
## name year month lat long
## <chr> <dbl> <dbl> <dbl> <dbl>
## 1 Danny 2015 8 11.7 -42.5
## 2 Danny 2015 8 11.9 -43.5
## 3 Danny 2015 8 15.6 -54
## 4 Fred 2015 8 14 -20.7
## 5 Fred 2015 9 17.8 -25.7
## 6 Joaquin 2015 9 26 -70.8
## 7 Joaquin 2015 9 25.8 -71.3
## 8 Joaquin 2015 10 41 -47.5
## 9 Joaquin 2015 10 41.5 -43.3
## 10 Kate 2015 11 28 -76.2
## 11 Kate 2015 11 29.5 -75.4
## 12 Kate 2015 11 31.2 -74
## 13 Kate 2015 11 38.9 -55
## 14 Kate 2015 11 40 -52
## 15 Kate 2015 11 41.3 -50.4
## 16 Kate 2015 11 41.9 -49.9
Este comando alterar colunas existentes ou cria novas colunas que são funções das demais.
Vamos começar com um comando simples, multiplicando o valor da coluna
“wind” multiplicando ela por 100.
Veja o exemplo:
# O comando abaixo cria uma 14ª coluna na pesquisa - não muda a variável "storms".
# Apresentadas somente as 6 primeiras linhas - comando head
storms %>%
mutate(vento = wind * 100) %>%
head(2)
## # A tibble: 2 × 14
## name year month day hour lat long status category wind pressure
## <chr> <dbl> <dbl> <int> <dbl> <dbl> <dbl> <fct> <dbl> <int> <int>
## 1 Amy 1975 6 27 0 27.5 -79 tropical de… NA 25 1013
## 2 Amy 1975 6 27 6 28.5 -79 tropical de… NA 25 1013
## # ℹ 3 more variables: tropicalstorm_force_diameter <int>,
## # hurricane_force_diameter <int>, vento <dbl>
Para uma melhor visualização, foram selecionadas apenas 4 colunas:
storms %>%
mutate(vento = wind * 100) %>%
select(name, year, wind, vento) %>%
head(2)
## # A tibble: 2 × 4
## name year wind vento
## <chr> <dbl> <int> <dbl>
## 1 Amy 1975 25 2500
## 2 Amy 1975 25 2500
Para incluirmos um nome composto na nova coluna, é necessário incluir
a aspas para definição desse nome.
No entanto, recomenda-se evitar espaços nos nomes das variáveis. Caso
seja necessário incluir um nome composto, una-os com “-” ou “_”:
vento_x_100, ou vento-x-100.
storms %>%
mutate("vento x 100" = wind * 100) %>%
select(name, year, wind, "vento x 100") %>%
head(2)
## # A tibble: 2 × 4
## name year wind `vento x 100`
## <chr> <dbl> <int> <dbl>
## 1 Amy 1975 25 2500
## 2 Amy 1975 25 2500
Para aleterar um dado específico, é necessário fazer uma seleção e/ou
filtro nos dados para evitar alteração indiscriminada na tabela.
Para melhor compreensão dessa operação, em um comando selciono e
apresento o dados, e na outra altero o dado.
# Na tempestade Amy vou alterar o dado lat - veja o dado
storms %>%
select(name, hour, wind, lat) %>%
filter(name == "Amy",
hour == 0,
lat == 27.5)
## # A tibble: 1 × 4
## name hour wind lat
## <chr> <dbl> <int> <dbl>
## 1 Amy 0 25 27.5
# Comando para alterar lat para o valor de 30 com mutate
storms %>%
select(name, hour, wind, lat) %>%
filter(name == "Amy",
hour == 0,
lat == 27.5) %>%
mutate(lat = 30)
## # A tibble: 1 × 4
## name hour wind lat
## <chr> <dbl> <int> <dbl>
## 1 Amy 0 25 30
# Comando para alterar o nome de Amy para AMY com mutate
storms %>%
select(name, hour, wind, lat) %>%
filter(name == "Amy",
hour == 0,
lat == 27.5) %>%
mutate(name = "AAMMYY")
## # A tibble: 1 × 4
## name hour wind lat
## <chr> <dbl> <int> <dbl>
## 1 AAMMYY 0 25 27.5
Atenção! - caso você queira realizar alterações em lote,várias ao mesmo tempo, basta reduzir as restrições do filtro.
# Comando para alterar o nome de Amy para AAMMYY com mutate
storms %>%
select(name, hour, wind, lat) %>%
filter(name == "Amy") %>%
mutate(name = "AAMMYY") %>%
head(3)
## # A tibble: 3 × 4
## name hour wind lat
## <chr> <dbl> <int> <dbl>
## 1 AAMMYY 0 25 27.5
## 2 AAMMYY 6 25 28.5
## 3 AAMMYY 12 25 29.5
Neste exemplo foram o nome foi alterado nos 31 registros existentes,
mas apresentei somente o 3 primeiros para não poluir o documento.
Utilize a função as.character para realizar essa transformação.
Utilize a função as.numeric para transformar caracter em número.
Veja os exemplo:
# É criada uma coluna com nome "posicao" e com o formato "chr"
# em uma nova variável chamada 'stm'
stm <- storms %>%
mutate(posicao = as.character(lat))
stm %>%
select(name, lat, posicao) %>%
head(2)
## # A tibble: 2 × 3
## name lat posicao
## <chr> <dbl> <chr>
## 1 Amy 27.5 27.5
## 2 Amy 28.5 28.5
# Transformando a coluna posição de stm em numérico
stm %>%
mutate(posicao = as.numeric(posicao)) %>%
select(name, lat, posicao) %>%
head(2)
## # A tibble: 2 × 3
## name lat posicao
## <chr> <dbl> <dbl>
## 1 Amy 27.5 27.5
## 2 Amy 28.5 28.5
Podemos concatenar informações de diversas colunas.
# É criada uma coluna com nome "posicao" e com o formato "chr"
storms %>%
mutate(posicao = paste(lat, "-", long)) %>%
select(name, lat, long, posicao) %>%
head(2)
## # A tibble: 2 × 4
## name lat long posicao
## <chr> <dbl> <dbl> <chr>
## 1 Amy 27.5 -79 27.5 - -79
## 2 Amy 28.5 -79 28.5 - -79
Podemos criar uma coluna extraindo o primeiro nome de outra
coluna.
# É criada uma coluna "com nome "posicao" e com o formato "nome_status" com o primeiro nome da coluna "status"
storms %>%
mutate(nome_status = stringr::word(status, 1))%>%
select(status, nome_status) %>%
head(2)
## # A tibble: 2 × 2
## status nome_status
## <fct> <chr>
## 1 tropical depression tropical
## 2 tropical depression tropical
Utilizae a função lubridate para transformar
datas.
Vamos criar uma nova coluna concatenando ano-mês-dia das colunas
pré-existentes.
Podemos fazer isso de 2 formas, com a função Date ou utilizando
o pacote lubridate.
Para descobrir o formato padrão de datas que seu computador está
utilizando, utilize a função Sys.Date().
Veja os exemplos:
# Veirifique o formato de data de seu computador.
Sys.Date()
## [1] "2026-02-10"
Concatene as colunas existentes utilizando a função as.Date().
# Concatenando as coluna existentes com os comandos paste e as.Date
storms_atualizado <- storms %>%
mutate(data_completa = as.Date(paste(year, month, day, sep = "-"))) %>%
select(name, year, month, day, data_completa) %>%
head(2)
# Utilizando o pacote lubridate
library(lubridate)
##
## Anexando pacote: 'lubridate'
## O seguinte objeto é mascarado por 'package:sn':
##
## dst
## Os seguintes objetos são mascarados por 'package:base':
##
## date, intersect, setdiff, union
# Criando a coluna 'data_completa'
storms %>%
mutate(data_completa = make_date(year, month, day)) %>%
select(name, year, month, day, data_completa) %>%
head(2)
## # A tibble: 2 × 5
## name year month day data_completa
## <chr> <dbl> <dbl> <int> <date>
## 1 Amy 1975 6 27 1975-06-27
## 2 Amy 1975 6 27 1975-06-27
O comando mutate comporta a criação de várias colunas
simultaneamente.
Veja o exemplo:
storms %>%
mutate(nome_status = stringr::word(status, 1), posicao = paste(lat, " - ", long), categoria = as.numeric(category))%>%
select(status, nome_status, lat, long, posicao, category, categoria) %>%
head
## # A tibble: 6 × 7
## status nome_status lat long posicao category categoria
## <fct> <chr> <dbl> <dbl> <chr> <dbl> <dbl>
## 1 tropical depression tropical 27.5 -79 27.5 - -79 NA NA
## 2 tropical depression tropical 28.5 -79 28.5 - -79 NA NA
## 3 tropical depression tropical 29.5 -79 29.5 - -79 NA NA
## 4 tropical depression tropical 30.5 -79 30.5 - -79 NA NA
## 5 tropical depression tropical 31.5 -78.8 31.5 - -78.8 NA NA
## 6 tropical depression tropical 32.4 -78.7 32.4 - -78.7 NA NA
Este comando organiza por grupos - as funções são aplicadas nos
grupos e é muito utilizado para elaboração de análises e gráficos. Sua
utilidade maior ocorre quando é associado com outros comandos, em
especial o summarise.
Aplicado sozinho, ele não retorna no console os seus resultados, por
isso não serão apresentados exemplos.
O comando summarise possibilita a aplicação de funções no cálculo dos
valores que retornam de uma consulta. Por isso, normalmente são
utilizados com o comando group_by.
Este comando é muito utilizado para análises e confecção de gráficos,
como veremos adiante.
Veja os exemplos:
# Nome das tempestades com a média dos valores de wind para cada nome
storms %>%
group_by(name) %>%
summarise(mean(wind))
## # A tibble: 260 × 2
## name `mean(wind)`
## <chr> <dbl>
## 1 AL011993 29.5
## 2 AL012000 25
## 3 AL021992 29
## 4 AL021994 24.2
## 5 AL021999 28.8
## 6 AL022000 29.2
## 7 AL022001 25
## 8 AL022003 30
## 9 AL022006 31.5
## 10 AL031987 21.2
## # ℹ 250 more rows
# Nome das tempestades com a média dos valores de wind para cada nome
storms %>%
group_by(name) %>%
summarise(sd(wind))
## # A tibble: 260 × 2
## name `sd(wind)`
## <chr> <dbl>
## 1 AL011993 4.16
## 2 AL012000 0
## 3 AL021992 2.24
## 4 AL021994 5.85
## 5 AL021999 2.5
## 6 AL022000 1.95
## 7 AL022001 0
## 8 AL022003 0
## 9 AL022006 6.58
## 10 AL031987 8.71
## # ℹ 250 more rows
# Nome das tempestades com diversos valores calculados de wind. O "n()" realiza a contagem.
storms %>%
group_by(name) %>%
summarise(n(), mean(wind), median(wind), sd(wind), min(wind), max(wind))
## # A tibble: 260 × 7
## name `n()` `mean(wind)` `median(wind)` `sd(wind)` `min(wind)` `max(wind)`
## <chr> <int> <dbl> <dbl> <dbl> <int> <int>
## 1 AL011993 11 29.5 30 4.16 25 35
## 2 AL012000 4 25 25 0 25 25
## 3 AL021992 5 29 30 2.24 25 30
## 4 AL021994 6 24.2 25 5.85 15 30
## 5 AL021999 4 28.8 30 2.5 25 30
## 6 AL022000 12 29.2 30 1.95 25 30
## 7 AL022001 5 25 25 0 25 25
## 8 AL022003 4 30 30 0 30 30
## 9 AL022006 13 31.5 30 6.58 25 45
## 10 AL031987 32 21.2 20 8.71 10 40
## # ℹ 250 more rows
# Status das tempestades com diversos valores calculados de wind. O "n()" realiza a contagem.
storms %>%
group_by(status) %>%
summarise(n(), mean(wind), median(wind), sd(wind), min(wind), max(wind))
## # A tibble: 9 × 7
## status `n()` `mean(wind)` `median(wind)` `sd(wind)` `min(wind)` `max(wind)`
## <fct> <int> <dbl> <dbl> <dbl> <int> <int>
## 1 disturba… 171 30.0 30 6.50 20 50
## 2 extratro… 2151 41.5 40 13.5 10 105
## 3 hurricane 4803 86.6 80 20.7 65 165
## 4 other low 1453 25.6 25 6.81 10 80
## 5 subtropi… 151 26.7 30 4.79 10 30
## 6 subtropi… 298 44.4 45 7.89 35 60
## 7 tropical… 3569 27.5 30 3.71 10 30
## 8 tropical… 6830 45.7 45 8.29 35 70
## 9 tropical… 111 28.6 30 4.59 20 40
# Status das tempestades com diversos valores calculados de wind. O "n()" realiza a contagem.
storms %>%
group_by(status) %>%
summarise(n(), mean(pressure), median(pressure), sd(pressure), min(pressure), max(pressure))
## # A tibble: 9 × 7
## status `n()` `mean(pressure)` `median(pressure)` `sd(pressure)`
## <fct> <int> <dbl> <dbl> <dbl>
## 1 disturbance 171 1009. 1009 3.96
## 2 extratropical 2151 993. 995 14.3
## 3 hurricane 4803 969. 973 18.7
## 4 other low 1453 1009. 1009 5.26
## 5 subtropical depressi… 151 1008. 1007 3.45
## 6 subtropical storm 298 998. 998 7.24
## 7 tropical depression 3569 1008. 1008 3.87
## 8 tropical storm 6830 999. 1000 6.92
## 9 tropical wave 111 1009. 1009 1.84
## # ℹ 2 more variables: `min(pressure)` <int>, `max(pressure)` <int>
storms %>%
filter(lat > 11, lat < 12, long > -30, long < -25) %>%
group_by(status) %>%
summarise(Qtde = n(), media_pressao = mean(pressure), mediana_pressao = median(pressure), dp_pressao = sd(pressure), pressao_min = min(pressure), pressao_max = max(pressure))
## # A tibble: 2 × 7
## status Qtde media_pressao mediana_pressao dp_pressao pressao_min pressao_max
## <fct> <int> <dbl> <int> <dbl> <int> <int>
## 1 tropic… 13 1009. 1008 1.80 1008 1013
## 2 tropic… 15 1002. 1003 4.72 990 1006
Estatística Descritiva é o ramo da estatística que envolve a
organização, o resumo e a representação dos dados.
Estatística Inferencial é o ramo da estatística que envolve o uso de uma
amostra para chegar a conclusões sobre a população e tem como ferramenta
básica a probabilidade.
Média da População (\(\mu\)): É o valor central de todos
os dados de um grupo completo.
\[\mu = \frac{\sum_{i=1}^{N}
x_i}{N}\]
Média da Amostra (\(\bar{x}\)): É a estimativa
calculada a partir de um subconjunto da população.
\[\bar{x} = \frac{\sum_{i=1}^{n}
x_i}{n}\]
Utilizada quando todos os dados possuem o mesmo peso ou importância.
Utiliza-se para distribuições numéricas normais com poucos valores
discrepantes (outliers).
Fórmula:
\[\bar{x} = \frac{\sum x_i}{n}\] \[\bar{x} = \frac{2 + 4 + 8 + 16}{4}\]
Calculando no R
# Exemplo 1
x <- c(2,4,8,16)
mean(x)
## [1] 7.5
# Calculando em data.frame/matriz
data("storms")
# Exemplo 2
mean(storms$wind)
## [1] 50.04939
Quando temos dados NA
3 # Exemplo 3 - quando temos dados NA
## [1] 3
x <- c(2,4,8,16,NA)
mean(x)
## [1] NA
mean(x, na.rm = TRUE)
## [1] 7.5
4 # Exemplo 4 - com NA
## [1] 4
mean(storms$hurricane_force_diameter)
## [1] NA
# Retirando o NA
mean(na.omit(storms$hurricane_force_diameter))
## [1] 14.9207
# ou
mean(storms$hurricane_force_diameter, na.rm = TRUE)
## [1] 14.9207
Em dados tipo ‘factor’ não se calcula a média, mas se faz a contatem.
5 # Exemplo 5
## [1] 5
x <- c(TRUE, TRUE, TRUE, FALSE, TRUE)
mean(x)
## [1] 0.8
6 # Exemplo 6 - média em dados 'factor'
## [1] 6
# Usando a função table
print(table(storms$status))
##
## disturbance extratropical hurricane
## 171 2151 4803
## other low subtropical depression subtropical storm
## 1453 151 298
## tropical depression tropical storm tropical wave
## 3569 6830 111
# ou dplyr
print(storms %>% count(status))
## # A tibble: 9 × 2
## status n
## <fct> <int>
## 1 disturbance 171
## 2 extratropical 2151
## 3 hurricane 4803
## 4 other low 1453
## 5 subtropical depression 151
## 6 subtropical storm 298
## 7 tropical depression 3569
## 8 tropical storm 6830
## 9 tropical wave 111
Repare que os resultado das funções são distintos, considerando as
estruturas de dados e consequentemente, essas estruturas não podem ser
utilizadas indistintamente, por exemplo:
utilize o ‘table’ para funções ‘plot’; e
utilize o ‘dplyr’ para o ggplot.
Aplicada quando alguns elementos são mais importantes ou frequentes
que outros.
Fórmula geral
\[\bar{x} = \frac{\sum p_i \cdot
x_i}{n}\] Exemplo
\[\bar{x} = \frac{2 \cdot p_1 + 4 \cdot p_2 +
8 \cdot p_3 + 16 \cdot p_4}{\sum p_i}\] Utilizar a função
‘weight.mean()’
# Exemplo 1
notas <- c(8, 6, 7) # Criando o vetor de notas
pesos <- c(2, 3, 5) # Criando o vetor de pesos
weighted.mean(notas, pesos)
## [1] 6.9
Com dados NA
# Exemplo 2
valores <- c(10, 5, NA)
pesos <- c(2, 3, 5)
weighted.mean(valores, pesos, na.rm = TRUE)
## [1] 7
Fazendo o cálcuo sem utilizar função
# Exemplo 3 - Calculo manual
sum(notas * pesos) / sum(pesos)
## [1] 6.9
Cálculos em data-frames
# Exemplo 4 - pacote dplyr
# criando um data-frame
dados <- data.frame(
grupo = c("A", "A", "B", "B"),
valor = c(10, 20, 5, 15),
peso = c(1, 2, 1, 1))
# Realizando o cálculo
dados %>%
group_by(grupo) %>%
summarize(media_pond =
weighted.mean(valor, peso))
## # A tibble: 2 × 2
## grupo media_pond
## <chr> <dbl>
## 1 A 16.7
## 2 B 10
Ideal para analisar taxas de crescimento, variações percentuais
acumuladas ou progressões geométricas ao longo do tempo.
Exemplos:
Crescimento médio populacional, juros compostos ou valorização de ativos
financeiros.
Fórmula geral
\[mg = (\Pi x_i)^{1/n} \quad \text{ou} \quad
\bar{x} = \sqrt[n]{\Pi x_i}\]
Fórmula geral aplicada
\[mg = \sqrt[4]{x_1 x_2 x_3 x_4}\]
Utilizando a biblioteca ‘psych’ que contém a função ‘geometric.mean()’
# Exemplo 1
x <- c(2,4,8,16)
geometric.mean(x)
## [1] 5.656854
Com ‘NA’
# Exemplo 2
x <- c(2,4,8,16, NA)
geometric.mean(x) # também funciona
## [1] 5.656854
geometric.mean(x, na.rm = TRUE)
## [1] 5.656854
REalizando o cálculo sem a função
# Exemplo 3 - Cálculo manual
exp(mean(log(na.omit(x)))) # não funciona com NA
## [1] 5.656854
Utilizada para situações que envolvem grandezas inversamente
proporcionais.
Exemplos:
Velocidade média em trajetos iguais com tempos diferentes, vazão de água
ou densidade.
Fórmula Geral
\[H = \frac{n}{\frac{1}{x_1} + \frac{1}{x_2}
+ \frac{1}{x_3} + \dots + \frac{1}{x_n}}\] O pacote ‘psych’
possui a função ‘hamonic.mean()’
# Exemplo 1
x <- c(2,4,8,16)
harmonic.mean(x)
## [1] 4.266667
Dados com NA
# Exemplo 2
x <- c(2,4,8,16, NA)
harmonic.mean(x) # também funciona
## [1] 4.266667
harmonic.mean(x, na.rm = TRUE)
## [1] 4.266667
Cálculo Manual
# Exemplo 3 – Cálculo manual
x <- c(2,4,8,16)
length(x) / sum(1 / x)
## [1] 4.266667
Média aritmética >= média geométrica >= média harmônica
Se x=y, temos a igualdade
a(x,y) = g(x,y) = h(x,y)
É a medida de tendência central cujo valor ou dado que aparece com
maior frequência em um conjunto de informações.
Um conjunto de dados pode ser amodal (sem moda), bimodal ou
multimodal.
Como calcular.
# Exemplo 1
x <- c(2, 4, 7, 8, 16, 16, 16)
table(x)
## x
## 2 4 7 8 16
## 1 1 1 1 3
max(table(x))
## [1] 3
Observe que o resultado é a frequência máxima, 3 e não o valor que surgiu 3 vezes. Para identificar o valor que surgiu com mais freência, utilize:
# Exemplo 2
x <- c(2, 3, 3, 3, 4, 6, 8, 16)
which.max(table(x))
## 3
## 2
O resultado indica o valor (3) e a posição dele no vetor produzido
pelo comando ‘table’ (2).
Em dados tipo ‘factor’ podemos calcular a moda.
É o valor central de um conjunto de dados quando eles estão
organizados em ordem crescente ou decrescente, dividindo o conjunto em
duas metades. O cálculo da mediana é útil para analisar tendências sem a
influência de valores extremos (outliers).
O passo-a-passo para realizar o cálculo é o seguinte:
1º) Ordene os dados: coloque todos os números do conjunto do menor para
o maior (ou vice-versa).
2º) Verifique a quantidade de dados (n):
Se n for ímpar: a mediana é o número que está exatamente no meio da
lista ordenada.
Exemplo: Para 2, 3, 5, 7, 9, a mediana é 5.
Se n for par: a mediana é a média aritmética dos dois números centrais.
Some esses dois números e divida por 2.
Exemplo: Para 2, 3, 5, 7, 9, 10, a mediana é (5 + 7) / 2 = 6
Calculando
# Exemplo 1 - Quantidade par de dados - média aritmética dos valores centrais
x <- c(2,4,8,16,NA)
median(x, na.rm = TRUE)
## [1] 6
# Exemplo 2 - Quantidade impar de dados - valor do elemento central
x <- c(2,4,7,8,16)
median(x, na.rm = TRUE)
## [1] 7
As medidas de posição são a mediana, quartis, decis, e
percentis.
A figura é autoexplicativa.
Uma forma de ver a mediana e quartis é com a
utilização dos gráficos boxplot que podem ser executados tanto com o
pacote do ‘ggplot2’ como com os comandos nativos do ‘plot’.
O código para confecção deste gráfico pode ser melhor compreendido na
seção de elaboração de gráficos.
Uma medida de dispersão (ou variabilidade) é um parâmetro estatístico
utilizado para quantificar o grau de afastamento dos valores de um
conjunto de dados em relação à sua média. Enquanto as medidas de
tendência central (como a média ou a mediana) descrevem o “centro” dos
dados, as de dispersão indicam se esses dados estão concentrados ou
muito espalhados.
É a diferença entre o valor máximo e o mínimo em um conjunto de dados, e o seu cálculo é realizado da seguinte forma:
max(storms$wind) - min(storms$wind)
## [1] 155
Variância Populacional e Amostral
A variância mede a dispersão dos dados em relação à média.
**Variância da População (\(\sigma^2\)): utilizada quando temos acesso
a todos os indivíduos do grupo.
\[\sigma^2 = \frac{\sum_{i=1}^{N} (x_i -
\mu)^2}{N}\]
Variância da Amostra (\(s^2\)): Utilizada para estimar a variância populacional a partir de um subconjunto, aplicando a correção de ‘n-1’ (para eliminar viés no cálculo).
\[s^2 = \frac{\sum_{i=1}^{n} (x_i -
\bar{x})^2}{n - 1}\] Por definição a variância de uma amostra é a
média dos desvios quadráticos, representadas pela fórmula acima.
Cálculo da variância dos ventos registrados na base de dados
‘storms’.
var(storms$wind)
## [1] 648.1868
O desvio padrão indica o quanto, em média, os dados se afastam da média, na mesma unidade de medida original dos dados.
Desvio Padrão da População (\(\sigma\)):
\[\sigma = \sqrt{\frac{\sum_{i=1}^{N} (x_i -
\mu)^2}{N}}\]
Desvio Padrão da Amostra (\(s\)): Por definição o desvio
padrão de uma amostra é a raiz quadrada da variância. É representado
pela fórmula:
\[SD_{Amostra} = \sqrt{\frac{\sum |x -
\bar{x}|^2}{n - 1}}\]
Cálculo do desvio padrão dos ventos registrados na base de dados ‘storms’.
sd(storms$wind)
## [1] 25.45951
Em estatística, o erro padrão (EP) é uma medida da precisão de uma
estatística amostral (como a média, mediana, proporção, etc.) como
estimativa de um parâmetro populacional.
Em termos mais simples, ele nos diz o quanto a média da nossa amostra
(ou outra estatística) provavelmente varia de uma amostra para
outra.
Imagine que você tira várias amostras de uma mesma população e calcula a
média para cada uma delas. Se você plotasse todas essas médias, elas não
seriam exatamente iguais; elas teriam uma certa variabilidade.
O erro padrão da média é o desvio padrão dessa distribuição de médias
amostrais.
Diferente do desvio padrão, que mede a dispersão dos dados individuais,
o erro padrão indica a precisão da estimativa da média amostral em
relação à média real da população. Quanto maior o tamanho da amostra
(n), menor tende a ser o erro padrão.
O erro padrão (SE) não possui uma função nativa única (como o desvio
padrão), mas é facilmente calculado dividindo o desvio padrão da amostra
pela raiz quadrada do tamanho da amostra.
\[SE = \frac{sd}{\sqrt{n}}\]
Cálculo
# 1. Obter os dados da variável 'wind', removendo valores ausentes (NA)
wind_data <- na.omit(storms$wind)
# 2. Calcular o desvio padrão (s) da amostra
sd_wind <- sd(wind_data)
print(paste("Desvio Padrão do vento (s):", round(sd_wind, 2)))
## [1] "Desvio Padrão do vento (s): 25.46"
# 3. Calcular o tamanho da amostra (n)
n_wind <- length(wind_data)
print(paste("Tamanho da amostra (n):", n_wind))
## [1] "Tamanho da amostra (n): 19537"
# 4. Calcular o Erro Padrão da Média
se_wind <- sd_wind / sqrt(n_wind)
print(paste("Erro Padrão da Média do vento (EP_m):", round(se_wind, 2)))
## [1] "Erro Padrão da Média do vento (EP_m): 0.18"
# Para fins de comparação, a média do vento
mean_wind <- mean(wind_data)
print(paste("Média do vento:", round(mean_wind, 2)))
## [1] "Média do vento: 50.05"
Podemos calcular de forma mais direta.
se_wind <- sd(storms$wind, na.rm = TRUE) / sqrt(sum(!is.na(storms$wind)))
print(se_wind)
## [1] 0.1821466
Cálculo utilizando o pacote ‘plotrix’, função ‘std.error()’
se_wind_pkg <- std.error(storms$wind, na.rm = TRUE)
print(se_wind_pkg)
## [1] 0.1821466
É comum querer o erro padrão para diferentes grupos. Usando o dplyr,
você pode calcular o erro para cada categoria de tempestade:
Exemplo
storms_summary <- storms %>%
group_by(category) %>%
summarize(
media_wind = mean(wind, na.rm = TRUE),
erro_padrao = sd(wind, na.rm = TRUE) / sqrt(n()) )
print(storms_summary)
## # A tibble: 6 × 3
## category media_wind erro_padrao
## <dbl> <dbl> <dbl>
## 1 1 71.0 0.110
## 2 2 89.5 0.120
## 3 3 104. 0.172
## 4 4 122. 0.273
## 5 5 146. 0.578
## 6 NA 38.1 0.0986
Diferença entre o 3º e o 1º quartil, útil para identificar dispersão
ignorando valores extremos (outliers). É o ‘box’ de um boxplot.
Cálculo
IQR(storms$wind)
## [1] 35
| Variancia | Desvio Padrão | Média | |
|---|---|---|---|
| População | \[\sigma^2 = \frac{\sum_{i=1}^{N}(x_i - \mu)^2}{N}\] | \[\sigma = \sqrt{\sigma^2} = \sqrt{\frac{\sum_{i=1}^{N}(x_i - \mu)^2}{N}}\] | \[\mu = \frac{\sum_{i=1}^{N} x_i}{N}\] |
| Amostra | \[s^2 = \frac{\sum_{i=1}^{n}(x_i - \bar{x})^2}{n - 1}\] | \[s = \sqrt{s^2} = \sqrt{\frac{\sum_{i=1}^{n}(x_i - \bar{x})^2}{n - 1}}\] | \[\bar{x} = \frac{\sum_{i=1}^{n} x_i}{n}\] |
Um histograma é uma ferramenta gráfica da estatística utilizada para
representar a distribuição de frequências de uma variável quantitativa
contínua (ou discreta com muitos valores). Ele é composto por uma série
de retângulos (barras) adjacentes, onde a base representa os intervalos
de classe e a altura representa a frequência (ou densidade) de
ocorrência de dados naquele intervalo.
Para que ele serve?
Diferente do gráfico de barras comum, que compara categorias isoladas, o
histograma serve para:
* Visualizar a Forma da Distribuição: permite identificar rapidamente se
os dados seguem uma distribuição Normal (curva em sino), se estão
concentrados à esquerda (assimetria positiva) ou à direita (assimetria
negativa).
* Identificar a Dispersão e o Centro: Ajuda a localizar onde a maioria
dos dados está concentrada (tendência central) e o quão espalhados eles
estão em relação a esse centro.
* Detectar Outliers e Lacunas: facilita a visualização de valores
atípicos (extremamente altos ou baixos) ou intervalos onde não há
ocorrência de dados.
* Analisar a Variabilidade de Processos: é essencial em áreas de
controle de qualidade e pesquisa acadêmica para verificar se um processo
está dentro dos limites esperados.
Calcular manualmente um histograma como o R faz exige transformar dados brutos em uma tabela de frequências agrupadas. O processo segue cinco etapas lógicas:
1. Organização e Amplitude
Primeiro, ordene seus dados do menor para o maior para identificar os extremos.
Valor Mínimo e Máximo: Identifique o menor e o
maior valor (ex: na base storms, o vento mínimo e
máximo).
Amplitude Total: 𝑅=𝑋𝑚𝑎𝑥−𝑋𝑚𝑖𝑛
2. Definição do Número de Classes
O R utiliza algoritmos automáticos (como a Regra de Sturges) para decidir em quantas barras dividir os dados.
Fórmula de Sturges:
𝑘=1+3,3⋅log10(𝑛)
, onde 𝑛 é o número total de observações.
Arredondamento: O resultado deve ser arredondado para o número inteiro mais próximo.
3. Cálculo da Amplitude da Classe ℎ
Para que todas as barras tenham a mesma largura (como é o padrão no R), divida a Amplitude Total pelo número de classes:
ℎ=𝑅/𝑘
4. Construção dos Intervalos (Bins)
Determine os limites de cada barra:
Primeira Classe: Começa no valor mínimo. O limite superior será 𝑀í𝑛𝑖𝑚𝑜+ℎ
Classes Seguintes: O limite inferior de uma classe é o limite superior da anterior.
Nota: Por padrão, o R usa intervalos fechados à direita (ex: ]10,20] ), o que significa que o valor 20 entra na barra, mas o 10 pertence à anterior.
Exemplo:
Para calcular manualmente o histograma da coluna
wind (velocidade do vento em nós) da base
storms seguindo o padrão do R (Regra de Sturges),
utilizaremos os dados estatísticos reais da base:
1. Coleta e Organização dos Dados.
Total de observações: A base storms
possui aproximadamente 11.859 observações.
Valor Mínimo: 10 nós.
Valor Máximo: 160 nós.
2. Cálculo da Amplitude Total
𝑅=160−10=150 nós
3. Definição do Número de Classes - O R usa a Regra de
Sturges por padrão:
𝑘=1+3,322⋅log10(𝑛)
𝑘=1+3,322⋅log10(11.859)≈1+3,322⋅4,07≈14,5
Arredondamos para 15 classes (barras).
4. Cálculo da Largura da Classe
ℎ=150/15=10 nós
Cada barra terá uma largura de 10 nós.
5. Construção dos Intervalos e Frequência
kable(table(cut(storms$wind, breaks = seq(10, 160, by = 10))))
| Var1 | Freq |
|---|---|
| (10,20] | 922 |
| (20,30] | 4793 |
| (30,40] | 3736 |
| (40,50] | 3034 |
| (50,60] | 2050 |
| (60,70] | 1653 |
| (70,80] | 1026 |
| (80,90] | 762 |
| (90,100] | 492 |
| (100,110] | 339 |
| (110,120] | 320 |
| (120,130] | 193 |
| (130,140] | 80 |
| (140,150] | 52 |
| (150,160] | 23 |
6. Desenho do Gráfico.
Eixo X: Marque os pontos 10, 20, 30… até 160.
Eixo Y: Representa a contagem (frequência) de cada intervalo.
Barras: Desenhe retângulos encostados uns nos outros, onde a altura é a frequência calculada no passo anterior.
Nota: No caso específico da base
storms, a velocidade do vento costuma ser arredondada para
múltiplos de 5 ou 10, o que fará com que algumas barras sejam muito mais
altas que outras (frequência concentrada em valores como 35, 45, 65
nós).
Para criar um histograma no R utilizando a função básica hist(), o comando mínimo necessário é hist(dados).
hist(storms$wind)
Abaixo estão os principais parâmetros para configurar e personalizar
o gráfico:
1. Estrutura e Intervalos (Bins)
breaks: Controla o número de colunas ou os pontos de corte.
Você pode informar um número aproximado de barras (ex: breaks = 10) ou
um vetor com os limites exatos (ex: breaks = c(0, 5, 10, 15)). freq:
Define o que o eixo Y representa. Se TRUE (padrão), mostra a frequência
absoluta (contagem); se FALSE ou prob = TRUE, mostra a densidade.
2. Títulos e Eixos main: define o título principal do
gráfico.
xlab e ylab: alteram os nomes dos eixos X e Y, respectivamente.
xlim e ylim: definem os limites numéricos de visualização dos eixos (ex:
xlim = c(0, 100)).
3. Estética e Cores col: define a cor de preenchimento
das barras (ex: col = “blue” ou col = “tomato”).
border: Define a cor das bordas das colunas.
labels: Se TRUE, exibe os valores exatos (contagens) acima de cada
barra.
density e angle: Adicionam hachuras (linhas inclinadas) dentro das
barras para sombreamento.
Exemplo:
# 1. Cálculos Estatísticos
vento <- storms$wind
media <- mean(vento, na.rm = TRUE)
mediana <- median(vento, na.rm = TRUE)
# Cálculo da Moda (valor mais frequente)
tab_vento <- table(vento)
moda <- as.numeric(names(tab_vento)[tab_vento == max(tab_vento)])[1]
# 2. Configurar o ambiente gráfico
par(mar = c(5, 5, 4, 2)) # Ajusta as margens
# 3. Criar o histograma com detalhes avançados
h <- hist(storms$wind,
breaks = 20, # Define o número de faixas (bins)
col = "skyblue", # Cor de preenchimento
border = "white", # Cor da borda das colunas
main = "Distribuição da Velocidade dos Ventos",
xlab = "Vento (nós)", # Rótulo do eixo X
ylab = "Frequência", # Rótulo do eixo Y
las = 1, # Rotaciona números do eixo Y para horizontal
cex.main = 1.5, # Aumenta o tamanho do título
cex.axis = 0.8, # Diminui o tamanho dos números dos eixos
font.lab = 2, # Coloca os rótulos dos eixos em negrito
ylim = c(0, 5000)) # Ajusta o limite do eixo Y para o texto caber
# 4. Adicionar uma linha vertical indicando a média
abline(v = media, col = "red", lwd = 2, lty = 2) # Média (Tracejada)
abline(v = mediana, col = "blue", lwd = 2, lty = 4) # Mediana (Ponto e traço)
abline(v = moda, col = "darkgreen", lwd = 2, lty = 1) # Moda (Contínua)
# 5. Adicionar grade horizontal de fundo
grid(nx = NA, ny = NULL, col = "gray", lty = "dotted")
# 6. Adicionar uma legenda explicativa
legend("topright",
legend = c(paste("Média:", round(media, 1)),
paste("Mediana:", mediana),
paste("Moda:", moda)),
col = c("red", "blue", "darkgreen"),
lty = c(2,2,2),
lwd = 2,
bty = "n",
cex = 0.8)
Outro
# 1. Cálculos Estatísticos
vento <- storms$wind
media <- mean(vento, na.rm = TRUE)
mediana <- median(vento, na.rm = TRUE)
# Cálculo da Moda (valor mais frequente)
tab_vento <- table(vento)
moda <- as.numeric(names(tab_vento)[tab_vento == max(tab_vento)])[1]
# 2. Configurações de layout
par(mar = c(5, 5, 4, 2))
# 3. Criar o Histograma de Densidade
hist(vento,
prob = TRUE,
breaks = 25,
col = "#E6E6FA", # Lavender
border = "white",
main = "Distribuição de Ventos: Média, Mediana e Moda",
xlab = "Vento (nós)",
ylab = "Densidade (Proporção)",
las = 1,
ylim = c(0, 0.04))
# 4. Adicionar a Curva de Densidade
lines(density(vento), col = "darkorchid", lwd = 3)
# 5. Adicionar Linhas Verticais para as Medidas de Tendência Central
abline(v = media, col = "red", lwd = 2, lty = 2) # Média (Tracejada)
abline(v = mediana, col = "blue", lwd = 2, lty = 4) # Mediana (Ponto e traço)
abline(v = moda, col = "darkgreen", lwd = 2, lty = 1) # Moda (Contínua)
# 6. Adicionar Legenda Detalhada
legend("topright",
legend = c("Densidade",
paste("Média:", round(media, 1)),
paste("Mediana:", mediana),
paste("Moda:", moda)),
col = c("darkorchid", "red", "blue", "darkgreen"),
lty = c(1, 2, 4, 1),
lwd = 2,
bty = "n",
cex = 0.9)
# 7. Adicionar o "Rug Plot" para ver a concentração real dos dados
rug(vento, col = "gray40")
Detalhes técnicos desta visualização:
prob = TRUE: Esta é a configuração
chave. Ela muda o eixo Y de “Contagem” (1000, 2000…) para “Densidade”
(0.01, 0.02…), permitindo comparar a frequência relativa.
lines(density(...)): Agora a linha
de densidade se encaixa perfeitamente sobre as barras, o que não
acontece no gráfico de frequência absoluta.
rug(): Adicionei pequenas marcas no
eixo X que representam cada ponto de dado individual, excelente para
identificar outliers ou lacunas nos dados de vento.
Ajuste de ylim: Como os valores de
densidade são decimais pequenos, definimos o limite superior (ex:
0.035) para garantir que o título e a legenda não fiquem em
cima das barras.
A avaliação de assimetria quantifica o grau de desvio de um conjunto
de dados em relação a uma distribuição simétrica. Ela é essencial para
entender a forma da distribuição e identificar onde os dados estão
concentrados.
A assimetria de um conjunto de números é o terceiro momento central
dividido pelo segundo momento central elevado à potência de três
meios.
As principais utilidades dessa análise incluem:
identificação de Tendências e Padrões: permite descobrir nuances e
padrões ocultos que medidas de centro (como média) sozinhas não
revelariam.
Seleção de Modelos Estatísticos: ajuda a escolher o modelo
probabilístico mais adequado para descrever o comportamento dos dados
observados.
Diagnóstico da Forma da Curva: permite antecipar o formato de um
histograma e suas caudas (esquerda ou direita) sem a necessidade
imediata de construí-lo graficamente.
Detecção de Valores Extremos (Outliers): ajuda a identificar a
influência de valores muito altos ou baixos que podem distorcer a média
e comprometer testes estatísticos ou modelos de previsão.
Verificação de Normalidade: é um passo crucial para verificar se os
dados se aproximam de uma distribuição normal, onde a assimetria deve
ser próxima de zero.
Tipos de Assimetria
Simétrica: Média, mediana e moda coincidem no
centro.
Positiva (à direita): a cauda é mais longa para o lado
direito; a média é maior que a mediana e a moda.
Negativa (à esquerda): a cauda é mais longa para o lado
esquerdo; a média é menor que a moda.
Avaliação Numérica (Coeficiente de Assimetria)
O R não possui uma função de assimetria nativa no pacote base, por
isso é comum utilizar os pacotes moments ou
e1071.
Para exemplificar, utilizaremos a base de dados airquaity -
data(airquality).
install.packages(“moments”)
library(moments)
skewness(meus_dados)
Quando skewness:
= 0: distribuição simétrica (como a distribuição
normal).
> 0 (Positiva) - cauda à direita. A maioria dos
dados está concentrada à esquerda (valores baixos).
< 0 (Negativa) - cauda à esquerda. A maioria dos
dados está concentrada à direita (valores altos).
data(airquality)
skewness(airquality$Wind) # >0, leve assimetria positiva
## [1] 0.3443985
skewness(airquality$Temp) # <0, leve assimetria negativa
## [1] -0.3741696
Avaliação Visual
Gráficos são essenciais para confirmar se a assimetria calculada faz
sentido fisicamente.
Com Histograma
Com Boxplot
boxplot(meus_dados).
Se a linha da mediana estiver mais próxima da parte inferior da caixa e
o “bigode” superior for mais longo, há assimetria positiva.
Sintetizando
Testes Estatísticos
Para verificar se a assimetria é estatisticamente significativa, você
pode usar o Teste de D’Agostino disponível no pacote moments.
Se o p-valor < 0,05, a distribuição é considerada
significativamente assimétrica.
agostino.test(na.omit(airquality$Ozone))
##
## D'Agostino skewness test
##
## data: na.omit(airquality$Ozone)
## skew = 1.2257, z = 4.6564, p-value = 0.000003219
## alternative hypothesis: data have a skewness
agostino.test(na.omit(airquality$Solar.R))
##
## D'Agostino skewness test
##
## data: na.omit(airquality$Solar.R)
## skew = -0.42363, z = -2.10903, p-value = 0.03494
## alternative hypothesis: data have a skewness
A correlação é uma medida estatística que indica a força e a direção da relação linear entre duas variáveis quantitativas. Em termos simples, ela nos diz o quanto uma variável tende a mudar quando a outra muda.
A métrica mais comum é o Coeficiente de Correlação de Pearson (\(r\)), que varia entre \(-1\) e \(1\):
A análise de correlação é fundamental para:
Para interpretar o coeficiente de Pearson, observamos dois
fatores:
Vamos utilizar o pacote ggplot2 para visualização e a
função nativa cor() para o cálculo.
Utilizaremos o dataset mtcars como exemplo para analisar
a relação entre peso do carro (wt) e consumo
(mpg).
data("mtcars")
# Cálculo do coeficiente de Pearson
correlacao <- cor(mtcars$wt, mtcars$mpg)
print(paste("O coeficiente de correlação é:", round(correlacao, 2)))
## [1] "O coeficiente de correlação é: -0.87"
O gráfico ideal para visualizar correlação é o Gráfico de Dispersão (Scatter Plot).
ggplot(mtcars, aes(x = wt, y = mpg)) +
geom_point(color = "blue", size = 3, alpha = 0.6) + # Pontos
geom_smooth(method = "lm", col = "red") + # Linha de tendência linear
labs(title = "Relação entre Peso e Consumo",
x = "Peso (1000 lbs)",
y = "Milhas por Galão (mpg)",
subtitle = paste("Correlação de Pearson:", round(correlacao, 2))) +
theme_minimal()
A probabilidade de um evento (acontecimento ou resultado) é a
proporção do número de vezes em que eventos do mesmo tipo ocorrem ao
longo do tempo.
Se determinada situação, experimento ou tentativa é repetida um grande
número de vezes, a proporção de sucessos tenderá para a probabilidade de
que um dado resultado qualquer seja um sucesso.
A probabilidade pode ser entendida através da frequência relativa. Se
repetirmos um experimento aleatório (como lançar uma moeda) infinitas
vezes, a proporção de sucessos convergirá para um valor fixo.
Exemplo: simulação: 1.000 Lançamentos de Moeda.
Abaixo, observamos como a média acumulada de “Caras” (1) estabiliza em
torno de 0,5 à medida que o número de tentativas aumenta.
O gráfico de convergência de probabilidade, frequentemente utilizado
para ilustrar a Lei dos Grandes Números, apresenta um comportamento
muito específico que divide a intuição da realidade estatística.
Quando simulamos 1.000 lançamentos de moedas, observamos três fases
principais no gráfico:
1. A Fase de Instabilidade Inicial (Baixo \(n\))
Nos primeiros lançamentos (digamos, entre 1 e 50), a linha oscila de
forma errática.Por que ocorre: Como o número de tentativas é pequeno,
cada novo resultado tem um peso enorme sobre a média. Se o primeiro
lançamento for “Cara”, a média é 100%. Se o segundo for “Coroa”, ela cai
bruscamente para 50%.Visual: No gráfico, você verá “picos” e “vales”
agudos que podem chegar longe da linha teórica de 0,5.
2. A Fase de Amortecimento
À medida que o número de lançamentos (\(n\)) avança para a casa dos 100 a 500, as
oscilações começam a diminuir de amplitude.O efeito acumulado: Cada novo
lançamento individual agora representa apenas uma pequena fração do
total acumulado. Um resultado isolado de “Coroa” já não tem força para
“puxar” a média para baixo drasticamente se você já tem 200 lançamentos
registrados.Visual: A linha começa a suavizar, aproximando-se da linha
horizontal de 0,5, mas ainda cruzando-a ocasionalmente.
3. A Convergência Final (Rumo a 1.000)
Ao chegar perto de 1.000 lançamentos, a linha azul tende a “colar” na
linha vermelha (0,5).A Lei dos Grandes Números: a
probabilidade teórica (0,5) manifesta-se através da frequência relativa.
Embora a diferença absoluta entre o número de Caras e Coroas possa até
aumentar, a proporção entre elas torna-se cada vez mais estável.
Visual: A linha parece quase reta, indicando que o erro amostral foi
diluído pela massa de dados.
Por que isso é importante? Este gráfico ajuda a
combater a “Falácia do Apostador”. Muitos acreditam que, se saíram 5
“Caras” seguidas, a próxima precisa ser “Coroa” para “compensar”.O
gráfico mostra que a natureza não “compensa” resultados passados; ela
apenas dilui as anomalias iniciais com uma quantidade massiva de novos
eventos independentes. É a transição do caos individual para a ordem
coletiva.
O Histograma é a representação gráfica de uma tabela de frequências.
Enquanto o histograma lida com contagens em intervalos.
Vamos utilizar o lançamento de dados como um exemplo de Distribuição
Uniforme Discreta. Nele, cada face (1 a 6) tem a mesma probabilidade
teórica de ocorrer (\(1/6 \approx
16,7\%\)).
1. Construindo a Base: Tabelas de Frequência
Antes do gráfico, precisamos tabular os dados. Imagine que lançamos um
dado \(n\) vezes, a Frequência
Absoluta (\(f_i\)) é a
contagem simples.Quantas vezes a face “4” apareceu?
A Frequência Relativa (\(fr_i\)): é a proporção. \(fr_i = \frac{f_i}{n}\). Se a face “4”
apareceu 20 vezes em 100 lançamentos, a frequência relativa é \(0,20\) (ou 20%).
Abaixo, apresentamos a distribuição das faces de um dado após 100
lançamentos. Esta tabela é a base para a construção do histograma,
permitindo observar a contagem bruta (Frequência
Absoluta) e a proporção de cada evento (Frequência
Relativa).
| Face do Dado | Frequência Absoluta (fi) | Frequência Relativa (fr) | Percentual (%) |
|---|---|---|---|
| 1 | 15 | 0.15 | 15% |
| 2 | 24 | 0.24 | 24% |
| 3 | 10 | 0.10 | 10% |
| 4 | 19 | 0.19 | 19% |
| 5 | 19 | 0.19 | 19% |
| 6 | 13 | 0.13 | 13% |
O histograma de frequências.
Histograma de frequência relativa
Histograma com frequência relativa e curva densidade
Neste caso específico, ao somarmos as probabilidades de cada face do
dados (colunas do gráfico) obteremos 100% (15+24+10+19+19+13).
Assim como ocorre no lançamento de moedas, a probabilidade teórica de
cada face é \(1/6\), (\(16,67%\)) mas com poucos lançamentos, essa
probabilidade não será representada. Conforme a quantidade de
lançamentos aumenta e tende ao infinito, essa tendência se aproxima de
\(1/6\), (\(16,67%\)).
Veja os histogramas das simulações de lançamento de 5, 20, 100, 500 1000
e 10.000 dados indicando o fenômeno da Lei dos Grandes Números.
### Curva Densidade de Probabilidade (PDF) e Curva Densidade Acumulada
(CDF)
No histograma de 10.000 lançamentos, observamos que o gráfico toma a
tendência de uma distribuição uniforme, com a probabilidade igual para
todos os eventos.
Veja como seria uma distribuição teórica uniforme variando de 1 a 6.
Ou seja, qualquer valor de x, x variando de 1 a 6, tem a mesma
probabilidade de ocorrência. Repare que de forma diferente do histograma
de lançamento de dados que é discreto, essa distribuição é contínua, ou
seja, qualquer valor Real entre 1 e 6. A altura da densidade é
calculada pela fórmula \[f(x) = \begin{cases}
\frac{1}{b - a} & \text{se } a \le x \le b \\ 0 & \text{caso
contrário} \end{cases}\] . Ao fazermos essa transformação,
passamos a calcular a probabilidade calculando a área sob a curva
(integral). Veja o exemploAbaixo do gráfico que destaca a área
correspondente à probabilidade de um valor ser menor que \(2,3\) em uma distribuição \(U(1, 6)\).
Assi, uma Curva de Densidade de Probabilidade (PDF -
Probability Density Function) é uma representação matemática e
gráfica que descreve a distribuição de uma variável aleatória contínua
(como altura, peso, tempo ou temperatura).
Diferente de variáveis discretas (como o lançamento de um dado), onde
somamos as probabilidades de pontos isolados, em variáveis contínuas a
probabilidade de um valor exato ocorrer é tecnicamente zero. Por isso,
usamos a área sob a curva para encontrar a probabilidade de um
intervalo.
Afunção densidade probabilidade é muito útil para modelar
fenômenos, calcular riscos e realizar inferência
estatística. Esse conceito será expandido para outras
distribuições de probabilidades mas, antes, vamos ver mais um conceito
muito útil, a Função de Densidade Acumulada em inglês,
Cumulative Distribution Function (CDF) ou em Português
Função Densidade Acumulada (FDA).
Enquanto a curva de densidade (PDF) mostra a probabilidade em cada
ponto, a curva acumulada mostra a probabilidade de a variável ser menor
ou igual a um valor \(x\).O conceito
matemáticoPara uma distribuição uniforme no intervalo \([a, b]\), a FDA é definida como:
\(0\) para \(x < a\)\(\frac{x - a}{b - a}\) para \(a \le x \le b\)\(1\) para \(x >
b\)
Nele calculamos a probabilidade
Agora, sim com os conceitos de histograma, Curva Densidade de
Probabilidade e Curva Densidade Acumulada, podemos apresentar outras
distribuições de probabilidades muito úteis, ou por representarem grande
quantidade de eventos da natureza, ou para a compreensão desses eventos
por meio da realização de testes estatísticos.
A compreensão das diferenças entre a Função de Densidade de
Probabilidade (PDF) e a Função de Distribuição
Acumulada (CDF) é fundamental para a análise estatística.
Enquanto a PDF nos mostra “onde” os dados estão concentrados, a FDA nos
mostra “quanto” de probabilidade já foi acumulado até certo ponto.
| Caracteristica | PDF (Densidade) | CDF (Acumulada) |
|---|---|---|
| Definição | Densidade de probabilidade em x | Probabilidade acumulada até x |
| O que o eixo Y mostra? | Concentração de probabilidade | Probabilidade total P(X ≤ x) |
| Como ler P(X < a)? | Área sob a curva à esquerda de ‘a’ | Valor direto da coordenada Y em ‘a’ |
| Valor Máximo em Y | Pode ser > 1 (em distribuições estreitas) | Sempre exatamente 1.0 |
| Formato (Ex: Normal) | Formato de Sino | Formato de ‘S’ (Sigmoide) |
| Uso Principal | Visualizar a forma e o centro dos dados | Cálculo de riscos, quartis e percentis |
A distribuição Normal é a distribuição de probabilidade contínua mais importante da estatística, caracterizada por sua forma de sino e simetria em torno da média.
A distribuição Normal descreve como os valores de uma variável
aleatória contínua se distribuem. Ela é definida por dois parâmetros
fundamentais:
* Média (\(\mu\)):
Determina o centro da distribuição (localização).
* Desvio Padrão (\(\sigma\)): Determina a dispersão
ou largura da curva.
Sua característica principal é que a média, a mediana e a moda coincidem no mesmo ponto central. Além disso, a curva é assintótica, ou seja, aproxima-se do eixo horizontal sem nunca tocá-lo.
A distribuição Normal é a base da inferência estatística clássica.
Sua finalidade principal reside no Teorema Central do Limite
(TCL), que afirma que a soma de muitas variáveis independentes
tende a uma distribuição normal, independentemente da forma da
distribuição original.
É utilizada para:
* Modelar fenômenos naturais (altura, peso, pressão arterial).
* Calcular erros de medida em experimentos científicos.
* Base para testes de hipóteses paramétricos (Teste t, ANOVA).
Abaixo, apresentamos a Curva Normal Padrão (onde \(\mu=0\) e \(\sigma=1\)). Observe como a maior densidade de probabilidade está concentrada próxima ao centro.
Exemplo: Distribuição Normal na Natureza
Fenômenos naturais, como a altura humana, tendem a se concentrar em
torno de uma média, formando a “Curva de Gauss”.
A Função de Densidade de Probabilidade (PDF) é dada pela
equação:
\[f(x) = \frac{1}{\sigma\sqrt{2\pi}}
e^{-\frac{1}{2}\left(\frac{x-\mu}{\sigma}\right)^2}\]
Um conceito vital é a Regra Empírica (68-95-99.7):Aproximadamente 68%
dos dados estão dentro de \(\pm
1\sigma\).Aproximadamente 95% dos dados estão dentro de \(\pm 2\sigma\).Aproximadamente 99,7% dos
dados estão dentro de \(\pm
3\sigma\).
Veja no painel abaixo, as diversas representações para a PDF e CDF ou FDA.
Para interpretar corretamente os resultados estatísticos, é essencial
entender como a probabilidade se manifesta visualmente em cada tipo de
função.
A tabela abaixo resume como realizar os cálculos mais comuns utilizando
as duas representações e suas respectivas funções.
| Cenário Desejado | Na Função Densidade (PDF) | Na Função Acumulada (FDA) | Função no R |
|---|---|---|---|
| Probabilidade à esquerda \(P(X < a)\) | Área da cauda esquerda até \(a\). | Valor de \(y\) no ponto \(a\). | pnorm(a, ...) |
| Probabilidade entre dois pontos \(P(a < X < b)\) | Área entre \(a\) e \(b\). | Diferença vertical: \(F(b) - F(a)\). | pnorm(b) - pnorm(a) |
| Probabilidade à direita \(P(X > a)\) | Área da cauda direita a partir de \(a\). | O complemento: \(1 - F(a)\). | 1 - pnorm(a, ...) |
Na Função de Densidade (PDF):
* Pico da Curva: Indica o valor mais provável (Moda).
Em distribuições simétricas, como a Normal, o pico coincide com a Média
(\(\mu\)).
* Dispersão: Quanto mais “achatada” for a curva, maior
é o Desvio Padrão (\(\sigma\)).
* Área Total: É sempre 1. Isso garante
que a probabilidade total do espaço amostral seja 100%.
Na Função Acumulada (FDA):
* Crescimento: A curva é sempre não-decrescente (nunca
desce), pois a probabilidade acumulada só pode aumentar ou estagnar. *
Mediana (\(P_{50}\)):
É o valor de \(x\) onde a curva atinge
exatamente \(0.5\) no eixo \(y\).
* Limites: O eixo \(y\) está sempre contido no intervalo \([0, 1]\). Se a curva atingiu \(1\), todos os eventos possíveis já foram
contabilizados.
O Z-crítico (\(z_c\)) é o valor de desvios padrão que delimita a fronteira da região de rejeição em um teste de hipóteses ou a margem de erro em um intervalo de confiança.
Para encontrar o Z-crítico, primeiro definimos o nível de
significância \(\alpha\) (geralmente 5%
ou 0,05).
A maioria das tabelas normais padrão fornece a probabilidade
acumulada à esquerda de \(Z\).
| .00 | .01 | .02 | .03 | .04 | .05 | .06 | .07 | .08 | .09 | |
|---|---|---|---|---|---|---|---|---|---|---|
| 1.0 | 0.8413 | 0.8438 | 0.8461 | 0.8485 | 0.8508 | 0.8531 | 0.8554 | 0.8577 | 0.8599 | 0.8621 |
| 1.1 | 0.8643 | 0.8665 | 0.8686 | 0.8708 | 0.8729 | 0.8749 | 0.8770 | 0.8790 | 0.8810 | 0.8830 |
| 1.2 | 0.8849 | 0.8869 | 0.8888 | 0.8907 | 0.8925 | 0.8944 | 0.8962 | 0.8980 | 0.8997 | 0.9015 |
| 1.3 | 0.9032 | 0.9049 | 0.9066 | 0.9082 | 0.9099 | 0.9115 | 0.9131 | 0.9147 | 0.9162 | 0.9177 |
| 1.4 | 0.9192 | 0.9207 | 0.9222 | 0.9236 | 0.9251 | 0.9265 | 0.9279 | 0.9292 | 0.9306 | 0.9319 |
| 1.5 | 0.9332 | 0.9345 | 0.9357 | 0.9370 | 0.9382 | 0.9394 | 0.9406 | 0.9418 | 0.9429 | 0.9441 |
| 1.6 | 0.9452 | 0.9463 | 0.9474 | 0.9484 | 0.9495 | 0.9505 | 0.9515 | 0.9525 | 0.9535 | 0.9545 |
| 1.7 | 0.9554 | 0.9564 | 0.9573 | 0.9582 | 0.9591 | 0.9599 | 0.9608 | 0.9616 | 0.9625 | 0.9633 |
| 1.8 | 0.9641 | 0.9649 | 0.9656 | 0.9664 | 0.9671 | 0.9678 | 0.9686 | 0.9693 | 0.9699 | 0.9706 |
| 1.9 | 0.9713 | 0.9719 | 0.9726 | 0.9732 | 0.9738 | 0.9744 | 0.9750 | 0.9756 | 0.9761 | 0.9767 |
| 2.0 | 0.9772 | 0.9778 | 0.9783 | 0.9788 | 0.9793 | 0.9798 | 0.9803 | 0.9808 | 0.9812 | 0.9817 |
Como ler este extrato:
Para encontrar a probabilidade acumulada de Z = 1.96, localize a unidade
e o primeiro decimal (1.9) na coluna da esquerda (destacado em
azul).
Desloque-se para a direita até a coluna do segundo decimal (.06)
(destacado em amarelo).
O valor no cruzamento é 0.9750.
Interpretação Estatística: o valor 0.9750 indica que 97,5% da área da
curva está à esquerda de \(Z =
1.96\).
Em um teste bicaudal, isso deixa 2,5% em cada cauda, totalizando o erro
\(\alpha = 0.05\).
1.9).0.06).| Confiança | \(\alpha\) | Cauda Unicaudal (\(z_c\)) | Cauda Bicaudal (\(\pm z_c\)) |
|---|---|---|---|
| 90% | 0,10 | 1,28 | 1,645 |
| 95% | 0,05 | 1,645 | 1,96 |
| 99% | 0,01 | 2,33 | 2,575 |
Embora a tabela seja útil para provas e compreensão teórica, no dia a
dia acadêmico utilizamos a função qnorm() (função de
quantil).
# Para um intervalo de confiança de 95% (Bicaudal)
alfa <- 0.05
z_critico <- qnorm(1 - alfa/2)
print(z_critico) # Retornará aproximadamente 1.96
## [1] 1.959964
| Função | Finalidade |
|---|---|
dnorm(x, mean, sd)
|
Densidade (PDF): Valor da altura da curva no ponto x. |
pnorm(q, mean, sd)
|
Acumulada (FDA): Probabilidade da variável ser menor ou igual a q. |
qnorm(p, mean, sd)
|
Quantil: Retorna o valor de x correspondente a uma probabilidade acumulada p. |
rnorm(n, mean, sd)
|
Sorteio: Gera n valores aleatórios seguindo a distribuição normal. |
O TCL é um dos pilares da estatística inferencial. Ele afirma que,
independentemente da forma da distribuição original dos dados, a
distribuição das médias amostrais tenderá a uma Distribuição Normal à
medida que o tamanho da amostra aumenta.
Demonstração: Médias de Lançamentos de Dados.
Um dado possui uma distribuição Uniforme (todas as faces têm a mesma
chance). No entanto, se pegarmos a média de grupos de 20 dados, o
resultado é surpreendente.
Tabela de Médias (Amostra de 500 grupos de n=20)
n_grupos <- 500
tamanho_amostra <- 20
medias_tcl <- data.frame(
grupo = rep(1:n_grupos, each = tamanho_amostra),
valor = sample(1:6, size = n_grupos * tamanho_amostra, replace = TRUE)
) %>%
group_by(grupo) %>%
summarise(media_amostral = mean(valor))
knitr::kable(head(medias_tcl, 10), caption = "Primeiras 10 médias calculadas (n=20)")
| grupo | media_amostral |
|---|---|
| 1 | 3.95 |
| 2 | 4.20 |
| 3 | 2.90 |
| 4 | 3.50 |
| 5 | 4.10 |
| 6 | 3.95 |
| 7 | 3.55 |
| 8 | 3.70 |
| 9 | 3.40 |
| 10 | 3.15 |
Visualização do Teorema
Observe como as médias dos dados (originalmente uniformes) desenham um
sino perfeito:
ggplot(medias_tcl, aes(x = media_amostral)) +
geom_histogram(aes(y = after_stat(density)), bins = 25, fill = "steelblue", alpha = 0.6) +
geom_density(linewidth = 1) +
stat_function(fun = dnorm, args = list(mean = 3.5, sd = sd(medias_tcl$media_amostral)),
color = "red", linetype = "dashed") +
labs(title = "Distribuição das Médias Amostrais",
subtitle = "A linha vermelha tracejada representa a Normal Teórica",
x = "Média de 20 lançamentos", y = "Densidade") +
theme_minimal()
A distribuição Qui-Quadrado é uma das distribuições mais utilizadas na estatística inferencial, especialmente para testar a variabilidade e a associação entre variáveis categóricas.
A distribuição Qui-Quadrado surge da soma dos quadrados de \(k\) variáveis aleatórias independentes,
cada uma seguindo uma Distribuição Normal Padrão (\(Z \sim N(0,1)\)).
Diferente da Normal, ela é uma distribuição
não-negativa (pois resulta de quadrados) e
assimétrica à direita. Sua forma é determinada
exclusivamente por um parâmetro chamado graus de liberdade (gl
ou \(k\)). À medida que os
graus de liberdade aumentam, a distribuição torna-se mais simétrica e
aproxima-se da Normal.
Sua principal finalidade é avaliar se as frequências observadas em
uma amostra divergem significativamente das frequências esperadas sob
uma determinada hipótese. É a base para:
* Testes de Aderência: Verificar se os dados seguem uma
distribuição específica.
* Testes de Independência: Verificar se existe
associação entre duas variáveis categóricas.
* Inferência sobre Variância: Estimar intervalos de
confiança para a variância populacional.
Dica: Para testes de hipótese, o p-valor é geralmente
calculado na cauda superior: 1 - pchisq(valor_calculado, df).
Abaixo, observamos como a densidade muda conforme alteramos os graus
de liberdade. À medida que os graus de liberdade aumentam, a
distribuição torna-se mais simétrica e aproxima-se da Normal.
Assim como outras distribuições no R, a Qui-Quadrado possui quatro funções básicas:
| Função | Finalidade |
|---|---|
| dchisq(x, df) | Densidade (PDF): Valor da altura da curva no ponto x. |
| pchisq(q, df) | Acumulada (FDA): Probabilidade à esquerda de q (usada para p-valor). |
| qchisq(p, df) | Quantil: Retorna o valor de χ² para uma probabilidade acumulada p. |
| rchisq(n, df) | Sorteio: Gera n valores aleatórios seguindo a distribuição. |
A distribuição t de Student é uma distribuição de probabilidade teórica que se assemelha à Normal, mas possui “caudas mais pesadas”, o que a torna ideal para inferência estatística com amostras pequenas.
A distribuição t surge quando estimamos a média de uma população
normalmente distribuída em situações onde o tamanho da amostra é pequeno
(\(n < 30\)) e o desvio padrão
populacional (\(\sigma\)) é
desconhecido, sendo substituído pelo desvio padrão amostral (\(s\)).
Diferente da Normal Padrão (\(Z\)), a
forma da distribuição t depende exclusivamente dos Graus de
Liberdade (gl), definidos como \(n -
1\). Quanto maior o número de graus de liberdade, mais a
distribuição t se aproxima da Normal Padrão.
Sua principal finalidade é permitir a realização de testes de
hipóteses e a construção de intervalos de confiança para médias quando
não temos dados de toda a população. É amplamente utilizada para:
* Comparar a média de uma amostra com um valor de referência (Teste t de
uma amostra).
* Comparar as médias de dois grupos independentes (Teste t
independente).
* Comparar médias de grupos pareados (antes e depois).
Abaixo, comparamos a Normal Padrão com a t de Student sob diferentes graus de liberdade. Observe como as “caudas” da distribuição t são mais altas para poucos graus de liberdade, refletindo maior incerteza.
#### A Estatística t A estatística de teste para uma média é calculada
pela fórmula:
\[t = \frac{\bar{x} - \mu}{s /
\sqrt{n}}\] Onde:
\(\bar{x}\): Média amostral. \(\mu\): Média populacional hipotética. \(s\): Desvio padrão amostral. \(n\): Tamanho da amostra.
Um agrônomo deseja testar se uma nova semente produz mais do que a média histórica de 50 sacas por hectare. Ele planta em apenas 10 lotes (\(n=10, gl=9\)). Como ele não conhece o desvio padrão de todas as fazendas do país (\(\sigma\)), ele usa o desvio padrão dos seus 10 lotes e aplica o Teste t para verificar se o ganho de produtividade é estatisticamente significante.
| Função | Finalidade |
|---|---|
dt(x, df)
|
Densidade (PDF): Valor da altura da curva no ponto \(x\). |
pt(q, df)
|
Acumulada (FDA): Probabilidade à esquerda de \(q\) (essencial para p-valor). |
qt(p, df)
|
Quantil: Retorna o valor crítico de \(t\) para uma probabilidade acumulada \(p\). |
rt(n, df)
|
Sorteio: Gera \(n\) valores aleatórios seguindo a distribuição \(t\). |
Dica: lembre-se que para testes bicaudais, o p-valor deve considerar as duas extremidades da distribuição.
A distribuição Exponencial é uma distribuição de probabilidade contínua que descreve o tempo entre eventos em um processo de Poisson, onde os eventos ocorrem de forma independente e a uma taxa constante.
Diferente da Normal, a Exponencial é definida apenas para valores
não-negativos (\(x \ge 0\)). Sua
principal característica é a propriedade de “falta de
memória” (memoryless), o que significa que a
probabilidade de um evento ocorrer no futuro não depende de quanto tempo
já passou.
A distribuição é governada por um único parâmetro, a taxa \(\lambda\) (lambda), que representa o número
médio de ocorrências por unidade de tempo.
Sua principal finalidade é modelar o tempo de espera ou o tempo de
vida de sistemas que não sofrem desgaste por envelhecimento (ou onde o
desgaste é desprezível no curto prazo). É amplamente utilizada em:
* Teoria das Filas: Tempo entre a chegada de clientes
em um guichê.
* Análise de Sobrevivência: Tempo até a falha de
componentes eletrônicos.
* Geofísica: Intervalo entre terremotos em uma região
específica.
O gráfico da Exponencial decai rapidamente, indicando que intervalos curtos entre eventos são mais prováveis do que intervalos longos.
A Função de Densidade de Probabilidade (PDF) é dada por:\[f(x; \lambda) = \lambda e^{-\lambda x}, \quad x
\ge 0\]
As estatísticas descritivas são inversamente proporcionais entre
si:
Média (Esperança): \(E[X] =
\frac{1}{\lambda}\)Variância: \(Var(X)
= \frac{1}{\lambda^2}\)
Se os clientes chegam em um banco à razão de 10 por hora (\(\lambda = 10\)), o tempo médio entre as chegadas é de \(1/10 = 0,1\) horas (6 minutos). Podemos usar a distribuição exponencial para calcular a probabilidade de o próximo cliente chegar em menos de 2 minutos.
| Função | Finalidade |
|---|---|
dexp(x, rate)
|
Densidade (PDF): Valor da altura da curva no ponto x. |
pexp(q, rate)
|
Acumulada (FDA): Probabilidade do tempo ser menor ou igual a q. |
qexp(p, rate)
|
Quantil: Retorna o valor de x para uma probabilidade acumulada p. |
rexp(n, rate)
|
Sorteio: Gera n valores aleatórios seguindo a distribuição exponencial. |
A distribuição Log-normal é uma distribuição de probabilidade contínua de uma variável aleatória cujo logaritmo é normalmente distribuído.
Se uma variável aleatória \(X\)
segue uma distribuição Log-normal, então \(Y =
\ln(X)\) segue uma distribuição Normal. Diferente da Normal, a
Log-normal é definida apenas para valores reais positivos (\(x > 0\)), sendo caracterizada por uma
base que começa no zero e uma “cauda” longa que se estende à
direita.
Seus parâmetros principais são herdados da transformação logarítmica:
\(\mu\) (média do logaritmo) e
\(\sigma\) (desvio padrão do
logaritmo).
Sua principal finalidade é modelar processos que são o resultado do
produto de muitos fatores independentes e positivos (efeito
multiplicativo), ao contrário da Normal, que modela processos aditivos.
É amplamente utilizada para:
* Economia e Finanças: Modelagem de preços de ações,
rendimentos e distribuição de renda.
* Biologia: Tamanho de organismos e concentração de
anticorpos.
* Engenharia: Tempo de vida de componentes sujeitos a
fadiga e concentrações de poluentes.
O formato da Log-normal varia drasticamente com o parâmetro de dispersão (\(\sigma\)). Observe como a curva se torna mais “achatada” e a cauda mais longa conforme o desvio padrão aumenta.
A Função de Densidade de Probabilidade (PDF) é dada por:
\[f(x; \mu, \sigma) =
\frac{1}{x\sigma\sqrt{2\pi}} e^{-\frac{(\ln x - \mu)^2}{2\sigma^2}},
\quad x > 0\]z Diferente da Normal, a média, a mediana e a
moda da Log-normal não coincidem:
Média: \(E[X] = e^{\mu +
\frac{\sigma^2}{2}}\)
Mediana: \(Med[X] = e^{\mu}\)
Moda: \(Mod[X] = e^{\mu -
\sigma^2}\)
Considere a distribuição de renda em uma cidade. A maioria das pessoas ganha valores próximos a uma base, mas existe uma pequena quantidade de indivíduos que ganha valores extremamente altos (a cauda longa). Ao aplicar o logaritmo sobre esses salários, os dados resultantes tendem a apresentar uma distribuição Normal perfeita, facilitando análises econométricas.
No R, os parâmetros são identificados como meanlog (\(\mu\)) e sdlog (\(\sigma\)):
| Função | Finalidade |
|---|---|
dlnorm(x, meanlog, sdlog)
|
Densidade (PDF): Valor da altura da curva no ponto x. |
plnorm(q, meanlog, sdlog)
|
Acumulada (FDA): Probabilidade da variável ser menor ou igual a q. |
qlnorm(p, meanlog, sdlog)
|
Quantil: Retorna o valor de x para uma probabilidade acumulada p. |
rlnorm(n, meanlog, sdlog)
|
Sorteio: Gera n valores aleatórios seguindo a distribuição log-normal. |
A distribuição Beta é uma distribuição de probabilidade contínua definida no intervalo \([0, 1]\), sendo amplamente utilizada para modelar o comportamento de proporções, probabilidades e taxas.
Diferente de distribuições que se estendem ao infinito (como a Normal), a Beta é limitada entre 0 e 1. Ela é definida por dois parâmetros de forma, geralmente chamados de \(\alpha\) (alfa) e \(\beta\) (beta), que determinam se a curva será simétrica, assimétrica, em formato de “U” ou em formato de “J”.
Sua principal finalidade é representar a incerteza sobre uma
proporção ou probabilidade. Na prática, ela é utilizada para:
* Modelagem de Porcentagens: taxas de recuperação de
pacientes, proporção de votos ou umidade do solo.
* Estatística Bayesiana: serve como a “distribuição
conjugada” para a distribuição Binomial, representando o conhecimento
prévio (prior) sobre uma probabilidade de sucesso.
* Gestão de Projetos: utilizada na técnica PERT para
estimar o tempo de conclusão de tarefas.
A versatilidade da Beta é sua maior característica. Abaixo, vemos como diferentes valores de \(\alpha\) e \(\beta\) alteram radicalmente a forma da densidade.
A Função de Densidade de Probabilidade (PDF) da Beta é:\[f(x; \alpha, \beta) =
\frac{x^{\alpha-1}(1-x)^{\beta-1}}{B(\alpha, \beta)}\]
Onde \(B(\alpha, \beta)\) é a função
Beta, que serve como constante de normalização.
Média: \(E[X] = \frac{\alpha}{\alpha +
\beta}\)
Variância: \(Var(X) =
\frac{\alpha\beta}{(\alpha + \beta)^2(\alpha + \beta + 1)}\)
Considere que um software tem uma taxa de cliques (CTR) esperada. Se
observamos 8 sucessos e 2 falhas, poderíamos modelar nossa crença sobre
a verdadeira taxa de cliques usando uma distribuição \(Beta(\alpha=8, \beta=2)\).
O pico da distribuição estaria em \(0.8\), refletindo a maior probabilidade em
torno da proporção observada.
As funções para manipular a distribuição Beta no R seguem o sufixo padrão, utilizando shape1 para \(\alpha\) e shape2 para \(\beta\):
| Função | Finalidade |
|---|---|
dbeta(x, shape1, shape2) |
Densidade (PDF): Valor da altura da curva para uma proporção x. |
pbeta(q, shape1, shape2) |
Acumulada (FDA): Probabilidade da proporção ser menor ou igual a q. |
qbeta(p, shape1, shape2) |
Quantil: Retorna o valor da proporção para uma probabilidade acumulada p. |
rbeta(n, shape1, shape2) |
Sorteio: Gera n valores aleatórios (proporções) entre 0 e 1. |
A distribuição Binomial é uma distribuição de probabilidade discreta que descreve o número de sucessos em uma sequência de \(n\) ensaios independentes, cada um com apenas dois resultados possíveis (sucesso ou fracasso).
Diferente das distribuições contínuas, a Binomial lida com eventos
contáveis. Ela é baseada no Processo de Bernoulli,
onde:
1. O número de ensaios (\(n\)) é
fixo.
2. Cada ensaio é independente.
3. A probabilidade de sucesso (\(p\)) é
constante em cada ensaio.
Sua principal finalidade é calcular a probabilidade de obter uma
quantidade específica de sucessos em experimentos repetidos. É
amplamente utilizada em:
* Controle de Qualidade: Probabilidade de encontrar
\(x\) itens defeituosos em um lote de
tamanho \(n\).
* Marketing: Probabilidade de \(x\) clientes realizarem uma compra após
visualizarem um anúncio.
* Saúde: Probabilidade de \(x\) pacientes reagirem positivamente a um
tratamento em um grupo de teste.
Como se trata de uma distribuição discreta, o gráfico é representado por barras (massa de probabilidade) em valores inteiros.
A Função de Probabilidade (PMF) é calculada pela fórmula:
\[P(X = k) = \binom{n}{k} p^k
(1-p)^{n-k}\]
Onde \(\binom{n}{k} =
\frac{n!}{k!(n-k)!}\) é o coeficiente binomial.
Média (Valor Esperado): \(E[X] = n \cdot
p\)
Variância: \(Var(X) = n \cdot p \cdot
(1-p)\)
Suponha que a taxa de conversão de um e-commerce seja de \(5\%\) (\(p =
0.05\)). Se \(100\) pessoas
visitarem o site hoje (\(n = 100\)),
qual a probabilidade de exatamente \(3\) realizarem uma compra?
Usamos a distribuição binomial para encontrar esse valor exato ou a
probabilidade de “pelo menos 3”.
No R, as funções binomiais utilizam os argumentos size (\(n\)) e prob (\(p\)):
| Função | Finalidade |
|---|---|
dbinom(x, size, prob)
|
Probabilidade Pontual (PMF): Probabilidade de obter exatamente x sucessos. |
pbinom(q, size, prob)
|
Acumulada (FDA): Probabilidade de obter q sucessos ou menos. |
qbinom(p, size, prob)
|
Quantil: Retorna o menor número de sucessos para uma prob. acumulada p. |
rbinom(n, size, prob)
|
Sorteio: Gera valores aleatórios de sucessos em n experimentos simulados. |
A distribuição de Poisson é uma distribuição de probabilidade discreta que expressa a probabilidade de um determinado número de eventos ocorrer em um intervalo fixo de tempo ou espaço.
A distribuição de Poisson é aplicada a eventos independentes que
ocorrem a uma taxa constante média (\(\lambda\)). Diferente da Binomial, não há
um limite superior fixo para o número de sucessos (\(n\)); estamos interessados em quantas vezes
um evento ocorre em um “continuum” (tempo, área, volume).
Os eventos devem ser raros e isolados, de modo que a probabilidade de
dois eventos ocorrerem simultaneamente no mesmo instante infinitesimal
seja zero.
Sua principal finalidade é modelar a contagem de ocorrências em
intervalos definidos. Exemplos clássicos incluem:
* Fluxo de Tráfego: Número de carros que passam por um
pedágio em 1 hora.
* Telecomunicações: Número de chamadas recebidas por
uma central por minuto.
* Biologia: Número de mutações em um segmento de
DNA.
* Segurança: Número de acidentes em um trecho de
rodovia por mês.
Por ser uma distribuição discreta, a visualização é feita através de barras de probabilidade. Observe como o aumento de \(\lambda\) desloca a “massa” da distribuição para a direita.
A Função de Probabilidade (PMF) de Poisson é definida como:
\[P(X = k) = \frac{\lambda^k
e^{-\lambda}}{k!}\]
Onde:\(k\): Número de ocorrências
(\(0, 1, 2, ...\)).
\(\lambda\): Taxa média de ocorrências
no intervalo.
\(e\): Base do logaritmo natural (\(\approx 2,718\)).
Uma característica única desta distribuição é que a Média e a Variância
são iguais:
Média (Esperança): \(E[X] =
\lambda\)
Variância: \(Var(X) = \lambda\)
Suponha que um hospital receba, em média, 3 pacientes de emergência
por hora (\(\lambda = 3\)).
Podemos usar Poisson para calcular a probabilidade de o hospital receber
exatamente 5 pacientes em uma hora específica, ou a probabilidade de não
receber nenhum paciente, ajudando no planejamento de escala da equipe
médica.
No R, as funções de Poisson utilizam o argumento lambda (\(\lambda\)):
| Função | Finalidade |
|---|---|
dpois(x, lambda)
|
Probabilidade Pontual (PMF): Probabilidade de ocorrerem exatamente x eventos. |
ppois(q, lambda)
|
Acumulada (FDA): Probabilidade de ocorrerem q eventos ou menos. |
qpois(p, lambda)
|
Quantil: Retorna o número de eventos correspondente a uma prob. acumulada p. |
rpois(n, lambda)
|
Sorteio: Gera n valores aleatórios (contagens) seguindo a taxa lambda. |
Quadro Comparativo: Testes para Médias e Variâncias
A escolha da estatística correta depende fundamentalmente do conhecimento prévio sobre a população e da relação entre as amostras.
| População e Amostra | Cálculo da Variância | Estatística de Teste | Comando no R |
|---|---|---|---|
| Var. da População Conhecida | Utiliza a variância populacional (\(\sigma^2\)) | \[Z = \frac{\bar{x} - \mu_0}{\sigma/\sqrt{n}}\] | BSDA::z.test() |
| Var. da Pop. Desconhecida e Var. da Amostra Igual | Variância Combinada (Pooled): \(s_p^2 = \frac{(n_1-1)s_1^2 + (n_2-1)s_2^2}{n_1+n_2-2}\) | \[t = \frac{\bar{x}_1 - \bar{x}_2}{s_p \sqrt{\frac{1}{n_1} + \frac{1}{n_2}}}\] | t.test(x, y, var.equal = TRUE) |
| Var. da Pop. Desconhecida e Var. da Amostra Diferente | Variâncias individuais (Aproximação de Welch) | \[t = \frac{\bar{x}_1 - \bar{x}_2}{\sqrt{\frac{s_1^2}{n_1} + \frac{s_2^2}{n_2}}}\] | t.test(x, y, var.equal = FALSE) |
| Amostras Emparelhadas | Variância das diferenças (\(s_d^2\)) | \[t = \frac{\bar{d}}{s_d/\sqrt{n}}\] | t.test(x, y, paired = TRUE) |
| Comparação de Duas Proporções | Baseada na frequência esperada (Tabela de Contingência) | \[\chi^2 = \sum \frac{(O_i - E_i)^2}{E_i}\] | prop.test(x, n) ou
chisq.test() |
| Comparação de Duas Proporções (Ex: Eleições ou Sucesso Operacional) | Baseada na distribuição Binomial (aproximação para Normal) | \[Z = \frac{\hat{p}_1 - \hat{p}_2}{\sqrt{\hat{p}(1-\hat{p})(\frac{1}{n_1} + \frac{1}{n_2})}}\] | prop.test(x, n) |
Quando utilizar a Estatística Z?
O teste Z é utilizado especificamente para comparar duas proporções
independentes (ou uma proporção amostral contra um valor fixo da
população).
Formato dos dados: Você trabalha com taxas ou percentuais (ex: 60% vs
55%).
Aplicação: Quando você quer testar se a proporção de sucessos em um
grupo é maior, menor ou diferente do outro.
Comando no R: prop.test() ou manual via fórmula Z.
Exemplo: “A taxa de aprovação no tiro real do Batalhão A (85%) é
superior à do Batalhão B (80%)?”
Quando utilizar a Estatística \(\chi^2\) (Qui-Quadrado)?
O teste Qui-Quadrado é uma generalização.
Ele é utilizado para analisar frequências (contagens) em tabelas de
contingência.
Formato dos dados: Tabelas de dupla entrada (Contagem de eventos).
Aplicação:
1. Quando você tem mais de duas categorias ou mais de dois grupos (ex:
comparar preferência entre 3 tipos de ração operacional).
2. Quando você quer testar a Independência: “A escolha do equipamento
depende da patente do militar?”Comando no R: chisq.test().
Utilizamos a estatística \(Z\) apenas quando o desvio padrão populacional (\(\sigma\)) é conhecido ou quando a amostra é suficientemente grande (\(n > 30\)) para que \(s\) seja uma estimativa muito precisa de \(\sigma\). Na prática militar e experimental, raramente conhecemos \(\sigma\), o que torna a distribuição \(t\) o padrão.
No caso de variâncias desiguais, os Graus de Liberdade não são simplesmente \(n_1 + n_2 - 2\), mas sim calculados pela equação de Satterthwaite (que resulta em valores decimais). Isso protege o teste contra o erro de Tipo I.
Embora não esteja na tabela de comparação de médias acima, a
estatística \(\chi^2\) é utilizada
para: * Teste de Aderência: Verificar se uma amostra
segue uma distribuição normal. * Teste de
Independência: Verificar se duas variáveis categóricas estão
relacionadas. No R: chisq.test().
Essencial para testar eficácia de treinamentos. Por exemplo: medir a precisão de tiro de um pelotão antes e depois de um curso de aperfeiçoamento. A redução da variabilidade externa (diferenças individuais entre fuzileiros) torna este teste muito sensível e poderoso.
Problema: Sabe-se historicamente que o desvio padrão da resistência de cabos de rapel de um fabricante é \(\sigma = 50\) kg. Uma amostra de 40 cabos apresentou média de 2480 kg. Teste se a média é diferente de 2500 kg.
# Dados do problema
n <- 40
media_amostra <- 2480
sigma_pop <- 50
mu_0 <- 2500
# No R, usamos z.test do pacote BSDA
# Simulando dados para o comando (ou calculando manualmente)
z_stat <- (media_amostra - mu_0) / (sigma_pop / sqrt(n))
p_valor <- 2 * pnorm(-abs(z_stat))
cat("Estatística Z:", z_stat, "\nP-valor:", p_valor)
## Estatística Z: -2.529822
## P-valor: 0.01141204
Problema: Comparação do tempo de montagem de um armamento entre dois grupos de recrutas. Assume-se que a variabilidade do treinamento é idêntica para ambos.
grupo_A <- c(12, 15, 14, 13, 16)
grupo_B <- c(14, 17, 15, 16, 18)
# Teste t com variâncias iguais (pooled)
t.test(grupo_A, grupo_B, var.equal = TRUE)
##
## Two Sample t-test
##
## data: grupo_A and grupo_B
## t = -2, df = 8, p-value = 0.08052
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
## -4.3060041 0.3060041
## sample estimates:
## mean of x mean of y
## 14 16
Problema: Comparação do consumo de combustível entre viaturas de fabricantes diferentes. A dispersão dos dados é visivelmente distinta.
viatura_X <- rnorm(30, mean = 8, sd = 0.5)
viatura_Y <- rnorm(30, mean = 7.5, sd = 1.2) # Variância maior
# Teste de Welch (Padrão do R)
t.test(viatura_X, viatura_Y, var.equal = FALSE)
##
## Welch Two Sample t-test
##
## data: viatura_X and viatura_Y
## t = 3.9879, df = 37.946, p-value = 0.0002932
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
## 0.4719545 1.4452180
## sample estimates:
## mean of x mean of y
## 8.262912 7.304325
Problema: Avaliação de um curso de tiro. Mede-se a pontuação dos mesmos 10 militares antes e depois de uma instrução.
antes <- c(75, 80, 72, 90, 85, 78, 88, 70, 92, 80)
depois <- c(82, 85, 80, 92, 90, 85, 95, 78, 98, 88)
# Teste t emparelhado
t.test(depois, antes, paired = TRUE)
##
## Paired t-test
##
## data: depois and antes
## t = 10.549, df = 9, p-value = 0.000002289
## alternative hypothesis: true mean difference is not equal to 0
## 95 percent confidence interval:
## 4.949004 7.650996
## sample estimates:
## mean difference
## 6.3
Problema: Antes de decidir entre o cenário 2 ou 3, um oficial quer verificar se a precisão (variância) de dois lotes de munição é a mesma.
lote_1 <- rnorm(20, mean = 100, sd = 5)
lote_2 <- rnorm(20, mean = 100, sd = 8)
# Teste de razão de variâncias
var.test(lote_1, lote_2)
##
## F test to compare two variances
##
## data: lote_1 and lote_2
## F = 0.47557, num df = 19, denom df = 19, p-value = 0.1139
## alternative hypothesis: true ratio of variances is not equal to 1
## 95 percent confidence interval:
## 0.1882372 1.2015096
## sample estimates:
## ratio of variances
## 0.4755721
Problema: em um grupamento de Fuzileiros Navais, deseja-se comparar a
preferência entre dois modelos de equipamentos (Modelo A e Modelo B). -
No Batalhão 1, de 200 militares, 120 preferem o Modelo A.
- No Batalhão 2, de 250 militares, 130 preferem o Modelo A.
Existe diferença significativa na preferência entre os batalhões?
# Sucessos (preferências pelo Modelo A)
sucessos <- c(120, 130)
# Total de observações (militares consultados em cada batalhão)
totais <- c(200, 250)
# Execução do teste de duas proporções
# Por padrão, prop.test realiza a correção de continuidade de Yates
resultado_prop <- prop.test(sucessos, totais, conf.level = 0.95)
print(resultado_prop)
##
## 2-sample test for equality of proportions with continuity correction
##
## data: sucessos out of totais
## X-squared = 2.5651, df = 1, p-value = 0.1092
## alternative hypothesis: two.sided
## 95 percent confidence interval:
## -0.01639702 0.17639702
## sample estimates:
## prop 1 prop 2
## 0.60 0.52
Para grandes amostras, o prop.test utiliza a distribuição de Qui-Quadrado (\(\chi^2\)), que para um grau de liberdade é equivalente ao quadrado da estatística Z da distribuição normal.
Problema: um Comandante deseja saber se a região de origem de um
fuzileiro (Região A ou Região B) influencia na sua preferência por uma
nova modalidade de treinamento físico.
Primeiro, organizamos os dados observados em uma tabela de dupla
entrada.
### 1. Criação da Tabela de Contingência
# Dados simulados:
# Região A: 60 preferem o treino novo, 40 preferem o antigo (Total 100)
# Região B: 45 preferem o treino novo, 55 preferem o antigo (Total 100)
matriz_dados <- matrix(c(60, 40, 45, 55), nrow = 2, byrow = TRUE)
rownames(matriz_dados) <- c("Regiao_A", "Regiao_B")
colnames(matriz_dados) <- c("Treino_Novo", "Treino_Antigo")
# Convertendo para objeto de tabela
tabela_contingencia <- as.table(matriz_dados)
print(tabela_contingencia)
## Treino_Novo Treino_Antigo
## Regiao_A 60 40
## Regiao_B 45 55
Utilizaremos a função chisq.test para calcular a estatística de teste.
# Realizando o teste de Qui-Quadrado
resultado <- chisq.test(tabela_contingencia)
# Exibindo o resultado completo
print(resultado)
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: tabela_contingencia
## X-squared = 3.9298, df = 1, p-value = 0.04744
# Exibindo as frequências esperadas (Ei) calculadas pelo R
cat("\nFrequências Esperadas (E_i):\n")
##
## Frequências Esperadas (E_i):
print(resultado$expected)
## Treino_Novo Treino_Antigo
## Regiao_A 52.5 47.5
## Regiao_B 52.5 47.5
Existem muitas funções gráficas no R e duas funções muito conhecidas,
a função plot e algumas derivadas, como por exemplo a função
hist, que utiliza padrões de configuração muito semelhantes; e
a função ggplot2 que é muito utilizadas com as funções do
dplyr. Para alguns casos a função plot é mais simples e direta.
No entanto, conforme aumentamos a complexidade dos dados a serem
analisados ou exigimos uma formatação aprimorada, a função ggplot tende
a ser melhor.
Existem outras alternativas, mas nos ateremos à essas duas.
Utilizaremos a base de dados disponível no RStudio, dplyr, “storms”,
cujas colunas são name, year, month, day, hour, lat, long, status,
category, wind, pressure, tropicalstorm_force_diameter,
hurricane_force_diameter.
Veja os principais dados:
| name | Amy | Amy |
| year | 1975 | 1975 |
| month | 6 | 6 |
| day | 27 | 27 |
| hour | 0 | 6 |
| lat | 27.5 | 28.5 |
| long | -79 | -79 |
| status | tropical depression | tropical depression |
| category | NA | NA |
| wind | 25 | 25 |
| pressure | 1013 | 1013 |
| tropicalstorm_force_diameter | NA | NA |
| hurricane_force_diameter | NA | NA |
No item seguinte abordarei a função plot e em seguida a ggplot. Em ambos os casos serão apresentadas as configurações para se produzir gráficos avançados.
Vamos iniciar com um gráfico bastante simples e acrescentar configurações conforme evoluimos o exemplo. Mas atenção! Algumas configurações são úteis em vários tipos de gráficos, mas outras específicas para um tipo específico.
x <- 1:10 # atribuo uma sequencia de 1 a 10 ao vetor x
y <- x # faço o mesmo para y, igualando ao x
plot(x,y)
Conforme queremos personalizar o gráfico, acrescentamos alguns parâmetros.
plot(x, y,
main = "Título principal",
sub = "Título secundário",
xlab = "Nome do eixo x",
ylab = "Nome do eixo y")
Podemos delimitar os eixos com xlim e ylim. Cuidado! Temos que delimitar o minimo e máximo para cada eixo em um vetor.
plot(x, y,
main = "Título principal",
sub = "Título secundário",
xlab = "Nome do eixo x",
ylab = "Nome do eixo y",
xlim = c(1,6),
ylim = c(3,7))
Para alterar a forma dos pontos utilizamos o pch. Você pode
utilizar o *help(“points”)“* ou ?points para pedir uma ajuda ao
R.
Com esse argumento você pode também alterar o tipo de ponto.
pch - pode variar de 1 a 25 (cada número representa um tipo). Também
pode utilizar ao invés do número uma string, tipo”k”.
par(mfrow=c(1,2))
plot(x, y,
sub = "pch = simbolo",
pch = 16)
plot(x, y,
sub = "pch = 16",
pch = "k")
col - altera a cor do ponto.
bg - preenche a cor dos símbolos pch entre 21 e 25.
cex - um vetor numérico para alterar o tamanho do caracter (ou
símbolo).
lwd - largura da linha para desenhar símbolos.
Como são muitos argumentos, sugiro que utilize o help(“points”)
para ter uma melhor compreensão.
plot(x, y,
main = "Título principal",
sub = "Título secundário",
xlab = "Nome do eixo x",
ylab = "Nome do eixo y",
pch = 25, # tipo de símbolo
col = "orchid",
bg = "green",
cex = 2,
lwd = 3)
Podemos aleterar as cores conforme nossas necessidades. O comando colors() permite identificar as 657 cores disponíveis. Aqui, vou apresentar somente as 6 primeiras.
head(colors())
## [1] "white" "aliceblue" "antiquewhite" "antiquewhite1"
## [5] "antiquewhite2" "antiquewhite3"
Incluindo as cores no gráfico.
plot(x, y,
main = "Título principal",
sub = "Título secundário",
xlab = "Nome do eixo x",
ylab = "Nome do eixo y",
col = "blue")
data(storms)
plot(storms$pressure, storms$wind,
xlab = "Pressao", ylab= "Vento", # Nome dos eixos
main = "Gráfico de pontos", # t?tulo do grafico
xlim = c(870,1025), ylim = c(0,200), # dimens?o dos eixos
type = "p", # tipo de graficos
pch = 1, # tipo de pontos
cex = 0.5, # tamanho dos pontos
col = "red", # cor dos pontos
bty = "n", # tira bordas do grafico
axes = FALSE, # elimina eixos
) +
abline(h= mean(storms$wind), col = "red") + # cria uma llinha horizontal em 0
abline(v =mean(storms$pressure), col = "blue", lwd = 2, lty = 2)
## integer(0)
# Editando eixos side o lado 1 para x, 2 para y, 3 para superior.....
axis(side = 1, at=seq(850,1025,25), labels=seq(850,1025,25), cex.axis=0.5)
axis(side = 2, at=seq(0,200,25), labels=seq(0,200,25), cex.axis=0.5)
OUtro
# 1. Preparação: Criar uma paleta de cores baseada na pressão para dar efeito visual
# Cores mais quentes (vermelho) para pressões baixas (tempestades fortes)
cor_ponto <- colorRampPalette(c("red", "orange", "green"))(100)
cores_mapeadas <- cor_ponto[as.numeric(cut(storms$pressure, breaks = 100))]
# 2. Ajustar parâmetros gráficos (margens e fundo)
par(mar = c(5, 5, 4, 2), bg = "white")
# 3. Criar o gráfico de dispersão
plot(storms$wind, storms$pressure,
pch = 16, # Tipo de ponto (círculo preenchido)
col = adjustcolor(cores_mapeadas, alpha.f = 0.2), # Transparência para lidar com sobreposição
cex = 0.8, # Tamanho dos pontos
main = "Correlação: Pressão Central vs. Velocidade do Vento",
xlab = "Velocidade do Vento (nós)",
ylab = "Pressão Central (mbar)",
cex.axis = 0.8, # Reduz o tamanha dos números dos eixos
las = 1, # Eixo Y na horizontal
frame.plot = FALSE) # Remove a caixa completa do gráfico
# 4. Adicionar grade para facilitar a leitura técnica
grid(col = "lightgray", lty = "dotted")
# 5. Adicionar legenda para as cores
legend("topright",
legend = c("Alta Pressão (Fraco)", "Média Pressão", "Baixa Pressão (Forte)"),
col = c("green", "orange", "red"),
pch = c(16, 16, 16),
lty = c(NA, NA, NA),
lwd = c(NA, NA, NA),
bty = "n",
cex = 0.8)
O histograma é uma ferramenta de visualização gráfica que representa
a distribuição de frequências de uma variável quantitativa
(numérica).
Diferente de um gráfico de barras convencional — que lida com
categorias — o histograma lida com intervalos numéricos. Ele agrupa os
dados em colunas adjacentes, onde a base de cada coluna representa um
intervalo de valores e a altura representa a quantidade de dados
(frequência) presentes naquele intervalo.
O histograma é muito importante para a análise visual dos dados na
análise exploratória. Com ele conseguimos:
Identificar a tendência central: Onde a maioria dos dados se
concentra.
Visualizar a dispersão: O quão espalhados os dados estão.
Detectar assimetria: verificar se os dados pendem mais para a
direita (positiva) ou esquerda (negativa).
A construção segue três passos principais:
Definição dos Bins (Classes): O intervalo total dos dados (máximo
- mínimo) é dividido em subintervalos de mesma largura.
Contagem de Frequência: conta-se quantos pontos de dados caem
dentro de cada “bin”.
Desenho das Barras: As barras são desenhadas sem espaços entre
si, indicando a continuidade da variável.
A largura de cada coluna (\(h\)) é
calculada dividindo a amplitude total dos dados pelo número de classes
(\(k\)) desejado:\[h = \frac{\text{Valor Máximo} - \text{Valor
Mínimo}}{k}\].
Escolher o número de classes (\(k\))
não é algo óbvio, estatísticos criaram fórmulas para automatizar isso.
No R, a função hist() utiliza por padrão a Regra de
Sturges.
Regra de Sturges (Padrão no R) - É ideal para dados com
distribuição normal e amostras de tamanho moderado.
\[k = 1 + \log_2(n)\]
(Onde \(n\) é o número total de observações).
Regra de Scott - melhor para amostras maiores, pois
leva em conta o desvio padrão
(\(\sigma\)).\[h = \frac{3.5 \times
\sigma}{\sqrt[3]{n}}\]
Regra de Freedman-Diaconis - É a mais robusta para
dados com outliers, pois utiliza o Intervalo Interquartil (\(IQR\)) em vez do desvio padrão.
\[h = 2 \times
\frac{IQR}{\sqrt[3]{n}}\]
Ao olhar para um histograma, atente-se ao formato da curva invisível que
ele desenha:
- Simétrico: a maior parte dos dados está no centro,
diminuindo gradualmente para as pontas.
- Assimétrico à Direita (positivo): a “cauda” do
gráfico é mais longa no lado direito (valores altos).
- Assimétrico à Esquerda (negativo): a “cauda” do
gráfico é mais longa no lado esquerdo (valores baixos).
- Bimodal ou Multimodal: o gráfico apresenta dois ou
mais “picos”, sugerindo que sua amostra pode ter dois ou mais grupos
distintos.
Produzindo um Histograma no R com hist() A função nativa do R para gerar
histogramas é a hist(). Vamos usar a variável wind da base storms como
exemplo:
hist(storms$wind)
Tentando delinear o número de intervalos.
hist(storms$wind, breaks = 10) # Sugere 15 intervalos
Aprimorando a configuração.
# Configuração otimizada do Histograma
hist(storms$wind,
breaks = 20, # Aumenta o detalhamento (bins)
main = "Distribuição da Velocidade dos Ventos",
sub = "Dados da base 'storms' (dplyr)",
xlab = "Velocidade do Vento (nós)",
ylab = "Frequência Absoluta",
col = "#56B4E9", # Uma cor azul profissional (colorblind friendly)
border = "white", # Melhora a separação visual das barras
xlim = c(0, 160), # Define o limite do eixo X para cobrir toda a amplitude
las = 1, # Rotaciona os números do eixo Y para a horizontal
prob = FALSE) # FALSE para frequência absoluta, TRUE para densidade
O boxplot (ou diagrama de caixa) é uma ferramenta estatística
poderosa para visualizar a distribuição e a variabilidade de um conjunto
de dados. Ele é especialmente útil porque resume, em um único gráfico,
cinco números importantes e ainda identifica visualmente os valores
atípicos (outliers).
Para entender um boxplot, imagine que ele divide seus dados em quatro
partes iguais (quartis):
A Caixa (Box): Representa os 50% centrais dos seus dados e é
representadas por:
* Borda Inferior: é o 1º Quartil (Q1) (25% dos dados
estão abaixo deste ponto).
* Linha Central: é a Mediana (o valor exato que divide
os dados ao meio).
* Borda Superior: é o 3º Quartil (Q3) (75% dos dados
estão abaixo deste ponto).
Hastes (Whiskers): são as linhas que saem da caixa.
Elas se estendem até o valor mais alto e o mais baixo que não sejam
considerados outliers.
Pontos Isolados (Outliers): Valores que estão muito longe do restante
dos dados. No R, por padrão, são valores que ultrapassam \(1.5 \times\) o tamanho da caixa (\(IQR\)).
O boxplot oferece as seguintes análises:
- simetria: Se a linha da mediana estiver no centro da
caixa, os dados são simétricos. Se estiver perto do topo ou fundo, os
dados são assimétricos (skewed).
- Dispersão: uma caixa “comprida” indica que os dados
variam muito. Uma caixa “achatada” indica que os valores estão muito
próximos. - Comparação entre grupos: é excelente forma
de comparar visulamente os dados de diferentes grupos, por exemplo, a
pressão das tempestades entre diferentes meses. Você consegue ver
rapidamente qual mês tem a maior variação e onde ocorrem os eventos mais
extremos.
boxplot(storms$wind)
boxplot(wind ~ month, data = storms,
col = "skyblue",
main = "Velocidade dos Ventos por Mês",
xlab = "Mês",
ylab = "Vento (nós)")
# 1. Cálculos Estatísticos
vento <- storms$wind
media <- mean(vento, na.rm = TRUE)
mediana <- median(vento, na.rm = TRUE)
# 2. Configurações de layout
par(mar = c(5, 5, 4, 2))
# 3. Criar o Boxplot
b <- boxplot(vento,
horizontal = TRUE, # Gráfico na horizontal para facilitar leitura
col = "#E6E6FA", # Lavender (mesmo padrão do histograma)
border = "black", # Cor das linhas da caixa
main = "Boxplot da Velocidade dos Ventos",
xlab = "Vento (nós)",
notch = TRUE, # Adiciona um entalhe na mediana (intervalo de confiança)
outline = TRUE, # Exibe os outliers (pontos pretos)
frame = FALSE) # Remove o quadro externo
# 4. Adicionar Linhas Verticais para Média, Mediana e Moda
# (As linhas cruzam o gráfico para facilitar a comparação visual)
abline(v = media, col = "red", lwd = 2, lty = 2) # Média
abline(v = mediana, col = "blue", lwd = 2, lty = 4) # Mediana
# Nota: A moda no boxplot coincide com a linha da maior concentração de dados
# 5. Adicionar Grade Vertical
grid(nx = NULL, ny = NA, col = "lightgray", lty = "dotted")
# 6. Adicionar Legenda Detalhada
legend("topright",
legend = c(paste("Média:", round(media, 1)),
paste("Mediana:", mediana),
"Outliers (Pontos)"),
col = c("red", "blue", "black"),
lty = c(2, 4, NA),
pch = c(NA, NA, 1), # Símbolo do ponto para outliers
lwd = c(2, 2, NA),
bty = "n",
cex = 0.9)
# 7. Adicionar rótulos numéricos nos quartis (opcional)
stats <- boxplot.stats(vento)$stats
text(x = stats, y = 1.3, labels = stats, col = "darkblue", font = 2, cex = 0.8)
Boxplot por categoria
# 1. Preparação: Garantir que 'category' seja um fator ordenado
# Isso evita que o gráfico exiba as categorias fora de ordem (ex: 1, 10, 2)
storms$category <- as.factor(storms$category)
# 2. Configurações de layout e margens
par(mar = c(5, 5, 4, 2))
# 3. Criar o Boxplot comparativo
boxplot(wind ~ category,
data = storms,
main = "Intensidade do Vento por Categoria de Tempestade",
xlab = "Categoria da Tempestade",
ylab = "Vento (nós)",
col = terrain.colors(length(unique(storms$category))), # Cores graduais
border = "black",
las = 1) # Números do eixo Y na horizontal
# 4. Adicionar grade horizontal para facilitar a leitura dos níveis de vento
grid(nx = NA, ny = NULL, col = "gray", lty = "dotted")
Detalhes técnicos desta visualização:
wind ~ category: Esta fórmula diz
ao R: “Analise a variável numérica wind dividida pelos
grupos da variável categórica category”.
terrain.colors(): Utilizei uma
paleta que gera um degradê de cores, o que ajuda a enfatizar visualmente
a progressão da gravidade das categorias.
Outliers por Categoria: Note que em cada categoria existem pontos (outliers). Isso mostra que, embora uma tempestade seja classificada como “Categoria 1”, ela pode ter picos de vento que fogem da média daquela classe específica.
Ajuste de Eixos: Se houver categorias com nomes
longos, você pode usar las = 2 no comando
boxplot para girar os nomes das categorias no eixo
X.
Para criar um gráfico de violino é necessário utilizar o pacote
vioplot, pois o R nativo não possui uma função violin()
pré-instalada.
O gráfico de violino combina as vantagens do boxplot com um histograma
espelhado (densidade), sendo ideal para visualizar a “massa” dos dados
de vento da base storms.
# 1. Instalar e carregar o pacote necessário
if(!require(vioplot)) install.packages("vioplot")
library(vioplot)
# 2. Configurar o ambiente gráfico
par(mar = c(5, 5, 4, 2), bg = "#F9F9F9")
# 3. Criar o gráfico de violino detalhado
vioplot(storms$wind,
names = "Velocidade do Vento",
col = "lightblue", # Cor do corpo do violino
border = "steelblue", # Cor da borda
rectCol = "darkblue", # Cor do boxplot interno
lineCol = "red", # Cor das linhas internas
colMed = "white", # Cor do ponto da mediana
areaEqual = FALSE, # Mantém a escala de densidade original
main = "Distribuição de Ventos (Gráfico de Violino)",
ylab = "Vento (nós)",
las = 1)
# 4. Adicionar Linha da Média (Customização Extra)
media_wind <- mean(storms$wind, na.rm = TRUE)
abline(h = media_wind, col = "red", lty = 2, lwd = 2)
# 5. Adicionar anotação de texto para a Média
text(x = 1.3, y = media_wind + 5,
labels = paste("Média:", round(media_wind, 1)),
col = "red", font = 2)
# 6. Adicionar grade para facilitar a leitura técnica
grid(nx = NA, ny = NULL, col = "gray", lty = "dotted")
# 7. Legenda explicativa
legend("topright",
legend = c("Mediana (Ponto Branco)", "Média (Linha Tracejada)", "IQR (Retângulo Azul)"),
col = c("darkblue", "red", "darkblue"),
lty = c(NA, 2, 1),
pch = c(16, NA, NA),
bty = "n",
cex = 0.8)
Detalhes técnicos desta visualização:
Corpo do Violino: A largura do “violino”
representa a densidade de probabilidade. Onde o gráfico é mais largo, há
mais registros daquela velocidade de vento na base
storms.
Boxplot Interno: O vioplot desenha
automaticamente um boxplot simplificado dentro do violino (o retângulo
azul escuro representa o Intervalo Interquartil).
colMed = "white": Destaca a mediana
como um ponto branco central, facilitando a localização rápida do centro
dos dados.
rectCol e lineCol:
Permitem separar visualmente as partes do gráfico, tornando-o
profissional e pronto para apresentações acadêmicas ou relatórios de
2026.
Vantagem sobre o Boxplot: Enquanto o boxplot
esconde a distribuição (se é bimodal ou unimodal), o violino mostra
claramente que a maioria das tempestades em storms se
concentra em velocidades baixas (perto de 30-50 nós).
Gráfico de Violino por categoria
# 1. Carregar pacote
if(!require(vioplot)) install.packages("vioplot")
library(vioplot)
# 2. Preparação: Converter status para fator para garantir a organização
storms$status <- as.factor(storms$status)
# 3. Ajustar margens (Aumentamos a margem inferior 'mar[1]' para os nomes caberem)
par(mar = c(10, 5, 4, 2))
# 4. Criar o gráfico de violino por Status
vioplot(wind ~ status,
data = storms,
col = rainbow(length(levels(storms$status)), s = 0.5), # Cores distintas para cada status
border = "darkgray",
rectCol = "black", # Boxplot interno em preto
colMed = "white", # Mediana em destaque branco
main = "Variabilidade do Vento por Status da Tempestade",
ylab = "Vento (nós)",
xlab = "", # Removemos o rótulo do eixo X para não sobrepor
las = 2, # Rotaciona os nomes do Status em 90 graus
cex.names = 0.8) # Ajusta tamanho da fonte dos nomes
# 5. Adicionar grade horizontal de referência
grid(nx = NA, ny = NULL, col = "gray", lty = "dotted")
# 6. Adicionar título ao eixo X manualmente (posicionado abaixo dos nomes rotacionados)
mtext("Status da Tempestade", side = 1, line = 8, font = 2)
# 7. Adicionar legenda informativa
legend("topright",
legend = c("Mediana", "Distribuição (Densidade)", "Quartis (Boxplot)"),
pch = c(16, NA, 15),
col = c("white", "gray", "black"),
bty = "n",
cex = 0.8)
Detalhes técnicos desta visualização:
Assimetria (Symmetry): Observe como as categorias mais baixas (0 e 1) têm violinos “gordos” na base, indicando que a maioria das tempestades nessas classes fica no limite inferior de velocidade.
Multimodalidade: Se um violino tiver dois “ombros” largos, isso sugere que existem dois grupos distintos de intensidades dentro da mesma categoria.
Comparação de Medianas: O ponto amarelo permite comparar rapidamente se o salto de velocidade entre a Categoria 3 e 4 é maior do que entre a 1 e 2.
Cores (Terrain Colors): A paleta facilita a visualização da progressão: tempestades mais fracas em tons de verde/marrom e as mais fortes (categorias 4 e 5) em tons mais claros/amarelados.
Este formato é ideal para relatórios técnicos em 2026, pois apresenta a estatística descritiva (boxplot interno) e a distribuição probabilística (curva de densidade externa) simultaneamente.
Gráficos de pizza são recomendados quando existem poucas categorias, caso contrário ele pode se tornar de difícil interpretação. Quando existem muitas categorias recomenda-se a utilização do gráfico de barras, conforme próximo exemplo.
Para criar o gráfico de pizza temos que colocar os nomes e valores em colunas e para isso utiliza-se a função table como auxiliar. Veja o exemplo:
# Funcao table organiza os dados, contando quantos registros de status
# existem para cada tipo de status. Ela é útil quando o tipo de dado
# da coluna é um "factor"
# 1. Preparação dos dados: contar frequências
status_freq <- table(storms$category)
kable(status_freq)
| Var1 | Freq |
|---|---|
| 1 | 2548 |
| 2 | 993 |
| 3 | 593 |
| 4 | 553 |
| 5 | 116 |
# 2. Criar porcentagens para exibir no gráfico
porcentagens <- round(100 * status_freq / sum(status_freq), 1)
labels_custom <- paste(names(status_freq), "-", porcentagens, "%")
# 3. Definir uma paleta de cores variada
cores <- rainbow(length(status_freq), s = 0.6, v = 0.9)
# 4. Ajustar margens para garantir que a legenda caiba
par(mar = c(1, 1, 3, 1))
# 5. Criar o gráfico de pizza
pie(status_freq,
labels = NA, # Remove labels automáticos para usar legenda externa
main = "Proporção de Status das Tempestades",
col = cores,
border = "white", # Bordas brancas entre fatias para melhor contraste
clockwise = TRUE, # Organiza no sentido horário
init.angle = 90) # Inicia o desenho no topo (12 horas)
# 6. Adicionar uma legenda detalhada ao lado
legend("bottom",
legend = labels_custom,
fill = cores,
title = "Categorias de Status",
cex = 0.7, # Reduz o tamanho da fonte da legenda
ncol = 2, # Organiza em 2 colunas para economizar espaço
bty = "n") # Remove a caixa ao redor da legenda
Detalhes técnicos desta visualização:
table(storms$status): Consolida as
categorias para o cálculo das fatias.
labels = NA: Omitimos os rótulos
diretamente nas fatias porque muitos nomes se sobreporiam. Em vez disso,
calculamos as porcentagens manualmente.
rainbow(): Gera uma gama de cores
distintas para cada um dos diferentes status presentes na base.
init.angle = 90: Alinha o início da
primeira fatia ao topo do círculo, o que é um padrão estético
comum.
legend(): Adicionamos a legenda na
parte inferior (bottom) com duas colunas
(ncol = 2) para garantir que todas as categorias (como
“hurricane”, “tropical storm”, etc.) fiquem visíveis sem poluir o
gráfico.
Também é construído de forma semelhante ao de pizza, onde são necessários os valores para cada situação.
# 1. Preparação dos dados: contar frequências da coluna 'status'
status_freq <- table(storms$status)
# 2. Ordenar as barras da maior para a menor (opcional, para melhor visualização)
status_freq <- status_freq[order(status_freq, decreasing = TRUE)]
# 3. Definir uma paleta de cores personalizada
cores <- terrain.colors(length(status_freq))
# 4. Ajustar as margens do gráfico para que os nomes longos caibam no eixo X
# mar = c(bottom, left, top, right)
par(mar = c(9, 5, 4, 2))
# 5. Criar o gráfico com a função plot (ou barplot para maior controle)
bp <- barplot(status_freq,
main = "Distribuição de Status das Tempestades (Base storms)", # Título
#sub = "Fonte: NOAA Dataset", # Subtítulo
ylab = "Frequência Absoluta", # Título eixo Y
cex.axis = 0.7, # Reduz tamanho dos números do eixo
col = cores, # Cores das barras
border = "darkgray", # Cor da borda
las = 2, # Rotacionar texto eixo X (vertical)
cex.names = 0.8, # Tamanho da fonte dos nomes
ylim = c(0, max(status_freq) * 1.2)) # Aumentar topo para caber os números
# 6. Adicionar grade horizontal para facilitar a leitura
grid(nx = NA, ny = NULL, col = "gray", lty = "dotted")
# 7. Adicionar os valores exatos acima de cada barra
text(x = bp,
y = status_freq,
label = status_freq,
pos = 3,
cex = 0.7,
col = "darkblue",
font = 2)
# 8. Resetar as configurações de margem padrão (boa prática)
# dev.off() ou par(mar = c(5, 4, 4, 2) + 0.1)
Detalhes técnicos desta visualização:
table(storms$status): Transforma os dados brutos em uma tabela de contagem necessária para o gráfico.
par(mar = …): Aumenta o espaço inferior (bottom) para evitar que os nomes das categorias (que são longos em storms) sejam cortados.
las = 2: Gira as etiquetas do eixo X em 90 graus, tornando-as legíveis.
ylim: Definimos o limite do eixo Y um pouco acima da maior barra para garantir que o texto dos números (text) não fique cortado no topo.
pos = 3: Posiciona o texto exatamente “acima” das coordenadas Y fornecidas.
grid(): Adiciona linhas de referência que tornam o gráfico mais técnico e fácil de interpretar.
Utilize a função curve para produzir gráficos com curvas matemáticas conhecidas. Veja o exemplo:
# FUNÇÃO CURVE
curve(x^2, col = "blue")
curve(x^3, col = "green", add = T)
curve(x^4, col = "red", add = T)
A função X11() abre um novo canvas para você publicar seus gráficos enquanto a função dev.off() desliga esse canvas. Por sua vez, a função par() você organiza seus gráficos.
# Edita as margens do gráfico
par(mar= c(10,10,3,3))
# Organiza vários gráficos em um só canva.
par(mfrow=c(2,2)) # um canvas com 4 gráficos, 2 linhas e 2 colunas
Para trabalharmos gráficos com o ggplot é necessária a instalação da
library(ggplot2). Não esqueça de verificar se ela está intalada
e, se não tiver, instale.
A função ggplot utiliza uma estrutura em camadas que permite ir
agregando “funcionalidades”.
A sua função básica é a ggplot() é a funçã base.
A função aes() define o espaço onde serão
plotadas as informações.
Algumas características o aes são:
- x - posição no eixo x;
- y - posição no eixo y;
- shape - tipo dos marcadores (pontos, quadrados, cruzes, etc);
fill - “cor de dentro” do objeto;
- color - cor do contorno dos objetos internos do gráfico
(barras,…);
- alpha - nível de transparência dos objetos;
- size - tamanho dos objetos.
A função geom() possui uma infinidade de
funcionalidades. Destado agumas mais relevantes:
- geom_abline() – Linhas de referência: horizontal, vertical e
diagonal
- geom_bar() – Gráficos de barra
- geom_boxplot() – Cria um boxplot
- geom_density() – Estimativa de densidade kernel
- geom_density_2d() – Estimativa de densidade kernel 2d apresentando os
resultados com contorno
- geom_dotplot() – Gráfico de pontos
- geom_label() – Texto
- geom_map() – Polígonos de um mapa de referência
- geom_path() – Conectar observações
- geom_point() – Pontos
Outras funcionalidades:
- geom_bin2d() – Mapa de calor das contagens de bin 2d
- geom_blank() – Plot em branco
- geom_contour() – 2D contornos de uma superfície 3d
- geom_count() – Conta pontos sobrepostos
- geom_crossbar() – Intervalos verticais: linhas, barras transversais e
barras de erro
- geom_errorbarh() – Barras de erro horizontais
- geom_freqpoly() – Histogramas e polígonos de frequência
- geom_hex() – Mapa de calor hexagonal de contagens de bin 2d
- geom_jitter() – Pontos agitados
- geom_polygon() – Polígonos
- geom_qq_line() – Um gráfico quantil-quantil
- geom_quantile() – Regressão quantílica
- geom_raster() – Retângulos
- geom_ribbon() – Fitas e gráficos de área
- geom_rug() – Parcelas de tapete nas margens
- geom_segment() – Segmentos de linhas e curvas
- geom_smooth() – Meios condicionais suavizados
- geom_spoke() – Segmentos de linha parametrizados por localização,
direção e distância
- geom_violin() – Trama de violino
Alguns temas para dar estilo aos seus gráficos:
- theme_classic()
- theme_bw()
- theme_grey()
- theme_gray()
- theme_linedraw()
- theme_light()
- theme_minimal()
- theme_dark()
Serão apresentadas as funções paulatinamente:
Função ggplot():
# Cria um espaço para os gráficos e associa os dados
ggplot(storms)
O sinal de **_ + _** no final da linha agrega às funções
subsequentes, formando um comando único.
Funão aes():
A função aes tem seu nome derivado de “aesthetics”, que
significa “estético” em Português.
Nela é especificado o canvas onde serão plotados os gráficos, assim como
seus eixos e características.
ggplot(storms) +
aes(year, wind)
geom_point()
ggplot(storms) +
aes(year, wind) +
geom_point()
Para configurarmos o gráfico, podemos incluir informações nas
funções:
Alterando as cores e o tamanho dos pontos.
ggplot(storms) +
aes(year, wind, color = category, size = wind) +
geom_point()
geom_col() desenha um gráfico de colunas com 2 variáveis, x, y.
ggplot(storms) +
aes(year, wind, color = year) +
geom_col()
geom_bar() desenha um gráfico de barras somente com um eixo, no caso o \(x\). O eixo \(y\) indica a contagem de registros de ventos com a intensidade marcada em \(x\).
ggplot(storms) +
aes(wind) +
geom_bar(color = "blue", fill = "yellow")
geom_hitogram() é um gráfico de barras onde controlo os intervalos das barras no eixo \(x\). No caso, defini 15 barras, bins = 15.
ggplot(storms) +
aes(wind) +
geom_histogram(bins = 15, color = "green", fill = "white")
Mudando o intervalo da barra e colocando um tema no histograma.
ggplot(storms) +
aes(wind) +
geom_histogram(bins = 10) +
theme_light()
geom_boxplot()
Boxplot do vento geral.
ggplot(storms) +
aes(wind) +
geom_boxplot()
Primeiro, o R calcula as estatísticas básicas do conjunto de
dados:
Q1 (1º Quartil): O valor abaixo do qual estão 25% dos dados.
Q3 (3º Quartil): O valor abaixo do qual estão 75% dos dados.
IQR (Intervalo Interquartil): A diferença entre o terceiro e o primeiro
quartil - essa é a região do box.
\[IQR = Q3 - Q1\]
O geom_boxplot desenha “hastes” (whiskers) que se estendem até os pontos
mais distantes que não sejam outliers. Os limites teóricos para detectar
outliers são:
Limite Inferior: \(Q1 - 1.5 \times
IQR\)
Limite Superior: \(Q3 + 1.5 \times
IQR\)
Um boxplot do vento (wind) por status da tempestade.
É necessário juntar uma seleção do dplyr onde é realizado o agrupamento
por status e depois desenhar o gráfico com o ggplot.
Observe que:
- no dplyr as funções se conectam com %>% , enquanto
no
- ggplot as funções se concectam com o _ + _.
storms %>%
ggplot() +
aes(wind, status, color = status) +
geom_boxplot()
Em função dos dados, será necessária uma breve preparação dos dados, criando a média de pressão por mês.
storms_processado <- storms %>%
group_by(month) %>%
summarise(media_pressao = mean(pressure, na.rm = TRUE))
print(storms_processado)
## # A tibble: 10 × 2
## month media_pressao
## <dbl> <dbl>
## 1 1 992.
## 2 4 998.
## 3 5 1004.
## 4 6 1002.
## 5 7 1001.
## 6 8 996.
## 7 9 990.
## 8 10 992.
## 9 11 992.
## 10 12 998.
A partir desses dados é possível criar gráficos legíveis.
ggplot(storms_processado) +
aes(x = month, y = media_pressao) +
geom_line(color = "steelblue", size = 1)
É possível acrescentar outros gráficos, sum sobre o outro.
ggplot(storms_processado) +
aes(x = month, y = media_pressao) +
geom_line(color = "steelblue", size = 1) +
geom_point(color = "darkred", size = 2)
Podemos ainda, agrupar esse gráfico por status. Para tal, devemos organizar os dados.
# 1. Agrupar por mês E por status
storms_status <- storms %>%
group_by(month, status) %>%
summarise(media_pressao = mean(pressure))
# 2. Criar o gráfico com cores diferentes para cada status
ggplot(storms_status, aes(x = month, y = media_pressao, color = status)) +
geom_line(size = 1) +
geom_point() +
theme_light()
A função labs é utilizada para configurar títulos e
legenda.
Veja os exemplos.
Veja o mesmo gráfico anterior com legendas e títulos.
ggplot(storms_status, aes(x = month, y = media_pressao, color = status)) +
geom_line(size = 1) +
geom_point() +
labs(
title = "Pressão Média por Mês e Status da Tempestade",
subtitle = "Fonte: Autor",
x = "Mês",
y = "Pressão Média (mbar)",
color = "Status"
) +
theme_light()
Ainda é possível deixar a escala do eixo \(x\) contínua, variando de 1 a 12. Nesse caso, repare que existem meses que não possuem dados sobre determinado status, por isso não existem os pontos.
ggplot(storms_status, aes(x = month, y = media_pressao, color = status)) +
geom_line(size = 1) +
geom_point() +
scale_x_continuous(breaks = 1:12) +
labs(
title = "Pressão Média por Mês e Status da Tempestade",
x = "Mês",
y = "Pressão Média (mbar)",
color = "Status"
) +
theme_light()
A facet_wrap e a facet_grid permitem a subdivisão
das áreas de plotagem em diversos gráficos, conforme o tema de
interesse.
O **_wrap** do grid se diferenciam pela organização dos
gráficos.
Veja o exemplo anterior com a função facet_wrap().
ggplot(storms_status) +
aes(x = month, y = media_pressao, group = status) +
geom_line(color = "steelblue", size = 1) +
geom_point(color = "steelblue") +
# Criar um painel para cada status
facet_wrap(~status, scales = "free_y")
Incluindo legendas e títulos
ggplot(storms_status, aes(x = month, y = media_pressao, group = status)) +
geom_line(color = "steelblue", size = 1) +
geom_point(color = "steelblue") +
# Criar um painel para cada status
facet_grid(~status, scales = "free_y") +
scale_x_continuous(breaks = c(1, 4, 7, 10, 12)) +
labs(
title = "Evolução da Pressão Média Mensal por Categoria",
subtitle = "Painéis individuais por status da tempestade",
x = "Mês",
y = "Pressão Média (mbar)"
) +
theme_bw() +
theme(strip.background = element_rect(fill = "gray90")) # Destaca os títulos dos quadros
Vejam os exemplos dos histogramas de ventos (wind) no decorrer dos
anos anteriores a 2021.
storms %>%
filter(year > 2012) %>%
ggplot() +
geom_histogram(aes(wind), bins = 15) +
facet_wrap(~ year) +
theme_light()
Perceba a diferença entre o facet_grid e o facet_wrap.
storms %>%
filter(year > 2012) %>%
ggplot() +
geom_histogram(aes(wind), bins = 10) +
facet_grid(~ year)+
theme_light()