"""
Module: Inférence bayésienne
Catégorie : Statistiques bayésiennes
Difficulté : Intermédiaire

Généré depuis la plateforme ML Formation
"""

# Imports
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, mean_squared_error, r2_score

from scipy import stats

# Pour le module MCMC uniquement (pip install pymc arviz)
try:
    import arviz as az
    import pymc as pm
except ImportError:
    pass

# Charger le dataset
df = pd.read_csv('ab_testing.csv')

# Explorer les données
# Type: Code exécutable
print("=" * 70)
print("       EXPLORATION DES DONNEES DU TEST A/B")
print("=" * 70)

print("""
Une equipe web teste deux variantes d'une page (A = actuelle, B = nouvelle).
Chaque ligne est un visiteur: sa variante et s'il a converti (1) ou non (0).
Objectif du module: estimer les taux de conversion AVEC leur incertitude,
puis decider si B est vraiment meilleure que A.
""")

display(df.head(10), title="Apercu du dataset A/B")

print("\n" + "=" * 70)
print("1. COMPTAGES PAR VARIANTE")
print("=" * 70)

resume = df.groupby("variant")["converted"].agg(["count", "sum", "mean"])
resume.columns = ["visiteurs", "conversions", "taux_observe"]
display(resume.round(4), title="Resume par variante")

for variant in ["A", "B"]:
    sub = df[df["variant"] == variant]
    n = len(sub)
    k = int(sub["converted"].sum())
    print(f"  Variante {variant}: {k:3d} conversions sur {n} visiteurs "
          f"→ taux observe = {k / n:.2%}")

print("\n" + "=" * 70)
print("2. LA QUESTION QUE TOUT LE MONDE SE POSE")
print("=" * 70)
print("""
B affiche un meilleur taux que A. Mais avec quelques centaines de
visiteurs seulement, est-ce un vrai effet ou de la chance ?

L'approche bayesienne va repondre directement a la vraie question:
"Quelle est la probabilite que B soit meilleure que A ?"
""")

# Visualisation simple des comptages
fig, ax = plt.subplots(figsize=(8, 5))
resume["taux_observe"].plot(kind="bar", ax=ax, color=["#9B7AC4", "#F7E64D"],
                            edgecolor="#3A3A3A")
ax.set_title("Taux de conversion observes (estimations ponctuelles)")
ax.set_ylabel("Taux de conversion")
ax.set_xlabel("Variante")
ax.tick_params(axis="x", rotation=0)
for i, v in enumerate(resume["taux_observe"]):
    ax.text(i, v + 0.003, f"{v:.2%}", ha="center", fontweight="bold")
plt.tight_layout()
plt.show()

print("Ces barres cachent l'essentiel: l'INCERTITUDE autour de chaque taux.")
print("La suite du module va la rendre visible.")


# ----------------------------------------------------------------------
# La suite de ce module demande un compte.
# Les cellules de code restantes ne sont pas dans ce fichier.
# ----------------------------------------------------------------------
