PD 2 Gabriel Lopes Guidi

Rpubs : http://rpubs.com/GabrielGuidi/1420416

PACOTES

library(readr)
library(tidyverse)
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 problema
clean_names(df)
# A tibble: 8,523 × 12
   item_identifier item_weight item_fat_content item_visibility item_type       
   <chr>                 <dbl> <chr>                      <dbl> <chr>           
 1 FDA15                  9.3  Low Fat                   0.0160 Dairy           
 2 DRC01                  5.92 Regular                   0.0193 Soft Drinks     
 3 FDN15                 17.5  Low Fat                   0.0168 Meat            
 4 FDX07                 19.2  Regular                   0      Fruits and Vege…
 5 NCD19                  8.93 Low Fat                   0      Household       
 6 FDP36                 10.4  Regular                   0      Baking Goods    
 7 FDO10                 13.6  Regular                   0.0127 Snack Foods     
 8 FDP10                 NA    Low Fat                   0.127  Snack Foods     
 9 FDH17                 16.2  Regular                   0.0167 Frozen Foods    
10 FDU28                 19.2  Regular                   0.0944 Frozen Foods    
# ℹ 8,513 more rows
# ℹ 7 more variables: item_mrp <dbl>, outlet_identifier <chr>,
#   outlet_establishment_year <dbl>, outlet_size <chr>,
#   outlet_location_type <chr>, outlet_type <chr>, item_outlet_sales <dbl>
skim(df)
Data summary
Name df
Number of rows 8523
Number of columns 12
_______________________
Column type frequency:
character 7
numeric 5
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
Item_Identifier 0 1.00 5 5 0 1559 0
Item_Fat_Content 0 1.00 2 7 0 5 0
Item_Type 0 1.00 4 21 0 16 0
Outlet_Identifier 0 1.00 6 6 0 10 0
Outlet_Size 2410 0.72 4 6 0 3 0
Outlet_Location_Type 0 1.00 6 6 0 3 0
Outlet_Type 0 1.00 13 17 0 4 0

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
Item_Weight 1463 0.83 12.86 4.64 4.56 8.77 12.60 16.85 21.35 ▇▇▇▇▇
Item_Visibility 0 1.00 0.07 0.05 0.00 0.03 0.05 0.09 0.33 ▇▅▂▁▁
Item_MRP 0 1.00 140.99 62.28 31.29 93.83 143.01 185.64 266.89 ▅▇▆▆▃
Outlet_Establishment_Year 0 1.00 1997.83 8.37 1985.00 1987.00 1999.00 2004.00 2009.00 ▇▁▇▆▆
Item_Outlet_Sales 0 1.00 2181.29 1706.50 33.29 834.25 1794.33 3101.30 13086.96 ▇▃▁▁▁

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.

ITEM 3:

descr(df)
Non-numerical variable(s) ignored: Item_Identifier, Item_Fat_Content, Item_Type, Outlet_Identifier, Outlet_Size, Outlet_Location_Type, Outlet_Type
Descriptive Statistics  
df  
N: 8523  

                    Item_MRP   Item_Outlet_Sales   Item_Visibility   Item_Weight
----------------- ---------- ------------------- ----------------- -------------
             Mean     140.99             2181.29              0.07         12.86
          Std.Dev      62.28             1706.50              0.05          4.64
              Min      31.29               33.29              0.00          4.56
               Q1      93.81              833.58              0.03          8.77
           Median     143.01             1794.33              0.05         12.60
               Q3     185.66             3101.30              0.09         16.85
              Max     266.89            13086.96              0.33         21.35
              MAD      68.26             1604.06              0.05          6.08
              IQR      91.82             2267.05              0.07          8.08
               CV       0.44                0.78              0.78          0.36
         Skewness       0.13                1.18              1.17          0.08
      SE.Skewness       0.03                0.03              0.03          0.03
         Kurtosis      -0.89                1.61              1.68         -1.23
          N.Valid    8523.00             8523.00           8523.00       7060.00
                N    8523.00             8523.00           8523.00       8523.00
        Pct.Valid     100.00              100.00            100.00         82.83

Table: Table continues below

 

                    Outlet_Establishment_Year
----------------- ---------------------------
             Mean                     1997.83
          Std.Dev                        8.37
              Min                     1985.00
               Q1                     1987.00
           Median                     1999.00
               Q3                     2004.00
              Max                     2009.00
              MAD                        7.41
              IQR                       17.00
               CV                        0.00
         Skewness                       -0.40
      SE.Skewness                        0.03
         Kurtosis                       -1.21
          N.Valid                     8523.00
                N                     8523.00
        Pct.Valid                      100.00

As seguintes variáveis foram convertidas em factor devido a dois critérios:

  1. 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.

  2. 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 Item
df |>
  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 poluir
  facet_wrap(~Item_Type, scales = "free_y") +     # cria um gráfico por tipo
  labs(
    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 caber
    legend.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éricas
  select(where(is.numeric)) |> 
  # 2. Remove os NAs temporariamente para o gráfico não travar
  na.omit() |> 
  # 3. Gera a Matriz
  ggpairs(
    title = "Matriz de Espalhamento das Variáveis Numéricas",
    upper = list(continuous = wrap("cor", size = 3, color = "darkblue")), # Coeficiente de Pearson em cima
    lower = list(continuous = wrap("smooth_loess", color = "tomato")),    # Gráfico com linha de tendência embaixo
    diag = 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 Labels
  labs(
    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 Labels
  labs(
    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 Labels
  labs(
    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 Labels
  labs(
    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éricas
num_vars <- names(df)[sapply(df, is.numeric)]

# 2. O Loop que percorre cada variável
for (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éricas
num_vars <- names(df)[sapply(df, is.numeric)]

# 2. Criar uma lista para guardar os resultados
shapiro_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 produto
conflito_ids <- df |>
  group_by(Item_Identifier) |>
  summarise(n_tipos = n_distinct(Item_Type))|>
  filter(n_tipos > 1)

# Se o resultado for 0 linhas, ok
print(conflito_ids)
# A tibble: 0 × 2
# ℹ 2 variables: Item_Identifier <fct>, n_tipos <int>
# Ver as categorias 
levels(df$Item_Fat_Content)
[1] "LF"      "low fat" "Low Fat" "reg"     "Regular"
levels(df$Item_Type)
 [1] "Baking Goods"          "Breads"                "Breakfast"            
 [4] "Canned"                "Dairy"                 "Frozen Foods"         
 [7] "Fruits and Vegetables" "Hard Drinks"           "Health and Hygiene"   
[10] "Household"             "Meat"                  "Others"               
[13] "Seafood"               "Snack Foods"           "Soft Drinks"          
[16] "Starchy Foods"        
levels(df$Outlet_Type)
[1] "Grocery Store"     "Supermarket Type1" "Supermarket Type2"
[4] "Supermarket Type3"
levels(df$Outlet_Location_Type)
[1] "Tier 1" "Tier 2" "Tier 3"
# 2. Corrigindo nomes em duplicidade
df <- df |>
  mutate(
    # Unificando o Fat Content usando o nome exato da coluna
    Item_Fat_Content = case_when(
      Item_Fat_Content %in% c("LF", "low fat", "low_fat") ~ "Low Fat",
      Item_Fat_Content %in% c("reg", "Regular")          ~ "Regular",
      TRUE ~ Item_Fat_Content
    )
  ) 

# 3. Relatório de Completude 
tabela_completude <- df |>
  summarise(across(everything(), ~ mean(!is.na(.)) * 100)) |>
  pivot_longer(everything(), names_to = "variavel", values_to = "pct_completude") |>
  mutate(
    pct_na = 100 - pct_completude,
    status = if_else(pct_completude == 100, "✅ Completo", "⚠️ NAs Detectados")
  ) |>
  arrange(pct_na) 

kable(tabela_completude)
variavel pct_completude pct_na status
Item_Identifier 100.00000 0.00000 ✅ Completo
Item_Fat_Content 100.00000 0.00000 ✅ Completo
Item_Visibility 100.00000 0.00000 ✅ Completo
Item_Type 100.00000 0.00000 ✅ Completo
Item_MRP 100.00000 0.00000 ✅ Completo
Outlet_Identifier 100.00000 0.00000 ✅ Completo
Outlet_Establishment_Year 100.00000 0.00000 ✅ Completo
Outlet_Location_Type 100.00000 0.00000 ✅ Completo
Outlet_Type 100.00000 0.00000 ✅ Completo
Item_Outlet_Sales 100.00000 0.00000 ✅ Completo
Item_Weight 82.83468 17.16532 ⚠️ NAs Detectados
Outlet_Size 71.72357 28.27643 ⚠️ NAs Detectados

glimpse(df)
Rows: 8,523
Columns: 12
$ Item_Identifier           <fct> FDA15, DRC01, FDN15, FDX07, NCD19, FDP36, FD…
$ Item_Weight               <dbl> 9.300, 5.920, 17.500, 19.200, 8.930, 10.395,…
$ Item_Fat_Content          <chr> "Low Fat", "Regular", "Low Fat", "Regular", …
$ Item_Visibility           <dbl> 0.016047301, 0.019278216, 0.016760075, 0.000…
$ Item_Type                 <fct> Dairy, Soft Drinks, Meat, Fruits and Vegetab…
$ Item_MRP                  <dbl> 249.8092, 48.2692, 141.6180, 182.0950, 53.86…
$ Outlet_Identifier         <fct> OUT049, OUT018, OUT049, OUT010, OUT013, OUT0…
$ Outlet_Establishment_Year <fct> 1999, 2009, 1999, 1998, 1987, 2009, 1987, 19…
$ Outlet_Size               <fct> Medium, Medium, Medium, NA, High, Medium, Hi…
$ Outlet_Location_Type      <fct> Tier 1, Tier 3, Tier 1, Tier 3, Tier 3, Tier…
$ Outlet_Type               <fct> Supermarket Type1, Supermarket Type2, Superm…
$ Item_Outlet_Sales         <dbl> 3735.1380, 443.4228, 2097.2700, 732.3800, 99…

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ção

df_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)

 iter imp variable
  1   1  Item_Weight*  Outlet_Size*
  1   2  Item_Weight*  Outlet_Size*
  2   1  Item_Weight*  Outlet_Size*
  2   2  Item_Weight*  Outlet_Size*
  3   1  Item_Weight*  Outlet_Size*
  3   2  Item_Weight*  Outlet_Size*
  4   1  Item_Weight*  Outlet_Size*
  4   2  Item_Weight*  Outlet_Size*
  5   1  Item_Weight*  Outlet_Size*
  5   2  Item_Weight*  Outlet_Size*
Warning: Number of logged events: 41
# 3. Completar o dataset
df_imputado <- complete(mice_mod, 1)

# 4. Trazer o ID de volta do dataset original
df_final <- cbind(df[, c("Item_Identifier", "Outlet_Identifier")], df_imputado)

# 5. Verificar o sucesso
sum(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
tabela_completude_mice <- df_final |>
  summarise(across(everything(), ~ mean(!is.na(.)) * 100)) |>
  pivot_longer(everything(), names_to = "variavel", values_to = "pct_completude") |>
  mutate(
    pct_na = 100 - pct_completude,
    status = if_else(pct_completude == 100, "✅ Completo", "⚠️ NAs Detectados")
  ) |>
  arrange(pct_na) 

kable(tabela_completude_mice)
variavel pct_completude pct_na status
Item_Identifier 100 0 ✅ Completo
Outlet_Identifier 100 0 ✅ Completo
Item_Weight 100 0 ✅ Completo
Item_Fat_Content 100 0 ✅ Completo
Item_Visibility 100 0 ✅ Completo
Item_Type 100 0 ✅ Completo
Item_MRP 100 0 ✅ Completo
Outlet_Establishment_Year 100 0 ✅ Completo
Outlet_Size 100 0 ✅ Completo
Outlet_Location_Type 100 0 ✅ Completo
Outlet_Type 100 0 ✅ Completo
Item_Outlet_Sales 100 0 ✅ Completo
saveRDS(df_final, "df_final.rds")

Análise Big Mart Sales Shiny: https://gabrielguidi.shinyapps.io/Big_Mart/