Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Méndez Suárez, es doctor en ciencias empresariales por la Universidad Autónoma de Madrid (UAM),
MBA por la Universidad de Houston y licenciado en ciencias empresariales por la UAM.
Es profesor en ESIC Business & Marketing School en cursos de grado en áreas de investigación de mercados y
métodos cuantitativos, y de postgrado en áreas de marketing science y métodos cuantitativos. Profesor
asociado del departamento de finanzas e investigación comercial en la UAM. Autor de numerosos artículos de
divulgación científica y ponente en varios congresos internacionales.
Ha colaborado como consultor en áreas relacionadas con la aplicación de métodos cuantitativos a la gestión
empresarial, tanto para empresas nacionales como internacionales.
© ESIC EDITORIAL
Avda. de Valdenigrales, s/n. 28223 Pozuelo de Alarcón (Madrid)
Tel. 91 452 41 00
www.esic.edu/editorial
ISBN: 978-84-17513-04-7
Cubierta: Gerardo Domínguez
Fotocomposición y Fotomecánica: Nueva Maqueta
Doña Mencía, 39
28011 Madrid
Queda prohibida toda reproducción de la obra o partes de la misma por cualquier medio sin
la preceptiva autorización previa.
PRÓLOGO
Introducción
Cuestionario y datos empleados
Sobre R y RStudio
Sobre la curva de aprendizaje de R
Aplicaciones académicas y profesionales
Agradecimientos
4.1. Introducción
4.2. Análisis factorial, análisis de componentes principales
4.2.1. Análisis factorial y correlación
4.3. Realización del análisis factorial
4.4. Análisis factorial rotado
4.5. Representación gráfica del análisis factorial
4.6. Análisis individual de cada centro
5.1. Introducción
5.2. Análisis cluster o de conglomerado
5.2.1. Cluster jerárquico
5.2.2. K means cluster
5.3. Análisis exploratorio, cluster jerárquico
5.4. Análisis con K means cluster
5.5. Perfil en base a las medias de los resultados
5.6. Análisis gráfico de los resultados
5.7. Mapa factorial con los grupos de cada cluster
6.1. Introducción
6.2. Regresión lineal múltiple
6.3. Satisfacción global
6.3.1. Análisis exploratorio
6.3.2. Análisis por pasos usando el criterio de Akaike
6.3.3. Importancia relativa de cada variable
6.3.4. Regresión con los factores
BIBLIOGRAFÍA
Introducción
Este proceso ha sido enriquecedor a nivel personal y académico, dado que planteaba
nuevos retos y nuevas formas de afrontar las técnicas más comunes usadas en Investigación
de Mercados, las cuales han conducido a nuevas formas de exponer los resultados y que
permiten centrar un mayor esfuerzo en el análisis y menor en la herramienta, dada la
capacidad de automatización de R.
Este libro no es un libro de investigación de mercados al uso, dado que en la mayor parte
de los casos solo ilustra el cómo aplicar las técnicas y no profundiza en sus fundamentos,
para lo cual recomendamos las excelentes aportaciones de Grande & Abascal (2014) o
Malhotra (2004). Tampoco es un libro específicamente creado para aprender R desde el
principio, para lo cual recomendamos los numerosos recursos, tanto documentales como
audiovisuales, que se pueden encontrar en Internet; no obstante, se ha intentado que el código
que aparece en el libro se pueda entender de la forma más clara posible, aun a costa de ser
redundante en algunos casos.
Durante varios cursos, nuestros alumnos (a los que queremos agradecer su contribución)
que cursaban la asignatura de Investigación de Mercados en ESIC Business & Marketing
School, fueron los encargados de realizar la encuesta en los supermercados de tres de las
grandes cadenas que operan en España. Este trabajo permitió disponer de una base de datos
de 2.040 registros:
Total
El hecho de que los alumnos realizaran la encuesta in situ tenía varios objetivos: El
primero, que pudieran experimentar y conocer cómo se realiza el trabajo de campo. Por otro
lado, que se familiarizaran con las preguntas del cuestionario y lo conocieran en profundidad,
para que posteriormente pudieran realizar un mejor análisis. Y por último, que se sintieran
partícipes de poder contribuir a crear una base de datos, con una muestra suficientemente
grande, que se pudiera usar en clase para comprender las diversas técnicas cuantitativas
usadas en Investigación de Mercados.
Sobre R y RStudio
El programa R2 contiene por sí mismo todas capacidades de análisis estadístico y la
mayoría de los métodos estadísticos más comunes, sin embargo es un entorno de trabajo poco
amigable; por consiguiente, recomendamos instalar primero R y una vez instalado instalar el
programa RStudio,3 que proporciona tanto un entorno de trabajo más amigable como algunos
menús y capacidades y mejoras visuales que facilitan mucho el uso de R.
Estos dos programas tienen una ventaja fundamental, tanto para el usuario particular como
para las empresas o universidades, y es la completa gratuidad del software, que es libre y de
código abierto. Este hecho es clave especialmente en entornos universitarios (donde cada vez
su penetración es mayor), dado que es un software que, aparte del ahorro económico, permite
evitar la dependencia por parte del alumnado de lugares físicos, como salas de ordenadores,
para poder realizar sus tareas y prácticas académicas.
Agradecimientos
Queremos aprovechar estas lineas para mostrar nuestro agradecimiento a la profesora M.ª
Jesús Merino, por su confianza y apoyo durante estos años; a Macarena Estevez, por su
generosidad y paciencia a la hora de responder algunas de mis preguntas, y al profesor
Ildefonso Grande, por sus valiosas opiniones sobre el manuscrito inicial.
Por otro lado, también queremos agradecer a la comunidad de usuarios de R por los
fantásticos recursos disponibles en Internet, especialmente a los miembros de Stackoverflow,4
sin los que la realización de este texto habría sido imposible, y a los creadores de la librería
de R: bookdown [Yihui Xie (2016)], que ha sido utilizada para poder realizar íntegramente
este texto en RStudio.
• Conocer el perfil de los clientes en función de sus opiniones sobre el centro, que se
alcanzaría a través de métodos descriptivos, tanto univariantes como bivariantes, y que
serán cubiertos en los capítulos 2 y 3.
• Extraer los factores más importantes para los clientes y elaborar un ranking de
importancia tanto para cada factor, como para las variables clave de cada uno de ellos.
Estas técnicas conocidas como análisis factorial se estudian en el capítulo 4.
• Clasificar a los clientes en función de sus opiniones sobre los centros, está técnica
conocida como análisis de conglomerados o cluster se estudia en el capítulo 5.
• El cuarto subojetivo trataba de explicar las variables clave que afectan tanto al nivel de
satisfacción con el centro como a la compra media realizada, y se tratarán a través de
métodos de regresión múltiple en el capítulo 6.
El hecho de comparar a tres de las grandes cadenas de distribución que operan en España:
Dia, Carrefour y Mercadona, ha enriquecido enormemente estos objetivos dado que no solo
se puede analizar a cada una de las cadenas individualmente, sino que, además, se pueden
analizar en su conjunto obteniendo de esta forma información sobre las diferencias y
similitudes de cada una de ellas.
• El bloque 1 recoge varios subgrupos y se incluyen preguntas de las que se espera que
las respuestas estén bien correlacionadas entre ellas (teniendo en mente el análisis
factorial y de regresión). Este bloque incluye preguntas que usan una escala Likert de 1
a 10, donde 1 representa totalmente insatisfecho y 10 totalmente satisfecho, y aunque la
escala es cualitativa, dado que se asocia la percepción a un valor numérico, podrá ser
tratado como tal en el análisis estadístico.
• En el bloque 2 se recoge información que será útil para la clasificación y comparación
entre los distintos grupos. Incluye variables por intervalos, como puede ser la edad, que
1. Edad, esta variable es una pregunta filtro, es decir, si los encuestados son menores se
finaliza la encuesta de acuerdo al código ético de la asociación que agrupa a nivel
internacional a las compañías de estudios de mercado: ESOMAR.6 La variable se
codifica de la siguiente forma:
C.1. EDAD
– 17 años o menos Fin de la encuesta
– 18-24 años 1
– 25-34 años 2
– 35-44 años 3
– 45-54 años 4
– 55-64 años 5
– Más de 64 6
2. Sexo
C.2. SEXO
– Hombre 1
– Mujer 2
Una vez clicado, nos aparece una nueva pantalla, donde elegiremos New Directory:
Al clicar, pasamos a una nueva pantalla donde hemos de clicar Empty Project:
El primer paso que daremos antes de comenzar el análisis es el de cargar las librerías
necesarias (caso de que estas no se hayan instalado con anterioridad hemos de instalarlas
mediante install.packages(‘nombre_de_la_librería’)). Hemos de tener en cuenta que para R, los
símbolos “” y ‘’ se pueden usar indistintamente para indicar que en su interior introducimos
una cadena de texto.
Para la organización y transformación de las distintas variables necesitaremos la librería
7
dplyr. Para la realización de los gráficos usaremos la librería ggplot2, Wickham (2009), y
8
scales para, en algunos casos, poder dar un formato mejorado a los ejes de estos. La librería
papeR, Hofner (2017), nos servirá para poder dar un formato mejorado a los resúmenes de las
variables. Hemos de ejecutar el código para cargar las librerías en memoria:
A lo largo del texto, cuando usemos algún comando relacionado con alguna librería
externa a R base, en algunos casos lo precederemos con el nombre de la librería (este paso no
es necesario, en la mayoría de los casos, pero es clarificador a la hora de saber si el comando
usado es de R base, o corresponde a alguna librería, mejorando la legibilidad del código), por
ejemplo para realizar un gráfico, al usar el comando ggplot de la librería ggplot2 podríamos
escribirlo como: ggplot2::ggplot().
Una vez cargadas las librerías pasaremos a cargar los datos de nuestra encuesta, el nombre
del archivo es survey_base, (hemos de ser cuidadosos con los nombres, dado que R discrimina
[1] “data.frame”
En el código anterior se puede observar que aparece el carácter «#»; este carácter especial
le indica a R que el texto que figura a continuación no sea interpretado como código y que
aparezca tal cual está escrito, generalmente se utiliza para poner notas o aclaraciones dentro
del código.
Una vez creado el objeto survey_base, para tener una idea de su contenido podemos acceder
a él usando corchetes; en este caso, el valor antes de la coma representa filas y el valor
después de la coma columnas. Para ello usaremos: survey_base[ de la fila (:) a la fila, de la
columna (:) a la columna]. Por ejemplo, para mostrar las 10 primeras filas y las 5 primeras
columnas:
El siguiente paso será el de sustituir los valores perdidos por su mediana. Para ello
usaremos el comando lapply() que le indica a R que aplique a todas y cada una de las
columnas de nuestro «data.frame» la función ifelse(), representada por function(x) y similar a
la función de EXCEL si(condición; valor si verdadero; valor si falso), en este caso:
ifelse(is.na(x), as.integer(median(x, na.rm = TRUE)), x) nuestra condición es que si un valor es
perdido is.na(x), entonces lo sustituiremos por el valor entero de la mediana, as.integer
(median(x, na.rm = TRUE)), y caso de que no lo sea, lo dejaremos tal cual, x. El hecho de añadir
al nombre de la nueva variable creada los dos corchetes survey_base[] es para asegurarnos de
que después de ejecutar el comando R nos devuelve un «data.frame». Una vez aplicada la
función, volvemos a mostrar el resumen de los datos para comprobar que solo quedan las
variables de interés y ya no hay valores perdidos.
Observations: 2,040
Variables: 33
$ Establecimiento <fctr> dia, dia, dia, dia, mercadona, dia, mercado…
$ Pc1.Actitud <int> 8, 8, 9, 6, 8, 8, 9, 8, 6, 5, 8, 8, 8, 2, 10…
$ Pc1.Atencion <int> 8, 9, 7, 5, 8, 5, 9, 8, 5, 5, 8, 7, 7, 4, 9,…
$ Pc1.AtencRapida <int> 8, 10, 6, 3, 7, 8, 9, 7, 4, 7, 7, 7, 7, 1, 9…
$ Pc1.Servicio <int> 9, 10, 7, 5, 5, 8, 9, 8, 6, 6, 8, 9, 9, 8, 1…
$ Pd1.Asesora <int> 8, 9, 5, 5, 5, 8, 9, 7, 4, 7, 8, 7, 7, 5, 9,…
$ Pd1.InfoCompleta <int> 7, 9, 7, 6, 5, 8, 9, 8, 5, 6, 8, 6, 6, 4, 8,…
$ Pe1.Experienc <int> 8, 9, 7, 4, 5, 6, 9, 6, 7, 6, 7, 8, 8, 9, 9,…
$ Pe1.Consultas <int> 8, 10, 7, 4, 5, 6, 9, 7, 6, 6, 7, 7, 7, 5, 9…
$ Pe1.ConocGama <int> 9, 9, 8, 5, 5, 7, 8, 7, 7, 5, 8, 7, 7, 8, 9,…
$ Pe1.ResolConsulta <int> 10, 9, 8, 5, 5, 7, 8, 9, 6, 5, 7, 7, 7, 7, 8…
$ Pe1.Interes <int> 7, 10, 7, 5, 5, 6, 9, 9, 6, 6, 7, 7, 7, 4, 1…
$ Pe1.EsperaAtenc <int> 9, 8, 7, 5, 6, 6, 7, 7, 9, 8, 9, 7, 7, 4, 7,…
Observations: 2,040
Variables: 5
$ C1.Edad <fctr> mas de 64, de 55 a 64, de 35 a 44, de 45 a 54,…
$ C2.Sexo <fctr> mujer, mujer, hombre, hombre, mujer, mujer, ho…
Para comparar los valores de ingresos y edad realizaremos una tabla cruzada, pero antes
hemos de realizar una pequeña transformación en los datos, dado que R al leer el archivo
organiza automáticamente por orden alfabético los valores de los factores, y en nuestro caso
este orden no corresponde a los valores tal y como deseamos mostrarlos, como podemos
comprobar usando el comando levels():
En el gráfico anterior hemos visto las edades de los encuestados, pero dado que tenemos
información de las tres diferentes cadenas, podemos visualizar la misma información pero
teniendo en cuenta a qué cadena corresponde cada grupo. En este caso añadiremos la línea de
código: facet_grid(Establecimiento ~ .) + para indicarle a ggplot que cree el mismo gráfico de
edades en una columna, pero separando la información para cada Establecimiento en una fila
distinta:
Vemos, tal y como hicimos con la tabla, que las proporciones son razonables.
2.1. Introducción.
2.2. Top Two Box (T2B).
2.3. Net Promoter Score (NPS).
Una vez cargadas las librerías necesarias procedemos a leer los datos del archivo y
cargarlos en memoria añadiéndoselos a la variable survey:
Una vez creadas las tres variables, una para cada establecimiento, volveremos a usar dplyr
para seleccionar solo las variables que contienen P, es decir, las respuestas a las preguntas
sobre la calidad del centro y las asignaremos a la nueva variable que contiene el nombre del
establecimiento seguido de _P. Repetimos el proceso para los tres supermercados:
Este proceso de crear tres variables lo realizamos dado que tenemos información de los
tres centros, y aparte de obtener los datos a nivel individual, podremos comparar los
resultados de cada centro. El siguiente paso consiste en averiguar cuántos valores hay para
cada variable en cada uno de los intervalos que hemos decidido usar; para ello, en principio
crearemos una nueva variable donde almacenaremos los datos de cada intervalo. El tipo de
variable que usaremos es list() (lista), estas variables actúan como contenedores donde
podemos poner datos heterogéneos y acceder a ellos usando el nombre de la variable seguido
de un corchete [], indicando en su interior un valor numérico correspondiente a la posición de
cada uno de los valores de la lista.
El primer paso es crear la lista dia_T2B (si no la creamos inicialmente, a la hora de asignar
los datos, R nos devolverá un error indicando que ese objeto no existe):
Una vez creada la lista asignaremos cada uno de los valores, el primero dia_T2B[1]
mediante: data.frame(apply(dia_P, 2, function(x) sum(x >= 8 & x <= 10))). Este comando lo iremos
La variable dia_T2B nos indicará valores absolutos; para pasarlos a valores relativos,
volvemos a usar la función apply. De dentro a fuera: aplicamos a todas y cada una de las filas
1, de nuestra variable dia_T2B, la función function(x), dada por x/sum(x), que lo que hace es
dividir todos y cada uno de los valores de la fila por la suma de cada fila. Usaremos t() para
trasponer la tabla de datos obtenidos, es decir, pasar filas a columnas (dado que la función t()
al transponer transforma los datos a formato matriz, hemos de indicarle al principio del
comando data.frame para que el resultado esté en la forma de data.frame). Este resultado lo
multiplicamos por 100 para obtener el porcentaje:
Una vez realizados los cálculos ponemos nombre a cada una de las columnas obtenidas
con colnames(dia_T2B) y mostramos los resultados, print(head (dia_T2B), digits = 3), print() indica
mostrar en pantalla el contenido de las primeras filas de nuestra variable y usando 3 dígitos
significativos digits = 3:
Acto seguido transformaremos la forma de los datos para poder realizar los gráficos en
ggplot. Para ello crearemos una nueva variable: dia_T2B_melt usando el comando melt de la
librería reshape para traspasar la información de las columnas a las filas. El comando:
reshape2::melt(subset(dia_T2B, select = -centro), id.vars = ‘variables’) le indica al programa que
use como data.frame los datos de dia_T2B, al usar el comando subset() dentro de la fuente de
datos, le indicamos que seleccione todo menos el nombre del centro select = -centro (en este
caso, el comando select =, al estar dentro de subset() corresponde a R base). El valor de id.vars
= ‘variables‘ le indica a reshape2::melt() la variable que identifica los datos, en nuestro caso el
nombre de las preguntas realizadas en el cuestionario. A través de head() podemos ver el
encabezamiento de los datos generados y mediante tail() el final de estos:
El primer comando theme() indica que la leyenda esté en la posición inferior legend.position
= “bottom” y que su dirección sea horizontal: legend. direction = “horizontal”, el resto de
comandos theme() sirven para dar formato a los títulos de la leyenda y de los ejes, en nuestro
caso al incluir = element_blank() indicamos que no queremos que aparezcan esos títulos. El
valor de ggtitle() para dar el título al gráfico. El valor de guides(fill = guide_legend(reverse=
TRUE)) sirve para que la leyenda vaya del menor al mayor valor, y coord_flip() para que los
valores del eje horizontal pasen al vertical, y viceversa, una vez completado el gráfico:
Una vez ordenados creamos el gráfico. La configuración es igual a los anteriores, excepto
el comando facet_grid(. ~ centro), que le indica a ggplot que queremos que separe el gráfico por
columnas . ~ y que en cada una de ellas ponga los datos de cada uno de los establecimientos
centro:
La metodología de Net Promoter Score fue desarrollada por Reichheld (2003) para medir
Var1
1 1 0.023
2 2 0.043
3 3 0.076
4 4 0.095
5 5 0.203
6 6 0.184
7 7 0.184
8 8 0.118
9 9 0.047
10 10 0.022
Podemos ver que R ha asignado automáticamente a las posibles respuestas el nombre Var1
y a las proporciones el nombre Freq. Seguiremos usando esta nomenclatura, pero antes hemos
de hacer un pequeño ajuste, dado que los valores de las posibles respuestas han sido
transformados a factor. Tal y como podemos ver a través del comando str( ) que nos muestra
la estructura del data.frame creado:
Para transformar este dato en un número entero y poder usarlo para filtrar los resultados
usamos el comando as.integer( ) específicamente para la variable dia_P_prop$Var1:
Una vez realizado el cambio hallaremos el NPS para la cadena Dia, mediante la suma de
las proporciones de la variable dia_P_prop$Freq que cumplen la condición [dia_P_prop$Var1 >= 9],
y a este valor le restaremos la suma de las proporciones que cumplen la condición
[dia_P_prop$Var1 <= 6]. A continuación mostramos el valor llamando a la variable dia_nps:
[1] -0.5577191
Podemos observar que el valor de NPS = –0.5577191 es negativo, lo que nos indicaría que
existe una mayor proporción de Detractores que de Promotores.
Una vez calculado el NPS, añadiremos una nueva variable a dia_P_prop a la que llamaremos
dia_P_prop$color para poder usarla al crear el gráfico. En este caso usamos el comando ifelse(),
para los usuarios acostumbrados a EXCEL este comando es similar a la función =si(condición;
verdadero; falso). Para usarlo, primero establecemos una condición lógica dia_P_prop$Var1 <= 6,
si esta es cierta asignamos a la variable dia_P_prop$color el valor Detractor; si es falso,
comprobamos si cumple la siguiente condición lógica: dia_P_prop$Var1 <= 8; si la cumple le
asignamos el valor Pasivo, y por último, si no cumple ninguna de las condiciones anteriores le
asignaremos el valor Promotor y visualizamos el resultado:
A continuación realizaremos el gráfico donde podremos visualizar los resultados. Para ello
le indicamos a ggplot que use la información de dia_P_prop, para el eje horizontal el valor de
Var1 pero convertido en factor o variable nominal, en el eje vertical los valores de frecuencia
dados por Freq, y que use la clasificación creada como color para identificar a cada grupo.
Por otro lado, para indicar el color de cada uno de los valores usamos scale_fill_manual( ) y
le pasamos a través de values = el vector con los colores que queremos que tenga cada grupo,
en nuestro caso rojo para los Detractores, amarillo para los Pasivos y verde para los
Promotores.
Por fin, en el título del gráfico a través del comando paste0() le indicamos que incluya el
resultado del índice NPS:
Una vez realizado el gráfico, repetiremos el proceso para el resto de los centros:
Podemos comprobar que el único NPS positivo es el de Mercadona; aunque sea cercano a
0, nos indicaría que en términos de Satisfacción global podríamos considerar que hay un
mayor número de Promotores que de Detractores.
No obstante, para poder tener perspectiva crearemos un gráfico en el que podamos
comparar los tres resultados. Pero antes, para poder incluir en el título del gráfico el valor del
NPS de cada centro, añadiremos al data.frame que representa la proporción de cada centro una
nueva variable que contendrá el nombre del centro y el NPS. Lo realizaremos mediante la
función paste0:
En este caso añadimos al gráfico el comando facet_wrap(~ centro, ncol = 1) para indicar que
se cree un gráfico para cada centro ~ centro y que se dispongan en una única columna ncol = 1:
3.1. Introducción.
3.2. Cálculo de las medias de las respuestas.
3.3. Comparación similitud de las respuestas por grupos.
3.4. Correlación.
Una vez cargadas las librerías introducimos los datos y creamos tres variables distintas,
una para cada supermercado. Por ejemplo, para dia <- usamos el comando dplyr::filter(),
indicando en primer lugar el data.frame del que queremos obtener los datos, en nuestro caso
survey, y en segundo lugar la columna mediante la cual queremos filtrar, en nuestro caso
Establecimiento; a continuación usamos ==, que se puede interpretar como «igual a», para
indicar que queremos elegir solo los datos que corresponden a dia, lo que indicamos poniendo
dia entre comillas: ‘dia’ para pasar su valor como cadena de texto.
El siguiente paso será nombrar cada una de las columnas de nuestro data.frame a través de
setNames(), donde en primer lugar figura el nombre del data.frame que queremos usar, en
segundo lugar a través de c(levels(medias$Establecimiento) obtendremos los nombres dados a
cada establecimiento cuando creamos la variable survey$Establecimiento; hemos de recordar que
el nuevo data.frame creado como medias hereda las propiedades de su predecesor survey usado
para crearle.
Por último, a través del comando dplyr::arrange() ordenamos las columnas de
medias_establecimiento de forma descendente en función del valor de la columna mercadona,
desc(mercadona):
Una vez realizada la transformación realizamos el gráfico para ver la comparativa de las
medias para cada centro. Dentro de aes() usamos reorder(preguntas, value) para ordenar la
media de las respuestas de mayor a menor. Los comandos geom_line() y geom_point() servirán
para añadir las lineas de separación en el eje y dar puntos a cada valor del gráfico:
V1 variables
7.211648 Pc1.Actitud
6.779830 Pc1.Atencion
6.863636 Pc1.AtencRapida
6.978693 Pc1.Servicio
En esta sección ilustraremos los métodos para comprobar si hay evidencia estadística de
diferencia entre las respuestas del cuestionario. Cuando contamos con variables como las
dadas a las preguntas de valoración podemos tratarlas como variables cuantitativas, dado que
su escala va de 1 a 10, aunque en realidad sean variables cualitativas; por ejemplo, con el
grado de satisfacción, este va desde «totalmente insatisfecho» a «totalmente satisfecho».
Dada la naturaleza de esta variable podremos medir si existe diferencia usando las medias de
las respuestas o bien si la tomamos como cualitativa la diferencia entre las proporciones de
las respuestas a cada valoración.
Para comprender los fundamentos teóricos tanto del test ANOVA como del Chi cuadrado,
se recomienda Grande & Abascal (2014).
3.3.1. ANOVA
Para realizar el análisis ANOVA, en primer lugar crearemos un objeto del tipo «modelo»
que contendrá el análisis; para ello usaremos el comando aov() incluyendo las variables que
queremos comparar, en nuestro caso actitud de los empleados y su valoración para cada
establecimiento; esta información se incorpora al análisis a través de: Pc1.Actitud ~
Establecimiento, el símbolo ~ le indica al programa que compare las medias de cada
establecimiento para la variable actitud. El nombre del data.frame que contiene las variables se
incorpora al final a través de survey. A continuación a través del comando model.tables()
indicamos al programa que queremos que nos indique las medias de respuestas a la variable
actitud para cada establecimiento y que obtenga esta información del modelo creado, en
nuestro caso survey_Pc1_Estab_medias. A través de print() volcamos la información, y con digits =
2 mostraremos tan solo los 2 primeros dígitos significativos para el resultado:
El valor en el que tenemos que fijarnos es el que está bajo la columna Pr(>F), que en
nuestro caso es de <2e-16 y está seguido por ***. La hipótesis inicial H0 es que las medias no
son distintas y solo estaremos dispuestos a rechazarla por la hipótesis alternativa H1 de que
las medias son distintas si tenemos evidencia estadística clara. Típicamente se rechaza H0
cuando la probabilidad de que sea cierta es menor de un 5%. En nuestro caso la probabilidad
es de un orden muy inferior, pudiendo considerarla practicamente de 0. Este hecho se ve
reflejado en el símbolo ***, cuyo significado viene expresado en la fila de Signif. codes: y
asociado a menor de 0.001 ‘***’.
Por tanto, podemos asumir que efectivamente existen indicios estadísticos claros de que
en efecto la valoración media de la actitud de los empleados es distinta. Sin embargo, esta
técnica, tal y como comentábamos en la introducción, solo nos indica que al menos una de la
medias es distinta (Abdi & Williams, 2010). Para realizar un análisis pareado, centro por
centro, usaremos el análisis creado por John Tukey, a quien también se le atribuye el
desarrollo del boxplot.
Como podemos ver, el resultado nos indica para cada par de establecimientos la diferencia
entre las medias a través de: diff, el límite inferior del intervalo de confianza mediante lwr y
el límite superior con upr. La probabilidad de que la diferencia de medias sea de 0, teniendo
en cuenta el intervalo de confianza, viene dada por p.adj y en nuestro caso es del orden de
5.4e-11, es decir, prácticamente de 0, lo cual nos indica que efectivamente cada media es
distinta para cada supermercado. Como en el caso anterior, si esta probabilidad fuera superior
a un 5% podríamos asumir que las medias para ese par son las mismas.
Este análisis se ve más claramente a través de su representación gráfica, pero como en
otras ocasiones antes hemos de preparar el data.frame. Para ello crearemos la variable
$comparacion, que almacenará los nombres de las filas del resultado previo mediante row.names().
Posteriormente usaremos una función nueva de R base, gsub(); esta función busca dentro de
una cadena de texto el valor dado inicialmente, en nuestro caso ‘-’, y lo sustituye por el
carácter dado: ‘ Vs.’; el tercer parámetro es la variable sobre la que actuar:
Para interpretar este gráfico hemos de fijarnos de forma independiente en cada una de las
comparaciones; cuanto más lejos esté el intervalo del 0, más significativa es la diferencia. Por
ejemplo, entre Dia y Mercadona, en contraste con Carrefour y Dia.
Hasta ahora hemos tratado nuestra variable actitud de los empleados como una variable
cuantitativa tomando los valores de las respuestas como datos numéricos, pero en realidad las
respuestas a esta pregunta son cualitativas o categóricas e indican el grado de acuerdo o
desacuerdo, para lo cual nos tendríamos que fijar en la proporción de las respuestas. Cuando
Como podemos observar, la información no queda muy clara y sería conveniente realizar
un gráfico para poder visualizarla y tener una idea más precisa de las posibles diferencias en
proporciones. Para ello convertiremos el análisis de proporciones en un data.frame y se lo
pasaremos a una nueva variable:
Para la realización del gráfico introduciremos de la forma usual las variables de los ejes,
siendo Establecimiento la variable del eje X, y siendo Pc1.Actitud la variable del eje Y. Para
obtener el boxplot indicamos su geometría con geom_boxplot(). El punto rojo representa la
media de la respuesta para cada uno de los centros, que añadiremos mediante el comando:
stat_summary(fun.y = mean, geom = “point”, colour = “red”, size = 1), donde fun.y = mean le indica al
programa que incorpore la media del eje Y, geom = “point” que queremos que la media se
represente por un punto; los comandos: colour = “red” y size = 1 indican el color y el tamaño,
respectivamente. Por último, scale_x_discrete() indica al programa la etiqueta que queremos
usar para el eje X, que en nuestro caso es la creada previamente: labels = xlabs:
ANOVA
Boxplot
Para cerrar el análisis de las posibles relaciones entre las variables estudiaremos la
correlación entre las respuestas. Uno de los objetivos del cuestionario en su diseño era el de
poder crear grupos de variables que tuvieran altos niveles de correlación entre ellas, con la
idea de poder resumir esa información a través del método de Análisis Factorial que veremos
en el próximo capítulo.
Para comprobar si el objetivo se ha conseguido y el nivel de correlación entre las variables
usaremos el comando corrplot() de la librería que lleva su nombre y que fue previamente
cargada. Esta librería nos permite personalizar la gama de colores de la matriz de correlación
que obtendremos y lo haremos creando la variable col1 a través del comando
colorRampPalette(); como se puede observar, el comando acepta colores bien por su nombre en
inglés, como por ejemplo ‘red’, bien por su código Hex, como por ejemplo #7F0000.
Una vez hecha esta aclaración pasaremos a ilustrar el código necesario para crear el
gráfico de la matriz de correlación corrplot(). Como primer paso hemos de incluir como
variable de entrada una matriz de correlación, para ello usamos el comando de R base cor(),
Como podemos observar en el gráfico, a la derecha está la escala de color que indica los
niveles de correlación, yendo desde un azul oscuro para el 1 a un rojo fuerte para el –1. Los 8
cuadrados creados representan las variables más correlacionadas, siendo el grupo más
numeroso el de variables relacionadas con el establecimiento, seguido de las variables
relacionadas con los tiempos, el interés en resolver consultas, y por último la actitud de los
empleados. Esta información nos será muy valiosa a la hora de realizar el análisis factorial,
dado que nos permite tener una idea aproximada de cuántos factores pueden llegar a resumir
4.1. Introducción.
4.2. Análisis factorial, análisis de componentes principales.
4.3. Realización del análisis factorial.
4.4. Análisis factorial rotado.
4.5. Representación gráfica del análisis factorial.
4.6. Análisis individual de cada centro.
[1] 0.9682024
El valor de 0,96 es elevado y muy próximo a 1, por lo que podemos asumir que nuestro
análisis será adecuado.
Anteriormente, en la matriz de correlación observamos que había unas 4 áreas que
incluían las variables más correlacionadas, por ello extraeremos 4 factores, o dicho de otra
forma, crearemos 4 variables que son combinación lineal de las variables iniciales. Este es un
proceso de prueba y error, y se recomienda, si no se tiene una idea inicial del número de
posibles factores, el ir probando hasta que encontremos una solución que consideremos
adecuada.
Para el análisis usaremos el comando psych::principal() para las variables que empiezan con
P, con 4 factores nfactors = 4 y sin rotar, rotate = ‘none’ (próximamente haremos una breve
reflexión sobre el concepto de rotación). Una vez realizado el análisis miraremos las cargas
factoriales (loadings), o correlación de cada variable con cada factor mediante
survey_principal$loadings:
comunalidad variables
1 0.76 Pe1.EsperaCaja
2 0.74 Pg1.OrdenLimpieza
3 0.71 Pe1.EmpleadCaja
4 0.70 Pe1.ResolucRapida
5 0.70 Pg1.Iluminacion
6 0.70 Pg1.Climatizacion
7 0.69 Pc1.Servicio
8 0.69 Pf1.Competitivid
9 0.69 Pg1.Amplitud
10 0.68 Pe1.Consultas
11 0.68 Pe1.EsperaAtenc
12 0.67 Pf1.Variedad
13 0.67 Pc1.AtencRapida
14 0.66 Pc1.Actitud
15 0.66 Pg1.Decoracion
Las variables con mejor encaje en el análisis van desde Duración de las filas en las cajas a
la Climatización del establecimiento, con valores iguales o superiores a 0.7. Por otro lado, el
valor más bajo corresponde a la variable Facilidad para identificar la cadena, y podría ser la
variable que menos se identifica con el análisis, pero dado que tiene un valor de 0,46, que es
muy próximo a 0,5, decidimos incluirla.
• Actitud.
• Atención.
• Atención esperas.
• Actitud de servicio.
Analizando las variables que incluye, a este factor le podríamos llamar «Actitud de los
empleados» y tiene una capacidad de explicación del 23% de la varianza (SS loadings).
Observamos que la varianza explicada por este primer factor ha disminuido respecto a la
solución sin rotar, y ahora la capacidad de explicación de cada factor se distribuye más
homogéneamente.
Al segundo factor RC2 al que podríamos llamar «Establecimiento» y con una capacidad de
explicación de la varianza del 18%, incluiría las variables:
• Decoración.
• Iluminación.
• Climatización.
• Sensación de orden y limpieza.
• Amplitud.
• Marcado de áreas.
• Facilidad para identificar la cadena.
Al tercer factor RC3 con una capacidad de explicación del 12% y que incluye todas las
variables relacionadas con el tiempo, le podríamos llamar «Esperas»:
Y por fin el factor RC4, que recoge un 11% de la varianza, agrupa variables relacionadas
con la oferta de productos, y le podríamos llamar «Calidad de la oferta», incluyendo las
variables:
Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)
• Asesoramiento de la oferta.
• Competitividad de la oferta.
• Amplitud de la oferta de productos.
• Relación calidad/precio.
• Satisfacción global.
Es llamativo el hecho de que por orden de importancia y teniendo en cuenta que estamos
considerando las opiniones agrupadas de los tres centros, el factor con más relevancia sea la
«Actitud de los empleados», seguido de factores ambientales del «Establecimiento», de las
«Esperas», y en último lugar factores relacionados con la «Calidad de la oferta».
Dado que el análisis factorial nos da puntuaciones no solo de cada factor, sino también de
cada individuo en cada factor, podemos visualizarlas en un gráfico y además, identificando
los individuos que responden para cada supermercado.
Los valores obtenidos nos indican la puntuación en cada eje de cada factor para cada
individuo. Por ejemplo, el individuo 1, que valora el establecimiento Dia, tiene una
puntuación de 1,11 en el primer factor RC1 o «Actitud de los empleados» y una puntuación de
–0,36 en el segundo factor RC2 o «Establecimiento».
A continuación procederemos a la representación gráfica; como novedad, tenemos el
comando geom_density2d(colour = “gray80”), que insertará una capa indicando dónde se concentra
la mayor densidad de individuos:
[1] 0.9570679
5.1. Introducción.
5.2. Análisis cluster o de conglomerado.
5.3. Análisis exploratorio, cluster jerárquico.
5.4. Análisis con K means cluster.
5.5. Perfil en base a las medias de los resultados.
5.6. Análisis gráfico de los resultados.
5.7. Mapa factorial con los grupos de cada cluster.
Vemos que el grupo más abundante es el 2, seguido del 1 y del 3; el grupo 4 consta solo de
216 individuos. Pero para poder crear un perfil de cada grupo hallaremos los valores medios
tanto de las preguntas de valoración como las de clasificación:
Como primer paso para crear el perfil en función de las respuestas medias, usaremos la
función aggregate() de R base. Los datos necesarios son un data.frame que creamos con
dplyr::select(), pero excluyendo -Establecimiento y las variables que empiezan por «C», -
starts_with(‘C’), la variable que usaremos para realizar la agregación de los datos es la
asignada a cada caso mediante el cluster: by = list(survey_kmeans$cluster) y por fin introducimos
la función que queremos usar, en nuestro caso la media, usando FUN = mean. Dado que el
Cada columna representa la media de las respuestas de un cluster distinto. Podemos ver
que la columna 4 es la que muestra una valoración media consistentemente inferior. En
contraste, el grupo de la columna 3 es el que muestra un mejor resultado. El grupo 2 tiene
valoraciones inferiores pero no alejadas mucho del grupo 3. Por otro lado, el grupo 1 podría
• Columna 3: «Fans».
• Columna 2: «Contentos».
• Columna 1: «Descontentos».
• Columna 4: «Detractores».
Para poder visualizar gráficamente la respuesta media de cada grupo a las preguntas de
valoración del supermercado crearemos una nueva variable, que contendrá las columnas de
nuestro data.frame, mediante dplyr::select, pero a la que hemos puesto sus nuevos nombres; por
ejemplo, Detractores = X4. A continuación, los nombres de las filas los añadimos a una nueva
variable: $variables y mediante filter() seleccionaremos los datos de interés; para realizar el
filtro usaremos stringr::str_detect(variables, ‘P’), es decir, busca en la columna $variables solo
las filas que contienen P, que son las de percepción sobre el supermercado. Una vez creada
esta nueva variable, la ordenaremos de mayor o menor en función de las medias dadas por
los «Fans»:
variables variable
Pc1.Actitud Detractores
Pc1.Atencion Detractores
Pc1.AtencRapida Detractores
Pc1.Servicio Detractores
Pd1.Asesora Detractores
Una vez realizada la transformación, pasaremos al gráfico para ver la comparativa de las
medias para cada centro. Dentro de aes() usamos reorder(variables, value) para ordenar la
media de las respuestas de mayor a menor:
Una vez revisadas las medias de las respuestas a las preguntas de valoración del
supermercado, nos centraremos en las variables de clasificación, para intentar realizar un
perfil de cada cliente; ahora, a través de filter(!...), seleccionaremos las variables que no
contienen P añadiendo el signo de admiración !:
Podemos observar que el centro donde existen más fans es Mercadona, siendo también
este grupo el más abundante; para este centro solo constan 7 detractores del total de la
muestra. Este hecho contrasta con Dia, donde el grupo más abundante es el de descontentos,
seguido de contentos y detractores con un número similar de individuos, respecto a los fans,
solo constan 71 del total de la muestra.
A la luz de esta información pasaremos a hacer un primer gráfico14 en el que mostraremos
a qué centro se refieren las respuestas dadas por cada individuo de cada cluster:
En el gráfico se puede observar que, en realidad, el perfil de edades es muy parecido para
Podemos observar que la pauta de consumo estaría más relacionada con el supermercado
que con el grupo de pertenencia, aunque en algunos casos como en Dia el grupo de contentos
tiene un consumo medio superior, curiosamente mayor que el de los fans. Por otro lado, es
llamativo que los detractores de Carrefour sean los que tienen un consumo mayor en el
supermercado, tanto en rango como en media, representada por el punto blanco.
Para tener más información de si variables como satisfacción global o la relación
calidad/precio están influidas por el grupo de pertenencia, realizaremos un gráfico de
dispersión comparando ambas variables. Para realizar gráficos de dispersión con ggplot
usamos la «geometría» geom_point, pero en casos como el nuestro, en el que la variable es
discreta, el resultado no es muy clarificador:
Para crear el gráfico donde podemos observar las puntuaciones de cada cluster para cada
eje, usando siempre como eje horizontal el factor «Empleados» repetiremos el proceso usado
anteriormente en el caso de la división por establecimientos.
Dado que en el orden establecido para los cuatro grupos el grupo fans estaba el primero y
detractores el último, y en este caso el orden de representación en los factores será el inverso,
es decir, de detractores a fans, modificamos el orden de los niveles con nuestro ya conocido
comando factor() y a través de rev() ponemos los niveles en el orden inverso.
6.1. Introducción.
6.2. Regresión lineal múltiple.
6.3. Satisfacción global.
6.4. Importe medio de la compra.
6.1. Introducción
En este caso añadiremos tres librerías específicas para poder mejorar la capacidad de
realizar regresiones de R base. La primera es MASS, creada por Venables & Ripley (2002), y
que nos permitirá realizar la regresión por pasos utilizando el criterio de Akaike (1974). La
segunda es car de Fox & Weisberg (2011) y que usaremos para estudiar la colinealidad de las
variables independientes, y por otro lado, la autocorrelación de los residuos mediante el test
de Durbin & Watson (1951). La tercera es relaimpo, creada por Grömping (2006), y que
utilizaremos para descomponer la varianza explicada (R2), es decir, su importancia relativa o
qué porcentaje de la explicación se debe a cada variable.
A la hora de compilar este documento mediante la librería knitr (Y. Xie, 2014, 2015,
2017), en todos los casos se ha activado el comando: {r, message = FALSE} a la hora de crear las
piezas de código (Chunk) en Rmarkdown;15 de esta forma no se incorporan al documento los
avisos que genera una librería al cargarse. En este caso, debido a que tanto la librería dplyr
como la librería MASS usan el comando select() se crea un conflicto entre ambas y la última que
se carga es la que toma control sobre el comando:
Como primer paso a la hora de analizar una regresión hemos de comprobar la última fila
que obtenemos en el informe, es decir, el F-statistic, y su probabilidad asociada, p-value:, en
nuestro caso < 2.2e-16, este valor nos indica la probabilidad de que todos los coeficientes de
nuestra regresión sean simultáneamente iguales a 0, probabilidad que en nuestro caso es de
casi 0. Este coeficiente, por lo general, suele ser significativo, lo que implica que hemos
Call:
lm(formula = Ph1.Satisfaccion ~ Pc1.Actitud + Pc1.Servicio +
Pd1.Asesora + Pe1.ConocGama + Pe1.EsperaAtenc + Pe1.EmpleadCaja +
Pf1.Competitivid + Pf1.Variedad + Pg1.NumEmplead + Pg1.Iluminacion +
Pg1.OrdenLimpieza + Ph1.CalidadPrecio, data = survey)
• VIF = 1 No correlacionados,
• 1 < VIF < 5 Moderadamente correlacionados,
• VIF > 5 a 10 Altamente correlacionados,
A continuación procedemos a realizar el cálculo del VIF; para ello, simplemente
introducimos en la función car::vif() el modelo que queremos contrastar, en nuestro caso el
creado en el paso anterior:
Podemos observar que ninguno de los valores se aproxima a 5, con lo cual podemos
asumir que no existe problema de colinealidad en las variables independientes.
El siguiente paso es el de comprobar si existe autocorrelación en los residuos, para ello
usaremos el test de Durbin-Watson; como regla general, cuando obtengamos un valor
cercano a 2 podemos asumir que no hay este problema; no obstante, el uso de
car::durbinWatsonTest(), en el que incluiremos el modelo a testar, nos brindará no solo el valor
del estadístico, sino también el p-valor del contraste:
querremos saber qué variables contribuyen más, es decir, tienen más impacto en la
explicación de la satisfacción global. Para ello usaremos el comando relaimpo::calc.relimp(), en
el cual introduciremos nuestro modelo; el parámetro rela = TRUE indica que el resultado sea la
proporción de la varianza que explica cada variable respecto a la varianza explicada total. El
resultado obtenido lo convertiremos en data.frame y lo almacenaremos como variable con
objeto de poder realizar su representación gráfica a través de ggplot:
relaimp variables
0.25235057 Ph1.CalidadPrecio
0.09402313 Pf1.Competitivid
0.08304166 Pg1.OrdenLimpieza
0.07309623 Pc1.Servicio
0.07187645 Pe1.ConocGama
0.06714651 Pf1.Variedad
0.06706033 Pe1.EmpleadCaja
0.06141165 Pg1.Iluminacion
0.06103290 Pg1.NumEmplead
0.05884986 Pe1.EsperaAtenc
0.05590005 Pc1.Actitud
A partir del resultado podemos observar que la relación calidad/precio es la variable más
importante a la hora de explicar la satisfacción global; de hecho, explica un 25,2% de la R2; a
continuación destacan la competitividad de la oferta, la sensación de orden y limpieza y el
servicio obtenido. Las variables que aportan menos serían la actitud de los empleados y el
asesoramiento recibido de estos. El siguiente paso será realizar un gráfico con los resultados:
• Actitud.
Una vez obtenidos y renombrados los factores (sin incluir satisfacción global), crearemos
una nueva variable incluyendo estos y la variable dependiente que usaremos en la regresión
mediante el comando cbind(), en este caso satisfacción:
Call:
lm(formula = Ph1.Satisfaccion ~ Actitud + Establecimiento + Esperas +
Oferta, data = survey_principal_scores_rot)
Podemos comprobar, tal y como esperábamos, que el VIF es de 1 para todas las variables,
y por otro lado podemos rechazar la hipótesis de autocorrelación de los residuos.
A continuación realizaremos el gráfico de importancia relativa de cada variable:
Call:
lm(formula = formula_IM, data = survey_principal_scores_rot)
Podemos observar que todas las variables son significativas y con el signo adecuado,
aunque solo hayamos sido capaces de explicar a través de la regresión un 17,7% de las
causas que afectan a la variabilidad del importe medio medido a través del R2. Partimos de un
relaimp variables
0.37783449 RC5.IngMes
0.28756067 RC1.Edad
0.17251247 Establecimiento
0.05207313 Esperas
0.04902473 Oferta
0.03117465 RC2.Sexo
0.02981986 Actitud
3
https://www.rstudio.com/
4 https://stackoverflow.com/
5 Para obtener más información sobre diseño de cuestionarios y escalas de medida, recomendamos Grande &
http://www.aedemo.es/aedemo/otros-c%C3%B3digos-y-gu%C3%ADas-esomar
7 https://github.com/hadley/dplyr
8 https://github.com/hadley/scales
9 https://cran.r-project.org/web/packages/stringr/vignettes/stringr.html
11 https://cran.r-project.org/web/packages/corrplot/index.html
12 https://www.tutorialspoint.com/r/r_chi_square_tests.htm
13 https://www.r-bloggers.com/k-means-clustering-in-r/
15 http://rmarkdown.rstudio.com/
16 En este caso podemos usar un número tan elevado de variables independientes debido al tamaño de la
muestra; hemos de tener en cuenta que el modelo de regresión ha de tener siempre más observaciones que
variables y esta proporción es aconsejable que como mínimo sea de 1 a 10, es decir, una variable independiente
por cada diez observaciones.
17 http://www.hrc.es/bioest/Reglin_15.html
Casos de investigación
Una práctica empresarial
Gemma García Ferrer
Este libro pretende acercar al alumno la realidad de la investigación comercial a nivel empresarial.
Ha contado para ello, con la colaboración de empresas del sector que han aportado un total de once casos en
los que se usan metodologías o diseños de investigación variados.
Investigación comercial
Gemma García Ferrer
Investigación de Mercados
Águeda Esteban Talaya
Arturo Molina Collado
(Coordinadores)
Esta obra realiza un recorrido desde el origen y la naturaleza de la investigación y las fuentes de información y
una selección de técnicas univariantes, bivariantes y multivariantes para el análisis de datos, que son los
principales temas que conforman la investigación de mercados.