Una serie de tiempo es una secuencia de datos u observaciones, medidos en determinados momentos y ordenados cronológicamente. Visualmente, es una curva que evoluciona en el tiempo.
Un gráfico de series temporales es una visualización de datos que muestra la evolución de una variable a lo largo del tiempo. Por lo general, se utilizan líneas para conectar los puntos de datos, aunque la decisión de mostrar los puntos o no depende de las preferencias y del nivel de discretización.
Para crear un gráfico de series temporales en ggplot2 con una única variable, solo necesitas un data frame que contenga fechas y los valores correspondientes de la variable. Asegúrate de que la columna de fechas esté en formato de fecha. Luego, puedes pasar tus datos y utilizar las funciones geom_line o geom_point.
Para realizar los ejemplos, vamos a utilizar la base de datos economics de la libreria ggplot2. Este conjunto de datos fue creado a partir de datos de series temporales económicas de Estados Unidos disponibles en https://fred.stlouisfed.org/.
library(ggplot2)
head(economics)
## # A tibble: 6 × 6
## date pce pop psavert uempmed unemploy
## <date> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1967-07-01 507. 198712 12.6 4.5 2944
## 2 1967-08-01 510. 198911 12.6 4.7 2945
## 3 1967-09-01 516. 199113 11.9 4.6 2958
## 4 1967-10-01 512. 199311 12.9 4.9 3143
## 5 1967-11-01 517. 199498 12.8 4.7 3066
## 6 1967-12-01 525. 199657 11.8 4.8 3018
Un data frame con 574 filas y 6 variables:
Mes de recolección de datos
Gastos de consumo personal, en miles de millones de dólares, https://fred.stlouisfed.org/series/PCE
Población total, en miles, https://fred.stlouisfed.org/series/POP
Tasa de ahorro personal, https://fred.stlouisfed.org/series/PSAVERT/
Duración mediana del desempleo, en semanas, https://fred.stlouisfed.org/series/UEMPMED
Número de desempleados, en miles, https://fred.stlouisfed.org/series/UNEMPLOY
# Datos con fechas y variables. La columna 'date' (fecha) es de clase "Date"
df <- economics[economics$date > as.Date("2000-01-01"), ]
ggplot(df, aes(x = date, y = unemploy)) +
geom_line()
Como se mencionó previamente, es posible añadir puntos a la serie temporal utilizando la función geom_point. Sin embargo, en este ejemplo hay una gran cantidad de observaciones, lo cual podría dificultar la legibilidad del gráfico si se incluyen los puntos. Por esta razón, en los ejemplos siguientes optaremos por no mostrar los puntos.
ggplot(df, aes(x = date, y = unemploy)) +
geom_line() +
geom_point()
Para verificar la clase de la variable “date” en R, puedes utilizar la función class(df$date) o inspeccionar la estructura del data frame con str(df).
Si la variable no está en formato de fecha, puedes utilizar las funciones as.Date y as.POSIXct para transformar las fechas en el formato adecuado. Por ejemplo:
df$date <- as.Date(df$date) # Transformar la variable fecha a formato de fecha
head(df)
## # A tibble: 6 × 6
## date pce pop psavert uempmed unemploy
## <date> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 2000-02-01 6620. 281190 4.8 6.1 5858
## 2 2000-03-01 6686. 281409 4.5 6 5733
## 3 2000-04-01 6671. 281653 5 6.1 5481
## 4 2000-05-01 6708. 281877 4.9 5.8 5758
## 5 2000-06-01 6744. 282126 4.9 5.7 5651
## 6 2000-07-01 6764. 282385 5.2 6 5747
O bien:
df$date <- as.POSIXct(df$date) # Transformar la variable fecha a formato de fecha y hora
head(df)
## # A tibble: 6 × 6
## date pce pop psavert uempmed unemploy
## <dttm> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 2000-02-01 00:00:00 6620. 281190 4.8 6.1 5858
## 2 2000-03-01 00:00:00 6686. 281409 4.5 6 5733
## 3 2000-04-01 00:00:00 6671. 281653 5 6.1 5481
## 4 2000-05-01 00:00:00 6708. 281877 4.9 5.8 5758
## 5 2000-06-01 00:00:00 6744. 282126 4.9 5.7 5651
## 6 2000-07-01 00:00:00 6764. 282385 5.2 6 5747
Esto asegurará que la variable “date” esté en el formato correcto para su uso en el gráfico de series temporales.
¡Claro! En ggplot2, puedes colorear el área bajo la línea de una serie temporal utilizando la función geom_area. Aquí tienes un ejemplo de cómo hacerlo:
df <- economics[economics$date > as.Date("2000-01-01"), ]
ggplot(df, aes(x = date, y = unemploy)) +
geom_area(fill = "gray", alpha = 0.9) +
geom_line()
o con color:
# Crear el gráfico de series temporales con área coloreada
ggplot(data = df, aes(x = date, y = unemploy)) +
geom_area(fill = "lightblue") +
labs(x = "Fecha", y = "Desempleo") +
ggtitle("Serie Temporal con Área Coloreada")
Con la función geom_smooth en ggplot2, puedes suavizar una serie temporal para analizar tendencias o patrones. Por defecto, geom_smooth también mostrará un intervalo de confianza alrededor de la suavización. Si deseas eliminar el intervalo de confianza, puedes utilizar el argumento *se = FALSE. Aquí tienes un ejemplo de cómo usarlo:
ggplot(df, aes(x = date, y = unemploy)) +
geom_line() +
geom_smooth(se = FALSE)+
ggtitle("Serie Temporal Suavizada sin Intervalo de Confianza")
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
Para dibujar varias series de tiempo al mismo tiempo en ggplot2, es necesario que tus data frames estén en formato largo (long). Para este ejemplo, utilizaremos un subconjunto del conjunto de datos de muestra “economics_long” de ggplot2.
library(ggplot2)
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
# Datos
df2 <- economics_long[economics_long$date > as.Date("2000-01-01"), ] %>%
filter(variable == "pce" | variable == "unemploy")
ggplot(df2, aes(x = date, y = value, color = variable)) +
geom_line() +
theme(legend.position = "bottom")
Este código generará un gráfico con varias series de tiempo, donde cada
serie se distinguirá por un color diferente. Asegúrate de tener el data
frame “economics_long” cargado y en el formato adecuado antes de
ejecutar el código. Si deseas personalizar aún más el gráfico, puedes
ajustar los títulos de los ejes y las leyendas de colores según tus
necesidades.
Para personalizar el color de cada serie en un gráfico de varias series de tiempo en ggplot2, puedes utilizar la función scale_color_manual. Puedes especificar tantos colores como líneas en el gráfico utilizando el argumento values, o puedes utilizar otras funciones para personalizar las escalas de color discretas. Aquí tienes un ejemplo de cómo hacerlo:
library(ggplot2)
library(dplyr)
# Vector de colores personalizados
colores <- c("green", "red", "blue", "orange")
# Datos
df2 <- economics_long[economics_long$date > as.Date("2000-01-01"), ] %>%
filter(variable == "pce" | variable == "unemploy")
# Crear el gráfico de varias series de tiempo con colores personalizados
ggplot(data = df2, aes(x = date, y = value, color = variable)) +
geom_line() +
scale_color_manual(values = colores) +
labs(x = "Fecha", y = "Valor", color = "Variable") +
ggtitle("Varias Series de Tiempo con Colores Personalizados")
En este ejemplo, el vector colores contiene los colores personalizados que se asignarán a cada serie de tiempo. Puedes modificar este vector para ajustar los colores según tus preferencias. El argumento values de scale_color_manual se utiliza para especificar los colores personalizados.
Si deseas utilizar una escala de color discreta personalizada en lugar de asignar colores manualmente, puedes explorar otras funciones, como scale_color_brewer, scale_color_viridis, scale_color_gradient, entre otras, para personalizar aún más las escalas de color.
Recuerda tener el data frame “economics_long” cargado y en el formato adecuado antes de ejecutar el código.
Utilizando las facetas en ggplot2 puedes dividir una serie de tiempo en intervalos predefinidos. En el siguiente ejemplo, utilizamos la función year del paquete lubridate para extraer el año correspondiente de cada observación y creamos una nueva columna para dividir la serie temporal. Además, establecemos scales = “free” para permitir que las escalas de los ejes sean independientes en cada faceta. Asegúrate de tener instalados los paquetes ggplot2 y lubridate antes de ejecutar el siguiente código:
library(ggplot2)
library(lubridate)
##
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
##
## date, intersect, setdiff, union
# Datos
df <- economics[economics$date > as.Date("2000-01-01"), ]
# Nueva columna con el año correspondiente para cada fecha
df$year <- year(df$date)
ggplot(df, aes(x = date, y = unemploy)) +
geom_line() +
facet_wrap(~year, scales = "free")
En este ejemplo, el data frame df debe contener una columna date con las
fechas y una columna variable con los valores de la variable que deseas
representar. La función year se utiliza para extraer el año de la
columna date y se crea una nueva columna year en el data frame. Luego,
utilizamos facet_wrap con ~ year para crear las facetas por año.
Con scales = “free”, las escalas de los ejes en cada faceta se ajustarán automáticamente según los valores de cada año, lo que permite una visualización más clara y precisa de cada serie temporal.
Con la función scale_x_date en ggplot2, puedes personalizar el eje X cuando representa fechas. Puedes modificar el formato de las fechas, los límites del gráfico y el número de marcas en los ejes. A continuación, te presento una tabla con algunos símbolos comunes utilizados para especificar diferentes formatos de fechas:
Símbolo | Descripción |
---|---|
%d | Día del mes (01-31) |
%m | Mes numérico (01-12) |
%b | Mes abreviado (ene, feb, mar, etc.) |
%B | Mes completo (enero, febrero, marzo, etc.) |
%y | Año sin siglo (00-99) |
%Y | Año con siglo (por ejemplo, 2023) |
%H | Hora en formato 24 horas (00-23) |
%I | Hora en formato 12 horas (01-12) |
%M | Minuto (00-59) |
%S | Segundo (00-59) |
%p | AM o PM |
El argumento date_labels de la función scale_x_date se puede usar para personalizar el formato de las fechas. En el ejemplo siguiente establecemos %Y-%m-%d, que mostrará el año, el mes y el día separados por guiones, en lugar de solo el año.
df <- economics[economics$date > as.Date("2000-01-01"), ]
ggplot(df, aes(x = date, y = unemploy)) +
geom_line() +
scale_x_date(date_labels = "%Y-%m-%d")
En este ejemplo, se utiliza scale_x_date para personalizar el eje X.
date_labels se establece como “%b-%Y” para mostrar el mes abreviado y el
año completo en el formato “ene-2023”. limits se utiliza para establecer
los límites del eje X, en este caso, desde el 1 de enero de 2020 hasta
el 31 de diciembre de 2022. date_breaks se establece como “1 month” para
mostrar marcas de intervalos mensuales en el eje X.
Puedes ajustar estos parámetros según tus necesidades y utilizar otros símbolos de formato de fechas para lograr la apariencia deseada en el eje X de tu gráfico de series temporales.
La función scale_x_date en ggplot2 permite establecer los límites del eje X cuando se representan fechas. Al utilizar limit = c(as.Date(“2010-01-01”), as.Date(“2015-01-01”)), se restringe la visualización a un período específico, en este caso, desde el 1 de enero de 2010 hasta el 1 de enero de 2015. Esto es útil para enfocar la atención en un intervalo de tiempo particular o resaltar cambios importantes en los datos. Asegúrate de que las fechas en los límites estén en el mismo formato que las fechas en tu conjunto de datos. Personalizar los límites del eje X te permite ajustar la visualización según tus necesidades y requisitos.
df <- economics[economics$date > as.Date("2000-01-01"), ]
ggplot(df, aes(x = date, y = unemploy)) +
geom_line() +
scale_x_date(limit = c(as.Date("2010-01-01"), as.Date("2015-01-01")))
## Warning: Removed 122 rows containing missing values (`geom_line()`).
demás de establecer los límites del eje X en ggplot2, también puedes especificar las marcas de los ejes utilizando el argumento breaks en la función scale_x_date. Este argumento te permite seleccionar las fechas que se utilizarán como marcas en el eje X.
Aquí tienes un ejemplo de cómo especificar las marcas de los ejes utilizando fechas específicas:
df <- economics[economics$date > as.Date("2000-01-01"), ]
ggplot(df, aes(x = date, y = unemploy)) +
geom_line() +
scale_x_date(breaks = c(as.Date("2001-01-01"),
as.Date("2008-01-01"),
as.Date("2012-01-01")))
Una alternativa es especificar las marcas con textos de la forma “1 day” (una marca cada día), “2 months” (una marca cada dos meses), “6 years” (una marca cada seis años).
df <- economics[economics$date > as.Date("2000-01-01"), ]
ggplot(df, aes(x = date, y = unemploy)) +
geom_line() +
scale_x_date(date_breaks = "5 years")
La función scale_x_date en ggplot2 también ofrece el argumento
date_minor_breaks para establecer el grid secundario del eje X. Este
argumento funciona de manera similar al argumento date_breaks, pero se
utiliza para especificar las marcas del grid secundario en el eje X.
Aquí tienes un ejemplo de cómo utilizar date_minor_breaks para establecer el grid secundario del eje X:
df <- economics[economics$date > as.Date("2000-01-01"), ]
ggplot(df, aes(x = date, y = unemploy)) +
geom_line() +
scale_x_date(date_breaks = "5 years",
date_minor_breaks = "1 year")
En este ejemplo, se utilizan las marcas del grid principal en el eje X establecidas por date_breaks = “1 year” para mostrar marcas cada año. Luego, se utiliza date_minor_breaks = “1 month” para especificar las marcas del grid secundario que se mostrarán cada mes.
El grid secundario del eje X es útil para mostrar subdivisiones más pequeñas entre las marcas principales, lo que puede ayudar a una mejor comprensión de los patrones temporales en tu serie de tiempo. Puedes ajustar date_minor_breaks según tus necesidades, ya sea especificando una unidad de tiempo diferente (días, semanas, etc.) o utilizando valores numéricos para un control más preciso del grid secundario.
Experimenta con diferentes valores para date_minor_breaks y encuentra la configuración que mejor se adapte a tu serie temporal y tus objetivos de visualización.
df <- economics[economics$date > as.Date("2000-01-01"), ]
ggplot(df, aes(x = date, y = unemploy)) +
geom_line() +
scale_x_date(date_breaks = "1 year",
date_minor_breaks = "1 month")
Puedes agregar líneas verticales y horizontales para resaltar puntos de interés o cambios estructurales en tu gráfico utilizando las funciones geom_vline y geom_hline en ggplot2.
Aquí tienes un ejemplo de cómo utilizar estas funciones:
library(ggplot2)
library(ggpmisc)
## Loading required package: ggpp
##
## Attaching package: 'ggpp'
## The following object is masked from 'package:ggplot2':
##
## annotate
# Datos
df <- economics[economics$date > as.Date("2000-01-01"), ]
ggplot(df, aes(x = date, y = unemploy)) +
geom_line() +
geom_vline(xintercept = as.Date("2007-09-15"),
linetype = 2, color = 2, linewidth = 1)
En este ejemplo, se agrega una línea vertical con geom_vline en la fecha “2022-01-01”. La opción xintercept especifica el punto de intersección en el eje X, mientras que linetype y color controlan el estilo y el color de la línea vertical, respectivamente.
También se agrega una línea horizontal con geom_hline en el valor 0. La opción yintercept determina la posición de intersección en el eje Y, y linetype y color controlan el estilo y el color de la línea horizontal.
Estas líneas pueden ser útiles para resaltar eventos significativos, puntos de referencia o cambios estructurales en tu serie temporal. Puedes personalizar los parámetros según tus necesidades, como el estilo de línea, el color y las coordenadas de intersección.
Agrega las líneas verticales y horizontales relevantes a tu gráfico para mejorar la visualización y resaltar aspectos importantes de tus datos.
library(ggplot2)
# Crear el gráfico de series temporales con líneas verticales y horizontales
ggplot(data = df, aes(x = date, y = unemploy)) +
geom_line() +
geom_vline(xintercept = as.Date("2010-01-01"), linetype = "dashed", color = "red") +
geom_hline(yintercept = mean(df$unemploy), linetype = "dotted", color = "blue") +
labs(x = "Fecha", y = "Variable") +
ggtitle("Serie Temporal con Líneas Resaltadas")
Con las funciones stat_peaks y stat_valleys del paquete ggpmisc en R, puedes resaltar los máximos y mínimos locales de una serie temporal en función de un umbral predefinido. Estas funciones funcionan de manera similar y permiten representar los picos y los valles en el gráfico.
Aquí tienes un ejemplo de cómo utilizar estas funciones para resaltar los picos y valles en una serie temporal:
library(ggplot2)
library(ggpmisc)
# Datos
df <- economics[economics$date > as.Date("2000-01-01"), ]
ggplot(df, aes(x = date, y = unemploy)) +
geom_line() +
stat_peaks(geom = "point", span = 15, color = "steelblue3", size = 2) +
stat_peaks(geom = "label", span = 15, color = "steelblue3", angle = 0,
hjust = -0.1, x.label.fmt = "%Y-%m-%d") +
stat_peaks(geom = "rug", span = 15, color = "blue", sides = "b")
En este ejemplo, se utiliza stat_peaks para resaltar los picos y
stat_valleys para resaltar los valles en la serie temporal. El argumento
colour especifica el color de los puntos que representan los picos y los
valles. El argumento span determina el umbral para detectar los máximos
y mínimos locales, donde un valor mayor de span resultará en una
detección más suave de los picos y valles.
El argumento geom se utiliza para especificar el tipo de geometría utilizada para representar los picos y valles, que por defecto es “point” para puntos. También se agrega geom_rug para mostrar las marcas de rug en la parte inferior del gráfico, que ayudan a visualizar la ubicación de los picos y valles en el eje X.
Puedes personalizar los parámetros según tus necesidades, como el color, el umbral y la geometría utilizada para representar los picos y valles. Experimenta con diferentes configuraciones para resaltar los puntos de interés en tu serie temporal y obtener una visualización más informativa.
library(ggplot2)
library(ggpmisc)
# Datos
df <- economics[economics$date > as.Date("2000-01-01"), ]
ggplot(df, aes(x = date, y = unemploy)) +
geom_line() +
stat_valleys(geom = "point", span = 11, color = "red", size = 2) +
stat_valleys(geom = "label", span = 11, color = "red", angle = 0,
hjust = -0.1, x.label.fmt = "%Y-%m-%d") +
stat_valleys(geom = "rug", span = 11, color = "red", sides = "b")
Con geom_rect es posible sombrear algunas áreas del gráfico de series de tiempo. Esto es especialmente interesante para resaltar tendencias, recesiones, etc.
df <- economics[economics$date > as.Date("2000-01-01"), ]
# Sombreamos desde 2000 a 2004 y de 2010 a 2015
shade <- data.frame(x1 = c(as.Date("2000-01-01"), as.Date("2010-01-01")),
x2 = c(as.Date("2004-01-01"), as.Date("2015-01-01")),
min = c(-Inf, -Inf), max = c(Inf, Inf))
ggplot() +
geom_line(data = df, aes(x = date, y = unemploy)) +
geom_rect(data = shade, aes(xmin = x1, xmax = x2, ymin = min, ymax = max),
fill = c("yellow" ,"red"), alpha = 0.2)