Simulation et Visualisation d’une Marche Aléatoire en Python

Introduction : Qu’est-ce qu’une marche aléatoire ?

Une marche aléatoire est un processus mathématique décrivant un chemin composé d’une suite d’étapes aléatoires.
Imaginez que vous lanciez une pièce de monnaie — si c’est face, vous avancez ; si c’est pile, vous reculez.
Répétez cette expérience des centaines de fois, et vous obtiendrez ce qu’on appelle une marche aléatoire à une dimension (1D).

Les marches aléatoires apparaissent dans de nombreux domaines scientifiques :

  • Biologie : modélisation de la diffusion moléculaire ou du déplacement cellulaire
  • Finance : fluctuations des prix des actions
  • Physique et météorologie : mouvement brownien, transport de polluants et turbulence atmosphérique

Bien que chaque marche soit imprévisible, lorsqu’on observe plusieurs marches aléatoires ensemble, des schémas émergent — comme le fait que la distance moyenne à l’origine croît avec la racine carrée du nombre d’étapes.

Une marche aléatoire simple en 1D

Commençons par le cas le plus simple — se déplacer aléatoirement vers la gauche ou la droite.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
import numpy as np
import matplotlib.pyplot as plt

# Nombre d'étapes
n_steps = 500

# Choisir aléatoirement les pas : +1 (droite) ou -1 (gauche)
steps = np.random.choice([-1, 1], size=n_steps)

# Calculer la position après chaque pas
position = np.cumsum(steps)

# Tracer la marche
plt.figure(figsize=(10, 5))
plt.plot(position, lw=2, color='royalblue')
plt.axhline(0, color='black', lw=1, linestyle='--')
plt.title("Simulation d'une marche aléatoire 1D", fontsize=16)
plt.xlabel("Numéro d'étape")
plt.ylabel("Position")
plt.grid(True, alpha=0.3)
plt.show()

Explications :

  • Chaque pas est indépendant du précédent.
  • Avec le temps, la position du marcheur “flotte” autour de zéro.
  • En moyenne, la distance à l’origine croît comme ( \sqrt{N} ), où ( N ) est le nombre d’étapes.

Simulation et Visualisation d’une Marche Aléatoire en Python
Simulation et Visualisation d’une Marche Aléatoire en Python

Passer à deux dimensions (2D)

Étendons maintenant l’idée à deux dimensions — chaque pas a une direction aléatoire.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import numpy as np
import matplotlib.pyplot as plt

n_steps = 1000

# Angles aléatoires pour chaque pas (en radians)
angles = np.random.uniform(0, 2 * np.pi, n_steps)
x_steps = np.cos(angles)
y_steps = np.sin(angles)

# Calculer les positions cumulées
x = np.cumsum(x_steps)
y = np.cumsum(y_steps)

# Tracer la trajectoire
plt.figure(figsize=(6, 6))
plt.plot(x, y, lw=1.5, color='royalblue')
plt.scatter(0, 0, color='green', label='Départ', zorder=3)
plt.scatter(x[-1], y[-1], color='red', label='Arrivée', zorder=3)
plt.title("Marche aléatoire 2D", fontsize=16)
plt.xlabel("Position X")
plt.ylabel("Position Y")
plt.legend()
plt.axis("equal")
plt.grid(alpha=0.3)
plt.show()

Interprétation :

  • Chaque pas a une longueur fixe mais une direction aléatoire.
  • La trajectoire illustre la diffusion aléatoire de particules sur une surface.
  • L’étalement (variance) augmente avec le nombre d’étapes.

Simulation et Visualisation d’une Marche Aléatoire en Python
Simulation et Visualisation d’une Marche Aléatoire en Python

Plusieurs marcheurs — Statistiques d’ensemble

Une seule marche est très bruitée. Simulons plusieurs marcheurs pour révéler le comportement statistique global.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
import numpy as np
import matplotlib.pyplot as plt

n_walkers = 30
n_steps = 200

plt.figure(figsize=(8, 6))

for i in range(n_walkers):
    steps = np.random.choice([-1, 1], size=n_steps)
    position = np.cumsum(steps)
    plt.plot(position, alpha=0.5)

plt.title("Ensemble de marches aléatoires 1D")
plt.xlabel("Numéro d'étape")
plt.ylabel("Position")
plt.grid(alpha=0.3)
plt.show()

Observation :

  • La position moyenne reste proche de zéro.
  • La dispersion (variance) augmente avec le nombre d’étapes — une caractéristique typique de la diffusion.

Simulation et Visualisation d’une Marche Aléatoire en Python
Simulation et Visualisation d’une Marche Aléatoire en Python

Animation d’une marche aléatoire 2D (Matplotlib)

Les animations donnent vie aux marches aléatoires ! Visualisons la trajectoire qui se construit pas à pas.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
from IPython.display import HTML

# Paramètres
n_steps = 300
step_size = 1

# Initialisation
x = np.zeros(n_steps)
y = np.zeros(n_steps)

# Directions aléatoires
angles = np.random.uniform(0, 2*np.pi, n_steps-1)
x[1:] = np.cumsum(np.cos(angles) * step_size)
y[1:] = np.cumsum(np.sin(angles) * step_size)

# Création de la figure
fig, ax = plt.subplots(figsize=(6,6))
line, = ax.plot(x[:1], y[:1], lw=2, color='royalblue')
point, = ax.plot([x[0]], [y[0]], 'ro', markersize=6)
ax.set_xlim(x.min()-2, x.max()+2)
ax.set_ylim(y.min()-2, y.max()+2)
ax.set_title("Marche aléatoire 2D animée")
ax.set_aspect('equal')
ax.grid(True, alpha=0.3)

# Fonction de mise à jour
def update(frame):
    line.set_data(x[:frame+1], y[:frame+1])
    point.set_data([x[frame]], [y[frame]])  # doit être une séquence
    return line, point

# Création de l’animation
ani = FuncAnimation(fig, update, frames=n_steps, interval=30, blit=True)

# Affichage dans Jupyter
HTML(ani.to_jshtml())

Simulation et Visualisation d’une Marche Aléatoire en Python
Simulation et Visualisation d’une Marche Aléatoire en Python

Visualisation interactive (Plotly)

Pour les présentations ou notebooks en ligne, Plotly permet d’explorer la marche de façon interactive.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import numpy as np
import plotly.graph_objects as go

n_steps = 500
angles = np.random.uniform(0, 2 * np.pi, n_steps)
x = np.cumsum(np.cos(angles))
y = np.cumsum(np.sin(angles))

fig = go.Figure()

fig.add_trace(go.Scatter(
    x=x, y=y,
    mode='lines+markers',
    line=dict(color='royalblue'),
    marker=dict(size=4, color='red'),
    name='Marche aléatoire'
))

fig.update_layout(
    title="Marche aléatoire 2D interactive",
    xaxis_title="Position X",
    yaxis_title="Position Y",
    width=600, height=600,
    showlegend=False,
    template='plotly_white'
)
fig.update_xaxes(scaleanchor="y", scaleratio=1)
fig.show()

L’interactivité apporte :

  • Le zoom et le déplacement de la vue
  • Des infobulles (coordonnées) au survol
  • Une meilleure compréhension de la symétrie de diffusion

Simulation et Visualisation d’une Marche Aléatoire en Python
Simulation et Visualisation d’une Marche Aléatoire en Python

Résumé

Concept Ce que vous avez appris
Marche aléatoire 1D Notion de mouvement aléatoire et somme cumulative
Marche aléatoire 2D Extension à la diffusion spatiale
Multiples marcheurs Comment le hasard se lisse statistiquement
Animation Intuition visuelle du mouvement et de la diffusion
Interactivité Exploration et apprentissage plus engageants

Extensions à essayer

  1. Marche aléatoire biaisée – ajouter une légère dérive (ex. +0.1 à chaque pas).
  2. Taille de pas variable – simuler la turbulence ou les vols de Lévy.
  3. Marche aléatoire 3D – utile pour la diffusion de particules ou les modèles atmosphériques.
  4. Analyse du déplacement quadratique moyen – vérifier la relation linéaire avec le nombre d’étapes.

Références

Liens Site
https://numpy.org/doc/stable/reference/random/index.html Module NumPy Random (pour générer des pas aléatoires)
https://numpy.org/doc/stable/reference/generated/numpy.cumsum.html Fonction NumPy cumsum() pour les sommes cumulatives
https://matplotlib.org/stable/tutorials/introductory/pyplot.html Bases de Matplotlib Pyplot
https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.plot.html Documentation de la fonction plot()
https://matplotlib.org/stable/api/animation_api.html Référence de l’API Animation de Matplotlib
https://matplotlib.org/stable/api/_as_gen/matplotlib.animation.FuncAnimation.html Documentation officielle de FuncAnimation
https://ipython.readthedocs.io/en/stable/api/generated/IPython.display.html#IPython.display.HTML IPython HTML() pour afficher des animations dans Jupyter
https://jupyter.org/ Page officielle du projet Jupyter
Image

of