Sei sulla pagina 1di 35

Scuola di Economia e Management

Master di II livello in
BIG DATA ANALYTICS AND TECHNOLOGIES FOR MANAGEMENT
A.A. 2015/2016

Creazione ed implementazione di
grafi ad albero su R

Relatori: Prof. Federico Mattia Stefanini


Prof. Cristiano Ciappei

Studente: Gabriele Barbanti


Sommario

Il presente lavoro ha come scopo la creazione di script che utilizzano il linguaggio di programmazione
R per la creazione di alberi delle probabilit, una modificazione degli alberi degli eventi che
includono anche le probabilit condizionate degli eventi. Gli alberi trovano applicazione in
moltissimi problemi appartenenti a svariate discipline e un loro utilizzo frequente nel valutare le
alternative delle decisioni, dove consentono di valutare tutte le possibili alternative. Per questo
possono essere un valido strumento in mano al decisore. Tali script pertanto possono essere pensati
come strumenti di ausilio nel mano del decisore, per semplificare la gestione delle decisioni e poter
valutare pro e contro di ogni possibile azione o scelta, semplificando cos il processo decisionale.
Nello studio vengono presi in considerazione degli esempi per mostrare i loro potenziali e limiti.
Indice

1. Alberi e grafi ............................................................................................................................ 1


1.1. Definizioni di grafi e alberi................................................................................................. 1
1.2. Albero delle probabilit (Probability Tree) ........................................................................ 5
1.3. Definizioni probabilistiche ................................................................................................. 6
2. Implementazione grafi ad albero su R ..................................................................................... 8
2.1. Considerazioni generali ................................................................................................. 8
2.2. Creazione degli script .................................................................................................. 10
3. Esempi di implementazione degli script ................................................................................. 17
4. Conclusioni e sviluppi ......................................................................................................... 27
5. Bibliografia .............................................................................................................................. 1
6. Allegati .................................................................................................................................... 2
Creazione ed implementazioni di grafi ad albero su R

1. Alberi e grafi

Ogni cammino dalla radice alla foglia rappresenta una possibile via cui il decisore crede le situazioni
possano svilupparsi. I lati lungo questo percorso etichettano la sequenza di eventi che descrivono
questo sviluppo. Si parla di albero degli eventi se il fenomeno studiato non dipendente dal
decisore, ma solo dalla natura del fenomeno stesso. In un albero degli eventi ogni suo lato etichetta
certe importanti eventi condizionati nella storia. Ogni lato pu essere accompagnato dalle
informazioni relative alle probabilit condizionata degli eventi stessi. In questo caso lalbero degli
eventi si chiama albero delle probabilit. Nel presente capitolo vengono analizzati le definizioni di
tali alberi e viene data una rapida introduzione ad alcuni concetti probabilistici usati nel seguito.

1.1. Definizioni di grafi e alberi

Un grafo una struttura matematica costituita da nodi o vertici che possono essere collegati tra loro
da linee chiamate archi, percorsi o cammini. Detto linsieme dei vertici (finito e non vuoto) ed
un sottoinsieme del prodotto cartesiano di , un grafo una coppia = (, ). Gli
elementi di sono chiamati vertici o nodi (nodes), mentre gli elementi di sono chiamati spigoli o
archi (edges).
Ad esempio siano V = {1,2,3,4} e E = {(1,3); (1,2); (2,4); (3,4); (4,1)} la coppia di punti = (, ),
definisce un grafo raffigurato nel seguente modo:

1
4

Figura 1 - Esempio grafo

Si distinguono due tipi basilari di grafi: i grafi orientati (o grafi diretti) e i grafi non orientati (o grafi
indiretti):
- Un grafo diretto od orientato una coppia (, ), definito da un insieme non vuoto e
da una relazione binaria su , ossia un insieme di coppie ordinate di elementi di . Un "arco
orientato" un arco caratterizzato da una direzione. In particolare, composto da una
"testa" (rappresentata solitamente dalla punta di una freccia), che si dice raggiunge un
vertice in entrata, e una "coda", che lo lascia in uscita.

- Un grafo non orientato, = (( ), ( )), una coppia coppia (, ) , dove linsieme


dei vertici ed costituito da coppie non ordinate di vertici.

1
Creazione ed implementazioni di grafi ad albero su R

Un vertice ( ) connesso da un lato in ( )ad un vertice ( ), allora chiamato


parente di e chiamato figlio di .
Si dice albero un grafo G connesso, non orientato e senza cicli. Per essere tale, il grafo deve
rispettare almeno una delle seguenti richieste:

Possedere un solo cammino per ogni coppia di vertici.


Essere aciclico massimale ossia, se gli si aggiunge un altro spigolo per unire due suoi nodi si
forma un ciclo.
Costituire un grafo connesso minimale ossia, se si rimuove un suo spigolo si perde la
connessione.
Se G ha un numero finito di n vertici, gli enunciati precedenti sono equivalenti ai due che seguono:

G connesso e possiede n 1 spigoli.


G aciclico e possiede n 1 spigoli. 1

Un grafo ad albero diretto = (( ), ( )) un grafo diretto con due propriet ulteriori. Primo
di tutto ha un solo vertice senza nodi parenti chiamato vertice radice 0 ( ). Secondo tutti gli
altri vertici hanno un solo parente .
Un albero con radice un albero con un vertice contraddistinto come radice. Ricordiamo che in un
albero, esiste un solo cammino fra due vertici qualsiasi u e v; se L la lunghezza di tale cammino
diremo anche che L la distanza fra u e v. Fissato arbitrariamente un vertice r come radice per
ciascun nodo esiste uno ed un solo cammino che lo collega alla radice; tale cammino si chiama
cammino caratteristico del nodo. Convenzionalmente il vertice radice posizionato in alto e
rappresenta il punto di partenza del problema.
Si definisce altezza di un nodo, n, la lunghezza del cammino (ovvero il numero di archi che
attraversiamo) che collega la radice al nodo n.

Altezza 0

Altezza 1

Altezza 2

Altezza 3
Figura 2 - Altezza dei nodi

1
https://it.wikipedia.org/wiki/Albero_(grafo)

2
Creazione ed implementazioni di grafi ad albero su R

La lunghezza del cammino caratteristico di un nodo si chiama livello del nodo. Ne deriva che un
albero pu essere disegnato disponendo i vertici su righe successive in relazione alla loro distanza
dalla radice (cio nel loro livello): nella prima riga viene fissato il vertice r, nella seconda riga tutti i
vertici a livello 1 da r, nella terza riga i vertici a distanza 2 da r, ecc Per esempio il grafo della figura
sottostante un albero perch ciascuno nodo connesso ed privo di cicli.

Figura 3 - Rappresentazione generica grafo ad albero

Fissando in ciascuno di essi come radice un vertice, ad esempio il vertice r, si ottiene un albero con
radice e disponendo i vertici su righe successive in relazione alla loro distanza dalla radice si ottiene
il classico layout ad albero.

Figura 4 - Rappresentazione con struttura ad albero grafo

Se il cammino caratteristico di un nodo y contiene un nodo x, si dice che x antenato di y e y


discendente di x. Ogni nodo (eccetto la radice) connesso tramite un ramo ad un altro nodo che ne
il padre e di cui rappresenta un figlio. Un nodo senza figli si chiama foglia; un nodo con almeno
una foglia si chiama nodo interno; il nodo interno senza padre la radice; due o pi nodi con lo
stesso padre si chiamano fratelli.

3
Creazione ed implementazioni di grafi ad albero su R

Osserviamo inoltre che possibile ordinare un albero finito con radice dando in modo naturale ad
ogni nodo un indice. In tal caso lordine imposto ai nodi dato dalla successione finita di numeri
naturali associata ad ogni nodo, la lunghezza della successione uguale al livello del nodo; la
successione associata alla radice vuota. Nella figura successiva nellalbero con radice
precedentemente visto sono stati assegnati gli indici in modo naturale ai suoi nodi.

Figura 5 - Indicizzazione progressiva grafo ad albero

4
Creazione ed implementazioni di grafi ad albero su R

1.2. Albero delle probabilit (Probability Tree)

Spesso si pu usare un diagramma ad albero per rappresentare i casi possibili. Questo ci permette
di avere un'elencazione grafica di tutti gli elementi dello spazio campione. Se poi si scrive su ciascun
ramo la probabilit dell'evento rappresentato nel nodo seguente, la probabilit di uno qualsiasi degli
eventi sui rami terminali data dal prodotto delle probabilit scritte sull'intero percorso, in quanto
si tratta di un'applicazione diretta della formula delle probabilit composte. In pratica:
Lungo i rami si moltiplicano le probabilit;
Ai margini si addizionano.

SI SOMMANO

= 1.00

Alcune regole generali sulla creazione degli alberi delle probabilit:


- I rami diramanti da ciascun nodo devono rappresentare tutti i possibili risultati della fase
successiva;
- La somma delle probabilit su ciascun gruppo di rami deve sommare ad 1;
- Ogni cammino etichettato con una appropriata probabilit condizionata
e sul loro calcolo:
- Ad ogni cammino corrispondono dei risultati;
- La probabilit di un dato risultato il prodotto delle probabilit lungo il cammino;
- Per calcolare la probabilit di un evento necessario selezionare tutti i cammini che
comprendono levento, calcolare la probabilit di ciascuno di questi cammini attraverso il
prodotto delle relative probabilit e sommarle.

5
Creazione ed implementazioni di grafi ad albero su R

1.3. Definizioni probabilistiche

Si riportano brevemente le definizioni delle probabilit che verranno implementante nei codici. Per
maggiori dettagli si rimanda a testi specialistici.

1.3.1. Probabilit congiunta

Eseguendo la moltiplicazione tra i rami si ottiene la probabilit congiunta degli eventi, ovvero la
probabilit che due o pi eventi si verifichino simultaneamente. Questo dovuto allipotesi di
indipendenza tra gli eventi. Infatti dati due eventi A e B, usando il teorema della probabilit
composta, possibile ottenere la probabilit congiunta degli eventi:
( ) = ( | ) ( )
ovvero la probabilit che si verifichino sia A che B pari alla probabilit che si verifichi B moltiplicata
per la probabilit che si verifichi A supponendo che B sia verificato. Il termine (|) la probabilit
condizionata di A dato B e verr spiegata nel seguito.

Nel caso di alberi delle probabilit lipotesi di indipendenza porta alla seguente propriet:
(|) = () e (|) = ()
che porta quindi alla scrittura della probabilit congiunta nella forma:
( ) = ()()

1.3.2. Probabilit marginale

Il calcolo della probabilit marginale si ottiene sommando le probabilit congiunte degli eventi sulla
quale si vuole marginalizzare. Dati ad esempio due eventi B1 e B2, la probabilit dellevento A, P(A),
pu essere calcolata sommando la probabilit congiunta di A e B1 alla probabilit congiunta di A e
B2:
() = ( 1 ) + ( 2 )
dove B1 e B2 sono eventi mutuamente incompatibili e collettivamente esaustivi, ovvero se non
possono verificarsi entrambi e se almeno uno degli eventi si verifica sicuramente.

6
Creazione ed implementazioni di grafi ad albero su R

1.3.3. Probabilit condizionata

La probabilit condizionata di un evento A rispetto a un evento B la probabilit che si verifichi A


sapendo che B verificato e si indica come (|) o (). Questa esprime la modifica delle
aspettative di A dettata dallosservazione di B. La formula per il calcolo il seguente:
( )
(|) =
()
Poich nella definizione P(B) compare al denominatore, ha senso solo se B ha una probabilit non
nulla di verificarsi.

7
Creazione ed implementazioni di grafi ad albero su R

2. Implementazione grafi ad albero su R

Limplementazione dei grafi ad albero viene svolta sul programma RStudio, interfaccia grafica che
utilizza il linguaggio di programmazione R, linguaggio specifico per lanalisi statistica dei dati.2

2.1. Considerazioni generali

La corretta esecuzione degli script e la conseguente bont e affidabilit del risultato parte dalla
corretta definizione del file .csv (comma separated values separatori valori con virgola) importato
allinterno degli script.
Per lutilizzo dei seguenti script necessario importare il file csv nel seguente formato:

Elemento Nodo parente Nodo figlio Evento Probabilit condizionata

Numerico intero Numerico intero Numerico compreso tra


Tipologia Stringa
positivo positivo 0e1

Esempio 1 2 a1 0.67

In particolare:

Nodo parente e nodo figlio devono essere esplicitati con numeri interi positivi;
Gli eventi devono essere specificati nella forma:

ovvero nella forma:

evento (lettera alfabeto) - partizione (numero intero)

dove:

evento = a,b,c,,z
partizione = 0,1,2,,9

2
Per maggiori dettagli su RStudio e R vedere https://www.rstudio.com/ e https://www.r-project.org/

8
Creazione ed implementazioni di grafi ad albero su R

Le fasi possibili esplicitabili negli script sono quindi:

26 eventi
10 partizioni per evento
NB: Non sono necessarie le virgolette nella scrittura dellevento.

La probabilit condizionata come un valore numerico compreso tra 0 e 1.


possibile inserire come prima riga il nome degli eventi. Come verr specificato nel paragrafo 2.2.1
possibile comunicare allo script la presenza della prima riga con i nominativi dei dati.
Si riporta a titolo di esempio la formattazione tipo di un file .csv da importare:

Esempio 1

1, 2, a1, 0.10
1, 3, a2, 0.40
2, 4, b1, 0.45
2, 5, b2, 0.65
3, 6, b1, 0.75
3, 7, b2, 0.25

e con la prima riga contente le i nomi dei dati:

Esempio 2

nodo parente, nodo figlio, evento, prob.condizionata


1 ,2, a1, 0.10
1, 3, a2, 0.40
2, 4, b1, 0.45
2, 5, b2, 0.65
3, 6, b1, 0.75
3, 7, b2, 0.25

9
Creazione ed implementazioni di grafi ad albero su R

2.2. Creazione degli script

La creazione dei grafi ad albero ed il successivo calcolo delle probabilit congiunte, marginali e
condizionate avviene tramite la creazione di appositi script nel programma RStudio.
Gli script vengono costruiti utilizzando le funzioni della libreria Igraph, la quale offre numerosi
algoritmi per la creazione di grafi e la loro rappresentazione. 3 Pertanto per lutilizzo degli script
necessario aver installato prima la libreria igraph. Cio possibile farlo tramite listruzione
allinterno della console di RStudio:
install.packages(igraph)
Gli script vengono commentati tramite la libreria roxygen2 per una eventuale loro implementazione
in un pacchetto.4

2.2.1. Creazione dellalbero

Lo script per la creazione dellalbero il seguente:


makeTree <- function(x,header=F){
library(igraph)
if (!header){
data<-read.csv(x,header= F)
colnames(data)<-c("parentChild", "childNode", "event", "conditionalProbability")
net<-graph_from_data_frame(data)
return(net)
}
else {
data<-read.csv(x,header= T)
colnames(data)<-c("parentChild", "childNode", "event", "conditionalProbability")
net<-graph_from_data_frame(data)
return(net)
}
}

La funzione makeTree prende in ingresso due valori:

X : il file csv da importare tra virgolette, con specificata lestensione del file;
Un valore boleano True o False (anche abbreviato con T ed F) per indicare se la prima riga
contiene i nomi dei dati (True o T se la prima riga contiene i dati, False o F altrimenti). In
particolare se non viene specificato niente tale valore impostato su False.

3
Per maggiori informazioni sulla libreria igraph vedere http://igraph.org/r/
4
Per maggiori informazioni sulla libreria roxygen2 vedere https://cran.r-project.org/web/packages/roxygen2/

10
Creazione ed implementazioni di grafi ad albero su R

La specifica della funzione per la creazione dellalbero degli eventi per gli esempi sopra riportati
avviene quindi nel seguente modo:

makeTree(esempio_1.csv)

e nel caso in cui la prima riga contenesse i nomi dei dati:

makeTree(esempio_1.csv,header=True) o makeTree(esempio_1.csv,T)

Per poter utilizzare gli script successivi necessario attribuire tale funzione ad una variabile, ad
esempio:
net = makeTree(esempio_1.csv)

2.2.2. Plot dellalbero

La rappresentazione grafica dellalbero avviene tramite lutilizzo della funzione plot di R.

Lo script il seguente:

plotTree<- function (net, arrowSize = 0.2, vertexSize = 15, aspRatio = 1, labelSize = 1,


layout = layout_as_tree) {
return ( plot( net,, layout = layout, edge.arrow.size = arrowSize,
vertex.size = vertexSize, asp = aspRatio, vertex.label.cex = labelSize))
}

La funzione necessita in ingresso del parametro:

net: loutput della funzione makeTree


Gli altri parametri presenti non sono necessari allesecuzione della funzione ma permettono
laggiustamento delle impostazioni grafiche. Per una corretta visualizzazione dellalbero
necessario intervenire su detti parametri in quanto la funzione di plotting scala la
rappresentazione, e quindi variando la dimensione dellalbero necessario modificare le
impostazioni per renderlo correttamente visibile. I parametri su cui agire sono:

arrowSize: permette di modificare la dimensione delle frecce;


vertexSize: permette di modificare la dimensione dei cerchi sui nodi;

11
Creazione ed implementazioni di grafi ad albero su R

aspRatio: permette di modificare le proporzioni del grafico; valori inferiori allunit


schiacciano il grafico, valori superiori lo allungano;
labelSize: permette di modificare la dimensione delle scritte;
layout: permette la modifica della tipologia di rappresentazione del grafo.
Tali parametri sono impostati su dei valori standard. Per la modifica necessario immettere il
nome del parametro e il relativo valore, oppure solo il valore rispettando la sequenza dei
parametri.
Si riporta a titolo di esempio la creazione dellalbero per lesempio 1 visto sopra:

plotTree(net)

che forniche il seguente grafico:

Figura 6 - Plotting esempio 1

Si modifica ora la dimensione delle frecce e dei cerchi sui nodi in quanto sono piccoli:

plotTree(net, arrowSize = 0.5, vertexSize = 20)

12
Creazione ed implementazioni di grafi ad albero su R

ottenendo cos:

Figura 7 - Plotting esempio 1 variando alcuni parametri di rappresentazione

2.2.3. Probabilit congiunta

Lo script jointProb utilizza alcune funzioni della libreria igraph per la creazione della probabilit
congiunta di tutti i percorsi radice foglia. Questo codice viene sviluppato sulla base del lavoro
svolto dal Prof.Stefanini. Lo script il seguente:

jointProb <- function(net,stampa=FALSE){


nodi <- V(net)
numChildren <- degree(net,V(net), mode="out")
posizioneFoglie <- which(numChildren==0)
foglie <- nodi[posizioneFoglie]

percorsiRadiceFoglia <-lapply(foglie, function(vx){


all_shortest_paths(net, from = 1, to =vx,
mode = "all", weights=NULL)$res[[1]]
})

oggettoCongiunta<-lapply(percorsiRadiceFoglia, function(perco){
probVal<-c()
eventoAll<-""
pathEdNum<-c()
for (aux in 1:(length(perco)-1)){
coppia<-perco[c(aux,aux+1)]
indiceEdges<-get.edge.ids(net, coppia, directed=TRUE, error = FALSE, multi = FALSE);
pathEdNum<-c(pathEdNum, indiceEdges)
probVal<-c(probVal, E(net)$conditionalProbability[indiceEdges]);
evento<-E(net)$event[indiceEdges];

13
Creazione ed implementazioni di grafi ad albero su R

eventoAll<-c(eventoAll, evento);
}

result<-list(path=eventoAll[-1],
pathEdgeNum = pathEdNum,
event = paste(eventoAll[-1], collapse=" & "),
prob = prod(probVal))
return(result)
})
if(stampa){
invisible(lapply(oggettoCongiunta, function(vx){
cat(vx$event, ":prob. ", vx$prob, "\n")
return(NA)
}))
}
oggettoCongiunta
}

La funzione necessita del dato:

net: loutput della funzione makeTree

Laltro parametro in ingresso consente la stampa del risultato, ed impostato su FALSE ovvero non
stampa il risultato. Per modificarlo sufficiente scrivere TRUE o T. A titolo esemplificativo il calcolo
della probabilit congiunta degli eventi dellesempio 1 :

probCongiunta <- jointProb(net)


probCongiunta <- jointProb(net,T)

## a1 & b1 :prob. 0.045


## a1 & b2 :prob. 0.065
## a2 & b1 :prob. 0.3
## a2 & b2 :prob. 0.1

2.2.4. Probabilit marginale

Lo script margProb consente il calcolo della probabilit marginale delle fasi. Lo script il seguente:

marginalProb<-function(result,object){

numRow<-length(result)

14
Creazione ed implementazioni di grafi ad albero su R

numCol<-length(result[[1]][[1]])
events<-as.character(1:numCol)
Data <- data.frame(matrix(NA,numRow,numCol))
Data
colnames(Data)=sapply(strsplit(result[[1]][[1]],""),function(x){b<-(x[1])})

for (aux in 1:numCol){


Data[aux]<-sapply(result,function(vx){vx$path[aux]})
}

Data$pro<-sapply(result,function(vx){vx$prob})

marginale<-aggregate(Data$pro,Data[object],sum)
return(marginale)
}

La funzione necessita in ingresso di:

result: la probabilit congiunta degli eventi, ovvero loutput della funzione jointProb;
object: le fasi sulle quali marginalizzare. La loro specifica deve essere tra virgolette e se si
desidera marginalizzare su pi eventi necessario scrivere i dati in forma vettoriale.

La specifica deve quindi prevedere soltanto le fasi interessate, non comprendendo le partizioni degli
eventi. Ad esempio nel caso dellesempio 1, se si desidera marginalizzare rispetto allevento b si ha:

marginalProb(probCongiunta, "b")

## b x
## 1 b1 0.345
## 2 b2 0.165

E nel caso di marginalizzazione su pi eventi:

marginalProb(probCongiunta, c("a","b"))

## a b x
## 1 a1 b1 0.045
## 2 a2 b1 0.300
## 3 a1 b2 0.065
## 4 a2 b2 0.100

15
Creazione ed implementazioni di grafi ad albero su R

2.2.5. Probabilit condizionata

Lo script conditionalProb consente il calcolo della probabilit condizionata degli eventi. Lo script il
seguente:

conditionalProb<-function(oggetto,partA,partB){

eventA<-sapply(strsplit(partA,""),function(x){b<-(x[1])})
eventB<-sapply(strsplit(partB,""),function(x){b<-(x[1])})
eventAll<-unlist(list(eventA,(eventB)))
partAll<-unlist(list(partA,partB))

num<-marginalProb(oggetto,c(eventA,eventB))
for (aux in 1:length(partAll)){
num<-num[which(num[eventAll[aux]]==partAll[aux]),]
}
den<-marginalProb(oggetto,eventB)
for (aux in 1:length(eventB)){
den<-subset(den,den[eventB[aux]]==partB[aux])
}

result<-round(num$x/den$x,5)

cat("P(",paste(partA,collapse=","),"|",paste(partB,collapse=","),"): ",result)

return (result)
}

La funzione necessita in ingresso dei parametri:

oggetto: la probabilit congiunta degli eventi, ovvero loutput della funzione jointProb;
partA: la probabilit condizionata;
partB: la probabilit condizionante.
Le probabilit condizionate e condizionanti vanno specificate tra virgolette, e nel caso di partizioni
multiple esse vanno specificate utilizzando lelemento vettore di R.
Nel caso dellesempio 1 abbiamo, volendo calcolare la probabilit che si verifichi levento a1 dato
che levento b1 verificato la seguente:
conditionalProb(probCongiunta,"a1","b1")

## P( a1 | b1 ): 0.13043

## [1] 0.13043

16
Creazione ed implementazioni di grafi ad albero su R

3. Esempi di implementazione degli script

Vengono ora riportati degli esempi di utilizzo degli script per alcuni casi studio per evidenziare le
potenzialit e limiti di tale tipologia di calcolo. Gli esempi sono puramente didattici e hanno il solo
scopo di mostrare lutilizzo dei codici.

3.1. Esempio 1 HIV Test

Il primo esempio di implementazione del codice vuole riguardare il caso studio ampliamente
documentato e citato in letteratura dei test per rilevare la presenza del virus HIV nei pazienti.

Vengono considerati i seguenti test per verificare la presenza del virus HIV nei pazienti:

ELISA

relativamente non costoso (circa 20$) con le seguenti caratteristiche:


- sensibilit (vero positivo) = 0.93 ovvero la probabilit P (+ | HIV) che il test dia risultato positivo
(+) dato che ho il virus (HIV);
- specificit (vero negativo) = 0.99 ovvero la probabilit P( - | no HIV) che il test dia risultato negativo
(-) dato che non ho il virus(no HIV).

Western Blot (WB)

pi accurato ma pi costoso (circa 100$) con le seguenti caratteristiche:


- sensibilit (vero positivo) = 99,9
- specificit (vero negativo) = 99,1
La probabilit che una persona abbia l'HIV pu essere ricavata dagli studi in letteratura, e in via
semplificativa pu essere assunta pari 1.48/1000 ovvero P(HIV) = 0,00148.
Con questi dati possibile ora costruire l'albero delle probabilit.
Si parte dalla creazione del file csv che contiene i dati sopra riportati:

setwd("E:/Tesina/Script")
read.csv("HIV.csv",header = T)

## nodo.parente nodo.figlio evento probabilit


## 1 1 2 a1 0.00148

17
Creazione ed implementazioni di grafi ad albero su R

## 2 1 3 a2 0.99520
## 3 2 4 b1 0.93000
## 4 2 5 b2 0.07000
## 5 3 6 b1 0.01000
## 6 3 7 b2 0.99000

In questo particolare caso gli eventi sono:


- a1: il paziente ha l'HIV;
- a2: il paziente non ha l'HIV (a2 = 1 - a1);
- b1: test ELISA positivo;

- b2: test ELISA negativo.


La combinazione delle probabilit, ovvero che si ottenga o meno il risultato positivo al test dato che
il paziente ha l'HIV o meno quindi:
1. P(b1|a1) = vero positivo, ovvero P(+|HIV)
2. P(b2|a1) = falso negativo, ovvero P( -| HIV)
3. P(b1|a2) = falso positivo, ovvero P( + |no HIV)
4. P(b2|a2) = vero negativo, ovvero P( - |no HIV)

La costruzione dell'albero degli eventi, che riporta tutti le possibili combinazioni dei risultati, parte
dalla creazione del grafo ad albero tramite la funzione makeTree:

source('makeTree.R')
treeHIV <- makeTree("HIV.csv",T)

##
## Attaching package: 'igraph'

## The following objects are masked from 'package:stats':


##
## decompose, spectrum

## The following object is masked from 'package:base':


##
## union

treeHIV

## IGRAPH DN-- 7 6 --
## + attr: name (v/c), event (e/c), conditionalProbability (e/n)
## + edges (vertex names):
## [1] 1->2 1->3 2->4 2->5 3->6 3->7

18
Creazione ed implementazioni di grafi ad albero su R

Per la visualizzazione grafica si ricorre allo script plotTree che permette la rappresentazione tramite
layout ad albero:
source("plotTree.R")
plotTree(treeHIV)

Figura 8 - Albero della probabilit test ELISA

Tramite il grafo ad albero semplice calcolare la probabilit condizionata che un paziente abbia
l'HIV se il test risulta essere positivo, ovvero P(HIV|+); questa pari alla probabilit congiunta che si
verifichino entrambi le circostanze, P(HIV & +), divisa per la probabilit che il test risulti positivo,
P(+). Scritto in formula diventa:
P(HIV & +)
( |+) =
(+)
Per il calcolo della probabilit condizionata quindi necessario calcolare la probabilit congiunta e
la probabilit marginale degli eventi in questione.
La probabilit cercata quindi quella che si verifichi l'evento "a1" (avere l'HIV) dato che l'evento
"b1" verificato (test positivo Elisa), ovvero P(a1|b1).

source("jointProb.R")
source("margProb.R")
source("conditionalProb.R")
congiunta<-jointProb(treeHIV,T)

## a1 & b1 :prob. 0.0013764


## a1 & b2 :prob. 0.0001036
## a2 & b1 :prob. 0.009952
## a2 & b2 :prob. 0.985248

cond_1<-conditionalProb(congiunta,"a1","b1")

## P( a1 | b1 ): 0.1215

19
Creazione ed implementazioni di grafi ad albero su R

La probabilit di avere l'HIV dato che il primo test positivo quindi relativamente bassa, pari a
circa il 12%.
Con questo valore possibile calcolare una nuova probabilit a posteriori, in cui la probabilit di
avere l'HIV non pi pari a 0,00148 ma a 0,12.
Per eseguire il secondo test si usa i valori di sensibilit e specificit del Western Blot test (WB).

treeHIV_2 <- makeTree("HIV2.csv",T)


congiunta_2<-jointProb(treeHIV_2,T)

## a1 & b1 :prob. 0.11988


## a1 & b2 :prob. 0.00012
## a2 & b1 :prob. 0.00792
## a2 & b2 :prob. 0.87208

cond_2<-conditionalProb(congiunta_2,"a1","b1")

## P( a1 | b1 ): 0.93803

La probabilit di avere l'HIV dato che il test Elisa e WB sono risultati entrambi positivi passa adesso
a circa il 94%, molto pi alta rispetto a prima.
E' possibile formulare il problema precedente attraverso un singolo albero degli eventi. E' necessario
sottolineare che gli eventi relativi ai due test sono indipendenti, ovvero che la probabilit del
secondo test non dipende dal risultato del primo test.

treeHIV_3 <- makeTree("HIV3.csv",T)


plotTree(treeHIV_3)

Figura 9 - Albero della probabilit test ELISA e WB

20
Creazione ed implementazioni di grafi ad albero su R

congiunta_3<-jointProb(treeHIV_3,T)

## a1 & b1 & c1 :prob. 0.001375024


## a1 & b1 & c2 :prob. 1.3764e-06
## a1 & b2 & c1 :prob. 0.0001034964
## a1 & b2 & c2 :prob. 1.036e-07
## a2 & b1 & c1 :prob. 8.98668e-05
## a2 & b1 & c2 :prob. 0.009895333
## a2 & b2 & c1 :prob. 0.008896813
## a2 & b2 & c2 :prob. 0.979638

cond_3<-conditionalProb(congiunta_3,"a1",c("b1","c1"))

## P( a1 | b1,c1 ): 0.93865

Un decisore (DM) potrebbe a questo punto essere interpellato per valutare la convenienza di
eseguire il secondo test oppure no.
Il decisore quindi prender in considerazione delle azioni (A) che avranno dei risultati incerti che
avranno delle date conseguenze (chiamiamole C) corrispondenti. Una relazione di preferenza
(simboleggiata da <) esprime la preferenza del decisore tra paia di azioni.
Ad esempio a1 < a2 significa che a1 non preferita dal decisore rispetto ad a2.
Per questo calcolo utile il calcolo della Massima Utilit Attesa (MUA), che specifica le preferenze
individuali in condizioni di rischio.
Date le possibili scelte (a1 e a2 nel nostro esempio) con probabilit di realizzazione p1 e p2 il Modello
di Utilit Attesa per esprimere le preferenze ex ante relativamente alle scelte a1 e a2 :

( ) =

dove il prodotto il valore atteso dellevento, ovvero la media ponderata delle azioni con le
relative probabilit.

Nel nostro caso si prende in esame due possibili azioni e conclusioni del decisore:
- a1: fare il test Elisa al costo c1 = 20 $; se positivo conclude che il paziente ha lHIV (HIV +), se negativo
che non ha lHIV (HIV -).
- a2: stesso che nel caso a1, ma nel caso di test positivo eseguire il Western Blot test (WB) al costo
c2 = 100 $; se il WB risulta positivo conclude che il paziente ha lHIV (HIV +), se negativo conclude
che non ha lHIV (HIV -).

21
Creazione ed implementazioni di grafi ad albero su R

Con l'azione a1 la probabilit, esiti e utilit sono:

P(HIV & +) = 0,0013764 c1


P(HIV & -) = 0,0001036 c1 + L1
P(no HIV & +) = 0,009952 c2 + L2
P(no HIV & -) = 0,985248 c2

dove le possibili conseguenze sono:

c1 = costo test Elisa;


c1 + L1 = costo test Elisa + costo falso negativo;
c1 + L2 = costo test Elisa + costo falso positivo;
c1 = costo test Elisa.

I falsi negativi e falsi positivi (L1 e L2) comportano danni al paziente con conseguenti risarcimenti,
specialmente nel caso di falso negativo (L1). Il loro valore va stimato accuratamente e dipende da
molti fattori.

L'utilit attesa quindi:

E1 = 0,0013(c1) + 0,0001(c1 + L1) + 0,0099(c1 + L2) + 0,9852(c1) = c1 + 0,0001L1 + 0,0099L2

Il secondo caso valuta il caso in cui viene eseguito il secondo test e fornisce la seguente probabilit
congiunta degli eventi con le relative conseguenze:

P(HIV & + & +) = 0,001375024 c1 + c2


P(HIV & + & -) = 1,3764e-06 c1 + c2 + L1

P(HIV & - & +) = 0,0001034964 c1 + L1


P(HIV & - & -) = 1,036e-07 c1 + L1
P(no HIV & + & +) = 8,98668e-05 c1 + c2 + L2
P(no HIV & + & -) = 0,009895333 c1 + c2
P(no HIV & - & +) = 0,008896813 c1

22
Creazione ed implementazioni di grafi ad albero su R

P(no HIV & - & +) = 0,979638 c1

L'utilit attesa in questo caso :

E2 = 0,0013(c1 + c2) + ... + (c1)

Secondo il criterio della MAU il decisore dovrebbe scegliere lo scenario a 2 rispetto all'a1 se E2 > E1,
ovvero se:

0,009862133(L2) 4,9764e-06(L1) 0,01136(c2) > 0

Quindi lo scenario a2 diventa pi desiderabile quanto pi il risarcimento per il falso positivo (L 2)


cresce e quello per il falso negativo (L1) decresce e meno desiderabile quanto pi il costo del secondo
test aumenta.
Essendo il risarcimento per il falso negativo molto maggiore rispetto a quello per il falso positivo
possibile calcolare il valore per il quale lo scenario a2 vantaggioso rispetto allo scenario a1
assumendo ad esempio un risarcimento per il falso positivo (L 1) pari a 1000$ e il costo del WB test
(c2) pari a 100$:

0,009862133 2 0,01136(c2)
1 < =
4.9764e 06
0,009862133 1000 0,01136 100
= < 1.753.503 $
4.9764e 06

Il decisore quindi portato ad optare per lo scenario a2 finch il risarcimento per il falso negativo
(L1) minore di 1.753.503 $, assumendo che il risarcimento per il falso positivo (L2) sia pari a 1000$
e il WB test costi 100$. Inoltre maggiore il costo del falso positivo, maggiore sar la convenienza
dello scenario a2.

23
Creazione ed implementazioni di grafi ad albero su R

3.2. Esempio 2

Nel secondo esempio viene preso il caso generico di una azienda che dispone dei seguenti dati:
5. Utili anno precedente: negativo, nullo, basso - positivo, medio - positivo, alto - positivo;
6. Investimento pubblicitario: nullo, basso, medio, alto;
7. Prezzo unitario del prodotto: molto basso, basso, medio, alto;
8. Fatturato azienda: basso, medio, alto, molto - alto.
Si suppone in particolare che lazienda abbia a disposizione le probabilit condizionate degli eventi
sopra riportati.
Si assume per che i dati siano indipendenti tra loro, ovvero che il fatturato dellazienda dipenda
solo dal prezzo unitario, il prezzo unitario dipenda solo dallinvestimento pubblicitario e che
linvestimento pubblicitario dipenda solo dallutile dellanno precedente.
Richiamando gli eventi con la notazione utile allimplementazione nello script, gli eventi sopra
riportati diventano:
9. 1fase Utili anno precedente: a1, a2, a3, a4, a5
10. 2fase Investimento pubblicitario: b1, b2, b3, b4
11. 3fase Prezzo unitario del prodotto: c1, c2, c3, c4
12. 4fase Fatturato azienda: d1, d2, d3, d4
Viene creato un file .csv assegnando delle probabilit inventate ma plausibili per la creazione del
grafo ad albero. Si riporta negli allegati il data frame utilizzato per questo caso studio.
Quello che ne risulta :

24
Creazione ed implementazioni di grafi ad albero su R

Figura 10 - Albero della probabilit esempio 2

25
Creazione ed implementazioni di grafi ad albero su R

Il grafico difficilmente leggibile dato il numero elevato di archi, anche cercando di modificare le
impostazioni di plottaggio in modo ottimale.
Utilizzando gli script un decisore pu rispondere ad esempio alla domanda quale la probabilit
che lo scorso anno abbia avuto utili medio - positivo oppure alto - positivo ?

esempio2 <- makeTree("esempio2.csv",T)


congiunta2 <- jointProb(esempio2)
marginale2 <- marginalProb(congiunta2,"d")
marginale2

## d x
## 1 d1 0.465
## 2 d2 0.330
## 3 d3 0.137
## 4 d4 0.098

Quindi la probabilit di avere un utile medio positivo pari al 33% e di averlo alto positivo del
13,7%.

possibile rispondere anche a domande del tipo:

1. Qual la probabilit che abbia avuto utili negativi dato che linvestimento in pubblicit stato
nullo?

conditionalProb(congiunta2,"a1","b1")

## P( a1 | b1 ): 0.17423

2. Qual la probabilit che abbia un investimento alto nella pubblicit dato che il fatturato
basso?

conditionalProb(congiunta2,"b4","d1")

## P( b4 | d1 ): 0.1241

3. Qual la probabilit che il prezzo del prodotto sia alto dato che il fatturato stato alto?

conditionalProb(congiunta2,"c4","d4")

## P( c4 | d4 ): 0.45918

26
Creazione ed implementazioni di grafi ad albero su R

4. Conclusioni e sviluppi

Il processo decisionale un processo intrinsecamente soggettivo, sebbene si disponga di dati da


esperimenti ben designati, si disponga di analisi simili e giudizi di esperti analisti.
Nei processi decisionali pi complicati, la spiegazione dei processi sottostanti, le conseguenze e lo
spazio delle decisioni possibili presentano delle strutture complicate, difficilmente affrontabili
mediante i metodi tradizionali. Per calcolare la soluzione ottimale si ricorre spesso allutilizzo della
regola di Bayes per invertire la direzionalit del condizionamento, seguendo cos lordine temporale
con cui il decisore diviene consapevole dellinformazione.
Nellapproccio Bayesiano il giudizio iniziale dettato dallesperienza o da informazioni pervenute
(probabilit a-priori), viene modificato in seguito alla conoscenza (probabilit condizionate) dei dati
per ottenere un nuovo giudizio (probabilit a-posteriori).
Il decisore si trova spesso in una condizione di incertezza, in condizioni di dover prendere delle
decisioni e non sapere bene le possibili conseguenze. Queste possono essere espresse mediante
una distribuzione di probabilit condizionata sullo stato di conoscenza e sulle decisioni prese. Il
valore delle conseguenze pu essere cos misurato attraverso un parametro, definito funzione di
utilit, il quale esprime le preferenza nelle possibili conseguenze. In questo modo una conseguenza
migliore di unaltra se ha unutilit pi alta, e per estensione la migliore decisione quindi quella
che massimizza lutilit attesa. Laggiunta della funzione di utilit per le conseguenze, combinata
con la probabilit relativa allincertezza porta alla soluzione del problema decisionale. Il decisore
dovrebbe essere quindi incoraggiato nello scegliere una decisione che massimizzi lutilit attesa.
Questo non lo aiuta solamente nello scegliere con maggior consapevolezza, ma crea anche uno
strumento con il quale il decisore pu spiegare le proprie scelte.
Assodato che lincertezza dovrebbe essere descritta dal calcolo probabilistico, che le conseguenze
dovrebbero essere espresse mediante la loro utilit e che la decisione ottimale quella che
massimizza la funzione di utilit, gli alberi delle probabilit risultano dei validi strumenti in mano al
decisore in quanto il loro potenziale risiede nella facilit di visualizzare tutte le possibili diramazioni
che derivano dalle possibili scelte e/o conseguenze derivanti da una situazione iniziale. Attribuendo
delle probabilit condizionate agli eventi inoltre possibile valutare la probabilit associata a
ciascun risultato, espressa su ciascuna foglia dellalbero mediante un numero compreso tra zero e
uno, e calcolare in questo modo la probabilit congiunta degli eventi come il prodotto delle
probabilit condizionate nei rispettivi cammini radice-foglia. Marginallizzando le probabilit
congiunte poi possibile ricavare la probabilit condizionata degli eventi, ottenendo cos la
reversibilit del condizionamento utile per dedurre le probabilit a-posteriori nellottica Bayesiana,
ovvero la modificazione della probabilit iniziali in seguito alla conoscenza dei dati.
Da qui deriva il vantaggio di poter disporre di uno strumento automatizzato per la creazione di alberi
delle probabilit sotto forma di uno script che semplifichi lelicitazione e la rappresentazione del
problema.

Gli script creati nel seguente lavoro nellambiente RStudio utilizzano il linguaggio di
programmazione R, ed in particolare utilizzano la potenzialit e le funzionalit del pacchetto igraph
che consente di poter creare grafi di varie tipologie. Gli script sono divisi per la loro utilit e seguono
un ordine di esecuzione derivante dalla successione delle operazioni svolte. Questi sono:
- makeTree
- plotTree
- jointProb

27
Creazione ed implementazioni di grafi ad albero su R

- marginalProb
- conditionalProb

In ordine, gli script consentono di poter creare un oggetto igraph necessario per la creazione
dellalbero a partire da un file csv opportunamente creato; il plottaggio sotto forma di albero
delloggetto; la creazione della probabilit congiunta di ogni percorso radice-foglia; la creazione
della probabilit marginale a partire dalla probabilit congiunta; la creazione della probabilit
condizionata utilizzando la probabilit congiunta e quella marginale.

Le potenzialit di un tale strumento nelle mani del decisore riguardano principalmente:


- Facilit di lettura del diagramma ad albero da parte dellutilizzatore, con lesplicitazione di
tutti i possibili risultati per ogni evento-azione rappresentati dai cammini radice-foglia;
- Rappresentazione immediata di tutti gli sviluppi del processo, con visualizzazione diretta di
ogni svolgimento sequenziale degli eventi;
- Rapido calcolo della probabilit condizionata degli eventi, il che permette anche la modifica
delle probabilit a-priori assegnata ai casi studio e in generale una modifica della probabilit
precedentemente assegnate agli eventi.
I limiti riguardano principalmente:
- La creazione manuale di un file csv, specialmente se di grandi dimensioni, rende complicato
linserimento dei dati, aumentando la probabilit di un possibile errore;
- Lipotesi di indipendenza condizionale degli eventi restrittiva;
- Nel caso di casistiche complesse, loutput di tali script diventa difficilmente leggibile,
perdendo cos una delle peculiarit di tale metodo, ovvero la facilit di lettura del processo;
- Ad ogni ulteriore partizione, la probabilit congiunta diventa sempre pi piccola; nel caso di
un numero elevato di eventi si pu occorrere in problemi numerici di arrotondamento e
troncamento, ottenendo cos una predizione non accurata.

Si vuole sottolineare come tali script siano una versione base per la creazione di alberi delle
probabilit e calcolo delle condizionate, e come con successivi sviluppi e integrazioni del codice sia
possibile migliorare o perfino eliminare molti dei limiti sopra esposti.
Molti di questi limiti sono stati superati attraverso limplementazione di altre funzioni, qui non
svolte, come la creazione di file csv tramite script appositi, la possibilit di poter ingrandire larea
di interesse nel caso di alberi di elevate dimensioni, etc... In particolare lutilizzo di altri metodi come
quelli di reti Bayesiane, di grafi multipli e reti neurali risultano estendere maggiormente le
potenzialit di tali strumenti per una maggiore affidabilit dei risultati e aiuto nel processo
decisionale.
Gli script oggetto di tale tesi possono facilmente essere integrati allinterno di una apposita libreria
su R, ampliando le loro potenzialit attraverso la creazione di ulteriori funzioni che superino gli
attuali limiti, rendendosi in questo modo pi facilmente e velocemente utilizzabili e rivelandosi cos
degli ottimi ausili nelle mani del decisore.

28
5. Bibliografia

Giacci, M., Appunti Laboratorio di Algoritmi e Strutture Dati, 2012, Universit degli Studi del Molise
Wikipedia, Albero (grafo), https://it.wikipedia.org/wiki/Albero_(grafo).
Jim Q. Smith, Bayesian Decision Analysis: Principles and Practice, 2000, Department of Statistics,
University of Warwick, Coventry CV4 7AL UK
Dennis V.Lindley, The Philosophy of statistics, 2000, The Statistician, 49, part 3, pp.293-337
R - https://www.r-project.org/
RStudio - https://www.rstudio.com/

Libreria Igraph - http://igraph.org/r/


6. Allegati
Data frame esempio 2

1,"2","a1","0.08" 11,"45","c3","0.15" 22,"88","c2","0.3" 33,"131","d1","0.3"


1,"3","a2","0.2" 11,"46","c4","0.15" 22,"89","c3","0.15" 33,"132","d2","0.5"
1,"4","a3","0.45" 12,"47","c1","0.4" 22,"90","c4","0.15" 33,"133","d3","0.1"
1,"5","a4","0.18" 12,"48","c2","0.3" 23,"91","c1","0.4" 33,"134","d4","0.1"
1,"6","a5","0.09" 12,"49","c3","0.15" 23,"92","c2","0.3" 34,"135","d1","0.2"
2,"7","b1","0.6" 12,"50","c4","0.15" 23,"93","c3","0.15" 34,"136","d2","0.2"
2,"8","b2","0.3" 13,"51","c1","0.4" 23,"94","c4","0.15" 34,"137","d3","0.3"
2,"9","b3","0.08" 13,"52","c2","0.3" 24,"95","c1","0.4" 34,"138","d4","0.3"
2,"10","b4","0.02" 13,"53","c3","0.15" 24,"96","c2","0.3" 35,"139","d1","0.6"
3,"11","b1","0.35" 13,"54","c4","0.15" 24,"97","c3","0.15" 35,"140","d2","0.3"
3,"12","b2","0.4" 14,"55","c1","0.4" 24,"98","c4","0.15" 35,"141","d3","0.08"
3,"13","b3","0.2" 14,"56","c2","0.3" 25,"99","c1","0.4" 35,"142","d4","0.02"
3,"14","b4","0.05" 14,"57","c3","0.15" 25,"100","c2","0.3" 36,"143","d1","0.5"
4,"15","b1","0.25" 14,"58","c4","0.15" 25,"101","c3","0.15" 36,"144","d2","0.35"
4,"16","b2","0.45" 15,"59","c1","0.4" 25,"102","c4","0.15" 36,"145","d3","0.15"
4,"17","b3","0.22" 15,"60","c2","0.3" 26,"103","c1","0.4" 36,"146","d4","0.1"
4,"18","b4","0.08" 15,"61","c3","0.15" 26,"104","c2","0.3" 37,"147","d1","0.3"
5,"19","b1","0.2" 15,"62","c4","0.15" 26,"105","c3","0.15" 37,"148","d2","0.5"
5,"20","b2","0.25" 16,"63","c1","0.4" 26,"106","c4","0.15" 37,"149","d3","0.1"
5,"21","b3","0.35" 16,"64","c2","0.3" 27,"107","d1","0.6" 37,"150","d4","0.1"
5,"22","b4","0.2" 16,"65","c3","0.15" 27,"108","d2","0.3" 38,"151","d1","0.2"
6,"23","b1","0.1" 16,"66","c4","0.15" 27,"109","d3","0.08" 38,"152","d2","0.2"
6,"24","b2","0.15" 17,"67","c1","0.4" 27,"110","d4","0.02" 38,"153","d3","0.3"
6,"25","b3","0.3" 17,"68","c2","0.3" 28,"111","d1","0.5" 38,"154","d4","0.3"
6,"26","b4","0.45" 17,"69","c3","0.15" 28,"112","d2","0.35" 39,"155","d1","0.6"
7,"27","c1","0.4" 17,"70","c4","0.15" 28,"113","d3","0.15" 39,"156","d2","0.3"
7,"28","c2","0.3" 18,"71","c1","0.4" 28,"114","d4","0.1" 39,"157","d3","0.08"
7,"29","c3","0.15" 18,"72","c2","0.3" 29,"115","d1","0.3" 39,"158","d4","0.02"
7,"30","c4","0.15" 18,"73","c3","0.15" 29,"116","d2","0.5" 40,"159","d1","0.5"
8,"31","c1","0.4" 18,"74","c4","0.15" 29,"117","d3","0.1" 40,"160","d2","0.35"
8,"32","c2","0.3" 19,"75","c1","0.4" 29,"118","d4","0.1" 40,"161","d3","0.15"
8,"33","c3","0.15" 19,"76","c2","0.3" 30,"119","d1","0.2" 40,"162","d4","0.1"
8,"34","c4","0.15" 19,"77","c3","0.15" 30,"120","d2","0.2" 41,"163","d1","0.3"
9,"35","c1","0.4" 19,"78","c4","0.15" 30,"121","d3","0.3" 41,"164","d2","0.5"
9,"36","c2","0.3" 20,"79","c1","0.4" 30,"122","d4","0.3" 41,"165","d3","0.1"
9,"37","c3","0.15" 20,"80","c2","0.3" 31,"123","d1","0.6" 41,"166","d4","0.1"
9,"38","c4","0.15" 20,"81","c3","0.15" 31,"124","d2","0.3" 42,"167","d1","0.2"
10,"39","c1","0.4" 20,"82","c4","0.15" 31,"125","d3","0.08" 42,"168","d2","0.2"
10,"40","c2","0.3" 21,"83","c1","0.4" 31,"126","d4","0.02" 42,"169","d3","0.3"
10,"41","c3","0.15" 21,"84","c2","0.3" 32,"127","d1","0.5" 42,"170","d4","0.3"
10,"42","c4","0.15" 21,"85","c3","0.15" 32,"128","d2","0.35" 43,"171","d1","0.6"
11,"43","c1","0.4" 21,"86","c4","0.15" 32,"129","d3","0.15" 43,"172","d2","0.3"
11,"44","c2","0.3" 22,"87","c1","0.4" 32,"130","d4","0.1" 43,"173","d3","0.08"
43,"174","d4","0.02" 55,"221","d3","0.08" 67,"268","d2","0.3" 79,"315","d1","0.6"
44,"175","d1","0.5" 55,"222","d4","0.02" 67,"269","d3","0.08" 79,"316","d2","0.3"
44,"176","d2","0.35" 56,"223","d1","0.5" 67,"270","d4","0.02" 79,"317","d3","0.08"
44,"177","d3","0.15" 56,"224","d2","0.35" 68,"271","d1","0.5" 79,"318","d4","0.02"
44,"178","d4","0.1" 56,"225","d3","0.15" 68,"272","d2","0.35" 80,"319","d1","0.5"
45,"179","d1","0.3" 56,"226","d4","0.1" 68,"273","d3","0.15" 80,"320","d2","0.35"
45,"180","d2","0.5" 57,"227","d1","0.3" 68,"274","d4","0.1" 80,"321","d3","0.15"
45,"181","d3","0.1" 57,"228","d2","0.5" 69,"275","d1","0.3" 80,"322","d4","0.1"
45,"182","d4","0.1" 57,"229","d3","0.1" 69,"276","d2","0.5" 81,"323","d1","0.3"
46,"183","d1","0.2" 57,"230","d4","0.1" 69,"277","d3","0.1" 81,"324","d2","0.5"
46,"184","d2","0.2" 58,"231","d1","0.2" 69,"278","d4","0.1" 81,"325","d3","0.1"
46,"185","d3","0.3" 58,"232","d2","0.2" 70,"279","d1","0.2" 81,"326","d4","0.1"
46,"186","d4","0.3" 58,"233","d3","0.3" 70,"280","d2","0.2" 82,"327","d1","0.2"
47,"187","d1","0.6" 58,"234","d4","0.3" 70,"281","d3","0.3" 82,"328","d2","0.2"
47,"188","d2","0.3" 59,"235","d1","0.6" 70,"282","d4","0.3" 82,"329","d3","0.3"
47,"189","d3","0.08" 59,"236","d2","0.3" 71,"283","d1","0.6" 82,"330","d4","0.3"
47,"190","d4","0.02" 59,"237","d3","0.08" 71,"284","d2","0.3" 83,"331","d1","0.6"
48,"191","d1","0.5" 59,"238","d4","0.02" 71,"285","d3","0.08" 83,"332","d2","0.3"
48,"192","d2","0.35" 60,"239","d1","0.5" 71,"286","d4","0.02" 83,"333","d3","0.08"
48,"193","d3","0.15" 60,"240","d2","0.35" 72,"287","d1","0.5" 83,"334","d4","0.02"
48,"194","d4","0.1" 60,"241","d3","0.15" 72,"288","d2","0.35" 84,"335","d1","0.5"
49,"195","d1","0.3" 60,"242","d4","0.1" 72,"289","d3","0.15" 84,"336","d2","0.35"
49,"196","d2","0.5" 61,"243","d1","0.3" 72,"290","d4","0.1" 84,"337","d3","0.15"
49,"197","d3","0.1" 61,"244","d2","0.5" 73,"291","d1","0.3" 84,"338","d4","0.1"
49,"198","d4","0.1" 61,"245","d3","0.1" 73,"292","d2","0.5" 85,"339","d1","0.3"
50,"199","d1","0.2" 61,"246","d4","0.1" 73,"293","d3","0.1" 85,"340","d2","0.5"
50,"200","d2","0.2" 62,"247","d1","0.2" 73,"294","d4","0.1" 85,"341","d3","0.1"
50,"201","d3","0.3" 62,"248","d2","0.2" 74,"295","d1","0.2" 85,"342","d4","0.1"
50,"202","d4","0.3" 62,"249","d3","0.3" 74,"296","d2","0.2" 86,"343","d1","0.2"
51,"203","d1","0.6" 62,"250","d4","0.3" 74,"297","d3","0.3" 86,"344","d2","0.2"
51,"204","d2","0.3" 63,"251","d1","0.6" 74,"298","d4","0.3" 86,"345","d3","0.3"
51,"205","d3","0.08" 63,"252","d2","0.3" 75,"299","d1","0.6" 86,"346","d4","0.3"
51,"206","d4","0.02" 63,"253","d3","0.08" 75,"300","d2","0.3" 87,"347","d1","0.6"
52,"207","d1","0.5" 63,"254","d4","0.02" 75,"301","d3","0.08" 87,"348","d2","0.3"
52,"208","d2","0.35" 64,"255","d1","0.5" 75,"302","d4","0.02" 87,"349","d3","0.08"
52,"209","d3","0.15" 64,"256","d2","0.35" 76,"303","d1","0.5" 87,"350","d4","0.02"
52,"210","d4","0.1" 64,"257","d3","0.15" 76,"304","d2","0.35" 88,"351","d1","0.5"
53,"211","d1","0.3" 64,"258","d4","0.1" 76,"305","d3","0.15" 88,"352","d2","0.35"
53,"212","d2","0.5" 65,"259","d1","0.3" 76,"306","d4","0.1" 88,"353","d3","0.15"
53,"213","d3","0.1" 65,"260","d2","0.5" 77,"307","d1","0.3" 88,"354","d4","0.1"
53,"214","d4","0.1" 65,"261","d3","0.1" 77,"308","d2","0.5" 89,"355","d1","0.3"
54,"215","d1","0.2" 65,"262","d4","0.1" 77,"309","d3","0.1" 89,"356","d2","0.5"
54,"216","d2","0.2" 66,"263","d1","0.2" 77,"310","d4","0.1" 89,"357","d3","0.1"
54,"217","d3","0.3" 66,"264","d2","0.2" 78,"311","d1","0.2" 89,"358","d4","0.1"
54,"218","d4","0.3" 66,"265","d3","0.3" 78,"312","d2","0.2" 90,"359","d1","0.2"
55,"219","d1","0.6" 66,"266","d4","0.3" 78,"313","d3","0.3" 90,"360","d2","0.2"
55,"220","d2","0.3" 67,"267","d1","0.6" 78,"314","d4","0.3" 90,"361","d3","0.3"
90,"362","d4","0.3" 95,"379","d1","0.6" 99,"396","d2","0.3" 103,"413","d3","0.08"
91,"363","d1","0.6" 95,"380","d2","0.3" 99,"397","d3","0.08" 103,"414","d4","0.02"
91,"364","d2","0.3" 95,"381","d3","0.08" 99,"398","d4","0.02" 104,"415","d1","0.5"
91,"365","d3","0.08" 95,"382","d4","0.02" 100,"399","d1","0.5" 104,"416","d2","0.35"
91,"366","d4","0.02" 96,"383","d1","0.5" 100,"400","d2","0.35" 104,"417","d3","0.15"
92,"367","d1","0.5" 96,"384","d2","0.35" 100,"401","d3","0.15" 104,"418","d4","0.1"
92,"368","d2","0.35" 96,"385","d3","0.15" 100,"402","d4","0.1" 105,"419","d1","0.3"
92,"369","d3","0.15" 96,"386","d4","0.1" 101,"403","d1","0.3" 105,"420","d2","0.5"
92,"370","d4","0.1" 97,"387","d1","0.3" 101,"404","d2","0.5" 105,"421","d3","0.1"
93,"371","d1","0.3" 97,"388","d2","0.5" 101,"405","d3","0.1" 105,"422","d4","0.1"
93,"372","d2","0.5" 97,"389","d3","0.1" 101,"406","d4","0.1" 106,"423","d1","0.2"
93,"373","d3","0.1" 97,"390","d4","0.1" 102,"407","d1","0.2" 106,"424","d2","0.2"
93,"374","d4","0.1" 98,"391","d1","0.2" 102,"408","d2","0.2" 106,"425","d3","0.3"
94,"375","d1","0.2" 98,"392","d2","0.2" 102,"409","d3","0.3" 106,"426","d4","0.3"
94,"376","d2","0.2" 98,"393","d3","0.3" 102,"410","d4","0.3"
94,"377","d3","0.3" 98,"394","d4","0.3" 103,"411","d1","0.6"
94,"378","d4","0.3" 99,"395","d1","0.6" 103,"412","d2","0.3"