pacotes <- c("readxl", "PerformanceAnalytics")
lapply(pacotes, library, character.only = TRUE)
cars_train <- read_excel("cars_train.xlsx")
cars_test <- read_excel("cars_test.xlsx")
cars_train <- cars_train[-1]
cars_test <- cars_test[-1]
chart.Correlation((cars_train[, c(1, 5:7, 9, 28)]), histogram = TRUE)
A matriz de correlação nos permite compreender a relação que as variáveis numéricas mantém entre si. Podemos ver que “num_fotos” e “num_portas” possuem baixa correlação com todas as outras e que pouco influenciam no preço dos automóveis.
Curiosamente, “num_portas” apresenta uma leve correlação negativa com o preço, o que pode parecer contra-intuitivo devido ao senso comum de que carros com mais portas tendem a serem mais caros por serem maiores e etc. Entretanto, os dados apresentam essse comportamento devido a presença de observações que representam carros esportivos de luxo de duas portas que possuem um valor muito elevado.
As outras variáveis numéricas seguem um comportamento esperado. “ano_de_fabricacao” apresenta forte correlação positiva com “ano_modelo”, e ambas apresentam correlação positiva com preço. Indicando que quanto mais novo o carro, maior tende a ser o seu preço.
A variável “hodometro” também segue um comportamento esperado, apresentando correlação negativa com “ano_de_fabricacao”, “ano_modelo” e “preco”. Podemos inferir que carros mais antigos tendem a ter uma quilometragem registrada no hodômetro maior. Consequentemente, quanto maior a quilometragem registrada no hodômetro, menor é o preço do automóvel.
Essa breve análise nos mostra que as variáveis numéricas, no geral, possuem relações confiáveis e coerentes com a realidade.
cars_train$num_fotos <- ifelse(is.na(cars_train$num_portas), 0, cars_train$num_portas)
cars_train <- replace(cars_train, is.na(cars_train), "nao")
anova <- aov(preco ~ marca, data = cars_train)
summary(anova)
## Df Sum Sq Mean Sq F value Pr(>F)
## marca 39 5.703e+13 1.462e+12 308 <2e-16 ***
## Residuals 29544 1.403e+14 4.747e+09
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Caso desejemos analisar uma
variável diferente de “marca”, basta substituir “marca” pelo nome da
variável desejada. Antes de usar a função aov foi
necessário um pequeno tratamento nos dados para eliminar os valores
vazios (NA).
As análises de variância (ANOVA) são úteis para avaliar o grau de significância de uma variável em relação a outra, permitindo uma compreensão clara das relações entre as variáveis. Quando usadas em conjunto com análises de correlação, obtemos um panorama abrangente das relações entre as variáveis.
Usando a função aov, foi possível analisar todas as
variáveis independentes em função da variável dependente “preco”.
Os resultados indicaram que praticamente todas as variáveis se mostraram significantes para a formação do preço a um nível de confiança de 95%. As únicas variáveis que não se mostraram significantes a 95% de confiança foram “elegivel_revisao”, “ipva_pago” e “veiculo_alienado”.
summary(cars_train)
## num_fotos marca modelo versao
## Min. :2.000 Length:29584 Length:29584 Length:29584
## 1st Qu.:4.000 Class :character Class :character Class :character
## Median :4.000 Mode :character Mode :character Mode :character
## Mean :3.941
## 3rd Qu.:4.000
## Max. :4.000
## ano_de_fabricacao ano_modelo hodometro cambio
## Min. :1985 Min. :1997 Min. : 100 Length:29584
## 1st Qu.:2015 1st Qu.:2016 1st Qu.: 31214 Class :character
## Median :2018 Median :2018 Median : 57434 Mode :character
## Mean :2017 Mean :2018 Mean : 58431
## 3rd Qu.:2019 3rd Qu.:2020 3rd Qu.: 81954
## Max. :2022 Max. :2023 Max. :390065
## num_portas tipo blindado cor
## Min. :2.000 Length:29584 Length:29584 Length:29584
## 1st Qu.:4.000 Class :character Class :character Class :character
## Median :4.000 Mode :character Mode :character Mode :character
## Mean :3.941
## 3rd Qu.:4.000
## Max. :4.000
## tipo_vendedor cidade_vendedor estado_vendedor anunciante
## Length:29584 Length:29584 Length:29584 Length:29584
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
## entrega_delivery troca elegivel_revisao dono_aceita_troca
## Mode :logical Mode :logical Mode :logical Length:29584
## FALSE:23601 FALSE:24523 FALSE:29584 Class :character
## TRUE :5983 TRUE :5061 Mode :character
##
##
##
## veiculo_único_dono revisoes_concessionaria ipva_pago
## Length:29584 Length:29584 Length:29584
## Class :character Class :character Class :character
## Mode :character Mode :character Mode :character
##
##
##
## veiculo_licenciado garantia_de_fábrica revisoes_dentro_agenda
## Length:29584 Length:29584 Length:29584
## Class :character Class :character Class :character
## Mode :character Mode :character Mode :character
##
##
##
## veiculo_alienado preco
## Length:29584 Min. : 9870
## Class :character 1st Qu.: 76572
## Mode :character Median : 114356
## Mean : 133024
## 3rd Qu.: 163680
## Max. :1359813
summary(cars_test)
## num_fotos marca modelo versao
## Min. : 8.00 Length:9862 Length:9862 Length:9862
## 1st Qu.: 8.00 Class :character Class :character Class :character
## Median : 8.00 Mode :character Mode :character Mode :character
## Mean :10.32
## 3rd Qu.:14.00
## Max. :21.00
## NA's :60
## ano_de_fabricacao ano_modelo hodometro cambio
## Min. :1988 Min. :2007 Min. : 100 Length:9862
## 1st Qu.:2015 1st Qu.:2016 1st Qu.: 31323 Class :character
## Median :2018 Median :2018 Median : 56742 Mode :character
## Mean :2017 Mean :2018 Mean : 58237
## 3rd Qu.:2019 3rd Qu.:2020 3rd Qu.: 81784
## Max. :2022 Max. :2023 Max. :381728
##
## num_portas tipo blindado cor
## Min. :2.000 Length:9862 Length:9862 Length:9862
## 1st Qu.:4.000 Class :character Class :character Class :character
## Median :4.000 Mode :character Mode :character Mode :character
## Mean :3.943
## 3rd Qu.:4.000
## Max. :4.000
##
## tipo_vendedor cidade_vendedor estado_vendedor anunciante
## Length:9862 Length:9862 Length:9862 Length:9862
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
##
## entrega_delivery troca elegivel_revisao dono_aceita_troca
## Mode :logical Mode :logical Mode :logical Length:9862
## FALSE:7907 FALSE:8217 FALSE:9862 Class :character
## TRUE :1955 TRUE :1645 Mode :character
##
##
##
##
## veiculo_único_dono revisoes_concessionaria ipva_pago
## Length:9862 Length:9862 Length:9862
## Class :character Class :character Class :character
## Mode :character Mode :character Mode :character
##
##
##
##
## veiculo_licenciado garantia_de_fábrica revisoes_dentro_agenda veiculo_alienado
## Length:9862 Length:9862 Length:9862 Mode:logical
## Class :character Class :character Class :character NA's:9862
## Mode :character Mode :character Mode :character
##
##
##
##
Através da função summary, podemos visualizar
informações estatísticas sobre as variáveis nos conjuntos de dados
“cars_train” e “cars_test”. Ela fornece o tipo de cada variável, além da
amplitude e de informações estatísticas, como a média, mediana e quartis
para as variáveis numéricas.
Após analisar o conjunto de dados usando a função
summary, podemos observar algumas informações relevantes.
Por exemplo, a média dos preços dos carros é de 133.024. Além disso,
notamos que o conjunto de dados possui observações que representam
carros muito recentes, com ano do modelo igual a 2023, assim como
observações relacionadas a carros mais antigos, com o ano de fabricação
em 1985.
Observamos também uma variação considerável na quilometragem registrada nos hodômetros dos carros no conjunto de dados. Alguns carros possuem uma quilometragem muito baixa, sugerindo um uso limitado, enquanto outros apresentam uma quilometragem bastante elevada, indicando um uso mais extensivo.
Assim, o uso da summary nos permite ter uma visão geral
das características e distribuição das variáveis. Essas informações
estatísticas são úteis para entender melhor os dados e identificar
possíveis discrepâncias, outliers ou padrões nos valores das
variáveis.
levels(factor(cars_train$marca))
## [1] "ALFA ROMEO" "AUDI" "BMW" "BRM"
## [5] "CHERY" "CHEVROLET" "CHRYSLER" "CITROËN"
## [9] "DODGE" "EFFA" "FERRARI" "FIAT"
## [13] "FORD" "HONDA" "HYUNDAI" "IVECO"
## [17] "JAC" "JAGUAR" "JEEP" "KIA"
## [21] "LAND ROVER" "LEXUS" "LIFAN" "MASERATI"
## [25] "MERCEDES-BENZ" "MINI" "MITSUBISHI" "NISSAN"
## [29] "PEUGEOT" "PORSCHE" "RAM" "RENAULT"
## [33] "SMART" "SSANGYONG" "SUBARU" "SUZUKI"
## [37] "TOYOTA" "TROLLER" "VOLKSWAGEN" "VOLVO"
levels(factor(cars_test$marca))
## [1] "ALFA ROMEO" "AUDI" "BMW" "CHERY"
## [5] "CHEVROLET" "CHRYSLER" "CITROËN" "DODGE"
## [9] "EFFA" "FERRARI" "FIAT" "FORD"
## [13] "HONDA" "HYUNDAI" "JAC" "JAGUAR"
## [17] "JEEP" "KIA" "LAMBORGHINI" "LAND ROVER"
## [21] "LEXUS" "LIFAN" "MASERATI" "MERCEDES-BENZ"
## [25] "MINI" "MITSUBISHI" "NISSAN" "PEUGEOT"
## [29] "PORSCHE" "RAM" "RENAULT" "SMART"
## [33] "SSANGYONG" "SUBARU" "SUZUKI" "TOYOTA"
## [37] "TROLLER" "VOLKSWAGEN" "VOLVO"
Caso desejemos analisar uma variável diferente de “marca”, basta substituir “marca” pelo nome da variável desejada.
A função levels nos permite identificar a quantidade de
categorias/níveis presentes nas variáveis qualitativas/categóricas. Essa
função é útil, pois em conjunto com outras análises, nos proporciona uma
boa compreensão da complexidade dos dados com os quais estamos
lidando.
Nesse caso em especial, observamos que algumas das variáveis qualitativas possuem uma grande quantidade de categorias, com destaque para a variável “versao”.
Isso indica que o treinamento de um modelo preditivo será desafiador, uma vez que essas variáveis aumentam a complexidade do modelo e devem ser incluídas no treinamento, pois sabemos, tanto por meio das análises realizadas aqui como por nossa experiência no mundo real, que variáveis como modelo, versão e marca do carro têm influência direta no preço.
Percebe-se também que as categorias das variáveis qualitativas não são exatamente as mesmas nos dois datasets. Por exemplo, a categoria “BRM” da variável “marca” é exclusiva do dataset “cars_train”. Logo, será necessário um tratamento especial nos dados para que seja possível fazer previsões de preço no dataset “cars_test” usando um modelo treinado a partir do datase “cars_train”.
table(cars_train$marca)
##
## ALFA ROMEO AUDI BMW BRM CHERY
## 9 1698 1784 1 153
## CHEVROLET CHRYSLER CITROËN DODGE EFFA
## 3020 30 194 37 1
## FERRARI FIAT FORD HONDA HYUNDAI
## 1 1918 1060 1586 2043
## IVECO JAC JAGUAR JEEP KIA
## 2 3 148 2000 408
## LAND ROVER LEXUS LIFAN MASERATI MERCEDES-BENZ
## 760 75 8 7 1125
## MINI MITSUBISHI NISSAN PEUGEOT PORSCHE
## 137 862 438 1675 349
## RAM RENAULT SMART SSANGYONG SUBARU
## 168 538 12 14 41
## SUZUKI TOYOTA TROLLER VOLKSWAGEN VOLVO
## 41 2180 177 4594 287
table(cars_test$marca)
##
## ALFA ROMEO AUDI BMW CHERY CHEVROLET
## 1 593 591 49 1000
## CHRYSLER CITROËN DODGE EFFA FERRARI
## 10 54 10 1 1
## FIAT FORD HONDA HYUNDAI JAC
## 605 385 511 697 2
## JAGUAR JEEP KIA LAMBORGHINI LAND ROVER
## 64 667 157 1 267
## LEXUS LIFAN MASERATI MERCEDES-BENZ MINI
## 16 2 5 376 45
## MITSUBISHI NISSAN PEUGEOT PORSCHE RAM
## 286 145 571 121 53
## RENAULT SMART SSANGYONG SUBARU SUZUKI
## 173 4 6 13 10
## TOYOTA TROLLER VOLKSWAGEN VOLVO
## 702 46 1546 76
Caso desejemos analisar uma variável diferente de “marca”, basta substituir “marca” pelo nome da variável desejada.
A função table também é muito útil para obter
informações sobre as variáveis qualitativas. Ela nos permite verificar a
contagem de observações em cada uma das categorias de uma variável
qualitativa..
Ao analisarmos os dados, observamos que variáveis com um maior número de categorias apresentam algumas categorias com um número muito pequeno de observações. Especificamente, a variável “versao” possui várias categorias com poucas observações.
Conforme mencionado anteriormente, essa característica em um conjunto de dados pode tornar as previsões mais desafiadoras, especialmente quando não podemos simplesmente excluir as variáveis que possuem essas características.