En 1962, Sam Walton abrió su primera tienda Walmart en Rogers, Arkanasas. Introdujo una fórmula exitosa para el comercio minorista que impactaría la vida de millones de personas en el mundo.

Paso previo

Instalar paquetes e importar CSV

#file.choose()

setwd("~/Desktop/wal")

features<-read.csv("/Users/elenavela/Desktop/wal/features (3).csv")
stores<-read.csv("/Users/elenavela/Desktop/wal/stores (3).csv")
train<-read.csv("/Users/elenavela/Desktop/wal/train (3).csv")
test<-read.csv("/Users/elenavela/Desktop/wal/test (3).csv")
#install.packages("dplyr")
library(dplyr)
## 
## 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

Primer paso

Entender la bases de datos

summary(stores)
##      Store        Type                Size       
##  Min.   : 1   Length:45          Min.   : 34875  
##  1st Qu.:12   Class :character   1st Qu.: 70713  
##  Median :23   Mode  :character   Median :126512  
##  Mean   :23                      Mean   :130288  
##  3rd Qu.:34                      3rd Qu.:202307  
##  Max.   :45                      Max.   :219622
count(stores, Type, sort=TRUE)
##   Type  n
## 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 : chr  "A" "A" "B" "A" ...
##  $ Size : int  151315 202307 37392 205863 34875 202505 70713 155078 125833 126512 ...
summary(features)
##      Store        Date            Temperature       Fuel_Price   
##  Min.   : 1   Length:8190        Min.   : -7.29   Min.   :2.472  
##  1st Qu.:12   Class :character   1st Qu.: 45.90   1st Qu.:3.041  
##  Median :23   Mode  :character   Median : 60.71   Median :3.513  
##  Mean   :23                      Mean   : 59.36   Mean   :3.406  
##  3rd Qu.:34                      3rd Qu.: 73.88   3rd Qu.:3.743  
##  Max.   :45                      Max.   :101.95   Max.   :4.468  
##                                                                  
##    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        : chr  "05/02/2010" "12/02/2010" "19/02/2010" "26/02/2010" ...
##  $ 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 ...

a. Observaciones

  1. “Features” tiene la fecha com caracter
  2. “Features” hay NA’s en mas de la mitad de los registro de markdown (del 1 al 5)
  3. En “features”, hay 585 NA’s en CPI y Unemployment, y hay 585 registros de IsHoliday= TRUE ?tiene relacion? R: sin relacion
  4. “Train” tiene ventas semanales negativas.

b. Herramienta “El generador de valor de datos”

Paso 1. Definir el área del negocio que buscamos impactar o mejorar y su KPI.
Paso 2. Seleccionar la plantilla (-s) para crear valor a partir de los datos de los clientes.
El departamento de mercadotecnia de EUA (con muestra de 45 tiendas) en el indicador de Ventas semanales. Sistemas asegurara la captura del markdown en las bases de datos.
Vision |Segmentacion | presonalizacion | contextualizacion
Paso 3. Generar ideas o conceptos especificos.
Elaborar un modelo predictivo de ventas semanales.
Paso 4. Reunir los datos requeridos.
Elaborar una base de datos con la variable dependiente (ventas semanales) y las variables independientes.
Paso 5. Plan de ejecucion.
Mercadotecnia elaborará plan para desplegar modelo predictivo en fases:
Fase 1. Piloto (San Antonio, TX).
Fase 2. Texas.
Fase 3. EUA.

Segundo paso

Creación de la base de datos consolidada

a. Agregar “stores” a “train”

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

b. Agregar “features” a “bd”

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

c. Eliminar columnas con NAs (Markdowns)

bd2<- bd1
str(bd2)
## 'data.frame':    421570 obs. of  16 variables:
##  $ Store       : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ Date        : chr  "01/04/2011" "01/04/2011" "01/04/2011" "01/04/2011" ...
##  $ 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        : chr  "A" "A" "A" "A" ...
##  $ 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   Length:421570      Mode :logical   Min.   : 1.00  
##  1st Qu.:11.0   Class :character   FALSE:391909    1st Qu.:18.00  
##  Median :22.0   Mode  :character   TRUE :29661     Median :37.00  
##  Mean   :22.2                                      Mean   :44.26  
##  3rd Qu.:33.0                                      3rd Qu.:74.00  
##  Max.   :45.0                                      Max.   :99.00  
##   Weekly_Sales        Type                Size         Temperature    
##  Min.   : -4989   Length:421570      Min.   : 34875   Min.   : -2.06  
##  1st Qu.:  2080   Class :character   1st Qu.: 93638   1st Qu.: 46.68  
##  Median :  7612   Mode  :character   Median :140167   Median : 62.09  
##  Mean   : 15981                      Mean   :136728   Mean   : 60.09  
##  3rd Qu.: 20206                      3rd Qu.:202505   3rd Qu.: 74.28  
##  Max.   :693099                      Max.   :219622   Max.   :100.14  
##    Fuel_Price         CPI         Unemployment   
##  Min.   :2.472   Min.   :126.1   Min.   : 3.879  
##  1st Qu.:2.933   1st Qu.:132.0   1st Qu.: 6.891  
##  Median :3.452   Median :182.3   Median : 7.866  
##  Mean   :3.361   Mean   :171.2   Mean   : 7.960  
##  3rd Qu.:3.738   3rd Qu.:212.4   3rd Qu.: 8.572  
##  Max.   :4.468   Max.   :227.2   Max.   :14.313

d. 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: "2011-04-01" "2011-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        : chr  "A" "A" "A" "A" ...
##  $ 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)
## Loading required package: Matrix
signcount(bd2$Weekly_Sales)
##    pos   zero    neg 
## 420212     73   1285

e. Eliminar ventas menores que 0

Esto se decidiód debido a que no eran muchas ventas negativas, por lo cual no tendría mucho impacto en los registos pero haría de la base de datos más limpia y profesional.

bd3 <- bd2
bd3 <- bd3[bd3$Weekly_Sales > 0,]
summary (bd3)
##      Store           Date            IsHoliday            Dept      
##  Min.   : 1.0   Min.   :2010-02-05   Mode :logical   Min.   : 1.00  
##  1st Qu.:11.0   1st Qu.:2010-10-08   FALSE:390652    1st Qu.:18.00  
##  Median :22.0   Median :2011-06-17   TRUE :29560     Median :37.00  
##  Mean   :22.2   Mean   :2011-06-18                   Mean   :44.24  
##  3rd Qu.:33.0   3rd Qu.:2012-02-24                   3rd Qu.:74.00  
##  Max.   :45.0   Max.   :2012-10-26                   Max.   :99.00  
##   Weekly_Sales        Type                Size         Temperature    
##  Min.   :     0   Length:420212      Min.   : 34875   Min.   : -2.06  
##  1st Qu.:  2120   Class :character   1st Qu.: 93638   1st Qu.: 46.68  
##  Median :  7662   Mode  :character   Median :140167   Median : 62.09  
##  Mean   : 16033                      Mean   :136750   Mean   : 60.09  
##  3rd Qu.: 20271                      3rd Qu.:202505   3rd Qu.: 74.28  
##  Max.   :693099                      Max.   :219622   Max.   :100.14  
##    Fuel_Price         CPI         Unemployment   
##  Min.   :2.472   Min.   :126.1   Min.   : 3.879  
##  1st Qu.:2.933   1st Qu.:132.0   1st Qu.: 6.891  
##  Median :3.452   Median :182.4   Median : 7.866  
##  Mean   :3.361   Mean   :171.2   Mean   : 7.960  
##  3rd Qu.:3.738   3rd Qu.:212.4   3rd Qu.: 8.567  
##  Max.   :4.468   Max.   :227.2   Max.   :14.313

f. Agregar número 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: "2011-04-01" "2011-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        : chr  "A" "A" "A" "A" ...
##  $ 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  "13" "13" "13" "13" ...
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: "2011-04-01" "2011-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        : chr  "A" "A" "A" "A" ...
##  $ 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  13 13 13 13 13 13 13 13 13 13 ...
summary(bd4)
##      Store           Date            IsHoliday            Dept      
##  Min.   : 1.0   Min.   :2010-02-05   Mode :logical   Min.   : 1.00  
##  1st Qu.:11.0   1st Qu.:2010-10-08   FALSE:390652    1st Qu.:18.00  
##  Median :22.0   Median :2011-06-17   TRUE :29560     Median :37.00  
##  Mean   :22.2   Mean   :2011-06-18                   Mean   :44.24  
##  3rd Qu.:33.0   3rd Qu.:2012-02-24                   3rd Qu.:74.00  
##  Max.   :45.0   Max.   :2012-10-26                   Max.   :99.00  
##   Weekly_Sales        Type                Size         Temperature    
##  Min.   :     0   Length:420212      Min.   : 34875   Min.   : -2.06  
##  1st Qu.:  2120   Class :character   1st Qu.: 93638   1st Qu.: 46.68  
##  Median :  7662   Mode  :character   Median :140167   Median : 62.09  
##  Mean   : 16033                      Mean   :136750   Mean   : 60.09  
##  3rd Qu.: 20271                      3rd Qu.:202505   3rd Qu.: 74.28  
##  Max.   :693099                      Max.   :219622   Max.   :100.14  
##    Fuel_Price         CPI         Unemployment     week_number   
##  Min.   :2.472   Min.   :126.1   Min.   : 3.879   Min.   : 1.00  
##  1st Qu.:2.933   1st Qu.:132.0   1st Qu.: 6.891   1st Qu.:14.00  
##  Median :3.452   Median :182.4   Median : 7.866   Median :26.00  
##  Mean   :3.361   Mean   :171.2   Mean   : 7.960   Mean   :25.83  
##  3rd Qu.:3.738   3rd Qu.:212.4   3rd Qu.: 8.567   3rd Qu.:38.00  
##  Max.   :4.468   Max.   :227.2   Max.   :14.313   Max.   :52.00

g. Separar año, mes y dia

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

summary(bd5)
##      Store           Date            IsHoliday            Dept      
##  Min.   : 1.0   Min.   :2010-02-05   Mode :logical   Min.   : 1.00  
##  1st Qu.:11.0   1st Qu.:2010-10-08   FALSE:390652    1st Qu.:18.00  
##  Median :22.0   Median :2011-06-17   TRUE :29560     Median :37.00  
##  Mean   :22.2   Mean   :2011-06-18                   Mean   :44.24  
##  3rd Qu.:33.0   3rd Qu.:2012-02-24                   3rd Qu.:74.00  
##  Max.   :45.0   Max.   :2012-10-26                   Max.   :99.00  
##   Weekly_Sales        Type                Size         Temperature    
##  Min.   :     0   Length:420212      Min.   : 34875   Min.   : -2.06  
##  1st Qu.:  2120   Class :character   1st Qu.: 93638   1st Qu.: 46.68  
##  Median :  7662   Mode  :character   Median :140167   Median : 62.09  
##  Mean   : 16033                      Mean   :136750   Mean   : 60.09  
##  3rd Qu.: 20271                      3rd Qu.:202505   3rd Qu.: 74.28  
##  Max.   :693099                      Max.   :219622   Max.   :100.14  
##    Fuel_Price         CPI         Unemployment     week_number   
##  Min.   :2.472   Min.   :126.1   Min.   : 3.879   Min.   : 1.00  
##  1st Qu.:2.933   1st Qu.:132.0   1st Qu.: 6.891   1st Qu.:14.00  
##  Median :3.452   Median :182.4   Median : 7.866   Median :26.00  
##  Mean   :3.361   Mean   :171.2   Mean   : 7.960   Mean   :25.83  
##  3rd Qu.:3.738   3rd Qu.:212.4   3rd Qu.: 8.567   3rd Qu.:38.00  
##  Max.   :4.468   Max.   :227.2   Max.   :14.313   Max.   :52.00  
##       year          month            day       
##  Min.   :2010   Min.   : 1.00   Min.   : 1.00  
##  1st Qu.:2010   1st Qu.: 4.00   1st Qu.: 8.00  
##  Median :2011   Median : 6.00   Median :16.00  
##  Mean   :2011   Mean   : 6.45   Mean   :15.67  
##  3rd Qu.:2012   3rd Qu.: 9.00   3rd Qu.:23.00  
##  Max.   :2012   Max.   :12.00   Max.   :31.00

Tercer paso

Generar regresion.

regresion <- lm (Weekly_Sales ~ Store + Dept + IsHoliday + Type + Size + Temperature + Fuel_Price + CPI + Unemployment + week_number + year + month + day, data=bd5)
summary (regresion)
## 
## Call:
## lm(formula = Weekly_Sales ~ Store + Dept + IsHoliday + Type + 
##     Size + Temperature + Fuel_Price + CPI + Unemployment + week_number + 
##     year + month + day, data = bd5)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -34331 -12895  -5852   5626 671540 
## 
## Coefficients:
##                 Estimate Std. Error t value Pr(>|t|)    
## (Intercept)    1.110e+06  2.999e+05   3.701 0.000214 ***
## Store         -1.426e+02  3.087e+00 -46.198  < 2e-16 ***
## Dept           1.108e+02  1.097e+00 101.013  < 2e-16 ***
## IsHolidayTRUE  8.511e+02  1.391e+02   6.119 9.45e-10 ***
## TypeB         -3.133e+02  1.078e+02  -2.908 0.003642 ** 
## TypeC          5.836e+03  1.840e+02  31.709  < 2e-16 ***
## Size           9.920e-02  9.584e-04 103.511  < 2e-16 ***
## Temperature    3.701e+00  2.133e+00   1.735 0.082688 .  
## Fuel_Price     4.791e+02  1.480e+02   3.237 0.001207 ** 
## CPI           -2.340e+01  9.996e-01 -23.409  < 2e-16 ***
## Unemployment  -2.538e+02  2.062e+01 -12.308  < 2e-16 ***
## week_number    7.678e+02  4.566e+02   1.682 0.092648 .  
## year          -5.485e+02  1.485e+02  -3.695 0.000220 ***
## month         -3.167e+03  1.988e+03  -1.594 0.111036    
## day           -1.281e+02  6.539e+01  -1.959 0.050115 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 21690 on 420197 degrees of freedom
## Multiple R-squared:  0.08982,    Adjusted R-squared:  0.08979 
## F-statistic:  2962 on 14 and 420197 DF,  p-value: < 2.2e-16

Cuarto paso

Construir un modelo de predicción.

En este caso, se tomaran en cuenta las mismas variables, excepto una, para hacer dos predicciones. La primera predicción toma en cuenta que los días son festivos (holiday), mientras lo que busca la segunda predicción es ver que pasaría si el contexto de las demás variables fuera igual, pero sin ser días festivos.

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:7)
predict(regresion,datos_nuevos)
##        1        2        3        4        5        6        7 
## 14667.94 14539.85 14411.76 14283.67 14155.58 14027.49 13899.40
festivos<-predict(regresion,datos_nuevos)
datos_nuevos2 <- data.frame(Store=1, IsHoliday= FALSE, 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:7)
predict(regresion,datos_nuevos2)
##        1        2        3        4        5        6        7 
## 13816.85 13688.76 13560.67 13432.58 13304.49 13176.40 13048.31
no_festivos<-predict(regresion,datos_nuevos2)

Quinto paso

Graficar.
Mediante esta regresión lineal a través de los días de la semana, se observa que ambos, ya sea en d ía festivo o no, va en descenso. No obstante, al comparar ambas, observamos que durante los días festivos las ventas son más altas.

primer <- plot(festivos, type = "l", xlab = "Dia de la semana",  ylab ="Ventas",  main="Predicción de Ventas")

segundo <- plot(no_festivos, type = "l", xlab = "Dia de la semana",  ylab ="Ventas",  main="Predicción de Ventas")

Igualmente, se agrega un gráfico de barras para comparar el volúmen de ventas de cuando es festivo o no.

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

datos_no_hol <- data.frame(Store=1, IsHoliday= FALSE, 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)

holiday <- predict(regresion,datos_hol)
no_hol <- predict(regresion,datos_no_hol)

barplot(c(holiday, no_hol), ylim = c(0,14000), ylab = "Ventas", main = "Predicción de Ventas", names.arg = c("Holiday", "No Holiday"))

tercer <- barplot(c(holiday, no_hol), ylim = c(0,14000), ylab = "Ventas", main = "Predicción de Ventas", names.arg = c("Holiday", "No Holiday"))

Conclusiones

Para el análisis inicial se contó con 4 diferentes bases de datos, sin embargo, para poder tener un análisis más adecuado resulta más interesante combinar estas mismas. Ciertas bases de datos cuentan con columnas iguales; R tiene la capacidad de detectar esto y juntarlas de manea adecuada.

No obstante, antes de juntar las bases, y después de entenderlas individualmente, es preciso completar y pensar en la Herramienta “El generador de valor de datos”. Aquí pudimos entender la necesidad que tiene y los pasos a seguir. Como fue definido anteriormente, las ventas son lo que más se necesitan en el momento, y mediante la visión y un modelo predictivo se puede llevar a cabo el plan de ejecución. Aquí mismo es posible ver qué es lo que se requiere cambiar.

Ahora, es posible comenzar a juntar las bases de datos con el fin de crear el modelo de predicción de ventas para Walmart. Al juntarse las bases de datos de stores, features, y train, notamos que existen varios NAs dentro de las columnas de MarkDown, por lo que se deciden eliminar estas columnas para no tener ningún NA. Siguientemente, se cambia el formato de fecha, se separan el día, mes y año y se eliminan las ventas negativas. De esta manera nuestra base de datos conjunta queda lo más limpia y lista posible para ver predicciones.

Se genera la regresión para ver la predicción de ventas semanales, y se construyen dos modelos de predicción. La variable que tienen de diferente es si el día cae en festivo o no.

En este código, pude aprender de primera mano y de manera individual como generar gráficas y como compararlas debidamente; asimismo, pude lograr hacer lo interactivo. Aunque este código fue un reto personal para mi, me siento muy satisfecha por lo aprendizajes obtenidos y lo que pude crecer.

Propuestas

  1. Debido a que Walmart demuestra tener un incremento en ventas durante los días festivos, lo que se propone es que aprovechen al máximo este suceso para potencializar las ventas. Como se estableció en la herramienta de “El generador de valor de datos”, se estará trabajando con el equipo de mercadotecnia; esto puede ser aprovechado para incrementar los descuentos en tienda durante los días festivos y por ende incrementar el flujo de personas y compras en estas fechas.
  2. Por otra parte, otra propuesta que se ha desarrollado es que Walmart cree sus propios “días festivos” en su localidad pilota (San Antonio, TX). De acuerdo a International Business Guide, EUA es el país más consumista del mundo, el mercado estadounidense representa al 29% del mercado global. Debido a esto, se puede llegar a la conclusión de que al darles a los estadounidenses más oportunidades o días especiales de consumir, ellos los podrían tomar. Algunos ejemplos de “días festivos” podrían ser: “Walmart day”, “First Day of School Day”, y “Remodel Your Home Day”.
  3. Finalmente, uno de los objetivos prinicpales de una tienda de venta minorista como Walmart es tener en circulación su inventario. Es decir, que pase el menor tiempo posible los productos en los anaqueles. Para esto se aprovechan los días festivos, donde hay más tráfico de clientes; se ponen los artículos con mayor tiempo en inventario en ofertas especiales o presentes en los pasillos transitados para incrementar la posibilidad de su venta. Por ende sacando lo “quedado” del inventario y tomando ventaja de estos días con mayor clientela.
LS0tCnRpdGxlOiA8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZSI+KipXYWxtYXJ0KioKCmF1dGhvcjogIkVsZW5hVmVsYV9BMDEyODM1MzUiCmRhdGU6ICIyMDIyLTA5LTEwIgpvdXRwdXQ6IAogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgdGhlbWU6IHVuaXRlZAogICAgaGlnaGxpZ2h0OiB0YW5nbwogICAgY29kZV9kb3dubG9hZDogdHJ1ZQoKLS0tCgo8aW1nIHNyYz0iL1VzZXJzL2VsZW5hdmVsYS9EZXNrdG9wL1dBTE1BUlQvd2FsbWFydC1sb2dvLmpwZWciPiAgCgpFbiAxOTYyLCBTYW0gV2FsdG9uIGFicmnDsyBzdSBwcmltZXJhIHRpZW5kYSBXYWxtYXJ0IGVuIFJvZ2VycywgQXJrYW5hc2FzLiBJbnRyb2R1am8gdW5hIGbDs3JtdWxhIGV4aXRvc2EgcGFyYSBlbCBjb21lcmNpbyBtaW5vcmlzdGEgcXVlIGltcGFjdGFyw61hIGxhIHZpZGEgZGUgbWlsbG9uZXMgZGUgcGVyc29uYXMgZW4gZWwgbXVuZG8uIAoKCiMjIyA8c3BhbiBzdHlsZT0iY29sb3I6bGlnaHRibHVlIj4qKlBhc28gcHJldmlvKio8L3NwYW4+Ckluc3RhbGFyIHBhcXVldGVzIGUgaW1wb3J0YXIgQ1NWCgpgYGB7cn0KI2ZpbGUuY2hvb3NlKCkKCnNldHdkKCJ+L0Rlc2t0b3Avd2FsIikKCmZlYXR1cmVzPC1yZWFkLmNzdigiL1VzZXJzL2VsZW5hdmVsYS9EZXNrdG9wL3dhbC9mZWF0dXJlcyAoMykuY3N2IikKc3RvcmVzPC1yZWFkLmNzdigiL1VzZXJzL2VsZW5hdmVsYS9EZXNrdG9wL3dhbC9zdG9yZXMgKDMpLmNzdiIpCnRyYWluPC1yZWFkLmNzdigiL1VzZXJzL2VsZW5hdmVsYS9EZXNrdG9wL3dhbC90cmFpbiAoMykuY3N2IikKdGVzdDwtcmVhZC5jc3YoIi9Vc2Vycy9lbGVuYXZlbGEvRGVza3RvcC93YWwvdGVzdCAoMykuY3N2IikKCmBgYAoKYGBge3J9CiNpbnN0YWxsLnBhY2thZ2VzKCJkcGx5ciIpCmxpYnJhcnkoZHBseXIpCmBgYAoKCgojIyMgPHNwYW4gc3R5bGU9ImNvbG9yOmxpZ2h0Ymx1ZSI+KipQcmltZXIgcGFzbyoqPC9zcGFuPgpFbnRlbmRlciBsYSBiYXNlcyBkZSBkYXRvcwoKYGBge3J9CnN1bW1hcnkoc3RvcmVzKQpjb3VudChzdG9yZXMsIFR5cGUsIHNvcnQ9VFJVRSkKc3RyKHN0b3JlcykKCnN1bW1hcnkoZmVhdHVyZXMpCnN0cihmZWF0dXJlcykKCmBgYAoKIyMjIyBhLiBPYnNlcnZhY2lvbmVzCjEuICJGZWF0dXJlcyIgdGllbmUgbGEgZmVjaGEgY29tIGNhcmFjdGVyICAKMi4gIkZlYXR1cmVzIiBoYXkgTkEncyBlbiBtYXMgZGUgbGEgbWl0YWQgZGUgbG9zIHJlZ2lzdHJvIGRlIG1hcmtkb3duIChkZWwgMSBhbCA1KSAgCjMuIEVuICJmZWF0dXJlcyIsIGhheSA1ODUgTkEncyBlbiBDUEkgeSBVbmVtcGxveW1lbnQsIHkgaGF5IDU4NSByZWdpc3Ryb3MgZGUgSXNIb2xpZGF5PSBUUlVFID90aWVuZSByZWxhY2lvbj8gUjogc2luIHJlbGFjaW9uICAKNC4gIlRyYWluIiB0aWVuZSB2ZW50YXMgc2VtYW5hbGVzIG5lZ2F0aXZhcy4gICAgICAgCiAgIAojIyMjIGIuIEhlcnJhbWllbnRhICJFbCBnZW5lcmFkb3IgZGUgdmFsb3IgZGUgZGF0b3MiCioqUGFzbyAxLioqIERlZmluaXIgZWwgw6FyZWEgZGVsIG5lZ29jaW8gcXVlIGJ1c2NhbW9zIGltcGFjdGFyIG8gbWVqb3JhciB5IHN1IEtQSS4gICAKKipQYXNvIDIuKiogU2VsZWNjaW9uYXIgbGEgcGxhbnRpbGxhICgtcykgcGFyYSBjcmVhciB2YWxvciBhIHBhcnRpciBkZSBsb3MgZGF0b3MgZGUgbG9zIGNsaWVudGVzLiAgCkVsIGRlcGFydGFtZW50byBkZSBtZXJjYWRvdGVjbmlhIGRlIEVVQSAoY29uIG11ZXN0cmEgZGUgNDUgdGllbmRhcykgZW4gZWwgaW5kaWNhZG9yIGRlIFZlbnRhcyBzZW1hbmFsZXMuIFNpc3RlbWFzIGFzZWd1cmFyYSBsYSBjYXB0dXJhIGRlbCBtYXJrZG93biBlbiBsYXMgYmFzZXMgZGUgZGF0b3MuICAgIAoqKipWaXNpb24qKiogIHxTZWdtZW50YWNpb24gfCBwcmVzb25hbGl6YWNpb24gfCBjb250ZXh0dWFsaXphY2lvbiAgCioqUGFzbyAzLioqIEdlbmVyYXIgaWRlYXMgbyBjb25jZXB0b3MgZXNwZWNpZmljb3MuICAKRWxhYm9yYXIgdW4gbW9kZWxvIHByZWRpY3Rpdm8gZGUgdmVudGFzIHNlbWFuYWxlcy4gICAKKipQYXNvIDQuKiogUmV1bmlyIGxvcyBkYXRvcyByZXF1ZXJpZG9zLiAgIApFbGFib3JhciB1bmEgYmFzZSBkZSBkYXRvcyBjb24gbGEgdmFyaWFibGUgZGVwZW5kaWVudGUgKHZlbnRhcyBzZW1hbmFsZXMpIHkgbGFzIHZhcmlhYmxlcyBpbmRlcGVuZGllbnRlcy4gIAoqKlBhc28gNS4qKiBQbGFuIGRlIGVqZWN1Y2lvbi4gICAKTWVyY2Fkb3RlY25pYSBlbGFib3JhcsOhIHBsYW4gcGFyYSBkZXNwbGVnYXIgbW9kZWxvIHByZWRpY3Rpdm8gZW4gZmFzZXM6ICAgCioqRmFzZSAxLioqIFBpbG90byAoU2FuIEFudG9uaW8sIFRYKS4gIAoqKkZhc2UgMi4qKiBUZXhhcy4gICAKKipGYXNlIDMuKiogRVVBLiAgCgoKIyMjIDxzcGFuIHN0eWxlPSJjb2xvcjpsaWdodGJsdWUiPioqU2VndW5kbyBwYXNvKio8L3NwYW4+CkNyZWFjacOzbiBkZSBsYSBiYXNlIGRlIGRhdG9zIGNvbnNvbGlkYWRhCgojIyMjIGEuIEFncmVnYXIgInN0b3JlcyIgYSAidHJhaW4iCmBgYHtyfQpiZDwtIG1lcmdlKHRyYWluLHN0b3JlcywgYnk9ICJTdG9yZSIpCmBgYAoKIyMjIyBiLiBBZ3JlZ2FyICJmZWF0dXJlcyIgYSAiYmQiCmBgYHtyfQpiZDE8LSBiZApiZDE8LSBtZXJnZShiZDEsZmVhdHVyZXMpCmBgYAoKIyMjIyBjLiBFbGltaW5hciBjb2x1bW5hcyBjb24gIE5BcyAoTWFya2Rvd25zKQpgYGB7cn0KYmQyPC0gYmQxCnN0cihiZDIpCmJkMjwtc3Vic2V0KGJkMiwgc2VsZWN0PS1jKE1hcmtEb3duMSxNYXJrRG93bjIsTWFya0Rvd24zLE1hcmtEb3duNCxNYXJrRG93bjUpKQpzdW1tYXJ5KGJkMikKYGBgCgojIyMjIGQuIENhbWJpYXIgZm9ybWF0byBkZSBmZWNoYQpgYGB7cn0KCmJkMiREYXRlIDwtIGFzLkRhdGUoYmQyJERhdGUsIGZvcm1hdD0gIiVkLyVtLyVZIikKc3RyKGJkMikKCiNpbnN0YWxsLnBhY2thZ2VzKCJ3b3Jkc3BhY2UiKQpsaWJyYXJ5KHdvcmRzcGFjZSkKCnNpZ25jb3VudChiZDIkV2Vla2x5X1NhbGVzKQpgYGAKCgojIyMjIGUuIEVsaW1pbmFyIHZlbnRhcyBtZW5vcmVzIHF1ZSAwCkVzdG8gc2UgZGVjaWRpw7NkIGRlYmlkbyBhIHF1ZSBubyBlcmFuIG11Y2hhcyB2ZW50YXMgbmVnYXRpdmFzLCBwb3IgbG8gY3VhbCBubyB0ZW5kcsOtYSBtdWNobyBpbXBhY3RvIGVuIGxvcyByZWdpc3RvcyBwZXJvIGhhcsOtYSBkZSBsYSBiYXNlIGRlIGRhdG9zIG3DoXMgbGltcGlhIHkgcHJvZmVzaW9uYWwuIApgYGB7cn0KYmQzIDwtIGJkMgpiZDMgPC0gYmQzW2JkMyRXZWVrbHlfU2FsZXMgPiAwLF0Kc3VtbWFyeSAoYmQzKQpgYGAKCgoKIyMjIyBmLiBBZ3JlZ2FyIG7Dum1lcm8gZGUgbGEgc2VtYW5hCmBgYHtyfQpiZDQgPC0gYmQzCmJkNCR3ZWVrX251bWJlciA8LSBzdHJmdGltZShiZDQkRGF0ZSwgZm9ybWF0ID0gIiVWIikKc3RyKGJkNCkKYmQ0JHdlZWtfbnVtYmVyIDwtIGFzLmludGVnZXIoYmQ0JHdlZWtfbnVtYmVyKQpzdHIoYmQ0KQpzdW1tYXJ5KGJkNCkKYGBgCgojIyMjIGcuIFNlcGFyYXIgYcOxbywgbWVzIHkgZGlhCmBgYHtyfQoKYmQ1PC0gYmQ0CmJkNTwtIGJkNSAlPiUKICBkcGx5cjo6bXV0YXRlKHllYXIgPSBsdWJyaWRhdGU6OnllYXIoRGF0ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb250aCA9IGx1YnJpZGF0ZTo6bW9udGgoRGF0ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF5ID0gbHVicmlkYXRlOjpkYXkoRGF0ZSkpCgpzdW1tYXJ5KGJkNSkKYGBgCgojIyMgPHNwYW4gc3R5bGU9ImNvbG9yOmxpZ2h0Ymx1ZSI+KipUZXJjZXIgcGFzbyoqPC9zcGFuPgpHZW5lcmFyIHJlZ3Jlc2lvbi4gIAoKYGBge3J9CnJlZ3Jlc2lvbiA8LSBsbSAoV2Vla2x5X1NhbGVzIH4gU3RvcmUgKyBEZXB0ICsgSXNIb2xpZGF5ICsgVHlwZSArIFNpemUgKyBUZW1wZXJhdHVyZSArIEZ1ZWxfUHJpY2UgKyBDUEkgKyBVbmVtcGxveW1lbnQgKyB3ZWVrX251bWJlciArIHllYXIgKyBtb250aCArIGRheSwgZGF0YT1iZDUpCnN1bW1hcnkgKHJlZ3Jlc2lvbikKYGBgCgoKCiMjIyA8c3BhbiBzdHlsZT0iY29sb3I6bGlnaHRibHVlIj4qKkN1YXJ0byBwYXNvKio8L3NwYW4+CkNvbnN0cnVpciB1biBtb2RlbG8gZGUgcHJlZGljY2nDs24uICAKCkVuIGVzdGUgY2Fzbywgc2UgdG9tYXJhbiBlbiBjdWVudGEgbGFzIG1pc21hcyB2YXJpYWJsZXMsIGV4Y2VwdG8gdW5hLCBwYXJhIGhhY2VyIGRvcyBwcmVkaWNjaW9uZXMuIExhIHByaW1lcmEgcHJlZGljY2nDs24gdG9tYSBlbiBjdWVudGEgcXVlIGxvcyBkw61hcyBzb24gZmVzdGl2b3MgKCpob2xpZGF5KiksIG1pZW50cmFzIGxvIHF1ZSBidXNjYSBsYSBzZWd1bmRhIHByZWRpY2Npw7NuIGVzIHZlciBxdWUgcGFzYXLDrWEgc2kgZWwgY29udGV4dG8gZGUgbGFzIGRlbcOhcyB2YXJpYWJsZXMgZnVlcmEgaWd1YWwsIHBlcm8gc2luICBzZXIgZMOtYXMgZmVzdGl2b3MuIApgYGB7cn0KZGF0b3NfbnVldm9zIDwtIGRhdGEuZnJhbWUoU3RvcmU9MSwgSXNIb2xpZGF5PSBUUlVFLCBEZXB0PTEsIFR5cGU9IkEiLCBTaXplPSAxNTEzMTUsIHdlZWtfbnVtYmVyID0xLCBUZW1wZXJhdHVyZSA9IDU5LjE3LCBGdWVsX1ByaWNlID0gMy41MjQsIENQST0gMjE0LjgzNzIsIFVuZW1wbG95bWVudCA9IDcuNjgyLCB5ZWFyID0yMDEyLCBtb250aCA9IDEsIGRheT0xOjcpCnByZWRpY3QocmVncmVzaW9uLGRhdG9zX251ZXZvcykKZmVzdGl2b3M8LXByZWRpY3QocmVncmVzaW9uLGRhdG9zX251ZXZvcykKYGBgCgpgYGB7cn0KZGF0b3NfbnVldm9zMiA8LSBkYXRhLmZyYW1lKFN0b3JlPTEsIElzSG9saWRheT0gRkFMU0UsIERlcHQ9MSwgVHlwZT0iQSIsIFNpemU9IDE1MTMxNSwgd2Vla19udW1iZXIgPTEsIFRlbXBlcmF0dXJlID0gNTkuMTcsIEZ1ZWxfUHJpY2UgPSAzLjUyNCwgQ1BJPSAyMTQuODM3MiwgVW5lbXBsb3ltZW50ID0gNy42ODIsIHllYXIgPTIwMTIsIG1vbnRoID0gMSwgZGF5PTE6NykKcHJlZGljdChyZWdyZXNpb24sZGF0b3NfbnVldm9zMikKbm9fZmVzdGl2b3M8LXByZWRpY3QocmVncmVzaW9uLGRhdG9zX251ZXZvczIpCmBgYAoKCiMjIyA8c3BhbiBzdHlsZT0iY29sb3I6bGlnaHRibHVlIj4qKlF1aW50byBwYXNvKio8L3NwYW4+CipHcmFmaWNhci4qICAKTWVkaWFudGUgZXN0YSByZWdyZXNpw7NuIGxpbmVhbCBhIHRyYXbDqXMgZGUgbG9zIGTDrWFzIGRlIGxhIHNlbWFuYSwgc2Ugb2JzZXJ2YSBxdWUgYW1ib3MsIHlhIHNlYSBlbiBkIMOtYSBmZXN0aXZvICBvICBubywgdmEgZW4gZGVzY2Vuc28uIE5vIG9ic3RhbnRlLCBhbCBjb21wYXJhciBhbWJhcywgb2JzZXJ2YW1vcyBxdWUgZHVyYW50ZSBsb3MgZMOtYXMgZmVzdGl2b3MgbGFzIHZlbnRhcyBzb24gbcOhcyBhbHRhcy4gCmBgYHtyfQpwcmltZXIgPC0gcGxvdChmZXN0aXZvcywgdHlwZSA9ICJsIiwgeGxhYiA9ICJEaWEgZGUgbGEgc2VtYW5hIiwgIHlsYWIgPSJWZW50YXMiLCAgbWFpbj0iUHJlZGljY2nDs24gZGUgVmVudGFzIikKc2VndW5kbyA8LSBwbG90KG5vX2Zlc3Rpdm9zLCB0eXBlID0gImwiLCB4bGFiID0gIkRpYSBkZSBsYSBzZW1hbmEiLCAgeWxhYiA9IlZlbnRhcyIsICBtYWluPSJQcmVkaWNjacOzbiBkZSBWZW50YXMiKQoKYGBgCgoqKipJZ3VhbG1lbnRlLCBzZSBhZ3JlZ2EgdW4gZ3LDoWZpY28gZGUgYmFycmFzIHBhcmEgY29tcGFyYXIgZWwgdm9sw7ptZW4gZGUgdmVudGFzIGRlIGN1YW5kbyBlcyBmZXN0aXZvIG8gbm8uKioqICAgCgoKYGBge3J9CmRhdG9zX2hvbCA8LSBkYXRhLmZyYW1lKFN0b3JlPTEsIElzSG9saWRheT0gVFJVRSwgRGVwdD0xLCBUeXBlPSJBIiwgU2l6ZT0gMTUxMzE1LCB3ZWVrX251bWJlciA9MSwgVGVtcGVyYXR1cmUgPSA1OS4xNywgRnVlbF9QcmljZSA9IDMuNTI0LCBDUEk9IDIxNC44MzcyLCBVbmVtcGxveW1lbnQgPSA3LjY4MiwgeWVhciA9MjAxMiwgbW9udGggPSAxLCBkYXk9MSkKCmRhdG9zX25vX2hvbCA8LSBkYXRhLmZyYW1lKFN0b3JlPTEsIElzSG9saWRheT0gRkFMU0UsIERlcHQ9MSwgVHlwZT0iQSIsIFNpemU9IDE1MTMxNSwgd2Vla19udW1iZXIgPTEsIFRlbXBlcmF0dXJlID0gNTkuMTcsIEZ1ZWxfUHJpY2UgPSAzLjUyNCwgQ1BJPSAyMTQuODM3MiwgVW5lbXBsb3ltZW50ID0gNy42ODIsIHllYXIgPTIwMTIsIG1vbnRoID0gMSwgZGF5PTEpCgpob2xpZGF5IDwtIHByZWRpY3QocmVncmVzaW9uLGRhdG9zX2hvbCkKbm9faG9sIDwtIHByZWRpY3QocmVncmVzaW9uLGRhdG9zX25vX2hvbCkKCmJhcnBsb3QoYyhob2xpZGF5LCBub19ob2wpLCB5bGltID0gYygwLDE0MDAwKSwgeWxhYiA9ICJWZW50YXMiLCBtYWluID0gIlByZWRpY2Npw7NuIGRlIFZlbnRhcyIsIG5hbWVzLmFyZyA9IGMoIkhvbGlkYXkiLCAiTm8gSG9saWRheSIpKQoKdGVyY2VyIDwtIGJhcnBsb3QoYyhob2xpZGF5LCBub19ob2wpLCB5bGltID0gYygwLDE0MDAwKSwgeWxhYiA9ICJWZW50YXMiLCBtYWluID0gIlByZWRpY2Npw7NuIGRlIFZlbnRhcyIsIG5hbWVzLmFyZyA9IGMoIkhvbGlkYXkiLCAiTm8gSG9saWRheSIpKQpgYGAKCiMjIyA8c3BhbiBzdHlsZT0iY29sb3I6bGlnaHRibHVlIj4qKkNvbmNsdXNpb25lcyoqPC9zcGFuPgoKUGFyYSBlbCBhbsOhbGlzaXMgaW5pY2lhbCBzZSBjb250w7MgY29uIDQgZGlmZXJlbnRlcyBiYXNlcyBkZSBkYXRvcywgc2luIGVtYmFyZ28sIHBhcmEgcG9kZXIgdGVuZXIgdW4gYW7DoWxpc2lzIG3DoXMgYWRlY3VhZG8gcmVzdWx0YSBtw6FzIGludGVyZXNhbnRlIGNvbWJpbmFyIGVzdGFzIG1pc21hcy4gQ2llcnRhcyBiYXNlcyBkZSBkYXRvcyBjdWVudGFuIGNvbiBjb2x1bW5hcyBpZ3VhbGVzOyBSIHRpZW5lIGxhIGNhcGFjaWRhZCBkZSBkZXRlY3RhciBlc3RvIHkganVudGFybGFzIGRlIG1hbmVhIGFkZWN1YWRhLiAgCgpObyBvYnN0YW50ZSwgYW50ZXMgZGUganVudGFyIGxhcyBiYXNlcywgeSBkZXNwdcOpcyBkZSBlbnRlbmRlcmxhcyBpbmRpdmlkdWFsbWVudGUsIGVzIHByZWNpc28gY29tcGxldGFyIHkgcGVuc2FyIGVuIGxhICoqSGVycmFtaWVudGEgIkVsIGdlbmVyYWRvciBkZSB2YWxvciBkZSBkYXRvcyIqKi4gQXF1w60gcHVkaW1vcyBlbnRlbmRlciBsYSBuZWNlc2lkYWQgcXVlIHRpZW5lICB5IGxvcyBwYXNvcyAgYSBzZWd1aXIuIENvbW8gZnVlIGRlZmluaWRvIGFudGVyaW9ybWVudGUsIGxhcyB2ZW50YXMgc29uIGxvIHF1ZSBtw6FzIHNlIG5lY2VzaXRhbiBlbiBlbCBtb21lbnRvLCB5ICBtZWRpYW50ZSBsYSB2aXNpw7NuIHkgdW4gbW9kZWxvIHByZWRpY3Rpdm8gc2UgcHVlZGUgbGxldmFyIGEgY2FibyBlbCBwbGFuIGRlIGVqZWN1Y2nDs24uIEFxdcOtIG1pc21vIGVzIHBvc2libGUgdmVyIHF1w6kgZXMgbG8gcXVlIHNlIHJlcXVpZXJlIGNhbWJpYXIuICAgCgpBaG9yYSwgZXMgcG9zaWJsZSBjb21lbnphciBhIGp1bnRhciBsYXMgIGJhc2VzICBkZSBkYXRvcyBjb24gZWwgZmluIGRlIGNyZWFyIGVsIG1vZGVsbyBkZSBwcmVkaWNjacOzbiAgZGUgdmVudGFzIHBhcmEgV2FsbWFydC4gQWwganVudGFyc2UgbGFzIGJhc2VzIGRlIGRhdG9zIGRlICpzdG9yZXMqLCAqZmVhdHVyZXMqLCB5ICp0cmFpbiosIG5vdGFtb3MgcXVlIGV4aXN0ZW4gdmFyaW9zICpOQXMqIGRlbnRybyAgZGUgbGFzIGNvbHVtbmFzIGRlICpNYXJrRG93biosIHBvciAgbG8gcXVlIHNlIGRlY2lkZW4gZWxpbWluYXIgZXN0YXMgY29sdW1uYXMgcGFyYSBubyB0ZW5lciBuaW5nw7puICpOQSouIFNpZ3VpZW50ZW1lbnRlLCBzZSBjYW1iaWEgZWwgZm9ybWF0byBkZSBmZWNoYSwgc2Ugc2VwYXJhbiBlbCBkw61hLCBtZXMgIHkgYcOxbyB5ICBzZSBlbGltaW5hbiAgbGFzIHZlbnRhcyBuZWdhdGl2YXMuIERlIGVzdGEgbWFuZXJhIG51ZXN0cmEgYmFzZSBkZSBkYXRvcyBjb25qdW50YSBxdWVkYSBsbyBtw6FzIGxpbXBpYSB5IGxpc3RhIHBvc2libGUgcGFyYSB2ZXIgcHJlZGljY2lvbmVzLiAgCgpTZSBnZW5lcmEgbGEgcmVncmVzacOzbiBwYXJhIHZlciBsYSBwcmVkaWNjacOzbiBkZSB2ZW50YXMgc2VtYW5hbGVzLCB5IHNlIGNvbnN0cnV5ZW4gZG9zIG1vZGVsb3MgZGUgcHJlZGljY2nDs24uIExhIHZhcmlhYmxlIHF1ZSB0aWVuZW4gZGUgZGlmZXJlbnRlIGVzIHNpIGVsIGTDrWEgY2FlIGVuIGZlc3Rpdm8gbyBuby4gIAoKRW4gZXN0ZSBjw7NkaWdvLCBwdWRlIGFwcmVuZGVyIGRlIHByaW1lcmEgbWFubyB5IGRlIG1hbmVyYSBpbmRpdmlkdWFsIGNvbW8gZ2VuZXJhciBncsOhZmljYXMgeSBjb21vIGNvbXBhcmFybGFzIGRlYmlkYW1lbnRlOyBhc2ltaXNtbywgcHVkZSBsb2dyYXIgaGFjZXIgbG8gaW50ZXJhY3Rpdm8uIEF1bnF1ZSBlc3RlIGPDs2RpZ28gZnVlIHVuIHJldG8gIHBlcnNvbmFsIHBhcmEgbWksIG1lIHNpZW50byBtdXkgc2F0aXNmZWNoYSBwb3IgbG8gYXByZW5kaXphamVzIG9idGVuaWRvcyB5IGxvIHF1ZSBwdWRlIGNyZWNlci4gCgojIyMgPHNwYW4gc3R5bGU9ImNvbG9yOmxpZ2h0Ymx1ZSI+KipQcm9wdWVzdGFzKio8L3NwYW4+CjEuIERlYmlkbyBhIHF1ZSBXYWxtYXJ0IGRlbXVlc3RyYSB0ZW5lciB1biBpbmNyZW1lbnRvIGVuIHZlbnRhcyBkdXJhbnRlIGxvcyBkw61hcyBmZXN0aXZvcywgbG8gcXVlIHNlIHByb3BvbmUgZXMgcXVlIGFwcm92ZWNoZW4gYWwgbcOheGltbyBlc3RlIHN1Y2VzbyBwYXJhIHBvdGVuY2lhbGl6YXIgbGFzIHZlbnRhcy4gQ29tbyBzZSBlc3RhYmxlY2nDsyBlbiAgbGEgaGVycmFtaWVudGEgZGUgIkVsIGdlbmVyYWRvciBkZSB2YWxvciBkZSBkYXRvcyIsIHNlIGVzdGFyw6EgdHJhYmFqYW5kbyBjb24gZWwgZXF1aXBvIGRlIG1lcmNhZG90ZWNuaWE7IGVzdG8gcHVlZGUgc2VyIGFwcm92ZWNoYWRvIHBhcmEgaW5jcmVtZW50YXIgbG9zIGRlc2N1ZW50b3MgZW4gdGllbmRhIGR1cmFudGUgbG9zIGTDrWFzIGZlc3Rpdm9zIHkgcG9yIGVuZGUgaW5jcmVtZW50YXIgZWwgZmx1am8gZGUgcGVyc29uYXMgeSBjb21wcmFzIGVuIGVzdGFzIGZlY2hhcy4gIAoyLiBQb3Igb3RyYSBwYXJ0ZSwgb3RyYSBwcm9wdWVzdGEgcXVlIHNlIGhhIGRlc2Fycm9sbGFkbyBlcyBxdWUgV2FsbWFydCBjcmVlIHN1cyBwcm9waW9zICJkw61hcyBmZXN0aXZvcyIgZW4gc3UgbG9jYWxpZGFkIHBpbG90YSAoU2FuIEFudG9uaW8sIFRYKS4gRGUgYWN1ZXJkbyBhIEludGVybmF0aW9uYWwgQnVzaW5lc3MgR3VpZGUsIEVVQSBlcyBlbCBwYcOtcyBtw6FzIGNvbnN1bWlzdGEgZGVsIG11bmRvLCBlbCBtZXJjYWRvIGVzdGFkb3VuaWRlbnNlIHJlcHJlc2VudGEgYWwgMjklIGRlbCBtZXJjYWRvICBnbG9iYWwuIERlYmlkbyBhIGVzdG8sIHNlIHB1ZWRlIGxsZWdhciBhIGxhIGNvbmNsdXNpw7NuIGRlIHF1ZSBhbCBkYXJsZXMgYSBsb3MgZXN0YWRvdW5pZGVuc2VzIG3DoXMgb3BvcnR1bmlkYWRlcyBvIGTDrWFzIGVzcGVjaWFsZXMgZGUgY29uc3VtaXIsIGVsbG9zIGxvcyBwb2Ryw61hbiB0b21hci4gQWxndW5vcyBlamVtcGxvcyBkZSAiZMOtYXMgZmVzdGl2b3MiIHBvZHLDrWFuIHNlcjogIldhbG1hcnQgZGF5IiwgIkZpcnN0IERheSBvZiBTY2hvb2wgRGF5IiwgeSAiUmVtb2RlbCBZb3VyIEhvbWUgRGF5Ii4gICAKMy4gRmluYWxtZW50ZSwgdW5vIGRlIGxvcyBvYmpldGl2b3MgcHJpbmljcGFsZXMgZGUgdW5hIHRpZW5kYSBkZSB2ZW50YSBtaW5vcmlzdGEgY29tbyBXYWxtYXJ0IGVzIHRlbmVyIGVuIGNpcmN1bGFjacOzbiBzdSBpbnZlbnRhcmlvLiBFcyBkZWNpciwgcXVlIHBhc2UgZWwgbWVub3IgdGllbXBvIHBvc2libGUgbG9zIHByb2R1Y3RvcyBlbiBsb3MgYW5hcXVlbGVzLiBQYXJhIGVzdG8gc2UgYXByb3ZlY2hhbiBsb3MgZMOtYXMgZmVzdGl2b3MsIGRvbmRlIGhheSBtw6FzIHRyw6FmaWNvIGRlIGNsaWVudGVzOyBzZSBwb25lbiBsb3MgYXJ0w61jdWxvcyBjb24gbWF5b3IgdGllbXBvIGVuIGludmVudGFyaW8gZW4gb2ZlcnRhcyBlc3BlY2lhbGVzIG8gcHJlc2VudGVzIGVuIGxvcyBwYXNpbGxvcyB0cmFuc2l0YWRvcyBwYXJhIGluY3JlbWVudGFyIGxhIHBvc2liaWxpZGFkIGRlIHN1IHZlbnRhLiBQb3IgZW5kZSBzYWNhbmRvIGxvICJxdWVkYWRvIiBkZWwgaW52ZW50YXJpbyB5IHRvbWFuZG8gdmVudGFqYSBkZSBlc3RvcyBkw61hcyBjb24gbWF5b3IgY2xpZW50ZWxhLiAKCgoKCgoKCgoK