EJERCICIO APLICADO A LA INVESTIGACIÓN DE MERCADOS

Caso aplicado para la materia de Investigación de mercados II.

Preguntas

  1. Importe un archivo .sav (SPSS) y visualice el data frame
  2. Realice al análisis multivariante de la normalidad, identifique los outliers y elimínelos/corríjalos (o manténgalos - justificando previamente)
  3. Impute los datos perdidos de las variables métricas
  4. Impute los datos perdidos de las variables categóricas
  5. Exporte el data frame “limpio” a un nuevo archivo de SPSS
  6. Obtenga los estadísticos descriptivos básicos unidimensionales para todas las variables

Solución ejercicio 1: Importar un archivo .sav (SPSS) y visualizar el data frame

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

Solución ejercicio 2: Análisis multivariante de la normalidad

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)

Solución ejercicio 3: Imputar datos perdidos de las variables métricas

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

Solución ejercicio 4: Imputar datos perdidos en las variables categóricas

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.

Solución ejercicio 5: Exportar el “data frame limpio” en formato SPSS

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

Solución ejercicio 6: Generación de estadísticas descriptivas univariantes

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.