El objetivo es crear una simulacion de un dataset donde aplicaremos estadistica descriptiva (mean, standard deviation..etc).
En este caso, el dataset representara observaciones de las ventas totales por semana de dos productos en una cadena de tiendas.
Empezaremos creando una estructura que en la que se basara el data set, una simulacion de las ventas para los dos productos en 20 tiendas durante 2 años con su precio y estatus de promocion correspondiente.
Hemos definido “K” como la constante. K.stores indica el total de tiendas y k.weeks el numero total de semanas en 2 años.
Por otro lado, creamos el data frame general y sus nombres de columnas (10) y filas (20*104= 2080) correspondientes.
k.stores <- 20
k.weeks <- 104
store.df <- data.frame(matrix(NA, ncol = 10, nrow = k.stores*k.weeks))
names(store.df) <- c("storeNum", "Year", "Week", "p1sales", "p2sales", "p1price", "p2price", "p1prom", "p2prom", "country")
Podemos conocer sus dimensiones facilmente con la funcion dim.
dim(store.df)
## [1] 2080 10
A continuacion crearemos dos vectores que representaran el numero de tiendas y paises para cada observacion.
Por un lado, asignaremos un numero de tienda o codigo a cada una entre el rango 101-120.
Por otro lado, cada tienda tendra un pais al que corresponde, donde marcamos un repeticion del numero de veces que queremos que aparezca.
store.num <- 101:(100+k.stores)
store.cty <- c(rep("US", 3), rep("DE", 5), rep("GB", 3), rep("BR", 2), rep("JP", 4), rep("AU", 1), rep("CN", 2))
length(store.cty)
## [1] 20
A continuacion, reemplazaremos los vectores que hemos creado anteriormente en nuesto data set, utilizando la funcion rep() y marcando en total de longitud.Despues con la funcion rm(), eliminamos los vectores antes creados.
store.df$storeNum <- rep(store.num, each = k.weeks)
store.df$country <- rep(store.cty, each = k.weeks)
rm(store.num, store.cty)
En este paso, reemplazamos los datos en base a las semanas; en este caso 52 por año, que se repiten 2 veces por el número de tiendas.
Y en base a los años (2 años), que queremos que se repitan 20 veces (número de tiendas), 52 semanas cada uno durante 2 años.
store.df$Week <- rep(1:52, times = k.stores*2)
store.df$Year <- rep(rep(1:2, each = k.weeks/2), times = k.stores)
str(store.df)
## 'data.frame': 2080 obs. of 10 variables:
## $ storeNum: int 101 101 101 101 101 101 101 101 101 101 ...
## $ Year : int 1 1 1 1 1 1 1 1 1 1 ...
## $ Week : int 1 2 3 4 5 6 7 8 9 10 ...
## $ p1sales : logi NA NA NA NA NA NA ...
## $ p2sales : logi NA NA NA NA NA NA ...
## $ p1price : logi NA NA NA NA NA NA ...
## $ p2price : logi NA NA NA NA NA NA ...
## $ p1prom : logi NA NA NA NA NA NA ...
## $ p2prom : logi NA NA NA NA NA NA ...
## $ country : chr "US" "US" "US" "US" ...
En este caso, funciones como each() o times() nos sirven para repetir recursivamente elementos vectoriales N veces cada uno, como podeos ver en este ejemplo claramente las diferencias.
Each() define el numero de veces que queremos que aparezcan los datos y times() el numero de veces que queremos que se repitan.
v <- c('a', 'b')
n <- 3
rep(v, each=3)
## [1] "a" "a" "a" "b" "b" "b"
rep(v, times=3)
## [1] "a" "b" "a" "b" "a" "b"
Revisamos la estructura actual del dataset con str().Podemos observar que las variables de country y storeNum estan definidas como valores numericos cuando verdaderamente se pueden categorizar como labels, lo que seria un factor.
str(store.df)
## 'data.frame': 2080 obs. of 10 variables:
## $ storeNum: int 101 101 101 101 101 101 101 101 101 101 ...
## $ Year : int 1 1 1 1 1 1 1 1 1 1 ...
## $ Week : int 1 2 3 4 5 6 7 8 9 10 ...
## $ p1sales : logi NA NA NA NA NA NA ...
## $ p2sales : logi NA NA NA NA NA NA ...
## $ p1price : logi NA NA NA NA NA NA ...
## $ p2price : logi NA NA NA NA NA NA ...
## $ p1prom : logi NA NA NA NA NA NA ...
## $ p2prom : logi NA NA NA NA NA NA ...
## $ country : chr "US" "US" "US" "US" ...
store.df$storeNum <- factor(store.df$storeNum)
store.df$country <- factor(store.df$country)
str(store.df)
## 'data.frame': 2080 obs. of 10 variables:
## $ storeNum: Factor w/ 20 levels "101","102","103",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ Year : int 1 1 1 1 1 1 1 1 1 1 ...
## $ Week : int 1 2 3 4 5 6 7 8 9 10 ...
## $ p1sales : logi NA NA NA NA NA NA ...
## $ p2sales : logi NA NA NA NA NA NA ...
## $ p1price : logi NA NA NA NA NA NA ...
## $ p2price : logi NA NA NA NA NA NA ...
## $ p1prom : logi NA NA NA NA NA NA ...
## $ p2prom : logi NA NA NA NA NA NA ...
## $ country : Factor w/ 7 levels "AU","BR","CN",..: 7 7 7 7 7 7 7 7 7 7 ...
Para revisar el data set podemos emplear funciones como head(x=DATA, n=NUMROWS) o tail. Por ejemplo.
head(store.df)
## storeNum Year Week p1sales p2sales p1price p2price p1prom p2prom country
## 1 101 1 1 NA NA NA NA NA NA US
## 2 101 1 2 NA NA NA NA NA NA US
## 3 101 1 3 NA NA NA NA NA NA US
## 4 101 1 4 NA NA NA NA NA NA US
## 5 101 1 5 NA NA NA NA NA NA US
## 6 101 1 6 NA NA NA NA NA NA US
head(store.df, 120)
## storeNum Year Week p1sales p2sales p1price p2price p1prom p2prom
## 1 101 1 1 NA NA NA NA NA NA
## 2 101 1 2 NA NA NA NA NA NA
## 3 101 1 3 NA NA NA NA NA NA
## 4 101 1 4 NA NA NA NA NA NA
## 5 101 1 5 NA NA NA NA NA NA
## 6 101 1 6 NA NA NA NA NA NA
## 7 101 1 7 NA NA NA NA NA NA
## 8 101 1 8 NA NA NA NA NA NA
## 9 101 1 9 NA NA NA NA NA NA
## 10 101 1 10 NA NA NA NA NA NA
## 11 101 1 11 NA NA NA NA NA NA
## 12 101 1 12 NA NA NA NA NA NA
## 13 101 1 13 NA NA NA NA NA NA
## 14 101 1 14 NA NA NA NA NA NA
## 15 101 1 15 NA NA NA NA NA NA
## 16 101 1 16 NA NA NA NA NA NA
## 17 101 1 17 NA NA NA NA NA NA
## 18 101 1 18 NA NA NA NA NA NA
## 19 101 1 19 NA NA NA NA NA NA
## 20 101 1 20 NA NA NA NA NA NA
## 21 101 1 21 NA NA NA NA NA NA
## 22 101 1 22 NA NA NA NA NA NA
## 23 101 1 23 NA NA NA NA NA NA
## 24 101 1 24 NA NA NA NA NA NA
## 25 101 1 25 NA NA NA NA NA NA
## 26 101 1 26 NA NA NA NA NA NA
## 27 101 1 27 NA NA NA NA NA NA
## 28 101 1 28 NA NA NA NA NA NA
## 29 101 1 29 NA NA NA NA NA NA
## 30 101 1 30 NA NA NA NA NA NA
## 31 101 1 31 NA NA NA NA NA NA
## 32 101 1 32 NA NA NA NA NA NA
## 33 101 1 33 NA NA NA NA NA NA
## 34 101 1 34 NA NA NA NA NA NA
## 35 101 1 35 NA NA NA NA NA NA
## 36 101 1 36 NA NA NA NA NA NA
## 37 101 1 37 NA NA NA NA NA NA
## 38 101 1 38 NA NA NA NA NA NA
## 39 101 1 39 NA NA NA NA NA NA
## 40 101 1 40 NA NA NA NA NA NA
## 41 101 1 41 NA NA NA NA NA NA
## 42 101 1 42 NA NA NA NA NA NA
## 43 101 1 43 NA NA NA NA NA NA
## 44 101 1 44 NA NA NA NA NA NA
## 45 101 1 45 NA NA NA NA NA NA
## 46 101 1 46 NA NA NA NA NA NA
## 47 101 1 47 NA NA NA NA NA NA
## 48 101 1 48 NA NA NA NA NA NA
## 49 101 1 49 NA NA NA NA NA NA
## 50 101 1 50 NA NA NA NA NA NA
## 51 101 1 51 NA NA NA NA NA NA
## 52 101 1 52 NA NA NA NA NA NA
## 53 101 2 1 NA NA NA NA NA NA
## 54 101 2 2 NA NA NA NA NA NA
## 55 101 2 3 NA NA NA NA NA NA
## 56 101 2 4 NA NA NA NA NA NA
## 57 101 2 5 NA NA NA NA NA NA
## 58 101 2 6 NA NA NA NA NA NA
## 59 101 2 7 NA NA NA NA NA NA
## 60 101 2 8 NA NA NA NA NA NA
## 61 101 2 9 NA NA NA NA NA NA
## 62 101 2 10 NA NA NA NA NA NA
## 63 101 2 11 NA NA NA NA NA NA
## 64 101 2 12 NA NA NA NA NA NA
## 65 101 2 13 NA NA NA NA NA NA
## 66 101 2 14 NA NA NA NA NA NA
## 67 101 2 15 NA NA NA NA NA NA
## 68 101 2 16 NA NA NA NA NA NA
## 69 101 2 17 NA NA NA NA NA NA
## 70 101 2 18 NA NA NA NA NA NA
## 71 101 2 19 NA NA NA NA NA NA
## 72 101 2 20 NA NA NA NA NA NA
## 73 101 2 21 NA NA NA NA NA NA
## 74 101 2 22 NA NA NA NA NA NA
## 75 101 2 23 NA NA NA NA NA NA
## 76 101 2 24 NA NA NA NA NA NA
## 77 101 2 25 NA NA NA NA NA NA
## 78 101 2 26 NA NA NA NA NA NA
## 79 101 2 27 NA NA NA NA NA NA
## 80 101 2 28 NA NA NA NA NA NA
## 81 101 2 29 NA NA NA NA NA NA
## 82 101 2 30 NA NA NA NA NA NA
## 83 101 2 31 NA NA NA NA NA NA
## 84 101 2 32 NA NA NA NA NA NA
## 85 101 2 33 NA NA NA NA NA NA
## 86 101 2 34 NA NA NA NA NA NA
## 87 101 2 35 NA NA NA NA NA NA
## 88 101 2 36 NA NA NA NA NA NA
## 89 101 2 37 NA NA NA NA NA NA
## 90 101 2 38 NA NA NA NA NA NA
## 91 101 2 39 NA NA NA NA NA NA
## 92 101 2 40 NA NA NA NA NA NA
## 93 101 2 41 NA NA NA NA NA NA
## 94 101 2 42 NA NA NA NA NA NA
## 95 101 2 43 NA NA NA NA NA NA
## 96 101 2 44 NA NA NA NA NA NA
## 97 101 2 45 NA NA NA NA NA NA
## 98 101 2 46 NA NA NA NA NA NA
## 99 101 2 47 NA NA NA NA NA NA
## 100 101 2 48 NA NA NA NA NA NA
## 101 101 2 49 NA NA NA NA NA NA
## 102 101 2 50 NA NA NA NA NA NA
## 103 101 2 51 NA NA NA NA NA NA
## 104 101 2 52 NA NA NA NA NA NA
## 105 102 1 1 NA NA NA NA NA NA
## 106 102 1 2 NA NA NA NA NA NA
## 107 102 1 3 NA NA NA NA NA NA
## 108 102 1 4 NA NA NA NA NA NA
## 109 102 1 5 NA NA NA NA NA NA
## 110 102 1 6 NA NA NA NA NA NA
## 111 102 1 7 NA NA NA NA NA NA
## 112 102 1 8 NA NA NA NA NA NA
## 113 102 1 9 NA NA NA NA NA NA
## 114 102 1 10 NA NA NA NA NA NA
## 115 102 1 11 NA NA NA NA NA NA
## 116 102 1 12 NA NA NA NA NA NA
## 117 102 1 13 NA NA NA NA NA NA
## 118 102 1 14 NA NA NA NA NA NA
## 119 102 1 15 NA NA NA NA NA NA
## 120 102 1 16 NA NA NA NA NA NA
## country
## 1 US
## 2 US
## 3 US
## 4 US
## 5 US
## 6 US
## 7 US
## 8 US
## 9 US
## 10 US
## 11 US
## 12 US
## 13 US
## 14 US
## 15 US
## 16 US
## 17 US
## 18 US
## 19 US
## 20 US
## 21 US
## 22 US
## 23 US
## 24 US
## 25 US
## 26 US
## 27 US
## 28 US
## 29 US
## 30 US
## 31 US
## 32 US
## 33 US
## 34 US
## 35 US
## 36 US
## 37 US
## 38 US
## 39 US
## 40 US
## 41 US
## 42 US
## 43 US
## 44 US
## 45 US
## 46 US
## 47 US
## 48 US
## 49 US
## 50 US
## 51 US
## 52 US
## 53 US
## 54 US
## 55 US
## 56 US
## 57 US
## 58 US
## 59 US
## 60 US
## 61 US
## 62 US
## 63 US
## 64 US
## 65 US
## 66 US
## 67 US
## 68 US
## 69 US
## 70 US
## 71 US
## 72 US
## 73 US
## 74 US
## 75 US
## 76 US
## 77 US
## 78 US
## 79 US
## 80 US
## 81 US
## 82 US
## 83 US
## 84 US
## 85 US
## 86 US
## 87 US
## 88 US
## 89 US
## 90 US
## 91 US
## 92 US
## 93 US
## 94 US
## 95 US
## 96 US
## 97 US
## 98 US
## 99 US
## 100 US
## 101 US
## 102 US
## 103 US
## 104 US
## 105 US
## 106 US
## 107 US
## 108 US
## 109 US
## 110 US
## 111 US
## 112 US
## 113 US
## 114 US
## 115 US
## 116 US
## 117 US
## 118 US
## 119 US
## 120 US
tail(store.df, 120)
## storeNum Year Week p1sales p2sales p1price p2price p1prom p2prom
## 1961 119 2 37 NA NA NA NA NA NA
## 1962 119 2 38 NA NA NA NA NA NA
## 1963 119 2 39 NA NA NA NA NA NA
## 1964 119 2 40 NA NA NA NA NA NA
## 1965 119 2 41 NA NA NA NA NA NA
## 1966 119 2 42 NA NA NA NA NA NA
## 1967 119 2 43 NA NA NA NA NA NA
## 1968 119 2 44 NA NA NA NA NA NA
## 1969 119 2 45 NA NA NA NA NA NA
## 1970 119 2 46 NA NA NA NA NA NA
## 1971 119 2 47 NA NA NA NA NA NA
## 1972 119 2 48 NA NA NA NA NA NA
## 1973 119 2 49 NA NA NA NA NA NA
## 1974 119 2 50 NA NA NA NA NA NA
## 1975 119 2 51 NA NA NA NA NA NA
## 1976 119 2 52 NA NA NA NA NA NA
## 1977 120 1 1 NA NA NA NA NA NA
## 1978 120 1 2 NA NA NA NA NA NA
## 1979 120 1 3 NA NA NA NA NA NA
## 1980 120 1 4 NA NA NA NA NA NA
## 1981 120 1 5 NA NA NA NA NA NA
## 1982 120 1 6 NA NA NA NA NA NA
## 1983 120 1 7 NA NA NA NA NA NA
## 1984 120 1 8 NA NA NA NA NA NA
## 1985 120 1 9 NA NA NA NA NA NA
## 1986 120 1 10 NA NA NA NA NA NA
## 1987 120 1 11 NA NA NA NA NA NA
## 1988 120 1 12 NA NA NA NA NA NA
## 1989 120 1 13 NA NA NA NA NA NA
## 1990 120 1 14 NA NA NA NA NA NA
## 1991 120 1 15 NA NA NA NA NA NA
## 1992 120 1 16 NA NA NA NA NA NA
## 1993 120 1 17 NA NA NA NA NA NA
## 1994 120 1 18 NA NA NA NA NA NA
## 1995 120 1 19 NA NA NA NA NA NA
## 1996 120 1 20 NA NA NA NA NA NA
## 1997 120 1 21 NA NA NA NA NA NA
## 1998 120 1 22 NA NA NA NA NA NA
## 1999 120 1 23 NA NA NA NA NA NA
## 2000 120 1 24 NA NA NA NA NA NA
## 2001 120 1 25 NA NA NA NA NA NA
## 2002 120 1 26 NA NA NA NA NA NA
## 2003 120 1 27 NA NA NA NA NA NA
## 2004 120 1 28 NA NA NA NA NA NA
## 2005 120 1 29 NA NA NA NA NA NA
## 2006 120 1 30 NA NA NA NA NA NA
## 2007 120 1 31 NA NA NA NA NA NA
## 2008 120 1 32 NA NA NA NA NA NA
## 2009 120 1 33 NA NA NA NA NA NA
## 2010 120 1 34 NA NA NA NA NA NA
## 2011 120 1 35 NA NA NA NA NA NA
## 2012 120 1 36 NA NA NA NA NA NA
## 2013 120 1 37 NA NA NA NA NA NA
## 2014 120 1 38 NA NA NA NA NA NA
## 2015 120 1 39 NA NA NA NA NA NA
## 2016 120 1 40 NA NA NA NA NA NA
## 2017 120 1 41 NA NA NA NA NA NA
## 2018 120 1 42 NA NA NA NA NA NA
## 2019 120 1 43 NA NA NA NA NA NA
## 2020 120 1 44 NA NA NA NA NA NA
## 2021 120 1 45 NA NA NA NA NA NA
## 2022 120 1 46 NA NA NA NA NA NA
## 2023 120 1 47 NA NA NA NA NA NA
## 2024 120 1 48 NA NA NA NA NA NA
## 2025 120 1 49 NA NA NA NA NA NA
## 2026 120 1 50 NA NA NA NA NA NA
## 2027 120 1 51 NA NA NA NA NA NA
## 2028 120 1 52 NA NA NA NA NA NA
## 2029 120 2 1 NA NA NA NA NA NA
## 2030 120 2 2 NA NA NA NA NA NA
## 2031 120 2 3 NA NA NA NA NA NA
## 2032 120 2 4 NA NA NA NA NA NA
## 2033 120 2 5 NA NA NA NA NA NA
## 2034 120 2 6 NA NA NA NA NA NA
## 2035 120 2 7 NA NA NA NA NA NA
## 2036 120 2 8 NA NA NA NA NA NA
## 2037 120 2 9 NA NA NA NA NA NA
## 2038 120 2 10 NA NA NA NA NA NA
## 2039 120 2 11 NA NA NA NA NA NA
## 2040 120 2 12 NA NA NA NA NA NA
## 2041 120 2 13 NA NA NA NA NA NA
## 2042 120 2 14 NA NA NA NA NA NA
## 2043 120 2 15 NA NA NA NA NA NA
## 2044 120 2 16 NA NA NA NA NA NA
## 2045 120 2 17 NA NA NA NA NA NA
## 2046 120 2 18 NA NA NA NA NA NA
## 2047 120 2 19 NA NA NA NA NA NA
## 2048 120 2 20 NA NA NA NA NA NA
## 2049 120 2 21 NA NA NA NA NA NA
## 2050 120 2 22 NA NA NA NA NA NA
## 2051 120 2 23 NA NA NA NA NA NA
## 2052 120 2 24 NA NA NA NA NA NA
## 2053 120 2 25 NA NA NA NA NA NA
## 2054 120 2 26 NA NA NA NA NA NA
## 2055 120 2 27 NA NA NA NA NA NA
## 2056 120 2 28 NA NA NA NA NA NA
## 2057 120 2 29 NA NA NA NA NA NA
## 2058 120 2 30 NA NA NA NA NA NA
## 2059 120 2 31 NA NA NA NA NA NA
## 2060 120 2 32 NA NA NA NA NA NA
## 2061 120 2 33 NA NA NA NA NA NA
## 2062 120 2 34 NA NA NA NA NA NA
## 2063 120 2 35 NA NA NA NA NA NA
## 2064 120 2 36 NA NA NA NA NA NA
## 2065 120 2 37 NA NA NA NA NA NA
## 2066 120 2 38 NA NA NA NA NA NA
## 2067 120 2 39 NA NA NA NA NA NA
## 2068 120 2 40 NA NA NA NA NA NA
## 2069 120 2 41 NA NA NA NA NA NA
## 2070 120 2 42 NA NA NA NA NA NA
## 2071 120 2 43 NA NA NA NA NA NA
## 2072 120 2 44 NA NA NA NA NA NA
## 2073 120 2 45 NA NA NA NA NA NA
## 2074 120 2 46 NA NA NA NA NA NA
## 2075 120 2 47 NA NA NA NA NA NA
## 2076 120 2 48 NA NA NA NA NA NA
## 2077 120 2 49 NA NA NA NA NA NA
## 2078 120 2 50 NA NA NA NA NA NA
## 2079 120 2 51 NA NA NA NA NA NA
## 2080 120 2 52 NA NA NA NA NA NA
## country
## 1961 CN
## 1962 CN
## 1963 CN
## 1964 CN
## 1965 CN
## 1966 CN
## 1967 CN
## 1968 CN
## 1969 CN
## 1970 CN
## 1971 CN
## 1972 CN
## 1973 CN
## 1974 CN
## 1975 CN
## 1976 CN
## 1977 CN
## 1978 CN
## 1979 CN
## 1980 CN
## 1981 CN
## 1982 CN
## 1983 CN
## 1984 CN
## 1985 CN
## 1986 CN
## 1987 CN
## 1988 CN
## 1989 CN
## 1990 CN
## 1991 CN
## 1992 CN
## 1993 CN
## 1994 CN
## 1995 CN
## 1996 CN
## 1997 CN
## 1998 CN
## 1999 CN
## 2000 CN
## 2001 CN
## 2002 CN
## 2003 CN
## 2004 CN
## 2005 CN
## 2006 CN
## 2007 CN
## 2008 CN
## 2009 CN
## 2010 CN
## 2011 CN
## 2012 CN
## 2013 CN
## 2014 CN
## 2015 CN
## 2016 CN
## 2017 CN
## 2018 CN
## 2019 CN
## 2020 CN
## 2021 CN
## 2022 CN
## 2023 CN
## 2024 CN
## 2025 CN
## 2026 CN
## 2027 CN
## 2028 CN
## 2029 CN
## 2030 CN
## 2031 CN
## 2032 CN
## 2033 CN
## 2034 CN
## 2035 CN
## 2036 CN
## 2037 CN
## 2038 CN
## 2039 CN
## 2040 CN
## 2041 CN
## 2042 CN
## 2043 CN
## 2044 CN
## 2045 CN
## 2046 CN
## 2047 CN
## 2048 CN
## 2049 CN
## 2050 CN
## 2051 CN
## 2052 CN
## 2053 CN
## 2054 CN
## 2055 CN
## 2056 CN
## 2057 CN
## 2058 CN
## 2059 CN
## 2060 CN
## 2061 CN
## 2062 CN
## 2063 CN
## 2064 CN
## 2065 CN
## 2066 CN
## 2067 CN
## 2068 CN
## 2069 CN
## 2070 CN
## 2071 CN
## 2072 CN
## 2073 CN
## 2074 CN
## 2075 CN
## 2076 CN
## 2077 CN
## 2078 CN
## 2079 CN
## 2080 CN
Hasta este punto hemos completado todas las variables, pero tenemos pendientes definir las ventas, precios y promociones realizadas para 2 productos.Antes de empezar a generar informacion aleatoria es importante definir el numero de generacion aleatoria para hacer el proceso replicable.
Si no definimos un numero especifico para este “seed”, R seleccionara una cifra por nosotros que cambia de manera aleatoria en cada proceso.
set.seed(98250)
A partir de este punto podemos definir la informacion aleatoria con la que trabajaremos. En este apartado definiremos los productos promocionados.
En cada linea del dataset, que basicamente es, una semana de un año de una tienda, definimos el estatus de si el producto ha sido promocionado (valor de 1) extrayendo de la distribución binomial que cuenta el número de cabezas en una colección de lanzamientos de monedas.
Detallando el proceso, usaremos la funcion rbinom(n, size, p) definido como random binomial.
Para cada linea de nuestro data set, definido anteriormente como n=nrow(store.df), con el objetivo de definir su promocionabilidad (0 o 1) nos basamos en la idea de un lanzamiento de moneda, donde la “cara” es 1 y define que el producto ha sido promocionado size=1.
Le añadimos una probabilidad de p=0.1 para el producto 1 y p=0.15 para el producto 2.
store.df$p1prom <- rbinom(n=nrow(store.df), size = 1, p = 0.1)
store.df$p2prom <- rbinom(n=nrow(store.df), size = 1, p = 0.1)
head(store.df)
## storeNum Year Week p1sales p2sales p1price p2price p1prom p2prom country
## 1 101 1 1 NA NA NA NA 0 0 US
## 2 101 1 2 NA NA NA NA 0 0 US
## 3 101 1 3 NA NA NA NA 1 0 US
## 4 101 1 4 NA NA NA NA 0 0 US
## 5 101 1 5 NA NA NA NA 0 1 US
## 6 101 1 6 NA NA NA NA 0 0 US
Una vez definida el estatus de promocion, definiremos los precios de cada producto.
Suponemos que cada producto se vende a uno de los cinco tipos de precio que van desde 2.19 hasta 3.19 dolares.
Para ello, egeneramos de manera aleatoria un precio para cada semana definiendo un ector con 5 precios diferentes y usando la funcion **sample(x, size, replace).Estos datos queremos que aparezcan en todas nuestras lineas, por lo que marcamos size=nrow(store.df) y los cinco precios se muestrean muchas veces, por lo que generamos el sample reemplazando los datos.
store.df$p1price <- sample(x = c(2.19, 2.29, 2.49, 2.79, 2.99),
size = nrow(store.df),
replace = TRUE)
store.df$p2price <- sample(x = c(2.19, 2.29, 2.49, 2.79, 2.99),
size = nrow(store.df),
replace = TRUE)
El ultimo paso es simular el numero de ventas para cada semana.
Calculamos las ventas en función de los precios relativos de los dos productos junto con el estado promocional de cada uno.
Las ventas de artículos están en conteos de unidades, por lo que usamos las distribuciones de Poisson para generar datos.**rpois(n, lambda), donde n es el numero de sorteos y lambda es la media de valor de las unidades por semana.
Para ello, definimos un valor para cada linea (nrow(store.df)) y la media de ventas (lambda) del producto 1 que sea superior del produto 2 (sin promocion).
tmp.sales1 <- rpois(nrow(store.df), lambda = 120)
tmp.sales2 <- rpois(nrow(store.df), lambda = 100)
Ahora escalamos esos conteos hacia arriba o hacia abajo de acuerdo con los precios relativos.
Los efectos de los precios a menudo siguen una función logarítmica en lugar de funciones lineales con log(price).
tmp.sales1 <- tmp.sales1 * log(store.df$p2price) / log(store.df$p1price)
tmp.sales2 <- tmp.sales2 * log(store.df$p1price) / log(store.df$p2price)
Por ultimo, asumimos que las ventas aumentan entre un 30-40% cuando el producto esta promocionado en tienda.
Simplemente, multiplicamos el vector de status promocional (0,1) por 0.3 y 0.4 respectivamente y multiplicamos por las ventas.
Usamos la funcion floor(), para eliminar valores fraccionarios y garantizar recuentos de enteros para ventas de unidades semanales.
store.df$p1sales <- floor(tmp.sales1 * (1 + store.df$p1prom * 0.3))
store.df$p2sales <- floor(tmp.sales1 * (1 + store.df$p2prom * 0.4))
Si queremos podemos checkear de manera aleatoria algunas filas de nuestro dataset con la funcion some().
Gracias a R, hemos creado una simulacion de datos con 20.800 valores (2080 filas y 10 columnas) utilizando un total de 22 comandos.