Files
social-media-automation/docs/AB_TESTING.md
Consultoría AS e2882ce72b docs: Add comprehensive documentation for all new features
- FEATURES_OVERVIEW.md: Complete summary of all system features
- ANALYTICS.md: Analytics and reporting system documentation
- ODOO_INTEGRATION.md: Odoo ERP integration guide
- AB_TESTING.md: A/B testing system documentation
- CONTENT_RECYCLING.md: Content recycling system docs
- THREAD_SERIES.md: Thread series and scheduled posts
- IMAGE_TEMPLATES.md: Visual template system documentation

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-28 03:17:23 +00:00

6.6 KiB

A/B Testing

Sistema de pruebas A/B para optimizar contenido y maximizar engagement.

Descripción

El A/B Testing permite comparar diferentes versiones de contenido para determinar cuál tiene mejor rendimiento. El sistema:

  1. Crea múltiples variantes de contenido
  2. Publica cada variante
  3. Recopila métricas de cada una
  4. Determina estadísticamente el ganador

Modelos de Datos

ABTest

ABTest:
    id: int
    name: str
    description: str
    test_type: str  # content, timing, hashtags, image

    platform: str  # x, threads, instagram, facebook
    status: str  # draft, running, completed, cancelled

    started_at: datetime
    ended_at: datetime
    duration_hours: int  # Duración del test (default 24)

    winning_variant_id: int (FK)
    confidence_level: float  # Nivel de confianza estadística

    min_sample_size: int  # Mín impresiones por variante (default 100)
    success_metric: str  # engagement_rate, likes, comments, shares

ABTestVariant

ABTestVariant:
    id: int
    test_id: int (FK -> ab_tests)
    name: str  # A, B, C, D

    content: str
    hashtags: JSON
    image_url: str

    post_id: int (FK -> posts)

    # Métricas
    impressions: int
    reach: int
    likes: int
    comments: int
    shares: int
    clicks: int
    engagement_rate: float

    is_winner: bool
    published_at: datetime

API Endpoints

GET /api/ab-tests/

Lista todos los tests A/B.

Parámetros:

  • status: draft, running, completed, cancelled
  • platform: x, threads, etc.
  • limit (int, default=20)

Respuesta:

{
    "tests": [
        {
            "id": 1,
            "name": "Test de copies",
            "platform": "x",
            "status": "running",
            "variants": [...]
        }
    ],
    "count": 5
}

GET /api/ab-tests/{test_id}

Obtiene un test específico con sus variantes.

POST /api/ab-tests/

Crea un nuevo test A/B.

Body:

{
    "name": "Test de copies para tips",
    "platform": "x",
    "variants": [
        {
            "name": "A",
            "content": "💡 Tip: Automatiza tus procesos con IA...",
            "hashtags": ["#IA", "#Automatización"]
        },
        {
            "name": "B",
            "content": "¿Sabías que la IA puede ahorrarte 10 horas semanales?...",
            "hashtags": ["#Productividad", "#Tech"]
        }
    ],
    "test_type": "content",
    "duration_hours": 24,
    "min_sample_size": 100,
    "success_metric": "engagement_rate"
}

Validaciones:

  • Mínimo 2 variantes, máximo 4
  • Cada variante debe tener contenido

POST /api/ab-tests/{test_id}/start

Inicia un test A/B.

Proceso:

  1. Crea posts para cada variante
  2. Programa publicación (escalonada cada 5 min)
  3. Cambia status a "running"
  4. Registra start_time

Respuesta:

{
    "message": "A/B test started successfully",
    "success": true,
    "test_id": 1,
    "post_ids": [101, 102],
    "variants_count": 2
}

POST /api/ab-tests/{test_id}/evaluate

Evalúa resultados y determina ganador.

Proceso:

  1. Actualiza métricas de cada variante
  2. Verifica tamaño de muestra mínimo
  3. Ejecuta test estadístico (chi-square)
  4. Determina ganador y confianza
  5. Si duration_hours pasó, marca como completed

Respuesta:

{
    "success": true,
    "winner": {
        "variant_id": 1,
        "name": "A",
        "engagement_rate": 4.5,
        "impressions": 1500
    },
    "runner_up": {
        "variant_id": 2,
        "name": "B",
        "engagement_rate": 3.2,
        "impressions": 1400
    },
    "confidence_level": 95.5,
    "p_value": 0.045,
    "test_status": "completed"
}

Si datos insuficientes:

{
    "success": true,
    "status": "insufficient_data",
    "min_impressions": 50,
    "required": 100
}

GET /api/ab-tests/{test_id}/results

Obtiene resultados actuales (sin determinar ganador).

POST /api/ab-tests/{test_id}/cancel

Cancela un test en progreso.

Tareas Programadas

evaluate_ab_tests

  • Frecuencia: Cada hora
  • Función:
    • Busca tests en estado "running"
    • Si pasó duration_hours, evalúa y completa
    • Si no, solo actualiza métricas

Tipos de Test

Tipo Descripción
content Prueba diferentes textos
timing Prueba diferentes horarios
hashtags Prueba diferentes conjuntos de hashtags
image Prueba diferentes imágenes

Métricas de Éxito

Métrica Descripción
engagement_rate (likes + comments + shares) / impressions
likes Total de likes
comments Total de comentarios
shares Total de compartidos
clicks Total de clics (si aplica)

Análisis Estadístico

El sistema usa el test chi-cuadrado para determinar significancia estadística:

# Tabla de contingencia
[
    [engagements_A, non_engagements_A],
    [engagements_B, non_engagements_B]
]

chi2, p_value, dof, expected = scipy.stats.chi2_contingency(tabla)
confidence = (1 - p_value) * 100

Interpretación

p-value Confianza Interpretación
< 0.01 > 99% Muy significativo
< 0.05 > 95% Significativo
< 0.10 > 90% Marginalmente significativo
≥ 0.10 < 90% No significativo

Flujo de Trabajo

1. Crear Test (status: draft)
        ↓
2. Iniciar Test (status: running)
   - Crea posts para variantes
   - Programa publicación
        ↓
3. Esperar duración
   - Sistema recopila métricas cada 15 min
   - Evalúa cada hora
        ↓
4. Evaluar Resultados (status: completed)
   - Determina ganador estadístico
   - Calcula nivel de confianza

Ejemplo de Uso

from app.services.ab_testing_service import ab_testing_service

# Crear test
test = await ab_testing_service.create_test(
    name="Test de engagement",
    platform="x",
    variants=[
        {"name": "A", "content": "Versión corta y directa"},
        {"name": "B", "content": "Versión más elaborada con detalles"}
    ],
    duration_hours=48,
    min_sample_size=200
)

# Iniciar
result = await ab_testing_service.start_test(test.id)

# Evaluar (después de publicado)
results = await ab_testing_service.evaluate_test(test.id)
if results.get("winner"):
    print(f"Ganador: Variante {results['winner']['name']}")
    print(f"Confianza: {results['confidence_level']:.1f}%")

Mejores Prácticas

  1. Tamaño de muestra: Espera al menos 100 impresiones por variante
  2. Una variable: Prueba solo un elemento a la vez
  3. Duración: Mínimo 24 horas para datos representativos
  4. Horarios: Publica variantes en horarios similares
  5. Confianza: Busca > 95% antes de tomar decisiones