Este es un ejemplo de fichero R markdown que te sirve para aprender varias cosas:

Introducción

El objetivo de este estudio es replicar el análisis sobre brecha de género en matemáticas realizado por smarterpoland.pl para los países participantes en Pisa2015, pero para las CCAA españolas.

Análisis previo de los datos

Leidos el fichero de datos en formato .sav correspondiente a todos los estudiantes que participaron en PISA, lo único que hice fuera de clase es seleccionar los datos correspondientes a España y crear una nueva variable. Por si queréis hacer algo parecido para algún otro país, este es el código que lo generó (requiere tener cargadas las librerias foreign, tidyverse y stringr):

# Cargar datos spss
stud2015 <- read.spss("CY6_MS_CMB_STU_QQQ.sav", use.value.labels = TRUE, to.data.frame = TRUE)

# Modificarlos: Seleccionar los datos españoles, y generar una nueva variable CCAA.
esp2015 <- stud2015 %>% filter(CNT=="Spain (Regions)") %>% 
   mutate(CCAA=droplevels(Region))
levels(esp2015$CCAA)=levels(esp2015$CCAA) %>% str_replace("Spain: ","")

# Salvar los datos
save(esp2015,file="esp2015.RData")

Cargar los paquetes y los datos

Para comenzar el análisis tenemos que cargar los paquetes necesarios y los datos correspondientes.

R es un lenguaje extendible a través de los llamados paquetes. En RStudio podemos ver en la pestaña packages que paquetes tenemos disponibles en nuestro ordenador. Es posible instalar nuevos paquetes bien a través de esa pestaña o de la función install.packages() que requiere como argumento el nombre del paquete entre comíllas (para que sea un objeto del tipo character).

Para tener accesibles los paquetes en una sesión de R tenemos que cargarlos con la función library. La idea es añadir los paquetes correspondientes a la lista de lugares donde R busca las funciones (search path). Para saber dónde está buscando R podemos utilizar la función search, en mi caso -desde Rstudio- con los siguientes resultados:

search()
## [1] ".GlobalEnv"        "package:stats"     "package:graphics" 
## [4] "package:grDevices" "package:utils"     "package:datasets" 
## [7] "package:methods"   "Autoloads"         "package:base"

El primer sitio donde busca R en el entorno global (el que RStudio muestra en environment). Los siguientes son los paquetes básicos.

Al cargar los paquetes los añadimos a nuestra libreria:

library(intsvy)  # Para análisis de encuestas commplejas
library(tidyverse) # Para análisis de datos
## Warning: package 'tidyverse' was built under R version 3.3.2
## Loading tidyverse: ggplot2
## Loading tidyverse: tibble
## Loading tidyverse: tidyr
## Loading tidyverse: readr
## Loading tidyverse: purrr
## Loading tidyverse: dplyr
## Warning: package 'ggplot2' was built under R version 3.3.2
## Conflicts with tidy packages ----------------------------------------------
## filter(): dplyr, stats
## lag():    dplyr, stats
search()
##  [1] ".GlobalEnv"        "package:dplyr"     "package:purrr"    
##  [4] "package:readr"     "package:tidyr"     "package:tibble"   
##  [7] "package:ggplot2"   "package:tidyverse" "package:intsvy"   
## [10] "package:stats"     "package:graphics"  "package:grDevices"
## [13] "package:utils"     "package:datasets"  "package:methods"  
## [16] "Autoloads"         "package:base"

Los datos los cargamos con:

load("esp2015.RData")

Suponiendo que están en la carpeta que ha abierto Rstudio (la que vemos inicialmente en la pestaña files). Si no es así podemos hacer varias cosas:

  1. Cambiar la carpeta por defecto de RStudio navegando hasta la que contiene el fichero en la pestaña files y, en el botón de More seleccionar Set as working directory. Esto nos permite, además, aprender la función de R que cambia el directorio de trabajo.
  2. Cargar el fichero buscándolo desde el botón de cargar de la pestaña Environment navegando hasta él.

Al cargarlo veremos que ha aparecido el objeto esp2015 en la ventana Environment, que tiene dimensiones 32330, 922. Por otro lado, dándo a la flecha azul podemos abrir la información sobre la estructura del objeto, que es la misma que se obtiene con:

str(esp2015)
## 'data.frame':    32330 obs. of  922 variables:
##  $ CNTRYID      : Factor w/ 80 levels "Albania","Algeria",..: 77 77 77 77 77 77 77 77 77 77 ...
##  $ CNT          : Factor w/ 83 levels "Albania","United Arab Emirates",..: 63 63 63 63 63 63 63 63 63 63 ...
##  $ CNTSCHID     : num  97100001 97100001 97100001 97100001 97100001 ...
##  $ CNTSTUID     : num  97121378 97118229 97119063 97123517 97136510 ...
##  $ CYC          : Factor w/ 1 level "06MS": 1 1 1 1 1 1 1 1 1 1 ...
##  $ NatCen       : Factor w/ 73 levels "Albania","Algeria",..: 61 61 61 61 61 61 61 61 61 61 ...
##  $ Region       : Factor w/ 122 levels "Albania","Algeria",..: 91 91 91 91 91 91 91 91 91 91 ...
##  $ STRATUM      : Factor w/ 1571 levels "ALB - stratum 01: Urban \\ North \\ Public",..: 521 521 521 521 521 521 521 521 521 521 ...
##  $ SUBNATIO     : Factor w/ 98 levels "Albania","Algeria",..: 72 72 72 72 72 72 72 72 72 72 ...
##  $ OECD         : Factor w/ 3 levels "No","Yes","Not Applicable": 3 3 3 3 3 3 3 3 3 3 ...
##  $ ADMINMODE    : Factor w/ 2 levels "Paper","Computer": 2 2 2 2 2 2 2 2 2 2 ...
##  $ Option_CPS   : Factor w/ 2 levels "No","Yes": 2 2 2 2 2 2 2 2 2 2 ...
##  $ Option_FL    : Factor w/ 2 levels "No","Yes": 2 2 2 2 2 2 2 2 2 2 ...
##  $ Option_ICTQ  : Factor w/ 2 levels "No","Yes": 2 2 2 2 2 2 2 2 2 2 ...
##  $ Option_ECQ   : Factor w/ 2 levels "No","Yes": 2 2 2 2 2 2 2 2 2 2 ...
##  $ Option_PQ    : Factor w/ 2 levels "No","Yes": 2 2 2 2 2 2 2 2 2 2 ...
##  $ Option_TQ    : Factor w/ 2 levels "No","Yes": 2 2 2 2 2 2 2 2 2 2 ...
##  $ Option_UH    : Factor w/ 2 levels "No","Yes": 1 1 1 1 1 1 1 1 1 1 ...
##  $ Option_Read  : Factor w/ 2 levels "Standard Cluster",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ Option_Math  : Factor w/ 2 levels "Standard Cluster",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ LANGTEST_QQQ : Factor w/ 51 levels "Indonesian","Romanian",..: 9 9 9 9 9 9 9 9 9 9 ...
##  $ LANGTEST_COG : Factor w/ 51 levels "Indonesian","Romanian",..: 9 9 9 9 9 9 9 9 9 9 ...
##  $ LANGTEST_PAQ : Factor w/ 51 levels "Indonesian","Romanian",..: NA NA NA 9 9 NA NA 9 9 NA ...
##  $ CBASCI       : Factor w/ 7 levels "Science Random Number 1",..: 2 1 4 7 3 6 7 3 2 4 ...
##  $ BOOKID       : Factor w/ 97 levels "Form 1 (PBA)",..: 41 32 93 33 89 44 94 46 35 95 ...
##  $ ST001D01T    : Factor w/ 11 levels "Grade 7","Grade 8",..: 2 2 2 3 3 3 3 3 3 3 ...
##  $ ST003D02T    : Factor w/ 12 levels "January","February",..: 6 6 4 11 7 7 11 11 12 7 ...
##  $ ST003D03T    : atomic  1999 1999 1999 1999 1999 ...
##   ..- attr(*, "value.labels")= Named num 
##   .. ..- attr(*, "names")= chr 
##  $ ST004D01T    : Factor w/ 2 levels "Female","Male": 1 2 2 1 1 1 1 1 2 2 ...
##  $ ST005Q01TA   : Factor w/ 5 levels "<ISCED level 3A>",..: 3 5 NA 4 5 4 2 NA 2 4 ...
##  $ ST006Q01TA   : Factor w/ 2 levels "Yes","No": 2 NA NA 2 2 2 2 1 2 2 ...
##  $ ST006Q02TA   : Factor w/ 2 levels "Yes","No": 2 2 NA 2 2 2 2 2 2 2 ...
##  $ ST006Q03TA   : Factor w/ 2 levels "Yes","No": 2 NA NA 2 2 2 2 2 1 2 ...
##  $ ST006Q04TA   : Factor w/ 2 levels "Yes","No": NA NA NA NA NA NA NA NA NA NA ...
##  $ ST007Q01TA   : Factor w/ 5 levels "<ISCED level 3A>",..: 3 4 4 4 3 4 3 NA 1 5 ...
##  $ ST008Q01TA   : Factor w/ 2 levels "Yes","No": 2 2 NA 2 2 2 2 NA 2 2 ...
##  $ ST008Q02TA   : Factor w/ 2 levels "Yes","No": 2 NA NA 2 2 2 2 NA 2 2 ...
##  $ ST008Q03TA   : Factor w/ 2 levels "Yes","No": 2 NA NA 2 2 2 2 NA 1 2 ...
##  $ ST008Q04TA   : Factor w/ 2 levels "Yes","No": NA NA NA NA NA NA NA NA NA NA ...
##  $ ST011Q01TA   : Factor w/ 2 levels "Yes","No": 1 2 1 1 1 1 1 1 1 1 ...
##  $ ST011Q02TA   : Factor w/ 2 levels "Yes","No": 1 1 1 1 1 1 1 1 1 1 ...
##  $ ST011Q03TA   : Factor w/ 2 levels "Yes","No": 1 1 1 1 1 1 1 NA 1 1 ...
##  $ ST011Q04TA   : Factor w/ 2 levels "Yes","No": 1 2 1 1 1 2 1 1 1 1 ...
##  $ ST011Q05TA   : Factor w/ 2 levels "Yes","No": NA 2 2 2 1 1 1 NA 2 1 ...
##  $ ST011Q06TA   : Factor w/ 2 levels "Yes","No": 1 1 1 1 1 1 1 NA 1 1 ...
##  $ ST011Q07TA   : Factor w/ 2 levels "Yes","No": NA 2 2 2 2 2 2 NA 2 2 ...
##  $ ST011Q08TA   : Factor w/ 2 levels "Yes","No": NA 2 2 2 2 1 2 NA 2 2 ...
##  $ ST011Q09TA   : Factor w/ 2 levels "Yes","No": NA 1 1 1 1 2 2 1 2 1 ...
##  $ ST011Q10TA   : Factor w/ 2 levels "Yes","No": NA 1 1 2 1 1 2 NA 1 1 ...
##  $ ST011Q11TA   : Factor w/ 2 levels "Yes","No": NA 1 2 2 2 1 1 NA 2 2 ...
##  $ ST011Q12TA   : Factor w/ 2 levels "Yes","No": 1 1 1 1 1 1 2 NA 1 1 ...
##  $ ST011Q16NA   : Factor w/ 2 levels "Yes","No": 1 1 2 2 2 1 2 NA 1 2 ...
##  $ ST011D17TA   : Factor w/ 147 levels "Albania : Microwave oven - Yes",..: NA 117 117 117 117 118 117 NA 117 117 ...
##  $ ST011D18TA   : Factor w/ 143 levels "Albania : Free cultural television programs - Yes",..: 113 113 113 113 113 114 113 113 113 113 ...
##  $ ST011D19TA   : Factor w/ 133 levels "Albania : digital cameras - Yes",..: NA 106 106 105 105 105 105 NA 105 105 ...
##  $ ST012Q01TA   : Factor w/ 4 levels "None","One","Two",..: 3 4 4 4 4 3 4 2 4 4 ...
##  $ ST012Q02TA   : Factor w/ 4 levels "None","One","Two",..: 2 3 4 3 4 2 2 3 3 4 ...
##  $ ST012Q03TA   : Factor w/ 4 levels "None","One","Two",..: 3 3 2 4 3 3 2 4 3 3 ...
##  $ ST012Q05NA   : Factor w/ 4 levels "None","One","Two",..: 4 3 4 4 4 3 4 4 4 4 ...
##  $ ST012Q06NA   : Factor w/ 4 levels "None","One","Two",..: 4 4 3 2 3 1 3 3 3 4 ...
##  $ ST012Q07NA   : Factor w/ 4 levels "None","One","Two",..: 1 2 4 4 3 1 3 3 3 2 ...
##  $ ST012Q08NA   : Factor w/ 4 levels "None","One","Two",..: 2 1 1 NA 2 1 1 2 1 1 ...
##  $ ST012Q09NA   : Factor w/ 4 levels "None","One","Two",..: 4 1 4 3 2 1 1 2 2 2 ...
##  $ ST013Q01TA   : Factor w/ 6 levels "0-10 books","11-25 books",..: 1 1 2 3 1 3 2 1 2 6 ...
##  $ ST123Q01NA   : Factor w/ 4 levels "Strongly disagree",..: 4 4 4 2 2 3 4 2 4 3 ...
##  $ ST123Q02NA   : Factor w/ 4 levels "Strongly disagree",..: 4 4 3 3 2 3 3 NA 4 4 ...
##  $ ST123Q03NA   : Factor w/ 4 levels "Strongly disagree",..: 4 4 2 3 4 3 3 2 4 3 ...
##  $ ST123Q04NA   : Factor w/ 4 levels "Strongly disagree",..: 4 4 3 1 2 3 3 NA 4 3 ...
##  $ ST019AQ01T   : Factor w/ 2 levels "Country of test",..: NA 1 2 1 1 1 1 1 1 1 ...
##  $ ST019BQ01T   : Factor w/ 2 levels "Country of test",..: 1 2 2 1 1 1 1 1 1 1 ...
##  $ ST019CQ01T   : Factor w/ 2 levels "Country of test",..: 1 2 2 1 1 1 1 1 1 1 ...
##  $ ST021Q01TA   : Factor w/ 17 levels "age 0 - 1","age 1",..: NA NA NA NA NA NA NA NA NA NA ...
##  $ ST022Q01TA   : Factor w/ 2 levels "Language of test",..: 1 2 2 2 2 2 2 2 2 2 ...
##  $ ST124Q01TA   : Factor w/ 3 levels "No","Yes, for one year or less",..: NA NA NA NA NA NA NA NA NA NA ...
##  $ ST125Q01NA   : Factor w/ 8 levels "1 year or younger",..: 2 4 7 1 3 1 2 NA 1 3 ...
##  $ ST126Q01TA   : Factor w/ 7 levels "3 or younger",..: 7 4 NA 3 4 1 1 NA NA 4 ...
##  $ ST127Q01TA   : Factor w/ 3 levels "No, never","Yes, once",..: 2 1 2 1 1 1 NA NA NA 1 ...
##  $ ST127Q02TA   : Factor w/ 3 levels "No, never","Yes, once",..: 2 3 2 2 2 2 2 2 2 2 ...
##  $ ST127Q03TA   : Factor w/ 3 levels "No, never","Yes, once",..: NA NA NA NA NA NA NA NA NA NA ...
##  $ ST111Q01TA   : Factor w/ 6 levels "<ISCED level 2>",..: 2 2 NA 1 1 1 2 5 3 5 ...
##  $ ST118Q01NA   : Factor w/ 4 levels "Strongly disagree",..: NA 2 2 2 1 3 3 3 4 3 ...
##  $ ST118Q02NA   : Factor w/ 4 levels "Strongly disagree",..: 3 3 2 3 1 4 3 3 4 4 ...
##  $ ST118Q03NA   : Factor w/ 4 levels "Strongly disagree",..: 1 NA 4 4 1 4 3 2 4 1 ...
##  $ ST118Q04NA   : Factor w/ 4 levels "Strongly disagree",..: 3 2 3 4 1 4 4 3 4 1 ...
##  $ ST118Q05NA   : Factor w/ 4 levels "Strongly disagree",..: 1 3 2 2 1 3 3 3 3 1 ...
##  $ ST119Q01NA   : Factor w/ 4 levels "Strongly disagree",..: 4 2 3 4 1 4 3 2 4 1 ...
##  $ ST119Q02NA   : Factor w/ 4 levels "Strongly disagree",..: 4 3 2 4 1 3 3 3 4 4 ...
##  $ ST119Q03NA   : Factor w/ 4 levels "Strongly disagree",..: 4 2 4 4 1 1 2 3 4 4 ...
##  $ ST119Q04NA   : Factor w/ 4 levels "Strongly disagree",..: 1 2 2 3 1 1 1 3 4 4 ...
##  $ ST119Q05NA   : Factor w/ 4 levels "Strongly disagree",..: 1 3 3 2 1 1 2 2 4 4 ...
##  $ ST121Q01NA   : Factor w/ 4 levels "Strongly disagree",..: 1 2 1 1 1 2 1 2 1 NA ...
##  $ ST121Q02NA   : Factor w/ 4 levels "Strongly disagree",..: 3 3 3 2 3 2 3 3 3 3 ...
##  $ ST121Q03NA   : Factor w/ 4 levels "Strongly disagree",..: 4 3 4 4 4 3 4 3 4 4 ...
##  $ ST082Q01NA   : Factor w/ 4 levels "Strongly disagree",..: 3 1 4 2 4 4 2 3 4 4 ...
##  $ ST082Q02NA   : Factor w/ 4 levels "Strongly disagree",..: 3 1 2 3 2 4 4 2 4 3 ...
##  $ ST082Q03NA   : Factor w/ 4 levels "Strongly disagree",..: 3 1 3 2 1 4 3 3 3 4 ...
##  $ ST082Q08NA   : Factor w/ 4 levels "Strongly disagree",..: 2 1 3 3 2 4 3 3 3 3 ...
##  $ ST082Q09NA   : Factor w/ 4 levels "Strongly disagree",..: 3 1 3 3 3 3 3 4 3 2 ...
##  $ ST082Q12NA   : Factor w/ 4 levels "Strongly disagree",..: 4 1 3 4 1 4 4 3 3 4 ...
##   [list output truncated]

Por último, si hacemos click en el nombre del objeto lo abrirá en una pestaña nueva, lo mismo que conseguiríamos con View(esp2015). Por último, para ver que tipo de objeto tenemos, lo podemos ver con

class(esp2015)
## [1] "data.frame"

Los objetos data.frame son los objetos de datos más sencillos en R. Se trata de una matriz de datos donde las observaciones son filas y las variables columnas. Cada variable puede ser de una clase distinta.

En nuestro curso trabajaremos sobre todo con objetos de este tipo, o con las tibbles, un nuevo tipo de datos típicos del tidyverse que constituye una evolución de las data.frames compatible con éstas.

Análisis de datos: Cálculo de medias para encuestas complejas con intsvy

Una vez cargados los datos podemos hacer el análisis. En nuestro caso, el paquete intsvy contiene funciones de muy alto nivel que permiten hacer análisis sofisticados de encuestas de las que ya conoce el formato con una sóla linea. Es el caso de la función pisa2015.mean.pv que calcula la media de una variable de PISA 2015 para las combinaciones de variables definidas por el argumento by. Esta función particulariza la función intsvy.mean.pv. Podemos aprender sobre los argumentos utilizando la ayuda de esa función con ? intsvy.mean.pv o help(intsvy.mean.pv)

Esta es la función y la parte inicial de los resultados:

mates2015 <- pisa2015.mean.pv(pvlabel = "MATH", by = c("CCAA", "ST004D01T"), data = esp2015)
head(mates2015)
##        CCAA ST004D01T Freq   Mean s.e.    SD  s.e
## 1 Andalusia    Female  920 459.80 5.40 81.94 2.57
## 2 Andalusia      Male  893 472.10 4.15 86.28 2.85
## 3    Aragon    Female  832 495.89 5.30 78.71 2.84
## 4    Aragon      Male  966 504.07 5.77 86.79 2.56
## 5  Asturias    Female  874 484.70 5.42 81.24 2.25
## 6  Asturias      Male  916 498.01 6.28 86.81 2.76

La función head sirve para mostrar sólo la primera parte de un objeto. Podéis aprender sobre ella con ? head.

Transformación de datos: De formato largo a ancho

El objeto mates2015 contiene todos los elementos que necesitamos, pero también otros (además de la media, las frecuencias absolutas, las desviaciones típicas, …), y sobre todo, no está en la forma que queremos para comparar en un gráfico las notas de chicos y chicas. Para ello necesitamos que la nota media de chicos y chicas este en sendas variables, y que las CCAA sean las observaciones. Ahora las observaciones son las combinaciones de sexo y CCAA.

Este tipo de tareas de manipulación de datos se hace de forma muy eficiente con las funciones contenidas en el paquete tidyverse. spread sirve para pasar de forma larga a ancha de acuerdo a los valores de una variable (en nuestro caso ST004D01T). Pero antes, tenemos que seleccionar las columnas que nos interese con select.

En R es muy normal concatenar manipulaciones de objetos. Si se utiliza la notación habitual funcion(argumentos) acabamos con código del tipo f3(f2(f1(arg1),arg2)) que son muy difíciles de leer. El paquete tidyverse está pensado para concatenar acciones con el operador después (%>%), que se puede sacar en RStudio con ALT-MAYUSC-M. De este modo escribiríamos: arg1 %>% f1 %>% f2(arg2) %>% f3, mucho más claro. Esfuérzate por comprender lo que hace el código:

matesw <- mates2015 %>%
  select(CCAA, ST004D01T, Mean) %>%
  spread(ST004D01T, Mean)
matesw
##                    CCAA Female   Male
## 1             Andalusia 459.80 472.10
## 2                Aragon 495.89 504.07
## 3              Asturias 484.70 498.01
## 4      Balearic Islands 472.49 480.16
## 5        Canary Islands 445.30 458.85
## 6             Cantabria 490.52 499.19
## 7      Castile and Leon 503.82 508.92
## 8     Castile-La Mancha 480.41 491.69
## 9             Catalonia 490.25 508.50
## 10          Extremadura 469.94 476.18
## 11              Galicia 488.49 499.28
## 12             La Rioja 499.70 509.38
## 13               Madrid 493.82 512.64
## 14               Murcia 467.25 473.23
## 15              Navarre 511.97 523.89
## 16       Basque Country 487.13 496.24
## 17 Comunidad Valenciana 478.55 491.32

Estos datos ya están en la forma que queríamos. Por último, para no poner los nombres de todas las CCAA en el gráfico, podemos seleccionar unas cuantas para identificarlas. Con la función filter seleccionamos las observaciones que nos interesan

mateswsel <- matesw %>%
  filter(CCAA %in% c("Castile and Leon", "Navarre","Extremadura","Madrid","Canary Islands","Galicia"))
mateswsel
##               CCAA Female   Male
## 1   Canary Islands 445.30 458.85
## 2 Castile and Leon 503.82 508.92
## 3      Extremadura 469.94 476.18
## 4          Galicia 488.49 499.28
## 5           Madrid 493.82 512.64
## 6          Navarre 511.97 523.89

Gráficos ggplot

En R existen varios mecanismos para representar gráficamente los datos. El más desarrollado es el paquete [ggplot2](http://docs.ggplot2.org/current/) que forma parte detidyverse`. Existe una chuleta en español.

La función básica es ggplot que requiere un primer argumento con el objeto de datos (en nuestro caso) matesw, y una declaración del aspecto del gráfico: qué va en cada eje. A continuación, separados por + podemos añadir cosas al gráfico, como puntos, líneas, texto, etc. Examina el código y trata de comprender qué define cada línea.

ples <- ggplot(matesw, aes(x=Female, y=Male)) +
  geom_point() +
  geom_point(data=mateswsel, color="red") +
  geom_text(data=mateswsel,aes(label=CCAA), color="grey20") +
  geom_abline(slope=1, intercept = 0) + 
  geom_abline(slope=1, intercept = 20, linetype = 2, color="grey") + 
  geom_abline(slope=1, intercept = -20, linetype = 2, color="grey") +
  geom_text(x=465, y=495, label="Chicos +20 puntos", angle=45, color="grey", size=8) + 
  geom_text(x=495, y=465, label="Chicas +20 puntos", angle=45, color="grey", size=8) + 
  coord_fixed(xlim = c(440,525), ylim = c(440,525)) +
  theme_bw() + ggtitle("Resultados PISA 2015 - Brecha de género en matemáticas por CCAA") +
  xlab("Nota media para chicas PISA 2015") +
  ylab("Nota media para chicos PISA 2015")

Como ves, la instrucción anterior no genera el gráfico. Genera un nuevo objeto ples, que aparece como de tipo lista (list) en RStudio, pero que si preguntamos vemos que corresponde a un gráfico ggplot

class(ples)
## [1] "gg"     "ggplot"

Si no hacemos asignación, habría salido directamente el gráfico. La asignación es útil si queremos seguir configurando el gráfico añadiendo más información o configurando la que aparece. Lo podemos imprimir con:

ples

Análisis de resultados

Vemos que el gráfico capta muy bien las diferencias entre hombres y mujeres en las CCAA españolas. Existen importantes diferencias entre CCAA, con los mejores resultados de matemáticas en Navarra y los peores en Canarias. Castilla y León está bastante bien. Respecto a la brecha de género, en todos los casos los chicos españoles tienen media superior a las chicas -a diferencia del análisis de países-. En todos los casos las diferencias son menores de 20 puntos. Castilla y León es una de las CCAA con menores diferencias. Vemos que en Madrid, por ejemplo, donde las diferencias de género son mayores, los chicos obtienen mejores notas que en Castilla y León, pero las chicas obtienen peores resultados.

Como véis, es posible hacer en R análisis sofisticados de manera relativamente sencilla, y es muy sencillo poder comunicar los resultados del análisis en formato html, pdf o doc utilizando el formato RMarkdown. Para ello sólo hace falta dar al botón de knit en RStudio.

Código completo

library(intsvy)
library(tidyverse)


load("esp2015.RData")


# España

mates2015 <- pisa2015.mean.pv(pvlabel = "MATH", by = c("CCAA", "ST004D01T"), data = esp2015)
matesw <- mates2015 %>%
  select(CCAA, ST004D01T, Mean) %>%
  spread(ST004D01T, Mean)

mateswsel <- matesw %>%
  filter(CCAA %in% c("Castile and Leon", "Navarre","Extremadura","Madrid","Canary Islands","Galicia"))

ples <- ggplot(matesw, aes(x=Female,y=Male)) +
  geom_point() +
  geom_point(data=mateswsel, color="red") +
  geom_text(data=mateswsel,aes(label=CCAA), color="grey20") +
  geom_abline(slope=1, intercept = 0) + 
  geom_abline(slope=1, intercept = 20, linetype = 2, color="grey") + 
  geom_abline(slope=1, intercept = -20, linetype = 2, color="grey") +
  geom_text(x=465, y=495, label="Chicos +20 puntos", angle=45, color="grey", size=8) + 
  geom_text(x=495, y=465, label="Chicas +20 puntos", angle=45, color="grey", size=8) + 
  coord_fixed(xlim = c(440,525), ylim = c(440,525)) +
  theme_bw() + ggtitle("Resultados PISA 2015 - Diferencias de género en matemáticas por CCAA") +
  xlab("Nota media para chicas PISA 2015") +
  ylab("Nota media para chicos PISA 2015")

ples