Skip to content

Instantly share code, notes, and snippets.

@MarcoBuster
Last active April 11, 2017 15:36
Show Gist options
  • Save MarcoBuster/9ec4070b4231204e9d0f9a063964b3de to your computer and use it in GitHub Desktop.
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.
# 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