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:
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
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"
# 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
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" ...
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:
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
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
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)
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.