Last active
April 11, 2017 15:36
-
-
Save MarcoBuster/9ec4070b4231204e9d0f9a063964b3de to your computer and use it in GitHub Desktop.
Dimostrazione della legge dei grandi numeri per il progetto di statistica e probabilità della prof. Saddemi.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Copyright (c) 2017 Marco Aceti <personale@marcoaceti.it> | |
# | |
# Con la presente si concede, | |
# a chiunque ottenga una copia di questo software e dei file di documentazione associati (il "Software"), | |
# l'autorizzazione a usare gratuitamente il Software senza alcuna limitazione, | |
# compresi i diritti di usare, copiare, modificare, unire, pubblicare, distribuire, | |
# cedere in sottolicenza e/o vendere copie del Software, | |
# nonché di permettere ai soggetti cui il Software è fornito di fare altrettanto, alle seguenti condizioni: | |
# | |
# L'avviso di copyright indicato sopra e questo avviso di autorizzazione | |
# devono essere inclusi in ogni copia o parte sostanziale del Software. | |
# | |
# IL SOFTWARE VIENE FORNITO "COSÌ COM'È", SENZA GARANZIE DI ALCUN TIPO, ESPLICITE O IMPLICITE, | |
# IVI INCLUSE, IN VIA ESEMPLIFICATIVA, LE GARANZIE DI COMMERCIABILITÀ, | |
# IDONEITÀ A UN FINE PARTICOLARE E NON VIOLAZIONE DEI DIRITTI ALTRUI. | |
# IN NESSUN CASO GLI AUTORI O I TITOLARI DEL COPYRIGHT SARANNO RESPONSABILI PER QUALSIASI RECLAMO, | |
# DANNO O ALTRO TIPO DI RESPONSABILITÀ, A SEGUITO DI AZIONE CONTRATTUALE, | |
# ILLECITO O ALTRO, DERIVANTE DA O IN CONNESSIONE AL SOFTWARE, AL SUO UTILIZZO O AD ALTRE OPERAZIONI CON LO STESSO. | |
# Copyright (c) 2017 Marco Aceti <personale@marcoaceti.it> | |
# | |
# Permission is hereby granted, free of charge, | |
# to any person obtaining a copy of this software and associated documentation files (the "Software"), | |
# to deal in the Software without restriction, including without limitation the rights | |
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, | |
# and to permit persons to whom the Software is furnished to do so, subject to the following conditions: | |
# | |
# The above copyright notice and this permission notice shall be included in all copies or substantial portions | |
# of the Software. | |
# | |
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, | |
# INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON | |
# INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, | |
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION | |
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |
import random # Libreria per generare eventi aleatori | |
# Librerie per i grafici | |
import plotly.plotly as py | |
import plotly.graph_objs as go | |
import os | |
import string | |
def esegui_prove(k, intervallo, numero): | |
""" | |
Esegue le prove | |
:param k: numero di prove | |
:param intervallo: intervallo di numeri (casi possibili) | |
:param numero: numero da tenere conto (caso favorevole) | |
:return ritorna il numero di volte che è uscito il numero | |
""" | |
conto = 0 # Tiene il conto di quante volte esce il "numero" | |
for n in range(0, k): # Esegue la misurazione "k" volte | |
numero_casuale = random.randint(intervallo[0], intervallo[1]) # Ottiene un numero casuale nell'intervallo | |
if numero == numero_casuale: # Se il numero casuale estratto è uguale al numero indicato: | |
conto += 1 # Aumenta di 1 il conteggio di casi favorevoli | |
return conto # Ritorna il conteggio di casi favorevoli | |
def calcola_percentuali(casi_possibili, casi_favorevoli, conto, k): | |
""" | |
Calcola le percentuali di probabilità frequentista e assoluta. Formatta e stampa il testo con i risultati. | |
:param casi_possibili: numero dei casi possibili | |
:param casi_favorevoli: numero dei casi favorevoli | |
:param conto: le volte che è uscito il numero (caso favorevole) nell'intervallo dalla funzione esegui_prove | |
:param k: numero di prove eseguite con la funzione esegui_prove | |
""" | |
classica = casi_favorevoli / casi_possibili * 100 # Percentuale probabilità classica | |
frequentista = conto / k * 100 # Percentuale probabilità classica | |
print( # Stampa i risultati | |
"=== DATI ELABORATI ===" | |
"\nProbabilità classica: {classica}%" | |
"\n| Casi possibili: {casi_possibili}" | |
"\n| Casi favorevoli: {casi_favorevoli}" | |
"\nProbabilità frequentista ottenuta: {frequentista}%" | |
"\n| Casi possibili (prove eseguite): {k}" | |
"\n| Casi favorevoli (numero di volte che è uscito il numero): {conto}" | |
.format(classica=classica, casi_possibili=casi_possibili, casi_favorevoli=casi_favorevoli, | |
frequentista=frequentista, k=k, conto=conto) | |
) | |
def esegui_prove_progressione(k, intervallo, numero, progressione, casi_possibili, casi_favorevoli): | |
""" | |
Esegue le prove in progressione ed esegue un grafico in .png delle prove | |
:param k: numero di prove | |
:param intervallo: intervallo di numeri (casi possibili) | |
:param numero: numero da tenere conto (caso favorevole) | |
:param progressione: ogni quanto stampare i risultati (in progressione) | |
:param casi_favorevoli: serve per il calcolo della probabilità classica da mettere nel grafico | |
:param casi_possibili: serve per il calcolo della probabilità classica da mettere nel grafico | |
:return ritorna il numero di volte che è uscito il numero | |
""" | |
conto = 0 | |
x = 0 # Dichiara la x, che servirà per stampare, quando raggiungerà il valore "progressione", i risultati progressivamente | |
y = 0 # Dichiara la y, che servirà per tenere il conto delle prove fatte | |
grafico_x = [] # Asse x del grafico | |
grafico_y = [] # Asse y del grafico | |
for n in range(0, k): | |
x += 1 # Aumenta di 1 la x a ogni misurazione | |
y += 1 # Aumenta di 1 la y a ogni misurazione | |
numero_casuale = random.randint(intervallo[0], intervallo[1]) | |
if numero == numero_casuale: | |
conto += 1 | |
if x == progressione: # Se la x (aumentata a ogni misurazione) è uguale a "progressione" | |
x = 0 # Resetta la x | |
frequentista = conto / y * 100 # Calcola la probabilità frequentista (ad ora) | |
grafico_x.append(y) # Aggiunge alla lista degli elementi sull'asse x il numero di prove fatte ad ora | |
grafico_y.append(frequentista) # Aggiunge alla lista degli elementi sull'asse y la probabilità frequentista ad ora | |
print("Probabilità frequentista ottenuta (ad ora): {frequentista}%".format(frequentista=frequentista)) # Stampa la probabilità frequentista ad ora | |
# Generazione del grafico # | |
line1 = go.Scatter( # Linea 1 (probabilità frequentista) | |
x=grafico_x, # Asse x | |
y=grafico_y, # Asse y | |
name='Probabilità frequentista', # Nome linea (per la legenda) | |
line=dict( # Proprietà linea | |
color='rgb(256, 0, 0)', # Colore linea (rosso) | |
width=1) # Ampiezza linea | |
) | |
classica = casi_favorevoli / casi_possibili * 100 # Calcola la probabilità classica | |
y = [] # Rende la variabile utilizzabile per il grafico | |
for a in range(0, k): | |
y.append(classica) | |
line2 = go.Scatter( # Linea 2 (probabilità classica) | |
x=grafico_x, # L'asse x è uguale | |
y=y, # L'asse y invece esprime la probabilità classica | |
name='Probabilità classica', # Nome linea (per la legenda) | |
line=dict( # Proprietà linea | |
color='rgb(0, 256, 0)', # Colore linea (verde) | |
width=1) # Ampiezza linea | |
) | |
title = "<b>Probabilità frequentista su {k} prove</b>: dimostrazione della legge dei grandi numeri".format(k=k) # Titolo del grafico | |
layout = dict(title=title, # Dà il titolo al grafico | |
xaxis=dict(title='Prove'), # Dà il nome all'asse x | |
yaxis=dict(title='Probabilitià (%)'),) # Dà il nome all'asse y | |
filename = os.path.dirname(os.path.realpath(__file__)) + "/graph_{x}.png"\ | |
.format(x=''.join(random.choice(string.ascii_uppercase) for _ in range(9))) # Salva il grafico con un nome casuale in .png | |
fig = dict(data=[line1, line2], layout=layout) # Crea dizionario grafico | |
py.image.save_as(fig, filename=filename) # Genera e salva il grafico | |
print("Grafico salvato! File: {g}".format(g=filename)) # Stampa su schermo il nome del file con il grafico | |
# Esegue 1000 volte la prova: | |
# Quale è la probabilità che esca "1" estraendo tra due numeri casuali che possono essere "0" o "1"? | |
conto = esegui_prove(k=10000, intervallo=[0, 1], numero=1) | |
# Calcola le percentuali della prova precedente | |
calcola_percentuali(casi_possibili=2, casi_favorevoli=1, conto=conto, k=10000) | |
# Esegue in progressione la prova 10000 volte: | |
# Quale è la probabibilità che esca "0" estraendo tra tre numeri casuali che possono essere "0", "1", e "2"? | |
# Ogni 10 misurazioni stampa la probabilità frequentista ottenuta al momento (sommata alle precedenti) | |
# Crea il grafico nella directory corrente con un nome casuale (in .png) | |
esegui_prove_progressione(k=100000, intervallo=[0, 2], numero=0, progressione=10, casi_possibili=3, casi_favorevoli=1) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment