Cómo pronosticar el tráfico de búsqueda con Python y GA4
Publicado: 2021-04-26En cualquier estrategia enfocada a la optimización de motores de búsqueda (SEO), el análisis de datos es fundamental. Cada vez son más los especialistas en este campo que optan por desarrollar su carrera en el análisis del tráfico de búsqueda orgánica, que en sí mismo tiene un comportamiento y unas particularidades bastante diferentes al resto: búsqueda de pago, email, social orgánica, directa, etc. este sentido y gracias a una amplia gama de herramientas disponibles en la actualidad, este tipo de estudios han logrado evolucionar en un grado impensable en comparación con hace tan sólo unos años.
Este importante paso adelante se debe principalmente a la aparición de nuevas metodologías y desarrollos que nos han permitido generar modelos analíticos sin tener que depender de complicadas operaciones matemáticas. Tenemos la suerte de tener a nuestra disposición las técnicas y algoritmos ya probados y listos para empezar a trabajar con ellos.
En el siguiente artículo nos vamos a centrar en la creación de un modelo predictivo para un conjunto de datos de una serie temporal donde la tendencia calculada se ajusta a la estacionalidad y periodicidad previa. Más específicamente, estaremos pronosticando el tráfico de búsqueda orgánica de nuestra propiedad a partir de Google Analytics 4 (en adelante, GA4). Hay muchas opciones para llevar a cabo esto, sin embargo para este caso en particular he decidido ejecutar el desarrollo íntegramente en Python.
El guión en el que se basa este artículo consta de tres partes claramente diferenciadas:
- Extracción de datos . Cómo utilizar la nueva API de GA4 paso a paso para recopilar tráfico de búsqueda orgánico.
- Modelado de datos . Uso de Prophet, la biblioteca de código abierto de Facebook para hacer predicciones de series temporales.
- Visualización de datos . Mostrar cambios de tendencia y predicción modelada.
Extracción de datos de GA4 a través de su API usando Python
Lo primero que debemos saber cuando tratamos con la API de datos de Google Analytics (GA4) es que GA4 es su estado de desarrollo. Tal y como detalla Google en su página, actualmente se encuentra en una versión en fase inicial. En concreto, a la fecha de redacción de este artículo, aún se encuentra en fase Beta.
Cabe señalar que GA4 se publicó el 14 de octubre de 2020. Solo han pasado unos meses. De hecho, aquellos que ya tenían una propiedad de Universal Analytics y crean una nueva GA4 podrán seguir usando ambas versiones en paralelo, sin restricciones. No se sabe con certeza cuándo dejarán de funcionar las propiedades de Universal Analytics. En cualquier caso, mi recomendación sería crear una nueva propiedad de tipo GA4 lo antes posible. De esta forma tendrás un historial de datos más amplio. También hay que considerar que cada día que pasa GA4 integra nuevas funcionalidades o mejora las existentes. Actualmente se encuentra en constante evolución.
Debido a esto, por supuesto que puede haber pequeños cambios en el código que se describe a continuación. Aunque seguro que serán mínimos. Como ejemplo, ya me he encontrado con pequeñeces menores como cambiar el nombre del campo "entidad" (fase alfa) como "propiedad" (fase beta) dentro de la clase RunReportRequest() .
En primer lugar, antes de crear la solicitud de API, es necesario comprender qué elementos están disponibles. Básicamente, se trata de seguir la siguiente estructura:
Tipos para RunReportRequest de GA4 Data v1 Beta API
A simple vista es bastante intuitivo, aunque la realidad es bien distinta. Para realizar una solicitud, es necesario tener siempre a mano al menos la siguiente documentación:
- Desarrollador APIS de Google.
- Informes API de datos de Google Analytics (GA4).
Esto se debe simplemente a que los nombres de los campos varían ligeramente de la documentación oficial, que representa los campos en formato JSON. Un ejemplo es el campo fieldname de la clase Filter. En Python deberíamos describirlo como field_name. Una buena regla general siempre será pasar de un campo tipo camello (como “fieldName”) a un tipo serpiente (como “field_name”).
Antes de continuar, detengámonos un momento para inicializar nuestro proyecto. Como en la gran mayoría de los casos al desarrollar scripts en Python, tenemos que dedicar un tiempo a importar las bibliotecas necesarias y preparar el entorno de ejecución.
- Cree un nuevo proyecto en Python. En este caso se ha utilizado el software PyCharm.
- Habilite la API de datos de Google Analytics en Google Cloud Platform y descargue el archivo de cuenta de servicio creado (tipo JSON) y guárdelo en la carpeta donde se creó el proyecto de Python. Al abrir este archivo, se debe copiar el valor del campo client_email, que será algo así como [email protected].
- Agregue este valor de client_email a la propiedad GA4 de la que se extraerán los datos. Deberá hacer esto en la sección de administración de usuarios. Como mínimo, será necesario otorgarle el nivel de permiso 'Lectura y análisis'.
- A través de la terminal de cliente (PyCharm) instale la biblioteca de datos de Google Analytics en el directorio del proyecto con el que se realizarán las solicitudes de API:
pip install google-analytics-data
A partir de aquí, solo tienes que crear la solicitud, que, como puedes ver a continuación, consta básicamente de tres partes (cliente, solicitud y respuesta), y ver o guardar los datos recopilados.
Código para realizar una solicitud sencilla a GA4
Cualquier dimensión, métrica, filtro, orden de datos, rango de fechas, etc. agregado a la variable de solicitud debe agregarse como una clase (ver imagen anterior “Tipos para RunReportRequest”) vinculada a una variable ( metrics = [Metric (..)] ). Esto hace que sea mucho más fácil comprender la estructura de los datos que se van a recopilar. En este sentido, para cada clase del más alto nivel se debe realizar una importación específica. Es decir, si desea agregar una dimensión y una métrica para un rango de tiempo específico, se requerirán al menos los siguientes objetos…
desde google.analytics.data_v1beta importar BetaAnalyticsDataClient de google.analytics.data_v1beta.types importar RunReportRequest desde google.analytics.data_v1beta.types import DateRange de google.analytics.data_v1beta.types dimensión de importación de google.analytics.data_v1beta.types métrica de importación
Por supuesto, también es posible agregar valores específicos a ciertas variables ( name = 'eventCount' ). Por este motivo, es fundamental comprender y sumergirse en la documentación descrita anteriormente.
Además de esto, hay que prestar especial atención a la variable os.environ [“GOOGLE_APPLICATION_CREDENTIALS”] , que contendrá la ruta al archivo previamente descargado en el paso 2. Esta línea de código evitará algunos problemas a la hora de gestionar los permisos a la API de Google.
Si el código se ha ejecutado correctamente, verá un resultado similar a este: {Fecha, Eventos}, {20210418, 934}, {…}, ….
Datos de seguimiento³
Predicción de datos a través de Facebook Prophet
Hoy en día existen muchas opciones gratuitas y existentes para realizar cualquier tipo de predicción basada en el historial de datos. En este caso concreto he elegido la biblioteca Prophet, pero ¿qué es realmente?
Es una biblioteca de código abierto (disponible para R y Python) creada por el equipo de ciencia de datos de Facebook para estimar el comportamiento de un conjunto de datos de series temporales basado en un modelo aditivo donde las tendencias no lineales se ajustan a una estacionalidad diaria, semanal y anual. en cuenta los efectos de los días de vacaciones.
Volviendo a la implementación propuesta (predicción de tráfico de búsqueda orgánica), lo primero que debemos hacer es instalar las siguientes bibliotecas:
- Pandas ( pip instalar pandas ). Administrar y analizar estructuras de datos.
- Plotly ( pip install plotly ). Creación de gráficos de todo tipo.
- Profeta ( conda install -c conda-forge fbprophet -y ).
Luego, como siempre, deberás realizar las importaciones asociadas a estas librerías. Luego de esto, lo único que te queda por hacer es realizar el modelado de la predicción y su correspondiente visualización. Para ello, en el caso de Prophet, solo debes seguir este proceso:
- Inicialice un nuevo objeto Prophet con los atributos deseados para generar la predicción.
- Solicite el método de ajuste, pasándole los datos extraídos de GA4 como un marco de datos. Esta solicitud puede tardar varios segundos en algunos casos. El dataframe con los datos recopilados debe constar únicamente de dos columnas cuyos nombres sean siempre los mismos: ds (campo de tipo de fecha) e y (métrica a estudiar).
- Cree un nuevo marco de datos futuro configurando la cantidad de períodos hasta los que debe llegar la predicción desde el rango de fechas seleccionado y la frecuencia con la que se agregarán los datos (semanal, mensual, etc.)
- Solicite el método de predicción, que asignará a cada fila del nuevo marco de datos futuro un valor predicho (yhat).
- Solicita el método plot para poder visualizar las predicciones generadas.
- Solicite el método plot_components que ayuda a comprender visualmente la tendencia y la estacionalidad de los datos.
m = profeta() ajuste m(df) futuro = m.make_future_dataframe(períodos=365) pronóstico = m.predict(futuro) m.plot(pronóstico) m.plot_components(pronóstico) plt.mostrar()
Aunque la predicción deseada se ha generado en tan solo seis pasos y parece relativamente sencillo, se deben considerar varios elementos que serán clave para generar la predicción. Todos ellos afectan la pertinencia de la predicción de una forma u otra. Al final, se trata de generar una predicción que se ajuste a la lógica, en el caso de este artículo, de nuestro tráfico de búsqueda orgánica. Para esto, es necesario comprender algunas configuraciones más avanzadas de Prophet.
- Días especiales y vacaciones. Existe la posibilidad de añadir días especiales.
- Valores atípicos. Deben eliminarse si afectan la estimación.
- Puntos de cambio. Detección de cambios de tendencia a lo largo del tiempo analizado.
- Diagnóstico. Validación basada en la medición del error de predicción según el estudio histórico de los datos.
- Aumentar. Selección entre lineal o logística.
- Estacionalidad. Elección entre aditivo o multiplicativo.
Todo esto y muchas más opciones están perfectamente detalladas en esta documentación de la librería Prophet.
Creando el script completo para poder visualizar la predicción de tráfico
Ahora solo queda unir todas las piezas del rompecabezas en un solo guión. La forma habitual de abordar este tipo de rompecabezas es crear una función para cada uno de los procesos detallados anteriormente, de tal forma que se puedan ejecutar de forma ordenada y limpia:
def ga4(property_id, start_date, end_date): […] previsión de definición (dim, met, per, freq): […] si __nombre__ == "__principal__": dimensión, métrica = ga4(PROPERTY_ID, START_DATE, END_DATE) previsión (dimensión, métrica, PERÍODOS, FRECUENCIA)
Antes de visualizar el resultado final de la predicción, es buena idea mirar el tráfico de búsqueda orgánico analizado.
A primera vista, se puede ver cómo las diferentes estrategias y acciones realizadas han tenido un efecto a lo largo del tiempo. A diferencia de otros canales (por ejemplo, campañas de Paid Search), el tráfico generado desde Organic Search suele tener pocas oscilaciones apreciables (valles o picos). Tiende a crecer o disminuir gradualmente con el tiempo y, a veces, está influenciado por eventos estacionales. Por lo general, las fluctuaciones notables están asociadas con actualizaciones en el algoritmo del motor de búsqueda (Google, Bing, etc.).
El resultado del script se puede ver en las siguientes imágenes, donde se detallan factores importantes como la tendencia, la estacionalidad, la predicción o la frecuencia de los datos.
Si analizamos la predicción obtenida, se podría concluir de forma genérica que “si continuamos con la misma estrategia SEO implementada hasta la fecha, el tráfico de los buscadores seguirá creciendo paulatinamente”. Podemos asegurar que “nuestros esfuerzos por mejorar el rendimiento del sitio web, generar contenido de calidad, proporcionar enlaces relevantes, etc. han valido la pena”.
Visualización de tendencia, estacionalidad y predicción, tendencia del tráfico de búsqueda orgánica
Para finalizar, estaré compartiendo el código en su totalidad para que solo tengas que copiarlo y ejecutarlo en tu IDE (Integrated Development Environment) de Python. No hace falta decir que todas las bibliotecas mencionadas anteriormente deben haberse instalado para que esto funcione correctamente.
importar pandas como pd importar fbprophet de fbprophet importar Profeta desde fbprophet.plot import add_changepoints_to_plot importar matplotlib.pyplot como plt importar sistema operativo desde google.analytics.data_v1beta importar BetaAnalyticsDataClient desde google.analytics.data_v1beta.types import DateRange de google.analytics.data_v1beta.types dimensión de importación de google.analytics.data_v1beta.types métrica de importación de google.analytics.data_v1beta.types filtro de importación de google.analytics.data_v1beta.types importar FilterExpression de google.analytics.data_v1beta.types importar FilterExpressionList de google.analytics.data_v1beta.types importar RunReportRequest PROPIEDAD_ START_DATE = '2020-01-01' END_DATE = '2021-03-31' PERIODOS = 4 FRECUENCIA = 'M' os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "[Agregue aquí la ruta del archivo json con las credenciales]" def ga4(property_id, start_date, end_date): cliente = BetaAnalyticsDataClient() solicitud = RunReportRequest(propiedad='propiedades/' + ID_propiedad, dimensiones=[Dimensión(nombre='fecha')], metrics=[Metric(name='eventCount')], rangos_de_fechas=[Rango de Fechas(fecha_de_inicio=fecha_de_inicio, fecha_final=fecha_final)], dimension_filter=FiltrarExpresión( and_group=FilterExpressionList(expresiones=[ FilterExpression(filter=Filter(field_name='sessionDefaultChannelGrouping', string_filter=Filtro.StringFilter( value='Búsqueda orgánica', match_type=Filtro.StringFilter.MatchType( 1)))), FilterExpression(filter=Filter(field_name='eventName', string_filter=Filtro.StringFilter( valor='inicio_de_sesión', match_type=Filtro.StringFilter.MatchType( 1)))) ])) ) respuesta = cliente.run_report(solicitud) x, y = ([] para i en el rango (2)) para fila en respuesta.filas: x.append(fila.valores_dimensión[0].valor) y.append(fila.valores_métricos[0].valor) imprimir(fila.valores_dimensión[0].valor, fila.valores_métricos[0].valor) devuelve x, y def pronóstico(x, y, p, f): print('Profeta %s' % fbprofeta.__version__) datos = {'ds': x, 'y': y} df = pd.DataFrame(datos, columnas=['ds', 'y']) m = Profeta (crecimiento = 'lineal', changepoint_prior_scale=0.5, estacionality_mode='aditivo', daily_seasonality=Falso, semanal_estacionalidad=Verdadero, yearly_seasonality=Verdadero, festivos=Ninguno, ) ajuste m(df) futuro = m.make_future_dataframe(períodos=p, frecuencia=f) pronóstico = m.predict(futuro) print(pronóstico[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].head()) fig = m.plot(pronóstico, xlabel='Fecha', ylabel='Visitas') add_changepoints_to_plot(fig.gca(), m, pronóstico) m.plot_components(pronóstico) plt.mostrar() si __nombre__ == "__principal__": channel_group, event_count = ga4(PROPERTY_ID, START_DATE, END_DATE) previsión (channel_group, event_count, PERIODS, FREQ)
Espero que este artículo te haya servido de inspiración y que te sea de gran utilidad en tus próximos proyectos. Si desea continuar aprendiendo sobre este tipo de implementación u obtener más información sobre marketing digital más técnico, comuníquese conmigo. Puede encontrar más información en mi perfil de autor a continuación.