Capítulo 6 Componentes principales.

6.1 Introducción.

A veces, menos es más. Esta es la filosofía que subyace a las técnicas de reducción de la dimensión de la información.

Imaginemos una serie de casos (por ejemplo, las empresas de un sector económico) caracterizados por múltiples variables. Puede ocurrir que, paradójicamente, el contar con tantas variables haga difícil la caracterización de los casos. Esto ocurre cuando algunas de las variables aportan una información muy parecida sobre los mismos. Por ejemplo, es más difícil hacerse una idea del comportamiento global en el ámbito económico o financiero de un grupo de empresas si tenemos que atender a los valores que toman en un conjunto de 10 variables, que si solo tenemos que atender a un par de indicadores. Las técnicas de reducción de la dimensión de la información tratan, precisamente, de disminuir el número de variables necesarias para caracterizar un grupo de casos aprovechando la posibilidad de que las (múltiples) variables originales compartan información sobre los mismos. Es decir, la idea subyacente es pasar de un planteamiento basado en manejar muchas variables con información compartida o redundante (variables que “dicen lo mismo” sobre el comportamiento de los casos) a un planteamiento en el que hay menos variables, pero que no comparten información (variables que “dicen” cosas diferentes sobre el comportamiento de los casos). En este proceso es importante que la pérdida de información sea mínima, y que solo se pierda la información redundante o repetida.

La principal técnica de reducción de la dimensión de la información es la de componentes principales, y es la que se expondrá y ejemplificará en el resto del capítulo. Pero antes, es preciso concretar la relación entre dos conceptos muy presentes en esta técnica: información y varianza.

6.2 Información y varianza.

En el apartado anterior hemos hablado de la posibilidad de que algunas variables compartan “información” sobre el comportamiento de los casos que constituyen nuestra muestra u objeto de estudio. Pero, ¿qué es, en este contexto, la “información”?

La información que una variable contiene sobre un conjunto de casos puede entenderse como su capacidad para diferenciar a unos casos de otros.

Observemos este ejemplo, en el que se representan los valores que toman un grupo de 20 empresas en 3 variables.

Información y Varianza
Información y Varianza

En la variable 1, todas las empresas toman el mismo valor. Por tanto, la capacidad que tiene la variable para distinguir a los casos (empresas), unos de otros, es nula. Eso es debido a que, en definitiva, esta variable no contiene información sobre el grupo de 20 empresas.

En la variable 2, existe cierta dispersión, aunque reducida, en los valores que adoptan los casos. Esto permite distinguir a unos de otros, aunque a veces con cierta dificultad. Por ejemplo, la empresa 17 se distingue del resto por ser la que tiene un valor (un poco) mayor. Aun así, como la dispersión es reducida, no se distinguen algunos casos de otros demasiado bien. En definitiva, la variable 2 contiene cierta cantidad de información sobre el conjunto de empresas de la muestra, aunque no demasiado grande.

Por último, la variable 3 muestra una dispersión considerablemente mayor que las otras dos variables. Existe un amplio abanico de valores que toman los diferentes casos (empresas). Esto hace que puedan diferenciarse con facilidad, en general, unos de otros. Esta variable posee, por tanto, una cantidad de información superior respecto a las empresas, ya que observando los valores que toman en la variable pueden diferenciarse con facilidad unas de otras.

Como conclusión, podemos establecer que cuanto mayor dispersión muestra una variable para un grupo de casos, mayor cantidad de información contiene sobre ellos, en el sentido de disfrutar de un mayor “poder” de diferenciación de unos casos respecto a otros.

Una medida de la dispersión de una variable usualmente utilizada es la varianza. Por tanto, en cierta manera, la varianza sirve para medir la cantidad de información que contiene la variable: a mayor varianza, mayor dispersión. Y a mayor dispersión, mayor cantidad de información.

En el ejemplo, puede observarse cómo la variable 3 es la que mayor varianza tiene, luego la variable 2, y la variable 1 tiene una varianza de 0 (y no posee información sobre las 20 empresas). Esta comparación de varianzas es válida siempre y cuando las tres variables estén expresadas en las mismas unidades, ya que la varianza es una medida de dispersión absoluta. Por ello, para poder comparar, hemos añadido también en el ejemplo una medida de dispersión relativa: el coeficiente de variación. Podemos comprobar cómo el mayor coeficiente de variación pertenece a la variable 3 (que es la que tiene una mayor cantidad de información), luego la variable 2 (que cuenta con menor cantidad de información), y por último la variable 1, con un coeficiente de 0 (no contiene información sobre las empresas).

6.3 Cálculo de componentes.

Vamos a considerar una serie de variables (en escala métrica) que caracterizan a la población de empresas de producción eléctrica mediante tecnología eólica en lo referente a la idea de “solidez del negocio”. Hemos seleccionado una muestra de 60 empresas. Nuestro objetivo es obtener una combinación lineal de estas variables (“componente principal”) que recoja la mayor parte de la suma de varianzas de las variables originales (“comunalidad”), de manera que pueda usarse como un indicador que resume o sintetiza el grado de solidez del negocio de cada empresa, con una pérdida mínima de información.

Las variables a partir de las cuales construiremos el indicador (“componente principal”) son:

  • RES: Resultado del ejercicio.

  • FPIOS: Fondos propios.

  • MARGEN: Margen de beneficio.

  • SOLVENCIA: Coeficiente de solvencia.

Vamos a suponer que trabajamos dentro de un proyecto que hemos creado previamente, de nombre “componentes”. Dentro de la carpeta del proyecto guardaremos el script llamado “componentes_eolica.R”, y el archivo de Microsoft® Excel® llamado “eolica_60.xlsx”. Si abrimos este último archivo, comprobaremos que se compone de tres hojas. La primera muestra un mensaje sobre el uso de los datos, la segunda recoge la descripción de las variables consideradas, y la tercera (hoja “Datos”) almacena los datos que debemos importar. Estos datos se corresponden con diferentes variables económico-financieras de 60 empresas productoras de electricidad mediante generación eólica.

Es muy importante observar que existen variables con datos faltantes (missing values). En concreto, podemos identificar estas faltas de dato por la existencia de celdas en blanco; pero también por la existencia de celdas con el texto “n.d.” (no dato). Así, tendremos que aplicar código adicional en el comando de importación de R para que estos casos queden correctamente recogidos como NAs (not available).

Cerraremos el archivo de Microsoft® Excel®, “eolica_60.xlsx” y volveremos a RStudio. Después, abriremos nuestro scriptcomponentes_eolica.R”. Este script contiene el programa que vamos a ejecutar en lel ejemplo.

La primera línea / instrucción en el script es:

rm(list = ls())

La instrucción tiene como objeto limpiar el Environment (memoria) de objetos de anteriores sesiones de trabajo. Para importar los datos almacenados en la hoja “Datos” del archivo “eolica_60.xlsx”, ejecutaremos el código:

# DATOS

library(readxl)
datos <- read_excel("eolica_60.xlsx", sheet = "Datos", na = "n.d.")

Podemos observar cómo, en el Environment, ya aparece un objeto. Este objeto es una estructura de datos tipo data frame, se llama “datos” y contiene 12 columnas, una por cada una de las variables almacenadas en el archivo de Microsoft® Excel®. De estas variables, tres son de tipo cualitativo (atributos o factores), formadas por cadenas de caracteres: el nombre de la empresa (NOMBRE), el nombre de la sociedad matriz (grupo empresarial) a la que pertenece (MATRIZ), y el tamaño de dicho grupo de empresas (DIMENSION).

R ha considerado la primera columna de la hoja de Excel (NOMBRE) como una variable de tipo cualitativo o atributo. En realidad no es una variable; sino el nombre de los casos (empresas). Para evitar esto, podemos redefinir nuestro data frame diciéndole que esa primera columna contiene los nombres de los casos (filas):

# DATOS
datos <- data.frame(datos, row.names = 1)

En la línea anterior hemos asignado al data frame “datos” los propios datos de “datos”; pero indicando que la primera columna no es una variable; sino el nombre de los casos o filas (empresas). Advertimos que ya no aparece NOMBRE como variable, y que en el Environment ya aparece el data frame “datos” con 60 observaciones, pero con 11 variables (una menos).

Como en el ejemplo se plantea construir un indicador basado en las 4 variables antes indicadas (RES, FPIOS, MARGEN y SOLVENCIA), crearemos un data frame con solo esas variables. Lo llamaremos, por ejemplo, “muestra”:

# Seleccionando variables metricas para el analisis.

library(dplyr)
muestra <- datos %>% select(RES, FPIOS, MARGEN, SOLVENCIA)
summary (muestra)
##       RES            FPIOS            MARGEN          SOLVENCIA     
##  Min.   :-5661   Min.   :-77533   Min.   :-302.03   Min.   :-40.74  
##  1st Qu.:  496   1st Qu.:  2323   1st Qu.:  11.70   1st Qu.:  5.94  
##  Median : 1939   Median :  9727   Median :  27.64   Median : 16.88  
##  Mean   : 2699   Mean   : 18801   Mean   :  30.63   Mean   : 28.12  
##  3rd Qu.: 3903   3rd Qu.: 26493   3rd Qu.:  39.59   3rd Qu.: 51.38  
##  Max.   :17026   Max.   :177707   Max.   : 400.90   Max.   : 99.08  
##  NA's   :1       NA's   :1        NA's   :2         NA's   :1

El siguiente paso será localizar los posibles missing values, ya que para obtener componentes principales es necesario que todos los casos posean dato para todas las variables del análisis. Para tener una idea general, se puede utilizar la función vis_miss() del paquete {visdat}, que localizará gráficamente los missing values de las diferentes variables, y calculará el porcentaje de casos que supone, con respecto al total de observaciones:

library(visdat)
vis_miss(muestra)

Del gráfico anterior se desprende que existen 5 missing values repartidos en las 4 variables del estudio. Para localizarlos, podemos filtrar nuestro data frame con las herramientas de {dplyr}:

muestra %>%
  filter(is.na(RES) | is.na(FPIOS) | is.na(MARGEN) | is.na(SOLVENCIA)) %>%
               select(RES, FPIOS, MARGEN, SOLVENCIA)  
##                                       RES      FPIOS  MARGEN SOLVENCIA
## Biovent Energia SA                     NA 70033.0000  22.792    38.082
## Eolica La Janda SL             9880.09100         NA  38.256    16.428
## Parc Eolic Sant Antoni SL       668.00000  9727.0000      NA    13.964
## WPD Parque Eolico El Poleo SL.  -30.63754   520.6033 -11.121        NA
## Eolica La Brujula SA           2306.06200 21694.7910      NA    51.474

Ante la existencia de missing values, se puede actuar de varios modos. Por ejemplo, se puede intentar obtener por otro canal de información el conjunto de valores que no están disponibles, o recurrir a alguna estimación. En caso de que esto sea difícil, se puede optar, simplemente, por eliminar estos casos, en especial cuando representan un porcentaje muy reducido respecto al total de casos. En nuestro ejemplo, supondremos que hemos optado por esta última vía, y eliminaremos estos casos con el código:

muestra <- muestra %>%
  filter(! is.na(RES) & ! is.na(FPIOS) & ! is.na(MARGEN) & ! is.na(SOLVENCIA))  

Verificamos en el Environment que el data frame “muestra” ha pasado a tener 53 casos.

Por otro lado, la técnica de componentes principales es muy sensible a la existencia de outliers. En consecuencia, deberán ser identificados y, en su caso, eliminados. Para realizar este proceso, y dado que en nuestro análisis contamos con 4 variables, primero “resumiremos” el valor que toman dichas variables para cada observación (empresa), mediante el cálculo de la distancia de Mahalanobis. De hecho, las distancias de los diferentes casos se almacenarán en una nueva columna o variable de nuestro data frame, a la que llamaremos MAHALANOBIS:

muestra <- muestra %>%
  mutate (MAHALANOBIS = mahalanobis(cbind(RES, FPIOS, MARGEN, SOLVENCIA),
            center = colMeans(select(., RES, FPIOS, MARGEN, SOLVENCIA)),
            cov = cov(select(., RES, FPIOS, MARGEN, SOLVENCIA))))

Dentro de las funciones select() hay unos puntos. Recordemos que estos puntos deben ser añadidos cuando una función no es la primera del operador “pipe” (%>%), para indicar que las variables de los paréntesis hacen referencia al data frame “muestra” (o, en general, el objeto que fluye a través del “pipe”).

A continuación, construiremos un diagrama de caja de la variable MAHALANOBIS, como si fuera cualquier otra variable, a partir de la función ggplot() del paquete {ggplot2}:

library (ggplot2)
ggplot(data = muestra, map = (aes(y = MAHALANOBIS))) +
  geom_boxplot(fill = "orange") +
  ggtitle("DISTANCIA DE MAHALANOBIS", subtitle = "Empresas eólicas") +
  ylab("MAHALANOBIS")

En el gráfico se observa que existen, por encima de la caja, varios outliers. Para identificarlos de modo concreto, hemos de calcular los cuartiles primero y tercero de la variable MAHALANOBIS y pasar el correspondiente filtro:

Q1M <- quantile (muestra$MAHALANOBIS, c(0.25))
Q3M <- quantile (muestra$MAHALANOBIS, c(0.75))
muestra %>%
  filter(MAHALANOBIS > Q3M + 1.5*IQR(MAHALANOBIS) |
         MAHALANOBIS < Q1M - 1.5*IQR(MAHALANOBIS))%>%
         select(MAHALANOBIS)
##                                     MAHALANOBIS
## Viesgo Renovables SL.                  35.05290
## Guzman Energia SL                      10.31024
## WPD Wind Investment SL.                21.69461
## Molinos Del Ebro SA                    24.38816
## Tarraco Eolica SA                      21.91118
## WPD Parque Eolico Las Panaderas SL.     8.21836
## Eolica Navarra SL                      13.41478

Si, tras el estudio de los valores que toman las variables originales en estos casos, se decide eliminarlos, el código será:

muestra_so <- muestra %>%
  filter(MAHALANOBIS <= Q3M + 1.5*IQR(MAHALANOBIS) &
         MAHALANOBIS >= Q1M - 1.5*IQR(MAHALANOBIS))
muestra_so <- muestra_so %>% select(-MAHALANOBIS)

Se ha creado un nuevo data frame llamado “muestra_so” con los casos que no son outliers (y que no contienen missing values), y se ha eliminado la variable MAHALANOBIS, puesto que su única utilidad era la de localizar y filtrar los outliers. Con este data frame “muestra_so” es con el que se procederá al cálculo de las componentes.

La condición previa para el cálculo de componentes es que las variables originales del análisis contengan información redundante, es decir, que en buena medida aporten una “misma información” sobre los casos (empresas). Esto se verifica con la existencia de altas correlaciones entre las variables (al menos, entre algunas de ellas). Por tanto, hemos de calcular la matriz de correlaciones correspondiente. Un modo gráfico visualmente efectivo es utilizar las posibilidades que nos ofrece el paquete {GGally} mediante la función ggpairs():

# Correlaciones.

library (GGally)

corr_plot_so <- ggpairs(muestra_so, 
                        lower = list(continuous = wrap("cor",
                                                       size = 4.5,
                                                       method = "pearson",
                                                       stars = TRUE)),
                        title = "Matriz de Correlación sin outliers")
corr_plot_so

Puede apreciarse cómo existen altas correlaciones (en valor absoluto) entre todas las variables. Por tanto, tiene sentido hacer un análisis de componentes principales, ya que hay variables que parecen compartir información.

La obtención de las componentes se va a realizar mediante la función prcomp(). Es conveniente que activemos el argumento scale = con “T” (true) para que las variables originales sean consideradas en sus versiones tipificadas. Vamos a asignar los resultados a un objeto de nombre, por ejemplo, “componentes”. Por último, guardaremos el summary() o resumen de los resultados con un nombre provisional, por ejemplo, “temporal”. El código es el siguiente:

# Obtencion de componentes.

componentes <- prcomp (muestra_so, scale=T)
temporal <- summary (componentes)
temporal
## Importance of components:
##                           PC1    PC2    PC3    PC4
## Standard deviation     1.6903 0.7646 0.6487 0.3709
## Proportion of Variance 0.7143 0.1462 0.1052 0.0344
## Cumulative Proportion  0.7143 0.8604 0.9656 1.0000

La “Standard deviation” es la raíz cuadrada de los autovalores asociados a cada componente. “Proportion of Variance” nos dice la proporción de la suma de varianzas de las variables originales (comunalidad) recogida por cada componente, proporción que se acumula en “Cumulative Proportion”. Nótese que las componentes aparecen ordenadas de más a menos importantes en función de la cantidad de varianza que capturan. En este caso, la primera componente acumula más del 71% de la varianza (comportamiento) de las variables originales. Por tanto, esta primera componente resume bastante bien la información que las 4 variables originales contienen sobre los casos (empresas).

Si el elemento “importance” del summary() o resumen “temporal” lo convertimos en un data frame, por ejemplo “summary_df”, podremos presentar los resultados por medio de una tabla estéticamente más atractiva, a partir de la función kable() del paquete {knitr}, y las funciones complementarias del paquete {kableExtra}:

# Convertir el resumen en un data frame

summary_df <- as.data.frame(temporal$importance)
summary_df <- t(summary_df)  # Transponer para mejor visualización
rm (temporal)

# Crear la tabla con kable y personalizarla con kableExtra

library (knitr)
library (kableExtra)
knitr.table.format = "html"

summary_df %>%
kable(caption = "Resumen de Componentes",
      col.names = c("Desviación típica","Proporción de varianza (comunalidad)",
                    "Proporción de varianza (comunalidad) acumulada"),
      format.args = list(decimal.mark = ".", digits = 4)) %>%
  kable_styling(bootstrap_options = c("striped", "bordered", "condensed"),
                full_width = F, 
                position = "center") %>%
  row_spec(0, bold= T, align = "c") %>%
  row_spec(1:(nrow(summary_df)), bold= F, align = "c") %>%
  column_spec(1, bold = TRUE, extra_css = "text-align: left;")
Table 6.1: Table 6.2: Resumen de Componentes
Desviación típica Proporción de varianza (comunalidad) Proporción de varianza (comunalidad) acumulada
PC1 1.6903 0.7143 0.7143
PC2 0.7646 0.1462 0.8604
PC3 0.6487 0.1052 0.9656
PC4 0.3709 0.0344 1.0000

Los coeficientes o cargas de cada componente se obtienen pidiendo a nuestro objeto “componentes” el elemento “rotation”. Estas cargas las vamos a guardar en un nuevo objeto que llamaremos, por ejemplo, “cargas”, que presentaremos mediante una pequeña tabla diseñada con la función kable() del paquete {knitr} y otras funciones del paquete {kableExtra}:

# Cargas de cada componente.

cargas <- componentes$rotation
cargas %>%
  kable(caption = "Cargas de las componentes obtenidas",
        format.args = list(decimal.mark = ".", digits = 4))  %>%
  kable_styling(full_width = F, bootstrap_options = "striped",
                "bordered", "condensed",
                position = "center") %>%
  row_spec(0, bold= T, align = "c") %>%
  row_spec(1:(nrow(cargas)), bold= F, align = "c") %>%
  column_spec(1, bold = TRUE, extra_css = "text-align: left;")
Table 6.3: Table 6.4: Cargas de las componentes obtenidas
PC1 PC2 PC3 PC4
RES 0.4915 0.5578 0.48460 0.46094
FPIOS 0.5491 -0.1554 0.33515 -0.74971
MARGEN 0.4803 0.3406 -0.80447 -0.07849
SOLVENCIA 0.4758 -0.7407 -0.07528 0.46830

A partir de las cargas se pueden explicitar las ecuaciones correspondientes a cada componente. Por ejemplo, para la primera componente, la ecuación será:

\[ \text{CP}_{i1} = 0.4915 \cdot \text{RES}_{i1} + 0.5491 \cdot \text{FPIOS}_{i1} + 0.4803 \cdot \text{MARGEN}_{i1} + 0.4758 \cdot \text{SOLVENCIA}_{i1} \] Puede apreciarse que, en cuanto a la primera componente, que es la que especialmente nos interesa como “indicador” de la “solidez del negocio” en el caso de las empresas eólicas seleccionadas, las 4 cargas tienen signo positivo, lo que implica que, cuanto mayores sean los valores de una empresa en las varibles RES (resultado), FPIOS (fondos propios), MARGEN (margen de beneficio) y SOLVENCIA (coeficiente de solvencia), mayor será el valor ndel indicador y, por tanto, la solidez del negocio. Además, como las variables fueron tipificadas, el valor de las cargas son comparables. De este modo, vemos cómo, dentro de la primera componente, que es la que adoptamos como “indicador de solidez”, la mayor importancia la tiene el valor de los fondos propios de la empresa, seguido del resultado del ejercicio, el margen y la solvencia.

6.4 Retención de componentes principales.

La etapa de retención de componentes principales consiste en decidir cuántas de las componentes generadas (recordemos que, en un principio, se calculan tantas componentes como variable originales) consideramos que resumen de un modo aceptable la información contenida en las variables originales. Estas componentes “retenidas” se convertirán en las componentes principales.

La primera componente siempre es retenida y, por tanto, es una “componente principal”. El resto, que van capturando proporciones cada vez más pequeñas de la varianza común de las variables originales (comunalidad), podrán o no retenerse; aunque, siempre, la retención de una componente implica que se han retenido todas las anteriores.

Hay varios procedimientos o criterios para tomar la decisión de cuántas componentes retener. Uno de ellos, comúnmente aplicado, es el de retener aquellas componentes cuyo autovalor es mayor que 1 (suponiendo que se ha trabajado con las variables en sus versiones tipificadas).

Los autovalores, como ya vimos, son el cuadrado del elemento “Standard deviation” (sdev) del objeto “componentes” que hemos generado a partir de la función prcomp(). Hemos creado un data frame con estos autovalores calculados (y su orden, al que hemos llamado variable o columna “orden”, y que es un vector de números enteros consecutivos que va desde uno hasta número de variables originales o de componentes) y los hemos dispuesto en un gráfico de barras:

# Determinacion Componentes a retener.

# Criterio del Autovalor mayor que 1.

orden <- c(1:ncol(muestra_so))
autovalor <- componentes$sdev^2
autovalores <- data.frame(orden, autovalor)

autograph <- ggplot(data = autovalores,
                    map = (aes(x = orden, y = autovalor))) +
             geom_bar(stat = "identity",
                      colour = "red",
                      fill = "orange",
                      alpha = 0.7) +
             scale_x_continuous(breaks=c(1:nrow(autovalores)))+
             geom_hline(yintercept = 1, colour = "dark blue") +
             geom_text(aes(label = round(autovalor,2)),
                       vjust = 1, colour = "dark blue", size = 3) +
             ggtitle("AUTOVALORES DE LAS COMPONENTES",
                     subtitle = "Empresas eólicas") +
             xlab ("Número de componente") +
             ylab("Autovalor")

autograph

Respecto al gráfico, conviene recordar que, al ser un gráfico de barras, si no se quieren representar las frecuencias sino los valores que toma una variable (en este caso, “autovalor”) para cada valor de la otra variable (en este caso, “orden”); en el geom_bar() habrá que añadir el argumento stat = con el valor “identity”. Además, se utiliza el elemento scale_x_continuous() para pesonalizar la escala del eje x, y que se divida dicho eje en tantos tramos como componentes hay.

En el gráfico obtenido se advierte que solo el primer autovalor es mayor que 1, por lo que solo se retendrá la primera componente, que será la única componente principal. Nuestro objetivo era, de todos modos, obtener un único indicador (de “solidez del negocio”) que resuma la información contenida en las cuatro variables RES, FPIOS, MARGEN y SOLVENCIA, por lo que, aunque hubiera habido más componentes con autovalor mayor que uno, solo hubiéramos seleccionado la primera. No obstante, este resultado es positivo para nuestros intereses, ya que reafirma la idea de que únicamente con la primera componente se recoge una gran proporción de la comunalidad o varianza conjunta (comportamiento) de las 4 variables, luego es un buen resumen global de las mismas. Esto ya se vio anteriormente al hacer summary (componentes), aunque se puede representar gráficamente con el siguiente código:

# Determinar si cada autovalor es mayor o igual a 1

autovalores <- autovalores %>%
  mutate(variacum = 100*(cumsum((autovalor/nrow(autovalores)))))
checkcp <- ifelse(autovalores$autovalor >= 1, "CP", "NCP")
checkcp
## [1] "CP"  "NCP" "NCP" "NCP"
vacumgraph <- ggplot(data = autovalores, map = (aes(x = orden,
                                                    y = variacum,
                                                    fill = checkcp))) +
              geom_bar(stat = "identity", colour = "red", alpha = 0.7) +
              scale_x_continuous(breaks=c(1:nrow(autovalores)))+
              geom_text(aes(label = round(variacum,2)), vjust = 1,
                        colour = "dark blue", size = 3) +
              ggtitle("COMUNALIDAD ACUMULADA POR COMPONENTES",
                      subtitle = "Empresas eólicas") +
              xlab ("Número de componente") +
              ylab("Varianza acumulada")
vacumgraph

Para obtener el gráfico anterior, se comienza añadiendo al data frame “autovalores” una columna o variable que es la suma acumulada del porcentaje de comunalidad recogido por las sucesivas componentes, que están ordenadas de mayor a menor autovalor. Para calcular el porcentaje, se usa la función cumsum(), y se tiene en cuenta que, como las variables fueron tipificadas para calcular las componentes, la comunalidad, que coincide con la suma de las varianzas de las componentes (autovalores), es igual al número de variables o componentes (valor que toma la función nrow()).

Después, se ha creado un vector que contiene tantos elementos como variables o componentes hay en el análisis (vector “checkcp”). Con la función condicional ifelse() se consigue que los elementos de “checkcp” sean “CP” o “NCP” según los correspondientes autovalores sean mayores o no que 1. Finalmente, según sea el valor de cada elemento de “checkcp”, las barras del gráfico se colorearán de uno u otro modo.

Posteriormente, mediante el paquete {patchwork}, se han unido los dos gráficos creados en esta fase, poniendo uno debajo del otro:

library (patchwork)
autograph / vacumgraph

6.5 Puntuaciones de los casos (scores)

Para obtener las puntuaciones de cada caso (empresa) en el indicador de “solidez del negocio” (y que es nuestra componente principal, que a su vez coincide con la primera componente), simplemente debemos tener en cuenta que tales puntuaciones están guardadas en la matriz “x” del objeto prcomp() creado. Vamos a renombrar a las primera columna (componente) de esta matriz como “scores” y vamos a ver las puntuaciones de las empresas, que volcaremos en una tabla, junto al valor que toman en las variables originales, recolocando las filas (empresas) de mayor a menor valor de la puntuación (lo que se consigue mediante la función arrange() del paquete {dplyr}:

# Scores.

scores <- componentes$x[,1] #tantas columnas como componentes retenidas
scores_df <- as.data.frame(scores)
scores_df <- cbind(scores_df,muestra_so)
scores_df %>%
  arrange(desc(scores)) %>%
  kable(caption = "Puntuaciones de las componentes obtenidas",
        col.names = c("Empresa", "Puntuación", "Resultado", "F. Propios",
                      "Margen", "Solvencia"),
        format.args = list(decimal.mark = ".", digits = 4))  %>%
  kable_styling(full_width = F, bootstrap_options = "striped",
                "bordered", "condensed",
                position = "center", font_size = 12) %>%
  row_spec(0, bold= T, align = "c") %>%
  row_spec(1:(nrow(scores_df)), bold= F, align = "c") %>%
  column_spec(1, bold = TRUE, extra_css = "text-align: left;")
Table 6.5: Table 6.6: Puntuaciones de las componentes obtenidas
Empresa Puntuación Resultado F. Propios Margen Solvencia
Eolia Gregal De Inversiones SA. 6.34608 9420.00 81778.0 186.208 79.196
Elecdey SL 3.55316 5539.03 41042.3 144.924 65.208
CYL Energia Eolica SL 2.87125 9401.38 51821.6 37.795 51.290
Esquilvent SL 2.38469 9010.21 48769.1 39.476 30.938
Disa Duna SL. 2.35060 2594.40 42283.1 55.953 98.303
Parques Eolicos San Lorenzo SL 2.11047 4311.98 37396.2 36.810 89.806
Insular De Aguas De Lanzarote SA 1.86856 4159.91 28249.3 57.138 76.913
Sierra De Selva SL 1.42059 4525.00 19555.0 47.045 70.524
Naturgy Wind, S.L. 1.31880 8500.00 28418.0 39.575 10.388
Parques Eolicos De Cerrato SL 1.26532 6541.00 22817.0 44.755 34.878
Eolica De Rubio SL 0.91962 2693.00 25486.0 34.607 60.688
Brulles Eolica SL 0.88594 3540.57 16432.0 47.227 55.284
Sistemas Energeticos Valle De Sedano SA 0.88563 897.00 45733.0 4.327 66.896
Acciona Eolica Del Levante SL 0.65681 6853.00 21769.0 27.520 11.557
BON Vent De Corbera S. L. EN Constitucion 0.65640 3261.47 23095.6 36.607 41.453
Molinos De La Rioja Sociedad Anonima 0.56574 2371.00 15787.0 42.017 54.789
Desarrollo De Energias Renovables De La Rioja Sociedad Anonima 0.48954 2145.00 17441.0 27.297 62.005
Eolica Campollano SA 0.48574 2592.20 27217.6 25.327 40.630
Bajoz Eolica SL 0.39866 2620.34 9641.3 70.476 29.644
Parc Eolic De Vilalba Dels Arcs SL 0.02524 2454.07 9438.7 48.378 28.085
Empordavent SL -0.04223 2582.00 15176.0 32.635 25.295
Al-Andalus Wind Power SL -0.07062 4403.21 21466.1 12.582 8.591
Eolica Fontesilva SL -0.07618 1584.33 15524.1 27.756 37.786
Eolica 2000 SL -0.56288 1713.00 5765.0 37.852 16.878
Fergo Galicia Vento -P E Mondoñedo SL -0.64177 2288.50 4159.3 30.405 14.925
Renovables Castilla La Mancha S.A. -0.68969 1847.03 2902.4 39.595 11.635
Comiolica SL -0.73350 1938.69 4404.7 29.295 13.845
Drago Renovables SL -0.78124 1000.92 7735.3 20.826 22.401
Parque Eolico La Boga SL. -0.79622 11.94 29316.8 1.001 9.646
Parque Eolico Santa Catalina SL -0.81797 3645.28 -1664.8 31.780 -1.126
Parque Eolico Valcaire SL -0.84931 1152.72 2173.0 45.881 5.981
Energias Renovables De Peñanebina SL -0.88259 983.00 5231.0 25.939 16.901
Expertise EN Energias Renovables Eolica Y Fotovoltaica De Canarias SL -0.96396 52.30 4916.5 34.569 15.809
Parque Eolico Tesosanto SL -1.10299 1706.13 2842.2 21.008 4.249
Eolica Del Guadiana SL -1.20211 1571.57 4430.2 9.341 6.671
Suresa Retama S.L. -1.24341 -78.00 12892.0 -29.295 39.249
Elecdey Palencia S.L. -1.25359 987.27 1581.5 22.016 4.760
Eolica Mirasierra SL -1.36573 1123.48 995.8 17.064 1.780
Helios Patrimonial 1 SL -1.50762 237.85 3468.1 5.379 8.411
Sistemes Energetics Conesa I S.L. -1.56230 878.00 -988.0 16.649 -3.193
Inversiones Fotovoltaicas Mallorquinas SL. -1.57826 272.75 930.1 11.661 3.235
Helios Patrimonial 2 SL -1.60027 190.12 2472.1 4.315 6.145
Fotovoltaica Los Navalmorales SL -1.60453 143.00 966.0 12.228 2.581
Energias Naturales La Calzada SL -1.69272 754.00 -1983.0 15.561 -6.834
Parque Eolico El Moral SL -1.74511 267.00 -310.0 7.935 -1.240
Eolica De Medinaceli SL -1.91245 324.00 -2854.0 4.302 -4.142
Wigep Andalucia SA -2.05070 296.00 -3762.0 4.611 -10.634
Parque Eolico Energia Puertosol SL. -2.12892 -945.38 2488.6 -17.969 5.899

Las puntuaciones de los casos en nuestro indicador (componente principal) pueden integrarse en un data frame y ser utilizadas como cualquier otra variable en un análisis multivariante, sabiendo que este indicador asume gran parte de la información que, como caracterización de las distintas empresas, contenían las 4 variables originales.

6.6 Materiales para realizar las prácticas del capítulo.

En esta sección se muestran los links de acceso a los diferentes materiales (scripts, datos…) necesarios para llevar a cabo los contenidos prácticos del capítulo.

Datos (en formato Microsoft (R) Excel (R)):

Scripts: