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. 

 
Envolve a identificação, remoção ou correção de erros, inconsistências e valores ausentes nos dados coletados ou armazenados. Algumas das razões pelas quais a limpeza de dados é importante para a análise de dados são: 
 
  1. 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. 
  2. 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. 
  3. 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. 
  4. 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. 
  5. 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. 
  6. 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

  1. 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. 
  2. 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 matriz resultado_rbind.
  3. 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 matriz resultado_cbind.
  4. 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) e exame_b com 5 linhas (alunos) e 2 colunas (notas). Preencha as notas com valores aleatórios entre 0 e 100. Use rbind para combinar as duas matrizes em uma única matriz chamada notas_final.

Comentários

{{ reviewsTotal }}{{ options.labels.singularReviewCountLabel }}
{{ reviewsTotal }}{{ options.labels.pluralReviewCountLabel }}
{{ options.labels.newReviewButton }}
{{ userData.canReview.message }}