martes, 22 de octubre de 2024

Funciones. Estadística.

Cálculo del coeficiente de variación (Cv)

Una vez que disponemos de funciones para calcular el promedio, la varianza y la desviación típica, tanto como funciones Calc, como funciones OOo Basic, podemos empezar a pensar en desarrollar otras funciones estadísticas que, basadas en ellas, nos permitan trabajar a nivel de análisis de la muestra, creación de valores derivados de dichos estadísticos y análisis de mayor complejidad, como los que implican al menos dos muestras. Empezaremos por el cálculo del coeficiente de variación (Cv).


Hasta donde yo sé, ni Calc ni OOo Basic cuentan con funciones específicas para el cálculo de este coeficiente, por lo que nos deberemos plantear desarrollar directamente un función específica (o genérica) mediante el lenguaje OOo Basic (1). Pero antes de abordar esta tarea, ya que no podemos hacerlo en otro lugar, corresponde que realicemos en esta entrada una breve explicación sobre Cv, su funcionalidad y formulación como estadístico.

El Cv (2) es un estadístico de utilidad relativa tanto para el análisis descriptivo (de la media y de las características de la distribución) como para la estadística bivariada (comparación entre dos variables en cuanto a su grado de homogeniedad vs. dispersión o variabilidad). 

Su cálculo resulta de la división de la media (promedio) entre la desviación típica (Dt) de los datos muestrales y se puede expresar como tal o en forma de porcentaje:


Es, por tanto, un valor que indica el número de veces que el promedio se encuentra dentro de la Dt, lo que equivale a indicar cuánto de homogéneos o dispersos son los datos de esa muestra (o población).

Aunque excepcionalmente pueda ser superior a 1, los valores más frecuentes se dan dentro del intervalo 0-1, de ahí que, para una mejor interpretación de su valor, se emplee su expresión como porcentaje.

Sea en una u otra forma, cuando el Cv es superior a 0,30 o su equivalente porcentual (30%), se entiende que, salvo situaciones especiales (3), la muestra presenta un bajo grado de homogeneidad (alto de variabilidad) y la media (promedio) no resulta ser una medida representativa del conjunto de los datos (no es una buena medida de la tendencia central de los mismos).

Cuando comparamos dos muestras, el Cv sirve para analizar comparativamente su grado o nivel de homogeneidad, sin que sea posible hacer otras afirmaciones, salvo las que derivan de la valoración previa de sus respectivos valores promedio.

Dentro de este campo (análisis bivariado), el Cv aporta la posibilidad de comparación entre variables cuyos valores (valores observacionales, promedios...) se expresan en diferentes unidades o diferentes magnitudes. Ello es debido a que el Cv es adimensional e insensible a los cambios de escala.

A nivel de formulación de la función en OOo Basic, debemos plantearnos previamente si deseamos desarrollar una función que resuelva íntegramente el cálculo del Cv o si haremos uso de un procedimiento modular. 

En el primer caso, la función fCv() (por ejemplo) deberá asumir el cálculo del promedio, de la varianza y de la Dt antes de abordar el cálculo del Cv propiamente dicho. 

En el segundo deberemos plantearnos cómo articular la llamada a las funciones que resuelven esos cálculos previos, incluyendo el papel de la fCv() en ese proceso.

Dado que la primera opción parece poco funcional por excesivamente compleja y extensa (y más si ya disponemos de funciones que resuelve esos cálculos), parece conveniente optar por la segunda solución; pero aun no hemos terminado de resolver cómo enfocar el desarrollo de nuestra función (ahora sí) específica de cálculo del Cv.

Aunque es posible (y para ciertos contextos o preferencias incluso preferible), por sencillez en el planteamiento, mi opción (y la solución que formulo en consecuencia) se basa en asumir que es el script y no la función fCv() el que asume la llamada a las funciones complementarias y previas de cálculo de los estadísticos necesarios (promedio y Dt) (4), por lo que construyo mi función con dos parámetros que se supone entrega el script a la función: uno para el valor del promedio y otro para el valor de la Dt (fCv(med As Long, Dt As Long)), siendo el script igualmente, el responsable de la interpretación del valor resultante (5). Esto supone simplificar en gran medida la formulación de nuestra función, aunque supone un incremento de la complejidad del script, lo que considero se ajusta adecuadamente a la naturaleza del procedimiento y acentúa su modularidad (6).

Atendiendo a las decisiones adoptadas, en este caso es necesario exponer (y explicar) tanto el script desde el que llamamos a la función como la propia función, que resulta extremadamente sencilla. Empecemos por el script.

Sub CoefVar

Dim mDatos() As Integer
Dim vPromedio As Double, vDt As Double, vCv As Double, vCvPc As Double
Dim vValoraMed As String

'Datos de la matriz

mDatos() = 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)

'Llamadas a las funciones

vPromedio = fPromedio(mDatos())
vDt = fDesTip(mDatos())
vCV = fCv(vPromedio,vDt)

'Cálculo del Cv como porcentaje 

vCvPc = vCv * 100

'Valoración cualitativa del resultado (valoración de la media) 

If vCvPc > 30 Then
vValoraMed = "No se puede considerar que la media de la muestra sea un buen resumen de ésta." & CHr(13) &_
"La muestra presenta una elevada variabilidad."
Else
vValoraMed = "La media de la muestra describe correctamente este conjunto de datos."  & CHr(13) &_
"La muestra presenta tendencia a la homogeneidad."

End If

'Visualización de los resultados 

Msgbox vPromedio & " - " & vDt & " - " & vCv & " - " & vCvPc 
MsgBox vValoraMed

 End Sub


En este script, además de recoger el array de los datos (mDatos()) declaramos las variables necesarias para asignar los resultados de las funciones que calculan los estadísticos que necesita el Cv: promedio (vPromedio) y Dt (vDt), así como las relativas al propio Cv en sus dos expresiones numéricas - como cociente (vCv) y como porcentaje (vCvPc), y la valoración de dicho estadístico (vValoraMed) (7).

El paso siguiente implica llamar a las funciones; primero a las que calculan el promedio (vPromedio = fPromedio(mDatos())) y la Dt (vDt = fDesTip(mDatos())) y después (y no antes), disponiendo ya de los datos necesarios, a la función fCv() (vCV = fCv(vPromedio,vDt)) (8).

Posteriormente se realiza el cálculo de Cv en porcentaje (vCvPc = vCv * 100) y el análisis de éste (9) mediante un condicional (If vCvPc > 30 Then) procediendo a su valoración sobre la variable vValoraMed.

Para finalizar el script se muestran los resultados mediante MsgBox(), sin prestar en este momento especial atención a la forma.

Function fCv(promed As Double, Dt As Double) As Double

Dim vCv As Double

vCv = Dt/promed

fCv = vCv

End Function

Sobre la función, como se puede apreciar en el código anterior, hay poco que decir: se trata de una función que recibe dos parámetros numéricos (promed As Double, Dt As Double) y retorna un resultado también numérico (todos ellos de tipo Double). Internamente cuenta con una variable (Dim vCv As Double) receptora del cálculo (vCv = Dt/promed) consistente en una división (Dt/promed) tal y como se expresa en la fórmula de este estadístico. El retorno es también muy simple (fCv = vCv) (10)

NOTAS

(1) Esta limitación en Calc viene dada por la sencillez de la fórmula de dicho coeficiente, aunque es cierto que existen otros de similar nivel de dificultad que sí cuentan con funciones Calc específicas. En OOo Basic la explicación es más sencilla: no existen funciones estadísticas Built-In.
(2) Cv o coeficiente de variación o también coeficiente de variación de Pearson.
(3) Por ejemplo, cuando la media se acerca a 0, el Cv pierde significación, ya que es muy elevado sin que realmente exista necesariamente una alta dispersión de los datos.
(4) El cálculo de la varianza está implícito en el de la Dt y no es directamente necesario en función de la fórmula de cálculo del Cv.
(5) Esta segunda decisión se justifica por las peculiaridades de esta interpretación en función del contexto de los datos, del análisis y del propio tipo de análisis (de la homogeneidad de la muestra vs. de la comparación entre dos variables).
(6) Cierto es que supone un cambio de enfoque respecto a lo mantenido en otras funciones, como la del cálculo de la [varianza] y [de la Dt]. Diré que este cambio de enfoque está justificado por la inviabilidad de un planteamiento de resolución integral de procesos complejos, más allá de los cálculos básicos. De no hacerlo así, las funciones terminarían siendo programas, con lo que perderían su razón de ser.  Al acentuar la modularidad trasladamos la problemática al desarrollo de los procedimientos algorítmicos que involucran varias funciones y script. 
(7) Esta es la única variable de tipo string, siendo las demás (salvo la matriz mDatos()) de tipo Double, ya que así lo requieren los datos resultantes de las funciones.
(8) Posteriormente explicaré la función fCv().
(9) Igualmente, y con el cambio que corresponde en la expresión (If vCvPc > 30 Then) se podría emplear la variable vCv.
(10) Dado que no corresponde en esta entrada, no incido en su texto en el procedimiento de uso de las funciones aquí auxiliares, aunque queda patente el esquema básico del procedimiento modular. En una entrada específica trataré esta cuestión (pendiente)

No hay comentarios:

Publicar un comentario

Comenta esta entrada