Ejercicio 1

Atención médica: Para este primer ejercicio trabajaremos con la base de datos denominada Atencion . Esta base de datos contiene la información de 100 pacientes atendidos en cierto hospital, donde se registraron las diferentes variables.

data <- read.csv("Atencion.csv")
  1. Estadísticas descriptivas: Con las variables que corresponden a la descripción de los pacientes, realice un análisis exploratorio descriptico, explicando a detalle las características encontradas
library(psych)
datos2 <- data[,c("E","DI")]
describe(datos2)
vars n mean sd median trimmed mad min max range skew kurtosis se
E 1 100 68.64 17.52431 68.5 70.150 18.5325 24 94 70 -0.6336948 -0.081897 1.752431
DI 2 100 13.31 10.03096 14.0 12.925 14.8260 1 30 29 0.2746804 -1.435115 1.003096


En esta primera tabla de datos cuantitativos podemos observar que la variables E (Edad) nos muestra que el promedio de edad de los pacientes es de 68 años, la edad mínima fueron 24 años, mientras que la máxima 94 años.Con la variable DI (día de ingreso respecto al 1 de enero del año registrado) descubrimos que el promedio de días ingresados es 13 con una desviación estándar de 10 días y el mínimo de días es 1, mientras que máximo es 30 días.

table(data$S)
h m
48 52
table(data$C)
NO SI
58 42
table(data$D)
1 2 3 4
39 26 28 7

Por otro lado, podemos observar que en la variable S (Sexo) hay 48 hombres y 52 mujeres. Mientras que en C (sí o no se realizó una cirugía) 58 pacientes no se sometieron a cirugía y 42 sí. Además con la variable D (tipo de tratamiento realizado) vemos que se realizaron 39 tratamientos de medicina interna, 26 de traumatología, 28 de urología y 7 de oftalmología.

  1. Análisis factorial exploratorio (EFA): realice EFA con las de valoración de las diferentes atenciones recibidas (P1, P2, P3, P4, P5, P6, P7, P8, P9) durante la estancia en el hospital, esperando encontrar alguna estructura subyacente y apreciar cuáles son las áreas de oportunidad para mejorar.
datos3 <- data[, c("P1", "P2", "P3", "P4", "P5", "P6", "P7", "P8", "P9")]

Paso 1

Verificar que la matriz de correlaciones sea factorizable:

# Matriz de correlación
library(polycor)
## 
## Attaching package: 'polycor'
## The following object is masked from 'package:psych':
## 
##     polyserial
R <- hetcor(datos3)$correlations

# Graficar la matriz de correlación usando ggcorrplot
library(ggcorrplot)
## Loading required package: ggplot2
## 
## Attaching package: 'ggplot2'
## The following objects are masked from 'package:psych':
## 
##     %+%, alpha
ggcorrplot(R,type="lower",hc.order = T)


En el gráfico podemos notar que la mayoría de los datos tienen un correlación positiva. Hay bastantes valores con un correlaciones super altas, así como P7 y P9. Mientras que valores como P1 y P9 tienen correlaciones bajas.

# Prueba de esfericidad de Bartlett
cortest.bartlett(datos3)$p.value
## R was not square, finding R from data
## [1] 2.844082e-196


Dado que el p−value = 0, rechazamos la hipótesis nula y concluimos que las variables efectivamente están correlacionadas entre sí.

# Calcular el índice KMO
kmo <- KMO(R)
kmo
## Kaiser-Meyer-Olkin factor adequacy
## Call: KMO(r = R)
## Overall MSA =  0.71
## MSA for each item = 
##   P1   P2   P3   P4   P5   P6   P7   P8   P9 
## 0.62 0.81 0.67 0.62 0.69 0.82 0.67 0.83 0.73


El valor global 0.71 nos corrobora que con estas variables podemos aplicar un EFA. Sin embargo, haremos un ejemplo eliminando la varible P1 para observar qué pasa con los valores del MSA de cada item.

# Ejemplo de eliminar alguna variable
datos3E <- datos3[, -which(colnames(datos3) == "P1")]

# Calcular la matriz de correlación
R3    <-  cor(datos3E)
cortest.bartlett(R3)
## $chisq
## [1] 734.7774
## 
## $p.value
## [1] 1.030566e-136
## 
## $df
## [1] 28
# Calcular el índice KMO
kmorE <- KMO(R3)
kmorE
## Kaiser-Meyer-Olkin factor adequacy
## Call: KMO(r = R3)
## Overall MSA =  0.65
## MSA for each item = 
##   P2   P3   P4   P5   P6   P7   P8   P9 
## 0.53 0.46 0.57 0.66 0.85 0.68 0.85 0.72

Como notamos en este intento, al eliminar la variable P1, que tenía una importancia de 0.62 en nuestro análisis, podemos notar que las demás valores y el MSA global se ven afectados por lo cual no se eliminará ninguna variable.

Es decir, como todas las variables tienen un valor aceptable, mayor de 0.5, no eliminaremos ninguna.

Paso 2:

Elegir un método para extraer los factores:

# Prueba de modelo (mínimos residuales) con tres factores 
modelo     <- fa(R, nfactors = 3, rotate = "none",
                fm="minres") 

# Comunalidades
c1 <- sort(modelo$communality,decreasing = T)
c1
##        P1        P7        P3        P4        P2        P9        P5        P8 
## 0.9866668 0.9768271 0.9639828 0.9548569 0.8754714 0.8735662 0.7904947 0.7659898 
##        P6 
## 0.6328518
# Unicidades 
u1 <- sort(modelo$uniquenesses,decreasing = T)
u1
##         P6         P8         P5         P9         P2         P4         P3 
## 0.36714825 0.23401024 0.20950530 0.12643382 0.12452863 0.04514305 0.03601724 
##         P7         P1 
## 0.02317294 0.01333319


Dado que los datos son ordinales, utilizaremos el método de mínimos residuales.

Podemos observar en cuanto a las comunalidades que las variables P1 (0.9867), P7 (0.9768) y P3 (0.9639) tienen valores altos de comunalidad, lo que indica que están fuertemente relacionadas con los factores identificados.

En cuanto a las unicidades, P6 (0.3671) tiene la unicidad más alta, lo que indica que una porción considerable de su varianza no se relaciona con los factores comunes.

Paso 3:

Determinar el número de factores:

# Paralelo
fa.parallel(R,main=" ",ylab=" ")

## Parallel analysis suggests that the number of factors =  3  and the number of components =  3

Tomando en consideración la gráfica y la información utilizaremos tres factores.

Paso 4:

Rotar los factores:

library(GPArotation)
## 
## Attaching package: 'GPArotation'
## The following objects are masked from 'package:psych':
## 
##     equamax, varimin
rot<-c("Promax")
bi_mod<-function(tipo)
  
biplot.psych(fa(datos3,nfactors = 2,fm="minres",rotate = tipo),main = paste("Biplot con rotacion ",tipo),col=c("red","black"),pch=c(5,19),group = bfi[,"gender"])
sapply(rot,bi_mod)

## $Promax
## NULL

El biplot nos muestra nos grupos principales. Entre ellas las variables P4, P5, y P6 están altamente relacionadas entre sí y contribuyen más al factor MR2. Mientras que las variables P1, P2, P3, P7, P8, P9 están agrupadas en otro conjunto asociado con MR1.

Paso 5:

Interpretación de los resultados:

# Modelo Promax
modelo_promax <- fa(R, nfactors = 3, rotate = "Promax")
fa.diagram(modelo_promax)

El análisis factorial nos muestra que todas las variables están altamente correlacionadas con los factores. Además que los factores se pueden identificar como:

Ejercicio 2

Calificaciones estudiantiles: La base de datos para este segundo ejercicio se denomina Calificaciones. Esta base de datos contiene la información de 100 estudiantes de educación secundaria, donde se registraron diferentes variables.

data <- read.csv("Calificaciones.csv")
  1. Estadísticas descriptivas: Con las variables que corresponden a la descripción de los estudiantes, realice un análisis exploratorio descriptivo, explicando a detalle las características encontradas.
library(psych)
datos2 <- data[,c("Edad", "Grado")]
describe(datos2)
vars n mean sd median trimmed mad min max range skew kurtosis se
Edad 1 100 14.44 2.511871 15 14.5000 2.9652 10 18 8 -0.1798535 -1.261644 0.2511871
Grado 2 100 8.99 1.982219 9 8.9875 2.9652 6 12 6 -0.0864480 -1.218697 0.1982219


Mediante la tabla descriptiva podemos observar que la edad promedio es 14, con una ligera asimetría negativa, lo que sugiere que la mayoría de las edades están en el rango inferior. Siendo 10 años la edad mínima y 18 la máxima. El grado promedio es 9no, con una distribución casi simétrica y una desviación estándar de 1.98. Siendo 6to grado el mínimo y 12 el máximo.

  1. Análisis factorial exploratorio (EFA): realice EFA con las calificaciones de las diferentes asignaturas, explorando algunas estructura subyacente. Recuerde explicar a detalle el paso 5.
datos3 <- data[, c("Naturales", "Sociales", "Matematicas", "Espanol", "Ingles", "Deportes", "Humanidades", "Etica")]

Paso 1

Verificar que la matriz de correlaciones sea factorizable:

# Matriz de correlación 
library(polycor)
R <- hetcor(datos3)$correlations

# Graficar la matriz de correlación usando ggcorrplot
library(ggcorrplot)
ggcorrplot(R,type="lower",hc.order = T)


En el gráfico podemos notar que la mayoría de los datos tienen un correlación negativa. Las variables Naturales e Inglés tiene una correlación alta y positiva. Mientras que valores como Matemáticas e Inglés tienen correlaciones bajas, bastantes cercanas a 0. Además dentro de los valores que tienen correlaciones negativas está Humanidades y Matemáticas.

# Prueba de esfericidad de Bartlett
cortest.bartlett(datos3)$p.value
## R was not square, finding R from data
## [1] 4.747964e-225


Dado que el p−value = 0, rechazamos la hipótesis nula y concluimos que las variables efectivamente están correlacionadas entre sí.

# Calcular el índice KMO
kmo <- KMO(R)
kmo
## Kaiser-Meyer-Olkin factor adequacy
## Call: KMO(r = R)
## Overall MSA =  0.58
## MSA for each item = 
##   Naturales    Sociales Matematicas     Espanol      Ingles    Deportes 
##        0.51        0.99        0.52        0.96        0.53        0.27 
## Humanidades       Etica 
##        0.94        0.51


Notemos que hay variables que tienen un valor bajo para el agrupamiento, así como la variable “Deportes”. Por lo cual eliminaremos esta variable para observar el comportamiento, es decir, si los valores aumentan.

# Ejemplo de eliminar alguna variable
datos3E <- datos3[, -which(colnames(datos3) == "Deportes")]

# Calcular la matriz de correlación
R3    <-  cor(datos3E)
cortest.bartlett(R3)
## $chisq
## [1] 791.5942
## 
## $p.value
## [1] 5.491495e-154
## 
## $df
## [1] 21
# Calcular el índice KMO
kmorE <- KMO(R3)
kmorE
## Kaiser-Meyer-Olkin factor adequacy
## Call: KMO(r = R3)
## Overall MSA =  0.63
## MSA for each item = 
##   Naturales    Sociales Matematicas     Espanol      Ingles Humanidades 
##        0.64        0.98        0.51        0.85        0.64        0.14 
##       Etica 
##        0.51


En este intento, al eliminar la variable “Deportes”, que tenía una importancia de 0.27 en nuestro análisis, podemos notar que el MSA global aumenta. Sin embargo, otros valores como “Humanidades” se ven afectados y baja a 0.14. Por lo cual no se eliminará ninguna variable, dejando los valores originales. De este modo, conservamos el mayor número de variables con valores al menos aceptables.

Paso 2:

Elegir un método para extraer los factores:

# Prueba de modelo (mínimos residuales) con tres factores
modelo     <- fa(R, nfactors = 3, rotate = "none",
                fm="minres") # modelo mínimos residuales

# Comunalidades
c1 <- sort(modelo$communality,decreasing = T)
c1
##   Naturales       Etica      Ingles     Espanol Matematicas    Deportes 
##   0.9988049   0.9953006   0.9855021   0.9215440   0.9205274   0.9133414 
## Humanidades    Sociales 
##   0.6110079   0.3577813
# Unicidades 
u1 <- sort(modelo$uniquenesses,decreasing = T)
u1
##    Sociales Humanidades    Deportes Matematicas     Espanol      Ingles 
## 0.642218684 0.388992098 0.086658631 0.079472618 0.078456047 0.014497854 
##       Etica   Naturales 
## 0.004699374 0.001195089


Dado que los datos son ordinales, utilizaremos el método de mínimos residuales.

En cuanto a los resultados de las comunalidades, estas nos muestran que las variables Naturales, Ética e Inglés tienen comunalidades muy altas, lo que indica que una gran parte de su varianza es explicada por los factores identificados.

En términos de unicidades, Sociales y Humanidades presentan valores elevados, lo que nos muestra que estas variables son tienen un componente importante de varianza que no está capturado por los factores extraídos.


Paso 3:

Determinar el número de factores:

# Paralelo
fa.parallel(R,main=" ",ylab=" ")

## Parallel analysis suggests that the number of factors =  3  and the number of components =  3


Tomando en consideración la gráfica y la información utilizaremos tres factores.

Paso 4:

Rotar los factores:

library(GPArotation)
rot<-c("varimax")
bi_mod<-function(tipo)
  
biplot.psych(fa(datos3,nfactors = 2,fm="minres",rotate = tipo),main = paste("Biplot con rotacion ",tipo),col=c("red","black"),pch=c(5,19),group = bfi[,"gender"])
sapply(rot,bi_mod)

## $varimax
## NULL


Utilizando la rotación oblicua, el biplot nos muestra tres agrupaciones principales. Entre ellas las variables Matemáticas y Ética están altamente relacionadas entre sí. Mientras que las variables Naturales, Inglés, Español y Sociales se relacionan en un grupo aparte entre sí. Por último Deportes y Humanidades se relacionan bastante fuerte entre sí. Estas relaciones nos podrían demostrar los posibles patrones en el desempeño de los estudiantes según las clases.

Paso 5:

Interpretación de los resultados:

modelo_varimax <- fa(R,nfactors = 3,rotate = "varimax",fa="minres")

fa.diagram(modelo_varimax)


En este análisis factorial podemos confirmar lo mencionado en el biplot anterior. Existen tres factores principales muy bien relacionados con las variables asociadas. Como podemos observar 5 variables tienen una carga factorial de 1. Sin embargo, Sociales es la clase con menos carga factorial respecto a MR1.

Los factores se pueden identificar como: