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.
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.
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.
O projeto que desenvolveremos é sobre os preços de moradias em São Paulo. Trabalharemos com diversas informações dessas moradias, como:
address
): O endereço do imóvel;district
): O distrito onde o imóvel está localizado;area
): A área do imóvel em metros quadrados;bedrooms
): O número de quartos na propriedade;garage
): O número de vagas de estacionamento disponíveis na propriedade;rent
): O valor do aluguel mensal do imóvel;type
): O tipo do imóvel (apartamento, casa, estúdio, etc.);total
): O custo total do imóvel, incluindo aluguel, impostos e outras taxas.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.
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 Herval | Belenzinho | 21 | 1 | 0 | Studio e kitnet | 2400 | 2939 |
Avenida São Miguel | Vila Marieta | 15 | 1 | 1 | Studio e kitnet | 1030 | 1345 |
Rua Oscar Freire | Pinheiros | 18 | 1 | 0 | Apartamento | 4000 | 4661 |
... | ... | ... | ... | ... | ... | ... | ... |
Rua Abílio Borin | Jardim Caravelas | 84 | 1 | 2 | Apartamento | 4500 | 5467 |
Rua Forte William | Jardim Fonte do Morumbi | 76 | 1 | 0 | Apartamento | 9000 | 10200 |
Rua Alexandre Dumas | Santo Amaro | 110 | 3 | 1 | Casa | 3300 | 3440 |
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> |
---|---|---|---|---|---|---|---|---|
1 | Rua Herval | Belenzinho | 21 | 1 | 0 | Studio e kitnet | 2400 | 2939 |
2 | Avenida São Miguel | Vila Marieta | 15 | 1 | 1 | Studio e kitnet | 1030 | 1345 |
3 | Rua Oscar Freire | Pinheiros | 18 | 1 | 0 | Apartamento | 4000 | 4661 |
4 | Rua Júlio Sayago | Vila Ré | 56 | 2 | 2 | Casa em condomínio | 1750 | 1954 |
5 | Rua Barata Ribeiro | Bela Vista | 19 | 1 | 0 | Studio e kitnet | 4000 | 4654 |
6 | Rua Domingos Paiva | Brás | 50 | 2 | 1 | Apartamento | 3800 | 4587 |
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.
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.
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.
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
address | district | area | bedrooms | garage | type | rent | total |
---|---|---|---|---|---|---|---|
FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE |
FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE |
FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE |
FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE |
... | ... | ... | ... | ... | ... | ... | ... |
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> |
---|---|---|---|---|---|---|---|---|
24 | Avenida Rio Branco | NA | NA | NA | NA | NA | NA | NA |
85 | Rua Gomes de Carvalho | Vila Olímpia | 70 | 2 | NA | Apartamento | NA | NA |
439 | Rua Ernani Pinto | Vila Maria Alta | 123 | 3 | 1 | Apartamento | NA | NA |
713 | Rua Poconé | NA | NA | NA | NA | NA | NA | NA |
961 | Rua Trapiche | Vila Matilde | NA | NA | NA | Casa em condomínio | NA | NA |
1320 | Largo do Arouche | República | NA | NA | NA | NA | NA | NA |
1637 | Rua Eugênio Pradez | Jardim Piracuama | 45 | 1 | 0 | Apartamento | NA | NA |
1949 | Rua Rondinha | Chácara Inglesa | NA | NA | NA | NA | NA | NA |
9170 | Rua Diogo Pereira | Super Quadra Morumbi | NA | NA | NA | NA | NA | NA |
11646 | Rua São Benedito | Santo Amaro | 185 | 4 | 3 | Apartamento | NA | NA |
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.
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.
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.
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:
Impulsione a sua carreira com os melhores cursos e faça parte da maior comunidade tech.
1 ano de Alura
Assine o PLUS e garanta:
Formações com mais de 1500 cursos atualizados e novos lançamentos semanais, em Programação, Inteligência Artificial, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.
A cada curso ou formação concluído, um novo certificado para turbinar seu currículo e LinkedIn.
No Discord, você tem acesso a eventos exclusivos, grupos de estudos e mentorias com especialistas de diferentes áreas.
Faça parte da maior comunidade Dev do país e crie conexões com mais de 120 mil pessoas no Discord.
Acesso ilimitado ao catálogo de Imersões da Alura para praticar conhecimentos em diferentes áreas.
Explore um universo de possibilidades na palma da sua mão. Baixe as aulas para assistir offline, onde e quando quiser.
Acelere o seu aprendizado com a IA da Alura e prepare-se para o mercado internacional.
1 ano de Alura
Todos os benefícios do PLUS e mais vantagens exclusivas:
Luri é nossa inteligência artificial que tira dúvidas, dá exemplos práticos, corrige exercícios e ajuda a mergulhar ainda mais durante as aulas. Você pode conversar com a Luri até 100 mensagens por semana.
Aprenda um novo idioma e expanda seus horizontes profissionais. Cursos de Inglês, Espanhol e Inglês para Devs, 100% focado em tecnologia.
Transforme a sua jornada com benefícios exclusivos e evolua ainda mais na sua carreira.
1 ano de Alura
Todos os benefícios do PRO e mais vantagens exclusivas:
Mensagens ilimitadas para estudar com a Luri, a IA da Alura, disponível 24hs para tirar suas dúvidas, dar exemplos práticos, corrigir exercícios e impulsionar seus estudos.
Envie imagens para a Luri e ela te ajuda a solucionar problemas, identificar erros, esclarecer gráficos, analisar design e muito mais.
Escolha os ebooks da Casa do Código, a editora da Alura, que apoiarão a sua jornada de aprendizado para sempre.