Detectar puntos de cambio en datos de tráfico orgánico

29 de diciembre de 2024
27/02/202516:35

R es un lenguaje con múltiples librerías estadísticas y de otros tipos, que pueden ser de gran utilidad para nuestros análisis de datos, principalmente aquellos asociados a series temporales.

Una situación que lleva sucediendo muchos años es el gran incremento de cambios de algoritmo que efectúa Google año a año, con el consiguiente trastorno para muchos profesionales SEO y dueños de páginas webs que pueden sentirse abrumados ante tanto ruido en los datos.

Una idea que podemos llevar a cabo y que nos puede ayudar a entender varias cosas:

  • Usaremos datos de clics diarios de Google Search Console
  • Usaremos datos de visibilidad diaria extraída de SISTRIX
  • Usaremos R para visualizar los datos conjuntamente y para detectar los puntos de cambio de la variable que queramos

Visualizar datos de tráfico y visibilidad juntos con el contexto de los Updates

Una primera idea es entender que Visibilidad no es lo mismo que Tráfico. Todos y todas deberíamos tener esto claro al 1000%. La información de visibilidad que muestren las herramientas, reflejan un concepto asociado a los rankings y a su potencial de convertirse en tráfico, pero nunca se refieren al tráfico que finalmente capta una página web.

Es un matiz super importante, porque las herramientas comerciales como Semrush, Sistrix o Ahrefs, no son ilimitadas y además, tienen sistemas de pago muchas veces basadas en cantidad de datos que usamos.

Por este motivo hay que tener claro que lo que vemos en ellas es una tendencia, una muestra de datos que no son la realidad completa.

A partir de aquí, podemos usar R para cruzar los datos de visibilidad diaria, los datos de clicks diarios y tener una visualización de cuándo han tenido lugar los Updates, a modo de franja de tiempo para saber inicio y fin.

# Fechas de cambios de algoritmo
cambios_algoritmo <- data.frame(
  Inicio = as.Date(c("2024-11-11", "2024-12-12", "2024-12-19")),
  Fin = as.Date(c("2024-12-05", "2024-12-18", "2024-12-26")),
  Update = c("Core Update November", "Core Update December", "Spam Update December")
)

# Graficar la serie temporal de clics y visibilidad con líneas de los cambios de algoritmo
p1 <- ggplot() +
  geom_line(data = datos, aes(x = Fecha, y = Clics, color = "Clics"), size = 1) +
  geom_line(data = datos, aes(x = Fecha, y = iv * 100, color = "Visibilidad (x100)"), size = 1) +
  geom_rect(data = cambios_algoritmo, aes(xmin = Inicio, xmax = Fin, ymin = -Inf, ymax = Inf, fill = Update), alpha = 0.2) +
  labs(title = "Tráfico y Visibilidad Diaria",
       subtitle = "Series temporales de clics y visibilidad con cambios de algoritmo",
       x = "Fecha", y = "Valores") +
  theme_minimal() +
  scale_color_manual(values = c("black", "blue")) +
  scale_fill_manual(values = c("lightpink", "lightgreen", "lightblue", "orange"))
print(p1)

Ante este código, obtendríamos una visualización conjunta, en el mismo periodo (mismo días) y puesto en contexto de los Updates conocidos ocurridos en ese periodo.

Ahora, viendo estas gráficas juntas, podríamos extraer conclusiones totalmente opuestas a la realidad:

  • La gráfica de clics es muy sensible por días, esto puede sugerir cierta estacionalidad, por ejemplo, muchos ecommerce tienen más actividad entre semana que en fin de semana.
  • La gráfica de visibilidad en la franja verde sugiere cierto aumento o mejoría, pero si lo vemos junto al tráfico, no parece que sean tendencias coincidentes.

Entonces, ¿es suficiente hacer esto para entender los impactos reales en el tiempo?

Pues seguramente no, estaríamos especulando más que otra cosa.

Visualizar los puntos de cambio del tráfico orgánico con el contexto de los Updates

Vamos ahora a dar un paso más allá e intentar entender visualmente cuándo ocurre un punto de cambio, es decir, cuándo hay un cambio estadístico considerable:

Cambio en la media

Ocurre cuando el valor promedio de una métrica, como los clics diarios, experimenta un aumento o disminución sostenida durante un período de tiempo.

    Este cambio puede llegar a significar un nuevo patrón en los datos.

    Cambio en la varianza

    Esto se refiere a como fluctuan los datos alrededor de su promedio y puede provocar que la estabilidad de los datos se vea alterada.

      Porque no sería lo mismo que nuestro CTR se mueva entre cifras como 4,8%, 5,1% o 5,0%, a que lo haga entre 3,0%, 7,0% o 5,5%.

      Cambios combinados

      Afecta tanto a la media como a la varianza de los datos y es el escenario más complejo y significativo, ya que puede indicar una transformación completa en el comportamiento de la métrica.

      Por ejemplo cuando miramos SISTRIX, si el dato que nos ofrece de visibilidad suele rondar una cifra similar (alrededor de 50 y moviéndose entre 49-51) esto nos dice que la media puede considerarse más o menos alta y una varianza estable porque no hay fluctuaciones bruscas.

      Sin embargo, en ese mismo escenario, si tras un Update de Google bajamos a una media de 30 y las oscilaciones ya pasan de 25 a 30, nos encontramos con una media inferior y una varianza superior, que nos lleva de la estabilizada a la volatilidad.

      Ante estos ejemplos, podemos usar R para visualizar con la librería changepoint en qué momentos tenemos estos tipos de cambio y podemos considerar que hay cambio de tendencia o al menos, nos actúa como alerta de que empieza un cambio importante.

      Versión básica del código

      library(changepoint)
      
      # Detección de puntos de cambio en la serie de clics
      cambio_clics <- cpt.meanvar(datos$Clics, method = "PELT", penalty = "MBIC")
      plot(cambio_clics, main = "Puntos de cambio en Clics")
      
      # Convertir las fechas de los cambios de algoritmo a índices en la serie temporal
      indices_inicio <- which(datos$Fecha %in% cambios_algoritmo$Inicio)
      
      # Añadir líneas verticales para los cambios de algoritmo
      abline(v = indices_inicio, col = "darkgrey", lty = 2, lwd = 1.5)

      Lo que nos devuelve el código es un gráfico que podemos interpretar así:

      • Cada línea roja representa un segmento de tiempo donde la media y la varianza no cambian
      • Cada salto hacia una nueva línea roja indica que ha habido un cambio relevante en las métricas indicadas
      • La librería se encarga de encontrar los cambios relevantes y desecha las fluctuaciones y cambios menores

      Con esto, podríamos mejorar el código para intentar visualizar mejor las fechas del eje horizontal y agregarle, ya que estamos, todos los Updates ocurridos durante el periodo de los datos.

      Versión más profunda del código

      ## Puntos de Cambio para Clics
      
      # Detección de puntos de cambio en la serie de clics
      cambio_clics <- cpt.meanvar(datos$Clics, method = "PELT", penalty = "MBIC")
      
      # Crear el gráfico
      plot(cambio_clics, xaxt = "n", main = "Puntos de cambio en Clics")
      
      # Dibujar las franjas para los períodos de los updates
      for (i in 1:length(indices_inicio)) {
        rect(xleft = indices_inicio[i],
             xright = indices_fin[i],
             ybottom = par("usr")[3],  # Límite inferior del gráfico
             ytop = par("usr")[4],    # Límite superior del gráfico
             col = rgb(0.8, 0.8, 0.8, 0.5),  # Color gris claro con transparencia
             border = NA)  # Sin borde
      }
      
      # Añadir fechas al eje x
      axis(1, at = indices_inicio, labels = FALSE)  # Añade ticks sin etiquetas
      text(x = indices_inicio, 
           y = par("usr")[3] - 0.5, 
           labels = format(datos$Fecha[indices_inicio], "%d-%m-%y"), 
           srt = 45, 
           adj = 1, 
           xpd = TRUE, 
           cex = 0.8)
      
      # Añadir líneas para los puntos de cambio detectados
      abline(v = indices_inicio, col = "lightgrey", lty = 2, lwd = 1.5)
      abline(v = indices_fin, col = "darkgrey", lty = 2, lwd = 1.5)

      Con esta versión del código ahora se nos sombrea dentro cada vez que hay un Update de Google

      Más útil, ¿verdad?

      Ideas finales y conclusiones

      Echemos un vistazo por partes.

      En el gráfico de clics si podemos ver que los márgenes de tráfico en los Updates de noviembre y diciembre, han mantenido métricas estables y no es hasta que inicia el Spam Update de diciembre cuando se ve un cambio más fuerte, incluso hasta llegar a la última semana de despliegue, donde se recrudece la bajada.

      Hay que leer los datos con mucho cuidado porque viendo el gráfico no podemos tampoco afirmar que esta sea la única causa de la bajada ya que nos encontramos en un mes de gran volatilidad en cuanto a eventos y estacionalidad.

      En el gráfico de visibilidad si se ve más claramente el impacto de los Updates en lo referente a rankings, sufriendo el índice muchos más cambios en el tiempo y haciéndose más notorio un hecho actual: puedes tener afectaciones múltiples durante el despligue completo de un Update.
      En noviembre ha ido creciendo en visibilidad paulatinamente, en diciembre no tiene movimiento hasta que no empieza el Spam Update que es cuando supone un cambio reseñable

      Aunque seguimos sin poder afirmar las causas concretas solo mirando estos gráficos, desde luego estamos más cerca de entender cuándo se produce un cambio, de verdad, en los datos.

        Referencias

        https://cran.r-project.org/web/packages/changepoint/index.html

        https://www.marinedatascience.co/blog/2019/09/28/comparison-of-change-point-detection-methods

        ¿Cuánto tiempo llevó hacer este post?

        Dejando de un lado toda la formación en estadística y ciencia de datos para extrapolar al mundo del SEO, este post ha llevado más de 6 horas:

        • Prueba de librerías
        • Pruebas de concepto en distintos tipos de datos
        • Creación del código
        • Redacción del artículo
        • Creatividades

        Espero que te aporte como mínimo 1 cosa útil para ser mejor profesional

        Soy MJ Cachón

        Consultora SEO desde 2008, directora de la agencia SEO Laika. Volcada en unir el análisis de datos y el SEO estratégico, con business intelligence usando R, Screaming Frog, SISTRIX, Sitebulb y otras fuentes de datos. Mi filosofía: aprender y compartir.

        Explorar por temas

        Deja una respuesta

        Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *