Existen dos formas principales de generar informes sobre los experimentos:
- Informes directos del experimento: Consulta el recurso
experimentpara obtener métricas. Esta opción proporciona métricas para los grupos de control y de tratamiento en una sola respuesta, junto con datos de comparación estadística, como la efectividad y los valores p. Esta es la única forma de generar informes sobre los experimentos dentro de la campaña. - Informes de campañas: Consulta el recurso
campaignpara obtener métricas, usandocampaign.experiment_typepara distinguir entre las campañas básicas y las experimentales. Esta opción solo está disponible para los experimentos que usan campañas de control y de tratamiento separadas, como los experimentos administrados por el sistema.
Esta guía se centra principalmente en los informes directos de experimentos, que son compatibles con todos los tipos de experimentos que admiten informes.
Informes directos de experimentos
Puedes consultar el recurso experiment directamente para recuperar las métricas de rendimiento y las comparaciones estadísticas entre tus grupos de control y de tratamiento.
Métricas e importancia estadística
En el caso de las métricas principales, como los clics, las impresiones, el costo, las conversiones y el valor de conversión, el recurso experiment proporciona métricas de tratamiento (por ejemplo, metrics.clicks) y métricas de control (por ejemplo, metrics.control_clicks) en la misma fila.
También proporciona campos para ayudarte a evaluar la importancia estadística de cualquier diferencia entre los grupos:
metrics.*_p_value: Es la probabilidad de que se produzcan los resultados observados si el experimento no tuviera un efecto real en la métrica. Un valor p más bajo indica una mayor importancia estadística.metrics.*_point_estimate: Es el porcentaje estimado de efectividad (positivo o negativo) en la métrica determinada para el grupo de tratamiento en comparación con el grupo de control. Junto conmargin_of_error, describen un intervalo de confianza con un nivel de confianza prescrito para la diferencia que se estima. La cantidad que se estima es (tratamiento / control - 1). La estimación puntual es el centro del intervalo de confianza.metrics.*_margin_of_error: Radio del intervalo de confianza, que se centra enpoint_estimate. Se calcula para un nivel de confianza prescrito, que depende del tipo de experimento.
Los siguientes campos de métricas principales se admiten en el recurso experiment, incluidos un valor del grupo de tratamiento, un valor del grupo de control y los campos de estadísticas que se mencionaron anteriormente:
clicksimpressionscost_microsconversionscost_per_conversionconversion_valueconversion_value_per_cost
En el caso de las conversiones, específicamente, los campos estadísticos están disponibles a través de los siguientes campos absolute_change, en lugar de como valores relativos:
metrics.conversions_absolute_change_p_value: Es el valor p de la hipótesis nula que indica que el experimento no tiene ningún efecto en el cambio absoluto de las conversiones. El rango varía de 0 a 1.metrics.conversions_absolute_change_point_estimate: Es la estimación puntual cuando se estima el efecto del experimento en el cambio absoluto de las conversiones.metrics.conversions_absolute_change_margin_of_error: Es el margen de error al estimar el efecto del experimento en el cambio absoluto de las conversiones.
Para obtener ayuda para crear consultas válidas para el recurso experiment, usa la herramienta Compilador de consultas de Google Ads.
Consulta de ejemplo
La siguiente consulta de GAQL recupera métricas clave para un experimento:
SELECT
experiment.experiment_id,
experiment.name,
experiment.type,
metrics.clicks,
metrics.control_clicks,
metrics.clicks_point_estimate,
metrics.clicks_margin_of_error,
metrics.clicks_p_value,
metrics.conversions,
metrics.control_conversions,
metrics.conversions_absolute_change_point_estimate,
metrics.conversions_absolute_change_margin_of_error,
metrics.conversions_absolute_change_p_value
FROM experiment
WHERE experiment.experiment_id = EXPERIMENT_ID
Interpreta los resultados
Puedes usar los campos de valor p, estimación puntual y margen de error para determinar si tu experimento produjo resultados estadísticamente significativos. Por ejemplo, si conversions_absolute_change_p_value está por debajo del umbral elegido (por ejemplo, 0.05 para un 95% de confianza) y conversions_absolute_change_point_estimate - conversions_absolute_change_margin_of_error es mayor que cero, esto indica que el grupo de tratamiento tiene un rendimiento significativamente mejor que el grupo de control en términos de conversiones.
A continuación, se incluye un fragmento de Python que muestra cómo evaluar los resultados en función del valor p y las estimaciones de aumento:
Java
private void evaluateExperiment( GoogleAdsClient googleAdsClient, long customerId, GoogleAdsRow row) { Metrics metrics = row.getMetrics(); String experimentResourceName = row.getExperiment().getResourceName(); // 1. Evaluate conversion success as a primary success signal if available. // - Point Estimate: Represents the estimated average lift or difference in conversions. // - Margin of Error: Outlines the confidence interval bounds. Note that the margin_of_error // provided by the API is calculated for a preset confidence level which is set based on the // experiment type. // - Lower Bound: (Point Estimate - Margin of Error). If this value is above 0, // we have statistical significance that performance has improved. double convPValue = metrics.getConversionsAbsoluteChangePValue(); double convLift = metrics.getConversionsAbsoluteChangePointEstimate(); double convError = metrics.getConversionsAbsoluteChangeMarginOfError(); double convLowerBound = convLift - convError; if (convPValue <= P_VALUE_THRESHOLD) { if (convLowerBound > 0) { System.out.printf( "Significant Success: Conversions increased. Even at the lower bound, the lift is %.2f." + " Promoting changes.%n", convLowerBound); promoteExperiment(googleAdsClient, customerId, experimentResourceName); return; } else if ((convLift + convError) < 0) { System.out.printf( "Significant Decline: Even the upper bound (%.2f) is below zero. Ending experiment.%n", convLift + convError); endExperiment(googleAdsClient, customerId, experimentResourceName); return; } } // 2. Fall back to evaluating click metrics if conversions are inconclusive. double clickPValue = metrics.getClicksPValue(); double clickLift = metrics.getClicksPointEstimate(); double clickError = metrics.getClicksMarginOfError(); double clickLowerBound = clickLift - clickError; if (clickPValue <= P_VALUE_THRESHOLD && clickLowerBound > 0) { System.out.printf("Click volume is significantly up (+%.1f%%).%n", clickLift * 100); // Graduation is only supported for separate campaign experiments, not // intra-campaign experiments where there is no separate treatment campaign. ExperimentType experimentType = row.getExperiment().getType(); if (experimentType != ExperimentType.ADOPT_BROAD_MATCH_KEYWORDS && experimentType != ExperimentType.ADOPT_AI_MAX) { System.out.println("Graduating treatment campaign for further manual analysis."); graduateExperiment(googleAdsClient, customerId, experimentResourceName); } else { System.out.println( "Intra-campaign trial detected: graduation is not supported. Continuing to run the" + " experiment to gather more conversion data."); } } else { // 3. Print status if no action was taken. System.out.printf( "Inconclusive: No significant lift in Conversions (p=%.2f) or Clicks (p=%.2f). Current" + " estimated lift: %.2f +/- %.2f. Allowing the experiment to continue running.%n", convPValue, clickPValue, convLift, convError); } }
C#
private static void EvaluateExperiment(GoogleAdsClient client, long customerId, GoogleAdsRow row) { // This function evaluates performance metrics and immediately takes action // to update the experiment's status (promote, end, or graduate) if // statistical significance thresholds are met. var metrics = row.Metrics; string experimentResourceName = row.Experiment.ResourceName; bool hasConvMetrics = metrics.HasConversionsAbsoluteChangePValue && metrics.HasConversionsAbsoluteChangePointEstimate && metrics.HasConversionsAbsoluteChangeMarginOfError; bool hasClickMetrics = metrics.HasClicksPValue && metrics.HasClicksPointEstimate && metrics.HasClicksMarginOfError; // 1. Evaluate conversion success as a primary success signal if available. // - Point Estimate: Represents the estimated average lift or difference in conversions. // - Margin of Error: Outlines the confidence interval bounds. Note that the margin_of_error // provided by the API is calculated for a preset confidence level which is set based on // the experiment type. // - Lower Bound: (Point Estimate - Margin of Error). If this value is above 0, // we have statistical significance that performance has improved. if (hasConvMetrics) { double convPValue = metrics.ConversionsAbsoluteChangePValue; double convLift = metrics.ConversionsAbsoluteChangePointEstimate; double convError = metrics.ConversionsAbsoluteChangeMarginOfError; double convLowerBound = convLift - convError; if (convPValue <= P_VALUE_THRESHOLD) { if (convLowerBound > 0) { Console.WriteLine( $"Significant Success: Conversions increased. Even at the lower" + $" bound, the lift is {convLowerBound:F2}. Promoting changes."); PromoteExperiment(client, customerId, experimentResourceName); return; } else if ((convLift + convError) < 0) { Console.WriteLine( $"Significant Decline: Even the upper bound ({convLift + convError:F2}) " + $"is below zero. Ending experiment."); EndExperiment(client, customerId, experimentResourceName); return; } } } // 2. Evaluate click volume as a secondary signal. // This is helpful as an early indicator or for lower-volume accounts. if (hasClickMetrics) { double clickPValue = metrics.ClicksPValue; double clickLift = metrics.ClicksPointEstimate; double clickError = metrics.ClicksMarginOfError; double clickLowerBound = clickLift - clickError; if (clickPValue <= P_VALUE_THRESHOLD && clickLowerBound > 0) { // We have a directional winner: high confidence in more traffic, // but not enough data to confirm conversion impact yet. Console.WriteLine( $"Click volume is significantly up (+{clickLift * 100:F1}%)."); // Graduation is only supported for separate campaign experiments, not // intra-campaign experiments where there is no separate treatment campaign. if (row.Experiment.Type != ExperimentType.AdoptBroadMatchKeywords && row.Experiment.Type != ExperimentType.AdoptAiMax) { Console.WriteLine("Graduating treatment campaign for further manual analysis."); GraduateExperiment(client, customerId, experimentResourceName); } else { Console.WriteLine( "Intra-campaign trial detected: graduation is not supported. " + "Continuing to run the experiment to gather more conversion data."); } return; } } // 3. Print status if no action was taken. if (hasConvMetrics || hasClickMetrics) { string convStatus = hasConvMetrics ? $"Conversions (p={metrics.ConversionsAbsoluteChangePValue:F2}, " + $"lift={metrics.ConversionsAbsoluteChangePointEstimate:F2} +/- " + $"{metrics.ConversionsAbsoluteChangeMarginOfError:F2})" : "Conversions (not populated)"; string clickStatus = hasClickMetrics ? $"Clicks (p={metrics.ClicksPValue:F2}, " + $"lift={metrics.ClicksPointEstimate:F2} +/- " + $"{metrics.ClicksMarginOfError:F2})" : "Clicks (not populated)"; Console.WriteLine( $"Inconclusive: No significant action taken. {convStatus}, {clickStatus}. " + "Allowing the experiment to continue running."); } else { Console.WriteLine( "Conversion and click performance metrics are not yet populated. " + "Allowing the experiment to continue running."); } }
PHP
This example is not yet available in PHP; you can take a look at the other languages.
Python
def evaluate_experiment( client: GoogleAdsClient, customer_id: str, row: GoogleAdsRow ) -> None: """Evaluates the performance of the experiment and updates it accordingly (for example, promotes, ends, or graduates). Checks conversion and click metrics against statistical significance thresholds to determine the appropriate action to take on the experiment. Args: client: an initialized GoogleAdsClient instance. customer_id: a client customer ID. row: a GoogleAdsRow containing the experiment and metrics. """ # This function evaluates performance metrics and immediately takes action # to update the experiment's status (promote, end, or graduate) if # statistical significance thresholds are met. metrics = row.metrics experiment_resource_name = row.experiment.resource_name has_conv_metrics = ( "conversions_absolute_change_p_value" in metrics and "conversions_absolute_change_point_estimate" in metrics and "conversions_absolute_change_margin_of_error" in metrics ) has_click_metrics = ( "clicks_p_value" in metrics and "clicks_point_estimate" in metrics and "clicks_margin_of_error" in metrics ) # 1. Evaluate conversion success as a primary success signal if available. # - Point Estimate: Represents the estimated average lift or difference in conversions. # - Margin of Error: Outlines the confidence interval bounds. Note that the margin_of_error provided by the API is calculated for a preset confidence level which is set based on the experiment type. # - Lower Bound: (Point Estimate - Margin of Error). If this value is above 0, # we have statistical significance that performance has improved. if has_conv_metrics: conv_p_value = metrics.conversions_absolute_change_p_value conv_lift = metrics.conversions_absolute_change_point_estimate conv_error = metrics.conversions_absolute_change_margin_of_error conv_lower_bound = conv_lift - conv_error if conv_p_value <= P_VALUE_THRESHOLD: if conv_lower_bound > 0: print( "Significant Success: Conversions increased. Even at the lower" f" bound, the lift is {conv_lower_bound:.2f}. Promoting" " changes." ) promote_experiment( client, customer_id, experiment_resource_name ) return elif (conv_lift + conv_error) < 0: print( "Significant Decline: Even the upper bound" f" ({conv_lift + conv_error:.2f}) is below zero. Ending" " experiment." ) end_experiment(client, customer_id, experiment_resource_name) return # 2. Evaluate click volume as a secondary signal. # This is helpful as an early indicator or for lower-volume accounts. click_p_value = metrics.clicks_p_value click_lift = metrics.clicks_point_estimate click_error = metrics.clicks_margin_of_error click_lower_bound = click_lift - click_error if click_p_value <= P_VALUE_THRESHOLD and click_lower_bound > 0: # We have a directional winner: high confidence in more traffic, # but not enough data to confirm conversion impact yet. print(f"Click volume is significantly up (+{click_lift*100:.1f}%).") # Graduation is only supported for separate campaign experiments, not # intra-campaign experiments where there is no separate treatment campaign. experiment_type_name = row.experiment.type_.name if ( experiment_type_name != "ADOPT_BROAD_MATCH_KEYWORDS" and experiment_type_name != "ADOPT_AI_MAX" ): print( "Graduating treatment campaign for further manual analysis." ) graduate_experiment( client, customer_id, experiment_resource_name ) else: print( "Intra-campaign trial detected: graduation is not supported. " "Continuing to run the experiment to gather more conversion data." ) return # 3. Print status if no action was taken. if has_conv_metrics or has_click_metrics: conv_status = ( f"Conversions (p={metrics.conversions_absolute_change_p_value:.2f}, " f"lift={metrics.conversions_absolute_change_point_estimate:.2f} +/- " f"{metrics.conversions_absolute_change_margin_of_error:.2f})" if has_conv_metrics else "Conversions (not populated)" ) click_status = ( f"Clicks (p={metrics.clicks_p_value:.2f}, " f"lift={metrics.clicks_point_estimate:.2f} +/- " f"{metrics.clicks_margin_of_error:.2f})" if has_click_metrics else "Clicks (not populated)" ) print( f"Inconclusive: No significant action taken. {conv_status}, {click_status}." " Allowing the experiment to continue running." ) else: print( "Conversion and click performance metrics are not yet populated. " "Allowing the experiment to continue running." )
Ruby
This example is not yet available in Ruby; you can take a look at the other languages.
Perl
This example is not yet available in Perl; you can take a look at the other languages.
curl
Beneficios en comparación con los informes de campañas
Los informes de experimentos directos ofrecen varias ventajas en comparación con la consulta de informes de campañas por separado:
- Métricas centralizadas: Recupera las métricas de control y tratamiento en una sola fila.
- Datos de confianza estadística: Proporcionan valores p, estimaciones puntuales y márgenes de error calculados.
- Eficiencia: Elimina la necesidad de unir o comparar manualmente los resultados de varios informes.
- Compatibilidad con experimentos dentro de la campaña: Es la única forma de comparar el grupo de control con el grupo de tratamiento en los experimentos dentro de la campaña, en los que el tráfico se divide dentro de una sola campaña.
Informes de campañas
En el caso de los experimentos que crean campañas de tratamiento separadas (por ejemplo, SEARCH_CUSTOM), puedes consultar el recurso campaign y usar campaign.experiment_type para identificar las campañas de BASE (control) y EXPERIMENT (tratamiento). Este enfoque es útil si necesitas segmentar las métricas en un nivel más detallado (por ejemplo, por grupo de anuncios o palabra clave) o ver los metadatos de la campaña que no están disponibles en el recurso experiment. Sin embargo, requiere que realices comparaciones de rendimiento y cálculos estadísticos de forma manual.
No puedes usar los informes a nivel de la campaña para comparar los grupos de los experimentos dentro de la campaña, ya que la división del tráfico se produce internamente en una sola campaña.
La consulta de campaign para un experimento dentro de la campaña solo devuelve totales agregados.
Prácticas recomendadas
- Selecciona un nivel de confianza adecuado: Establecer un umbral de valor p más bajo puede proporcionar orientación direccional más rápido, especialmente con presupuestos o volúmenes de conversiones más bajos. Se considera que un 95% de confianza (valor p <= 0.05) es el estándar académico y puede ser mejor para obtener resultados más precisos en un período más largo.
- Ejecuta los experimentos durante el tiempo suficiente: Ejecuta los experimentos durante, al menos, 4 semanas para tener en cuenta los ciclos de rendimiento semanales, las demoras en las conversiones y los períodos de aprendizaje.
- Permite un período inicial: En el caso de las campañas que utilizan ofertas automáticas o prueban funciones nuevas, no tengas en cuenta los datos de las primeras 1 o 2 semanas para permitir que los modelos de ofertas y los niveles de tráfico se vuelvan a ajustar a la división.
- Usa divisiones 50/50: Por lo general, una división del tráfico 50/50 es la forma más rápida de lograr resultados con importancia estadística.
- Programación anticipada: Establece la fecha de inicio de tu experimento entre 3 y 7 días en el futuro para que haya tiempo para los procesos de revisión y aprobación de anuncios.
- Solo puedes ejecutar un experimento por campaña en un momento determinado.