Protocolo para pruebas A/B para la fijación de precios

Protocolo de pruebas A/B para la fijación de precios











Inicio » Recursos » Aquí

No existe optimización sin medidas, y la optimización de la fijación de precios requiere tanto experimentos como medidas. De hecho, la fijación de precios se reduce demasiado a menudo a cambios de precios sin que esos cambios se aprovechen para proporcionar un conocimiento más profundo del modo en que el mercado responde a los nuevos precios. La creación de estrategias de fijación de precios debería ser un proceso impulsado por el conocimiento, en el que la mayoría de los cambios se analizan a posteriori para adaptar el conjunto de estrategias existente. En esta página, describimos un protocolo de prueba A/B para la fijación de precios a ejecutar con la asistencia de Lokad. Si bien en la descripción se utilizan las herramientas disponibles, es preciso destacar que el protocolo en sí no es específico de Lokad y que puede replicarse con otras herramientas, incluso con Excel si las planillas tienen un buen mantenimiento.


1. Creación de un documento de referencia

Si logra realizar un experimento de fijación de precios, pronto podrá realizar docenas de experimentos de este tipo. Sin embargo, sin un modo estructurado de recopilar toda esta información, tendrá un resultado desprolijo y perderá la mayoría de los datos estratégicos que podría obtener. Por lo tanto, le sugerimos que comience cada experimento de fijación de precios con la creación de un documento de referencia que recopilará toda la información relacionada con el experimento. Este documento puede ser un archivo de Microsoft Excel, pero, hoy en día, lo animamos a que utilice herramientas colaborativas basadas en la web, como Google Sites o Hackpad, o cualquiera de los muchos sistemas de gestión de contenido disponibles en línea.

Luego, una vez que ha creado el documento, debería dedicar un poco de tiempo a encontrar un nombre recordable para el experimento. De hecho, un experimento será efectivo solo si la gente puede comunicarse fácilmente sobre él y si el equipo encargado de la fijación de precios (y si, fuera posible, también sus sucesores, considerando que la gente cambia con el tiempo) puede recordar las conclusiones. El aburrimiento es el enemigo del conocimiento. Si el nombre es demasiado aburrido como para recordarlo, hasta los empleados más dedicados desestimarán esa información.

2. Creación de un proyecto dedicado

Dentro de Lokad, le sugerimos que cree un proyecto dedicado al experimento de fijación de precios. Para que todo sea claro, este proyecto debería llevar el mismo nombre recordable elegido para el experimento. Además, le sugerimos que aproveche el comportamiento de hipervínculo del mosaico label para enlazar directamente el documento de referencia que también está disponible en línea. De este modo, el comienzo de su script de Envision generalmente se verá así:

// Pricing Experiment: Sevilla
// Start: 2014-07-09 End: 2014-08-08
// Author: Joannes Vermorel
show label "http://example.org/my-reference-document Ref. Document"

Con este script, el mosaico label aparecerá en el panel de información como un hipervínculo que lleva a la ubicación del documento de referencia que detalla el experimento de fijación de precios.

Este mismo proyecto servirá para varios fines a medida que se avance en las diferentes etapas de la experimentación de la fijación de precios. Se utilizará para:

  1. Crear los grupos de control de muestra de los artículos
  2. Guardar esos grupos
  3. Definir la estrategia de fijación de precios revisada
  4. Verificar la implementación correcta de los precios
  5. Compilar la visualización de los dos grupos de control

Todos estos pasos se implementarán a través de secciones de un script para este proyecto.

3. Definición de la hipótesis de prueba

Cuando se prueba una estrategia de fijación de precios, resulta tentador dar una nueva explicación a los resultados en un segundo momento, independientemente de que estos se alineen con las expectativas iniciales o no. El sesgo psicológico cae en el sesgo de falacia narrativa que ha sido descrito por Taleb:

La falacia narrativa se refiere a nuestra capacidad limitada para observar secuencias de hechos sin darles una explicación o, lo que es equivalente, de forzar una conexión lógica, una relación entre ellos. Las explicaciones unen a los hechos. Hacen que sean más fáciles de recordar; ayudan a que tengan más sentido. Esta propensión arroja malos resultados cuando aumenta nuestra impresión de comprensión. —Nassim Nicholas Taleb, The Black Swan

El problema es particularmente grave cuando se trata de la fijación de precios, porque no existe un ambiente controlado para las condiciones de mercado. Sin importar cuánta atención se preste al protocolo de experimentación, hay muchos factores que quedan irremediablemente fuera de nuestro control, comenzando por las iniciativas de nuestros competidores.

Por lo tanto, es muy importante definir la hipótesis que se probará al comienzo del experimento, para asegurarse de que se está confirmando o invalidando esa hipótesis en particular, y no una hipótesis ad-hoc revisada durante el curso del experimento mismo. Debería escribir esta hipótesis al comienzo del documento de referencia que mencionábamos antes. Este podría ser un ejemplo de una buena hipótesis: Las caídas bruscas en los volúmenes de ventas no se explican por una caída en la demanda, sino por la presencia de competidores menos visibles con precios agresivos. Por lo tanto, si bajamos de modo agresivo nuestros márgenes sobre esos productos, los volúmenes de ventas deberían aumentar proporcionalmente".

4. Grupos de control positivos y negativos

Una vez que se ha escrito la hipótesis, es momento de diseñar el experimento en sí. Generalmente no es posible, o bien resulta poco práctica —o, a veces, incluso ilegal—, intentar mostrar dos precios distintos para el mismo artículo a diferentes grupos de clientes. Por lo tanto, un abordaje más práctico en el sector minorista consiste en elegir dos grupos de artículos equivalentes que representan solo una pequeña fracción de todo el catálogo.

Estas dos muestras se llamarán respectivamente:
  • El grupo de control positivo, donde se aplica la nueva estrategia de fijación de precios.
  • El grupo de control negativo, donde la estrategia de fijación de precios antigua se mantiene invariable.

Al comparar el resultado de los grupos de control positivo y negativo, podrá evaluar si la hipótesis inicial era correcta, Envision hace que sea muy directo seleccionar al azar dos grupos de control gracias a la función hash:

seed := "hello world"
R = rankd(hash(concat(Id, seed)))
where R <= 1000
  // positive group here
where R > 1000 & R <= 2000
  // negative group here
En el script anterior, estamos calculando una organización aleatoria de todos los artículos en la Línea 2. La función hash elabora un número pseudoaleatorio para la cadena de entrada. No es realmente aleatorio, porque la misma cadena genera siempre el mismo valor hash. Por lo tanto, para producir muestras distintas, uno debería cambiar el texto pasado como
seed. Luego, en la Línea 3, seleccionamos 1000 artículos como grupo de control positivo. En la Línea 5, hacemos lo mismo para los 1000 artículos del grupo de control negativo.

Esta lógica se ajusta fácilmente a situaciones en las que deseamos definir dos grupos que
cumplan con determinadas condiciones. Por ejemplo, supongamos que deseamos establecer grupos de control dentro de un conjunto de artículos que corresponden a la marca Fabrikam. Esto podría hacerse con:
where Brand == "Fabrikam" // scoping only the brand 'Fabrikam'
  seed := "hello world"
  R = rankd(hash(concat(Id, seed)))
  where R <= 50
    // positive group here
  where R > 50 & R <= 100
    // negative group here

5. Guardado de los grupos de control

Cuando se utilizan condiciones complejas para la selección de los grupos de control, existe el riesgo de que la misma lógica de muestreo no arroje la misma lista de artículos con el pasar del tiempo. Por ejemplo, si se introducen nuevos artículos, estos influenciarán la lógica del modo presentado en la sección anterior. Por lo tanto, le recomendamos que
guarde'' los grupos de control en un archivo separado, de modo que puedan cambiar en en forma inadvertida con el pasar del tiempo.

seed := "hello world"
R = rankd(hash(concat(Id, seed)))
Control = ""
where R <= 1000
  Control = "pos" // positive group
where R > 1000 & R <= 2000
  Control = "neg" // negative group

// exportación del grupo
startDate := "2014-07-09"
endDate := "2014-08-09"
where Control != ""
  show table "sample" export:"/exp/g-sevilla.tsv" with
 Id
startDate as "Date" 
endDate, Control 
Price

En el script anterior, una vez que los grupos se han establecido, guardamos los resultados en un archivo llamado `g-sevilla.tsv`. Ahora mostraremos en la siguiente sección el modo en que el prefijo `g` (o cualquier prefijo alternativo) puede ser útil para evitar superposiciones entre las muestras. `sevilla` es simplemente un ejemplo de un nombre recordable para el experimento. Este archivo ya está formateado como un archivo de secuencia de evento que podrá volver a cargar en Lokad más tarde. Debería ejecutar esta lógica una vez y luego comentar las líneas de exportación del archivo para evitar sobrescribir un archivo existente. Luego, como medida de seguridad, descargue ese archivo y guarde una copia adjunta a su documento de referencia.

Más tarde, para evitar definir grupos que se superpongan con otro experimento en curso, puede volver a cargar el archivo guardado y utilizar esa información para excluir los artículos relevantes. Esto podría hacerse con:
read "/exp/g-*" as Experiments // loading all experiments so far

today := Date(2014,7,9)
IsPartOfGroup = false
where Experiments.EndDate < today // we exclude all ongoing experiments
  // look for the existence of a matching group
  IsPartOfGroup = exists(Experiments.Date) 

where not IsPartOfGroup
  seed := "hello world"
  R = rankd(hash(concat(Id, seed)))
  Control = ""
  where R <= 1000
    // positive group here
  where R > 1000 & R <= 2000
    // negative group here

6. Definición del nuevo script de fijación de precios

En las secciones anteriores, hemos cubierto varias estrategias de fijación de precios. En este punto del protocolo del experimento, es momento de implementar el script de fijación de precios revisado. Los detalles de la lógica de fijación de precios en sí excede el objetivo de esta sección; sin embargo, debería saber que los precios generalmente se pueden exportar utilizando un simple mosaico table:
read "/exp/g-sevilla.tsv" as Scope

// Original logic to generate the control groups is commented out.
// We reload the control groups directly from the persisted copy.
Control = last(Scope.Control) or ""

where Control != "" // excluding items not part of the scope
  // snipped here: actual pricing logic
  show table "sample" export:"/exp/p-sevilla.tsv" with Id, today() as Date, Price
En este script, comenzamos por cargar la copia guardada de los grupos de control. Luego, redefinimos un alcance que se reduce solo a aquellos grupos de control. Por último, elaboramos una exportación de archivo de los nuevos precios.

En la práctica, puede no ser tan simple guardar los precios revisados con respecto a guardar los grupos de control mismos. De hecho, los precios siguen cambiando de acuerdo con sus estrategias subyacentes respectivas durante el experimento.

7. Publicación y observación de precios

Una vez que los scripts están listos para elaborar los precios revisados, esos precios deberían publicarse en los diferentes canales de ventas. Cuando fuera posible, debería hacer hincapié en procesos de publicación de precios relativamente automatizados. En particular, Lokad ofrece una REST API que soporta la puesta en marcha automatizada de los proyectos. Una vez completada la ejecución del script, es posible recuperar los archivos de salida por FTP o FTPS desde Lokad para importarlos en los sistemas de producción.

Para estar seguro de las observaciones de ventas realizadas después de la revisión de precios, es importante asegurarse de que los precios disponibles en los canales de ventas sean de hecho los que han sido elaborados por los scripts de Envision. Observamos muy a menudo que se producen importaciones de precios defectuosas o parciales, lo que lleva a una discrepancia entre los precios realmente publicados y los precios calculados por la estrategia de fijación de precios.

Lo ideal sería que los precios históricos publicados se volvieran a introducir en Lokad como datos de entrada. Cuando existe ese circuito de datos, resulta posible comparar los precios publicados con los precios calculados dentro de Lokad y asegurar que los valores estén alineados. En el script a continuación, cargamos los precios históricos tomados de la producción, luego el alcance del experimento, seguido por los precios como se calcularon originalmente.

//  ... snipped items and other data files ...
read "/prices.tsv" as Prices // from the production systems
read "/exp/g-sevilla.tsv" as Scope
read "/exp/p-sevilla.tsv" as ExpPrices

// The original logic to generate control groups is commented out.
// We reload the control groups directly from the persisted copy.
Control = last(Scope.Control) or ""

where Control != "" // excluding items not part of the scope
  // relevant date for the publish date of the prices
  when date <= date(2014,8,1) 
    where last(Prices.Price) != last(ExpPrices.Price)
      show table "Item count with price mismatch" with count(Id) 
El script produce el número de discordancias de precio en las que el precio tomado de los sistemas de producción no corresponde con los precios originalmente calculados por los scripts de fijación de precios.

Por último, al cabo de algunos días o de algunas semanas, de acuerdo con el período de tiempo aplicable para el experimento de fijación de precios, las observaciones recopiladas en la evolución de las ventas para los dos grupos pueden compararse para evaluar si la hipótesis inicial era correcta. La acumulación de experimentos concluyentes es una ventaja que los comerciantes pueden utilizar para diseñar estrategias de fijación de precios cada vez más eficientes a lo largo del tiempo.