2014-04-13

Saltar líneas al importar un fichero de texto en Access

Cuando importamos un fichero de texto, Access no permite especificar desde que línea deseamos que comience la importación. Tan solo podemos indicar si la primera fila contiene los nombres de los campos (saltar la primera fila). 

Para poder indicar a Access el número de líneas que debe saltarse antes de comenzar la importación necesitamos guardar previamente la configuración de importación como una especificación. Una vez guardada, los pasos  a seguir son:

1. Botón de inicio, Opciones de Access, clic en Opciones de exploración o presionamos la secuencia ALT+A+O.


2. En Opciones de exploración, seleccionamos Mostrar objetos del sistema y clic sobre Aceptar.


3. En el panel de control podemos ver las tablas del sistema ocultas.


4. Abrimos la tabla MSysIMEXSpecs. Cada registro es una especificación guardada, comprobamos el nombre aquella que deseamos modificar en el campo SpecName. En el campo StartRow, cambiamos el cero o uno si la primera fila tiene encabezado, por el número de filas que queremos saltar. StartRow empieza la numeración en cero. Por tanto, la especificación de importación importará a partir de la fila indicada más uno.


Cerramos la tabla. En nuestro ejemplo saltará 6 filas y comenzará en la fila nº 7.

2014-04-09

Sucesión de Fibonacci en R

Title Para calcular números de la secuencia de Fibonacci en R, he empleado el código de Neha Pandey

fib <- function(n) {
    a = 0
    b = 1
    for (i in 1:n) {
        tmp = b
        b = a
        a = a + tmp
    }
    return(a)
}
print(fib(79), digits=20)
Sin embargo, si el número sobrepasa los 16 dígitos, de fib(79) en adelante, obtenemos resultados imprecisos. Por ejemplo: fib(79) = 14472334024676220 cuando el resultado correcto es: fib(79) = 14472334024676221.

fib(77) = 5527939700884757 16 dígitos
+
fib(78) = 8944394323791464 16 dígitos
=
fib(79) = 14472334024676221 17 dígitos

Esto es debido a que R almacena los números como números de doble precisión. Una precisión de 53 bits (16 dígitos decimales significativos aproximadamente.

Resolvemos el problema usando el paquete gmp (Multiple Precision Arithmetic). Específicamente la función add.bigz, con la que sumamos bigz (Large Sized Integer Values) números enteros muy grandes.

install.packages("gmp")
require(gmp)
fib <- function(n) {
    a = 0
    b = 1
    for (i in 1:n) {
        tmp = b
        b = a
        a = add.bigz(a, tmp)  # gmp function
    }
    return(a)
}
fib(79)
Así calculamos correctamente números de más de 16 dígitos. He comprobado los resultados para números mucho más largos fib(25000), 5225 dígitos, y los resultados parecen ser precisos hasta el último dígito.

R al igual que otros lenguajes tiene limitaciones internas. Aunque en la práctica es poco probable que topemos con ellas, es útil tenerlas presentes y, si es posible, ser capaces de sobrepasarlas. En este caso, ya sabemos como sortear la limitación en la precisión de los cálculos más allá de los 16 dígitos con el paquete gmp.

Referencias:

Double-precision floating-point format
R Accuracy
?double en la consola de R

Entradas relacionadas:
Sucesión de Fibonacci en Excel y VBA

2014-04-06

Sucesión de Fibonacci en Excel y VBA

Title La sucesión de Fibonacci es una sucesión infinita en la que los dos primeros elementos son 0 y 1, y los siguientes términos son la suma de los dos anteriores:

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377...

En Excel podemos generar la sucesión mediante fórmulas. Sumamos los dos primeros elementos y arrastramos el controlador de relleno.

Sin embargo, como el elemento 74, fib(74) = 1304969544928657, excede los 15 dígitos, Excel devuelve un número incorrecto: 1304969544928660.

Microsoft Excel admite un máximo de 15 dígitos significativos en todo momento. Este límite se aplica a un valor que se calcula mediante una fórmula. Debido a esta limitación, en cualquier momento una fórmula calcula un valor que supere los 15 dígitos de longitud, dígitos más allá el decimoquinto dígito significativo se cambian a ceros.

Función

Para resolver este comportamiento recurrimos a VBA. Traté con el código publicado en rosettacode.org. Pero fib(46) provoca un desbordamiento. Además, provocaría siempre el desbordamiento un término antes del máximo posible porque calcula el próximo nº Fibonacci un término antes de lo necesario, .

'Desbordamiento en fib(46)
Public Function Fib(n As Integer) As Long
    Dim fib0, fib1, sum As Long
    Dim i As Integer
    fib0 = 0
    fib1 = 1
    For i = 1 To n
        sum = fib0 + fib1 'Calcula nº siguiente antes de tiempo
        fib0 = fib1
        fib1 = sum
    Next
    Fib = fib0
End Function
Finalmente, ver notas abajo, modificando este código consigo calcular hasta fib(139) sin desbordamiento.

'Desbordamiento en fib(139)
Public Function Fibonacci(ByVal n As Long)
    Dim i As Long
    Dim a As Variant, b As Variant, tmp As Variant
    a = 0
    b = 1
    For i = 1 To n
        tmp = b
        b = a
        a = CDec(a + tmp) 'Conversión de Variant a Decimal
    Next
    Fibonacci = CStr(a) 'Mostrar todos los dígitos como texto
End Function

Subrutina

A continuación transformamos la función definida por el usuario (FDU) anterior en subrutina. En el cuadro de diálogo escribimos el número Fibonacci que queremos calcular.

'Desbordamiento en fib(139)
Sub Secuencia_Fibonacci()
    n = VBA.InputBox("Número de la serie Fibonacci a calcular. Máx. 139.")
    Dim i As Long
    Dim a As Variant, b As Variant, tmp As Variant
    a = 0
    b = 1
    For i = 1 To n
        tmp = b
        b = a
        a = CDec(a + tmp) 
    Next
    MsgBox "Fib(" & n & ")= " & a, vbInformation 
End Sub
End Sub

Notas

Necesitamos forzar la conversión del resultado a = CDec(a + tmp) con CDec de Variant a Decimal (28 dígitos). De esta manera, evitamos que VBA pierda la precisión necesaria y redondee a 15 dígitos a partir de fib(74) = 1,30496954492866E+15 en lugar de 1304969544928657 (16 dígitos). No podemos declarar las variables como Decimal directamente. Debemos definirlas como Variant y luego asignarles el tipo Decimal. Finalmente, convertimos el resultado de la función en texto con CStr para que Excel conserve todos los dígitos en las celdas y no vuelva redondear a 15 dígitos.

En cualquier caso, el término máximo de la sucesión Fibonacci que Excel puede calcular es el 139. Pues fib(140) = 81055900096023504197206408605 excede el valor máximo que Excel puede usar: 79228162514264337593543950335.

Referencias:

Límite de 15 dígitos.
Definir variable como Decimal.
Calculadora de sucesión de Fibonacci

Entradas relacionadas:
Sucesión de Fibonacci en R

2014-04-04

Diagrama de Pareto en Excel

Title Un diagrama de Pareto es un gráfico empleado para mostrar los motivos que contribuyen a un problema e identificar si siguen el principio de Pareto: si el 20% de los motivos representan el 80% del problema. El principal valor de este análisis es priorizar los esfuerzos y discriminar los motivos pocos pero vitales en lugar de los muchos pero triviales.

Las aplicaciones son múltiples: logística (análisis ABC), empresa (contribución de productos, clientes y venta), control de calidad, economía, etc.

Diagrama de Pareto

El resultado final muestra las causas más comunes de los fallos en la fabricación de circuitos integrados: corrosión, contaminación de la superficie, defectos en el sílice, en el óxido y la metalización. Se puede observar como tres tipos de errores originan el 81% de los mismos.


Preparación de los datos

En nuestro ejemplo partimos de 31 observaciones de errores en la fabricación de circuitos integrados.

Se agrupan las frecuencias relativas de las causas en orden descendente, el porcentaje de error, el porcentaje acumulado y una columna con el límite: 80%.

Creación del gráfico

1. Insertamos un gráfico de barras, seleccionando la causa, la frecuencia del error, el % errores acumulado y el límite.

2. Trazamos las series 2 y 3 en el eje secundario. Seleccionamos la serie, botón secundario del ratón o Ctrl+1 y seleccionamos Dar formato a la serie de datos. En Opciones de serie, clic sobre Trazar serie en Eje secundario.


3. Ahora necesitamos cambiar el tipo de gráfico para estas dos series. Seleccionamos % Error Acumulado y cambiamos a gráfico de línea con marcadores y el límite a gráfico de líneas.

4. Formateamos el gráfico. Aumentamos el ancho de la columna, coloreamos de manera diferente las causas que generan el 81% de los fallos, las líneas de las series del eje secundario. Añadimos etiquetas a las series, y eliminamos las del eje y sus líneas.

2014-04-01

Exportar tabla como archivo de texto sin truncar los decimales

Title
Si en Access tratamos de exportar una tabla a un archivo de texto, los campos numéricos exportados conservarán como máximo 2 decimales. Para evitar que se trunque el campo, creamos una consulta en la que especificaremos el número de decimales del campo.

Por ejemplo, para conservar 6 decimales del CampoNumerico:

1. Creamos una consulta con el campo:

Campo: Format([Tabla1]![CampoNumerico];"0,000000")
2. Guardamos la consulta.
3. Exportamos la consulta, la seleccionamos y:
  • Botón secundario del ratón > Exportar > Archivo de texto; o bien
  • En la ficha Datos externos, en el grupo Exportar, Archivo de texto:

Entradas relacionadas

2014-03-30

Directorio y entorno de trabajo en RStudio

Title

Directorio de trabajo

El directorio de trabajo (working directory, wd) en R es la carpeta que por defecto utiliza R para leer o escribir ficheros.

Para comprobar el directorio de trabajo actual:

getwd()
[1] "C:/Usuarios/Documentos/R"  # Ejemplo
Para cambiar el directorio de trabajo actual:

setwd("C:/Usuarios/Documentos/R") # Especificar la ruta completa.
Mediante la barra de menú en RStudio:

Entorno de trabajo

Por defecto al cerrar la sesión en RStudio nos preguntará si queremos guardar una copia del entorno de trabajo (Workspace) en el directorio de trabajo actual. Bien al cerrar usando la función q, o con un mensaje emergente si cerramos el programa:

q()
Save workspace image to ~/R/.RData? [y/n/c]: 

Aunque es práctico conservar los objetos de sesiones anteriores mientras realizamos nuestros análisis, es recomendable crear R Scripts que sean capaces de reconstruir todo el proceso por sí mismos. Es decir, que importen los datos y creen los objetos necesarios, en lugar de guardarlos en .RData.

En cualquier caso podemos abrir y guardar ficheros .RData mediante el menú File, con los iconos correspondientes en la pestaña Environment o con funciones :

save.image("~/R/.RData") # Guarda .RData
load("~/R/.RData")  # Carga .RData
En .Rhistory se guardan las instrucciones ejecutadas en R. RStudio por defecto guarda automáticamente el fichero .Rhistory en el directorio de trabajo actual, incluso cuando no guardamos .RData. Podemos abrir y guardar el .Rhistory mediante el menú File, con los iconos correspondientes en la pestaña History o mediante funciones:

savehistory("~/R/.Rhistory") # Guarda .Rhistory
loadhistory("~/R/.Rhistory") # Carga .Rhistory

Opciones Generales de R

Podemos modificar la configuración de RStudio, Tools> Options...> General R Options

Default working directory — Directorio de trabajo por defecto de RStudio. RStudio busca los ficheros .RData y .Rprofile en este directorio.

Restore .RData into workspace at startup — Al abrir RStudio, carga en el entorno de trabajo (Environment) el fichero .RData, (en el caso de encontrar alguno en el directorio de trabajo actual). Si el fichero .RData es muy grande conviene desmarcar la opción para acortar el tiempo de inicio.

Save workspace to .RData on exit — Las opciones son: preguntar al cerrar si deseamos guardarlo, guardar siempre o nunca el fichero .RData. Si no se ha realizado ningún cambio, RStudio no preguntará nada aunque especifiquemos preguntar al cerrar.

Always save history (even when not saving .RData) — Guarda el fichero .Rhistory con las instrucciones ejecutadas en la sesión incluso si no elegimos guardar el fichero .RData al cerrar RStudio.

2014-03-26

Calcular la duración del día y el horario de verano en Excel

El próximo fin de semana comienza el horario de verano (CEST – Central European Summer Time). En torno a los cambios de horario de verano en marzo y octubre, tendemos a fijarnos más en como los días se alargan o se acortan. ¿La duración del día varía más en algunos periodos del año o es un efecto acumulativo en el que repentinamente reparamos? He creado varios gráficos para responder a esta pregunta.

Gráficos

Horas de luz diurna

Resulta evidente que en primavera y otoño la duración del día varía más aceleradamente que en verano e invierno. Por ejemplo, de finales de enero a principios de mayo, tres meses, se incrementa en 4 horas (de 10 a 14). Mientras que en un periodo de prácticamente igual duración, de mayo a agosto, el número de horas se estabiliza en 14 horas llegando a un máximo de 15.

Amanecer, ocaso y duración del día

En el gráfico anterior vemos la hora del amanecer y del ocaso a lo largo del año. Los dos escalones reflejan el horario de verano. La línea verde es continua, idéntica a la del anterior gráfico, porque refleja las horas entre el amanecer y el ocaso. El horario de verano tan solo retrasa las horas de luz una hora, no altera obviamente el número de horas de luz.

Gráfico animado



Datos

En primer lugar, necesitamos obtener las horas del amanecer y del atardecer de todos los días del año. Una opción sería descargarlos para una población concreta. Otra más flexible sería crear una fórmula que nos calcule los mismos en función de la latitud y longitud que le indiquemos.

Por suerte, Greg Pelletier del Departamento de Ecología del Estado de Washington, ha adaptado a VBA los cálculos en Javascript de NOAA (National Oceanic and Atmospheric Administration). Nosotros solamente usaremos dos de sus funciones, sunrise (amanecer) y sunset (atardecer). Los argumentos de ambas son: latitud, longitud, año, mes, día, huso horario (zona horaria) y horario de verano (0 = no, 1 = sí).

Necesitamos determinar el inicio y el final del horario de verano, es decir, el último domingo de marzo y de octubre. Podríamos calcularlo con fórmulas disponibles en Excel pero recurrimos a una función definida por Chip Pearson. Hemos tenido que modificarla pues la transición en EE.UU. al Daylight Savings Time (DST) es distinta. 

Armados con dichas fórmulas, necesitamos saber la latitud y longitud (en grados decimales) de la población en cuestión. Pau Urquizu nos ha facilitado inmensamente la labor poniendo a nuestra disposición el listado completo de los municipios de España. También es posible acudir a Google maps y obtener las coordenadas de un punto del planeta:

Botón derecho en una ubicación del mapa > Selecciona ¿Qué hay aquí?

Tabla

Con todos los datos construimos una tabla con los 365 días del año.

NOAA Solar Calculator


Aquí podemos calcular el amanecer, ocaso y acimut para cualquier coordenada. Los cálculos de NOAA se basan a su vez en ecuaciones de los algoritmos astronómicos de Jean Meeus. Tienen una precisión de +/- 1 minuto para entre +/-72° de latitud y de 10 minutos fuera de esas latitudes. A su vez, la conversión de Greg Pelletier de Javascript a Excel VBA varía +/- 1 minuto respecto al código original de Javascript.

2014-03-20

Tablas dinámicas con origen de datos dinámico

Un elemento fundamental de las tablas dinámica es su origen de datos. Si el origen se amplia o disminuye tendremos que cerciorarnos de que al actualizar la tabla dinámica ésta refleje correctamente los datos. Aunque podemos cambiar el origen manualmente, en esta entrada trataremos tres opciones para crear un origen de datos dinámicos. Partimos del siguiente ejemplo:

Si añadimos un nuevo registro y actualizamos la tabla, ésta mostrará los mismo resultados. Sin embargo, tenemos distintas opciones para crear un rango autoajustable como origen de datos.

Tabla como origen de datos

1. Nos situamos sobre una celda del rango.

2. En el grupo Tablas de la ficha Insertar, clic en Tabla. O presionar Ctrl+T.

Por defecto Excel selecciona el área actual alrededor de la celda activa (el área de datos delimitada por filas en blanco y columnas en blanco). Activamos la casilla de verificación La tabla tiene encabezados, pues todas las tablas dinámicas deben tener encabezados de columna.

A continuación cambiamos el origen de datos de la tabla dinámica. En Tabla o rango, escribimos el nombre de la tabla. Así la tabla dinámica incluirá, al actualizarla, los registros añadidos a la tabla de origen de datos automáticamente.

Proceso:

Rango dinámico como origen de datos: DESREF

1. Definimos un nuevo nombre. En el grupo Nombres definidos de la ficha Fórmulas, clic en Asignar nombre.

=DESREF(Hoja1!$A$1;;;CONTARA(Hoja1!$A:$A);3)
'Si desconocemos el nº de columnas:
=DESREF(Hoja1!$A$1;;;CONTARA(Hoja1!$A:$A);CONTARA(Hoja1!$1:$1))
Sintaxis: DESREF(ref; filas; columnas; [alto]; [ancho])

- Ref: Hoja1!$A$1. Celda que anclamos.
- Filas: Ø
- Columnas: Ø
- Alto: CONTARA(Hoja1!$A:$A). Nº de filas.
- Ancho: 3. Nº de columnas.

Rango dinámico como origen de datos: INDICE

1. Definimos un nuevo nombre. En el grupo Nombres definidos de la ficha Fórmulas, clic en Asignar nombre o en Administrador de nombres y en Nuevo.

=Hoja1!$A$1:INDICE(Hoja1!$1:$65535;CONTARA(Hoja1!$A:$A);3)
'Si desconocemos el nº de columnas:
=Hoja1!$A$1:INDICE(Hoja1!$1:$65535;CONTARA(Hoja1!$A:$A);CONTARA(Hoja1!$1:$1))
Sintaxis: Ref:INDICE

- Ref:Hoja1!$A$1: Celda que anclamos.
- INDICE(matriz;núm_fila;núm_columna). Devuelve la referencia de la última celda del rango.
- Matriz: Hoja1!$1:$65535. Toda la hoja: 65535 en Excel 2003, 1048576 en 2007.
- Núm_fila: CONTARA(Hoja1!$A:$A). Nº de filas.
- Núm_columna: 3. Nº de columnas

Nota: funciones volátiles

La diferencia entre usar DESREF o Ref:INDICE estriba en que DESREF es una función volátil mientras que INDICE no. Una función volátil se debe actualizar siempre que se efectúe un cálculo en cualquier celda de la hoja de cálculo. Por tanto, si usamos funciones volátiles en demasía, se ralentizará el proceso de recálculo de Excel. Otras funciones volátiles son: AHORA, HOY, ALEATORIO, ALEATORIO.ENTRE, INDIRECTO, INFO (dependiendo de los argumentos y CELDA (dependiendo de los argumentos).

2014-03-16

Gráfico de anillos en Excel como en Google Analytics

Title En Google Analytics, en el apartado de informes (reporting) podemos ver el porcentaje de visitas de nuestra web por día o entrada. Utilizan el siguiente gráfico de anillo:

Sin entrar ahora a valorar la utilidad y la facilidad para interpretarlo adecuadamente (no deja de ser un gráfico de sectores o circular), vamos a crearlo en Excel.

Crear un gráfico de anillo en Excel


1. Escribimos en una celda por ejemplo 25% y en otra 75%.
2. Insertar> Gráficos> Otros Gráficos> Anillo
3. En cualquiera de las series, Formato de serie de datos:
     - Ángulo del primer sector: 90. El ángulo en el que comienza Google Analytics.
     - Tamaño del agujero del anillo: 70 aproximadamente.
4. Formato adicional. El relleno rojo lo cambiamos a azul celeste.Y en ambas series el color del borde en blanco y al estilo del borde un ancho de 2 puntos.

5. Reducimos el tamaño y, si lo deseamos, lo vinculamos a una barra de desplazamiento (control ActiveX). La barra de desplazamiento no permite que en propiedades especifiquemos porcentajes. Por tanto, escribimos un número entero y lo dividimos en la celda que sirve de origen al gráfico. Como queremos un pequeño espacio en blanco incluso con el 100%, escribimos 999 en lugar de 1.000 en Max.

Resultado final

2014-03-12

Actualizar datos de una consulta o formulario inmediatamente

En Access es frecuente que deseemos actualizar consultas o formularios abiertos. Por ejemplo, porque los datos de la tabla, otras consultas o formularios en los que están basados hayan sido modificados.

Podemos actualizar inmediatamente una consulta o un formulario abierto de dos formas:

    1. En la ficha Inicio, en el grupo Registros, clic en Actualizar todo.


    2. Presionar Mayús+F9

En el ejemplo anterior tenemos un cuadro combinado cuyo origen es el Campo1 de la Tabla1. Si añadimos un nuevo registro (Región 4) y queremos que el desplegable del cuadro combinado incorpore este nuevo registro presionamos Mayús+F9.

Son dos alternativas más rápidas que cerrar y abrir la consulta o el formulario, o que pasar a Vista de diseño y de nuevo a Vista Hoja de datos o Vista Formulario .
Nube de datos