miércoles, 23 de octubre de 2024

Funciones. Estadística.

Puntuaciones estandarizadas (Z)

Las puntuaciones estandarizadas o tipificadas o simplemente puntuaciones Z son otros estadísticos que requieren del conocimiento previo de la media (promedio) y de la desviación típica (Dt). En vez de orientarse al análisis descriptivo de los datos, se orientan al análisis de los resultados individuales, aunque en términos de referencia a la norma (normalización estadística), lo que supone, a su vez, referencia a la curva de distribución "normal".


En términos de programación, en este caso, aunque contamos con una función Calc que [nos permite realizar estos cálculos] (1), el uso de OOo Basic nos aporta ventajas en el cálculo (y el análisis) de estas puntuaciones, aunque para ello deberemos integrar la función de cálculo de las puntuaciones Z en un procedimiento general de trabajo con el conjunto de datos, cosa que queda pendiente, ya que sobrepasa los objetivos de esta entrada. 

En ella me limitaré a desarrollar una función que calcule estos valores, pero, como no puede ser de otra manera en esta ocasión, será necesario acompañar la explicación de la función (fPntZ()) con la del script desde el que se la llama, adelantando hasta donde es imprescindible, lo que corresponde al desarrollo del procedimiento de trabajo.

Sub DtDatos

'Variables

Dim mNotas() As Integer
Dim vMed As Double, vDt As Double
Dim mPuntZ() As Double
Dim i As Integer

'Contenido de las matrices

mNotas() = Array(0,0,0,1,1,1,1,2,2,2,2,2,2,2,3,3,3,3,3,4,4,4,4,5,5,6,6,6,6,6,6,7,7,7,8,8,8,9,9,9,9,9,9,9,9,9,9,9,10,10,10,10,10)
ReDim mPuntZ(UBound(mNotas()))

'Llamadas a funciones

vMed =fMedia(mNotas())
vDt = fDesTip(mNotas())
mPuntZ() = fPntZ(vMed,vDt,mNotas())

'Mostrar resultados

MsgBox "Valor de la media de la muestra: " & CStr(vMed)
MsgBox "Valor de la desviación típica de la muestra:  " & CStr(vDt)

For i = 0 To UBound(mPuntZ())
MsgBox "Puntuación directa (PD)  " & CStr(mNotas(i)) & Chr(13) & "Puntuación típica (Z) " & CStr(mPuntZ(i))
Next

End Sub

En el script deberemos contar con las variables y matrices necesarias para contender los datos del promedio (vMed), la Dt (vDt), las puntuaciones directas (PD) (mNotas()) y las puntuaciones Z (pZ) (mPuntZ()).

Por agilizar la ejemplificación, se recogen las PD mediante un array para completar la matriz correspondiente (mNotas()) y se dimensiona la matriz de las pZ en base al tamaño de esa matriz (ReDim mPuntZ(UBound(mNotas()))).

Posteriormente se llaman a las funciones de cálculo de la media (vMed =fMedia(mNotas())), la Dt (vDt = fDesTip(mNotas())) y las pZ (mPuntZ() = fPntZ(vMed,vDt,mNotas())) (2).

Para finalizar, y por mostrar los resultados y comprobar el funcionamiento del script y de las funciones, hago uso de la función MsgBox() para mostrar los resultados parciales (v.g. MsgBox "Valor de la media de la muestra: " & CStr(vMed)) y final, éste mediante un ciclo (For i = 0 To UBound(mPuntZ())) que recorre ambas matrices y muestra los valores PD y pZ, también mediante MsgBox().

En cuanto a la función mPuntZ() propiamente dicha...

Function fPntZ(pMed As Double, pDt As Double, pPD() As Object) As Object

Dim i As Integer
Dim mNormalizar() As Double

ReDim mNormalizar(UBound(pPD()))

For i = 0 To UBound(pPD())
mNormalizar(i) = (pPD(i)-pMed)/pDt
Next

fPntZ = mNormalizar()

End Function

... cuenta con tres parámetros (fPntZ(pMed As Double, pDt As Double, pPD() As Object) As Object), motivo por el que debe recibirlos desde el script (mPuntZ() = fPntZ(vMed,vDt,mNotas())), para lo que antes de ser llamada deben haberlo sido las funciones que aportan los datos que son requeridos (3). Obsérvese que el último de estos parámetros se define en la función como de tipo Object (pPD() As Object), al igual que la propia función.

Además de estos tres parámetros, fPntZ() precisa una variable contador (Dim i As Integer) y una matriz de trabajo (Dim mNormalizar() As Double), que será la que reciba el resultado de los cálculos. Dado que no podemos dimensionarla en el momento de su declaración (4) lo hacemos a posteriori sobre el dato que nos aporta la función UBound() aplicada sobre la matriz-parámetro (ReDim mNormalizar(UBound(pPD()))).

Lo que resta es recorrer la matriz-parámetro (que contiene los datos de las PD) mediante un bucle (For i = 0 To UBound(pPD())) para asignar a la matriz de trabajo el resultado de la fórmula de cálculo de la pZ [ver aquí] (mNormalizar(i) = (pPD(i)-pMed)/pDt) y retornar la matriz como resultante de la función (fPntZ = mNormalizar()). Mediante este procedimiento podemos realizar el cálculo de pZ de un amplico conjunto de datos de una sola vez (5).

En cierto modo, y al margen del interés que tienen los datos que aporta esta función, en términos de programación, también nos interesa por ser expresión de un procedimiento de trabajo en el que devolvemos como resultado de la función una matriz de datos numérica, complementaria y paralela a la matriz originaria.

NOTAS

(1) En esta entrada se expone también la explicación de las puntuaciones normalizadas. Se recomienda su lectura.
(2) Obsérvese que es el script el encargado de utilizar estas funciones, lo que implica un planteamiento modular. Dado que las funciones fMedia() fDesTip() ya han sido explicadas, no corresponde hacerlo ahora; sí la nueva función fPntZ()  que explicaré a continuación, por lo que será necesario volver sobre este punto del desarrollo del script.
(3) Me refiero al valor Promedio y Dt que aportan las funciones correspondientes, citadas también en la nota 2.
(4) Por un motivo obvio: desconocemos el tamaño de la matriz que contiene los datos de las PD y que es pasada como parámetro desde el script (en nuestro caso mNotas() -> pPD() As Object), siendo necesario que ambas tengan el mismo número de elementos.
(5) Lo que, en términos de automatización del proceso, supone una ventaja respecto al uso de la función Calc.

No hay comentarios:

Publicar un comentario

Comenta esta entrada