library(tidyverse)
Uno de los gráficos mas utilizados a la hora de generar visualizaciones son los histogramas par variables continuas. A la hora de crear tenemos que tener en cuenta los siguiente argumentos:
hist(store.df$p1sales,
main = "Product 1 Weekly Sales Frequencies, All Stores",
xlab = "Product 1 sales (Units)",
ylab = "Count",
breaks = 30,
col = "lightblue",
freq = FALSE,
xaxt = "n")
axis (side=1, at=seq(60,300,by=20))
lines(density(store.df$p1sales, bw = 10),
col = "darkred",
lwd = "2")
Los boxplot son el mejor grafico para representar distribuciones
Los boxplots representan la distribucion de manera mas compacta que un histograma. La mediana es la linea central, mientras que los percentiles 25 y 75 son los que definen la caja. Las lineas que recorre de izquierda a derecha la caja son los denominados “whiskers”, es una lina exterior que define la distancia entre los valores mas extremos no mayores a 1.5 veces el ancho de la caja.
Los puntos mas alla de los “whiskers” son outliers dibujados como circulos individuales.
En este caso los argumentos son los siguientes:
boxplot(store.df$p2sales, xlab = "Weekly sales", ylab = "P2",
main = "Weekly sales of P2, All stores",
horizontal = TRUE)
Por otro lado, los boxplot son mas utiles cuando comparas distribuciones.
Se puede llevar facilmente especificando una formula de respuesta usando la notacion de tilde (tilde notation) o (“~”).
Esta notacion separa la variable de respuesta o “response variable” (tambien conocida como variable dependiente o “dependent variable”) de la variable explicativa o “explanatory variable” (tambien conocida como “variable independiente”).
En este caso los argumentos son los siguientes:
boxplot(store.df$p2sales ~ store.df$storeNum,
horizontal = TRUE,
ylab = "Store",
xlab = "Weekly unit sales", las = 1,
main = "Weekly sales of P2, All Stores")
Otro ejemplo que podemos llevar a cabo a través de un boxplot es el siguiente;
La unica diferencia en los argumentos respecto al anteriores es;
boxplot(p2sales ~ p2prom,
data = store.df,
horizontal = TRUE,
yaxt = "n",
ylab = "P2 promoted in store?",
xlab = "Weekly sales",
main = "Weekly sales of P2 with and without promotion")
axis(side = 2, at = c(1,2), labels = c("No", "Yes"))
Los graficos Quantile-Quantile (QQ) son una buena manera de comparar los datos con una distribución de la que creemos que deberia venir.
Algunos aspectos estadisticos comunes como el coeficiente de correlacion (Pearon product-moment correlation coefficient) son interpretados bajo la asumcion de que la informacion esta distruida de una manera normal.
Un grafico QQ puede confirmar que la distribucion es normal visualizando los quantiles observados en contra o versus los quantiles que se esperarian en una distribucion normal.
Para ellos utilizaremos los siguientes argumentos:
qqnorm(store.df$p1sales)
qqline(store.df$p1sales)
La distribucion se aleja de la linea al final, lo que sugiere que la informacion no esta distribuida normal. La forma curva ascendente es típica de los datos con un sesgo positivo alto.
En este caso si estamos utilizando modelos o funcionales que se basan en distribuciones normales tendriamos que transformar nuestra informacion. normalmente en datasets de marketing un patron comun es la distribucion logaritmica.
qqnorm(log(store.df$p1sales))
qqline(log(store.df$p1sales))
En este caso los puntos estan mas cerca de la linea, indicando que la distribucion es mas consistente con la distribucion normal que la anterior sin transformar.
Este tipo de grafico muestra la proporcion acumular de los valores en nuestro dataset. Es una manera sencilla de inspeccionar la distribucion y leer valores de percentiles.
En este caso los argumentos son los siguientes:
plot(ecdf(store.df$p1sales),
main = "Cumulative distribution of P1 Weekly Sales",
ylab = "Cumulative proportion",
xlab = c("P1 weekly sales, all stores", "%90 of weeks sold <= 171 units"),
yaxt = "n")
axis(side = 2, at = seq(0, 1, by = 0.1), las = 1,
labels = paste(seq(0, 100, by=10), "%", sep = ""))
abline(h = 0.9, lty = 3)
abline(v = quantile(store.df$p1sales, pr = 0.9), lty = 3)
En este apartado veremos como resumir por un factor dentro de los datos con las funciones by() y aggregate().
Empezando con la funcion by() y su estructura by(data = DATA, INDICES = INDICES, FUN= FUNCTION). By() utiliza INDICES como una agrupacion de factores para dividir DATA en subgrupos. Luego, aplica la funcion FUN a cada subgrupo.
Por ejemplo, queremos saber la ventas medias de P1 por tienda. Nuestro DATA seria las ventas semanales para cada tienda, store.df$p1sales.
Queremos dividirlo por tienda, por lo tanto los INDICES seran store.df$storeNum.
Finalmente, utilizamos la funcion MEAN para conocer la media.
by(store.df$p1sales, store.df$storeNum, mean)
## store.df$storeNum: 101
## [1] 122.4808
## --------------------------------------------------------
## store.df$storeNum: 102
## [1] 126.6635
## --------------------------------------------------------
## store.df$storeNum: 103
## [1] 128.0288
## --------------------------------------------------------
## store.df$storeNum: 104
## [1] 123.7308
## --------------------------------------------------------
## store.df$storeNum: 105
## [1] 121.7212
## --------------------------------------------------------
## store.df$storeNum: 106
## [1] 126.1731
## --------------------------------------------------------
## store.df$storeNum: 107
## [1] 125.5962
## --------------------------------------------------------
## store.df$storeNum: 108
## [1] 125.5385
## --------------------------------------------------------
## store.df$storeNum: 109
## [1] 123.6154
## --------------------------------------------------------
## store.df$storeNum: 110
## [1] 124.0962
## --------------------------------------------------------
## store.df$storeNum: 111
## [1] 122.6154
## --------------------------------------------------------
## store.df$storeNum: 112
## [1] 121.5865
## --------------------------------------------------------
## store.df$storeNum: 113
## [1] 129.4904
## --------------------------------------------------------
## store.df$storeNum: 114
## [1] 124.2115
## --------------------------------------------------------
## store.df$storeNum: 115
## [1] 121.8846
## --------------------------------------------------------
## store.df$storeNum: 116
## [1] 127.5769
## --------------------------------------------------------
## store.df$storeNum: 117
## [1] 126.7308
## --------------------------------------------------------
## store.df$storeNum: 118
## [1] 131.3269
## --------------------------------------------------------
## store.df$storeNum: 119
## [1] 125.4808
## --------------------------------------------------------
## store.df$storeNum: 120
## [1] 121.3846
Si queremos aplicarlo en mas de un factor, utilizamos la funcion list().
by(store.df$p1sales, list(store.df$storeNum, store.df$Year), mean)
## : 101
## : 1
## [1] 120.2308
## --------------------------------------------------------
## : 102
## : 1
## [1] 121.8462
## --------------------------------------------------------
## : 103
## : 1
## [1] 125.2115
## --------------------------------------------------------
## : 104
## : 1
## [1] 120.3654
## --------------------------------------------------------
## : 105
## : 1
## [1] 122.0962
## --------------------------------------------------------
## : 106
## : 1
## [1] 124.0192
## --------------------------------------------------------
## : 107
## : 1
## [1] 123.3846
## --------------------------------------------------------
## : 108
## : 1
## [1] 126.3654
## --------------------------------------------------------
## : 109
## : 1
## [1] 122.1731
## --------------------------------------------------------
## : 110
## : 1
## [1] 124.8846
## --------------------------------------------------------
## : 111
## : 1
## [1] 123.1154
## --------------------------------------------------------
## : 112
## : 1
## [1] 125.7115
## --------------------------------------------------------
## : 113
## : 1
## [1] 134.9231
## --------------------------------------------------------
## : 114
## : 1
## [1] 121.75
## --------------------------------------------------------
## : 115
## : 1
## [1] 123.6154
## --------------------------------------------------------
## : 116
## : 1
## [1] 128.3077
## --------------------------------------------------------
## : 117
## : 1
## [1] 127.0385
## --------------------------------------------------------
## : 118
## : 1
## [1] 128.8269
## --------------------------------------------------------
## : 119
## : 1
## [1] 124.5385
## --------------------------------------------------------
## : 120
## : 1
## [1] 123.0769
## --------------------------------------------------------
## : 101
## : 2
## [1] 124.7308
## --------------------------------------------------------
## : 102
## : 2
## [1] 131.4808
## --------------------------------------------------------
## : 103
## : 2
## [1] 130.8462
## --------------------------------------------------------
## : 104
## : 2
## [1] 127.0962
## --------------------------------------------------------
## : 105
## : 2
## [1] 121.3462
## --------------------------------------------------------
## : 106
## : 2
## [1] 128.3269
## --------------------------------------------------------
## : 107
## : 2
## [1] 127.8077
## --------------------------------------------------------
## : 108
## : 2
## [1] 124.7115
## --------------------------------------------------------
## : 109
## : 2
## [1] 125.0577
## --------------------------------------------------------
## : 110
## : 2
## [1] 123.3077
## --------------------------------------------------------
## : 111
## : 2
## [1] 122.1154
## --------------------------------------------------------
## : 112
## : 2
## [1] 117.4615
## --------------------------------------------------------
## : 113
## : 2
## [1] 124.0577
## --------------------------------------------------------
## : 114
## : 2
## [1] 126.6731
## --------------------------------------------------------
## : 115
## : 2
## [1] 120.1538
## --------------------------------------------------------
## : 116
## : 2
## [1] 126.8462
## --------------------------------------------------------
## : 117
## : 2
## [1] 126.4231
## --------------------------------------------------------
## : 118
## : 2
## [1] 133.8269
## --------------------------------------------------------
## : 119
## : 2
## [1] 126.4231
## --------------------------------------------------------
## : 120
## : 2
## [1] 119.6923
Si queremos hacerlo de una manera mas efectiva, lo podemos trabajar a traves de aggregate().
p1sales.sum <- aggregate(store.df$p1sales,
by = list(country = store.df$country), sum)