Si está interesado en aprender a realizar análisis de series temporales en Python, una buena manera de comenzar es trabajando con un conjunto de datos del mundo real. En este artículo, le mostraremos cómo descargar y analizar el conjunto de datos de pasajeros aéreos, que es un conjunto de datos ampliamente utilizado en el campo del análisis de series temporales. El conjunto de datos contiene números mensuales de pasajeros de aerolíneas desde 1949 hasta 1960 y se ha utilizado en varios estudios para desarrollar modelos de predicción y analizar las tendencias y la estacionalidad de los datos.
El conjunto de datos de pasajeros aéreos consiste en el número de pasajeros (en miles) que viajaron por aire entre 1949 y 1960. El conjunto de datos tiene 144 observaciones, con una observación por mes en el período. Los datos muestran una tendencia al alza, con un patrón estacional notable. También hay cierta variabilidad en los datos.
El conjunto de datos de pasajeros aéreos es un buen ejemplo de una serie temporal, que es una secuencia de observaciones registradas a intervalos regulares a lo largo del tiempo. El análisis de series temporales es una rama de las estadísticas que se ocupa del análisis y modelado de datos dependientes del tiempo. El análisis de series temporales puede ser útil para comprender el comportamiento y la dinámica de un sistema, identificar patrones y tendencias, pronosticar valores futuros y probar hipótesis.
Hay varios repositorios en línea que ofrecen conjuntos de datos gratuitos y abiertos para proyectos de ciencia de datos. Algunos de ellos son:
Para descargar el conjunto de datos desde cualquiera de estas fuentes, puede seguir estos pasos:
Una vez que haya descargado el conjunto de datos, puede importarlo a Python utilizando pandas, que es una biblioteca popular para la manipulación y el análisis de datos. Pandas proporciona varias funciones para leer diferentes tipos de archivos, como CSV, Excel, JSON, etc. Por ejemplo, para leer un archivo CSV que contiene el conjunto de datos de pasajeros aéreos, puede usar el siguiente código:
import pandas as pd dataset = pd.read_csv("airline-passengers .csv")Esto creará un dataframe pandas llamado dataset, que es una estructura de datos tabular que puede almacenar y manipular datos. Puede usar el método head() para ver las primeras filas del conjunto de datos:
dataset.head()Esto mostrará algo como esto:
Esto mostrará algo como esto:
<class 'pandas.core.frame.DataFrame'> RangeIndex: 144 entradas, 0 a 143 Columnas de datos (total 2 columnas): Columna no llena Dtype --- ------ ----------------- Número de columnas Dtype -- ----- -- Mes 144 Objeto no completo 1 Pasajeros 144-no-null int64 dtypes: int64(1), object(1) uso de memoria: 2.4+ KBPuede ver que el conjunto de datos no tiene valores que faltan y que la columna Mes es de tipo objeto, lo que significa que se almacena como una cadena. Sin embargo, como queremos realizar un análisis de series temporales en los datos, necesitamos convertir la columna Mes en un objeto datetime, que es un tipo de datos especial que puede manejar fechas y horas. Para hacer esto, podemos usar la función pd.to_datetime() y asignar el resultado a la columna Mes:
dataset['Month'] = pd.to_datetime(dataset['Month'])Ahora, si comprobamos el método info(), podemos ver que la columna Mes es de tipo datetime64[ns], lo que significa que es un objeto datetime:
Esto mostrará algo como esto:
<class 'pandas.core.frame.DataFrame'> RangeIndex: 144 entradas, 0 a 143 Columnas de datos (total 2 columnas): # Columna no llena Dtype ---- -------- ------------------------------ > Mes 144 sin fecha[64] 1 Pasajeros 144 dtypes no nulos en 64: datetime64[ns](1), uso de memoria int64(1): 2.4 KBA continuación, queremos establecer la columna Month como el índice del marco de datos, lo que significa que se usará como las etiquetas de fila en lugar del índice numérico predeterminado. Esto facilitará el acceso y la manipulación de los datos en función del tiempo. Para hacer esto, podemos usar el método set_index() y pasar el nombre de la columna que queremos usar como índice:
dataset = dataset.set_index('Mes')dataset.head()Esto mostrará algo como esto:
Finalmente, queremos visualizar los datos usando matplotlib, que es una biblioteca para crear gráficas y gráficos en Python. Matplotlib proporciona varias funciones para crear diferentes tipos de gráficos, como gráficos de líneas, gráficos de barras, gráficos de dispersión, etc. Por ejemplo, para crear un gráfico de líneas de la columna Pasajeros a lo largo del tiempo, podemos usar el siguiente código:
import matplotlib.pyplot as plt plt.plot(dataset['Passengers']) plt.xlabel('Month') plt.ylabel('Passengers') plt.title('Airline Passenger Numbers from 1949 to 1960') plt.show()Esto mostrará una gráfica como esta:
Puede ver que la gráfica muestra una clara tendencia al alza y un patrón estacional en los datos. El número de pasajeros aumenta con el tiempo, con picos en los meses de verano y caídas en los meses de invierno. La gráfica también muestra algunas fluctuaciones y variaciones en los datos, que indican cierta aleatoriedad y ruido en los datos.
Uno de los primeros pasos en el análisis de series temporales es descomponer las series temporales en sus componentes: tendencia, estacionalidad y residuos. La tendencia es la dirección a largo plazo de los datos, la estacionalidad es la variación periódica de los datos, y los residuos son las fluctuaciones aleatorias de los datos. Descomponer las series temporales puede ayudarnos a entender los patrones subyacentes y la estructura de los datos, así como identificar cualquier anomalía o valores atípicos.
from statsmodels.tsa.seasonal import seasonal_decompose decomposition = seasonal_decompose(dataset['Passengers'], model='additive') trend = decomposition.trend seasonal = decomposition.seasonal residual = decomposition.resid>Esto creará tres nuevos marcos de datos: tendencia, estacional y residual, que contienen la tendencia, estacional y componentes residuales de la columna Pasajeros, respectivamente. El argumento del modelo especifica si la serie temporal es aditiva o multiplicativa. Una serie temporal aditiva es aquella en la que los componentes se suman para formar la serie temporal original, mientras que una serie temporal multiplicativa es aquella en la que los componentes se multiplican para formar la serie temporal original. En este caso, utilizamos un modelo aditivo porque parece más apropiado para nuestros datos.
Para visualizar los componentes de la serie temporal, podemos usar el método plot() del objeto de descomposición, que creará cuatro subtramas: una para la serie temporal original, una para el componente de tendencia, una para el componente estacional y una para el componente residual. Por ejemplo, para trazar la descomposición de nuestro conjunto de datos, podemos usar el siguiente código:
decomposition.plot() plt.show()Esto mostrará una gráfica como esta:
Puede ver que el gráfico muestra cómo cada componente contribuye a la serie temporal original. El componente de tendencia muestra una curva suave que capta el aumento a largo plazo del número de pasajeros a lo largo del tiempo. El componente estacional muestra un patrón repetitivo que refleja la variación mensual en el número de pasajeros. El componente residual muestra el ruido aleatorio y las fluctuaciones que no se explican por la tendencia o los componentes estacionales.
Para probar la estacionalidad, podemos usar varios métodos, como trazar las estadísticas de balanceo, realizar la prueba de Dickey-Fuller o usar la prueba KPSS. En este artículo, usaremos la prueba de Dickey-Fuller, que es una prueba estadística que prueba la hipótesis nula de que una serie temporal tiene una raíz unitaria, lo que significa que no es estacionaria. La prueba devuelve una estadística de prueba y un valor p, que se utilizan para rechazar o no rechazar la hipótesis nula. Un valor p bajo (típicamente menos de 0.05) indica que podemos rechazar la hipótesis nula y concluir que la serie temporal es estacionaria. Un valor p alto (típicamente mayor que 0.05) indica que no podemos rechazar la hipótesis nula y concluir que la serie temporal es no estacionaria.
Para realizar la prueba Dickey-Fuller en nuestro conjunto de datos, podemos usar la función adfuller() de la biblioteca statsmodels, que toma una serie de tiempo como entrada y devuelve la estadística de prueba, el valor p y otra información. Por ejemplo, para realizar la prueba Dickey-Fuller en nuestra columna Pasajeros, podemos usar el siguiente código:
from statsmodels.tsa.stattools import adfuller result = adfuller(dataset['Passengers']) print('Test statistic:', result[0]) print('p-value:', result[1])>Esto mostrará algo como esto:
Estadística de la prueba: 0.8153688792060543 p-value: 0.99188024376411Se puede ver que el valor p es muy alto (0.99), lo que significa que no podemos rechazar la hipótesis nula y concluir que la columna Pasajeros es no estacionaria. Esto significa que necesitamos aplicar algunas transformaciones para hacerlo estacionario.
dataset['Passengers_diff'] = dataset['Passengers']. diff(1)Esto creará una nueva columna llamada Passengers_diff, que contiene las diferencias de primer orden de la columna Pasajeros. Puede ver que el primer valor de esta columna es NaN, porque no hay ningún valor anterior que restar de ella. Para eliminar este valor de NaN, podemos usar el método dropna() de pandas, que elimina cualquier fila que contenga valores de NaN. Por ejemplo, para eliminar el valor NaN de nuestra columna Passengers_diff, podemos usar el siguiente código:
dataset = dataset.dropna()Ahora, si comprobamos el método head(), podemos ver que la columna Passengers_diff no tiene valores NaN y contiene las diferencias de primer orden de la columna Pasajeros:
dataset.head()Esto mostrará algo como esto:
podemos trazar la columna Passengers_diff a lo largo del tiempo usando matplotlib, como hicimos antes para la columna Pasajeros. Por ejemplo, para trazar la columna Passengers_diff a lo largo del tiempo, podemos usar el siguiente código:
plt.plot(dataset['Passengers_diff']) plt.xlabel('Month') plt.ylabel('Passengers_diff') plt.title('Diferencias de primer orden de números de pasajeros de aerolíneas') plt.show()>Esto mostrará una gráfica como esta:
Se puede ver que la trama muestra una serie temporal más estacionaria, sin tendencia clara o estacionalidad. La gráfica también muestra menos variabilidad y fluctuaciones en los datos.
result = adfuller(dataset['Passengers_diff']) print('Test statistic:', result[0]) print('p-value:', result[1])Esto mostrará algo como esto:
Estadística de la prueba: -2.829266824170058 p-value: 0.054213290283824954Se puede ver que el valor p es mucho menor (0.05) que antes, lo que significa que podemos rechazar la hipótesis nula y concluir que la columna Passengers_diff es estacionaria. Esto significa que hemos transformado con éxito nuestras series temporales no estacionarias en una estacionaria aplicando diferencias de primer orden.
El paso final en el análisis de series temporales es ajustar un modelo a los datos y usarlo para pronosticar valores futuros. Uno de los modelos más populares para el análisis de series temporales es ARIMA, que significa AutoRegressive Integrated Moving Average. ARIMA es una generalización de ARMA, que significa Media Móvil Regresiva. ARMA es una combinación de dos modelos: AR, que significa AutoRegresivo, y MA, que significa Media móvil.
Un modelo AR es un modelo que utiliza valores pasados de las series temporales para predecir valores futuros. Un modelo AR se puede escribir como:
from statsmodels.tsa.arima.model import ARIMA model = ARIMA(dataset['Passengers_diff'], order=(1,1)) model_fit = .fit model()/>>model_fit.summary()>forecast = model_fit.forecast(12)plt.plot(dataset['Passengers']) plt.plot(forecast) plt.xlabel('Month') plt.ylabel('Passengers') plt.title('Pronóstico de números de pasajeros de aerolíneas usando ARIMA(1,1)') plt.legend(['Original', 'Forecast']) plt.show()En este artículo, le hemos mostrado cómo descargar y analizar el conjunto de datos de pasajeros aéreos usando Python y varias bibliotecas como pandas, matplotlib y statsmodels.
También hemos aprendido algunos conceptos básicos y técnicas de análisis de series temporales, tales como componentes de series temporales, estacionalidad, diferenciación, modelos ARIMA y predicción.
Si bien hemos realizado un simple análisis de series temporales del conjunto de datos de pasajeros aéreos, hay muchas más cosas que podemos hacer para mejorar nuestro análisis y resultados. Aquí hay algunas recomendaciones para un análisis adicional:
El análisis de series temporales puede ser útil para varios propósitos, como:
Los datos de las series temporales pueden plantear algunos desafíos para el análisis, como:
Además del conjunto de datos de pasajeros aéreos, hay muchas otras fuentes de datos de series temporales que puede usar para análisis y aprendizaje. Algunos ejemplos son:
Si desea obtener más información sobre el análisis de series temporales en Python, hay muchos recursos disponibles en línea que pueden ayudarlo. Algunos ejemplos son:
Estos son solo algunos de los recursos que puedes usar para aprender más sobre el análisis de series temporales en Python. Hay muchos más recursos disponibles en línea que pueden satisfacer sus necesidades y preferencias.
Espero que hayas disfrutado de este artículo y hayas aprendido algo nuevo. Gracias por leer!
17b9afdd22