Obtención de datos desde API’s

Para la toma de datos a través de un API

library(jsonlite)
urls<-paste0("http://api.football-data.org/v1/competitions/",394:404,"/leagueTable")
Prueba<-(fromJSON(urls[1])$standing)[,c(3,5:12)]
Liga<-rep(fromJSON(urls[1])$leagueCaption,dim(Prueba)[1])
for(i in 2:10){
Prueba<-rbind(Prueba,(fromJSON(urls[i])$standing)[,c(3,5:12)])
Liga<-c(Liga,rep(fromJSON(urls[i])$leagueCaption,dim(fromJSON(urls[i])$standing)[1]))
}
Base=data.frame(Liga,Prueba)

En base a los datos obtenidos se obtienen los siguientes comparaciones

Estadísticas Descriptivas

AD<-cbind(tapply(Base$points,Base$Liga,length),tapply(Base$points,Base$Liga,min),tapply(Base$points,Base$Liga,max),tapply(Base$points,Base$Liga,median),tapply(Base$points,Base$Liga,mean),tapply(Base$points,Base$Liga,sd))
colnames(AD)<-c("Nro. Equipos","Mínimo","Máximo","Mediana","Promedio","Desviación Estándar")
knitr::kable(AD)
Nro. Equipos Mínimo Máximo Mediana Promedio Desviación Estándar
1. Bundesliga 2015/16 18 25 88 42.0 47.05556 15.65613
2. Bundesliga 2015/16 18 28 72 45.5 46.22222 12.29326
3. Bundesliga 2015/16 20 31 78 49.0 50.95000 10.55051
Ligue 1 2015/16 20 18 96 50.0 51.60000 15.11848
Ligue 2 2015/16 20 30 74 47.0 50.90000 12.19965
Premier League 2015/16 20 17 81 48.5 51.65000 15.43842
Primeira Liga 2015/16 18 25 88 40.5 46.77778 18.90084
Primera Division 2015/16 20 32 91 44.5 52.40000 18.10321
Segunda Division 2015/16 22 32 75 56.0 56.45455 10.99665
Serie A 2015/16 20 28 91 46.0 52.25000 17.24704

De acuerdo a la tabla anterior, los equipos de la segunda división 2015/16 tienen una puntuación promedios que supera a la de los equipos de otras liga, además el error estándar es uno de los más bajos, lo que se traduce en que los resultados obtenidos en los equipos son muy equitativos; la puntuación más baja obtenida por un equipo fue en la Premier League, cuya puntuación fue de 17, a diferencia de la League 1 donde se presenta la puntuación máxima obtenida por un equipo, aún asi la variabilidad en aquí es un poco alta y consecuentemente el promedio se ve afectado, razón por la cual es más bajo que en otras ligas.

Resultados de Encuentros por Liga

library(ggplot2)
Juegos<-tidyr::gather(Base[,c(1,8:10)],key = Partidos,value = Cuenta, wins,draws,losses)
ggplot(Juegos,aes(x=Partidos,y=Cuenta,fill=Liga))+geom_boxplot()+labs(x="Resultados de Encuentros",y="Nro. de Partidos")

Resultados de Anotaciones por Liga

Al observar el gráfico de manera global se evidencia mucha similitud entre las distribuciones de los juegos ganados y los juegos perdidos; los juegos empatados por su parte son inferiores en cuanto a la distribución de las puntuaciones. La diferencia si nos fijamos en la Segunda División no es muy notoria pues las cajas se traslapan casi en su totalidad. En la Primera Liga se alcanza a ver una ligera diferencia en cuanto a la mediana de las puntuaciones y las dispersión de estas, la puntuación mediana es más baja en los partidos ganados que en los que se han perdido y aún más baja en los empatados.

Goles<-tidyr::gather(Base[,c(1,5:7)],key =Partidos,value = Gol,goals,goalsAgainst)
ggplot(Goles,aes(x=Partidos,y=Gol,fill=Liga))+geom_boxplot()+labs(x="Resultados de Encuentros",y="Nro. de Goles")

En este gráfico se observa un comportamiento similar entre la cantidad de goles a favor y en contra en las diferentes ligas, de estas, la Premier League es la que tiene mayor mediana en cuanto a los goles a favor aunque la distribución es asimétrica de cola derecha, también se observan muchos valores extremos principalmente en las Bundesliga, Primera Liga y la Serie A.

Obtención de Información a través de Web Scraping

library(rvest)
url <- 'http://www.elespectador.com/deportes/futbolcolombiano/asi-quedo-tabla-de-posiciones-de-segunda-division-colom-articulo-660865'
webpage <- read_html(url)
sb_table <- html_nodes(webpage, 'table')
sb <- html_table(sb_table)[[1]]
sb_partidos <- sb[,c(2,4,5,6)]
Partidos <- tidyr::gather(sb_partidos, key = R.Partidos, value = Cuenta,P.G , P.E , P.P)

Gráficos de Barras de Resultados Parciales

En base a los datos obtenidos, tenemos:

G_Partidos = ggplot(Partidos , aes(x = Cuenta , fill = R.Partidos))
G_Partidos + geom_bar() +labs(x="Resultados de Encuentros",y="Frecuencia") + 
theme(axis.text = element_text(size = 7 , angle = 25))

LS0tDQp0aXRsZTogIk9idGVuY2nzbiBkZSBEYXRvcyBBIHRyYXbpcyBkZSBBUEkncyB5IFdlYiBTY3JhcGluZyINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KYXV0aG9yOiAiRmVybmFuZG8gTWFkZXJhIC0gSmFpcm8gTW9udGVzIg0KLS0tDQoNCiMjIE9idGVuY2nzbiBkZSBkYXRvcyBkZXNkZSBBUEkncw0KUGFyYSBsYSB0b21hIGRlIGRhdG9zIGEgdHJhdulzIGRlIHVuIEFQSQ0KDQpgYGB7cn0NCmxpYnJhcnkoanNvbmxpdGUpDQp1cmxzPC1wYXN0ZTAoImh0dHA6Ly9hcGkuZm9vdGJhbGwtZGF0YS5vcmcvdjEvY29tcGV0aXRpb25zLyIsMzk0OjQwNCwiL2xlYWd1ZVRhYmxlIikNClBydWViYTwtKGZyb21KU09OKHVybHNbMV0pJHN0YW5kaW5nKVssYygzLDU6MTIpXQ0KTGlnYTwtcmVwKGZyb21KU09OKHVybHNbMV0pJGxlYWd1ZUNhcHRpb24sZGltKFBydWViYSlbMV0pDQpmb3IoaSBpbiAyOjEwKXsNClBydWViYTwtcmJpbmQoUHJ1ZWJhLChmcm9tSlNPTih1cmxzW2ldKSRzdGFuZGluZylbLGMoMyw1OjEyKV0pDQpMaWdhPC1jKExpZ2EscmVwKGZyb21KU09OKHVybHNbaV0pJGxlYWd1ZUNhcHRpb24sZGltKGZyb21KU09OKHVybHNbaV0pJHN0YW5kaW5nKVsxXSkpDQp9DQpCYXNlPWRhdGEuZnJhbWUoTGlnYSxQcnVlYmEpDQpgYGANCg0KRW4gYmFzZSBhIGxvcyBkYXRvcyBvYnRlbmlkb3Mgc2Ugb2J0aWVuZW4gbG9zIHNpZ3VpZW50ZXMgY29tcGFyYWNpb25lcyAgDQoNCiMjIyBFc3RhZO1zdGljYXMgRGVzY3JpcHRpdmFzDQoNCmBgYHtyfQ0KQUQ8LWNiaW5kKHRhcHBseShCYXNlJHBvaW50cyxCYXNlJExpZ2EsbGVuZ3RoKSx0YXBwbHkoQmFzZSRwb2ludHMsQmFzZSRMaWdhLG1pbiksdGFwcGx5KEJhc2UkcG9pbnRzLEJhc2UkTGlnYSxtYXgpLHRhcHBseShCYXNlJHBvaW50cyxCYXNlJExpZ2EsbWVkaWFuKSx0YXBwbHkoQmFzZSRwb2ludHMsQmFzZSRMaWdhLG1lYW4pLHRhcHBseShCYXNlJHBvaW50cyxCYXNlJExpZ2Esc2QpKQ0KY29sbmFtZXMoQUQpPC1jKCJOcm8uIEVxdWlwb3MiLCJN7W5pbW8iLCJN4XhpbW8iLCJNZWRpYW5hIiwiUHJvbWVkaW8iLCJEZXN2aWFjafNuIEVzdOFuZGFyIikNCmtuaXRyOjprYWJsZShBRCkNCmBgYA0KRGUgYWN1ZXJkbyBhIGxhIHRhYmxhIGFudGVyaW9yLCBsb3MgZXF1aXBvcyBkZSBsYSBzZWd1bmRhIGRpdmlzafNuIDIwMTUvMTYgdGllbmVuIHVuYSBwdW50dWFjafNuIHByb21lZGlvcyBxdWUgc3VwZXJhIGEgbGEgZGUgbG9zIGVxdWlwb3MgZGUgb3RyYXMgbGlnYSwgYWRlbeFzIGVsIGVycm9yIGVzdOFuZGFyIGVzIHVubyBkZSBsb3MgbeFzIGJham9zLCBsbyBxdWUgc2UgdHJhZHVjZSBlbiBxdWUgbG9zIHJlc3VsdGFkb3Mgb2J0ZW5pZG9zIGVuIGxvcyBlcXVpcG9zIHNvbiBtdXkgZXF1aXRhdGl2b3M7IGxhIHB1bnR1YWNp824gbeFzIGJhamEgb2J0ZW5pZGEgcG9yIHVuIGVxdWlwbyBmdWUgZW4gbGEgUHJlbWllciBMZWFndWUsIGN1eWEgcHVudHVhY2nzbiBmdWUgZGUgMTcsIGEgZGlmZXJlbmNpYSBkZSBsYSBMZWFndWUgMSBkb25kZSBzZSBwcmVzZW50YSBsYSBwdW50dWFjafNuIG3heGltYSBvYnRlbmlkYSBwb3IgdW4gZXF1aXBvLCBh+m4gYXNpIGxhIHZhcmlhYmlsaWRhZCBlbiBhcXXtIGVzIHVuIHBvY28gYWx0YSB5IGNvbnNlY3VlbnRlbWVudGUgZWwgcHJvbWVkaW8gc2UgdmUgYWZlY3RhZG8sIHJhevNuIHBvciBsYSBjdWFsIGVzIG3hcyBiYWpvIHF1ZSBlbiBvdHJhcyBsaWdhcy4gDQoNCiMjIyBSZXN1bHRhZG9zIGRlIEVuY3VlbnRyb3MgcG9yIExpZ2ENCg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpKdWVnb3M8LXRpZHlyOjpnYXRoZXIoQmFzZVssYygxLDg6MTApXSxrZXkgPSBQYXJ0aWRvcyx2YWx1ZSA9IEN1ZW50YSwgd2lucyxkcmF3cyxsb3NzZXMpDQpnZ3Bsb3QoSnVlZ29zLGFlcyh4PVBhcnRpZG9zLHk9Q3VlbnRhLGZpbGw9TGlnYSkpK2dlb21fYm94cGxvdCgpK2xhYnMoeD0iUmVzdWx0YWRvcyBkZSBFbmN1ZW50cm9zIix5PSJOcm8uIGRlIFBhcnRpZG9zIikNCmBgYA0KDQojIyMgUmVzdWx0YWRvcyBkZSBBbm90YWNpb25lcyBwb3IgTGlnYQ0KDQpBbCBvYnNlcnZhciBlbCBncuFmaWNvIGRlIG1hbmVyYSBnbG9iYWwgc2UgZXZpZGVuY2lhIG11Y2hhIHNpbWlsaXR1ZCBlbnRyZSBsYXMgZGlzdHJpYnVjaW9uZXMgZGUgbG9zIGp1ZWdvcyBnYW5hZG9zIHkgbG9zIGp1ZWdvcyBwZXJkaWRvczsgbG9zIGp1ZWdvcyBlbXBhdGFkb3MgcG9yIHN1IHBhcnRlIHNvbiBpbmZlcmlvcmVzIGVuIGN1YW50byBhIGxhIGRpc3RyaWJ1Y2nzbiBkZSBsYXMgcHVudHVhY2lvbmVzLiANCkxhIGRpZmVyZW5jaWEgc2kgbm9zIGZpamFtb3MgZW4gbGEgU2VndW5kYSBEaXZpc2nzbiBubyBlcyBtdXkgbm90b3JpYSBwdWVzIGxhcyBjYWphcyBzZSB0cmFzbGFwYW4gY2FzaSBlbiBzdSB0b3RhbGlkYWQuIEVuIGxhIFByaW1lcmEgTGlnYSBzZSBhbGNhbnphIGEgdmVyIHVuYSBsaWdlcmEgZGlmZXJlbmNpYSBlbiBjdWFudG8gYSBsYSBtZWRpYW5hIGRlIGxhcyBwdW50dWFjaW9uZXMgeSBsYXMgZGlzcGVyc2nzbiBkZSBlc3RhcywgbGEgcHVudHVhY2nzbiBtZWRpYW5hIGVzIG3hcyBiYWphIGVuIGxvcyBwYXJ0aWRvcyBnYW5hZG9zIHF1ZSBlbiBsb3MgcXVlIHNlIGhhbiBwZXJkaWRvIHkgYfpuIG3hcyBiYWphIGVuIGxvcyBlbXBhdGFkb3MuDQoNCmBgYHtyfQ0KR29sZXM8LXRpZHlyOjpnYXRoZXIoQmFzZVssYygxLDU6NyldLGtleSA9UGFydGlkb3MsdmFsdWUgPSBHb2wsZ29hbHMsZ29hbHNBZ2FpbnN0KQ0KZ2dwbG90KEdvbGVzLGFlcyh4PVBhcnRpZG9zLHk9R29sLGZpbGw9TGlnYSkpK2dlb21fYm94cGxvdCgpK2xhYnMoeD0iUmVzdWx0YWRvcyBkZSBFbmN1ZW50cm9zIix5PSJOcm8uIGRlIEdvbGVzIikNCmBgYA0KDQpFbiBlc3RlIGdy4WZpY28gc2Ugb2JzZXJ2YSB1biBjb21wb3J0YW1pZW50byBzaW1pbGFyIGVudHJlIGxhIGNhbnRpZGFkIGRlIGdvbGVzIGEgZmF2b3IgeSBlbiBjb250cmEgZW4gbGFzIGRpZmVyZW50ZXMgbGlnYXMsIGRlIGVzdGFzLCBsYSBQcmVtaWVyIExlYWd1ZSBlcyBsYSBxdWUgdGllbmUgbWF5b3IgbWVkaWFuYSBlbiBjdWFudG8gYSBsb3MgZ29sZXMgYSBmYXZvciBhdW5xdWUgbGEgZGlzdHJpYnVjafNuIGVzIGFzaW3pdHJpY2EgZGUgY29sYSBkZXJlY2hhLCB0YW1iaeluIHNlIG9ic2VydmFuIG11Y2hvcyB2YWxvcmVzIGV4dHJlbW9zIHByaW5jaXBhbG1lbnRlIGVuIGxhcyBCdW5kZXNsaWdhLCBQcmltZXJhIExpZ2EgeSBsYSBTZXJpZSBBLg0KIA0KIyMgT2J0ZW5jafNuIGRlIEluZm9ybWFjafNuIGEgdHJhdulzIGRlIFdlYiBTY3JhcGluZw0KDQpgYGB7cn0NCmxpYnJhcnkocnZlc3QpDQp1cmwgPC0gJ2h0dHA6Ly93d3cuZWxlc3BlY3RhZG9yLmNvbS9kZXBvcnRlcy9mdXRib2xjb2xvbWJpYW5vL2FzaS1xdWVkby10YWJsYS1kZS1wb3NpY2lvbmVzLWRlLXNlZ3VuZGEtZGl2aXNpb24tY29sb20tYXJ0aWN1bG8tNjYwODY1Jw0Kd2VicGFnZSA8LSByZWFkX2h0bWwodXJsKQ0Kc2JfdGFibGUgPC0gaHRtbF9ub2Rlcyh3ZWJwYWdlLCAndGFibGUnKQ0Kc2IgPC0gaHRtbF90YWJsZShzYl90YWJsZSlbWzFdXQ0Kc2JfcGFydGlkb3MgPC0gc2JbLGMoMiw0LDUsNildDQpQYXJ0aWRvcyA8LSB0aWR5cjo6Z2F0aGVyKHNiX3BhcnRpZG9zLCBrZXkgPSBSLlBhcnRpZG9zLCB2YWx1ZSA9IEN1ZW50YSxQLkcsUC5FLFAuUCkNCmBgYA0KDQoNCiMjIyBHcuFmaWNvcyBkZSBCYXJyYXMgZGUgUmVzdWx0YWRvcyBQYXJjaWFsZXMNCkVuIGJhc2UgYSBsb3MgZGF0b3Mgb2J0ZW5pZG9zLCB0ZW5lbW9zOg0KDQpgYGB7cn0NCkdfUGFydGlkb3MgPC0gZ2dwbG90KFBhcnRpZG9zICwgYWVzKHggPSBDdWVudGEgLCBmaWxsID0gUi5QYXJ0aWRvcykpDQpHX1BhcnRpZG9zICsgZ2VvbV9iYXIoKSArbGFicyh4PSJSZXN1bHRhZG9zIGRlIEVuY3VlbnRyb3MiLHk9IkZyZWN1ZW5jaWEiKSArIA0KdGhlbWUoYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA3ICwgYW5nbGUgPSAyNSkpDQoNCmBgYA0K