1. Carga de data

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)

2. Limpieza de datos

2.1. Inspeccion:

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" ...
##  $ Elec­toral pro­cessand plura­lism >> Elec­toral pro­cessand plura­lism: chr  "10.00" "10.00" "9.58" "10.00" ...
##  $ Functio­ning ofgovern­ment >> Functio­ning ofgovern­ment              : chr  "9.64" "9.29" "9.64" "9.29" ...
##  $ Poli­ticalpartici­pation >> Poli­ticalpartici­pation                  : chr  "10.00" "8.89" "8.33" "8.89" ...
##  $ Poli­ticalculture >> Poli­ticalculture                                : chr  "10.00" "10.00" "10.00" "8.13" ...
##  $ Civilliber­ties >> Civilliber­ties                                    : chr  "9.71" "9.71" "9.41" "10.00" ...
##  $ Regimetype >> Regimetype                                              : chr  "Full democracy" "Full democracy" "Full democracy" "Full democracy" ...
##  $ Conti­nent >> Conti­nent                                              : chr  "Europe" "Europe" "Europe" "Oceania" ...

Los nombres de las variables

names(demo)
##  [1] "Rank >> Rank"                                                          
##  [2] "Country >> Country"                                                    
##  [3] "Score >> Score"                                                        
##  [4] "Elec­toral pro­cessand plura­lism >> Elec­toral pro­cessand plura­lism"
##  [5] "Functio­ning ofgovern­ment >> Functio­ning ofgovern­ment"              
##  [6] "Poli­ticalpartici­pation >> Poli­ticalpartici­pation"                  
##  [7] "Poli­ticalculture >> Poli­ticalculture"                                
##  [8] "Civilliber­ties >> Civilliber­ties"                                    
##  [9] "Regimetype >> Regimetype"                                              
## [10] "Conti­nent >> Conti­nent"

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.

2.2. Pre procesamiento:

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

ORDINALES

# 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)

NOMINALES

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 ...

PREGUNTAS

1. ¿Cual es el valor representativo de Tipo de Regimen?

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

2. ¿Podemos afirmar que 3 cuartas partes de los paises del mundo que tenemos en nuestra tabla no superan el tipo hibrido de democracia?

# 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.

3.1. ¿Cual es el valor representativo de Continente?

Como es nominal, no tiene mediana, por lo tanto, hayo la moda.

Mode(demo$Continent)
## [1] "Africa"

3.2. ¿Es el valor representativo de continente muy prominente? (quizas otros continentes no envian informacion?)

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.

4. ¿La variable continente se distribuye asimetricamente?

No se puede calcular porque esta variable es nominal.

5. ¿La variable regimetype se distribuye asimetricamente?

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()

6. ¿El valor representativo de indice de democracia es robusto?

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.

7. ¿Puedes concluir que hay mucha desigualdad en este indice?

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.

8.¿Se puede afirmar que el 80% de los paises del mundo suman a lo mas el 67.5% del score de democracia?

#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.

9.1. ¿Hay atipicos en el score de democracia?

# 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)

9.2. ¿Ausencia de atipicos grandes?

demo[demo$Score>=umbralAlto,]

9.3. ¿Ausencia de atipicos pequeños?

demo[demo$Score<=umbralBajo,]

Conluimos que no hay atípicos.