Alura > Cursos de Data Science > Cursos de Data Science > Conteúdos de Data Science > Primeiras aulas do curso R: aplicando a análise descritiva com R

R: aplicando a análise descritiva com R

Trabalhando com os dados - Apresentação

Olá! A instrutora da Escola de Dados, Danielle Oliveira, te dá as boas-vindas ao curso de análise descritiva com a linguagem R.

Audiodescrição: Danielle se descreve como uma mulher de pele morena. Tem cabelos escuros cacheados e olhos castanhos. Usa uma blusa de cor preta e está sentada em uma cadeira de escritório também preta. Ao fundo, parede branca iluminada nas cores verde e azul.

Agora, vamos conhecer os assuntos que estudaremos ao longo deste curso.

O que vamos aprender?

Para iniciar nosso projeto, realizaremos a importação da base de dados e também o tratamento desses dados, como lidar com valores nulos que estão distribuídos dentro dos nossos registros.

Em seguida, começaremos a avaliar esses dados utilizando medidas de tendência central, como média e mediana, além de utilizar o desvio padrão para entender como nossos dados estão se comportando.

Utilizaremos também a visualização de dados, ou seja, gráficos de barra, caixa (boxplot) e dispersão para nos auxiliar a entender a distribuição dos dados e o comportamento das variáveis. Além disso, faremos uso de tabela de frequência e histograma para compreender a frequência dos dados.

Por fim, montaremos nossa matriz de correlação para entender como as variáveis se relacionam e desenvolveremos nosso modelo de regressão linear, além de realizar previsões, que é o objetivo do nosso projeto.

Para uma aprendizagem mais ativa, não deixe de participar do fórum de discussão e da comunidade no Discord da Alura. E, claro, assista a todos os vídeos e realize todas as atividades para adquirir o máximo de conhecimento possível.

Trabalhando com os dados - Importando a base de dados

Vamos começar a desenvolver o nosso projeto utilizando a ferramenta Google Colab.

Caso não possua uma conta Google ou não conheça o Google Colab, vamos deixar uma atividade de "Preparando o ambiente" com o passo a passo para criar uma conta Google e acessar o Google Colab. Além disso, disponibilizaremos o notebook utilizado para executar os comandos.

Conhecendo o projeto

O projeto que desenvolveremos é sobre os preços de moradias em São Paulo. Trabalharemos com diversas informações dessas moradias, como:

Com essas informações, realizaremos análises, avaliaremos os dados e identificaremos possíveis discrepâncias nas variáveis. Ao final do projeto, criaremos um modelo de regressão linear para auxiliar nas previsões de novos valores de aluguéis.

Importando a base de dados

O primeiro passo é carregar o pacote Tidyverse no notebook do Google Colab, que contém um conjunto de pacotes úteis para manipulação de dados, como seleção de informações, filtragem de dados e plotagem de gráficos.

Para isso, em célula vazia, utilizaremos a função library, passando o pacote que queremos carregar, o tidyverse.

library(tidyverse)

Retorno:

── Attaching core tidyverse packages ───────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.4     ✔ readr     2.1.5
✔ forcats   1.0.0     ✔ stringr   1.5.1
✔ ggplot2   3.5.1     ✔ tibble    3.2.1
✔ lubridate 1.9.3     ✔ tidyr     1.3.1
✔ purrr     1.0.2     
── Conflicts ─────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()

i Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors

Após a execução com "Shift + Enter", os pacotes disponíveis no tidyverse são carregados e listados no retorno.

Também ocorreram dois conflitos devido a algumas funções específicas, como filter() e lag() do pacote dplyr, que já existem nativamente no R com a mesma nomenclatura. Contudo, isso não impede a execução dos comandos, e abordaremos como resolver esses conflitos quando necessário.

Com os pacotes carregados, podemos importar a base de dados armazenada no GitHub para dentro do notebook.

Para isso, vamos criar uma variável chamada dados para armazenar a base de dados. Em seguida, vamos colocar o operador de atribuição (<-), pois essa variável vai receber a função read.csv() que irá ler o caminho do arquivo no GitHub.

Além do caminho entre aspas, também vamos indicar o separador, já que lidaremos com um arquivo CSV (comma separated values) que usa ponto e vírgula.

Ainda dentro do read.csv(), vamos usar o parâmetro sep igual a ponto e vírgula (;). Lembre-se de colocar esse sinal entre aspas.

dados <- read.csv("https://raw.githubusercontent.com/danyoliver/Analise-descritiva-com-R/refs/heads/main/dados.csv", sep=";")

Após a execução, os dados são importados apesar de não aparecer nenhum retorno. A marca de verificação verde ao lado esquerdo da célula, indica que o comando foi bem-sucedido.

Podemos exibir a base importada acessando a variável dados:

dados

A data.frame 11657 x 8

address <chr>district <chr>area <int>bedrooms <int>garage <int>type <chr>rent <int>total <int>
Rua HervalBelenzinho2110Studio e kitnet24002939
Avenida São MiguelVila Marieta1511Studio e kitnet10301345
Rua Oscar FreirePinheiros1810Apartamento40004661
........................
Rua Abílio BorinJardim Caravelas8412Apartamento45005467
Rua Forte WilliamJardim Fonte do Morumbi7610Apartamento900010200
Rua Alexandre DumasSanto Amaro11031Casa33003440

São retornados os mais de 11 mil registros do Data Frame com os oito campos mencionados anteriormente.

Para simplificar o retorno, podemos usar a função head(), passando os nossos dados. Desse modo, iremos retornar apenas as seis primeiras linhas do Data Frame:

head(dados)

A data.frame: 6 × 8

#address <chr>district <chr>area <int>bedrooms <int>garage <int>type <chr>rent <int>total <int>
1Rua HervalBelenzinho2110Studio e kitnet24002939
2Avenida São MiguelVila Marieta1511Studio e kitnet10301345
3Rua Oscar FreirePinheiros1810Apartamento40004661
4Rua Júlio SayagoVila Ré5622Casa em condomínio17501954
5Rua Barata RibeiroBela Vista1910Studio e kitnet40004654
6Rua Domingos PaivaBrás5021Apartamento38004587

Assim, podemos avaliar se os dados foram importados corretamente e identificar os tipos de cada variável.

As variáveis address, district e type são strings, enquanto area, bedrooms, garage, rent e total são numéricas, pois são do tipo inteiro.

Próximos passos

Agora que os dados foram importados, é necessário realizar alguns tratamentos, pois algumas linhas apresentam valores faltantes, ou seja, nulos. Esses valores podem afetar o resultado do modelo durante as previsões, portanto, é importante validar e tratar essas informações.

Trabalhando com os dados - Limpando os dados

Ao verificar nossos dados importados, identificamos que alguns registros possuem dados faltantes. Agora, vamos tratar os dados ausentes dentro do nosso DataFrame.

É necessário fazer esse tratamento, pois dados faltantes podem gerar problemas na precisão dos cálculos, como na média de algumas variáveis. Além de afetar as medidas de tendência central, também podemos comprometer a precisão do modelo de regressão linear.

Para evitar esses problemas, vamos remover os valores nulos dentro do nosso DataFrame.

Identificando dados nulos

O primeiro passo é identificar quais registros possuem valores nulos, para que possamos remover apenas esses registros.

Utilizaremos a função is.na(), que nos retornará quais registros possuem dados faltantes e quais não possuem. Para essa função, passaremos o DataFrame que está armazenado na variável dados.

is.na(dados)

A matrix: 11657 × 8 of type lgl

addressdistrictareabedroomsgaragetyperenttotal
FALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSE
FALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSE
FALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSE
FALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSE
........................

O retorno será em formato booleano, com FALSE para registros sem valores faltantes e TRUE para aqueles com valores faltantes.

Podemos simplificar esses retornos identificando a quantidade de valores nulos. Para isso, utilizaremos o is.na() associado à função sum(), que realizará a soma desses valores. Basta passar is.na(dados) para sum().

sum(is.na(dados))

39

Ao executar, descobrimos que existe um total de 39 valores nulos, ou seja, registros que não contém nenhum valor.

Agora, precisamos aplicar um filtro para retornar apenas esses registros para poder removê-los da base de dados.

Vamos começar fazendo uma soma diferente. Com o sum(), somamos individualmente cada registro. Agora, utilizaremos o rowSums(), que faz uma soma por linha, retornando quantos registros faltantes existem por linha. Se houver dois, retornará dois; se não houver nenhum, retornará zero.

Em uma nova célula, passaremos is.na(dados) para a função rowSums().

rowSums(is.na(dados))

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ⋯ 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0

Ao executar, teremos as informações da soma de cada linha. Com isso, observamos que a maioria das linhas não tem valores faltantes, enquanto outras têm até 5 valores faltantes.

Em suma, as linhas com valores diferentes de zero são as que queremos remover. Agora que conseguimos identificar melhor essas linhas, vamos filtrá-las.

Para isso, aplicaremos um filtro para retornar apenas as linhas onde o valor de rowSums(is.na(dados)) seja maior que zero.

rowSums(is.na(dados)) > 0

Se executamos, teremos um retorno booleano de TRUE e FALSE, mas ainda não é o que precisamos. Queremos retornar apenas as linhas com valores faltantes. Aplicaremos mais um filtro para conseguir essas informações.

Primeiro, vamos criar uma nova variável, chamada linhas_invalidas, que receberá apenas as linhas onde o número de valores nulos é maior que zero.

linhas_invalidas <- rowSums(is.na(dados)) > 0

Em seguida, validaremos se temos apenas essas informações na nova variável. Para retornar apenas essas linhas faltantes, utilizaremos um vetor.

Passaremos o DataFrame dados e, entre colchetes, especificaremos que queremos retornar apenas as linhas_invalidas, aplicando um filtro nos dados.

dados[linhas_invalidas, ]

A data.frame: 10 × 8

#address <chr>district <chr>area <int>bedrooms <int>garage <int>type <chr>rent <int>total <int>
24Avenida Rio BrancoNANANANANANANA
85Rua Gomes de CarvalhoVila Olímpia702NAApartamentoNANA
439Rua Ernani PintoVila Maria Alta12331ApartamentoNANA
713Rua PoconéNANANANANANANA
961Rua TrapicheVila MatildeNANANACasa em condomínioNANA
1320Largo do AroucheRepúblicaNANANANANANA
1637Rua Eugênio PradezJardim Piracuama4510ApartamentoNANA
1949Rua RondinhaChácara InglesaNANANANANANA
9170Rua Diogo PereiraSuper Quadra MorumbiNANANANANANA
11646Rua São BeneditoSanto Amaro18543ApartamentoNANA

Isso retornará apenas os registros com algum valor faltante. Por exemplo, na primeira linha, com ID 24, apenas a informação de endereço está preenchida.

Limpando os dados

Agora, vamos remover do DataFrame os registros que possuem valores nulos. Para isso, criaremos a variável dados_limpos, que será um novo DataFrame para armazenar os dados.

Para remover dados faltantes, utilizaremos a função na.omit() e passaremos o DataFrame atual, dados.

dados_limpos <- na.omit(dados)

Dessa forma, a função removerá apenas os dados faltantes do DataFrame e armazenará na nova variável os valores não-faltantes.

Para validar, podemos reexecutar o sum() de isna(), mas passando os dados_limpos.

sum(is.na(dados_limpos))

0

Antes, tínhamos 39 informações; agora, no novo DataFrame, temos zero linhas com dados faltantes.

Próximos passos

Já tratamos os dados nulos, fazendo sua remoção, mas também precisamos validar se existem valores iguais a zero em determinadas variáveis.

Em algumas variáveis, como quarto e garagem, faz sentido ter esses valores. No entanto, em variáveis como aluguel, total ou área do imóvel, esse valor não pode estar presente.

Sobre o curso R: aplicando a análise descritiva com R

O curso R: aplicando a análise descritiva com R possui 110 minutos de vídeos, em um total de 51 atividades. Gostou? Conheça nossos outros cursos de Data Science em Data Science, ou leia nossos artigos de Data Science.

Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:

Aprenda Data Science acessando integralmente esse e outros cursos, comece hoje!

Conheça os Planos para Empresas