Importar base de Datos

#file.choose()

stores <- read.csv("/Users/ricardogc/Desktop/Actividad 3.2/stores.csv")
features <- read.csv("/Users/ricardogc/Desktop/Actividad 3.2/features.csv")
train <- read.csv("/Users/ricardogc/Desktop/Actividad 3.2/train.csv")
test <- read.csv("/Users/ricardogc/Desktop/Actividad 3.2/test.csv")

Instalar paquete y llamar librería

#install.packages("dplyr")
library(dplyr)
## Warning: package 'dplyr' was built under R version 3.4.4
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union

Entender la base de Datos

summary(stores)
##      Store    Type        Size       
##  Min.   : 1   A:22   Min.   : 34875  
##  1st Qu.:12   B:17   1st Qu.: 70713  
##  Median :23   C: 6   Median :126512  
##  Mean   :23          Mean   :130288  
##  3rd Qu.:34          3rd Qu.:202307  
##  Max.   :45          Max.   :219622
count(stores,Type, sort = TRUE)
## # A tibble: 3 × 2
##   Type      n
##   <fct> <int>
## 1 A        22
## 2 B        17
## 3 C         6
str(stores)
## 'data.frame':    45 obs. of  3 variables:
##  $ Store: int  1 2 3 4 5 6 7 8 9 10 ...
##  $ Type : Factor w/ 3 levels "A","B","C": 1 1 2 1 2 1 2 1 2 2 ...
##  $ Size : int  151315 202307 37392 205863 34875 202505 70713 155078 125833 126512 ...
summary(features)
##      Store            Date       Temperature       Fuel_Price   
##  Min.   : 1   01/02/2013:  45   Min.   : -7.29   Min.   :2.472  
##  1st Qu.:12   01/03/2013:  45   1st Qu.: 45.90   1st Qu.:3.041  
##  Median :23   01/04/2011:  45   Median : 60.71   Median :3.513  
##  Mean   :23   01/06/2012:  45   Mean   : 59.36   Mean   :3.406  
##  3rd Qu.:34   01/07/2011:  45   3rd Qu.: 73.88   3rd Qu.:3.743  
##  Max.   :45   01/10/2010:  45   Max.   :101.95   Max.   :4.468  
##               (Other)   :7920                                   
##    MarkDown1        MarkDown2           MarkDown3           MarkDown4       
##  Min.   : -2781   Min.   :  -265.76   Min.   :  -179.26   Min.   :    0.22  
##  1st Qu.:  1578   1st Qu.:    68.88   1st Qu.:     6.60   1st Qu.:  304.69  
##  Median :  4744   Median :   364.57   Median :    36.26   Median : 1176.42  
##  Mean   :  7032   Mean   :  3384.18   Mean   :  1760.10   Mean   : 3292.94  
##  3rd Qu.:  8923   3rd Qu.:  2153.35   3rd Qu.:   163.15   3rd Qu.: 3310.01  
##  Max.   :103185   Max.   :104519.54   Max.   :149483.31   Max.   :67474.85  
##  NA's   :4158     NA's   :5269        NA's   :4577        NA's   :4726      
##    MarkDown5             CPI         Unemployment    IsHoliday      
##  Min.   :  -185.2   Min.   :126.1   Min.   : 3.684   Mode :logical  
##  1st Qu.:  1440.8   1st Qu.:132.4   1st Qu.: 6.634   FALSE:7605     
##  Median :  2727.1   Median :182.8   Median : 7.806   TRUE :585      
##  Mean   :  4132.2   Mean   :172.5   Mean   : 7.827                  
##  3rd Qu.:  4832.6   3rd Qu.:213.9   3rd Qu.: 8.567                  
##  Max.   :771448.1   Max.   :229.0   Max.   :14.313                  
##  NA's   :4140       NA's   :585     NA's   :585
str(features)
## 'data.frame':    8190 obs. of  12 variables:
##  $ Store       : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ Date        : Factor w/ 182 levels "01/02/2013","01/03/2013",..: 25 67 109 151 26 68 110 152 8 50 ...
##  $ Temperature : num  42.3 38.5 39.9 46.6 46.5 ...
##  $ Fuel_Price  : num  2.57 2.55 2.51 2.56 2.62 ...
##  $ MarkDown1   : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ MarkDown2   : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ MarkDown3   : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ MarkDown4   : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ MarkDown5   : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ CPI         : num  211 211 211 211 211 ...
##  $ Unemployment: num  8.11 8.11 8.11 8.11 8.11 ...
##  $ IsHoliday   : logi  FALSE TRUE FALSE FALSE FALSE FALSE ...

Observaciones

1. “Features”, “Test” y “Train” tienen la fecha como caracter
2. “Features”, hay NA´s en más de la mitad de los registros de Markdown (Del 1 al 5)
3. En “Features” hay 585 NA en CPI y Unemployed y hay 585 registros de isholiday = TRUE ¿Tiene relación? R: Sin relación.
4. Train tiene ventas semanales negativas.

Herramienta “El Generador de valor de Datos”

Paso 1. Definir el area del negocio que buscamos impactar o mejorar (Departamento) y el KPI.

El departamento de Mercadotecnia de EUA (Con muestra de 45 tiendas) en el indicador de ventas semanales.

Paso 2. Seleccionar la plantilla para crear valor a partir de los datos de los clientes.

Visión | Segmentación | Personalización | Contextualización

Paso 3. Generar ideas y conceptos especificos.

Elaborar un modelo predictivo de ventas semanales.

Paso 4. Reunir los datos requeridos

Elaborar una base de datos con la variable dependientes (Ventas semanales) y las variables independientes (TBD)

Paso 5 Plan de ejecución.

Mercadotecnía elaborará plan para desplegar modelo predictivo en fases:

Fase 1. Piloto (San Antonio, Tx)
Fase 2. Texas
Fase 3. EUA

Sistemas asegurará la captura del Markdown en la base de datos.

Creación de la base de datos consolidada

Agregar “STORES” a “Train”

bd <- merge(train, stores, by = "Store")

Agregar “Features” a “bd”

bd1 <- bd
bd1 <- merge(bd1, features)

Eliminar Columnas

bd2 <- bd1
str(bd2)
## 'data.frame':    421570 obs. of  16 variables:
##  $ Store       : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ Date        : Factor w/ 143 levels "01/04/2011","01/06/2012",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ IsHoliday   : logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
##  $ Dept        : int  49 26 81 34 59 30 7 85 8 28 ...
##  $ Weekly_Sales: num  13168 5947 28545 9950 317 ...
##  $ Type        : Factor w/ 3 levels "A","B","C": 1 1 1 1 1 1 1 1 1 1 ...
##  $ Size        : int  151315 151315 151315 151315 151315 151315 151315 151315 151315 151315 ...
##  $ Temperature : num  59.2 59.2 59.2 59.2 59.2 ...
##  $ Fuel_Price  : num  3.52 3.52 3.52 3.52 3.52 ...
##  $ MarkDown1   : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ MarkDown2   : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ MarkDown3   : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ MarkDown4   : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ MarkDown5   : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ CPI         : num  215 215 215 215 215 ...
##  $ Unemployment: num  7.68 7.68 7.68 7.68 7.68 ...
bd2 <- subset(bd2, select = -c (MarkDown1,MarkDown2, MarkDown3, MarkDown4, MarkDown5 ))
summary(bd2)
##      Store              Date        IsHoliday            Dept      
##  Min.   : 1.0   23/12/2011:  3027   Mode :logical   Min.   : 1.00  
##  1st Qu.:11.0   25/11/2011:  3021   FALSE:391909    1st Qu.:18.00  
##  Median :22.0   16/12/2011:  3013   TRUE :29661     Median :37.00  
##  Mean   :22.2   09/12/2011:  3010                   Mean   :44.26  
##  3rd Qu.:33.0   17/02/2012:  3007                   3rd Qu.:74.00  
##  Max.   :45.0   30/12/2011:  3003                   Max.   :99.00  
##                 (Other)   :403489                                  
##   Weekly_Sales    Type            Size         Temperature       Fuel_Price   
##  Min.   : -4989   A:215478   Min.   : 34875   Min.   : -2.06   Min.   :2.472  
##  1st Qu.:  2080   B:163495   1st Qu.: 93638   1st Qu.: 46.68   1st Qu.:2.933  
##  Median :  7612   C: 42597   Median :140167   Median : 62.09   Median :3.452  
##  Mean   : 15981              Mean   :136728   Mean   : 60.09   Mean   :3.361  
##  3rd Qu.: 20206              3rd Qu.:202505   3rd Qu.: 74.28   3rd Qu.:3.738  
##  Max.   :693099              Max.   :219622   Max.   :100.14   Max.   :4.468  
##                                                                               
##       CPI         Unemployment   
##  Min.   :126.1   Min.   : 3.879  
##  1st Qu.:132.0   1st Qu.: 6.891  
##  Median :182.3   Median : 7.866  
##  Mean   :171.2   Mean   : 7.960  
##  3rd Qu.:212.4   3rd Qu.: 8.572  
##  Max.   :227.2   Max.   :14.313  
## 

Cambiar formato de fecha

bd2$Date <- as.Date(bd2$Date, format= "%d/%m/%y")
str(bd2)
## 'data.frame':    421570 obs. of  11 variables:
##  $ Store       : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ Date        : Date, format: "2020-04-01" "2020-04-01" ...
##  $ IsHoliday   : logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
##  $ Dept        : int  49 26 81 34 59 30 7 85 8 28 ...
##  $ Weekly_Sales: num  13168 5947 28545 9950 317 ...
##  $ Type        : Factor w/ 3 levels "A","B","C": 1 1 1 1 1 1 1 1 1 1 ...
##  $ Size        : int  151315 151315 151315 151315 151315 151315 151315 151315 151315 151315 ...
##  $ Temperature : num  59.2 59.2 59.2 59.2 59.2 ...
##  $ Fuel_Price  : num  3.52 3.52 3.52 3.52 3.52 ...
##  $ CPI         : num  215 215 215 215 215 ...
##  $ Unemployment: num  7.68 7.68 7.68 7.68 7.68 ...
#install.packages("wordspace")
#library(wordspace)

#signcount(bd2$Weekly_Sales)

Eliminar valores negativos

bd3 <- bd2
bd3 <- bd3[bd3$Weekly_Sales > 0,]
summary (bd3)
##      Store           Date            IsHoliday            Dept      
##  Min.   : 1.0   Min.   :2020-01-06   Mode :logical   Min.   : 1.00  
##  1st Qu.:11.0   1st Qu.:2020-04-06   FALSE:390652    1st Qu.:18.00  
##  Median :22.0   Median :2020-06-29   TRUE :29560     Median :37.00  
##  Mean   :22.2   Mean   :2020-06-29                   Mean   :44.24  
##  3rd Qu.:33.0   3rd Qu.:2020-09-21                   3rd Qu.:74.00  
##  Max.   :45.0   Max.   :2020-12-31                   Max.   :99.00  
##   Weekly_Sales    Type            Size         Temperature       Fuel_Price   
##  Min.   :     0   A:214961   Min.   : 34875   Min.   : -2.06   Min.   :2.472  
##  1st Qu.:  2120   B:162787   1st Qu.: 93638   1st Qu.: 46.68   1st Qu.:2.933  
##  Median :  7662   C: 42464   Median :140167   Median : 62.09   Median :3.452  
##  Mean   : 16033              Mean   :136750   Mean   : 60.09   Mean   :3.361  
##  3rd Qu.: 20271              3rd Qu.:202505   3rd Qu.: 74.28   3rd Qu.:3.738  
##  Max.   :693099              Max.   :219622   Max.   :100.14   Max.   :4.468  
##       CPI         Unemployment   
##  Min.   :126.1   Min.   : 3.879  
##  1st Qu.:132.0   1st Qu.: 6.891  
##  Median :182.4   Median : 7.866  
##  Mean   :171.2   Mean   : 7.960  
##  3rd Qu.:212.4   3rd Qu.: 8.567  
##  Max.   :227.2   Max.   :14.313

Agregar Numero de la semana

bd4 <- bd3
bd4$week_number <- strftime(bd4$Date, format = "%V")
str(bd4)
## 'data.frame':    420212 obs. of  12 variables:
##  $ Store       : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ Date        : Date, format: "2020-04-01" "2020-04-01" ...
##  $ IsHoliday   : logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
##  $ Dept        : int  49 26 81 34 59 30 7 85 8 28 ...
##  $ Weekly_Sales: num  13168 5947 28545 9950 317 ...
##  $ Type        : Factor w/ 3 levels "A","B","C": 1 1 1 1 1 1 1 1 1 1 ...
##  $ Size        : int  151315 151315 151315 151315 151315 151315 151315 151315 151315 151315 ...
##  $ Temperature : num  59.2 59.2 59.2 59.2 59.2 ...
##  $ Fuel_Price  : num  3.52 3.52 3.52 3.52 3.52 ...
##  $ CPI         : num  215 215 215 215 215 ...
##  $ Unemployment: num  7.68 7.68 7.68 7.68 7.68 ...
##  $ week_number : chr  "14" "14" "14" "14" ...
bd4$week_number <- as.integer(bd4$week_number)
str(bd4)
## 'data.frame':    420212 obs. of  12 variables:
##  $ Store       : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ Date        : Date, format: "2020-04-01" "2020-04-01" ...
##  $ IsHoliday   : logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
##  $ Dept        : int  49 26 81 34 59 30 7 85 8 28 ...
##  $ Weekly_Sales: num  13168 5947 28545 9950 317 ...
##  $ Type        : Factor w/ 3 levels "A","B","C": 1 1 1 1 1 1 1 1 1 1 ...
##  $ Size        : int  151315 151315 151315 151315 151315 151315 151315 151315 151315 151315 ...
##  $ Temperature : num  59.2 59.2 59.2 59.2 59.2 ...
##  $ Fuel_Price  : num  3.52 3.52 3.52 3.52 3.52 ...
##  $ CPI         : num  215 215 215 215 215 ...
##  $ Unemployment: num  7.68 7.68 7.68 7.68 7.68 ...
##  $ week_number : int  14 14 14 14 14 14 14 14 14 14 ...
summary(bd4)
##      Store           Date            IsHoliday            Dept      
##  Min.   : 1.0   Min.   :2020-01-06   Mode :logical   Min.   : 1.00  
##  1st Qu.:11.0   1st Qu.:2020-04-06   FALSE:390652    1st Qu.:18.00  
##  Median :22.0   Median :2020-06-29   TRUE :29560     Median :37.00  
##  Mean   :22.2   Mean   :2020-06-29                   Mean   :44.24  
##  3rd Qu.:33.0   3rd Qu.:2020-09-21                   3rd Qu.:74.00  
##  Max.   :45.0   Max.   :2020-12-31                   Max.   :99.00  
##   Weekly_Sales    Type            Size         Temperature       Fuel_Price   
##  Min.   :     0   A:214961   Min.   : 34875   Min.   : -2.06   Min.   :2.472  
##  1st Qu.:  2120   B:162787   1st Qu.: 93638   1st Qu.: 46.68   1st Qu.:2.933  
##  Median :  7662   C: 42464   Median :140167   Median : 62.09   Median :3.452  
##  Mean   : 16033              Mean   :136750   Mean   : 60.09   Mean   :3.361  
##  3rd Qu.: 20271              3rd Qu.:202505   3rd Qu.: 74.28   3rd Qu.:3.738  
##  Max.   :693099              Max.   :219622   Max.   :100.14   Max.   :4.468  
##       CPI         Unemployment     week_number   
##  Min.   :126.1   Min.   : 3.879   Min.   : 2.00  
##  1st Qu.:132.0   1st Qu.: 6.891   1st Qu.:15.00  
##  Median :182.4   Median : 7.866   Median :27.00  
##  Mean   :171.2   Mean   : 7.960   Mean   :26.83  
##  3rd Qu.:212.4   3rd Qu.: 8.567   3rd Qu.:39.00  
##  Max.   :227.2   Max.   :14.313   Max.   :53.00

Separar Año, Mes y Día

bd5 <- bd4
bd5 <- bd5 %>%
  dplyr::mutate(year= lubridate::year(Date), month = lubridate::month(Date), day = lubridate:: day(Date))

Generar Regresión

regresion <- lm(Weekly_Sales ~ Store+Dept+IsHoliday+Type+Size+Fuel_Price+CPI+Unemployment+week_number+year+month+day, data = bd5)
summary(regresion)
## 
## Call:
## lm(formula = Weekly_Sales ~ Store + Dept + IsHoliday + Type + 
##     Size + Fuel_Price + CPI + Unemployment + week_number + year + 
##     month + day, data = bd5)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -34254 -12899  -5855   5622 671648 
## 
## Coefficients: (1 not defined because of singularities)
##                 Estimate Std. Error t value Pr(>|t|)    
## (Intercept)    2.468e+03  1.059e+03   2.331  0.01974 *  
## Store         -1.433e+02  3.058e+00 -46.838  < 2e-16 ***
## Dept           1.108e+02  1.097e+00 101.001  < 2e-16 ***
## IsHolidayTRUE  9.247e+02  1.350e+02   6.848 7.48e-12 ***
## TypeB         -3.187e+02  1.070e+02  -2.980  0.00289 ** 
## TypeC          5.849e+03  1.838e+02  31.813  < 2e-16 ***
## Size           9.920e-02  9.555e-04 103.814  < 2e-16 ***
## Fuel_Price     8.705e+01  9.166e+01   0.950  0.34224    
## CPI           -2.396e+01  9.451e-01 -25.349  < 2e-16 ***
## Unemployment  -2.317e+02  1.973e+01 -11.747  < 2e-16 ***
## week_number   -7.156e+02  2.335e+02  -3.065  0.00218 ** 
## year                  NA         NA      NA       NA    
## month          3.299e+03  1.013e+03   3.255  0.00113 ** 
## day            8.427e+01  3.349e+01   2.517  0.01185 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 21690 on 420199 degrees of freedom
## Multiple R-squared:  0.08979,    Adjusted R-squared:  0.08976 
## F-statistic:  3454 on 12 and 420199 DF,  p-value: < 2.2e-16

Construir modelo de predicción

datos_nuevos <- data.frame(Store=1, IsHoliday= TRUE, Dept=1, Type="A", Size= 151315, week_number =1, Temperature = 59.17, Fuel_Price = 3.524, CPI= 214.8372, Unemployment = 7.682, year =2012, month = 1, day=1)
predict(regresion,datos_nuevos)
## Warning in predict.lm(regresion, datos_nuevos): prediction from a rank-deficient
## fit may be misleading
##     1 
## 14417

Conclusión

Analizamos una base de datos proporcionada por WALMART, en la cual nos venían 4 archivos diferentes, los cuales tuvimos que unir para poder analizar completamente todas las variables y los datos. Por lo tanto, el primer paso que hicimos fue unir la base de datos, para esto era necesario identificar las primeras dos bases que uniríamos. Para unirlos necesitamos una key word que serviría para evitar que se dupliquen los datos y simplemente que las columnas faltantes se peguen a la base de datos. Y el objetivo de este análisis es el realizar un modelo predicción para ver cuántas ventas se van a tener por semana en Walmart, esto nos puede ayudar a enfocarnos en distintos departamentos como lo es en mercadotecnia, ventas y en los diferentes áreas de la tienda. También es importante seleccionar la plantilla para crear valor a partir de los datos de los clientes en este caso utilizamos visión, pero también existe segmentación, personalización y contextualización. Realizamos los siguientes pasos para poder obtener esta predicción:

  • Juntar Bases de Datos.

  • Eliminar los NA’s que se encontraban en los Markdown.

  • Realizamos una regresión con el propósito de obtener la relación entre las variables.

  • Realizar modelo de Predicción.

Toma en cuenta que para realizar este proceso es muy delicado, descarga los paquetes correspondientes para llamar a las librerías, algunos paquetes no se pueden instalar debido a la versión, por lo que la librería como Wordspace no correrá por la falta de actualización de R. Por ultimo, es muy importante realizar un plan de ejecución con diferentes fases, partiendo de la primera con un piloto para poder hacer pruebas, en este tomamos Texas como piloto, esto ayuda a poder hacer varias pruebas en un segmento más especifico y Texas es donde hay más Walmart en EUA, y al tener éxito en este piloto podremos pasar con las siguientes fases y expandir el rango al que se esta enfocando la predicción.