Mostrando entradas con la etiqueta Tablas. Mostrar todas las entradas
Mostrando entradas con la etiqueta Tablas. Mostrar todas las entradas

miércoles, 16 de abril de 2025

Datos. Estadística

Frecuencia y tabla de frecuencias


La frecuencia el número de veces que se repite un dato. La tabla de frecuencias es la forma en que expresamos estas observaciones.


La distribución de frecuencias consiste en observar, clasificar y ordenar las repeticiones de una observación, generando lo que denominamos tabla de frecuencias.

Las frecuencias se pueden expresar en valores absolutos (frecuencia absoluta o número de repeticiones de un valor) o en valores relativos (frecuencia relativa o proporción que representa la frecuencia absoluta sobre el total de observaciones), que pueden expresarse como proporción (4/10 = 0,4) o como porcentaje ((4/10) * 100 = 40%). Finalmente, la frecuencia acumulada es el resultado de sumar los datos anteriores con el actual. El resultado de estos procesos es una tabla de frecuencias.

Cuando las variables son cuantitativas (intervalo o razón) y las observaciones son muchas y próximas entre sí, es conveniente realizar agrupamientos de frecuencias en intervalos (intervalos de clase) , cuya amplitud vendrá dada por la diferencia entre el valor máximo y el valor mínimo del intervalo, definiéndose un valor intermedio entre ambos que se denomina marca del intervalo o marca de clase, siendo este valor el que se tomará como referencia para realizar los cálculos posteriores.

Para establecer el número de intervalos se tienen en cuenta el tamaño de la muestra y de la dispersión de los datos. Como norma general se emplea el criterio de crear tantos intervalos como resulte de la raíz cuadrada de la frecuencia absoluta acumulada, concretamente tomando como referencia el número entero más próximo a ese valor, y siempre que no se superen los 20 intervalos.

Asumiendo el principio de igualdad, se calcula la amplitud del intervalo redondeando por exceso el cociente del recorrido entre el número de intervalos.

Por otra parte, según el número de observaciones y el recorrido de la variables se pueden diferenciar tres tipos de tablas de frecuencias.

  • Tipo I. Cuando tamaño y recorrido son pequeños es suficiente con anotar los datos en filas o columnas. Veamos un ejemplo: tabla de frecuencias de un conjunto de 10 alumnos. Variable sexo (H -> Masculino, M -> Femenino)
  • Tipo II. Cuando el tamaño de la muestra es grande y el recorrido de la variable es pequeño (por lo que hay valores que se repiten) es necesario elaborar una tabla-resumen. Este puede ser un ejemplo: Nuevas escolarizaciones 2022. Número de sujetos con  categoría NEE
  • Tipo III. Cuando muestra y recorrido son grandes es necesario realizar agrupamientos en intervalos, para lo que precisamos calcular el rango y la amplitud total. Datos para un ejemplo:
    • Rango (R): max -min (2500 - 120 = 2.380)
    • Amplitud: Definida a priori bajo el principio de igualdad (10 a 12 intervalos): 2.380 / 10 = amplitud 250.
    • Tabla resultante: Intervalo Li a Lj [0 - 250] -> Frecuencia ni [5] (1)

Un ejemplo de distribución (y tabla) de frecuencias de tipo III (datos agrupados)  (2):


NOTAS 

(1) Para los límites del intervalo: Li -> Límite inferior; Lj -> Límite superior. Salvo en el primer intervalo, en el resto Li resulta de Lj+1.
(2) La marca de clase (mc) resulta de dividir entre dos la suma de los límites del intervalo (Li+Lj/2). El cálculo de las frecuencias relativas resulta de multiplicar la marca de clase por la frecuencia de datos del intervalo (mc*fi). De ello puede derivar cierto grado de inexactitud en las frecuencias relativas y en su sumatorio.

viernes, 10 de mayo de 2024

OOo Basic. Datos.

Matrices multidimensionales

Además de las matrices unidimensionales [que ya vimos], también podemos definir matrices multidimensionales, esto es, matrices que constan de al menos dos dimensiones.



La forma de declarar una matriz multidimensional es la siguiente:

Dim Nombre_Matriz( Tamaño As Integer, Tamaño As Integer) As Tipo

Esta matriz tiene dos dimensiones definidas por las variables que contiene el paréntesis que sigue al nombre de la matriz. Podría tener todas las dimensiones que deseáramos, pero cuantas más tenga, más complejo es su manejo, lo que no implica que no pueda ser de utilidad en determinadas circunstancias (1).

Una matriz bidimensional se puede entender como una tabla de una hoja de cálculo como, por ejemplo...


... que sería la representación de una matriz tridimensional (mMatriz(2,2)). La forma de introducir valores y acceder a cada uno de ellos sería como sigue:

Sub MatrizMulti1

Dim mDatos( 2, 2 ) As String

'Asociamos contendidos a los índices

mDatos( 0, 0 ) = "Casa"
mDatos( 0, 1 ) = "Puerta"
mDatos( 0, 2 ) = "Ventana"
mDatos( 1, 0 ) = "Animal"
mDatos( 1, 1 ) = "Perro"
mDatos( 1, 2 ) = "Gato"
mDatos( 2, 0 ) = "Trabajo"
mDatos( 2, 1 ) = "Sodador"
mDatos( 2, 2 ) = "Fontanero"

'Mostramos algunos datos

MsgBox mDatos( 0, 0 ) & " - " & mDatos( 0, 1 )
MsgBox mDatos( 1, 0 ) & " - " & mDatos( 1, 1 )
MsgBox mDatos( 2, 0 ) & " - " & mDatos( 2, 1 )

End Sub

Como puedes ver, he creado una matriz tridimensional (Dim mDatos( 2, 2 ) As String) a la que he dado contenido siguiendo la lógica de campos semánticos cuyo término superior sitúo en la "columna" 0 (mDatos( 0, 0 ) = "Casa" -> Palabras asociadas al campo semántico "Casa") y dos ejemplos de términos asociados a dicho campo semántico en las columnas 1 y 2 (mDatos( 0, 1 ) = "Puerta" mDatos( 0, 2 ) = "Ventana").

Este ejemplo te puede dar una idea de posible uso: crear una base de datos que asocia un identificador con un determinado contenido. Por ejemplo: NIE (Id), Nombre y Apellidos de una lista de alumnos.

En este caso, la matriz a declarar tendía tres columnas y tantas filas como alumnos quisiéramos incluir en nuestra "base de datos" (6 en el ejemplo que sigue)


Sub MatrizMulti2

Dim mDatos( 5, 2 ) As String
Dim i As Integer

'Introducimos los datos

mDatos( 0, 0 ) = "123456"
mDatos( 0, 1 ) = "Roberto"
mDatos( 0, 2 ) = "Marcial Pérez"
mDatos( 1, 0 ) = "123865"
mDatos( 1, 1 ) = "Maria"
mDatos( 1, 2 ) = "Martinez Sanz"
mDatos( 2, 0 ) = "123907"
mDatos( 2, 1 ) = "Adela"
mDatos( 2, 2 ) = "Decastro Morán"
mDatos( 3, 0 ) = "1124156"
mDatos( 3, 1 ) = "Antonio"
mDatos( 3, 2 ) = "Hernández Jiménez"
mDatos( 4, 0 ) = "124245"
mDatos( 4, 1 ) = "Matías"
mDatos( 4, 2 ) = "Luján López"
mDatos( 5, 0 ) = "124596"
mDatos( 5, 1 ) = "Amalia"
mDatos( 5, 2 ) = "Desantos Melquiadez"

' Y los mostramos

For i = 0 To 5
MsgBox mDatos( i, 0 ) & " - " & mDatos( i, 1 )  & " " & mDatos( i, 2 )
Next

End Sub

Este script reproduce la tabla precedente. Se basa en una matriz multidimensional (Dim mDatos( 5, 2 ) As String) cuya primera dimensión (5) indica el número de filas (6 alumnos ) y la segunda (2) el número de de columnas (3 datos por cada alumno). Refleja el potencial de este tipo de matrices para el trabajo con tablas y sugiere posibles usos muy interesantes (2)

NOTAS

(1) En realidad esta es una recomendación de Mauricio Baeza. Este autor recomienda no usar matrices de más de tres dimensiones por su dudosa utilidad. En principio me parece una buena recomendación si con ello nos referimos a no sobrepasar dos índices por matriz (mDatos( 5, 2 ) frente a mDatos( 5, 2,2)) por la dificultad de representación (tres ejes y dimensionas) y manejo de este tipo de estructuras, pero la primera formulación, que reproduce la estructura de una tabla (filas x columnas) me parece muy interesante como recurso para el trabajo con tablas.
(2) Cierto que es posible trabajar con tablas empleando matrices unidimensionales, pero necesitamos una matriz por columna, lo que en el ejemplo anterior supone utilizar tres matrices. En tablas de dimensiones limitadas, como la del ejemplo, el uso de matrices unidimensionales no parece ser una mala opción, pero si la tabla tuviera muchas más columnas, crear tantas matrices (unidimensionales) como columnas (campos) tuviera la tabla complicaría considerablemente  la creación del script y entorpecería su funcionamiento. El uso de una matriz multidimensional (bidimensional, en realidad) facilitaría sustancialmente el trabajo, compensando la mayor dificultad de uso que presenta.

jueves, 28 de marzo de 2024

Textos. OOo Basic

Tablas. Escribir contenido (macros).

Vimos en la entrada anterior cómo crear una tabla, pero no cómo escribir contenido en ella. En esta entrada aprenderemos cómo hacerlo, empezando por usar un conjunto de macros, la mayoría ya conocidos.



Cuando trabajamos con un documento en blanco (este es ahora el presupuesto), además de escribir texto, podemos "dibujar" tablas, pero para automatizar la composición del documento, de poco nos sirve si no sabemos cómo incluir contenido en ellas. Para hacerlo usando macros (1) deberemos seguir una serie de pasos en los que utilizaremos macros simples, la mayoría de ellas ya conocidas.

Lo primero que tenemos que saber es dónde está posicionado el puntero de escritura, lo que significa ser consciente de lo que hemos hecho en el momento que precede a la escritura de la tabla.

Aunque las opciones pueden ser varias, la forma más segura es regresar al inicio del documento...

dispatcher.executeDispatch(document, ".uno:GoToStartOfDoc", "", 0, Array()

... y recorrerlo verticalmente mediante bajar línea...

dim args1(1) as new com.sun.star.beans.PropertyValue
args1(0).Name = "Count"
args1(0).Value = iLin
args1(1).Name = "Select"
args1(1).Value = false
dispatcher.executeDispatch(document, ".uno:GoDown", "", 0, args1())

...hasta situarnos en la celda A1 de la tabla. Una vez estemos en esta posición, la orden de escritura es la misma que para escribir texto...

dim args2(0) as new com.sun.star.beans.PropertyValue
args2(0).Name = "Text"
args2(0).Value = sTxt
dispatcher.executeDispatch(document, ".uno:InsertText", "", 0, args2())

... y el desplazamiento por celdas se resuelve mediante la instrucción...

dispatcher.executeDispatch(document, ".uno:JumpToNextCell", "", 0, Array())

El script siguiente es un ejemplo de uso de este procedimiento para crear una ficha sencilla de un alumno (2):

Sub Tabla

VarSis

Dim mDatosTabla(5) As String

Dim i As Integer

mDatosTabla(0) = "Nombre"
mDatosTabla(1) = InputBox("Nombre","Datos personales","Juan")
mDatosTabla(2) = "Apellidos"
mDatosTabla(3) = InputBox("Apellidos","Datos personales","Carrasco Pérez")
mDatosTabla(4) = "Curso y etapa"
mDatosTabla(5) = InputBox("Curso y etapa","Datos Personales","1º de E. Primaria")

InicDoc

Escribir("Ficha de alumno")

SaltoLinea(1)

MacroTabla (2,3)

InicDoc

BajaLinea(2)

For i = LBound(mDatosTabla()) To UBound(mDatosTabla())
Escribir(mDatosTabla(i))
If i < UBound(mDatosTabla()) Then
SaltoCelda
End If
Next

BajaLinea(2)

SaltoLinea(1)

Escribir("Escribir a continuación el contenido pertinente")

End Sub

Y este el resultado que obtendremos.

Pero si la forma anterior es la más segura, su aparente simplicidad se ve comprometida cuando trabajamos con documentos más complejos, especialmente si contienen varias tablas. En este caso, el cálculo de los movimientos necesarios para situarnos correctamente dentro de las tablas puede dar lugar a errores que complican la automatización del documento.

Contamos con un procedimiento más sencillo que supone mantener la secuencia lineal de composición del documento, incluida la cumplimentación de los datos de la(s) tabla(s) y que se basa en el hecho de que al crear una tabla, y hasta que no se recorre ésta hasta su final, el cursor se encuentra situado en la celda inicial (A1) de la tabla creada. Si iniciamos a continuación la escritura del contenido no necesitaremos retrotraernos al inicio del documento (o de la línea) y desplazarnos después al inicio de la tabla, de forma que, siguiendo la secuencia de lo que sería la escritura del documento mediante teclado, iremos cumplimentando el documento en su totalidad, incluyendo el de las tablas que contenga.

Este segundo script (Tabla2) es el que se muestra a continuación (3) y considero que es de mayor utilidad que el anterior por ser más seguro y versátil:

Sub Tabla2

VarSis

Dim mDatosTabla(5) As String, mCalifica (5) As String

Dim i As Integer

mDatosTabla(0) = "Nombre"
mDatosTabla(1) = InputBox("Nombre","Datos personales","Juan")
mDatosTabla(2) = "Apellidos"
mDatosTabla(3) = InputBox("Apellidos","Datos personales","Carrasco Pérez")
mDatosTabla(4) = "Curso y etapa"
mDatosTabla(5) = InputBox("Curso y etapa","Datos Personales","1º de E. Primaria")

 

mCalifica(0)= "ÁREA"
mCalifica(1)= "Calificación"
mCalifica(2)= "Lengua Castellana y Literatura"
mCalifica(3)= InputBox("Calificación LCL","Expediente académico","Muy positiva")
mCalifica(4)= "Matemáticas"
mCalifica(5)= InputBox("Calificación Matemáticas","Expediente académico","Muy positiva")

InicDoc

Escribir("Ficha de alumno")

SaltoLinea(1)

MacroTabla (2,3)

For i = LBound(mDatosTabla()) To UBound(mDatosTabla())
Escribir(mDatosTabla(i))
If i < UBound(mDatosTabla()) Then
SaltoCelda
End If
Next

BajaLinea(1)

SaltoLinea(1)

Escribir("Escribir a continuación el contenido pertinente")

SaltoLinea(2)

MacroTabla (2,3)

For i = LBound(mCalifica()) To UBound(mCalifica())
Escribir(mCalifica(i))
If i < UBound(mCalifica()) Then
SaltoCelda
End If
Next

End Sub

Y este el resultado (4).


Espero que, a pesar de la aparente simplicidad de los resultados, te hayas podido hacer una idea de las posibilidades que ofrecen los procedimiento de creación y cumplimentación de tablas que hemos explicado en esta entrada. Por si te interesa conocer el conjunto de macros y script que conforman este ejemplo, aquí te dejo [enlace al documento]


NOTAS.

(1) Más correcto sería decir subrutinas basadas en macros.
(2) Se activa con el botón rojo. Los datos incluidos en las variables asociadas a InputBox() lo son a modo de ejemplo, para facilitar el funcionamiento del ejemplo. Obviamente pueden ser sustituidos por los datos reales del alumno o alumna que corresponda. Además, la frase final con la que finaliza el documento implica un posterior desarrollo en formato de composición de texto similar al elaborado en otras ocasiones. Aquí únicamente se pretende ejemplificar la escritura de datos dentro de una tabla.
(3) Se activa con el botón verde. Contiene dos tablas que se complementan de forma inmediata a su creación. La segunda recoge los resultados académicos en dos áreas del currículo de E. Primaria y sólo plantea como interactiva la calificación. Esta estructura se puede modificar para ajustarla a la etapa y al número de áreas, pero como ejemplo es suficiente para nuestros objetivos actuales.
(4) No te preocupes por el efecto estético de los botones de activación de los script. Ni se borran al borrar el contenido del documento ni se imprimen; tampoco aparecen si conviertes el documento a .pdf.

miércoles, 27 de marzo de 2024

Textos. OOo Basic

Trabajar con tablas (1)

Las tablas y las listas son, junto con el texto, los formatos más frecuente en los documentos, pero Mientras que el texto se encarga de dotar de contenido al documento, tablas y listas sirven para facilitar el visionado de determinados datos que, por su especial relevancia, precisan ser expresados de forma diferente al cuerpo de la información. En esta entrada hablaremos de las tablas y en otra posterior de las listas o listados.


Para trabajar con tablas, lo primero que tenemos que aprender es a crearlas. Para ello podemos optar por la forma más sencilla: crear una tabla activando previamente la función Grabar macro. Este es el resultado:

Sub MacroCrearTabla
VarSis
 
dim args1(3) as new com.sun.star.beans.PropertyValue
args1(0).Name = "TableName"
args1(0).Value = ""
args1(1).Name = "Columns"
args1(1).Value = 3
args1(2).Name = "Rows"
args1(2).Value = 2
args1(3).Name = "Flags"
args1(3).Value = 9

dispatcher.executeDispatch(document, ".uno:InsertTable", "", 0, args1())

End Sub

Resumo las instrucciones iniciales de creación de la macro mediante la llamada a VarSis partiendo de que comprendes su significado por haberlo visto con anterioridad. Desde este supuesto paso a analizar las otras dos partes de esta macro.

Nos encontramos en primer lugar con una matriz (args1) compleja, formada por 4 pares Nombre-Valor, entre las que destacan los dos centrales que concretan el número de columnas y filas que tendrá la tabla (2). La importancia de entender esto es que nos permite manipular esos valores, directamente o mediante variables, para crear todas las estructuras de tablas que deseemos. Además también nos facilita convertir la macro en una subrutina estableciendo dos parámetros y llamarla desde un script pasando los valores como argumentos.

Para MacroCrearTabla(iCol As Integer, iFil As Integer), en las que los valores numéricos son sustituidos por el nombre de ambos parámetros nos permite trabajar con un script desde el que llamamos a la subrutina...

Sub  Tabla

Dim iTCol As Integer, iTFil As Integer

iTCol = CInt(InputBox ("Número de columnas")

iTFil = CInt(InputBox ("Número de filas")

MacroCrearTabla (iTCol, iTFil)

 End Sub

... desde el que el usuario puede definir el número de filas y columnas que tendrá la tabla cuya creación que automatiza este script.

La instrucción  dispatcher.executeDispatch(document, ".uno:InsertTable", "", 0, args1()) con la que finaliza la macro MacroCrearTabla contiene la orden de creación (InsertTable)

Como alternativa a la macro, directamente desde OOo Basic también podemos crear una tabla. 

Sub InsertarTablaA

Dim oTable As Object

oTable = ThisComponent.createInstance( "com.sun.star.text.TextTable" )

oTable.initialize(2, 3)

ThisComponent.Text.insertTextContent(ThisComponent.Text.getEnd(), oTable, False)

End Sub

En este script se diferencian dos partes: la creación de la tabla y "escritura" (trazado) en el documento. La creación de la tabla es responsabilidad de la función initialize() asociada al objeto que se referencia en la variables oTable mediante la instrucción oTable.initialize(2, 3) (3). La instrucción con la que finaliza el script (ThisComponent.Text.insertTextContent(ThisComponent.Text.getEnd(), oTable, False)) es la responsable de trazar la tabla en el documento, incluyendo su posicionamiento (getEnd()), y es similar a la instrucción de escritura de texto (4)


NOTAS

(1) Actualización de la entrada publicada el 30 de julio de 2023 con el título Writer. Creación de tablas (macro y script)
(2) El primer par permite dar un identificador a la tabla y puede tener interés si vamos a trabajar con varias tablas.
(3) Obsérvese que la función initialize(2, 3) contiene dos parámetros por lo que podremos actuar sobre ellos de igual modo que cuando creamos la tabla mediante macro.
(4) Siguiendo con lo dicho en (3), podemos transformar el script en una subrutina con tres parámetros: los dos primeros tipo integer para dar formato a la tabla y el tercero tipo string para definir la posición de la tabla al inicio o al fin del proceso de escritura del documento: InserTabla (Col As Integer, Fil As Integer, Posic As String)