Tabla de frecuencias
La organización de los datos en una tabla de frecuencias es una buena forma de apreciar la distribución de éstos, además de ser la base para crear gráficos estadísticos, los cuales, a su vez, son la mejor forma de visualizarlos y una herramienta fundamental para el análisis de datos.
La construcción de una tabla de frecuencias resulta un tanto tediosa si trabajamos con hojas de cálculo (1), aunque disponemos de algunas funciones que nos ayudan en el proceso. Veamos...
- Deberemos identificar el máximo (MAX()) y el mínimo (MIN()) de la distribución de datos en la variable.
- A partir de ella, creamos una columna específica en la que escribimos los valores obtenidos en el punto anterior, obviamente del mínimo al máximo (2)
- Una vez creada esa lista, en cada celda asociada a cada uno de esos valores aplicaremos la función CONTAR.SI() sobre el listado original de datos (3), lo que nos dará como resultado el recuento de ese valor en la distribución, esto es, su frecuencia.
- Una vez creada la primera fórmula podemos generalizarla arrastrándola hasta el fin del listado de valores, siempre y cuando hayamos establecido correctamente el valor a buscar en base a la lista de los posibles.
Tenemos algún que otro motivo para crear un script que automatice todo este procedimiento, por ejemplo, aunque no sólo, en OOo Basic, así que vamos a intentarlo.
Partimos de la correcta obtención de los valores de la variable, evitando errores de tipología de datos, según vimos en una [entrada anterior], y utilizamos un procedimiento básico para obtener la frecuencia con lo que se presenta un valor: recorrer toda la matriz de datos (bucle For) buscándolo mediante una fórmula condicional (If x = y Then). Claro que previamente tenderemos que establecer en una matriz los valores a buscar, y además que ese procedimiento se desarrolle de forma automática.
Veamos cómo calcular la dimensión de la matriz que debe contener los valores X, desde el inicial (o mínimo) hasta el final (o máximo), siendo el conjunto los valores anteriores más todos los intermedios.
Como valor mínimo, salvo caso contrario, tomaremos siempre 1 y calcularemos el valor máximo mediante un bucle que recorre las matriz de los valores (en nuestro caso mNumDocum()) realizando una autocomparación:
For i = LBound(mNumDocum()) To UBound(mNumDocum())If Max <= mNumDocum(i) ThenMax = mNumDocum(i)End IfNext
El resultado obtenido será el valor máximo (más elevado) de todos los que presenta la variable (DocFin). Con él dimensionaremos las matrices X (Dim mValorX(Max-1) As Integer) y Fx (Dim mFx(Max-1) As Integer).
Los valores de mValorX() se establecen mediante un bucle simple...
For i = 0 To UBound(mValorX())mValorX(i) = i+1Next
... pero los de mFx() requieren, además de una variable auxiliar (Dim f As Integer), una estructura compleja formada por dos ciclos For anidados que contienen en su interior un condicional If
For i = 0 To UBound(mValorX())For b = 0 To UBound(mNumDocum())If mNumDocum(b) = mValorX(i) Thenf = f + 1End IfNextmFx(i) = ff = 0Next
- El condicional se encarga de comprobar la presencia de determinado valor (ahora X) (If mNumDocum(b) = mValorX(i) Then), realizando un recuento (f = f + 1)
- Mientras que los bucles garantizan que se recorren todos los valores de la matriz de datos principal (For b = 0 To UBound(mNumDocum()))...
- ... y la matriz auxiliar de valores X (For i = 0 To UBound(mValorX()))
- El resultado del recuento se guarda en las posiciones de la matriz Fx (mFx(i) = f) fuera del bucle interior...
- ... momento en que, inmediatamente después, se devuelve f a su valor original (f = 0) para reiniciar el proceso.
Aunque lo que sigue no es realmente parte necesaria de este script, sí resulta conveniente para evitar la pérdida de datos que supondría la mera ejecución del script. Me refiero a guardar el resultado en una hoja nueva. De ello se encarga el código que sigue:
Dim oHojas As Object, oHojaNueva As ObjectDim sNombreHoja As StringDim Col1 As String, Col2 As StringsNombreHoja = "TablaFrec"oHojas = ThisComponent.getSheets()oHojas.insertNewByName(sNombreHoja, oHojas.getCount())oHojaNueva =ThisComponent.getSheets().getByName(sNombreHoja)Col1 = "Valores X"Col2 = "F(x)"Dim oCeldaNueva As ObjectoCeldaNueva = oHojaNueva.getCellRangeByName("A1")oCeldaNueva.setString(Col1)oCeldaNueva = oHojaNueva.getCellRangeByName("B1")oCeldaNueva.setString(Col2)For i = 0 To UBound(mValorX())oCeldaNueva = oHojaNueva.getCellRangeByName("A" & i +2)oCeldaNueva.setString(mValorX(i))NextFor i = 0 To UBound(mFx())oCeldaNueva = oHojaNueva.getCellRangeByName("B" & i +2)oCeldaNueva.setValue(mFx(i))Next
La consecuencia de todo este trabajo es la automatización de la creación de una tabla simple de frecuencias y su escritura en la hoja de cálculo. A partir de ella podremos realizar lo que consideremos pertinente, incluyendo la elaboración de gráficos y el cálculo de los estadísticos (4)
NOTAS
(2) Salvo que optemos por crear una tabla de intervalos. En ese caso, el tema se complica un poco más, ya que necesitamos establecer primero esos intervalos y después realizar los agrupamientos de datos que correspondan; cosa que no va a suceder aquí. En esta entrada me voy a limitar a la creación de tablas de frecuencias simples, esto es, sin intervalos.
(3) CONTAR.SI() es una función estadística. El modo en que se crea esta función, y todas las funciones Calc, está claramente indicado en el Asistente para funciones, así que no me detengo aquí en explicaciones innecesarias. Esta ayuda incluye documentación web complementaria.
(4) En breve desarrollaré un análisis de datos que implica el uso de este script y de otros presentados en entradas anteriores de los cuales éste es continuación.

No hay comentarios:
Publicar un comentario
Comenta esta entrada