Caso aplicado para la materia de Investigación de mercados II.
Al data frame importado se le dará el nombre de “datos”.
#habilitar la librería "foreign" que permite importar datos en formato de SPSS
library(foreign)
#importar archivo de SPSS
datos<- read.spss("D:/2020/INV. DE MERCADOS II/1. ANÁLISIS DE DATOS/gaseosas.sav")
## re-encoding from CP1252
datos<- as.data.frame(datos)
View(datos) #permite visualizar el data frame llamado "datos"
attach(datos) #atajo de variables
Para poder realizar análisis multivariado, es necesario que exista normalidad multivariante, por eso, es muy importante identificar si las variables métricas siguen o no dicha distribución normal multivariante. En caso de que se detecte outliers, el investigador tiene la tarea de corregirlos (si fuese un error de “dedo” en la base de datos), eliminarlos o mantenerlos en el data frame (si él considera que sí es necesario mantener los outliers en la muestra).
Las hipótesis estadísticas son las siguientes:
H0: Existe normalidad multivariante (no existen outliers multivariantes)
H1: No existe normalidad multivariante (existen outliers multivariantes)
Se trabaja con un nivel de confianza del 95%, lo que implica que alfa es igual al 5% (0,05). Para realizar el test se utilizará la librería “MVN”.
library(MVN)
## Registered S3 method overwritten by 'GGally':
## method from
## +.gg ggplot2
## sROC 0.1-2 loaded
mvn(datos[,(7:9)],multivariateOutlierMethod = "quan") #las variables métricas están desde la columna 7 a la 9 en el data frame,
## $multivariateNormality
## Test Statistic p value Result
## 1 Mardia Skewness 55.2713071466503 2.81011524674752e-08 NO
## 2 Mardia Kurtosis 2.45884686808506 0.0139384056243648 NO
## 3 MVN <NA> <NA> NO
##
## $univariateNormality
## Test Variable Statistic p value Normality
## 1 Shapiro-Wilk edad 0.5008 <0.001 NO
## 2 Shapiro-Wilk cantidad_mes 0.8407 0.0048 NO
## 3 Shapiro-Wilk calificación_cocacola 0.9056 0.0615 YES
##
## $Descriptives
## n Mean Std.Dev Median Min Max 25th 75th
## edad 19 41.947368 39.931154 30 17 200 26.5 40.5
## cantidad_mes 19 12.368421 10.393430 8 1 30 4.5 22.5
## calificación_cocacola 19 6.947368 2.592161 8 2 10 5.0 9.0
## Skew Kurtosis
## edad 3.2206014 9.946273
## cantidad_mes 0.5180473 -1.494364
## calificación_cocacola -0.4892244 -1.222370
Puesto que el p value es menor a alfa, se rechaza la H0, por lo tanto, no existe normalidad multivariante. Es decir, existen outliers en el data frame. Para identificarlos, en la gráfica, se detecta que el outlier multivariante es el caso 7 (el encuestado número 7 o el id=7). Revisando el data frame, el encuestado número 7 tiene 200 años, mas no se sabe si fue un “error de dedo” y revisando la encuesta, se registró con 200 años, por lo tanto, se decide eliminar el caso (se procede a eliminar el id=7, o sea, se elimina al encuestado número 7 del data frame). Para eliminar el caso, se procede de la siguiente manera:
datos<- datos[-c(7),]
Si hubiera sido el caso, de que en vez de 200 años, el encuestado hubiese tenido 20 años, y se quisiera corregir el dato, simplemente se tendría que ocupar el comando fix(datos) y corregir manualmente el dato.
fix(datos)
Para hacer análisis multivariante es necesario que no existan datos perdidos en el data frame, en caso de que hubiesen, es necesario imputarlos (sustitutirlos). Antes de imputar, es necesario aplicar las “pruebas de normalidad” univariantes, esto con el fin de detectar si una variable métricas sigue o no sigue una distribución normal. Las hipótesis estadísticas son:
H0: variable normal
H1: variable no normal
Se trabaja con 95% de confianza, por lo que alfa es 0,05. Aplique el siguiente comando, donde encontrará un resumen de la normalidad (es el mismo comando aplicado en el ejercicio 2) y de los estadísticos descriptivos:
mvn(datos[,(7:9)])
## $multivariateNormality
## Test Statistic p value Result
## 1 Mardia Skewness 9.09569254446155 0.523046764655124 YES
## 2 Mardia Kurtosis -1.25927616289922 0.207930600010357 YES
## 3 MVN <NA> <NA> YES
##
## $univariateNormality
## Test Variable Statistic p value Normality
## 1 Shapiro-Wilk edad 0.9364 0.2516 YES
## 2 Shapiro-Wilk cantidad_mes 0.8514 0.0089 NO
## 3 Shapiro-Wilk calificación_cocacola 0.9163 0.1113 YES
##
## $Descriptives
## n Mean Std.Dev Median Min Max 25th 75th
## edad 18 33.166667 11.713491 30.0 17 60 25.75 39.25
## cantidad_mes 18 12.888889 10.436863 8.0 1 30 5.00 23.25
## calificación_cocacola 18 6.833333 2.617812 7.5 2 10 5.00 9.00
## Skew Kurtosis
## edad 0.7410818 -0.2923191
## cantidad_mes 0.4387926 -1.5747010
## calificación_cocacola -0.4046474 -1.2983479
La variable “cantidad_mes” no es normal (su p value es menor a alfa) y la “edad” y “calificación_cocacola” sí son normales (sus p values son mayores a alfa).
¿Por qué se hacen las pruebas de normalidad univariantes anteriores?
Pues, sabiendo qué distribución tiene una variable, ya podemos imputar valores perdidos (NA) en base al siguiente criterio:
Variable normal: imputar con la media aritmética muestral
Variable no normal: imputar con la mediana muestral
Revisando los resultados del comando anterior (el comando donde se midió la normalidad), podemos ver lo siguiente:
Media aritmética de la edad es= 33,17 años
Media aritmética de la calificación a coca cola es= 6,83 puntos
Mediana de la cantidad mes= 8 gaseosas
Para identificar qué variables métricas sí tienen valores perdidos (NA`s) utilice el siguiente comando:
colSums(is.na(datos))
## id sexo estado_civil
## 0 2 1
## gaseosa_favorita lugar_compra frecuencia_compra
## 0 0 0
## edad cantidad_mes calificación_cocacola
## 1 1 1
Se aprecia que cada variable métrica, en este caso, tiene 1 dato perdido.
Para imputar los valores perdidos (NA`s) de las variables con distribución normal a través de su media aritmética se procede de la siguiente manera:
#Imputar con la media aritmética
datos$edad[is.na(datos$edad)]<- mean(na.omit(datos$edad))
datos$calificación_cocacola[is.na(datos$calificación_cocacola)]<-mean(na.omit(datos$calificación_cocacola))
Para imputar los valores perdidos (NA`s) en variables métricas con distribución no normal a través de su mediana, utilice el comando:
#Imputar con la mediana
datos$cantidad_mes[is.na(datos$cantidad_mes)]<- mean(na.omit(datos$cantidad_mes))
En el caso de las variables categóricas, la imputación de valores perdidos NA`s se realiza con la moda de los datos. Previamente se identifican qué variables presentan valores perdidos, se corre el comando:
colSums(is.na(datos))
## id sexo estado_civil
## 0 2 1
## gaseosa_favorita lugar_compra frecuencia_compra
## 0 0 0
## edad cantidad_mes calificación_cocacola
## 0 0 0
La variable “sexo” tiene 2 valores perdidos y el “estado civil” tiene 1.
Para identificar cuál es la moda en cada variable, ejecute el comando “summary” y la frecuencia más repetida es la moda.
summary(sexo)
## femenino masculino NA's
## 12 6 2
summary(estado_civil)
## soltero casado viudo divorciado concubinato NA's
## 9 3 1 3 3 1
La moda del sexo es “femenino”; la moda del estado civil es “soltero”. Por lo que se procederá a imputar los datos perdidos.
Cree la siguiente función:
imputarmoda <- function(x) {imputarx <- unique(x)
imputarx[which.max(tabulate(match(x, imputarx)))]} #es una sola línea de comando (dar run en la primera línea)
Ahora, impute los datos perdidos en sus variables categóricas de la siguiente manera:
#Imputación de valores perdidos en variables categóricas
datos$sexo[is.na(datos$sexo)]<- imputarmoda(na.omit(datos$sexo))
datos$estado_civil[is.na(datos$estado_civil)]<- imputarmoda(na.omit(datos$estado_civil))
Finalizado el proceso de imputación, ejecute nuevamente el siguiente comando:
colSums(is.na(datos))
## id sexo estado_civil
## 0 0 0
## gaseosa_favorita lugar_compra frecuencia_compra
## 0 0 0
## edad cantidad_mes calificación_cocacola
## 0 0 0
Listo! Ya no existen datos perdidos.
La nueva base de datos (data frame) que hemos trabajado, es decir, la base de datos sin outliers ni valores perdidos, que ahora llamamos data frame “limpio”, es necesario exportarla en formato SPSS (.sav) para poder hacer análisis multivariantes en futuras oportunidades y tener un archivo con los resultados generados. Para exportar el data frame trabajado porceda de la siguiente manera:
#Utilizamos la librería "haven"
library(haven)
write_sav(datos, "D:/2020/INV. DE MERCADOS II/1. ANÁLISIS DE DATOS/datos_limpios.sav" )
La sintaxis del código anterior funciona de la siguiente manera:
datos: es el nombre del data frame trabajado en este ejercicio.
D:/2020/INV. DE MERCADOS II/1. ANÁLISIS DE DATOS/: aquí debes especificar dónde (la ruta) guardarás tu archivo exportado, en mi caso, lo guardo en la unidad D, carpeta 2020, y dentro de ella en la carpeta Inv. de mercados II y dentro de ella en la carpeta 1. Análisis de datos.
datos_limpios.sav: es el nombre que le doy a mi base de datos en SPSS exportado; no olvides colocar la extensión .sav
Puedes obtener todos los estadísticos descriptivos básicos utilizando el siguiente código:
summary(datos)
## id sexo estado_civil gaseosa_favorita
## Min. : 1.00 femenino :13 soltero :9 coca_cola:9
## 1st Qu.: 5.50 masculino: 6 casado :3 pepsi :4
## Median :11.00 viudo :1 pop :2
## Mean :10.68 divorciado :3 mendocina:3
## 3rd Qu.:15.50 concubinato:3 otra :1
## Max. :20.00
## lugar_compra frecuencia_compra edad cantidad_mes
## ambulante :4 diaria :8 Min. :17.00 Min. : 1.00
## tienda_barrio:7 semanal :7 1st Qu.:26.50 1st Qu.: 5.00
## supermercado :3 ocasional:2 Median :30.00 Median : 8.00
## mercado :2 otra :2 Mean :33.17 Mean :12.89
## otro :3 3rd Qu.:38.50 3rd Qu.:22.50
## Max. :60.00 Max. :30.00
## calificación_cocacola
## Min. : 2.000
## 1st Qu.: 5.000
## Median : 7.000
## Mean : 6.833
## 3rd Qu.: 9.000
## Max. :10.000
Se muestra las frecuencias de las variables categóricas y en el caso de las variables métricas, un resumen de los estadísticos básicos.