R: Processamento de Dados
Processamento dos dados
A limpeza de dados é um processo essencial na análise de dados, pois garante a qualidade e a confiabilidade dos resultados obtidos.
- Precisão dos resultados: Dados sujos ou inconsistentes podem levar a conclusões incorretas ou imprecisas. Ao limpar os dados, você elimina erros e inconsistências, garantindo que os resultados da análise sejam confiáveis e precisos.
- Tomada de decisão confiável: Os dados são a base para a tomada de decisões informadas. Se os dados utilizados na análise não forem limpos, as decisões baseadas neles podem ser equivocadas, o que pode ter consequências negativas. A limpeza dos dados permite que você tome decisões confiáveis, baseadas em informações corretas e consistentes.
- Melhoria da qualidade dos dados: A limpeza dos dados não apenas remove erros, mas também melhora a qualidade geral dos dados. Ao identificar e corrigir erros, você pode padronizar os formatos, corrigir valores inconsistentes e preencher lacunas nos dados ausentes. Isso resulta em conjuntos de dados mais completos e consistentes, permitindo análises mais robustas.
- Eficiência na análise: Dados sujos podem dificultar a análise. Por exemplo, informações ausentes ou incompletas podem exigir tratamentos especiais durante a análise, consumindo tempo e recursos adicionais. Ao limpar os dados previamente, você economiza tempo e esforço durante a análise, tornando o processo mais eficiente.
- Conformidade com regulamentos: Em muitos setores e áreas, existem regulamentos e normas específicas relacionadas à privacidade e segurança dos dados. A limpeza dos dados ajuda a garantir a conformidade com essas regulamentações, removendo informações sensíveis ou pessoalmente identificáveis, protegendo a privacidade dos indivíduos e evitando penalidades legais.
- Preparação para análises avançadas: Em alguns casos, a limpeza dos dados é um passo necessário antes de aplicar técnicas de análise mais avançadas, como aprendizado de máquina ou mineração de dados. A qualidade e a consistência dos dados são fundamentais para o sucesso dessas análises, pois algoritmos complexos podem ser sensíveis a dados sujos.
Em resumo, a limpeza de dados é um componente crítico na análise de dados, pois garante a confiabilidade, a precisão e a qualidade dos resultados. Ao investir tempo e esforço na limpeza dos dados, você estabelece uma base sólida para a análise, tornando-a mais eficiente, confiável e relevante para a tomada de decisões informadas.
Nesta sessão apresentamos situações que os dados apresentam inconsistências e precisam ser corrigidos, bem como manipulações de tais dados.
#Essa parte inicial, importamos o conjunto de dados iris e fazemos algumas modificações, somente para que possamos práticar a edição desses dados.
data(iris)
iris$Petal.Length[iris$Petal.Length>5] <- NA #modificação 1
iris$Sepal.Length[iris$Sepal.Length>6] <- NA #modificação 2
iris$Species <- as.character(iris$Species) #transformação de uma classe
iris$Species[9] <- "Setosa" #modificação 3 (Trocando a inicial S para maíuscula)
df <- iris #Atribuindo os dados iris a um novo objeto chamado df
Verificação inicial do data frame
Após a importação, verifique a estrutura de dados e outros atributos com estas funções exploratórias:
df2 <- df #Criar uma cópia pode ser algo muito interessante para não apagar ou editar informações importantes que você pode precisar depois! Aqui criamos uma cópia do nosso df.
class(df2) #Classe dos dados
str(df2) #Resumo dos dados
head(df2) #Linhas iniciais
tail(df2) #Linhas finais
summary(df2) #Resumo dos dados
Verificar nome das colunas e linhas e mudar o nome:
colnames(df2) #Ver nome das colunas
rownames(df2) #Ver nome das linhas
colnames(df2)[3] <- "Tamanho da Pétala" #Com o colchetes você pode demonstrar qual coluna quer renomear.
head(df2) #Verificar alteração
Apagar uma coluna
df2$Sepal.Length <- NULL #Apaga a coluna
head(df2) #Verificando
Voltando para nosso conjunto de dados df, foi constatado que os NAs presentes, na verdade correspondem a um valor fixo de 0.5, que não foi contabilizado e agora precisa ser corrigido. Toda vez que esse valor estava presente, foi substituido por NA.
Manipulando NAs
Através da indexação, podemos verifcar os NAs, com auxílio da lógica no R.
df$Sepal.Length == NA #Esse teste não funciona, pois é uma palavra reservada e retorna NA. Para o teste lógico de NA deve ser utilizada a função is.na()
is.na(df$Sepal.Length)
which(is.na(df$Sepal.Length)) #Onde estão os NAs
O is.na retorna um vetor lógico e pode ser usado para indexar o data frame ou apenas uma variável:
df[is.na(df$Sepal.Length),] #Mostra todas as variáveis onde é NA para Sepal.Length
df$Species[is.na(df$Sepal.Length)] #Mostra somente a variável Species nde é NA para Sepal.Length
É possível também operar vários vetores lógicos para retornar os NAs em mais de uma variável:
is.na(df$Sepal.Length) | is.na(df$Petal.Length) | is.na(df$Sepal.Width)
#Mostra um vetor lógico indicando onde existem NAs com TRUE
O teste lógico utiliza o operador “|” (ou) entre vetores lógicos, seguindo a regra de equivalência. Ele retorna TRUE se pelo menos um dos vetores tiver o valor TRUE na mesma posição. O resultado será FALSE apenas se os vetores tiverem o valor FALSE na mesma posição. No final, o vetor resultante terá o valor TRUE quando algum dos itens colocados tiver NA na posição correspondente.
Podemos agora, salvar esse objeto com os valores lógicos e sobreescrever os NAs com o valor 0.5 nas posições onde está o valor incorreto.
Nas <- df[is.na(df$Sepal.Length) | is.na(df$Petal.Length) | is.na(df$Sepal.Width),] #Salvando nossa tabela com NAs
Nas
is.na(df)
df[is.na(df)]
df[is.na(df)] <- 0.5 #Substituindo todos os NAs por 0.5
df
O teste lógico utiliza o operador “|” (ou) entre vetores lógicos, seguindo a regra de equivalência. Ele retorna TRUE se pelo menos um dos vetores tiver o valor TRUE na mesma posição. O resultado será FALSE apenas se os vetores tiverem o valor FALSE na mesma posição. No final, o vetor resultante terá o valor TRUE quando algum dos itens colocados tiver NA na posição correspondente.
Podemos agora, salvar esse objeto com os valores lógicos e sobreescrever os NAs com o valor 0.5 nas posições onde está o valor incorreto.
Nas #Localização anterior dos NAs
df[df$Sepal.Length==0.5| df$Petal.Length==0.5 | df$Sepal.Width==0.5,] #Atualizado
Conferindo fatores
Podemos utilizar as funções table ou unique para verificar os níveis únicos e verificar se tem algum problema em nossos dados. Vamos aplicá-las para Species:
table(df$Species)
unique(df$Species)
Neste caso é possível indentificar que o nível Setosa possui um erro, pois todos deveriam ter 50 amostras e existe somente uma amostra para o nível Setosa e 49 para setosa (a letra maiúscula ou minúscula tem distinção e é importante reter bastante atenção para isso no R). Vamos corrigir com a indexação usual:
df$Species == "Setosa"
df$Species[df$Species == "Setosa"] #Verificando se somente o Setosa está selecionada
df$Species[df$Species == "Setosa"] <- "setosa" #Substituindo Setosa por setosa
table(df$Species) #Verificando o resultado
Após a substituição, todas as espécies permaneceram com 50 amostras.
Juntando matrizes
Os comandos rbind e cbind são utilizados para combinar matrizes. Aqui estão as explicações e exemplos de como usar esses comandos:
- Combinação de matrizes por linhas: O comando rbind é usado para combinar matrizes empilhando-as verticalmente, ou seja, uma embaixo da outra. As matrizes devem ter o mesmo número de colunas.
matriz_1 <- matrix(1:6, ncol = 2) # Cria uma matriz 3x2
matriz_2 <- matrix(7:12, ncol = 2) # Cria outra matriz 3x2
resultado_rbind <- rbind(matriz_1, matriz_2)
print(resultado_rbind)
Neste exemplo, matriz_1 e matriz_2 têm o mesmo número de colunas (2), portanto, você pode usar rbind para combinar essas matrizes verticalmente.
- Combinação de matrizes por colunas: O comando cbind é usado para combinar matrizes lado a lado, ou seja, uma ao lado da outra. As matrizes devem ter o mesmo número de linhas.
# Exemplo de uso de cbind
matriz_3 <- matrix(1:3, nrow = 3) # Cria uma matriz 3x1
matriz_4 <- matrix(4:6, nrow = 3) # Cria outra matriz 3x1
resultado_cbind <- cbind(matriz_3, matriz_4)
print(resultado_cbind)
Lembre-se de que as matrizes devem ter o mesmo número de colunas para usar o rbind
e o mesmo número de linhas para usar o cbind
. Caso contrário, ocorrerá um erro de dimensionamento. Certifique-se de ajustar o tamanho das matrizes antes de usar esses comandos, se necessário.
Exercícios
- Posteriormente foi verificado um erro nas análises do nosso conjunto de dados df. Todos os valores abaixo de 5, na verdade correspondem ao valor 0. Substitua estes valores.
- Crie duas matrizes, ambas com 4 linhas e 3 colunas. Preencha-as com números inteiros de sua escolha. Use o comando
rbind
para combinar essas duas matrizes em uma única matrizresultado_rbind
. - Crie duas matrizes, ambas com 4 linhas e 3 colunas. Preencha-as com números reais de sua escolha. Use o comando
cbind
para combinar essas duas matrizes em uma única matrizresultado_cbind
. - Imagine que você está acompanhando o desempenho de alunos em dois exames, Exame A e Exame B. Crie duas matrizes:
exame_a
com 5 linhas (alunos) e 3 colunas (notas) eexame_b
com 5 linhas (alunos) e 2 colunas (notas). Preencha as notas com valores aleatórios entre 0 e 100. Userbind
para combinar as duas matrizes em uma única matriz chamadanotas_final
.