3  Exploración de datos en R

3.1 Exploración básica

Comando Descripción
sort() ordena los datos
summary() resúmenes estadísticos
fivenum() mímino, Q1, media, Q3, máximo
min() mínimo
max() máximo
mean() media
median() mediana
range() (mínimo, máximo)
sd() desviación típica
var() varianza
cor() correlación

Para resumir

.

plot( df$x, df$y, 
      type = "n",
      xlab = "X label", 
      ylab = "Y label",
      xlim = c(0,15),
      ylim = c(0,20)
)

Ejemplos en - Cluster

Opción Descripción
cex= La escala del elemento respecto al gráfico (1.0 por defecto)
col= color; es un vector - el primer elemento define las líneas si las hay
pch= El símbolo utilizado en los puntos
type= Cómo se representan los datos
type= Descripción
p puntos
l líneas
b both
c líneas (vacío en lugar de los puntos)
o overplot - líneas sobre los puntos
h histogram
s steps
S otro tipo de steps
n no plotting

En el programa base también tenemos

  • hist()
  • boxplot()

3.1.1 Puntos

pch= sirve para definir el punto utilizado en el gráfico, y cex= su escala respecto al resto del gráfico. col= s

3.1.2 Exportar imágenes

svg("filename.svg")           # Abre el documento
#png("filename.png")
plot(data$var1, data$var2)    # Vuelca el plot
dev.off()                     # Cierra y guarda el documento

3.2 ggplot2

Todos los plots de ggplot2 tienen tres elementos fundamentales: data, aes (la parte “estética”) y al menos una función geom que representa las observaciones.

El siguiente código

ggplot(mpg, aes(x = displ, y = hwy)) +
  geom_point()

donde mpg es un data set, displ y hwy son las variables representadas. geom_point() especifica que hay que generar puntos:

> print(mpg)
# A tibble: 234 x 11
   manufacturer model    displ  year   cyl trans    drv     cty   hwy fl    class
   <chr>        <chr>    <dbl> <int> <int> <chr>    <chr> <int> <int> <chr> <chr>
 1 audi         a4         1.8  1999     4 auto(l5) f        18    29 p     compa…
 2 audi         a4         1.8  1999     4 manual(… f        21    29 p     compa…
 3 audi         a4         2    2008     4 manual(… f        20    31 p     compa…
 4 audi         a4         2    2008     4 auto(av) f        21    30 p     compa…
 5 audi         a4         2.8  1999     6 auto(l5) f        16    26 p     compa…
 6 audi         a4         2.8  1999     6 manual(… f        18    26 p     compa…
 7 audi         a4         3.1  2008     6 auto(av) f        18    27 p     compa…
 8 audi         a4 quat…   1.8  1999     4 manual(… 4        18    26 p     compa…
 9 audi         a4 quat…   1.8  1999     4 auto(l5) 4        16    25 p     compa…
10 audi         a4 quat…   2    2008     4 manual(… 4        20    28 p     compa…
# … with 224 more rows

Original

3.2.1 Atributos estéticos

aes se puede llamar dentro de la variable principal o en cada uno de los elementos. Se puede cambiar el color, la forma y el tamaño en función de otros atributos:

colour

ggplot(mpg, aes(displ, hwy, color = class)) +
  geom_point()

colour

shape

ggplot(mpg, aes(displ, hwy, shape = drv)) +
  geom_point()

shape

size

ggplot(mpg, aes(displ, hwy, size = cyl)) +
  geom_point()

size

Todo junto:

todo

IMPORTANTE: En los ejemplos anteriores, el color se escala; es decir, se le atribuye a cada elemento un color distinto. aes se puede colocar dentro de cualquier elemento, incluyendo geom.

La diferencia entre

ggplot(mpg, aes(displ, hwy)) +
geom_point(aes(colour = "blue"))

aes_color

y

ggplot(mpg, aes(displ, hwy)) +
geom_point(colour = "blue")

no_color

es que en el ejemplo de arriba se asigna un elemento estético de color con el término azul - ggplot elige el color y le pone la etiqueta azul.

En el ejemplo de abajo, se asigna un color fijo al geom.

3.2.2 Facetado

Para representar el mismo tipo de gráfico en cada una de las posibilidades de una variable, se puede utilizar la función de facetar. El ejemplo más sencillo es facet_wrap(), que admite como argumento una variable precedida de ~:

ggplot(mpg, aes(displ, hwy)) +
  geom_point() +
  facet_wrap(~class)

facet intro

3.2.3 geom - ejemplos

3.2.3.1 Línea suavizada con geom_smooth()

Crea una línea de tendencia con un intervalo de confianza (que puede desactivarse utilizando el argumento geom_smooth(se = FAlSE)).

Se pueden usar distintos métodos (method = "loess"). El método loess es por defecto y utilizan el argumento geom_smooth(span = 1), en el cuál 0 es muy abrupto y 1 es lo más suave posible.

ggplot(mpg, aes(displ, hwy)) +
  geom_point() +
  geom_smooth()

Hay otros métodos - "gam", que requiere library(mgcv), "lm" (una línea en lugar de una curva)

ggplot(mpg, aes(displ, hwy)) +
  geom_point() +
  geom_smooth(method = "lm")

y "rlm" (igual que "lm" pero más robusto en caso de outliers; requiere library(MASS)).

3.2.3.2 Boxplots y similares

Un scatterplot para variables categóricas devuelve lo siguiente

ggplot(mpg, aes(drv, hwy)) +
  geom_point()

geom_jitter() evita el overplotting añadiendo ruido aleatorio:

geom_bloxplot() traza un boxplot típico:

geom_violin() calcula la densidad teniendo en cuenta el grosor. Además de size, colour y shape, los plots de violines permiten modificar el color del reborde (colour) y el relleno (fill).

3.2.3.3 Histogramas y polígonos de frecuencia

Por defecto, geom_histogram y geom_freqpoly generan bins de 30; el argumento binwidth = sirve para ajustar el número de bins.

ggplot(mpg, aes(hwy)) +
  geom_histogram()

ggplot(mpg, aes(hwy)) +
  geom_freqpoly()

Además de determinar el tamaño de los bins, se puede modificar el color (histograma) o el relleno (polígono de frecuencias) en función de otra variable:

ggplot(mpg, aes(displ, colour = drv)) +
  geom_freqpoly(binwidth = 0.5)

ggplot(mpg, aes(displ, fill = drv)) +
  geom_histogram(binwidth = 0.5) +
  facet_wrap(~drv, ncol = 1)

3.2.3.4 Bar charts

Se usa geom_bar().

3.2.4 Modificar los ejes

Los elementos ylab() y xlab() sirven para modificar el nombre de los ejes; xlab(NULL) hace que no se imprima nada:

ggplot(mpg, aes(cty, hwy)) +
  geom_point(alpha = 1 / 3) +
  xlab("city driving (mpg)") +
  ylab(NULL)

3.2.4.1 Límites

xlim() y ylim() modifican los límites de los ejes; sirven también para variables categóricas:

ggplot(mpg, aes(drv, hwy)) +
  geom_jitter(width = 0.25)

ggplot(mpg, aes(drv, hwy)) +
  geom_jitter(width = 0.25) +
  xlim("f", "r") +
  ylim(20, 30)

3.2.5 Output

Toda la función ggplot se puede guardar en un elemento a través de <-, y después imprimir como print() (si esto ocurre dentro de un loop, por ejemplo) o guardar con ggsave() (en la que se especifica la altura y el formato).

3.2.6 Geoms

Todos los geoms bidimensionales requieren x e y dentro de aes para funcionar; ademas utilizan colour y size; los rellenos también utilizan fill.

3.2.7 Grupos

Hay distintas formas de agrupar la información; para estos ejemplos se utiliza nlme::Oxboys, una base de datos que mide la altura de individuos en distintas ocasiones.

> head(Oxboys)
Grouped Data: height ~ age | Subject
  Subject     age height Occasion
1       1 -1.0000  140.5        1
2       1 -0.7479  143.4        2
3       1 -0.4630  144.8        3
4       1 -0.1643  147.1        4
5       1 -0.0027  147.7        5
6       1  0.2466  150.2        6

En este dataframe, Oxboys$Subject identifica a cada individuo. Si no se tiene en cuenta la agrupación

ggplot(Oxboys, aes(age, height)) +
  geom_point() +
  geom_line()

se representa la información sin tener en cuenta al sujeto:

Hay que especificar que los datos están agrupados por sujeto para que funcione:

ggplot(Oxboys, aes(age, height, group = Subject)) +
  geom_point() +
  geom_line()

Cuando hay una combinación de variables que definen el grupo se puede utilizar la función interaction() para agrouparlas - aes(group = interaction(school_id, student_id)).

3.2.7.1 Grupos por capas

En el ejemplo anterior, hemos definido la agrupación en el primer aes, que se propaga a todos los demás. Si quisiesemos hacer una correlación usando geom_smooth(), el geom tendría esto en cuenta:

ggplot(Oxboys, aes(age, height, group = Subject)) +
  geom_line() +
  geom_smooth(method = "lm", se = FALSE)

La solución es aplicar la agrupación al geom_xx(aes()) deseado y que no se propage a los demás:

ggplot(Oxboys, aes(age, height)) +
  geom_line(aes(group = Subject)) +
  geom_smooth(method = "lm", size = 2, se = FALSE, colour = "red")

En otras ocasiones hay que deshacer la agrupación por defecto. Al intentar hacer una línea que conecte a cada individuos

ggplot(Oxboys, aes(Occasion, height)) +
  geom_boxplot() +
  geom_line(colour = "#3366FF", alpha = 0.5)

considera que la línea hay que dibujara por Oxboys$Occasion. Para romper la asociación, hay que especificarlo en el aes() correspondiente:

ggplot(Oxboys, aes(Occasion, height)) +
  geom_boxplot() +
  geom_line(aes(group = Subject), colour = "#3366FF", alpha = 0.5)

3.2.8 Glosario

3.2.8.1 geom_jitter()

Los argumentos width = y height = determinan el grado de aleatoridad en estos dos ejes; por defecto son 0,4.

3.2.8.2 geom_bar

Siempre utiliza el argumento stat = "identity" para evitar funcionar contando elementos de x; esto hace que utilice y como argumento.

1.
Chollet F. Deep learning with R. Second edition. Shelter Island: Manning; 2022.
2.
Gatto L. An Introduction to Machine Learning with R. 2020.
3.
Song Y, Millidge B, Salvatori T, Lukasiewicz T, Xu Z, Bogacz R. Inferring neural activity before plasticity as a foundation for learning beyond backpropagation. Nat Neurosci. 2024 Feb;27(2):348–58.
4.
Jones E, Harden S, Crawley MJ. The R book. Third edition. Hoboken, NJ: Wiley; 2022.
5.
Field A, Miles J, Field Z. Discovering statistics using R. Repr. Los Angeles, CA, USA: Sage; 2014.
6.
Yap BW, Sim CH. Comparisons of various types of normality tests. Journal of Statistical Computation and Simulation. 2011 Dec;81(12):2141–55.
7.
Perezgonzalez JD. Fisher, Neyman-Pearson or NHST? A tutorial for teaching data testing. Front Psychol. 2015 Mar;6:223.
8.
Lantz B. Machine learning with R: Learn techniques for building and improving machine learning models, from data preparation to model tuning, evaluation, and working with big data, fourth edition. 4th ed. Place of publication not identified: Packt Publishing; 2023.
9.
Carmona Pontaque F. Álgebra Matricial en Estadística. Análisis Multivariante. Fundació Universitat Oberta de Catalunya; 2024.
10.
Carmona Pontaque F. Modelos lineales. Ediciones de la Universidad de Barcelona; 2004.
11.
Faraway JJ. Linear models with R. Second edition. Boca Raton London: CRC Press, Taylor & Francis; 2014. (Texts in statistical science).