In [20]:
import warnings
import math
import time
import pandas as pd
import numpy as np
import plotly.graph_objects as go
import statsmodels.api as sm
from statsmodels.tsa.stattools import adfuller
from statsmodels.tsa.arima.model import ARIMA
from sklearn.metrics import mean_squared_error
from scipy import stats

warnings.filterwarnings("ignore")

titles_font_style = dict(family='Roboto Condensed', size=14, color='rgb(67, 67, 67)')
values_font_style = dict(family='Roboto Condensed', size=14, color='rgb(248, 248, 255)')
plot_background_color='rgb(243, 243, 243)'
paper_background_color='rgb(243, 243, 243)'
fill_color='rgba(255, 144, 14, 1)'
light_fill_color='rgba(255, 144, 14, 0.5)'
line_color='rgba(193, 104, 0, 1)'
line_color2='rgba(93, 164, 214, 1)'
line_color3='rgba(255, 0, 0, 1)'
grid_line_color='rgba(200, 200, 200, 0.5)'

rolling_factor = 20

Ejemplo de análisis de una serie temporal

Análisis de los tiempos de fabricación de un elemento, haciendo uso de modelos de autorregresión. Se emplea la metodología Box-Jenkins, considerando los siguientes bloques:

  • Estudio de la estructura de la serie, para determinar si se trata de una serie estacionaria, además de chequear la existencia de outliers.
  • Búsqueda de los modelos y parámetros que mejor ajusten la serie, estudiando el ajuste de los modelos ARMA o ARIMA según corresponda y estimando los valores más apropiados para sus parámetros.
  • Validación del modelo seleccionado, llevando a cabo un análisis sobre el ruido blanco explicado por el modelo.
  • Predicción de valores futuros, haciendo uso del modelo seleccionado, así como la detección de valores outliers.

Estudio de la estructura de la serie

La serie está compuesta por un conjunto de observaciones ordenadas de la variable timesheet_incurred, que representa el tiempo de fabricación, en segundos, que se ha consumido en la ejecución de una determinada operación sobre un elemento.

Con una simple descriptiva se observa una gran amplitud en la distribución de los valores, sobre todo teniendo en cuenta la naturaleza de los mismos.

In [2]:
data = pd.read_json('example.json')
data = data.set_index(['index'])
data.describe().T
Out[2]:
count mean std min 25% 50% 75% max
timesheet_incurred 274.0 2678.368285 3104.310674 1.49 545.8325 794.46 5425.6775 15845.0
In [3]:
fig = go.Figure()
fig.add_trace(go.Histogram(x=data['timesheet_incurred'], name="Incurred Time", marker_color=fill_color, xbins=dict(start=0,size=100)))

fig.update_layout(
    title="Incurred Time Freq",
    xaxis=dict(
        title='Time (seconds)',
        showgrid=True,
        linecolor=grid_line_color,
        gridcolor=grid_line_color
    ),
    yaxis=dict(
        title='Count',
        showgrid=False,
        linecolor=grid_line_color,
        gridcolor=grid_line_color
    ),
    paper_bgcolor=paper_background_color,
    plot_bgcolor=plot_background_color,
    bargap=0.1)

fig.show()

fig = go.Figure()
fig.add_trace(go.Box(x=data['timesheet_incurred'], boxpoints='all', name='', jitter=0.5, whiskerwidth=0.2, fillcolor=light_fill_color, line_color=line_color, marker_size=4, line_width=1))

fig.update_layout(
    xaxis=dict(
        showgrid=True,
        zerolinecolor=grid_line_color,
        linecolor=grid_line_color,
        gridcolor=grid_line_color
    ),
    paper_bgcolor=paper_background_color,
    plot_bgcolor=plot_background_color,
    showlegend=False)

fig.show()