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:
<- mean(datos$Tasa_fem) Promedio
<- median(datos$Tasa_fem) Mediana
<- function(x) {
Mode <- unique(x)
ux which.max(tabulate(match(x, ux)))]
ux[
}<- Mode(datos$Tasa_fem) Moda
<- max(datos$Tasa_fem)
Maximo <- min(datos$Tasa_fem)
Minimo <- diff(range(datos$Tasa_fem)) Rango
<- sd(datos$Tasa_fem) Desviacion_tipica
<- quantile(datos$Tasa_fem, probs = 0.25)
Q1 <- quantile(datos$Tasa_fem, probs = 0.75)
Q3 <- IQR(datos$Tasa_fem) IQR
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.
<- Q3 + IQR * 1.5
atipico_superior <- Q1 - 1.5 * IQR
atipico_inferior
<- Q3 + IQR * 3
extremo_superior <- Q1 - 3 * IQR
extremo_inferior
$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 datos
Una vez identificados, podemos extraerlos en un dataframe específico.
<- datos[which(datos$atipicos >= 1), ] paises.atipicos
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")
<- ne_countries(scale = "medium",
paises returnclass = "sf")
class(paises)
<- st_as_sf(wrld_simpl) # Transformación en un objeto leíble por el paquete sf
mapa.paises.atipicos names(mapa.paises.atipicos)[names(mapa.paises.atipicos) == 'ISO3'] <- 'iso3c' # Cambio del nombre de una variable
Se eliminarán variables innecesarias.
<- subset(mapa.paises.atipicos,
mapa.paises.atipicosselect =-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.
<- merge(mapa.paises.atipicos, paises.atipicos, all = TRUE)
mapa.paises.atipicos <- mapa.paises.atipicos[ ,c("iso3c", "pais", "region", "ingresos", "Tasa_fem", "atipicos", "geometry")] mapa.paises.atipicos
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
# if (!require("moments")) install.packages("moments")
library(moments)
<- skewness(datos$Tasa_fem) # Coeficiente de asimetría de Fisher
asim_fisher
<- (Q3+Q1-2*Mediana)/(Q3-Q1) # Coeficiente de asimetría de Boyle asim_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.
<- kurtosis(datos$Tasa_fem) Curtosis
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.
<- cut(datos$Tasa_fem, # Vector sobre el que trabajamos
Tasa_fem.intervalos 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)
<- levels(Tasa_fem.intervalos) # Etiquetas con los intervalos
etiquetas
<- 26.45 + 2.9*(0:9) marcas
A continuación se calculará el índice de Gini.
<- as.vector(table(Tasa_fem.intervalos))
ni <- as.vector(cumsum(ni))
Ni
<-c(marcas*ni)
un <-cumsum(un)
M
<-c(M/sum(un))*100
qi
qi<-c(Ni/sum(ni))*100
pi pi
Elaboración de la tabla con todas las variables.
<- data.frame(etiquetas, marcas,ni,Ni,un,M,pi,qi)
tabla_gini tabla_gini
Aplicación de la fórmula de Gini.
<- sum(pi-qi)/(sum(pi)-100)
Gini Gini
Finalmente, se dibujará la curva de Lorenz.
library(ineq)
<- Lc(marcas,
curva.lorenz
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.
<- cbind(Promedio, Mediana, Moda)
tabla.estadisticos.centralidad rownames(tabla.estadisticos.centralidad) <- "Estadísticos de centralidad" # Cambia el nombre de la fila
<- cbind(IQR, Maximo, Minimo, Q1, Q3, Rango, extremo_inferior, extremo_superior)
tabla.estadisticos.dispersion rownames(tabla.estadisticos.dispersion) <- "Estadísticos de dispersion" # Cambia el nombre de la fila
<- cbind(asim_fisher, asim_Boyle, Curtosis)
tabla.estadisticos.forma 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:
<- aggregate(Tasa_fem ~ region, data = datos, FUN = mean)
resultados.region boxplot(Tasa_fem ~ region,
datos,notch = TRUE)
abline(h = mean(datos$Tasa_fem), col = 2, lwd = 2) # Añade el valor medio
<- aggregate(Tasa_fem ~ ingresos, data = datos, FUN = mean)
resultados.ingresos boxplot(Tasa_fem ~ ingresos,
datos,notch = TRUE)
abline(h = mean(datos$Tasa_fem), col = 2, lwd = 2) # Añade el valor medio