El objetivo de esta sección es elaborar un breve informe con las características de la variable elegida por el alumno. Los procedimientos estadísticos revisados en las clases teóricas serán aplicados para resumir, describir, analizar y presentar los rasgos fundamentales de la variable analizada. Debe recordarse que podemos utilizar:

  • Tablas estadísticas para organizar los datos.

  • Estadísticos para obtener valores característicos de la variable en cuestión.

  • Representar gráficamente la información.

En primer lugar, se carga el dataframe obtenido en la sesión anterior.

load("datos_wdi.RData")

El primer paso es obtener una serie de estadísticos (centralidad, dispersión etc) para caracterizar dicha variable:

  • La media.
Promedio <- mean(datos$Tasa_fem)
  • La mediana
Mediana <- median(datos$Tasa_fem) 
  • Para variables cuantitativas continuas, la moda se puede calcular mediante esta función.
Mode <- function(x) {
   ux <- unique(x)
   ux[which.max(tabulate(match(x, ux)))]
}
Moda <- Mode(datos$Tasa_fem)
  • Valores máximo, mínimo y rango.
Maximo <- max(datos$Tasa_fem)
Minimo <- min(datos$Tasa_fem)
Rango <- diff(range(datos$Tasa_fem))
  • Desviación típica
Desviacion_tipica <- sd(datos$Tasa_fem)
  • Cuantiles e intervalo intercuartílico
Q1 <- quantile(datos$Tasa_fem, probs = 0.25)
Q3 <- quantile(datos$Tasa_fem, probs = 0.75)
IQR <- IQR(datos$Tasa_fem)

El cálculo de los cuantiles y del IQR puede estar acompañado de la elaboración de un gráfico de caja y bigotes.

boxplot(datos$Tasa_fem, ylab = "Tasa de feminidad")

También podemos reforzar la impresión inicial de cómo se distribuye esta variable mediante histogramas. En un primer intento se puede solicitar que el programa elabore ese histograma con un gran número de intervalos.

hist(datos$Tasa_fem, 
     main = "Tasa de feminidad en el mundo",
     breaks= 30,                                                 
     ylim= c(0,0.50),                                                
     xlab = "Tasa de feminidad",
     ylab = "Frecuencia relativa",
     freq= FALSE,                                                    
     col="red",
     right=FALSE,
     include.lowest=TRUE, 
     plot=TRUE)

La variable analizada tiene un evidente sesgo. Esto se debe a que cierto número de países poseen una tasa bastante baja, inferior a 47. Podemos mejorar la presentación utilizando umbrales definidos por nosotros.

hist(datos$Tasa_fem, 
     main = "Tasa de feminidad en el mundo",
     breaks=c(Minimo,46,47,48,49,50,51,52,53,54,55,56),                                          
     xlim = c(20,60),
     ylim= c(0,0.40),                                                           
     xlab = "Tasa de feminidad",
     ylab = "Frecuencia relativa",
     freq= FALSE,                                                               
     col="red",
     right=FALSE,
     include.lowest=TRUE, 
     plot=TRUE)

Tanto el gráfico de caja y bigotes como los histogramas muestran que la mayoría de los países tienen una tasa de feminidad próxima al 50 %, como cabría esperar en circunstancias normales. No obstante, hay cierto número de países que tienen valores ligeramente por encima, pero hay otros cuyos valores se sitúan muy por debajo. Es conveniente identificar estos casos atípicos (o directamente atípicos extremos) en caso de existir. En primer lugar, serán identificados añadiendo una nueva variable que recodifica la Tasa de feminidad con el valor 1 en caso de ser atípicos (normales), con el valor 2 en caso de atípicos extremos, siendo 0 el resto de casos.

atipico_superior <- Q3 + IQR * 1.5
atipico_inferior <- Q1 - 1.5 * IQR 

extremo_superior <- Q3 + IQR * 3
extremo_inferior <- Q1 - 3 * IQR 

datos$atipicos[datos$Tasa_fem <= atipico_inferior | datos$Tasa_fem >= atipico_superior] <- 1
datos$atipicos[datos$Tasa_fem <= extremo_inferior | datos$Tasa_fem >= extremo_superior] <- 2
datos$atipicos[datos$Tasa_fem > atipico_inferior & datos$Tasa_fem < atipico_superior] <- 0

Una vez identificados, podemos extraerlos en un dataframe específico.

paises.atipicos <- datos[which(datos$atipicos >= 1),   ]              

Este procedimiento puede completarse representando gráficamente esos países en un mapa del mundo. Para ello, se repetirá el procedimiento ensayado en el apartado 1.

library("sf")
library("rnaturalearth")
paises <- ne_countries(scale = "medium", 
                      returnclass = "sf")
class(paises)
mapa.paises.atipicos <- st_as_sf(wrld_simpl)                                    # Transformación en un objeto leíble por el paquete sf
names(mapa.paises.atipicos)[names(mapa.paises.atipicos) == 'ISO3'] <- 'iso3c'   # Cambio del nombre de una variable

Se eliminarán variables innecesarias.

mapa.paises.atipicos<- subset(mapa.paises.atipicos, 
                              select =-c(FIPS, ISO2, UN:LAT))       

Para elaborar ese mapa, es necesaria la unión (función merge()) del objeto mapa.paises.atípicos (soporte gráfico=mapa) con el objeto paises.atípicos (datos estadísticos a representar). De nuevo, eliminaremos las variables innecesarias.

mapa.paises.atipicos <- merge(mapa.paises.atipicos, paises.atipicos, all = TRUE) 
mapa.paises.atipicos <- mapa.paises.atipicos[  ,c("iso3c", "pais", "region", "ingresos", "Tasa_fem", "atipicos", "geometry")]       

Finalmente, se representan los paises.

library(tmap)

qtm(mapa.paises.atipicos, 
    fill = "Tasa_fem", 
    text = "pais", text.size = 0.85, text.col = "black", fill.palette = "div",
    fill.title = "Valores atípicos",  
    style = "white", format = "World", projection = "+proj=eck4")

Además, se podría exportar la información correspondiente a estos paises en forma de una tabla para su posterior inclusión en el informe. Podemos exportar estas tablas a formato excel para su inclusión en el trabajo final. Una precaución: el paquete xlsx suele dar un mensaje de error (“The workbook already contains a sheet of this name”) cuando se ha creado ya previamente un fichero excel con las mismas características. En este caso, hay que ir al directorio donde se guarda este fichero y eliminarlo.

# install.packages("xlsx")
library(xlsx)
write.xlsx(paises.atipicos,                                   # Dataframe a exportar a excel
           file = "Resultados_WDI.xlsx",                      # Nombre del fichero excel
           sheetName="Paises con datos atipicos",             # Nombre de la hoja en el fichero excel
           col.names=TRUE,                                    # Escribe los nombres de las columna en el fichero excel 
           row.names=TRUE,                                    # Escribe los nombres de las filas en el fichero excel
           append=TRUE)                                       # Añadimos la tabla como hoja adicional al fichero anteriormente creado
  • Cálculo de coeficientes de asimetría.
# if (!require("moments")) install.packages("moments")    
library(moments)
asim_fisher <- skewness(datos$Tasa_fem)                                    # Coeficiente de asimetría de Fisher

asim_Boyle <- (Q3+Q1-2*Mediana)/(Q3-Q1)                                    # Coeficiente de asimetría de Boyle

El que el coeficiente de asimetría de Fisher y el de registre un valor negativo plantea que nuestra variable presenta un evidente sesgo negativo, por lo que la cola izquierda se alarga con valores mucho menores que la media. Por el contrario, el coeficiente de asimetría de Boyle-Yule está próximo a 0, por lo que señalaría una tendencia a la simetría, ya que el primer y tercer cuartil están a la misma distancia de la mediana.

Finalmente, se puede calcular también la curtosis.

Curtosis <- kurtosis(datos$Tasa_fem)

Cuando se cumple \(curtosis-3 > 0\) se considera que la distribución es leptocúrtica, es decir, más apuntada y con una cola más larga de lo normal. En este sentido, podría aplicarse la prueba de

jarque.test (datos$Tasa_fem)

El valor p de la prueba resulta ser inferior a α = .05. En ese caso, rechazamos la hipótesis nula; esto significa que este conjunto de datos tiene una asimetría y una curtosis diferente a la distribución normal.

A continuación se calculará el coeficiente de Gini y se dibujará una curva de Lorenz. Ello requiere tabular inicialmente la variable analizada, creando una tabla de frecuencias. Por defecto, se utilizarán 10 clases.

Tasa_fem.intervalos <- cut(datos$Tasa_fem,                          # Vector sobre el que trabajamos
                           breaks= 10,                              # Número de clases
                           right=FALSE,                             # Intervalos cerrados a la derecha/abiertos a la izquierda
                           include.lowest=TRUE)                     # Indica si un valor igual al intervalo más bajo debe ser incluido

levels(Tasa_fem.intervalos)
etiquetas <- levels(Tasa_fem.intervalos)                            # Etiquetas con los intervalos

marcas <- 26.45 + 2.9*(0:9)

A continuación se calculará el índice de Gini.

ni <- as.vector(table(Tasa_fem.intervalos))                 
Ni <- as.vector(cumsum(ni))                               

un <-c(marcas*ni)
M <-cumsum(un)

qi <-c(M/sum(un))*100
qi
pi <-c(Ni/sum(ni))*100
pi

Elaboración de la tabla con todas las variables.

tabla_gini <- data.frame(etiquetas, marcas,ni,Ni,un,M,pi,qi)
tabla_gini

Aplicación de la fórmula de Gini.

Gini <- sum(pi-qi)/(sum(pi)-100)
Gini

Finalmente, se dibujará la curva de Lorenz.

library(ineq)
curva.lorenz <- Lc(marcas,               
                   ni)                   
plot(curva.lorenz)

Al igual que se hizo con los datos atípicos, se van a crear algunas tablas con los estadísticos calculados y luego se van a exportar a excel.

tabla.estadisticos.centralidad <- cbind(Promedio, Mediana, Moda)
rownames(tabla.estadisticos.centralidad) <- "Estadísticos de centralidad"       # Cambia el nombre de la fila

tabla.estadisticos.dispersion <- cbind(IQR, Maximo, Minimo, Q1, Q3, Rango, extremo_inferior, extremo_superior)
rownames(tabla.estadisticos.dispersion) <- "Estadísticos de dispersion"         # Cambia el nombre de la fila

tabla.estadisticos.forma <- cbind(asim_fisher, asim_Boyle, Curtosis)
rownames(tabla.estadisticos.forma) <- "Estadísticos de forma"                   # Cambia el nombre de la fila

Podemos exportar estas tablas a formato excel para su inclusión en el trabajo final.

library(xlsx)
write.xlsx(tabla.estadisticos.centralidad,                    # Tabla a exportar a excel
           file = "Resultados_WDI.xlsx",                      # Nombre del fichero excel
           sheetName="tabla.estadisticos.centralidad",        # Nombre de la hoja en el fichero excel
           col.names=TRUE,                                    # Escribe los nombres de las columna en el fichero excel 
           row.names=TRUE,                                    # Escribe los nombres de las filas en el fichero excel
           append=TRUE)                                       # Añadimos la tabla como hoja adicional al fichero anteriormente creado

write.xlsx(tabla.estadisticos.dispersion,                     # Tabla a exportar a excel
           file = "Resultados_WDI.xlsx",                      # Nombre del fichero excel
           sheetName="tabla.estadisticos.dispersion",         # Nombre de la hoja en el fichero excel
           col.names=TRUE,                                    # Escribe los nombres de las columna en el fichero excel 
           row.names=TRUE,                                    # Escribe los nombres de las filas en el fichero excel
           append=TRUE)                                       # Añadimos la tabla como hoja adicional al fichero anteriormente creado

write.xlsx(tabla.estadisticos.forma,                          # Tabla a exportar a excel
           file = "Resultados_WDI.xlsx",                      # Nombre del fichero excel
           sheetName="tabla.estadisticos.forma",             # Nombre de la hoja en el fichero excel
           col.names=TRUE,                                    # Escribe los nombres de las columna en el fichero excel 
           row.names=TRUE,                                    # Escribe los nombres de las filas en el fichero excel
           append=TRUE)                                       # Añadimos la tabla como hoja adicional al fichero anteriormente creado

Hasta este momento se ha trabajo con todos los países al mismo tiempo. Una posibilidad adicional de análisis es separarlos por regiones o por nivel de ingresos. Aquí conviene analizar tanto el valor medio, como su dispersión. Ejemplos de cálculo de su valor medio son los siguientes:

  • Análisis por región
resultados.region <- aggregate(Tasa_fem ~ region, data = datos, FUN = mean) 
boxplot(Tasa_fem ~ region,
        datos,
        notch = TRUE)
abline(h = mean(datos$Tasa_fem), col = 2, lwd = 2)                               # Añade el valor medio
  • Análisis por nivel de ingresos
resultados.ingresos <- aggregate(Tasa_fem ~ ingresos, data = datos, FUN = mean) 
boxplot(Tasa_fem ~ ingresos,
        datos,
        notch = TRUE)
abline(h = mean(datos$Tasa_fem), col = 2, lwd = 2)                               # Añade el valor medio