Warning: pacote 'tidyverse' foi compilado no R versão 4.5.3
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr 1.2.0 ✔ purrr 1.2.1
✔ forcats 1.0.1 ✔ stringr 1.6.0
✔ ggplot2 4.0.2 ✔ tibble 3.3.1
✔ lubridate 1.9.5 ✔ tidyr 1.3.2
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag() masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(skimr)library(janitor)
Warning: pacote 'janitor' foi compilado no R versão 4.5.3
Anexando pacote: 'janitor'
Os seguintes objetos são mascarados por 'package:stats':
chisq.test, fisher.test
library(knitr)
Warning: pacote 'knitr' foi compilado no R versão 4.5.3
library(GGally)
Warning: pacote 'GGally' foi compilado no R versão 4.5.3
library(summarytools)
Warning: pacote 'summarytools' foi compilado no R versão 4.5.3
Anexando pacote: 'summarytools'
O seguinte objeto é mascarado por 'package:tibble':
view
library(mice)
Warning: pacote 'mice' foi compilado no R versão 4.5.3
Anexando pacote: 'mice'
O seguinte objeto é mascarado por 'package:stats':
filter
Os seguintes objetos são mascarados por 'package:base':
cbind, rbind
DADOS
library(readr)df<-read_csv("train_v9rqX0R.csv")
Rows: 8523 Columns: 12
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (7): Item_Identifier, Item_Fat_Content, Item_Type, Outlet_Identifier, Ou...
dbl (5): Item_Weight, Item_Visibility, Item_MRP, Outlet_Establishment_Year, ...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
#Assegurando que os nomes das variaveis não irão dar problemaclean_names(df)
ITEM 2: O dataset Big_Mart_Sales_Prediction do Kaggle.com foi selecionado com o objetivo de modelar o comportamento de vendas de uma rede de varejo (supermercados e conveniência). Busca-se, por meio da Análise Exploratória de Dados (EDA), identificar padrões de consumo e interdependências entre variáveis (como preço, visibilidade e tipo de estabelecimento), gerando insights estratégicos que permitam otimizar o faturamento e a eficiência operacional da rede.
As seguintes variáveis foram convertidas em factor devido a dois critérios:
Requisito Técnico: Para o pacote MICE operar corretamente, variáveis do tipo chr não são apropriadas, sendo necessária a conversão para factor.
Lógica de Dados: A variável numérica que representa o ano de fundação também foi convertida, pois suas variações não implicam em uma grandeza matemática (soma ou subtração); para a análise, o ano se assemelha mais a um rótulo que identifica diferentes grupos de lojas.”
# Convertendo para Factor as colunas categóricas(Para MICE e scatter matrix)df<- df |>mutate(across(c(Item_Fat_Content, Item_Type, Outlet_Size, Outlet_Location_Type, Outlet_Type,Item_Identifier,Outlet_Identifier,Outlet_Establishment_Year,Item_Fat_Content), as.factor))
# Gerando o Boxplot com Facet por Categoria de Itemdf |>ggplot(aes(x = Outlet_Type, y = Item_Outlet_Sales, fill = Outlet_Type)) +geom_boxplot(alpha =0.7, outlier.size =0.5) +# Outliers menores para não poluirfacet_wrap(~Item_Type, scales ="free_y") +# cria um gráfico por tipolabs(title ="Análise Segmentada de Vendas por Categoria e Tipo de Loja",subtitle ="Verificando se a tese de volume se mantém em todos os nichos",x ="Tipo de Loja",y ="Vendas Totais" ) +theme_minimal() +theme(axis.text.x =element_text(angle =90, vjust =0.5, size =7), # Texto vertical para caberlegend.position ="none",strip.text =element_text(face ="bold") # Deixa o nome das categorias em negrito )
A análise segmentada por categoria revela que determinados grupos de produtos apresentam mediana de vendas elevada aliada a um baixo IQR (Interquartile Range). Esta combinação sinaliza um fluxo de demanda previsível e resiliente, ideal para a aplicação de estratégias de Liderança em Custo.
Particularmente nos segmentos onde observam-se outliers de performance superior, recomenda-se a redução marginal da margem de lucro. O objetivo é converter a estabilidade operacional em ganho de Market Share, capturando o excedente de demanda via volume incremental, desde que a estrutura de custos logísticos e operacionais suporte a compressão da margem unitária.
ITEM 4:Através da investigação visual da matriz de espalhamento, conclui-se que as variáveis mais correlacionadas são Item_MRP (Preço Máximo) e Item_Outlet_Sales (Vendas Totais). Embora a reta de regressão (referência) apresente uma inclinação moderada devido à alta dispersão dos dados, a investigação visual revela que o teto de faturamento acompanha uma trajetória linear positiva em relação ao Item_MRP. O formato triangular da nuvem de pontos demonstra que o preço atua como um limitador de potencial: itens de baixo custo possuem um teto de vendas reduzido, enquanto o aumento do preço expande a fronteira de vendas máximas possíveis, caracterizando a correlação mais significativa do conjunto de dados.
df |># 1. Seleciona apenas as variáveis numéricasselect(where(is.numeric)) |># 2. Remove os NAs temporariamente para o gráfico não travarna.omit() |># 3. Gera a Matrizggpairs(title ="Matriz de Espalhamento das Variáveis Numéricas",upper =list(continuous =wrap("cor", size =3, color ="darkblue")), # Coeficiente de Pearson em cimalower =list(continuous =wrap("smooth_loess", color ="tomato")), # Gráfico com linha de tendência embaixodiag =list(continuous =wrap("densityDiag", fill ="steelblue", alpha =0.5)) # Histograma de densidade na diagonal ) +theme_minimal(base_size =8) # Ajusta o tamanho da fonte para não poluir
ITEM 5:
a)Distribuição Normal: é uma distribuição simétrica , em formato de sino , possui mediana=moda=média e pico nestas, a densidade diminui gradativamente a partir do valor central em ambas as direçoes , e tem como regra prática 99,7% dos dados se encontram a 3 desvios padrões a partir do centro
b) Item_Weight : O número de bins escolhido foi 60 para ter uma boa noção do comportamento da distribuição , como seu caráter multimodal e picos locais
ggplot(df, aes(x = Item_Weight)) +geom_histogram(bins =60, fill ="steelblue", color ="white", alpha =0.8 ) +# Camada de Labelslabs(title ="Distribuição de Item_Weight ",subtitle ="Análise visual da frequência e outliers",x ="Unidade de Medida",y ="Frequência Absoluta" ) +theme_minimal()
Warning: Removed 1463 rows containing non-finite outside the scale range
(`stat_bin()`).
Item_Visibility: O número de bins escolhidos foi 25 , com essa quantidade já é possivel ter uma boa noção visual do comportamento da distriuição , com mais bins começam a aparecer muitas classes vazias ou proximas disso, e com menos o padrão fica mais subrepresentado.
ggplot(df, aes(x = Item_Visibility)) +geom_histogram(bins =25, fill ="steelblue", color ="white", alpha =0.8 ) +# Camada de Labelslabs(title ="Distribuição de Item_Visibility ",subtitle ="Análise visual da frequência e outliers",x ="Unidade de Medida",y ="Frequência Absoluta" ) +theme_minimal()
Item_MRP: O número de bins escolhido foi 45 para ter uma boa noção do comportamento da distribuição , como seu caráter multimodal e picos locais
ggplot(df, aes(x = Item_MRP)) +geom_histogram(bins =45, fill ="steelblue", color ="white", alpha =0.8 ) +# Camada de Labelslabs(title ="Distribuição de Item_MRP ",subtitle ="Análise visual da frequência e outliers",x ="Unidade de Medida",y ="Frequência Absoluta" ) +theme_minimal()
Item_Outlet_Sales : O número de bins escolhido foi 25 , com esse número ja é possivel uma visualizão do comportamento da distribuição, com mais bins começam a surgir classes vazias ou próximas disso.
ggplot(df, aes(x = Item_Outlet_Sales)) +geom_histogram(bins =25, fill ="steelblue", color ="white", alpha =0.8 ) +# Camada de Labelslabs(title ="Distribuição de Item_Outlet_Sales ",subtitle ="Análise visual da frequência e outliers",x ="Unidade de Medida",y ="Frequência Absoluta" ) +theme_minimal()
C) Gráficos QQ-PLOT
# 1. Criamos um vetor com os nomes das colunas numéricasnum_vars <-names(df)[sapply(df, is.numeric)]# 2. O Loop que percorre cada variávelfor (var in num_vars) {# Criamos o gráfico individualmente para cada 'var' p <-ggplot(df, aes(sample = .data[[var]])) +stat_qq(color ="steelblue") +stat_qq_line(color ="red") +labs(title =paste("QQ-Plot de:", var),x ="Quantis Teóricos",y ="Quantis Amostrais") +theme_minimal()print(p)}
Warning: Removed 1463 rows containing non-finite outside the scale range
(`stat_qq()`).
Warning: Removed 1463 rows containing non-finite outside the scale range
(`stat_qq_line()`).
d) Shapiro-Wilk
# 1. Identificar variáveis numéricasnum_vars <-names(df)[sapply(df, is.numeric)]# 2. Criar uma lista para guardar os resultadosshapiro_results <-lapply(num_vars, function(var) {# O teste de Shapiro no R aceita no máx 5000 amostras dados_teste <-na.omit(df[[var]])if(length(dados_teste) >5000) dados_teste <-sample(dados_teste, 5000) teste <-shapiro.test(dados_teste)return(data.frame(Variavel = var,W_Statistic = teste$statistic,p_value = teste$p.value,Resultado =ifelse(teste$p.value <0.05, "Não Normal", "Normal") ))})shapiro_df <-do.call(rbind, shapiro_results)print(shapiro_df)
Variavel W_Statistic p_value Resultado
W Item_Weight 0.9535188 3.422079e-37 Não Normal
W1 Item_Visibility 0.9088498 1.155215e-47 Não Normal
W2 Item_MRP 0.9702954 5.625446e-31 Não Normal
W3 Item_Outlet_Sales 0.9072773 6.013407e-48 Não Normal
e)A partir dos histogramas percebe-se que nenhum gráfico das variaveis é simetrico nem possui formato de sino, os QQ-Plots salietam afastamentos sistematicos da linha de referência , finalmente o teste de Shapiro-Wilk confirma um p-valor menor que 0.05 . Deste modo, dado o aprensentado, concluo que nenhuma das variáveis é aproximadamente normal.
Item 6:Completude dos dados se refere a porcentagem destes que estão preenchidos , matemáticamente é (em determinada variavel) a razão do número de preenchidos/ numero total . Impacta diretamente a análise exploratória de dados,pois com maior completude a análise do comportamento de cada variável, bem como a relações com as demais, fica mais precisa e o potencial preditivo tende a ser mais confiavel(vide um gráfico de dispersão: com uma quantidade maior de pontos, a reta de regressão que minimiza as distâncias ganha acurácia e, consequentemente, maior poder preditor)
Item 7:
# 1. Inspeção de Categorias (para ver se não há itens sendo descritos em duplicade)# Procura IDs que aparecem com mais de um tipo de produtoconflito_ids <- df |>group_by(Item_Identifier) |>summarise(n_tipos =n_distinct(Item_Type))|>filter(n_tipos >1)# Se o resultado for 0 linhas, okprint(conflito_ids)
Item 8:Embora o dataset apresente boa completude na maioria das variáveis, duas delas possuem lacunas significativas (até 29% de NAs). Devido a essa ausência expressiva e à presença de valores discrepantes, utilizei a imputação por MICE para preservar a estrutura da distribuição de forma mais fidedigna, evitando as distorções que uma imputação simples causaria em um volume tão grande de dados faltantes.
# 1. Criar um dataset apenas com as variáveis que interessam para a prediçãodf_para_mice <- df[, !(names(df) %in%c("Item_Identifier", "Outlet_Identifier"))]# 2. Rodar o MICE mice_mod <-mice(df_para_mice, m =2, method ='pmm', seed =123)
# 3. Completar o datasetdf_imputado <-complete(mice_mod, 1)# 4. Trazer o ID de volta do dataset originaldf_final <-cbind(df[, c("Item_Identifier", "Outlet_Identifier")], df_imputado)# 5. Verificar o sucessosum(is.na(df_final))
[1] 0
descr(df$Item_Weight)
Descriptive Statistics
df$Item_Weight
N: 8523
Item_Weight
----------------- -------------
Mean 12.86
Std.Dev 4.64
Min 4.56
Q1 8.77
Median 12.60
Q3 16.85
Max 21.35
MAD 6.08
IQR 8.08
CV 0.36
Skewness 0.08
SE.Skewness 0.03
Kurtosis -1.23
N.Valid 7060.00
N 8523.00
Pct.Valid 82.83
descr(df_final$Item_Weight)
Descriptive Statistics
df_final$Item_Weight
N: 8523
Item_Weight
----------------- -------------
Mean 13.03
Std.Dev 4.52
Min 4.56
Q1 9.06
Median 13.00
Q3 16.70
Max 21.35
MAD 5.84
IQR 7.64
CV 0.35
Skewness 0.11
SE.Skewness 0.03
Kurtosis -1.09
N.Valid 8523.00
N 8523.00
Pct.Valid 100.00