tabular y gráficos con ggplot2FUENTE: Toda la información usada en este tutorial corresponde al equipo 00RTeam de la Universidad de Murcia y está disponible en http://gauss.inf.um.es/
Para esta tarea deberás utilizar un fichero de datos paisesMundoRedC.csv que contiene la siguiente información sobre los diferentes países del mundo:
Country: Nombre del paísGEO_subregion: Región geográficaPopulation2005: Población del país en 2005GDP_capita.MRYA: Renta per capitalandarea: Superficie del paísAGRICULTURE: Agricultura del paísFISH: Pesca del paísLee el fichero de datos y asignarlo al objeto df. Comprueba que lo has leído bien.
df <- read.table( file = "http://gauss.inf.um.es/datos/paisesMundoRedC.csv",
header = TRUE,
sep = ";",
dec = ".",
encoding = "UTF-8",
stringsAsFactors = FALSE )
head( df )
## Country EPI_regions
## AGO Angola Sub-Saharan Africa
## ALB Albania Central and Eastern Europ
## ARE United Arab Emirates Middle East and North Africa
## ARG Argentina Latin America and Caribbe
## ARM Armenia Middle East and North Africa
## AUS Australia East Asia and the Pacific
## GEO_subregion Population2005 GDP_capita.MRYA landarea EPI
## AGO Southern Africa 15941.4 2314.4 1251895.62 39.5
## ALB Central Europe 3129.7 4955.3 28346.12 84.0
## ARE Arabian Peninsula 4495.8 22698.3 74776.60 64.0
## ARG South America 38747.2 13652.4 2736296.00 81.8
## ARM Eastern Europe 3016.3 5011.0 28272.73 77.8
## AUS Australia + New Zealand 20155.1 30677.9 7634643.84 79.8
## FOREST FISH AGRICULTURE
## AGO 95.4 87.3 61.3
## ALB 100.0 62.5 75.6
## ARE 100.0 50.0 72.3
## ARG 75.9 58.8 79.9
## ARM 70.1 NA 94.2
## AUS 100.0 96.7 78.7
GEO_subregion? Comentalo adecuadamente.La función dim( ) examina las dimensiones del data frame. Nos da información sobre el número de casos o registros (filas) y el número de variables (columnas). Nuestro data frame df tiene 10 variables y 149 registros.
dim( df )
## [1] 149 10
La función str( ) permite examinar la estructura de los datos que contiene el data frame. Esta función proporciona información muy completa: qué tipo de objeto es tu base de datos (en nuestro caso, un data frame), número de observaciones (149 obs.) y número de variables (10 variables), y detalle de cada variable (su nombre, tipo o naturaleza, y el valor para las primeras observaciones).
str( df )
## 'data.frame': 149 obs. of 10 variables:
## $ Country : chr "Angola" "Albania" "United Arab Emirates" "Argentina" ...
## $ EPI_regions : chr "Sub-Saharan Africa" "Central and Eastern Europ" "Middle East and North Africa" "Latin America and Caribbe" ...
## $ GEO_subregion : chr "Southern Africa" "Central Europe" "Arabian Peninsula" "South America" ...
## $ Population2005 : num 15941 3130 4496 38747 3016 ...
## $ GDP_capita.MRYA: num 2314 4955 22698 13652 5011 ...
## $ landarea : num 1251896 28346 74777 2736296 28273 ...
## $ EPI : num 39.5 84 64 81.8 77.8 79.8 89.4 72.2 54.7 78.4 ...
## $ FOREST : num 95.4 100 100 75.9 70.1 100 100 100 0 100 ...
## $ FISH : num 87.3 62.5 50 58.8 NA 96.7 NA NA NA 47.4 ...
## $ AGRICULTURE : num 61.3 75.6 72.3 79.9 94.2 78.7 76.4 71.4 95.9 80.8 ...
La base de datos contiene 7 variables cuantitativas, aquellas indicadas con num. Tiene 3 variables indicadas con chr, esto es, cadena “character” (alfanumérico).
Cuando R identifica un valor como chr pueden darse dos casos: 1) que efectivamente sea una variable que contiene valores en texto, o 2) que en realidad sea una variable categórica. En este último caso, debería codificarse adecuadamente en categórica.
Para el caso particular de la variable GEO_subregion: identifica subregiones en los diferentes continentes: los 149 países (observaciones) se distribuyen entre estas 21 subregiones.
Estas subregiones o valores en realidad son los niveles de la variable. Esto es, podemos considerarla como factor, y lo adecuado sería codificarla de forma que R reconozca cada una de sus clases como niveles de una variable categórica.
summary( df$GEO_subregion ) # detalle de la variable
## Length Class Mode
## 149 character character
table( df$GEO_subregion ) # tabla de frecuencias
##
## Arabian Peninsula Australia + New Zealand Caribbean
## 5 2 5
## Central Africa Central Asia Central Europe
## 6 5 16
## Eastern Africa Eastern Europe Mashriq
## 7 7 4
## Meso America North America Northeast Asia
## 8 2 5
## Northern Africa South America South Asia
## 5 11 6
## South East Asia South Pacific Southern Africa
## 8 3 10
## Western Africa Western Europe Western Indian Ocean
## 13 19 2
dfA.indicesAfrica <- grep( "Africa", df$GEO_subregion )
dfA <- df[ indicesAfrica, ]
Como veis la función grep( ) busca en la variable GEO_subregion aquellas observaciones que contienen la palabra Africa y nos devuelve sus índices.
str( dfA )
## 'data.frame': 41 obs. of 10 variables:
## $ Country : chr "Angola" "Burundi" "Benin" "Burkina Faso" ...
## $ EPI_regions : chr "Sub-Saharan Africa" "Sub-Saharan Africa" "Sub-Saharan Africa" "Sub-Saharan Africa" ...
## $ GEO_subregion : chr "Southern Africa" "Eastern Africa" "Western Africa" "Western Africa" ...
## $ Population2005 : num 15941 7548 8439 13228 1765 ...
## $ GDP_capita.MRYA: num 2314 630 1016 1143 11313 ...
## $ landarea : num 1251896 25227 115828 275748 559516 ...
## $ EPI : num 39.5 54.7 56.1 44.3 68.7 56 65.2 63.8 47.3 69.7 ...
## $ FOREST : num 95.4 0 17.8 64.5 79.2 97.2 100 78.4 94.8 98.4 ...
## $ FISH : num 87.3 NA 91.5 NA NA NA 91.2 52.4 46.3 74.1 ...
## $ AGRICULTURE : num 61.3 95.9 88.2 87.7 72.3 71.8 88.7 69.9 70.8 99.1 ...
dfA, quizás empleando la función factor( ).Las variables Country, EPI_regions y GEO_subregion son de tipo chr cadena “character” (alfanumérico). Es necesario transformarlas a factor, de forma que R reconozca cada una de sus clases como niveles de las variables.
dfA$Country <- factor( dfA$Country ) # transformación de los datos chr a factor
dfA$EPI_regions <- factor( dfA$EPI_regions ) # transformación de los datos chr a factor
dfA$GEO_subregion <- factor( dfA$GEO_subregion ) # transformación de los datos chr a factor
Comprobamos que ahora ya son variables categóricas y vemos también cuáles son sus niveles. Por ejemplo para GEO_subregion:
str( dfA$GEO_subregion ) # te dice qué es el objeto
## Factor w/ 5 levels "Central Africa",..: 4 2 5 5 4 1 5 1 1 1 ...
levels( dfA$GEO_subregion ) # muestra todos los niveles de la variable categórica
## [1] "Central Africa" "Eastern Africa" "Northern Africa" "Southern Africa"
## [5] "Western Africa"
summary( ). Comenta los resultados obtenidosLa función summary( ) proporciona estadísticos descriptivos para variables cuantitativas (rangos -mínimo, máximo-, primer y tercer cuartil, mediana y media), y las frecuencias absolutas para las variables categóricas o cualitativas.
summary( dfA )
## Country EPI_regions GEO_subregion
## Algeria : 1 Middle East and North Africa: 5 Central Africa : 6
## Angola : 1 Sub-Saharan Africa :36 Eastern Africa : 7
## Benin : 1 Northern Africa: 5
## Botswana : 1 Southern Africa:10
## Burkina Faso: 1 Western Africa :13
## Burundi : 1
## (Other) :35
## Population2005 GDP_capita.MRYA landarea EPI
## Min. : 793.1 Min. : 629.8 Min. : 17410 Min. :39.10
## 1st Qu.: 5525.5 1st Qu.: 1008.1 1st Qu.: 147882 1st Qu.:51.30
## Median : 12883.9 Median : 1312.8 Median : 403759 Median :59.40
## Mean : 21030.0 Mean : 2506.2 Mean : 642219 Mean :59.16
## 3rd Qu.: 28816.2 3rd Qu.: 2299.1 3rd Qu.: 968072 3rd Qu.:69.00
## Max. :131529.7 Max. :11313.3 Max. :2492385 Max. :78.10
##
## FOREST FISH AGRICULTURE
## Min. : 0.00 Min. :23.90 Min. :53.00
## 1st Qu.: 73.30 1st Qu.:72.60 1st Qu.:69.30
## Median : 86.40 Median :79.10 Median :73.90
## Mean : 78.51 Mean :75.11 Mean :74.87
## 3rd Qu.: 98.40 3rd Qu.:87.05 3rd Qu.:81.60
## Max. :100.00 Max. :91.60 Max. :99.10
## NA's :14
COMENTARIOS:
Hay un total de 41 países (Country) distribuidos en dos regiones (EPI_regions): 5 países en el Medio Oriente y Norte de África (Middle East and North Africa) y 36 países en el África Subsahariana (Sub-Saharan Africa). Además, el continente africano se divide en 5 subregiones (GEO_subregion). La zona Norte cuenta con 5 países, mientras que el mayor número de países africanos está en la regíon de África Occidental (Western Africa).
Los datos de la población para 2005 indican que el país con menor población tenía 793 mil habitantes (793.1) y el país con mayor población tenía más de 131 millones de habitantes (131529.7).
Respecto al tamaño de los países (landarea) los datos muestran una variabilidad de las superficies de los países entre los 17 mil km cuadrados (17410) y los dos millones y medio de km cuadrados (2492385).
Population2005, landarea y GDP_capita.MRYA y calcula los descriptivos principales según el factor GEO_subregion.Para la presentación de los resultados en una tabla usaremos la función tabular( ) (que es parte de la librería tables). Para presentar una tabla en un documento web:
Primero se crea : definición de la tabla con tabular( )
Después se imprime : visualización de la tabla con la función html( tt ) (que crea la tabla en código HTML).
AVISO: Para una correcta visualización de las tablas tenéis que poner en el chunk la expresión results = 'asis'
library( tables ) # Presentación de tablas
1. Crear o definir la tabla:
Calcular los descriptivos principales para las variables Population2005, landarea y GDP_capita.MRYA, según el factor GEO_subregion.
ttDescri <- tabular( GEO_subregion ~ # para cada uno de los niveles de este factor
( Population2005 + landarea + GDP_capita.MRYA ) * # de estas variables
( mean + sd + min + max ) + # mostrar sus descriptivos
( n = 1 ), # el núm. total de observaciones
data = dfA ) # base de datos que usamos
2. Visualizar la tabla:
Como estamos en un documento web, para visualizar la tabla usamos la función html( ).
# {r, results='asis'}
html( ttDescri,
options = htmloptions( HTMLcaption = "DESCRIPTIVOS PARA GEO_subregion",
justification = "c",
pad = TRUE ) )
| Population2005 | landarea | GDP_capita.MRYA | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| GEO_subregion | mean | sd | min | max | mean | sd | min | max | mean | sd | min | max | n |
| Central Africa | 15507 | 21283 | 1383.8 | 57549 | 875595 | 786168 | 265146 | 2313414 | 2038 | 1914.5 | 700.0 | 5835 | 6 |
| Eastern Africa | 23183 | 27067 | 793.1 | 77431 | 300392 | 413610 | 20904 | 1123717 | 1163 | 417.6 | 629.8 | 1982 | 7 |
| Northern Africa | 36940 | 23147 | 10102.5 | 74033 | 1262919 | 1079434 | 147881 | 2492385 | 4912 | 2209.6 | 2050.2 | 7758 | 5 |
| Southern Africa | 16388 | 15487 | 1032.4 | 47432 | 676391 | 418233 | 17410 | 1251896 | 4057 | 4095.1 | 631.5 | 11313 | 10 |
| Western Africa | 19871 | 34051 | 1586.3 | 131530 | 453551 | 453694 | 34106 | 1248146 | 1327 | 561.8 | 700.3 | 2299 | 13 |
AGRICULTURE la media, mediana, desviación típica, el mínimo y el máximo según el factor GEO_subregion. Pon etiquetas representativas a las columnas.tt <- tabular( ( REGIÓN = GEO_subregion ) ~
( AGRICULTURA = AGRICULTURE ) *
( (Media = mean) +
(Sd = sd) +
(Mínimo = min) +
(Máximo = max) +
(Mediana = median) ) +
( n = 1 ),
data = dfA )
tt # mostrar el resultado
##
## AGRICULTURA
## REGIÓN Media Sd Mínimo Máximo Mediana n
## Central Africa 79.28 11.174 69.9 99.1 76.75 6
## Eastern Africa 77.41 12.403 54.4 95.9 78.00 7
## Northern Africa 66.04 8.136 53.0 74.8 68.40 5
## Southern Africa 69.74 4.681 61.3 74.7 71.80 10
## Western Africa 78.82 7.131 65.9 88.7 78.80 13
AVISO: Para una correcta visualización de las tablas tenéis que poner en el chunk la expresión results = 'asis'
# {r, results='asis'}
html( tt,
options = htmloptions( HTMLcaption = "AGRICULTURA",
justification = "c",
pad = TRUE ) )
| AGRICULTURA | ||||||
|---|---|---|---|---|---|---|
| REGIÓN | Media | Sd | Mínimo | Máximo | Mediana | n |
| Central Africa | 79.28 | 11.174 | 69.9 | 99.1 | 76.75 | 6 |
| Eastern Africa | 77.41 | 12.403 | 54.4 | 95.9 | 78.00 | 7 |
| Northern Africa | 66.04 | 8.136 | 53.0 | 74.8 | 68.40 | 5 |
| Southern Africa | 69.74 | 4.681 | 61.3 | 74.7 | 71.80 | 10 |
| Western Africa | 78.82 | 7.131 | 65.9 | 88.7 | 78.80 | 13 |
Population2005) y el producto interior bruto (GDP_capita.MRYA). Colorea los puntos según el factor GEO_subregion.library( ggplot2 ) # Hacer gráficos
ggplot( data = dfA,
aes( x = Population2005, y = GDP_capita.MRYA ) ) +
geom_point( aes( colour = GEO_subregion ), size = 2 ) + # Colorea los puntos en función de las subregiones
scale_colour_discrete( name = "Subregiones africanas",
breaks = c("Northern Africa", "Southern Africa",
"Eastern Africa", "Western Africa", "Central Africa"),
labels = c("Norte", "Sur", "Este", "Oeste", "Central") ) + # texto de la leyenda
labs( title = "PIB según población y subregiones (2005)",
x = "Población",
y = "PIB") # etiquetas para título y ejes
ggplot2La variable EPI es el Environmental Performance Index. Este índice puntúa a cada país entre 0 y 100 según sus resultados medioambientales. Vamos a hacer un gráfico que muestre un ranking de los diez países africanos según el índice EPI, de forma que los países Country aparezcan ordenados por su puntuación global. Para cada país también mostraremos a qué region pertenece EPI_regions.
EPI. Si hubiera más de un país con el mismo valor en EPI, también se incluye en este Top 10 (como es el caso). Estos datos dfA_EPItop10 son los que representaremos en nuestro gráfico.library( dplyr ) # Manipulación de data frames
dfA_EPItop10 <- top_n( dfA, 10, EPI) # ordenación de los 10 primeros según EPI
# Gráfico base
ggEPI <- ggplot( dfA_EPItop10,
aes( x = reorder( Country, EPI ),
y = EPI,
fill = EPI_regions ) ) +
geom_bar( stat = "identity" ) +
scale_fill_manual( name = "Región",
labels = c( "Norte de África", "África Subsahariana" ),
values = c( "#00AFBB", "#E7B800" ) ) +
ylim( 0, 100 ) +
labs( title = "Ranking del índice EPI",
subtitle = "(índice 0 - 100)") +
coord_flip( )
# Editarlo
ggEPI + theme( axis.title.x = element_blank(),
axis.title.y = element_blank(),
axis.text.x = element_text(size = 8),
axis.text.y = element_text(size = 12),
plot.title = element_text( size = 20, colour = "grey39", face = "bold"),
plot.subtitle = element_text( size = 15, colour = "grey39"),
legend.text = element_text(size = 10),
legend.title = element_text(size = 12),
legend.position = "right" )