Se può esserti utile ti allego un codice che implementa la distribuzione normale cumulativa (equivalente alla funzione DISTRIB.NORM di Excel) in modo che la puoi utilizzare direttamente in Access (anche all'interno di una query) senza la necessità di ulteriori elementi.
'**************************************************************************
'
' Funzione DistribuzioneNormaleCumulativa (distribuzione normale cumulativa)
'
' La funzione calcola la disrtibuzione normale dato il valore x stabito da:
' x = (valore - media) / deviazione_standard
' NB Risulta un calcolo più efficiente rispetto ad altri algoritmi
' Fornendo un insieme di valori nell'intervallo dei valori osservati
' è possibile visionare e disegnare un grafico ottenendo
' la distribuzione normale cumulativa
'
' Uso:
' ? NormDist5c( -0,267261241912424 )
' risultato = 0,39460950636226
' ? NormDist5c( 0,801783725737273 )
' risultato = 0,788672299397473
' ? NormDist5c(1.64)
' risultato = 0,949499538787703
'
' Equivalente alla funzione disponibile in Excel
' =DISTRIB.NORM(IntervalloCelle; MediaCelle; DeviazioneStandardCelle; VERO)
'***********************************************************************
Public Function DistribuzioneNormaleCumulativa(x As Double) As Double
Dim T As Double, F As Double, Phi As Double
Const p = 0.23164 ' Angolo seno2 (0.23148 ± 0.00016)
Const c1 = 0.31938 ' Coefficienti precalcolati
Const c2 = -0.35655
Const c3 = 1.7814
Const c4 = -1.8212
Const c5 = 1.3302
Const E1 = 2.718282 ' Base logaritmo naturale, costante E uguale a 2,71828182845904
Const PI = 3.14159265358979 ' PI greco
T = 1 / (1 + p * Abs(x))
F = 1 / Sqr(2 * PI) * E1 ^ (-x ^ 2 / 2)
Phi = 1 - F * (c1 * T + c2 * T ^ 2 + c3 * T ^ 3 + c4 * T ^ 4 + c5 * T ^ 5)
' Valuta in quale parte della curva gaussiana (vista la simmetria) ricade il valore
' della distribuzione, per cui avremo la probabilità (Phi) nei valori 0 - 0,5 e 0,5 - 1.
If x > 0 Then
DistribuzioneNormaleCumulativa = Phi
Else
DistribuzioneNormaleCumulativa = 1 - Phi
End If
End Function
Per l'impiego, ad esempio, se abbiamo una tabella ("Dati") con i campi "Apparato" (testo) e "Valore" (numerico) in cui vogliamo la distribuzione normale cumulativa, è sufficiente, per prima cosa, realizzare una query per determinare la media e la deviazione standard del campo "Valore", per ciascun "Apparato":
SELECT Dati.Apparato, Avg(Dati.Valore) AS Media, StDev(Dati.Valore) AS DeviazioneStd
FROM Dati
GROUP BY Dati.Apparato;
Denominiamo la succitata query "QueryDatiMediaDevStd".
Realizziamo una nuova query che abbia la tabella originaria ("Dati") e la query precedente "QueryDatiMediaDevStd" ponendoli in relazione (INNER JOIN) tramite il campo comune "Apparato", con il campo su cui si vuole effettuare la distribuzione ("Valore"), quindi si inseriscono gli elementi calcolati di "Media" e "DeviazioneStd" e come ultimo elemento la funzione citata inizialmente "DistribuzioneNormaleCumulativa" (già posta in un modulo) fornendo come parametro la differenza fra [Valore] - [Media] in rapporto alla deviazione standard [DeviazioneStd]) implementando una similare query SQL:
SELECT Dati.Apparato, Dati.Valore, QueryDatiMediaDevStd.Media,
QueryDatiMediaDevStd.DeviazioneStd,
DistribuzioneNormaleCumulativa( ([Valore] - [Media]) / [DeviazioneStd]) AS DistrNormCum
FROM Dati
INNER JOIN QueryDatiMediaDevStd
ON Dati.Apparato = QueryDatiMediaDevStd.Apparato;
In tal modo si potrà valutare (direttamente in SQL, tramite anche l'interfaccia QBE) la distribuzione normale cumulativa di ciascun elemento.