Analisi di due dadi

Vedi la discussione teorica

Utilizza i moduli per

  • fractions, mantenere formali i risultati delle operazioni con le frazioni
  • matplotlib, rappresentare graficamente la distribuzione delle probabilità
  • math, radice quadrata
from   fractions import Fraction as F   # Fraction()
import matplotlib.pyplot         as plt # plot()
import math                             # sqrt()

N = 13*[0]                              # Conteggio degli esiti del lancio di due dadi
for d1 in range(1, 7):
    for d2 in range(1,7):
        dadi=d1+d2
        N[dadi] += 1

X = list(range(2, 13))
P = []                                  # Probabilità: frequenze assolute
for x in X:
    p=F(N[x], 36)
    P.append(p)

plt.bar(X, P)                           # Grafico a barre verticali
plt.grid()
plt.show()
print("  x | p(x)")                     # Tabella
print("----|------")
for x, p in zip(X, P):
    print(" %2i | %s" %(x, p))

Risultato

  x | p(x) 
----|------ 
  2 | 1/36 
  3 | 1/18 
  4 | 1/12 
  5 | 1/9 
  6 | 5/36 
  7 | 1/6 
  8 | 5/36 
  9 | 1/9 
 10 | 1/12 
 11 | 1/18 
 12 | 1/36

Il resto del codice esegue i calcoli

media          = 0
media_quadrati = 0

for p, x in zip(P, X):
    media          += p*x
    media_quadrati += p*x**2

varianza_1 = media_quadrati-media**2

print("Media              = %5s %10.6f" %(media         , media         ))
print("Media dei quadrati = %5s %10.6f" %(media_quadrati, media_quadrati))
print("Varianza  (1)      = %5s %10.6f" %(varianza_1    , varianza_1    ))

scarto_medio_assoluto = 0
devianza              = 0
varianza_2            = 0

for p, x in zip(P, X):
    scarto_medio_assoluto += p*abs(media-x)
    devianza              += (media-x)**2  
    varianza_2            += p*(media-x)**2

print("Scarto medio assoluto = %5s %10.6f" %(scarto_medio_assoluto, scarto_medio_assoluto))
print("Devianza              = %5s %10.6f" %(devianza             , devianza             ))
print("Varianza (2)          = %5s %10.6f" %(varianza_2           , varianza_2           ))

deviazione_standard          = math.sqrt(varianza_2)
deviazione_standard_relativa = deviazione_standard/abs(media)

print("Deviazione standard      =", deviazione_standard         )
print("Deviazione standard rel. =", deviazione_standard_relativa)

Risultati

Media              =     7   7.000000 
Media dei quadrati = 329/6  54.833333 
Varianza (1)       =  35/6   5.833333 

Scarto medio assoluto = 35/18    1.944444 
Devianza              =   110  110.000000 
Varianza (2)          =  35/6    5.833333 

Deviazione standard      = 2.41522945769824 
Deviazione standard rel. = 0.3450327796711771

Riepilogo

\displaystyle M(X) = 7

\displaystyle M(X^2) = \frac{329}{6}

\displaystyle \delta(X) = \frac{35}{18}

\displaystyle dev(X) = 110

\displaystyle var(X) = \frac{35}{6}

collections
SymPy

I moduli … permettono di …

  • collections, conteggiare gli esiti di due dadi con l’oggetto Counter
  • sympy, mantenere formale anche la radice quadrata
import collections               # Counter()
import matplotlib.pyplot as plt
import sympy             as sp   # Rational(), sqrt() 

DADO  = list(range(1, 7))
DADI  = [d1+d2 for d1 in DADO for d2 in DADO]
COUNT = collections.Counter(DADI);

X = COUNT.keys()
P = [sp.Rational(count, 36) for count in COUNT.values()]

plt.bar(X, P)
plt.grid()
plt.show()

print("  x | p(x)")
print("----|------")
for x, p in zip(X, P):
    print(" %2i | %s" %(x, p))

e con lo stesso codice precedente ottenere anche la deviazione standard in formato leggibile

\displaystyle \sigma(X) = \frac{\sqrt{210}}{6}

\displaystyle \sigma^*(X) = \frac{\sqrt{210}}{42}