Usar: https://en.wikipedia.org/wiki/Democracy_Index
Hasta ahora solo he realizado el análisis numérico de una sola variable, pero aprenderé a analizar todas las variables de mi data frame
library(htmltab)
# coleccion
links=list(web="https://en.wikipedia.org/wiki/Democracy_Index",
xpath ='//*[@id="mw-content-text"]/div/table[2]')
demo<- htmltab(doc = links$web, which =links$xpath)
Veamos la estructura
str(demo)
## 'data.frame': 167 obs. of 10 variables:
## $ Rank >> Rank : chr "1" "2" "3" "4" ...
## $ Country >> Country : chr " Norway" " Iceland" " Sweden" " New Zealand" ...
## $ Score >> Score : chr "9.87" "9.58" "9.39" "9.26" ...
## $ Electoral processand pluralism >> Electoral processand pluralism: chr "10.00" "10.00" "9.58" "10.00" ...
## $ Functioning ofgovernment >> Functioning ofgovernment : chr "9.64" "9.29" "9.64" "9.29" ...
## $ Politicalparticipation >> Politicalparticipation : chr "10.00" "8.89" "8.33" "8.89" ...
## $ Politicalculture >> Politicalculture : chr "10.00" "10.00" "10.00" "8.13" ...
## $ Civilliberties >> Civilliberties : chr "9.71" "9.71" "9.41" "10.00" ...
## $ Regimetype >> Regimetype : chr "Full democracy" "Full democracy" "Full democracy" "Full democracy" ...
## $ Continent >> Continent : chr "Europe" "Europe" "Europe" "Oceania" ...
Los nombres de las variables
names(demo)
## [1] "Rank >> Rank"
## [2] "Country >> Country"
## [3] "Score >> Score"
## [4] "Electoral processand pluralism >> Electoral processand pluralism"
## [5] "Functioning ofgovernment >> Functioning ofgovernment"
## [6] "Politicalparticipation >> Politicalparticipation"
## [7] "Politicalculture >> Politicalculture"
## [8] "Civilliberties >> Civilliberties"
## [9] "Regimetype >> Regimetype"
## [10] "Continent >> Continent"
Veo que los nombres tienen símbolos raros como este >>, además que hay dos, uno a la derecha y otro a la izquiera. A continuación solucionaré el problema.
Nombres sin espacios
# aqui dividimos al nombre actual en el primer espacio, y nos quedamos con el elemento a la izquierda:
library(stringr)
names(demo)=str_split(names(demo)," ",simplify = T)[,1]
Nombres sin simbolos “raros”
names(demo)=str_replace_all(names(demo), "[^[:ascii:]]", "")
Valores del data frame sin simbolos “raros”
demo[,]=lapply(demo[,], str_replace_all,"[^[:ascii:]]","")
Eliminar columnas que no se usaran y que se podrian recalcular. En este caso eliminaré Rank, puesto que este solo me da el orden de las variables, no queremos calcular eso, no sirve.
demo$Rank=NULL
Veamos qué tenemos hasta ahora
names(demo)
## [1] "Country" "Score"
## [3] "Electoral" "Functioning"
## [5] "Politicalparticipation" "Politicalculture"
## [7] "Civilliberties" "Regimetype"
## [9] "Continent"
str(demo)
## 'data.frame': 167 obs. of 9 variables:
## $ Country : chr "Norway" "Iceland" "Sweden" "New Zealand" ...
## $ Score : chr "9.87" "9.58" "9.39" "9.26" ...
## $ Electoral : chr "10.00" "10.00" "9.58" "10.00" ...
## $ Functioning : chr "9.64" "9.29" "9.64" "9.29" ...
## $ Politicalparticipation: chr "10.00" "8.89" "8.33" "8.89" ...
## $ Politicalculture : chr "10.00" "10.00" "10.00" "8.13" ...
## $ Civilliberties : chr "9.71" "9.71" "9.41" "10.00" ...
## $ Regimetype : chr "Full democracy" "Full democracy" "Full democracy" "Full democracy" ...
## $ Continent : chr "Europe" "Europe" "Europe" "Oceania" ...
Recuperar numeros
Vemos que tenemos variables con números desde la variables 2 hasta la 7. Entonces eso le comunicamos al r.
library(readr)
demo[,c(2:7)]=lapply(demo[,c(2:7)],parse_number)
Configurar Categorias
# ver tabla
table(demo$Regimetype)
##
## Authoritarian Flawed democracy Full democracy Hybrid regime
## 53 55 20 39
# nombres RE ordenados
ordenOK=c("Authoritarian","Hybrid regime", "Flawed democracy","Full democracy")
demo$Regimetype=factor(demo$Regimetype, levels=ordenOK,ordered = TRUE)
demo$Continent=as.factor(demo$Continent)
# **Que tienes hasta ahora?**:
str(demo)
## 'data.frame': 167 obs. of 9 variables:
## $ Country : chr "Norway" "Iceland" "Sweden" "New Zealand" ...
## $ Score : num 9.87 9.58 9.39 9.26 9.22 9.15 9.15 9.14 9.09 9.03 ...
## $ Electoral : num 10 10 9.58 10 10 9.58 9.58 10 10 9.58 ...
## $ Functioning : num 9.64 9.29 9.64 9.29 9.29 7.86 9.64 8.93 8.93 9.29 ...
## $ Politicalparticipation: num 10 8.89 8.33 8.89 8.33 8.33 7.78 8.33 7.78 7.78 ...
## $ Politicalculture : num 10 10 10 8.13 9.38 10 8.75 8.75 8.75 9.38 ...
## $ Civilliberties : num 9.71 9.71 9.41 10 9.12 10 10 9.71 10 9.12 ...
## $ Regimetype : Ord.factor w/ 4 levels "Authoritarian"<..: 4 4 4 4 4 4 4 4 4 4 ...
## $ Continent : Factor w/ 6 levels "Africa","Asia",..: 3 3 3 5 3 3 4 3 5 3 ...
El valor representativo de una serie de medidas es el que pensamos que más se aproxima al valor real de dicha medida. Si realizamos una serie de medidas, el valor representativo será el valor medio de aquellas, excluyendo aquellos valores de los que tengamos constancia que se apartan del valor real.
library(DescTools)
Median(demo$Regimetype)
## [1] Hybrid regime
## 4 Levels: Authoritarian < Hybrid regime < ... < Full democracy
# tabla de frecuencias avanzada
library(questionr)
library(magrittr)
OrdDf=freq(demo$Regimetype,total = F,exclude = c(NA),cum = T) %>% data.frame()
OrdDf=data.frame(row.names(OrdDf),OrdDf,row.names = NULL)
names(OrdDf)=c("Categoria","Conteo", "Porcentaje", "Porcentaje Acumulado")
# viendo a NomDf
OrdDf
Las tres cuartas partes del total es 125.25 Solamente tenemos 92 (53 + 39) países que no superan el Hybrid regimen. Por lo tanto, podemos decir que no es cierto que las 3/4 de los países no superan el Hybrid regimen.
Como es nominal, no tiene mediana, por lo tanto, hayo la moda.
Mode(demo$Continent)
## [1] "Africa"
tablaContinente=prop.table(table(demo$Continent))
Herfindahl(tablaContinente)
## [1] 0.238266
La moda es prominente a partir de 0,3 hacia arriba. Esta moda no es prominente.
No se puede calcular porque esta variable es nominal.
library(ggplot2)
# en base solo se pone: en data como se llama la tabla de frecuencias
# y en aes la variable 'x' para los nombres y la 'y' para los conteos.
base = ggplot(data=OrdDf,aes(x=Categoria , y=Conteo))
# luego a la base se le pide añadir la 'geometria' deseada:
bar1 = base + geom_bar(stat='identity')
# aqui resultado:
bar1 + scale_x_discrete(limits =OrdDf$Categoria)
library(ggplot2)
basep=ggplot(data=demo, aes(y=as.numeric(Regimetype))) # ojo
basep + geom_boxplot() + coord_flip()
summary(demo$Score)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.080 3.545 5.690 5.479 7.175 9.870
La moda es 5.479, por lo tanto es muy robusta.
basen=ggplot(data=demo,aes(x=Score))
basen + geom_histogram(bins=10)
La distribución es asimétrica La media es menor que la mediana, la asimetría es negativa.
Skew(demo$Score,conf.level = 0.05)
## skew lwr.ci upr.ci
## -0.07107195 -0.07306378 -0.05974730
Como vemos el Skew es negativo porque la asimetría también lo es.
El coeficiente de Gini es una medida de la desigualdad de una distribución, más comúnmente utilizada para comparar la desigualdad en ingresos o riqueza entre países.
El coeficiente de Gini es un número entre 0 y 1, en donde 0 se corresponde con la perfecta igualdad (todos tienen los mismos ingresos) y donde el valor 1 se corresponde con la perfecta desigualdad (una persona tiene todos los ingresos y los demás ninguno).
Gini(demo$Score)
## [1] 0.2316285
No, casi no hay tanta desigualdad, se acerca más a una igualdad.
#Gráfico de Lorentz
library(ggplot2)
library(gglorenz)
## Registered S3 methods overwritten by 'ineq':
## method from
## plot.Lc DescTools
## lines.Lc DescTools
ggplot(demo,aes(x=Score))+ gglorenz::stat_lorenz(color='purple') +
geom_abline(linetype = "dashed") + coord_fixed() +
labs(x = "% Paises ordenados por Indice de Democracia",
y = "% Acumulado de Puntuación de ID",
title = "Relación pais/Indice de democracia",
caption = "Fuente: The Economist") +
scale_y_continuous(breaks=seq(0,1,0.15)) +
scale_x_continuous(breaks=seq(0,1,0.2))
Viendo la curva de Lorenz, sí se puede afirmar eso.
# cuartilES
q3=quantile(demo$Score,0.75)
q1=quantile(demo$Score,0.25)
# calculando umbrales
umbralAlto= q3+1.5*IQR(demo$Score)
umbralBajo= q1-1.5*IQR(demo$Score)
demo[demo$Score>=umbralAlto,]
demo[demo$Score<=umbralBajo,]
Conluimos que no hay atípicos.