Escuela de Ciencia Política

ESTADISTICA


EXPLORACION ORDINAL

Aqui veras como descargar data de una tabla que está en la web. El proceso es sencillo, pero requiere concentración. El ejemplo aqui esta planteado usando GoogleChrome.

Vamos a ver una data sobre indice global sobre percepcion de la corrupcion:

  1. Aqui descargaras datos sobre percepcion de corrupcion:
library(htmltab)

#comentario: usar comillas con el link:

linkPage='https://www.nationsonline.org/oneworld/corruption.htm' #link de la pagina
linkTabla='/html/body/table[3]/tbody' #el XPATH
corruption = htmltab(doc = linkPage, 
               which =linkTabla) 
## Neither <thead> nor <th> information found. Taking first table row for the header. If incorrect, specifiy header argument.
## Warning: Columns [ ] seem to have no data and are removed. Use
## rm_nodata_cols = F to suppress this behavior

#Ojo: las notas en rojo son advertencias de r, no significa que algo haya salido mal. Continua con el ejercicio

  1. De la web sabias que tenias varios años:
names(corruption) #comando para ver el nombre de las columnas 
## [1] "Rank"        "Country"     "2016  Score" "2015  Score" "2014  Score"
## [6] "2013  Score" "2012  Score" "Region"
  1. Quédate con los scores para el 2016, y claro, Country y Region.
# selecciono las columnas:
corruption=corruption[,c(2,3,8)]

# ver nombres de las columnas con las que me quede
names(corruption)
## [1] "Country"     "2016  Score" "Region"

Cambio de nombre a “score2106” para evitar espacios en blanco:

names(corruption)[2]="score2016" #reemplazando
  1. Identificando tipo de variable:
str(corruption) #comando para ver la escala de las variables, notamos que todas son caracteres (chr)
## 'data.frame':    177 obs. of  3 variables:
##  $ Country  : chr  "Denmark" "New Zealand" "Finland" "Sweden" ...
##  $ score2016: chr  "90" "90" "89" "88" ...
##  $ Region   : chr  "Europe" "Asia Pacific" "Europe" "Europe" ...
  1. Cambiando a numerico: El score debe ser un numero, pero str() informa que es tipo character, hagamos el cambio:
corruption$score2016=as.numeric(corruption$score2016) #cambiamos a numerico
## Warning: NAs introduced by coercion

#Ojo: volvera a salir una nota en rojo que sañala que r a introducido NAs en la columna score2016. Continuar con el ejercicio.

El cambio ha producido NA (valores perdidos), eso sucede pues R encontro un valor no numerico. Veamos cual es esa fila:

corruption[!complete.cases(corruption$score2016),] #Este comando muestra en que filas se han introducido NAs 
##                                                          Country score2016
## 178 To get in-depth information visit:Transparency International        NA
##                                                           Region
## 178 To get in-depth information visit:Transparency International

Se verifica que esa fila no tenia informacion de un pais, era solo una referencia (visita la web original). De ahi que nos quedamos sin esa fila:

corruption=corruption[complete.cases(corruption$score2016),] #Nos quedamos solo con los casos completos, es decir eliminamos las filas que tengan NAs

Hasta aqui tenemos:

head(corruption) #comando para ver las 6 primeras filas de tu data 
##       Country score2016       Region
## 2     Denmark        90       Europe
## 3 New Zealand        90 Asia Pacific
## 4     Finland        89       Europe
## 5      Sweden        88       Europe
## 6 Switzerland        86       Europe
## 7      Norway        85       Europe

No tenemos ordinales, pero esa numerica (el score) la convertiremos en ordinal. Para ello, la organizamos en 10 grupos:

  1. Hacer 10 intervalos con el score del 2016:
corruption$nivel=cut(corruption$score2016,
                     breaks = 10, # cuantos grupos
                     labels = c(1:10),# nombre de los grupos
                     ordered_result = T) # resultado es ordinal

Ahora tenemos:

head(corruption) #Notamos que se agrego una columna llamada Nivel que contiene lo que arriba hemos creado
##       Country score2016       Region nivel
## 2     Denmark        90       Europe    10
## 3 New Zealand        90 Asia Pacific    10
## 4     Finland        89       Europe    10
## 5      Sweden        88       Europe    10
## 6 Switzerland        86       Europe    10
## 7      Norway        85       Europe    10

Se nota que a mayor numero del grupo, menos corrupcion. Exploremos la variable corruption$nivel, que es nuestra ordinal.

Aqui continuamos donde nos quedamos la ultima clase

Exploracion Ordinal

  1. Crear tabla de frequencias para graficar:
library(questionr) #descargamos ambas librerias
library(magrittr) 
freqCorrup=freq(corruption$nivel,cum = T)%>%data.frame() #aqui se inserta la variable ordinal 
freqCorrup=data.frame(nivel=row.names(freqCorrup),freqCorrup,row.names = NULL) #crea un dataframe que se llama freqCrrupcion
freqCorrup
##    nivel  n   X. val. X.cum val.cum
## 1      1 13  7.4  7.4   7.4     7.4
## 2      2 19 10.8 10.8  18.2    18.2
## 3      3 37 21.0 21.0  39.2    39.2
## 4      4 36 20.5 20.5  59.7    59.7
## 5      5 17  9.7  9.7  69.3    69.3
## 6      6 14  8.0  8.0  77.3    77.3
## 7      7 17  9.7  9.7  86.9    86.9
## 8      8  6  3.4  3.4  90.3    90.3
## 9      9  9  5.1  5.1  95.5    95.5
## 10    10  8  4.5  4.5 100.0   100.0

Puedes renombrar asi esta tabla:

names(freqCorrup)[2:6] =c("absoluta","relativa","relativaVAl","relativaCum",
                          "relativaCumVAL") #cambiamos el nombre de las columnas

Ver tabla con nuevos nombres:

freqCorrup 
##    nivel absoluta relativa relativaVAl relativaCum relativaCumVAL
## 1      1       13      7.4         7.4         7.4            7.4
## 2      2       19     10.8        10.8        18.2           18.2
## 3      3       37     21.0        21.0        39.2           39.2
## 4      4       36     20.5        20.5        59.7           59.7
## 5      5       17      9.7         9.7        69.3           69.3
## 6      6       14      8.0         8.0        77.3           77.3
## 7      7       17      9.7         9.7        86.9           86.9
## 8      8        6      3.4         3.4        90.3           90.3
## 9      9        9      5.1         5.1        95.5           95.5
## 10    10        8      4.5         4.5       100.0          100.0
  1. Gráfico

Aqui se usa la tabla de frecuencias:

library(ggplot2) #descargar la libreria
base = ggplot(data=freqCorrup,aes(x=nivel,y=absoluta))  #hacemos un grafico de barras al data frame que acabamos de crear, es decir "freqCorrup"
base1= base + scale_x_discrete(limits=freqCorrup$nivel)
bar1 = base1 + geom_bar(stat='identity') 
bar1

Decoraciones

bar1 + labs(x="Nivel", 
            y="Cantidad",
            title="¿La mayoria de paises están libres de corrupcion?", 
            subtitle = "(por arriba de nivel 8)",
            caption = "Fuente: Transparency International")

El gráfico de Pareto muestra dos medidas, los conteos y los porcentajes acumulados. Por tradición se trata de detectar que valores representan el 80%.

library(qcc) #descarga la libreria, continua si salen notas en rojo
## Package 'qcc' version 2.7
## Type 'citation("qcc")' for citing this R package in publications.
pareto.chart(table(corruption$nivel),cumperc = c(0,50,80,100)) #volvemos a usar la variable ordinal

##     
## Pareto chart analysis for table(corruption$nivel)
##       Frequency  Cum.Freq. Percentage Cum.Percent.
##   3   37.000000  37.000000  21.022727    21.022727
##   4   36.000000  73.000000  20.454545    41.477273
##   2   19.000000  92.000000  10.795455    52.272727
##   5   17.000000 109.000000   9.659091    61.931818
##   7   17.000000 126.000000   9.659091    71.590909
##   6   14.000000 140.000000   7.954545    79.545455
##   1   13.000000 153.000000   7.386364    86.931818
##   9    9.000000 162.000000   5.113636    92.045455
##   10   8.000000 170.000000   4.545455    96.590909
##   8    6.000000 176.000000   3.409091   100.000000

Se nota que el 80% de los paises estan de los niveles 1 al 7.

En la escala ordinal ya podemos pedir el boxplot:

# no se usa la tabla de frecuencia
# se usa en tipo numerico a la ordinal

box=ggplot(corruption,aes(y=as.numeric(nivel)))+ geom_boxplot() #volvemos numerico la ordinal, para poder hacerle un boxplot
box

Al convertir el ordinal en numerico, aparece en la vertical numeros decimales. Podemos ver las etiquetas así:

box + scale_y_discrete(limits = freqCorrup$nivel) 

  1. Estadísticos:
library(DescTools) #descargar la libreria
Mode(corruption$nivel)
## [1] "3"

El nivel tres es el que mas se repite.

Median(corruption$nivel)
## [1] 4
## Levels: 1 < 2 < 3 < 4 < 5 < 6 < 7 < 8 < 9 < 10

50% de los paises no pasan del nivel 4.

# mientras mayor, la moda representa menos
dataTable=table(corruption$nivel)
1-max(prop.table(dataTable))
## [1] 0.7897727

La moda NO representa al 79% de los paises.

# * < 0.01 : indica que la moda no es significativa, las categorias tienen pesos similares.
# * < 0.15 : indica que la moda no es significativa, varias categorias tienen pesos similares.
# * entre 0.15 - 0.25: hay una moda.
# * > 0.25: La moda se diferencia de los demas

Herfindahl(dataTable)
## [1] 0.1339747

La moda no es significativa.

1/sum(prop.table(dataTable)**2)
## [1] 7.464096

Hay 7 niveles representativos.

IQR(corruption$nivel)
## [1] 3

Si miras el boxplot, te das cuenta que el 50% de los valores centrales esta del nivel 3 al 6.

# Mientras más se aleje de cero y sea positiva hay posible atipicos en los valores
# grandes. Mientras más se aleje de cero y sea negativa 
# hay posible atipicos en los valores pequeños.
mad(as.numeric(corruption$nivel))
## [1] 1.4826

El valor positivo indica que hay posibles valores extremos hacia los valores mayores. Así, los mejores niveles de percepcion de corrupcion (los menos corruptos) son los menos comunes en el planeta.