Está en la página 1de 148

Mariano

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.

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


Análisis de datos con R.
Una aplicación a la Investigación
de Mercados

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)
Primera edición: enero 2018

© ESIC EDITORIAL
Avda. de Valdenigrales, s/n. 28223 Pozuelo de Alarcón (Madrid)
Tel. 91 452 41 00
www.esic.edu/editorial

© Mariano Méndez Suárez

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.

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


Índice

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

Capítulo 1. Objetivos de la investigación y pasos iniciales

1.1. Objetivos de la investigación


1.1.1. Estructura del cuestionario
1.1.1.1. Bloque 1: percepción sobre el supermercado
1.1.1.2. Bloque 2: variables de clasificación
1.2. Antes de empezar
1.3. Carga de datos
1.4. Preparación de los datos
1.5. Representación gráfica

Capítulo 2. Top Two Box y Net Promoter Score


2.1. Introducción
2.2. Top Two Box (T2B)
2.3. Net Promoter Score (NPS)

Capítulo 3. Análisis bivariante


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.3.1. ANOVA
3.3.2. Análisis Tukey

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


3.3.3. Chi cuadrado, χ2
3.3.4. Boxplot (gráfico de caja)
3.3.5. Ejemplo comparación similitud de respuestas
3.4. Correlación

Capítulo 4. Análisis factorial

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

Capítulo 5. Análisis cluster o de conglomerado

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

Capítulo 6. Análisis de regresión lineal múltiple

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

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


6.4. Importe medio de la compra
6.4.1. Análisis exploratorio
6.4.2. Importancia relativa de cada variable

BIBLIOGRAFÍA

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


A Pilar

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


Prólogo

Introducción

D espués de varios años impartiendo la asignatura de Investigación de Mercados en ESIC


Business & Marketing School utilizando el software SPSS1 surgió la idea de traspasar
todo el curso al software R, la estructura del curso estaba creada y la dinámica de clase
tambié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.

Cuestionario y datos empleados


La aplicación de las técnicas descritas en el texto se apoya en los resultados de un
cuestionario diseñado y aplicado por el profesor Juan Antonio Márquez en su actividad
profesional y que tan generosamente compartió y tiene como objetivo la medición de la
percepción de calidad en grandes supermercados.

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:

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


Supermercado Encuestas
Carrefour 617
Dia 719
Mercadona 704

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.

Aparte de la gratuidad, algunas de las principales ventajas de R son:

• Es una herramienta de análisis estadístico permanentemente actualizada gracias a la


contribución de una comunidad de desarrolladores a nivel mundial, mediante la
incorporación de las últimas técnicas estadísticas a través de la creación de librerías, o
pequeños programas que se pueden instalar dentro del entorno.
• Es un software de automatización más que de programación; este hecho es clave para el
avance científico dado que permite obtener resultados reproducibles y a nivel de
eficacia en tiempos, puesto que una vez escrito el código se puede reutilizar. Esta

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


capacidad de automatización permite optimizar el trabajo ya que no es necesario
guardar los resultados de los análisis cada vez que los realizamos y simplemente los
repetimos.
• Está disponible para los tres principales sistemas operativos: Windows, (Mac) OS X y
Linux, siendo totalmente compatible el intercambio de archivos.
• Tiene el soporte de una gran comunidad científica a nivel internacional que comparte de
una forma generosa y altruista a través de manuales, vídeos, foros, blogs, Twitter, entre
otros medios, su conocimiento para aquellos que están interesados.
• A un nivel más avanzado, es una especie de piedra Rosetta que traduce la formulación
matemática de los artículos publicados con mayor impacto al lenguaje de la
programación y que permite comprender desarrollos matemáticos complejos estudiando
su código y recrearlos mediante métodos numéricos. Este hecho significa una ayuda
fundamental en estudios de posgrado, especialmente los de doctorado.

Sobre la curva de aprendizaje de R


El entorno R al principio puede resultar intimidante y se suele tener cierta reticencia a
entrar, especialmente cuando estamos habituados y tenemos acceso a otros programas
estadísticos. Es cierto, que la curva de aprendizaje es especialmente pronunciada cuando
empezamos y podemos llegar a preguntarnos: ¿Por que estoy usando R?, pero pasado un
tiempo el esfuerzo realizado recibe su recompensa y es cuando surge la pregunta: ¿Por qué
habré estado tanto tiempo usando otras herramientas?...

Aplicaciones académicas y profesionales


Consideramos que el manual tiene aplicación académica en cursos de grado o posgrado en
asignaturas que apliquen técnicas cuantitativas a la Investigación de Mercados y donde los
docentes responsables complementen el material aportado con la documentación teórica que
ha de acompañar a este tipo de cursos. En este caso, la dinámica recomendada es usar toda la
base de datos para explicación de cada técnica en clase y que posteriormente a los alumnos
por grupos se les asigne un determinado supermercado para que repliquen la técnica
específicamente para ese centro. De forma que, después de la presentación de los resultados,
se consiga tener una perspectiva global sobre la percepción de los supermercados y se pueda
comparar esta de forma individual para cada uno de los centros.

A nivel profesional animamos a los expertos en Investigación de Mercados que quieran


«dar el salto» a probar una herramienta más versátil, con una mayor capacidad gráfica y de
presentación de resultados, un mayor control sobre estos y una mayor capacidad de

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


automatización.

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.

Nota del autor:


En los nombres de las variables y sus etiquetas de texto hemos omitido las tildes, y
sustituido la ñ por la n en la base de datos proporcionada para evitar posibles conflictos
con los idiomas de los sistemas operativos.

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


Capítulo 1
Objetivos de la investigación y pasos
iniciales

1.1. Objetivos de la investigación.


1.2. Antes de empezar.
1.3. Carga de datos.
1.4. Preparación de los datos.
1.5. Representación gráfica.

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


1.1. Objetivos de la investigación
El objetivo principal de la investigación era conocer la percepción de calidad de los
clientes sobre una de las grandes compañías de distribución. Este objetivo se pretendía
alcanzar a partir del establecimiento de 4 subobjetivos, cada uno de ellos en base a distintas
técnicas de análisis estadístico:

• 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.

1.1.1. Estructura del cuestionario


El cuestionario5 fue diseñado para poder alcanzar los objetivos comentados mediante la
creación de dos grandes bloques de preguntas:

• 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

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


dado que tienen una base numérica se podrá transformar en cuantitativa mediante el
cálculo de la media de los valores máximo y mínimo del intervalo. Y variables
puramente cualitativas como es el género, o el estado civil.

A continuación, usando como ejemplo la encuesta de Carrefour pasamos a ilustrar el


cuestionario. La codificación dada a cada una de las variables se puede observar más adelante
en el punto: «Preparación de los datos».

1.1.1.1. Bloque I: percepción sobre el supermercado


El primer bloque, cuya codificación empieza con la letra «P», tiene que ver con la
percepción sobre el supermercado y se centra en los siguientes aspectos:

1. Necesidades de comprensión. Con preguntas relacionadas con la actitud del personal


del supermercado ante los clientes.
P.C.1: POR FAVOR, ME GUSTARÍA QUE ME INDICASE SU NIVEL DE SATISFACCIÓN CON CARREFOUR
PARA CADA UNO DE LOS SIGUIENTES ELEMENTOS RELACIONADOS CON EL SERVICIO, UTILIZANDO
UNA ESCALA DE 1 A 10, DONDE 1 ES TOTALMENTE INSATISFECHO Y 10 TOTALMENTE SATISFECHO.
INDIQUE SU NIVEL DE SATISFACCIÓN CON CARREFOUR RESPECTO A:

La actitud educada y amable del personal de Carrefour.


El nivel de atención prestado al cliente. Los empleados se muestran pendientes e interesados.
La atención inmediata, sin hacer esperar al cliente por estar haciendo otras cosas.
El reconocimiento como cliente habitual en el establecimiento al que acude normalmente.
La actitud de servicio al cliente que muestran.

2. Necesidades de información y asesoramiento. Las preguntas se relacionan con el


asesoramiento sobre la oferta y la información sobre la misma.
P.D.1: POR FAVOR, ME GUSTARÍA QUE ME INDICASE SU NIVEL DE SATISFACCIÓN CON CARREFOUR
PARA CADA UNO DE ESTOS OTROS ELEMENTOS RELACIONADOS CON EL SERVICIO, UTILIZANDO LA
ESCALA DE 1 A 10, DONDE 1 ES TOTALMENTE INSATISFECHO Y 10 ES TOTALMENTE SATISFECHO.
INDIQUE SU NIVEL DE SATISFACCIÓN CON CARREFOUR RESPECTO A:

El asesoramiento y la oferta de productos adecuados a las necesidades e intereses del cliente.


La información completa, correcta y suficiente, que le permita a usted tomar sus decisiones.
Que Carrefour informa tanto de los aspectos positivos como negativos de cualquier producto, sin ocultar información
relevante para el cliente.

3. Necesidades operativas. Preguntas relacionadas con la capacidad de los empleados


para resolver consultas. Sobre los tiempos de espera para ser atendido, colas en las
cajas o tiempos en la solución de reclamaciones.

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


P.E.1: POR FAVOR, ME GUSTARÍA QUE ME INDICASE SU NIVEL DE SATISFACCIÓN CON CARREFOUR
PARA CADA UNO DE ESTOS OTROS ELEMENTOS DEL SERVICIO, UTILIZANDO LA ESCALA DE 1 A 10,
DONDE 1 ES TOTALMENTE INSATISFECHO Y 10 ES TOTALMENTE SATISFECHO. INDIQUE SU NIVEL
DE SATISFACCIÓN RESPECTO A:

La competencia y experiencia de los empleados.


La capacidad de los empleados para resolver adecuadamente las consultas que usted plantee.
El conocimiento de los productos ofrecidos.
El conocimiento y dominio en la consulta o gestión planteada.
El interés por resolver el problema planteado por el cliente, que se preocupe por buscar una solución.
El tiempo de espera para ser atendido.
La duración de las filas en las cajas.
La rapidez con la que se realizan las gestiones o consultas solicitadas.
El número de empleados y cajas disponibles en los establecimientos.
El tiempo requerido para todo el proceso de reclamación.
La solución obtenida ante sus quejas y reclamaciones.
La sencillez de los trámites requeridos para la reclamación.

4. Oferta de productos y servicios. Con preguntas sobre la competitividad de la oferta y


la amplitud de la gama.
P.F.1: POR FAVOR, ME GUSTARÍA QUE ME INDICASE SU NIVEL DE SATISFACCIÓN CON CARREFOUR
PARA CADA UNO DE ESTOS OTROS ELEMENTOS DEL SERVICIO, UTILIZANDO LA ESCALA DE 1 A 10,
DONDE 1 ES TOTALMENTE INSATISFECHO Y 10 ES TOTALMENTE SATISFECHO. INDIQUE SU NIVEL
DE SATISFACCIÓN RESPECTO A:

La competitividad y atractivo de la oferta de productos respecto a otros supermercados.


La amplitud/gama de la oferta de productos.
Los beneficios asociados a la compra habitual/frecuente de productos de Carrefour.

5. Centros. En este caso las preguntas se relacionan con el acondicionamiento de los


centros, si la estructura de personal es adecuada, la decoración y señalización o la
adecuación del número de cajas.
P.G.1: POR FAVOR, ME GUSTARÍA QUE ME INDICASE SU NIVEL DE SATISFACCIÓN CON CARREFOUR
PARA CADA UNO DE ESTOS OTROS ELEMENTOS DEL SERVICIO, UTILIZANDO LA ESCALA DE 1 A 10,
DONDE 1 ES TOTALMENTE INSATISFECHO Y 10 ES TOTALMENTE SATISFECHO. INDIQUE SU NIVEL
DE SATISFACCIÓN RESPECTO A:

El número de empleados adecuado al volumen de clientes del establecimiento.


Que no haya cajas cerradas por falta de personal suficiente.
Decoración/Ambiente del establecimiento.
La iluminación del establecimiento.
La climatización del establecimiento.
La sensación de orden y limpieza.

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


La amplitud del establecimiento.
La señalización de las distintas áreas para saber fácilmente dónde debe dirigirse.
La facilidad para ver e identificar los establecimientos de la cadena.

6. Valoración racional (satisfacción). Donde se pregunta sobre la relación calidad-precio


y el nivel de satisfacción global con el centro.
P.H.1: POR FAVOR, UTILIZANDO UNA ESCALA DE 1 A 10, DONDE 1 ES TOTALMENTE EN DESACUERDO
Y 10 ES TOTALMENTE DE ACUERDO, INDIQUE EN QUÉ GRADO ESTÁ USTED DE ACUERDO CON LAS
SIGUIENTES AFIRMACIONES SOBRE CARREFOUR:

Globalmente le parece adecuada la relación calidad-precio que tiene Carrefour.


Globalmente está muy satisfecho con Carrefour.

1.1.1.2. Bloque 2: variables de clasificación


Estas preguntas recopilan información sobre las personas encuestadas; en este caso, las
variables son codificadas comenzando con la letra «C» y son las siguientes:

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

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


3. Estado civil

C.3. ¿SERÍA TAN AMABLE DE INDICARME SU ESTADO CIVIL?


– Soltero/a 1
– Casado/a 2
– Unido/a 3
– Separado/a 4
– Viudo/a 5

4. Importe medio de la compra en el supermercado:

C.4. ¿NOS PODRÍA INDICAR EL IMPORTE MEDIO DE SU COMPRA?


Menos de 15 € 1
De 15 a 30 € 2
De 31 a 45 € 3
De 46 a 60 € 4
De 61 a 75 € 5
De 76 a 90 € 6
De 91 a 120 € 7
Más de 120 € 8

5. Ingresos mensuales totales de la unidad familiar. En este caso, dado lo delicado de la


pregunta se espera que una parte de la muestra no la responda y se proporciona una
casilla con Ns/Nc, que para R será un NA (Not Available, no disponible):

C.5. ¿NOS PODRÍA INDICAR SUS INGRESOS TOTALES MENSUALES?


Menos de 600 € 1
De 601 a 1.000 € 2
De 1.001 a 1.500 € 3
De 1.501 a 2.000 € 4
De 2.001 a 3.000 € 5
De 3.001 a 4.500 € 6
Más de 4.500 € 7
Ns/Nc NA

1.2. Antes de empezar


Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)
Como primer paso para empezar nuestro trabajo abriremos Rstudio y crearemos un
proyecto. Para ello hemos de clicar en la esquina superior derecha en Project y nos aparecerá
un desplegable donde hemos de indicar New Project...:

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:

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


Esta pantalla nos conduce a una nueva que nos permitirá crear el nombre del proyecto
indicándolo en Directory name: y la carpeta de nuestro ordenador donde queremos que se cree,
Create project as subdirectory of:. Una vez realizado este paso, el siguiente es clicar en Create
Project:

En este punto RStudio habrá creado el proyecto en el directorio solicitado. A través de


nuestro sistema operativo, colocaremos en este directorio los datos que usaremos en nuestro
trabajo: survey_base.csv y survey.csv. Aunque este último lo crearemos en este primer capítulo,
caso de que se quiera empezar con otro capítulo será necesario que esté en el proyecto, por lo
cual es recomendable ponerlo desde el principio. En este directorio también habremos de
poner los archivos descargados .R http://editorial.esic.edu/contenidos/9788417129361/ con el
código para ejecutar durante la lectura:

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


1.3. Carga de datos

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

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


entre mayúsculas y minúsculas) para cargarlo hemos de indicar la ruta en la que se sitúa en
nuestro ordenador. El comando es read.delim(“ruta del archivo de texto.csv”, separador = “punto y
coma”), es precedido por <-, que es un operador que le indica a R que los datos existentes en el
archivo se asignen al tipo de variable data.frame al que llamamos survey_base.
Un data.frame o marco de datos es un tipo de «contenedor de datos» en R en el que sus
columnas contienen variables que pueden ser numéricas, de texto o lógicas, y sus filas los
valores de estas variables. Tanto las columnas como las filas se pueden representar con un
nombre o un número. Sería el formato de representación de datos más parecido a las tablas
de EXCEL.

[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:

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


1.4. Preparación de los datos
Una vez cargados los datos procederemos a analizar la calidad de estos; es decir, verificar
si hay valores perdidos o posibles incongruencias en los datos. Normalmente usaríamos el
comando summary(survey_data), y obtendríamos máximos, mínimos, cuartiles, media y un dato
muy importante que son los valores perdidos, representados por NA. Sin embargo, de cara a la
correcta visualización del resultado en este texto, usaremos el comando papeR::summarise() de la
librería papeR:

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


Donde N es el número de casos, Missing el número de casos perdidos; NA, Mean y SD, la

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


media y desviación típica respectivamente, y Min, Q1, Median, Q3 y Max, el mínimo, el cuartil 1,
la mediana, el cuartil 3 y el máximo.
Como podemos ver, la mayoría de las variables tienen un número razonable de valores
perdidos para una base de datos de 2.040 registros. En cambio hay 4 variables, 3 que
pertenecen al grupo «Pe1», que son tiempo en atender reclamaciones, solución a las quejas y
sencillez de los trámites que cuentan con un número muy elevado de valores perdidos. Tal y
como comentaban los alumnos que realizaron la encuesta, determinadas personas se veían
desconcertadas ante estas preguntas dado que no habían puesto quejas ni reclamaciones. Ante
este número tan elevado de valores perdidos optaremos por eliminar estas variables del
análisis. Por otro lado, la pregunta C5 relacionada con los ingresos por mes, como cabría
esperar, también muestra un gran número de valores perdidos, en este caso procederemos de
otra forma reemplazando estos valores perdidos por la mediana, de forma que, aunque con
una pequeña distorsión, dado que este problema lo tienen 265 valores de un total de 2040, es
decir, un 13% de la muestra mantendremos una variable que puede ser interesante en el
análisis.
Para realizar esta transformación usaremos la librería dplyr, concatenando los comandos
mediante el operador %>% (pipe o canalización) que podríamos entender como «y entonces».
Siendo la interpretación del código: survey_base <- survey_base %>% para dar un nuevo valor a la
variable survey_base <- selecciona el «data.frame» survey_base y «entonces», representado por el
operador %>%, realiza la siguiente selección: dplyr::select(-starts_with(‘P’), which(colSums
(is.na(.)) < 41)), es decir, empezando por el segundo comando, solo las columnas que tengan
menos de 41 valores perdidos, which(colSums(is.na(.)) < 41), y solo las columnas que no
empiezan por «P» (al ser un carácter, ha de estar entre comillas “” o apóstrofos ‘’), -
starts_with(‘P’). Dado que al hacer esta selección se modifica el orden de las columnas, a
través de %>% indicamos, «y entonces», a través del comando dplyr::select() pon primero el
establecimiento, luego las variables que empiezan por P y luego las que empiezan por C.

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.

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


Antes hemos podido observar que la variable Establecimiento está codificada con valores
numéricos, por lo que la transformaremos en variable categórica usando para ello los
nombres de cada uno de los supermercados. Para ello seleccionamos la variable mediante
survey_base$Establecimiento, es decir, el nombre del data.frame, survey_base y el nombre de la
columna que queremos transformar en variable categórica: $Establecimiento, este tipo de
variables son llamadas factor en R, y nos permiten etiquetar cada uno de los valores a través
del comando: labels = c(‘carrefour’,’dia’,’mercadona’). La función c() es ampliamente usada en
R y es la inicial de combine (combinar), sirve para crear un vector con los valores que
contiene el paréntesis. Si estos son caracteres, es necesario que vayan entre comillas o
apóstrofos, si son numéricos se ponen tal cual:

Una vez convertida la variable en factor comprobamos que el cambio se ha realizado y


revisamos el resto de variables a través del comando dplyr::glimpse (survey_base) para visualizar
el resto de variables categóricas que habrán de ser transformadas, podemos traducir glimpse
como «vislumbrar»:

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,…

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


$ Pe1.EsperaCaja <int> 9, 9, 8, 5, 2, 6, 7, 9, 8, 7, 9, 5, 5, 4, 8,…
$ Pe1.ResolucRapida <int> 9, 9, 7, 5, 5, 7, 7, 8, 8, 6, 9, 6, 6, 5, 7,…
$ Pe1.EmpleadCaja <int> 7, 7, 5, 5, 8, 4, 8, 8, 8, 8, 8, 7, 7, 4, 8,…
$ Pf1.Competitivid <int> 9, 8, 7, 5, 10, 6, 9, 6, 7, 6, 9, 8, 8, 4, 1…
$ Pf1.Variedad <int> 9, 9, 6, 5, 8, 6, 10, 8, 8, 7, 9, 6, 6, 5, 9…
$ Pg1.NumEmplead <int> 8, 9, 8, 5, 6, 8, 8, 7, 8, 7, 8, 8, 8, 4, 9,…
$ Pg1.Decoracion <int> 7, 7, 5, 4, 5, 7, 9, 8, 8, 8, 6, 7, 7, 4, 7,…
$ Pg1.Iluminacion <int> 8, 9, 6, 5, 8, 8, 9, 9, 8, 8, 7, 8, 8, 5, 7,…
$ Pg1.Climatizacion <int> 8, 10, 6, 5, 6, 7, 9, 9, 8, 8, 1, 8, 8, 5, 7…
$ Pg1.OrdenLimpieza <int> 6, 9, 8, 5, 10, 5, 10, 9, 8, 8, 7, 7, 7, 7, …
$ Pg1.Amplitud <int> 6, 10, 7, 4, 10, 6, 10, 9, 8, 8, 7, 8, 8, 4,…
$ Pg1.Señalizacion <int> 8, 10, 9, 5, 10, 8, 10, 8, 7, 7, 6, 7, 7, 5,…
$ Pg1.IdentCadena <int> 7, 8, 9, 7, 9, 9, 10, 8, 9, 7, 7, 9, 9, 8, 7…
$ Ph1.CalidadPrecio <int> 7, 10, 8, 7, 10, 8, 9, 7, 8, 8, 9, 9, 9, 10,…
$ Ph1.Satisfaccion <int> 9, 9, 8, 6, 10, 8, 9, 8, 8, 8, 9, 10, 10, 7,…
$ C1.Edad <int> 6, 5, 3, 4, 2, 4, 6, 6, 5, 6, 6, 6, 6, 1, 6,…
$ C2.Sexo <int> 2, 2, 1, 1, 2, 2, 1, 2, 2, 2, 1, 1, 1, 1, 2,…
$ C3.EstadoCivil <int> 2, 2, 3, 4, 1, 4, 5, 2, 2, 2, 5, 5, 5, 1, 5,…
$ C4.CompraMedia <int> 3, 3, 4, 4, 4, 5, 2, 3, 2, 4, 1, 1, 1, 8, 2,…
$ C5.IngMes <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…

Podemos observar que obtenemos 3 columnas, la primera con el nombre de la variable, la


segunda indicando su clase, por ejemplo la variable $Establecimiento como factor <fctr> o la
variable $Pc1.Actitud como <int>, es decir, número entero. La tercera columna nos muestra los
primeros valores de cada variable.
Antes de recodificar el resto de las variables categóricas y con el objetivo de poderlas usar
posteriormente como valores numéricos en el análisis, crearemos cuatro nuevas variables
transformando a numéricas las variables: edad, compra media, e ingresos, usando los valores
medios de los intervalos o marca de clase. Por otro lado, a la variable sexo la recodificaremos
a valores binarios con un valor 0 para hombre y un valor 1 para mujer, que convertiremos en
factor con factor() y etiquetaremos como labels = c(‘hombre’, ‘mujer’). Para realizar la
recodificación usaremos el comando dplyr::recode() de la librería dplyr. Una vez recodificadas
visualizaremos las primeras filas del resultado usando el comando head() de R base y
mediante dplyr:: select() indicaremos las columnas que queremos mostrar de survey_base.

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


Una vez creadas estas nuevas variables, convertiremos las variables categóricas originales
de clasificación en factor incluyendo: la edad, el sexo, el estado civil, el importe medio de la
compra y los ingresos totales. Realizaremos el mismo proceso que con el establecimiento y
mostraremos el resultado a través de dplyr::glimpse (select(survey_base, starts_with(‘C’))), es
decir, de survey_base, selecciona solo las columnas que empiezan por C y muestra los primeros
valores.

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…

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


$ C3.EstadoCivil <fctr> casado/a, casado/a, unido/a, separado/a, solte…
$ C4.CompraMedia <fctr> entre 31 y 45, entre 31 y 45, entre 46 y 60, e…
$ C5.IngMes <fctr> menos de 600, menos de 600, menos de 600, meno…

Tras realizar la limpieza y organización y con el objetivo de mantener la integridad de los


datos originales, los guardaremos como un nuevo archivo, ya limpio, que será el que
usaremos de aquí en adelante. Para eso utilizamos el comando write.table() que guardará
nuestros datos survey_base, en el directorio que indiquemos, en este caso el directorio desde el
que estamos trabajando, con el formato csv con el nombre survey.csv, y que al guardarlos
utilice como separador el punto y coma sep = ‘;’ y que no guarde como variable el índice de
la fila con row.names = FALSE. Posteriormente cargaremos este nuevo archivo en memoria a
través del comando usado anteriormente read.delim() y el valor lo asignaremos a nuestra nueva
variable survey:

Cargada ya la nueva variable survey revisaremos el resultado de la recodificación anterior;


para ello, le pediremos a R que nos enseñe los primeros valores de las variables modificadas
head(), usando el comando dplyr::select(), en este caso con las variables que comienzan por
«R», starts_with(‘R’):

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

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


Para ello, usaremos el siguiente código, mediante el cual convertimos la variable
survey$C4.CompraMedia a través de <- en un factor() basado en la misma variable, pero con los
niveles levels() en el orden deseado c(), realizamos el mismo proceso con la variable
survey$C5.IngMes y revisamos los resultados usando levels():

Podemos comprobar que ahora la variable tiene el orden deseado.


Para continuar con nuestro análisis de la relación entre ingresos, realizaremos una tabla
cruzando los valores de ingresos y edades usando el comando: round(prop.
table(table(survey$C5.IngMes, survey$C1.Edad), 2)*100, 2).

Yendo de dentro a fuera, la interpretación del comando es la siguiente: del data.frame,


survey seleccionaremos las variables correspondientes a ingresos y edades, para después, a
través del comando table(), crear una tabla cruzada con las frecuencias absolutas del cruce de
las variables, para hallar la proporción en tanto por ciento, usamos el comando prop.table(...,
2)*100 el 2 le indica a R que queremos que calcule las proporciones de cada columna y el
resultado en tanto por uno lo multiplique por 100; por último usamos round(..., 2) para
indicar al programa que redondee el resultado hasta 2 decimales (como podemos comprobar
R por defecto usa como separador decimal el punto en vez de la coma).
Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)
El rango de ingresos parece razonable para todas las edades, aunque sí resulta llamativo
que para el rango de edad de mayores de 64 aparezca un 16,06% de la muestra con ingresos
inferiores a 600€. No obstante, para poder comprobar qué proporción del total del rango de
edades tiene más de 64 años y unos ingresos menores de 600€ calcularemos la proporción de
edades por ingresos, modificando el orden de entrada en table().

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


A la luz de los resultados, podemos comprobar que, en realidad, en el grupo de ingresos de
menos de 600€, las personas con más de 64 años solo representan un 6,65%. Más adelante
realizaremos la representación gráfica de ambas tablas.

1.5. Representación gráfica


Para ilustrar la representación gráfica de las variables usaremos la librería ggplot2, que
habrá de haber sido instalada, install.packages(‘ggplot2’) y cargada en memoria
library(ggplot2)con anterioridad. En principio, mostraremos las edades de los encuestados,
para ello usaremos los siguientes comandos:

La primera línea: ggplot(survey,aes(C1.Edad, fill = C1.Edad)) + le indica a R que queremos


realizar un gráfico, en el primer bloque dentro del paréntesis le proporcionamos la fuente de
datos que es nuestra encuesta survey. El segundo bloque que comienza por aes(), es la
abreviatura de la palabra inglesa aesthetics (estética) y sirve para indicarle a ggplot que
queremos que la variable C1.Edad esté en el eje x, para que esta variable tenga un distinto color
para cada rango de edad usamos el comando fill = C1.Edad con el nombre de la variable. El
comando acaba con el signo +, que le indica a ggplot que seguimos aportando información.
La siguiente línea, geom_bar(aes(y = (..count..)/sum(..count..))) le indica al programa la

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


geometría del tipo de gráfico que queremos, en este caso un gráfico de barras. Dentro del
paréntesis podemos volver a ver el comando aes, en este caso, con una operación en su
interior que sirve para hallar el porcentaje de cada caso, dividiendo la frecuencia de cada uno
de ellos entre la suma total de frecuencias.
El comando theme(legend.position = “none”) indica la posición de la leyenda, en este caso sin
leyenda. Se puede observar que en este caso se han usado las comillas en vez de los dos
apóstrofos, en R, ambos símbolos son intercambiables y se pueden usar indistintamente tal y
como dijimos anteriormente.
El comando labs() sirve para dar etiquetas a ambos ejes. Y el valor dado en
scale_y_continuous(labels = scales::percent) para indicar la escala del eje de la variable y, en
nuestro caso, porcentaje a través del comando de la librería scales::percent.
coord_flip() le indica al programa que sitúe los valores del eje horizontal en el vertical, y
viceversa:

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:

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


Para continuar con nuestro análisis de ingresos mensuales y edades, ahora realizaremos
los gráficos de ingresos mensuales.

Y en el siguiente gráfico, el nivel de ingresos separado por supermercado.

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


En este gráfico podemos observar que el nivel de ingresos de los encuestados en
Carrefour, en general, es mayor que en el resto de centros. Respecto a Dia, ocurre justo lo
contrario y son más abundantes los niveles de ingresos menores.
Volviendo a nuestro análisis del cruce de variables ingresos mensuales y edades,
realizaremos su representación gráfica (el comando breaks = pretty_breaks() le indica al
programa que elimine los decimales del valor de los porcentajes). En este caso dividiremos el
gráfico de edades en 3 columnas usando facet_wrap(~ C1.Edad, ncol=3):

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


Viendo el gráfico podemos comprobar que la distribución de ingresos de la muestra puede
tener sentido en función de las edades. No obstante realizaremos un gráfico de las edades y
su nivel de ingresos:

Vemos, tal y como hicimos con la tabla, que las proporciones son razonables.

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


Capítulo 2
Top Two Box y Net Promoter Score

2.1. Introducción.
2.2. Top Two Box (T2B).
2.3. Net Promoter Score (NPS).

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


2.1. Introducción
En primer lugar hemos de asegurarnos que disponemos de las librerías necesarias para
hacer el análisis, en este caso hemos añadido dos nuevas: stringr9 que nos servirá para filtrar
los casos por filas en función de que contengan una determinada cadena de texto y reshape2,
(Wickham, 2007) para poder modificar los datos de entrada de los gráficos:

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:

A partir de este momento ya podemos continuar con nuestro análisis.

2.2. Top Two Box (T2B)


El método Top Two Box (T2B), o de las «dos cajas superiores», se usa generalmente para
medir el nivel de satisfacción de los clientes; para ello, se calcula la proporción de las
mejores valoraciones dadas en escalas nominales, que van desde «Totalmente en desacuerdo»
a «Totalmente de acuerdo». Generalmente se usan en cuestionarios con escalas reducidas, por
ejemplo de 1 a 5 o de 1 a 7.
Para su cálculo hallaremos primero la proporción de respuestas dadas en las dos escalas
superiores y sumaremos estas proporciones. Si por ejemplo hubiéramos obtenido los
siguientes resultados de T2B:10

• T2B de Satisfacción global: 47%.


• T2B en Variedad de la gama de productos: 35%.

Veríamos claramente que la valoración de satisfacción global destaca. Si, en cambio,


hubiéramos hecho la media y especialmente en escalas reducidas, esta sería muy parecida y
no demostraría de una forma tan clara la percepción sobre cada variable.
De igual modo se suele calcular el Bottom Two Box (B2B), o de las «dos cajas inferiores»,

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


para comprobar las proporciones de las respuestas peor valoradas.
En nuestro caso, dado que la escala es de 1 a 10, ilustraremos el método en base a las tres
mejores respuestas, grupo al que llamaremos Alto, también calcularemos la proporción de
respuestas con valores entre 5 y 7, a la que llamaremos Medio y el B2B con las valoraciones
más bajas menores o iguales a 4.
Para proceder al análisis, lo primero es crear un data.frame para cada uno de los centros,
para ello usaremos el comando filter() de la librería dplyr. A este comando dentro del
paréntesis le hemos de proporcionar dos datos, en principio el nombre del data.frame de donde
queremos extraer la información, en nuestro caso survey, y por otro lado, la variable de la que
deseamos filtrar las filas, en nuestro caso Establecimiento, para realizar este filtro y que R
entienda que queremos seleccionar las filas que contienen el texto, por ejemplo dia, hemos de
usar el signo de igualdad dos veces ==, que R interpreta como «es igual a»:

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

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


analizando paso por paso, comenzamos con data.frame para indicar a R que queremos que el
tipo de formato de los datos de salida, sea data.frame. En segundo lugar nos encontramos con
la función apply(), en esta función le indicamos a R que queremos que seleccione los datos
que hay en dia_P y que por columnas, dado por el valor de 2, les aplique la función function(x)
que aparece a continuación: sum(x >= 8 & x <= 10); en esta función aparece el comando sum(),
que contrariamente a lo que podría parecer, en este caso, no suma los valores que aparecen en
la tabla, sino que cuenta los valores en los que la condición dada es cierta. La condición que
establecemos es: x >= 8 & x <= 10, es decir, busca valores mayores o iguales a 8 y también,
indicado mediante el símbolo & los que sean menores o iguales a 10. Realizaremos el mismo
proceso para los valores intermedios, de entre 5 y 7, y para los valores inferiores de menos de
4. Una vez generada la lista, la convertimos en data.frame:

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:

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


A partir de aquí añadiremos dos columnas a la variable dia_T2B; la primera, dia_T2B$variables
<- names(dia_P), contendrá los nombres de las variables usadas en el análisis (nombres de las
columnas, accedido a través de names(dia_P)); la segunda, que nos servirá posteriormente para
la comparativa de los tres centros, contendrá el nombre del establecimiento, dia_T2B$centro <-
‘dia’:

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:

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


Comparando estos resultados con la tabla anterior, dada por dia_T2B, podemos ver cómo la
información contenida en las columnas ha sido transferida a las filas. Con los datos
reorganizados de esta forma podemos realizar el gráfico con los resultados. El comando
ggplot(dia_T2B_melt, aes(variables, value, fill= variable)) le indica al programa que queremos que
use como fuente de datos el data.frame creado previamente: dia_T2B_melt y que de este use como
valor del eje X los nombres de las variables, que use para el eje Y los datos de la columna
value y que descomponga estos usando los tres posibles valores de Alto, Medio y Bajo
representados por la columna variable.
El comando geom_bar(position = position_stack(), stat = “identity”) le indica que queremos un
gráfico de columnas, pero apiladas, dado por position = position_stack() y que el tipo de gráfico
es de frecuencias: stat = “identity”.
El siguiente comando: geom_text(aes(label = paste0(round(value, 0),”%”)), position =
le indica al programa que en cada columna ponga como
position_stack(vjust = 0.5), size = 3)
etiqueta el valor correspondiente, mediante paste0(round(value,0),”%”) indicamos que queremos
que el valor dado se redondee sin decimales y que se le añada el símbolo de porcentaje % al
final. La posición y el tamaño del texto dentro de cada columna viene dada por
position_stack(vjust = 0.5), size = 3 para centrarla y un tamaño de 3.

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:

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


Si quisiéramos seleccionar solo una de las tres posibles valoraciones (Alto, Medio o Bajo)
para realizar el gráfico, usaremos los datos creados con anterioridad dia_T2B; en principio le
indicamos a ggplot que seleccione las columnas Alto para tener las T3B y que seleccione
Variables del data.frame que creamos con anterioridad. En el eje horizontal que incluya las
variables, pero ordenadas de mayor a menor: reorder(variables, Alto), para el eje vertical el
valor Alto y que les dé color en función de las preguntas con su valor con fill = variables. En
este caso no incluimos la leyenda: theme(legend.position = “none”).

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


Parece que lo mejor valorado es la facilidad para identificar la cadena, siendo la
proporción de valores superiores a 8 de más de un 25%, le sigue la relación entre la calidad y
el precio con una proporción en torno a un 25%. Vemos que los aspectos con una menor
proporción de respuestas por encima del 8 serían las esperas en las cajas, los tiempos en ser
atendidos por los empleados, el número de empleados y la decoración del establecimiento.
A continuación repetiremos el proceso, pero esta vez con los aspectos peor valorados, al
estar las respuestas por debajo del 4, lo que hemos dado en llamar Bottom three box, o B3B:

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


En este caso observamos que aspectos relacionados con los tiempos de espera por estar las
cajas cerradas o no haber suficientes empleados, la decoración y aspecto del establecimiento,
y los tiempos de atención, tienen más de un 40% de respuestas con valores inferiores a 4.
En el caso de que queramos solo información de alguna de las variables del cuestionario,
por ejemplo las que corresponden a necesidades de comprensión PC1, indicaremos a ggplot que
los datos que queremos que use vengan dados por el siguiente subconjunto:
dplyr::filter(dia_T2B, stringr::str_detect(variables, ‘Pc1’). Donde el comando filter( ) de la
librería dplyr filtra el data.frame creado con anterioridad diaT2B, usando como criterio los
valores de la columna variables que contienen la cadena de texto ‘Pc1’ a través del comando
str_detect de la librería stringr.

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


Una vez elaborado este análisis para Dia, realizaremos el mismo proceso con Carrefour y
Mercadona:

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)
Para tener una imagen global de las valoraciones para las distintas cadenas, realizaremos
un gráfico en el que aparezcan las tres de forma simultánea y poder compararlas. Para ello
volveremos a crear las variables de cada supermercado con la función reshape2::melt, pero en
este caso incluiremos también el centro como variable de identificación a través del comando
id.vars = c(‘variables’, ‘centro’), hemos de usar c() para crear un vector con las dos variables
que deseamos que sirvan como clave.
Una vez creadas estas nuevas variables usando el comando bind_rows de la librería dplyr las
combinaremos por filas. Hemos de tener en cuenta que los nombres de las columnas han de
ser siempre los mismos para que esta combinación funcione:

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


Para que en el gráfico nos aparezcan los tres centros siguiendo el orden que hemos usado
hasta ahora, en vez de estar ordenados alfabéticamente transformaremos la variable
resumen_T2B_melt$centro en factor con tres niveles dados por el orden deseado:

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:

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


En este gráfico podemos observar la diferencia tan significativa en cuanto a los ítems
mejor y peor valorados para cada establecimiento. Destaca Mercadona con muy pocas
respuestas menores a 4 y una gran mayoría con valoraciones superiores a 8. En el caso de
Carrefour el resultado es más disperso, y comparativamente, como ya habíamos comprobado,
Dia tiene las peores valoraciones.

2.3. Net Promoter Score (NPS)

La metodología de Net Promoter Score fue desarrollada por Reichheld (2003) para medir

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


la tasa de recomendación de una marca. Generalmente se usan escalas de 0 a 10, siendo 0
recomendaría la marca con muy poca probabilidad y 10 es extremadamente probable que
recomendara la marca. El método lo que hace es calcular la proporción de recomendaciones
con 9 y 10, a la que llamaremos «Promotores», y a este valor restarle la proporción de
recomendaciones menores de 6, a los que llamaremos «Detractores». A la proporción de
valores de 7 y 8 la llamaremos «Pasivos».
En nuestro caso, dado que el cuestionario no contiene una variable de recomendación,
para ilustrar el análisis, usaremos como proxy de esta variable la Satisfacción global con el
supermercado.
Comenzaremos con Dia calculando las frecuencias absolutas del número de respuestas
dadas para cada valor de Satisfacción global: table(dia_P$Ph1.Satisfaccion). Posteriormente, a
través del comando prop.table( ) calculamos las proporciones de cada respuesta. Una vez
creado, escribiendo el nombre de la variable creada dia_P_prop podemos visualizar el
resultado:

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:

‘data.frame’: 10 obs. of 2 variables:

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


$ Var1: Factor w/ 10 levels “1”,”2”,”3”,”4”,..: 1 2 3 4 5 6 7 8 9 10
$ Freq: num 0.0236 0.0431 0.0765 0.096 0.2031 ...

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:

Var1 Freq color


1 0.02364395 Detractor
2 0.04311544 Detractor
3 0.07649513 Detractor
4 0.09596662 Detractor
5 0.20305981 Detractor

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


6 0.18497914 Detractor
7 0.18497914 Pasivo
8 0.11821975 Pasivo
9 0.04728790 Promotor
10 0.02225313 Promotor

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:

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


[1] -0.2884927

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


[1] 0.004261364

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:

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


Para preparar los datos para el gráfico combinaremos por filas los resultados para cada
establecimiento a través de dplyr::bind_rows. Posteriormente transformaremos la variable
resumen_prop$centro en factor para poder elegir el orden de aparición en ggplot:

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:

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


En el gráfico se puede observar claramente cómo el centro con una mejor valoración sigue
siendo Mercadona, seguido por Carrefour aunque el índice de este sea negativo, pero menor
que el de Dia.

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


Capítulo 3
Análisis bivariante

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.

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


3.1. Introducción
Antes de comenzar el análisis, cargaremos las librerías necesarias; como novedad, y para
calcular y representar gráficamente las matrices de correlación, usaremos la librería corrplot:11

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.

3.2. Cálculo de las medias de las respuestas


Como primer paso realizaremos un análisis de las respuestas medias a las preguntas del
cuestionario. Este análisis se utilizará también para ilustrar el procedimiento para usar el
operador %>% o pipe operator (operador canal o tubo) de dplyr la palabra que introduce este
operador en el código, se podría traducir como entonces.
Para ello crearemos la variable medias, de forma que la traducción del código sería: añade a
la variable medias un valor obtenido de los datos de survey, entonces agrupa estos datos por
establecimiento: dplyr::group_by(Establecimiento)%>%, y entonces, con estos datos crea un resumen
que incluya la media: dplyr::summarise_at(vars(starts_with(‘P’)),mean), pero solo para las variables
de survey que empiecen por la letra P a través de: vars(starts_with(‘P’)). Mostramos todas las
filas y las columnas de la 1 a la 5 a través del comando medias[,1:5].
En caso de que quisiéramos obtener la desviación típica (R divide entre N-1), o bien la
mediana, simplemente tendríamos que cambiar la función dentro de summarise_at() por sd o
median en vez de mean, el resto del proceso sería idéntico al de la media.

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


En estos resultados aparece en la primera columna la variable $Establecimiento y el resto de
columnas representa la media de la variable de la encuesta con tres filas, una para cada
centro; para poder utilizar esta información de forma más conveniente y situar cada
supermercado en una columna y cada media en una fila crearemos una nueva variable a la
que llamaremos medias_establecimiento, en un primer paso seleccionamos solo las medias de las
variables de interés a través de nuestro conocido dplyr::select(medias, starts_with(‘P’)), es decir,
selecciona del data.frame recién creado: medias, solo las variables que comienzan por P,
starts_with(‘P’); con este comando evitamos seleccionar el nombre del establecimiento. A
partir de aquí transponemos esta matriz con el comando t(), transformando filas en columnas,
de forma que tendremos una columna para cada establecimiento y una fila para cada media
de respuesta. Como siguiente paso crearemos una variable dentro de nuestro data.frame a la
que llamaremos «variables»: medias_establecimiento$variables, de forma que tendremos una
nueva columna que contendrá los nombres de las filas, mediante: <-
row.names(medias_establecimiento).

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

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


Se puede observar que la valoración media de Mercadona destaca respecto a las otras
cadenas, liderando el ranking para todas las preguntas, excepto amplitud del establecimiento,
variedad de la gama de productos, señalizado de áreas y decoración en las que la valoración
media es superior en Carrefour. Por otro lado, la cadena Dia tiene una media menor en todas
las preguntas.
Ahora realizaremos un gráfico para poder comparar las medias de todas las respuestas
para cada supermercado. Para ello hemos de transformar la tabla original de medias a través
del conocido reshape2::melt. Establecimiento servirá como identificador, id.vars =
‘Establecimiento’, para nombrar los valores usamos value.name = ‘value’ y para nombrar las
preguntas: variable.name = ‘preguntas’.
Esta transformación es necesaria para poder realizar el gráfico con ggplot; consiste en crear
tres variables: la primera es establecimiento, la segunda corresponde al nombre de las
preguntas y la tercera a los valores de las medias; podemos ver el resultado a través del
comando head(medias_melt):

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


Establecimiento preguntas
carrefour Pc1.Actitud
dia Pc1.Actitud
mercadona Pc1.Actitud
carrefour Pc1.Atencion
dia Pc1.Atencion
mercadona Pc1.Atencion

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:

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


Hasta ahora hemos trabajado con la comparación de los 3 supermercados, pero en el caso
de que solo queramos centrarnos en uno de ellos (como sería normalmente el caso), por
ejemplo Dia, en primer lugar creamos el data.frame que corresponde al supermercado
añadiéndolo a la variable dia_media.

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


V1 variables
5.578581 Pc1.Actitud
5.077886 Pc1.Atencion
5.265647 Pc1.AtencRapida
5.449235 Pc1.Servicio

Realizamos la misma operación para Carrefour:

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


V1 variables
6.346840 Pc1.Actitud
5.858995 Pc1.Atencion
5.797407 Pc1.AtencRapida
6.126418 Pc1.Servicio

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


Y para Mercadona:

V1 variables
7.211648 Pc1.Actitud
6.779830 Pc1.Atencion
6.863636 Pc1.AtencRapida
6.978693 Pc1.Servicio

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


3.3. Comparación similitud de las respuestas por
grupos

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.

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


Cuando tengamos variables que son puramente cualitativas, como las variables de
clasificación, por ejemplo: hombre o mujer, o rangos de compras medias o de edades.
Exclusivamente podremos usar métodos de comparación de proporciones.
Para variables cuantitativas, es decir, de las que podemos calcular las medias,
explicaremos dos técnicas:

• Análisis de varianza (Analysis of Variance o ANOVA), para comparación de diferencias


de medias entre un grupo de variables.
• Análisis Tukey, para comparar las diferencias de medias en variables pareadas.

Para variables cualitativas o cuantitativas, de las que disponemos de las proporciones de


respuestas:

• El contraste de Chi cuadrado, χ2.


• Análisis visual, mediante el gráfico boxplot.

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:

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


La media global, Grand mean es de 6,37, y de 6,3 para Carrefour, 5,6 para Dia y de 7,2 para
Mercadona, rep nos indica el número de casos. Nuestro objetivo ahora es conocer si esta
disparidad se debe solo al azar o realmente existe una valoración distinta para los centros.
Para ello usaremos el comando summary() sobre el modelo previamente creado, obteniendo de
esta forma el análisis ANOVA:

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.

3.3.2. Análisis Tukey


Uno de los problemas del análisis ANOVA es que tiene en cuenta la variación entre todos

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


los grupos y no es capaz de discriminar si existe diferencia significativa entre un grupo y el
resto; por ejemplo, si podemos asumir que las medias de Dia y Carrefour son
significativamente las mismas, pero a su vez distintas a la de Mercadona. En este caso
utilizaremos el análisis TukeyHSD(), de R base, que compara de una forma pareada las medias
de cada variable creando un intervalo de confianza de la diferencia de estas.
Para realizar el análisis Tukey usaremos el comando de R base: TukeyHSD(), (HSD es el
acrónimo de Honest Significative Difference o «Diferencia Significativa Honrada»), al igual
que en el caso de aov() estaremos creando un «modelo», el cual asignaremos a la variable
survey_Pc1_Estab_medias_Tukey. El resultado lo convertiremos en data.frame, para lo cual pasamos
como variable de entrada el análisis de varianza creado previamente survey_Pc1_Estab_medias.
Como variable base de comparación usaremos ‘Establecimiento’, el resultado lo ordenaremos
con ordered = TRUE para que en la comparación reste la media superior de la inferior y dado que
TukeyHSD() nos devuelve un objeto list() obtendremos solo el resultado que nos interesa a
través de $Establecimiento:

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:

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


Una vez realizado el ajuste pasaremos al gráfico; como novedad, usaremos la geometría
geom_pointrange(), que representará la diferencia de medias como un punto y mediante una linea
los límites inferior y superior del intervalo de confianza. Los datos necesarios son
introducidos, como es habitual, en aes(): la diferencia de medias mediante y = diff, el límite
inferior con, ymin = lwr, el límite superior con ymax = upr, y mediante: color = comparacion
mostraremos las tres diferencias de medias:

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

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


tratamos con este tipo de variables, el método adecuado para averiguar si existen diferencias
significativas es la técnica de Chi cuadrado, que veremos a continuación.

3.3.3. Chi cuadrado, χ2


Cuando analicemos variables categóricas, para conocer si existe diferencia entre las
frecuencias de respuestas usaremos el contraste de Chi cuadrado, χ2. Una definición
interesante12 nos indica que este contraste trata de determinar si dos variables categóricas
tienen un nivel de correlación significativo entre ellas.
El análisis Chi cuadrado compara si las proporciones de las respuestas son similares o
distintas. La H0 es que son similares, es decir, no hay diferencia estadísticamente
significativa entre las proporciones y el p-valor obtenido indica la probabilidad de que esto
ocurra. En cambio, aceptar la H1 es aceptar que existen diferencias significativas entre las
proporciones. Como es usual, el punto de corte típico para aceptar la H0 es del 5%.
El primer paso es crear un objeto table que será el valor que introduciremos en la función.
Para poder realizar un análisis inicial y dado que table da valores absolutos, a este objeto le
aplicamos la función prop.table() indicando que realice la proporción por columnas a través
del parámetro 2:

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:

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


R, en este caso, crea el data.frame en formato largo, es decir, Var2 incluye los valores de las
respuestas de la 1 a la 10 para cada centro y este formato es ideal para ggplot. Con objeto de
que el resultado sea más legible, cambiaremos los nombres a las variables por unos más
descriptivos de su contenido mediante colnames() y realizaremos el gráfico de barras, para lo
cual usaremos geom_bar(), el parámetro stat = ‘identity’ indica que queremos un gráfico de
barras y no un histograma y position = ‘dodge’ que aparezca una barra para cada centro:

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


En el gráfico podemos ver claramente tres tipos de simetrías para cada distribución; en el
caso de Dia, dominan la proporción de respuestas por debajo del 6, la distribución de
Carrefour es mucho más simétrica respecto a este valor y en el caso de Mercadona las
respuestas están más distribuidas hacia los valores mayores que 6. Esta percepción la
contrastaremos estadísticamente a través del contraste de Chi cuadrado. Tal y como
indicábamos anteriormente, el comando chisq.test() tan solo necesita el objeto table que
creamos inicialmente:

Pearson’s Chi-squared test


data: survey_Pc1_Estab_chi
X-squared = 309.44, df = 18, p-value < 2.2e-16
Como podemos observar, en el p-value < 2.2e-16 el valor del contraste es prácticamente de
0, lo cual nos confirma estadísticamente la diferencia de las proporciones. Por lo que
podemos concluir que la opinión sobre la actitud de los empleados sí es distinta para cada
establecimiento.

3.3.4. Boxplot (gráfico de caja)


Este tipo de gráfico nos permite comparar las respuestas a variables de percepción en base
a variables de clasificación, como por ejemplo opiniones sobre la amabilidad de los
empleados o el nivel de satisfacción en función de la edad o el sexo.
Para ilustrar el uso de este tipo de gráfico compararemos las respuestas sobre la
amabilidad de los empleados para cada establecimiento. La caja central para cada
supermercado, también llamada Rango Intercuartílico, o Interquartile Range (IQR), nos
indica dónde se encuentran el 50% de las valoraciones sobre la amabilidad de los empleados;

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


la línea horizontal que cruza la caja nos indica la mediana de la distribución, es decir, dónde
se encuentra el valor que deja tanto por encima como por debajo el 50% de las valoraciones.
La línea vertical inferior nos indica el primer cuartil, o los valores que se encuentran en 25%
inferior de la distribución, y la superior nos indica el tamaño del tercer cuartil, o dónde se
encuentra el 25% de los valores superiores. Por otro lado, los puntos negros fuera del
diagrama nos indican los outliers o valores extremos. Estos valores extremos son los que
están a más de 1,5 veces de distancia del rango intercuartílico, es decir, fuera del rango:
±1,5xIQR.
Antes de realizar el gráfico y con el objetivo de tener información del número de casos
para cada establecimiento, crearemos una etiqueta específica para ello. Primero creamos la
variable xlabs usando el comando paste0(); este comando une los valores de las variables o
cadenas de texto que se introducen sin dejar espacios intermedios, en nuestro caso el nombre
del nivel, o nombre del establecimiento que hay en la variable Establecimiento, junto a “\n(N=”
donde \n le indica a R que haga una nueva línea (retorno de carro), junto a
table(survey$Establecimiento), que cuenta cuántos casos hay por establecimiento, y termina
pegando “)”, es decir, el paréntesis que cierra la etiqueta.

[1] “carrefour\n(N=617)” “dia\n(N=719)” “mercadona\n(N=704)”

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:

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


En el gráfico destaca la valoración de Mercadona, aparentemente superior en media y con
las opiniones mucho más concentradas respecto a esta. En el caso de Dia, la valoración es la
menor y existe una mayor dispersión. Carrefour se sitúa entre ambas medias y también en
este caso las opiniones son más dispersas. En Mercadona podemos observar un outlier con
un valor muy inferior a los del resto de la distribución.

3.3.5. Ejemplo comparación similitud de respuestas


A continuación pondremos un ejemplo de la comparación entre la similitud de las
respuestas. En este caso seleccionaremos el supermercado Dia, la percepción sobre la
relación calidad precio, y como variable para discriminar las respuestas la compra media,
dejamos como ejercicio su interpretación:

ANOVA

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


Tukey

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


Chi cuadrado

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


Pearson’s Chi-squared test
data: dia_C3_Ph1_Calid_chi
X-squared = 43.622, df = 36, p-value = 0.179

Boxplot

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


3.4. Correlación

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

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


en el que incluimos de la forma usual los valores de nuestro cuestionario. Dentro del
comando cabe destacar dos parámetros, uno de ellos introducido a través de mar=c(0,0,1,0),
que ajustará la posición del título dado por title. También es de destacar el comando order =
“hclust”, que permitirá agrupar de forma automática las variables en función de su nivel de
correlación, y por otro lado addrect = 8, que nos permitirá incluir en el gráfico el número
determinado de grupos más afines por su nivel de correlación que consideremos adecuado, en
nuestro caso 8 grupos:

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

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


el resto de las variables.
A continuación mostramos las matrices de correlación para el resto de los centros, dejando
su análisis como ejercicio.

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)
Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)
Capítulo 4
Análisis factorial

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.

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


4.1. Introducción
En primer lugar cargaremos las librerías necesarias. En este caso añadimos la librería
psych, (Revelle, 2017), que utilizaremos para realizar los análisis factoriales. También
cargamos los datos y creamos las variables para cada uno de los supermercados:

4.2. Análisis factorial, análisis de componentes


principales

Aunque existen algunas diferencias conceptuales y metodológicas entre el análisis


factorial y el análisis de componentes principales, dado que el resultado final es muy similar,
a lo largo de este texto asumiremos que ambas técnicas se pueden usar de forma indistinta
para la reducción de la dimensionalidad.

4.2.1. Análisis factorial y correlación


En el capítulo anterior, cuando realizábamos la representación visual de las matrices de
correlación observamos que había algunas variables que correlacionaban muy bien con otras;
este hecho se debe en parte al diseño del cuestionario, es lógica una valoración similar en el
trato de los empleados o en todo lo relacionado con los tiempos de espera en el
supermercado, especialmente en las colas. Si repasamos la matriz de correlación de todos los
establecimientos:

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


Podemos identificar algunos bloques de variables que tienen una agrupación natural, por
ejemplo las variables Pg1, relacionadas con factores ambientales del establecimiento, o las
variables Pg1, que tratan del número de empleados adecuado en el supermercado, o las
variables Pe1, que tienen que ver específicamente con los tiempos de espera. Por otro lado, el
grupo de variables Pe1 relacionadas con la experiencia del trato con los empleados, el interés
por resolver las consultas o el conocimiento de la gama. La técnica de análisis factorial busca
encontrar de forma matemática (para comprender su cálculo recomendamos Grande &
Abascal, 1989) las variables que más correlacionan entre sí y poder convertirlas en una única
variable «sintética» o factor, formada como combinación lineal de las variables originales.
Mediante su uso podemos conseguir reducir el número de dimensiones de nuestra
encuesta original, entendiendo dimensiones por variables, de forma que podamos trabajar
con un menor número de variables y poder comprender mejor cuáles son las que más afectan
a los resultados.
La reducción de dimensiones mediante el uso de un menor número de variables tiene un
coste en términos de fidelidad con el original, lo que llamaremos varianza explicada; es decir,
si usamos todas nuestras variables conseguiremos explicar el 100% de la varianza; según
vayamos reduciendo el número de variables a través de la creación de factores, el porcentaje
de varianza explicada irá disminuyendo. Para comprobarlo, realizaremos el análisis factorial
de las variables de valoración del supermercado.

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


4.3. Realización del análisis factorial
Como primer paso antes de realizar el análisis factorial comprobaremos la calidad del
resultado que podemos obtener usando la medida de Kayser, Meyer, Olkin o KMO (Kaiser,
1970). Esta medida va de 0 a 1 y considera aceptables valores superiores a 0,5 y de forma
creciente a medida que nos acercamos a 1 mejora la calidad del análisis. Para ello usaremos
el comando psych::KMO() seleccionando dplyr::select() las variables de survey que empiezan por
P, starts_with(‘P’). Una vez realizado el análisis obtenemos el resultado a través de
survey_KMO$MSA:

[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:

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


El resultado indica el nivel de correlación de cada variable con cada uno de los factores
(psych automáticamente omite valores menores a 0,10), podemos observar que todas las
variables tienen un nivel de correlación elevado con el primer factor PC1, que es el que explica
la mayor proporción de la varianza. Para ver esta capacidad de explicación de la varianza de
cada factor, hemos de mirar el valor de SS loadings en la parte inferior de la tabla. El autovalor
asociado a este primer factor es de 13,11, y para calcular su varianza explicada, dividiremos
este valor entre 27, que es el número total de variables introducidas en el análisis, obteniendo
de esta forma el porcentaje de varianza explicada por el factor y mostrada en la fila Proportion
Var, en nuestro caso 49% para el primer factor, 8% para el segundo, 5% para el tercero y 4%
para el cuarto. La tercera fila, llamada Cumulative Var, va recogiendo el porcentaje adicional de
varianza que explica cada nuevo factor que introducimos en el análisis. Teniendo un valor del

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


65% para el factor PC4, lo que podemos interpretar como el porcentaje de información que
conseguimos reproducir con los 4 factores utilizados respecto a la información original con
27 variables.
Como regla general, se suelen buscar factores que al menos tengan un autovalor de 1, lo
que indicaría que explican lo mismo que una variable; en caso de que fuera inferior el factor,
explicaría menos de lo que lo hace una variable, lo cual no es recomendable.
Después del análisis de las cargas factoriales revisaremos las comunalidades, que estarán
almacenadas en la variable survey_principal$communality; estas nos indicarán la parte de la
variabilidad de cada variable que puede ser explicada por los factores extraídos y toma un
valor entre 0 y 1. Como criterio general podemos pensar que valores inferiores a 0,5 pueden
indicar que esa variable está poco explicada por el análisis y que sería susceptible de ser
eliminada de este. Según el valor se acerca a 1 asumimos que la variable encaja mucho mejor
con el análisis. Dado que los comandos usados han sido explicados con anterioridad,
introduciremos un breve comentario de cada uno de ellos:

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

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


16 0.65 Pc1.Atencion
17 0.64 Pe1.ResolConsulta
18 0.64 Pe1.ConocGama
19 0.63 Pe1.Interes
20 0.61 Pe1.Experienc
21 0.59 Pg1.Señalizacion
22 0.59 Ph1.Satisfaccion
23 0.59 Pg1.NumEmplead
24 0.57 Pd1.Asesora
25 0.56 Pd1.InfoCompleta
26 0.54 Ph1.CalidadPrecio
27 0.46 Pg1.IdentCadena

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.

4.4. Análisis factorial rotado


Para comprender bien el concepto de rotación nos basaremos en un ejemplo: supongamos
que hemos realizado una encuesta en la que preguntamos sobre el nivel de deportividad y de
comodidad de 5 modelos de automóvil. Los resultados vienen dados por las variables
deportividad y comodidad y los grabamos a través del comando c(). Una vez obtenidos los
datos creamos un data.frame llamado sin_rotar que tiene 3 columnas, dos para las variables
deportividad y comodidad y otra para el modelo de automóvil.
Con estos datos realizaremos un gráfico de dispersión donde se representa en el eje x la
deportividad y en el eje y la comodidad, geom_hline() indica que queremos una línea en el eje
horizontal que pase por el valor 1,5, yintercept = 1.5, que sea de de color gris al 70%, colour =
“gray70”, realizamos el mismo proceso para el eje vertical con: geom_vline(). El comando
geom_point(fill = NA, alpha = 0) indica que queremos un gráfico de dispersión, pero sin puntos:
fill = NA. Estos puntos los representaremos por el nombre de cada modelo a través de
geom_text(aes(label = modelo)). El comando geom_smooth(method = lm, se = FALSE) indica que
queremos la recta de regresión que pasa entre los puntos method = lm y sin indicar el intervalo
de confianza se = FALSE. Por último, añadimos las etiquetas de los ejes con labs():

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


Podemos observar que los modelos A y B puntúan alto en comodidad y bajo en
deportividad, pero aun así la relación queda confusa y, por ejemplo, el modelo C sería difícil
de clasificar a la luz del gráfico. Si rotamos los datos, es decir, los situamos todos en el eje
horizontal (en este caso los datos han sido rotados manualmente), podemos ver que la
información es mucho más clara sobre la puntuación de cada vehículo:

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


En este nuevo gráfico, ya rotado, podemos observar en el eje horizontal que los vehículos
cómodos se sitúan en el lado izquierdo y los deportivos en el lado derecho, pudiendo
establecer una línea que va de la comodidad a la deportividad, pero exclusivamente en un eje.
Un proceso similar se realiza cuando hacemos el análisis factorial rotado, favoreciendo la
interpretabilidad de los resultados.
A continuación realizaremos el análisis rotado aplicando el mismo comando
psych::principal(), pero esta vez indicando rotate = ‘varimax’, y mostraremos los resultados
mediante print(), en este caso cutoff = 0.4 indica que se omitan valores menores de 0,4:

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


Después de la rotación se puede observar más claramente la agrupación de las variables;
para tener una mayor claridad en el resultado, visualizamos solo los valores mayores de 0,4.
En el primer factor o RC1, teniendo en cuenta las variables con una puntuación mayor,
podríamos incluir:

• Actitud.
• Atención.
• Atención esperas.
• Actitud de servicio.

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


• Información completa.
• Experiencia de los empleados.
• Resolución de consultas.
• Conocimiento de gama.
• Dominio para resolver consultas.
• Interés para resolver problemas.

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»:

• Tiempo de espera atención.


• Duración de la fila en cajas.
• Rapidez en resolver consultas.
• Número de empleados en cajas.
• Número de empleados adecuado.

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.

4.5. Representación gráfica del análisis factorial


Una vez obtenidos los datos del análisis y aceptado el modelo obtenido realizaremos un
gráfico; como primer paso hemos de extraer los resultados del análisis y ponerlos en un
nuevo data.frame al que llamaremos survey_principal_cargas_rot; esta variable quedará
almacenada para su posterior procesamiento en caso de considerarse necesario. Dado que la
variable de la que queremos extraer los datos es del tipo lista (list), para convertirla en
data.frame() hemos de usar el comando unclass(). Posteriormente, a través de rownames(),
añadimos una nueva columna con el nombre de las variables, dado que estas vienen dadas en
el nombre de las filas. Para obtener una tabla más clara, eliminaremos el nombre de las filas
usando de nuevo rownames(), pero ahora indicando que estos desaparezcan a través de <- NULL.
Posteriormente a través del comando dplyr::select() reordenamos las columnas, poniendo
primero la columna variables y después las columnas de los factores rotados a través de
starts_with(‘R’), para a continuación mostrar el resultado:

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


Una vez creados los datos para las variables, procederemos a extraer las puntuaciones de
cada individuo y del establecimiento sobre el que se le realizó la encuesta. Para ello
procederemos de forma similar al caso anterior, pero ahora partiendo de
survey_principal_rot$scores. Al data.frame creado le añadimos una nueva columna indicando al
establecimiento al que se refiere y visualizamos:

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:

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


Para interpretar el gráfico partimos del eje horizontal que representa la Actitud de los
empleados: cuanto más a la derecha, mejor percepción, y viceversa. El eje vertical representa
el Establecimiento, en este caso cuanto más arriba mejor percepción. Podemos observar que
los valores de Mercadona son los que más se mueven hacia la derecha, valorándose la actitud
de sus empleados, justo el caso contrario que Carrefour y Dia. Respecto al establecimiento,
las puntuaciones más altas corresponden a Carrefour, siendo también el que tiene una menor
puntuación Dia.
A continuación, y a través de la creación de unas variables temporales, crearemos un
gráfico para representar cada individuo y centro en cada factor, partiendo de que el eje
horizontal representa siempre la actitud de los empleados. En labs(), al añadir , x = ‘’, y = ‘’
indicamos que no aparezcan los títulos de los ejes:

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


En los tres gráficos podemos observar que en general la actitud hacia Mercadona es más
positiva tanto para establecimiento como para gama de productos, ambas compartidas con
Carrefour. Respecto a los tiempos, claramente Mercadona es la mejor posicionada, dado que
en el eje vertical, que es el que representa a este factor, gran parte de los encuestados sitúan a
Carrefour y Dia por debajo del valor 0.

4.6. Análisis individual de cada centro


A continuación repetimos el análisis factorial, pero en este caso de forma individual para
cada centro, dejando como ejercicio su interpretación:

[1] 0.9570679

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


dia_principal_rot.communal
Pc1.Actitud 0.59605
Pc1.Atencion 0.58484
Pc1.AtencRapida 0.62751
Pc1.Servicio 0.63155
Pd1.Asesora 0.51381
Pd1.InfoCompleta 0.51250
Pe1.Experienc 0.52456
Pe1.Consultas 0.66966
Pe1.ConocGama 0.61997
Pe1.ResolConsulta 0.62330
Pe1.Interes 0.57982
Pe1.EsperaAtenc 0.59374
Pe1.EsperaCaja 0.71972
Pe1.ResolucRapida 0.70110
Pe1.EmpleadCaja 0.71415
Pf1.Competitivid 0.61014
Pf1.Variedad 0.60862
Pg1.NumEmplead 0.57822
Pg1.Decoracion 0.59854
Pg1.Iluminacion 0.64819
Pg1.Climatizacion 0.69114
Pg1.OrdenLimpieza 0.67119
Pg1.Amplitud 0.61358
Pg1.Señalizacion 0.62667
Pg1.IdentCadena 0.52456
Ph1.CalidadPrecio 0.46712
Ph1.Satisfaccion 0.53193

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)
[1] 0.9516299

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


carrefour_principal_rot.communal
Pc1.Actitud 0.64325
Pc1.Atencion 0.75346
Pc1.AtencRapida 0.69772
Pc1.Servicio 0.68525
Pd1.Asesora 0.57454
Pd1.InfoCompleta 0.59041
Pe1.Experienc 0.62681
Pe1.Consultas 0.68435
Pe1.ConocGama 0.68454
Pe1.ResolConsulta 0.67833
Pe1.Interes 0.63506
Pe1.EsperaAtenc 0.72482
Pe1.EsperaCaja 0.71998
Pe1.ResolucRapida 0.69326
Pe1.EmpleadCaja 0.72541
Pf1.Competitivid 0.47819
Pf1.Variedad 0.57069
Pg1.NumEmplead 0.54025
Pg1.Decoracion 0.58197
Pg1.Iluminacion 0.66952
Pg1.Climatizacion 0.63363
Pg1.OrdenLimpieza 0.67778
Pg1.Amplitud 0.61781
Pg1.Señalizacion 0.60867
Pg1.IdentCadena 0.52067
Ph1.CalidadPrecio 0.52255
Ph1.Satisfaccion 0.55517

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)
[1] 0.9385837

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


mercadona_principal_rot.communality
Pc1.Actitud 0.5450482
Pc1.Atencion 0.5087457
Pc1.AtencRapida 0.5420653
Pc1.Servicio 0.6100431
Pd1.Asesora 0.5425059
Pd1.InfoCompleta 0.5134129
Pe1.Experienc 0.5669762
Pe1.Consultas 0.6409816
Pe1.ConocGama 0.6066185
Pe1.ResolConsulta 0.6196565
Pe1.Interes 0.6233915
Pe1.EsperaAtenc 0.7028044
Pe1.EsperaCaja 0.7863103
Pe1.ResolucRapida 0.6409782
Pe1.EmpleadCaja 0.6488040
Pf1.Competitivid 0.6907612
Pf1.Variedad 0.6626871
Pg1.NumEmplead 0.4816341
Pg1.Decoracion 0.5116399
Pg1.Iluminacion 0.6354133
Pg1.Climatizacion 0.6261895
Pg1.OrdenLimpieza 0.6124220
Pg1.Amplitud 0.5741687
Pg1.Señalizacion 0.3736612
Pg1.IdentCadena 0.3390338
Ph1.CalidadPrecio 0.5634024
Ph1.Satisfaccion 0.5507149

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)
Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)
Capítulo 5
Análisis cluster o de conglomerado

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.

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


5.1. Introducción
En principio, como es usual, cargaremos las librerías necesarias y los datos.

5.2. Análisis cluster o de conglomerado

A continuación ilustraremos el análisis cluster; la palabra cluster la podemos traducir


como agrupación o conglomerado. Incluye una serie de técnicas que buscan clasificar
individuos en grupos homogéneos pero lo más heterogéneos entre sí.
En Investigación de Mercados esta técnica es especialmente útil a la hora de realizar la
segmentación del mercado.
Utilizaremos dos técnicas distintas, pero complementarias, para realizar nuestro análisis:

5.2.1. Cluster jerárquico


Cluster jerárquico: se basa en el cálculo de la distancia euclidiana entre cada uno de los
casos. Su ventaja es que nos permite realizar un gráfico llamado dendrograma en el cual estas
distancias se pueden visualizar y nos puede ayudar a decidir el número de grupos a crear. Su
inconveniente es que genera una matriz de distancias que es directamente proporcional al
número de casos, de forma que para grandes conjuntos de datos el cálculo puede ser muy
intensivo en computación.

5.2.2. K means cluster


K means cluster o cluster basado en medias. En este caso hemos de indicar el número de
clusters a crear. Esta técnica se clasifica como un algoritmo de aprendizaje no supervisado.13
El término no supervisado significa que no hay ningún resultado que predecir y que el propio

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


algoritmo intenta buscar patrones en los datos. El método asigna aleatoriamente un individuo
a cada grupo y mide la distancia de cada individuo al centroide de cada cluster, podemos
entender centroide como la media de la posición de cada uno de los individuos. A partir de
aquí se establece un mecanismo de iteración en el que se reclasifican los individuos al grupo
en el que están más cerca de su centroide y se vuelven a recalcular los nuevos centroides.
Estos pasos se repiten hasta que no hay disminución entre la distancia de cada individuo a su
centroide.

5.3. Análisis exploratorio, cluster jerárquico


Como es usual, comenzaremos trabajando con todos los supermercados, para después
hacer un análisis individualizado. Como primer paso realizaremos el cluster jerárquico con el
objetivo de obtener el dendrograma y decidir el número de grupos a crear para su posterior
análisis mediante K means.
Empezaremos calculando la matriz de distancias de las respuestas de valoración del
cuestionario mediante el comando de R base dist(). Con esta información de distancias
realizaremos el análisis cluster mediante hclust() y usando el algoritmo de Ward propuesto
por Murtagh & Legendre (2011), dado que es el que ofrece una representación más clara de
los resultados en el dendrograma. Las distancias se representan a través del comando plot()
de R base. Donde survey_segment es la fuente de datos main = es el título, sub = NA indica que no
queremos subtítulo, xlab y ylab los títulos de los ejes, labels = FALSE indica que no queremos
que figuren los números de cada caso en el eje X y hang = -1 permite alinear las ramas del
dendrograma.
Adicionalmente a través de rect.hclust() y con k = 2 indicamos que nos muestre un
rectángulo en color rojo, border=”red” que agrupe en 2 posibles cluster. Modificando este
parámetro, podemos probar diferentes agrupaciones.

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


A la luz del gráfico podríamos plantearnos establecer solo dos posibles grupos o racimos;
si embargo, si continuamos bajando por el eje vertical, podemos ver que a su vez estos dos
grupos se podrían descomponer en otros dos, que serían similares, pero únicos, dado que
todavía conservan cierta distancia entre ellos. Para comprobarlo repetiremos el gráfico, pero
esta vez cambiando el valor del parámetro a k = 4:

Viendo el resultado del gráfico, parece satisfactorio el usar 4 clusters; si miramos la


distancia que tienen los dos grupos iniciales entre ellos, esta estaría aproximadamente entre
125 y 150, y entre los nuevos 4 grupos la distancia máxima no llegaría a 100. De esta forma
podremos captar diferencias entre estos dos bloques de grupos similares. El procedimiento
que usaremos será el de K means.

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


5.4. Análisis con K means cluster
Una vez decidido el número adecuado de grupos, pasaremos a utilizar la técnica de K
means cluster para clasificar a cada individuo en uno de los grupos y poder estudiar sus
características en función de su opinión sobre los supermercados y también en función de las
variables de clasificación, como edad, ingresos, etc.
Dado que el algoritmo que usa K means comienza eligiendo un centro y asignando
individuos a ese centro de una forma aleatoria, fijaremos una semilla a la hora de generar los
números aleatorios a través de set.seed(1234) con el objetivo de poder obtener un resultado
idéntico en cada análisis basado en los mismos números aleatorios. A partir de aquí
aplicamos el comando kmeans() a las variables de valoración de la encuesta y le indicamos que
queremos 4 grupos. Para comprobar el número de individuos por grupo usamos el comando
table() y lo aplicamos a la columna survey_kmeans$cluster, que es la que almacena la
información de pertenencia a cada grupo. Para calcular los valores relativos usaremos
prop.table(), en este caso sin especificar fila ni columna, dado que survey_kmeans es un vector y
no una matriz:

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:

5.5. Perfil en base a las medias de los resultados

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

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


resultado nos devuelve una fila para cada cluster, transponemos mediante t() y borramos la
primera columna que nos indica el grupo al que pertenece cada una de ellas,
survey_kmeans_medias[,-1], obteniendo la información en el formato deseado:

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

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


ser el que más se parece al grupo 4. Si recordamos el dendrograma, obtuvimos 2 grupos
bastante distintos entre ellos, en nuestro caso los 3 y 2 en comparación con los 1 y 4, y que a
su vez se podrían dividir en otros dos más parecidos, pero con diferencias.
Este primer análisis sugiere una serie de nombres para cada uno de los grupos, que en
nuestro caso serán:

• 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»:

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


Para realizar el gráfico de las medias para cada tipo de cliente hemos de volver a usar
reshape2::melt:

variables variable
Pc1.Actitud Detractores
Pc1.Atencion Detractores
Pc1.AtencRapida Detractores
Pc1.Servicio Detractores
Pd1.Asesora Detractores

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


Pd1.InfoCompleta 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 !:

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


A la luz de estos datos podemos ver que los «Fans» son los que tienen unos ingresos
inferiores, aunque no hay mucha diferencia entre estos grupos. Destaca que este grupo sí son
los que tienen una compra media superior, con un valor de 61,42€ respecto a los
«Detractores» que tienen el menor valor de compra media, siendo esta de 39,96 €. Respecto a
la edad, son ligeramente más mayores el grupo de los «Fans», siendo para el resto de los
grupos la edad media similar. Respecto al sexo, dado que recodificamos esta variable como
«0» para los hombres y «1» para las mujeres, la media nos indicará la proporción de mujeres
respecto a hombres, dado que la media de la encuesta se sitúa en torno a un 58% de mujeres,
en el grupo de los «Fans» hay un número ligeramente superior de mujeres, con un 61%.

5.6. Análisis gráfico de los resultados


Pero las medias, al ser una medida tan agregada, pueden ocultar información que
intentaremos destapar a través de la representación gráfica de los distintos grupos. Para ello
comenzaremos incluyendo la clasificación dada por el cluster en el data.frame survey, que
contiene nuestros datos, creando una variable nueva survey$cluster, a la que trataremos como
factor manteniendo los nombres dados anteriormente a los cuatro clusters. También
reorganizaremos, como es habitual, los niveles de edad, compra media e ingresos:

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


Como primer paso realizaremos una tabla en la que colocaremos en filas el cluster de
pertenencia y en columnas el supermercado al que se refiere la encuesta:

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:

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


Este gráfico refleja claramente la realidad mostrada por la tabla realizada anteriormente.
Una de las dudas que surgía en el análisis de las medias de las variables, tanto para el
consumo medio como para la edad, era si el hecho de estar en el grupo de los fans redundaba
en un consumo medio superior en el supermercado, y por otro lado, si los fans en realidad
tenían más edad.
Comenzaremos por este último, y para ello realizaremos un boxplot en el que figure la
distribución de las edades de cada grupo:

En el gráfico se puede observar que, en realidad, el perfil de edades es muy parecido para

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


los 4 grupos, con la única salvedad que en el grupo de fans la distribución de edades es más
amplia, lo que redunda en un ligero incremento de la media, representada por el punto rojo.
Veamos ahora este mismo gráfico, pero con el consumo medio; en este caso mostramos
cada supermercado, con fill = Establecimiento y cambiamos el color del punto que representa
la media a blanco, colour = “white”.

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:

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


En estos casos es recomendable cambiar el tipo de gráfico y usar la «geometría»:
geom_jitter, que lo que hace es incorporar algo de ruido aleatorio a los datos usados:

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


En el gráfico se puede observar claramente cómo estas dos variables correlacionan
positivamente y que a mayor nivel de satisfacción y percepción de la relación calidad/precio
aumenta la probabilidad de pertenecer al grupo de los fans o contentos. En el caso de los
descontentos, el resultado es más dispar y se pueden observar de una forma más común
individuos que valoran bien la relación calidad/precio tienen una baja puntuación en
satisfacción. En el caso de los detractores suelen coincidir valoraciones bajas en ambas
variables, aunque coexisten individuos con valoración alta en la relación calidad/precio, pero
con bajos niveles de satisfacción.
Para seguir entendiendo cómo afectan las diversas variables a la pertenencia a un grupo u
otro, a continuación combinaremos la técnica cluster con el análisis factorial:

5.7. Mapa factorial con los grupos de cada cluster

Dado que en el análisis factorial habíamos obtenido el «resumen» de las respuestas al


cuestionario a través de los factores:

• «Empleados», con 23% de explicación de la varianza.


• «Establecimiento», con un 18%.
• «Esperas», con un 12%.
• «Calidad de la oferta», con un 11%.

Podemos ver cómo se relaciona el hecho de pertenecer a un cluster con la puntuación en


cada una de estas «variables sintéticas».
Como primer paso repetiremos el análisis factorial realizado en el capítulo anterior,

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


usando 4 factores y con rotación varimax, y crearemos la variable
survey_principal_scores_rot$cluster, que incorpora la información del cluster de pertenencia a la
información de la puntuación factorial. En este caso volvemos a usar el comando unclass(),
que nos permite transformar en data.frame una variable list(), que es el formato generado por
el análisis factorial.

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.

Como novedad, en el gráfico añadiremos el comando stat_ellipse() con el objetivo de


agrupar los clusters visualmente en el gráfico; para ello usaremos el comando type = ‘norm’
que basará su agrupación en una distribución normal bivariante; para rellenar la elipse
obtenida, le indicamos geom = ‘polygon’ y con una opacidad de solo el 10% a través de alpha =
0.1:

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


Podemos observar que los gráficos donde hay más concentración de los fans son los que
relacionan Empleados y Establecimiento y los que relacionan Empleados y Tiempos, por lo
que podríamos concluir que son los factores que más importancia tendrían a la hora de
generar el grupo de fans. En el caso de Empleados y Gama de Productos, podemos observar
que la distribución del grupo de fans es mucho más dispersa, lo que minoraría la importancia
de este último factor.
En todos los casos coincide que el grupo de detractores se sitúa en el eje inferior izquierdo
indicando baja puntuación en todos los factores.
Dejamos como ejercicio la repetición de este análisis para cada uno de los supermercados.

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


Capítulo 6
Análisis de regresión lineal múltiple

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:

Attaching package: ‘MASS’


The following object is masked _by_ ‘.GlobalEnv’:
survey
The following object is masked from ‘package:dplyr’:

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


select
Ante este hecho tenemos dos alternativas: una, cargar primero MASS y luego dplyr de forma
que esta última sea la que tome el control de la función select(), o bien, tal y como hemos
hecho con regularidad, preceder la función con el nombre de la librería: dplyr::select(), para
que sea esta la que tome control sobre la función.
Con el resto de librerías, que cargaremos como habitualmente, al no existir este conflicto
se han eliminado los comentarios. También cargamos los datos.

6.2. Regresión lineal múltiple


La palabra clave para comprender el método de análisis factorial es «resumir», en el caso
del cluster es «agrupar», en la regresión lineal la palabra clave es «explicar», es decir,
conocer cuáles son las causas o variables independientes que explican la variabilidad o
varianza (σ2) de una variable de respuesta o variable dependiente. El término lineal se refiere
a que entendemos que los movimientos de la variable dependiente son el resultado de la
suma de las influencias de las variables independientes.
En nuestro caso, trataremos de comprender cuáales son las causas que influyen en dos
variables que consideramos clave en el análisis, una de ellas es el nivel de satisfacción global
y la otra el importe medio de la compra; el objetivo es comprender cuáles son las variables
que explican un aumento o disminución en estas, y hasta qué punto influye cada variable, con
el objetivo de poder accionar las palancas de marketing que contribuyan a su mejora.

6.3. Satisfacción global


6.3.1. Análisis exploratorio
Como primer paso a la hora de realizar el análisis de regresión de la satisfacción global,
incluiremos en el modelo todas las variables que consideramos son susceptibles de influir en

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


esta, en nuestro caso todas las preguntas relacionadas con la percepción del supermercado.
Comenzaremos explicando las funciones de R Base que usaremos para crear el modelo:
Para realizar una regresión lineal en R Base, se usa la función lm() y tiene la forma: lm(Y ~
X1 + X2, data = datos), donde Y es nuestra variable dependiente, el símbolo ~ indica que
queremos realizar la regresión contra la variable o variables independientes: X1 + X2, el signo
+ entre estas indica que es una regresión lineal, y data = indica el data.frame del que queremos
obtener los datos. Una de las ventajas del comando lm() es que acepta objetos formula y estos
objetos se pueden crear a través del comando formula(). En nuestro caso, dado que en el
modelo exploratorio inicial incluiremos como variables independientes las 26 variables16 de
valoración del supermercado para explicar la satisfacción global, que actuara de dependiente,
crearemos la fórmula a través de formula(), a partir de la función paste(), la función paste() se
usa para unir cadenas de texto.
La creación de la fórmula combina dos cadenas de texto, la segunda corresponde a las
variables independientes, y usaremos paste() para concatenar los nombres de las variables,
colnames(), seleccionadas mediante dplyr::select(), pero sin incluir satisfacción global,
mediante el signo menos delante de su nombre: -Ph1.Satisfaccion, la función incluye un
comando adicional: collapse = ‘+’, que sirve para sustituir los espacios entre los nombres de
las variables por el símbolo +, que es la forma que necesitaremos para nuestra fórmula. Para
crear la primera cadena de texto que corresponderá a la variable dependiente y al signo ~,
simplemente introducimos estas como cadena de texto: ‘Ph1.Satisfaccion~’. Para comprobar el
resultado mostramos la fórmula creada:

Ph1.Satisfaccion ~ Pc1.Actitud + Pc1.Atencion + Pc1.AtencRapida +


Pc1.Servicio + Pd1.Asesora + Pd1.InfoCompleta + Pe1.Experienc +
Pe1.Consultas + Pe1.ConocGama + Pe1.ResolConsulta + Pe1.Interes +
Pe1.EsperaAtenc + Pe1.EsperaCaja + Pe1.ResolucRapida + Pe1.EmpleadCaja +
Pf1.Competitivid + Pf1.Variedad + Pg1.NumEmplead + Pg1.Decoracion +
Pg1.Iluminacion + Pg1.Climatizacion + Pg1.OrdenLimpieza +
Pg1.Amplitud + Pg1.Señalizacion + Pg1.IdentCadena + Ph1.CalidadPrecio
Para crear el objeto «modelo de regresión»: survey_fit_SG, usaremos lm() e incluiremos dos
parámetros: por un lado, la fórmula, y por otro, los datos mediante data = survey. Este objeto
guardará toda la información del modelo y podrá ser reutilizado más adelante; para visualizar
el resultado hemos de usar summary():

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


Call:
lm(formula = formula(paste(“Ph1.Satisfaccion ~”, paste(colnames(dplyr::select(survey,
starts_with(“P”), -Ph1.Satisfaccion)), collapse = “+”))),
data = survey)

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


Residual standard error: 1.28 on 2013 degrees of freedom
Multiple R-squared: 0.5702, Adjusted R-squared: 0.5646
F-statistic: 102.7 on 26 and 2013 DF, p-value: < 2.2e-16

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

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


conseguido explicar información de la variable dependiente a partir de muestras
independientes. Como es habitual, el punto a partir del cual dudamos de la capacidad de
explicación de nuestra regresión suele estar en el 5%.
Una vez realizada esta primera comprobación pasamos a la significatividad de la de cada
variable Pr(>|t|), es decir, la probabilidad de que el coeficiente al que va asociada la variable
sea 0. Por lo general, el punto de corte es 5%, pero en algunos casos y teniendo en cuenta la
información que podamos obtener de la variable, aunque sea poca, y en opinión de los
autores, podemos llegar a valores en el entorno del 10 al 15%.
Esta flexibilidad que recomendamos no se aplica en el caso de la coherencia económica de
la variable, es decir, su signo. Por ejemplo, la variable Pc1.Atencion con un coeficiente de
-0.004898, aunque claramente se ve que no es significativa, con un p-valor del 0,83; en caso de
que lo fuera, nunca podría ser aceptada, dado que no es coherente que el aumento de la
atención de los empleados a sus clientes impacte negativamente en el nivel de satisfacción.
Una vez hechas estas aclaraciones, el proceso normal consiste en eliminar todas las
variables que no sean significativas y que no tengan lógica económica y volver a hacer la
regresión, aunque este proceso es el recomendable; con objeto de ilustrar otras alternativas
usaremos el proceso de regresión por pasos de la librería MASS basado en el criterio de Akaike.

6.3.2. Análisis por pasos usando el criterio de Akaike


Este proceso consiste en la realización de diversos modelos y la selección del que
minimiza el criterio de Akaike. Hemos de tener en cuenta que el método no tiene en cuenta ni
la lógica económica ni los criterios del 5% de significatividad de las variables; por tanto, los
resultados han de ser examinados con cautela; aun así, puede servir como punto de partida
cuando tenemos tantas variables independientes, como es nuestro caso. El comando utilizado
es MASS::stepAIC() y como parámetros usamos el modelo de regresión creado previamente,
survey_fit_SG, y dado que no queremos mostrar todas las regresiones intermedias hasta mostrar
el «mejor modelo», incorporamos el parámetro trace = 0:

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)

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


Residual standard error: 1.278 on 2027 degrees of freedom
Multiple R-squared: 0.5684, Adjusted R-squared: 0.5658
F-statistic: 222.5 on 12 and 2027 DF, p-value: < 2.2e-16
Viendo los resultados de la regresión, podemos observar que pasamos la prueba del F-
statistic, con una probabilidad de aproximadamente 0. Por otro lado, el signo de todas las
variables independientes es positivo, lo que en nuestro caso es coherente con la lógica
económica, y por otro lado, el p-valor de estas es como máximo de un 13%. Como hemos
comentado, las variables con p-valor mayor que un 5% serían susceptibles de ser eliminadas,
pero consideramos adecuado el incluirlas en este caso.
El siguiente estadístico que miramos es el R2; este nos indica el porcentaje de varianza
explicada de la variable dependiente, en nuestro caso satisfacción global, mediante nuestra
regresión. Visto de otra forma, con un R2 = 56,84%, podemos considerar que hemos sido
capaces de explicar el 56,84% de las causas que influyen en la satisfacción global.
Uno de los peligros ocultos en la regresión es el problema de la colinealidad o nivel de
correlación entre las variables independientes. Básicamente este problema está relacionado
con incluir en un modelo dos variables en las que una sea una combinación lineal de la otra,
por ejemplo, introducir en un modelo GRP (Gross Ratings Points es una medida del impacto
de la publicidad en televisión en nuestro público objetivo) e inversión en publicidad de
televisión, que sería el producto del precio por GRP por el número de GRP. Cuando este
problema es muy grave, el propio programa eliminará una de las variables al realizar la
regresión, avisándonos del hecho.

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


Pero cuando el problema sea medianamente grave, el modelo será creado sin advertirnos.
Un método para detectar la colinealidad generalmente usado, aunque no recomendable
debido a su imprecisión, es el de hallar la matriz de correlación de las variables
independientes; cuando se observen niveles muy elevados, este hecho podría indicar un
problema de colinealidad; sin embargo, pueden ocurrir altos niveles de colinealidad entre las
variables al realizar la regresión, pero con variables con niveles medioaltos de correlación.
El método más recomendable para averiguar el nivel de colinealidad es el de calcular el
VIF17 (Variance Inflation Factor, o Factor de Inflación de la Varianza); este coeficiente
realiza una regresión de cada variable independiente contra el resto de las variables
independientes de forma que , donde es el coeficiente de determinación de la
variable i obtenido al realizar la regresión contra el resto de las variables independientes.
Según Kleinbaum, Kupper, Nizam, & Rosenberg (2013), los criterios usuales para detectar la
colinealidad serían:

• 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:

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


El nivel de autocorrelación detectado por el test en los residuos es de un 4,5%, con un
estadístico Durbin-Watson de 1,9, que es cercano a 2, y con un p-value del 4%, lo que nos
indicaría la probabilidad de que el nivel de autocorrelación sea en realidad 0. Con un p-valor
tan bajo podemos descartar el problema de autocorrelación de los residuos.

6.3.3. Importancia relativa de cada variable


Una vez aprobado el modelo de regresión y verificada su calidad estadística, pasaremos a
averiguar cuál es la importancia de cada variable, en nuestro caso, el nivel de satisfacción de
los clientes.
El método usado por la librería relaimpo() consiste en descomponer la varianza explicada o
R por cada una de las variables independientes; al tener el modelo un R2 del 56,84%,
2

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

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


0.05421066 Pd1.Asesora

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:

En el gráfico se ve claramente la distancia entre la capacidad explicativa de la relación


calidad/precio respecto al resto de variables.

6.3.4. Regresión con los factores


Una de las ventajas de las variables creadas a partir del análisis factorial es su
ortogonalidad, es decir, cada factor tiene una correlación de aproximadamente 0 con los
demás; este hecho implica que no tendremos problemas de colinealidad. Para realizar la
regresión hemos de repetir el análisis factorial y usaremos como variables independientes los
factores, después de haberles puesto el nombre que les dimos anteriormente:

• Actitud.

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


• Establecimiento.
• Esperas.
• Oferta.

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:

A partir de aquí, volveremos a realizar la regresión y a obtener los resultados:

Call:
lm(formula = Ph1.Satisfaccion ~ Actitud + Establecimiento + Esperas +
Oferta, data = survey_principal_scores_rot)

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


Residual standard error: 1.366 on 2035 degrees of freedom
Multiple R-squared: 0.5053, Adjusted R-squared: 0.5043
F-statistic: 519.6 on 4 and 2035 DF, p-value: < 2.2e-16
En este caso, el modelo, a pesar de que tiene una R2 ligeramente inferior con un 50,53%,
tanto las variables independientes como la constante son significativas y su resultado es más
claramente interpretable.
Si nos fijamos en la constante, podemos asumir que en media el nivel de satisfacción será
de 6,5. Respecto a las variables independientes, dado que están tipificadas, podemos
identificar las más importantes en función de su coeficiente, en este caso Establecimiento; de
hecho, su coeficiente de 0,77 nos indicaría que por cada punto que aumente esta variable el
nivel de satisfacción aumentará en 0,77. Le sigue a corta distancia Actitud y Esperas.
Una vez verificado el modelo, revisaremos los contrastes de colinealidad y de
autocorrelación de los residuos:

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:

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


En el gráfico podemos observar que el peso de los tres primeros factores es bastante
similar y que el que tiene menos importancia sería el factor Esperas.

6.4. Importe medio de la compra


En el caso anterior, a la hora de realizar la regresión con satisfacción utilizamos solo las
variables que estaban relacionadas con la opinión sobre el supermercado; la ventaja es que
ambas variables estaban en una misma escala. En el caso actual, a la hora de evaluar el
importe medio de la compra surgen varios problemas que pueden influir en la calidad de la
regresión. Estos problemas están relacionados con la heterogeneidad de las escalas, por
ejemplo euros o años de edad, y por otro lado porque hemos convertido una variable
continua, como puede ser el importe medio de la compra, en una variable discreta y con
saltos considerables, por ejemplo de 15 a 23 euros; no obstante, continuamos con nuestro
análisis para intentar conocer cuáles son las principales palancas que accionan el importe
medio de la compra.

6.4.1. Análisis exploratorio


En este caso comenzaremos realizando una primera regresión incluyendo las variables de
clasificación y los factores, para ello comenzamos realizando el análisis factorial y creando
nuestro data.frame:

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


Una vez creado procedemos a realizar la regresión, creando primero la fórmula:

Call:
lm(formula = formula_IM, data = survey_principal_scores_rot)

Residual standard error: 27.97 on 2032 degrees of freedom


Multiple R-squared: 0.1778, Adjusted R-squared: 0.175
F-statistic: 62.8 on 7 and 2032 DF, p-value: < 2.2e-16

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

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


importe medio, dado por la constante, de 22,8€, y a partir de aquí, es llamativa la influencia
del sexo, dado que los hombres están representados por el valor de 0 y las mujeres por el
valor de 1, y en función del coeficiente de 4,6, podemos asumir que, solo por el hecho de ser
mujer, la compra media aumentará en 4,6€ en media. Para poder ver el peso de cada variable
calcularemos su importancia relativa:

6.4.2. Importancia relativa de cada variable


Repetimos el mismo proceso que en el caso anterior para obtener la importancia relativa:

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

Cabe destacar el peso de las variables Ingresos, Edad y el factor Establecimiento en la


explicación del importe medio de la compra; entre las tres explican más del 80% de la
información obtenida a través de la regresión; por otro lado, la actitud de los empleados sería
la menos importante, con solo un 2,9% de importancia relativa. A continuación realizaremos
la representación gráfica:

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


Dejamos como ejercicio la realización de las regresiones para cada uno de los
supermercados.

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


1
IBM Corp. IBM SPSS Statistics for Windows, Armonk, NY: IBM Corp.
2 https://cran.r-project.org/

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 &

Abascal (2014), pp. 191-251.


6 Para más información, visitar la página de la asociación en España, AEDEMO:

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

10 Basado en: http://www.e-encuesta.com/blog/2015/metodo-top-two-box/

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/

14 Para repasar el código de estos gráficos se recomienda revisar el capítulo 1.

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

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


Bibliografía

ABASCAL, E., y GRANDE, I. (1989): Métodos multivariantes para la Investigación comercial.


Ariel, Barcelona.
ABDI, H., y WILLIAMS, L. J. (2010): «Tukey’s honestly significant difference (HSD) test».
Encyclopedia of Research Design. Thousand Oaks, CA: Sage, 1-5.
AKAIKE, H. (1974): «A new look at the statistical model identification». IEEE transactions on
automatic control, 19(6), 716-723.
DURBIN, J., y WATSON, G. S. (1951): «Testing for serial correlation in least squares
regression». II. Biometrika, 38(1-2), 159-178.
FOX, J., y WEISBERG, S. (2011): An R Companion to Applied Regression (second ed.).
Thousand Oaks CA: Sage. Recuperado a partir de
http://socserv.socsci.mcmaster.ca/jfox/Books/Companion
GRANDE, I., y ABASCAL, E. (2014): Fundamentos y técnicas de Investigación comercial (14.a
ed.). ESIC Editorial, Madrid, España.
GRÖMPING, U. (2006): «Relative Importance for Linear Regression in R: The Package
relaimpo». Journal of Statistical Software, 17(1), 1-27.
HOFNER, B. (2017): papeR: A Toolbox for Writing Pretty Papers and Reports. Recuperado a
partir de https://CRAN.R-project.org/package=papeR
KAISER, H. F. (1970): «A second generation little jiffy». Psychometrika, 35(4), 401-415.
https://doi.org/10.1007/BF02291817
KLEINBAUM, D.; KUPPER, L.; NIZAM, A., y ROSENBERG, E. (2013): Applied regression analysis
and other multivariable methods. Nelson Education.
MALHOTRA, N. K. (2004): Investigación de mercados: un enfoque aplicado. Pearson
educación.
MURTAGH, F., y LEGENDRE, P. (2011): «Ward’s hierarchical clustering method: clustering
criterion and agglomerative algorithm». arXiv preprint arXiv:1111.6285.
REICHHELD, F. (2003): «The one number you need to grow». Harvard business review,
81(12), 46-55.
REVELLE, W. (2017): psych: Procedures for Psychological, Psychometric, and Personality
Research. Evanston, Illinois: Northwestern University. Recuperado a partir de

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


https://CRAN.R-project.org/package=psych
VENABLES, W. N., y RIPLEY, B. D. (2002): Modern Applied Statistics with S (fourth ed.). New
York: Springer. Recuperado a partir de http://www.stats.ox.ac.uk/pub/ MASS4
WICKHAM, H. (2007): «Reshaping Data with the reshape Package». Journal of Statistical
Software, 21(12), 1-20. Recuperado a partir de http://www.jstatsoft.org/ v21/i12/
WICKHAM, H. (2009): ggplot2: Elegant Graphics for Data Analysis. Springer-Verlag New
York. Recuperado a partir de http://ggplot2.org
XIE, Y. (2014): «knitr: A Comprehensive Tool for Reproducible Research in R». En V.
Stodden, F. Leisch, & R. D. Peng (eds.), Implementing Reproducible Computational
Research. Chapman; Hall/CRC. Recuperado a partir de http://www.crcpress.
com/product/isbn/9781466561595
— (2015): Dynamic Documents with R and knitr (second ed.). Boca Raton, Florida:
Chapman; Hall/CRC. Recuperado a partir de http://yihui.name/knitr/
— (2016): bookdown: Authoring Books and Technical Documents with R Markdown. Boca
Raton, Florida: Chapman; Hall/CRC. Recuperado a partir de https://github.
com/rstudio/bookdown
— (2017): knitr: A General-Purpose Package for Dynamic Report Generation in R.
Recuperado a partir de http://yihui.name/knitr/

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


Otros títulos publicados:

Fundamentos y técnicas de investigación comercial


Ildefonso Grande Esteban
Elena Abascal Fernández
Este manual ha sido desarrollado en un lenguaje llano, que huye de tecnicismos innecesarios, ilustrado con
numerosos ejemplos reales. Se enseñan las aplicaciones y sus interpretaciones, de forma que el lector puede
adquirir soltura en su utilización sin tener que dominar los fundamentosmatemáticos.

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

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


Este libro pretende ser una guía útil para aquellos alumnos que cursan asignaturas de Investigación Comercial.
Su estructura es sencilla, buscando ante todo, una finalidad didáctica.

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.

Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)


Libros de Estadística-Ciencia de Datos|Statistics-Data Science Books (PDF)

También podría gustarte