Mostrando entradas con la etiqueta Normalización. Mostrar todas las entradas
Mostrando entradas con la etiqueta Normalización. Mostrar todas las entradas

martes, 2 de septiembre de 2025

Datos. Estadística

Tipificación o normalización de variables


Gracias a la tipificación (1) es posible realizar comparaciones entre variables de diferentes valores, además de referirlas a resultados grupales que, en el caso de distribuciones gaussianas (normales), denominamos normalizados o normativos.


Aunque sin duda podríamos tomar otros estadísticos como referencia, lo cierto es que los empleados para realizar la tipificación de una variable son la media aritmética (promedio) y la desviación típica. Es por ello que, normalmente, estemos trabajando bajo el supuesto de distribución normal (gaussiana) (2).

La puntuación típica resulta de restar la media de la puntuación directa, dividiendo la diferencia entre la desviación típica.

pt =(Pd-pm)/dt

Mediante la primera operación (Pd-pm) conocemos qué diferencia mantiene cada puntuación directa con la puntuación que (en una distribución normalizada) se considera representativa de la distribución. Esa diferencia puede ser negativa, cuando la Pd es inferior a la media, o positiva, cuando es superior.

La segunda operación (dividir la diferencia entre la Dt) nos permite conocer en qué medida está contenida dicha diferencia en la cuantificación de la media de las diferencias. Esto permite reducir los valores resultantes a una escala de media 0, comparable entre diferentes distribuciones de variables, con independencia del tamaño que presenten los valore de las Pd.

Para conocer cómo aplicar este procedimiento mediante Calc-OOo Basic puedes consultar [esta entradaen la que se explica una función que permite realizar este cálculo.

Una vez realizada la tipificación de la variable, para facilitar una mejor interpretación de los resultados es frecuente recurrir al cálculo de la puntuación típica derivada (3), en la que se establece a priori el valor de Media (Md) y de la desviación típica (Dt). La fórmula empleada para realizar esta conversión es la siguiente:

pt_d = (Dt * pt) + Md

Para más detalle en [esta entrada] se pone a tu disposición una función OOo Basic que calcula diversas puntuaciones típicas derivadas


NOTAS

(1) También llamada normalización o estandarización.
(2) En ese supuesto, la tipificación también es útil para el cálculo de probabilidades usando tablas estándar y en el análisis factorial (multivariante)
(3) En las pruebas referida a norma es frecuente usar la puntuación CI, PT entre otras escalas. En el caso del CI, la media es 100 y la Dt es 15.

viernes, 8 de noviembre de 2024

Datos. OOo Basic.

Puntuaciones típicas derivadas

Dado que las puntuaciones típicas (puntuaciones z) (pt en adelante) pueden ser de difícil interpretación, podemos expresar esta normalización de las puntuaciones de forma que resulte más fácilmente interpretable. Para ello utilizamos las puntuaciones típicas derivadas (pt_d en adelante). En esta entrada desarrollaré una función OOo Basic para su cálculo.


Sin entrar en demasiados detalles sobre conceptos estadísticos que no corresponden en este blog (1), diremos que una pt_d es la transformación de una pt, habiendo establecido a priori un valor para el promedio (md) de esa distribución y una desviación típica o estándar (dt en adelante). En función de la pt_d con que trabajemos, esos valores serán diferentes, pero el sistema o fórmula para el cálculo o conversión de la pt a pt_d es siempre el mismo aunque se puede expresar de formas diferentes: pt_d = dt * pt + med (2)

Son varias las escalas de puntuaciones típicas derivadas, aunque las usadas con más frecuencia son:
  • Las puntuaciones CI. md  100, dt  15
  • Las puntuaciones escalares (pe). md 10, dt 3 (límites 1-19)
  • Las puntuaciones T. md 50, dt 10
  • Las puntuaciones S (estaninos o eneatipos). md 5, dt 2 (límites 1-9)
  • Las puntuaciones decatipo. md 5.5, dt 2 (límites 1-10)
Partiendo de estas referencias, me propongo crear una función que calcule y devuelva (return) la puntuación típica derivada de una puntuación z (pt) (3). Este es el código de la función CalptDev()

Function CalptDev(pz As single, tipoptd As String) As Integer

Dim mPtDeriv() As String, mPtMed () As Single, mPtDt () As Integer
Dim i As Integer
Dim cat As String
Dim vPtDev

mPtDeriv() = Array ("CI","pe","T","S","Dc")
mPtMed () = Array(100,10,50,5,5.5)
 mPtDt () = Array(15,3,10,2,2)

Select Case tipoptd
Case = "CI"
cat = mPtDeriv(0)
Case = "pe"
cat = mPtDeriv(1)
Case = "T"
cat = mPtDeriv(2)
Case = "S"
cat = mPtDeriv(3)
Case = "Dc"
cat = mPtDeriv(4)
End Select

For i = 0 To UBound(mPtDeriv())
If cat = mPtDeriv(i) Then
vPtDev = pz * mPtDt (i) + mPtMed (i)
End If
Next

CalptDev = vPtDev

End Function

Como podemos ver, CalptDev() recibe dos parámetros (pz As single, tipoptd As String): el valor z (pt) a convertir en pt_d y el tipo de puntuación típica derivada (CI, T, S...)

Cuenta además con tres matrices (mPtDeriv(), mPtMed () mPtDt()) que contienen los datos de las puntuaciones típicas derivadas: identificador, promedio y desviación típica, los cuales son establecidos posteriormente mediante la función Array (v.g. mPtDeriv() = Array ("CI","pe","T","S","Dc")). También cuenta con tres variables: un contador (i) para correr el bucle For, una variable (cat) cuya función explico a continuación, y la variable que recogerá el resultado de la función (vPtDev) y que se asocia al return (CalptDev = vPtDev).

Lo primero que hacemos es concretar el tipo de escala asociando la variable cat  al contenido de la matriz mPtDeriv() en función del valor del parámetro tipoptd a mediante el condicional Select Case. De este modo hacemos uso de la matriz indicada para asignar contenido a la variable que nos permitirá establecer la equivalencia entre la entrada del citado parámetro con las posiciones de las matrices, usando (por segunda vez) la matriz mPtDeriv() como referencia.

Esto se desarrolla en la estructura For que sigue, mediante la cual, según el valor de cat, y en el momento en que sea igual al contenido de la matriz mPtDeriv(), y por medio de un condicional If (If cat = mPtDeriv(i) Then), se procede a aplicar la fórmula del cálculo de la puntuación típica derivada  pt_d = pt * dt + med (vPtDev = pz * mPtDt (i) + mPtMed (i)).

Obsérvese el uso de las matrices que contienen los valores dt y med (mPtMed () mPtDt()) y el papel que juega en este procedimiento el posicionamiento de los datos, o lo que es lo mismo, la importancia del contador i en este procedimiento. Es gracias a todo ello que podemos automatizar la correcta aplicación de los valores (dt y med) que corresponden sin necesidad de aplicar otras estructuras condicionales más complejas y, demás, de forma repetida.

Para facilitar el uso de esta función y ofrecer un modelo de funcionamiento concreto, muestro a continuación el código de un script de llamada y paso de parámetros a esta función. Observa que se utilizan procedimientos para la entrada dinámica de datos (4):

Sub ptDerivada

Dim pt As Single, pt_deriv As String, ptDer As Integer

pt = CSng(InputBox ("Puntuación z","Valor de la puntuación típica"))

pt_deriv = InputBox(" Puntuación CI (CI)" & Chr(13) & "Punt. escalar (pe)" & Chr(13) & "Punt. T (T)" & Chr(13) & "Punt S o estanino (S)" & Chr(13) & "Puntuación decatipo (Dc)","Escala o índice de la puntuación típica derivada","CI")

ptDer = CalptDev(pt,pt_deriv)

MsgBox ("Puntuación típica " &  pt & CHr(13) & "Puntuación " & pt_deriv & " " & ptDer,0,"PUNTUACIÓN TÍPICA DERIVADA")

End Sub


NOTAS

(1) Sobre el tema se pueden consultar otras fuentes en la web. Entre otras recomiendo por su corrección y sencillez expositiva [A Ruiz Bueno (UB)] a título de introducción al tema.
(2) Otra fórmula en que es frecuente expresar esta transformación es pt_d = med +/- pt * dt. el uso de los signos alternativos +/- hace referencia a que del resultado de la operación pt * dt puede resultar un valor positivo, si pt es +pt, o negativo si es -pt; esto es: si la puntuación z (valor concreto de pt[ver entrada anterior] deriva de una puntuación directa superior o inferior a la media grupal.
(3) Aunque no se trata de crear ahora un docap, sí será necesario crear un script simple que llame a la función, ya que, como sabemos, las funciones no devuelven nada si no son llamadas desde un script, subrutina u otra función.
(4) IMPORTANTE: el valor de la puntuación z que se solicita asociado a la variable pt, (pt = CSng(InputBox ("Puntuación z","Valor de la puntuación típica"))) que será muy probablemente un valor decimal y debe escribirse separando por coma la unidad de la parte decimal; la función de conversión CSng() se encarga de convertir este valor (String) en Single. NO se debe emplear el punto como separador, ya que provoca un resultado incorrecto. 

miércoles, 23 de octubre de 2024

Datos. OOo Basic

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.