2013-06-19

Código y datos para las ciencias sociales- Parte 3

En las dos entradas anteriores vimos una introducción del manual Code and Data for the Social Sciences: A Practitioner’s Guide y la parte dedicada a automatizar y control de versiones. Continuamos con el capítulo dedicado a la organización de los directorios.

Capítulo 3- Directorios

Enumeran 3 reglas:

1. Separa los directorios por función
2. Separa los ficheros en entradas y salidas
3. Haz los directorios portátiles

Nos proponen el siguiente ejemplo:


Hay dos directorios principales. Uno contiene el código para construir un archivo de datos para Stata a partir de unas entradas sin procesar (/entrada). El otro contiene código para convertir el fichero para Stata (tvdatos.dta) en números y tablas para nuestro estudio (num.1.eps, num2.eps, tablas.txt).

Dentro de cada directorio hay una estructura consistente de subdirectorios que separa: entradas, salidas, código y archivos temporales (/temp) o intermedios. Cada directorio es controlado por una única secuencia de comandos (ejecutardirectorio.bat) que lo ejecuta de principio a fin.

Así, es fácil modificar los datos de origen sin alterar el análisis y viceversa. Por la estructura del directorio está claro que solamente tvdatos.dta es requerido para el código de análisis y tanto patatasfritas.csv como tv.csv están explicitamente designados como archivos temporales.

Es importante señalar que obtenerentrada.bat copia tvdatos.dta de C:/origen/salida a C:/analisis/entrada. ¿Por qué no hacer que regresiones.do cargue los datos directamente de C:/origen/salida? Hay tres razones. La primera que es que al separar los directorios por función permite a cualquier usuario no familiarizado con ellos determinar inmediatamente las entradas requeridas por cada directorio, sin tener que entrar en el código para averiguar todos ficheros que se utilizan.

La segunda ventaja es que el tener una copia separada de tvdatos.dta hace posible modificar el código en C:/origen sin cambiar instantáneamente el comportamiento del código en C:/analisis

La tercera, y quizá mayor ventaja, es que el código en regresiones.do puede tener rutas relativas ../entrada/tvdatos.dta en lugar de absolutas C:/origen/salida/tvdatos.dta. Lo cual hace el directorio portátil y ejecutable en cualquier ordenador sin tener que modificar las rutas.

Además, al organizar el código en directorios modulares separados por función, la salida de datos de C:/origen es accesible desde cualquier directorio por varios proyectos que usen los mismos datos sin crear copias redundantes. También es más fácil y rápido depurar el código al estar separado por función.

2013-06-17

Guardar macro como código VBA en Ms Access

Las macros en Access son una buena manera de empezar a automatizar tareas y añadir funcionalidades a la base de datos sin tener que aprender código de VBA. Sin embargo, en algún momento tal vez necesitemos agregar funcionalidades no disponibles mediante el uso de macros. Una buena manera de empezar a familiarizarse con el código VBA en Access (contenido en módulos) es convertir (guardar) una macro en código VBA y examinarlo:

1. Hacemos clic sobre la macro que queremos convertir,


 clic sobre el Botón de Office , Guardar como, Guardar objeto como.

2. En Guardar 'Macro1' en, dejamos el nombre asignado por defecto y en Como elegimos Módulo y presionamos aceptar..


3.  Dejamos activadas ambas casillas de verificación y hacemos clic en Convertir

4. Clic sobre Aceptar
5. Se abrirá el editor de Visual Basic (VBE) y podremos ver la macro convertida en módulo y editar su código.


2013-06-12

Reemplazar carácter en un fichero de texto con VBA en Access

Title En alguna ocasión me he encontrado con el problema de descargar un fichero de texto delimitado por comas cuando necesitaba que el delimitador fuera el punto y coma (mal funcionamiento del programa de inteligencia de negocio).

Quizá la mejor opción sería cambiar el delimitador de nuestras especificaciones de importación en Access. Visita este artículo para ver como acceder a las especificaciones guardadas, y modifica el Delimitador de campo.


También tenemos otras alternativas:

1. Usar el Excel, Bloc de notas, u otro editor de texto como Notepad++, para reemplazar un carácter por otro. Cuando el número de ocurrencias es muy grande, millones en el caso de fichero de tamaño considerable, el proceso puede ser algo lento.

2. Utilizar código de VBA acelerando el proceso notablemente, evitando tener que abrir otros programas, reduciendo la probabilidad de errores y pudiendo llamarlo desde una macro u otro módulo.

Hay que copiar el siguiente código en un módulo de Ms Access:
Public Sub ReemplazarCaracteresAccess()

Dim folderPath As String
folderPath = Application.CurrentProject.Path & "\" 'Ruta del Access

Set fso = CreateObject("Scripting.FileSystemObject")
If fso.FileExists(folderPath & "Inicial.csv") Then
    Set objStream = fso.OpenTextFile(folderPath & "Inicial.csv", 1, False, 0)
End If
    Set objCopy = fso.CreateTextFile(folderPath & "Final.csv")

For x = 1 To 5  'Se salta el nº de líneas indicadas 
    objStream.readline
Next x
 
Do While Not objStream.AtEndOfStream
    strOldLine = objStream.readline
    i = 1
    NewArray = Split(strOldLine, ",")'Carácter reemplazado: ,
       strNewLine = NewArray(0)
       
    Do Until i = UBound(NewArray) + 1
         strNewLine = strNewLine & ";" & NewArray(i)'Carácter nuevo: ;
         i = i + 1
    Loop
    objCopy.WriteLine strNewLine
Loop

End Sub
Notas: El fichero Inicial.csv debe de estar en la misma ruta del Access. El código creará un fichero Final.csv en dicha ruta con el carácter reemplazado. Borrar estas 3 líneas en el caso de que en el fichero de texto no haya que saltarse líneas en blanco y que provocarían un error:
For x = 1 To 5  'Se salta el nº de líneas indicadas 
    objStream.readline
Next x
También se puede usar este código para ficheros *txt. Ejemplo: Inicial.txt y Final.txt

Entradas relacionadas:

2013-06-10

Código y datos para las ciencias sociales- Parte 2

En la entrada anterior, presentamos el manual Code and Data for the Social Sciences: A Practitioner’s Guide, publicado por Matthew Gentzkow y Jesse M. Shapiro. A continuación resumimos algunas de la mejores prácticas que recomiendan.

Capítulo 2- Automatizar 

Es su primera recomendación. Proponen dos reglas:
  1. Automatiza todo lo que puede ser automatizado
  2. Escribe un única secuencia de comandos (script) que ejecute todo el código de principio a fin
Un modo frecuente de trabajar consiste en abrir un fichero en Ms Excel, salvarlo como un fichero de texto. Abrir un programa estadístico o Ms Access, cargar, remodelar, unir ficheros. Realizar nuestro análisis. Finalmente, copiar los resultados, gráficos y conclusiones en un Ms Word, PowerPoint o directamente  en nuestro correo electrónico. Este modo interactivo de trabajar no es recomendable. Nos dan dos razones:
  • La primera razón es la replicabilidad. Si reproducimos los resultados, tienen que ser los mismos. Con el modo anterior de trabajar no hay un registro de los pasos dados para alcanzar los resultados obtenidos.
  • La segunda es eficiencia. No tener que repetir los pasos, quizá cientos, para modificar alguna variable o paso intermedio del análisis. 
Ampliar los límites de la automatización genera grandes dividendos. El coste tiende a ser menor de lo que parece y los beneficios mayores. Como norma uno termina ejecutando cada paso más veces de lo que piensa. Y los costes de repetir manualmente se acumulan rápidamente por encima de los costes de invertir una vez en una herramienta reutilizable.

Capítulo 3- Control de versiones
  1. Almacena el código y los datos controlando su versión
  2. Ejecuta todo el directorio antes de revisar sus ficheros
Existen buenas razones para almacenar múltiples versiones del mismo archivo. La más obvia es que facilitan una manera rápida de eliminar cambios que queremos descartar. Otra es que facilita la comparación. Nos ofrecen información sobre los  programas necesarios para implementar un control de versiones. Mencionan SubVersion repository con el que interactúan con TortoiseSVN. Otros métodos  Git o BitBucket. Se tarda un par de días en montar un repositorio y aprender como interactuar con él. Se recupera esa inversión de tiempo en uno o dos meses.

2013-06-06

Código y datos para las ciencias sociales- Parte 1

A principios de abril de 2013, Matthew Gentzkow y Jesse M. Shapiro (Chicago Booth and NBER) publicaron un conciso y excelente manual, Code and Data for the Social Sciences: A Practitioner’s Guide, sobre las mejores prácticas para escribir buen código y la organización de datos. Y aunque fundamentalmente está dirigido a investigadores, gran parte de las ideas son aplicables para todo aquel que trate de responder a preguntas basándose en datos.

Capítulo 1- Introducción

La investigación empírica en ciencias sociales y el análisis de datos consisten en:
  1. Hacer buenas preguntas. 
  2. Encontrar datos. 
  3. Diseñar análisis estadísticos.
  4. Redactar los resultados.
En la práctica esto significa limpiar, transformar, cortar y combinar datos, y escribir código; para producir los análisis y resultados que buscamos.

Argumentan que gran parte del tiempo, cuando resolvemos problemas con código y datos,  estamos resolviendo problemas que han sido resueltos antes, mejor y a mayor escala. Una buena regla general es: si tratamos de resolver un problema y hay compañías de miles de millones de dólares cuyo modelo de negocio depende de la resolución del mismo, y hay cursos enteros en la universidad dedicados a cómo resolverlo; quizá sería bueno averiguar lo que los expertos hacen y ver si podemos aprender algo de ello.

En los siguientes capítulos, que trataremos en sucesivos entradas, comparten estas mejores prácticas de los expertos.

Parte 1: Introducción
Parte 2: Automatizar y control de versiones
Parte 3: Directorios
Parte 4: Claves
Parte 5: Simplificación y documentación


2013-06-03

Normalizar tablas en Excel con el asistente para tablas dinámicas

Es frecuente encontrarse con tablas sin normalizar.


En este ejemplo, los resultados mensuales de 28 tiendas durante 3 años. En una tabla normalizada para cada registro único necesitaríamos la estructura siguiente con tres campos: Fecha, Tienda y Ventas.

Así tendríamos la tabla preparada para importar desde Access. Para evitar errores reordenando laboriosamente los datos podemos normalizar  la tabla con el Asistente para tablas y gráficos dinámicos.

1. Cambiamos los meses de texto a fechas en las tres tablas. En lugar de ENERO y FEBRERO en  la tabla 2010, tecleamos 01/01/2010 y 01/02/2010 respectivamente. Seleccionamos esas dos celdas y arrastramos el controlador de relleno hasta diciembre. O sustituimos ENERO por 01/01/2010, arrastramos el controlador de relleno y en Opciones de autorelleno elegimos Rellenar meses. Y así sucesivamente en las dos tablas restantes.


Las fechas nos permitirán distinguir los meses de distintos años, con independencia de que luego necesitemos agrupar la tabla dinámica por meses.

2. Abrimos el Asistente para tablas y gráficos dinámicos. A partir de Excel 2007, para invocarlo es necesario teclear la secuencia ALT+T+B (ALT+D+P si el idioma local es inglés) o pulsar sobre el icono agregado a la barra de herramientas de accesso rápido.



3.Seleccionamos Rangos de consolidación múltiples



3. Seleccionamos Campos de página personalizados



4.Seleccionamos el rango (1) y presionamos sobre Agregar (2) tantas veces como rangos añadamos. Finalmente hacemos clic sobre Siguiente (3) o Finalizar, si queremos la tabla dinámica en otra hoja.


5.En el panel Lista de campos de tabla dinámica, en la sección Seleccionar campos para agregar al informe desactivamos la casilla de verificación de los campos Fila y Columna.


6. Doble clic sobre la única celda visible del área valores.
7. Se creará una nueva Hoja donde podremos ver la tabla normalizada.


Cambiaremos los encabezados a Fecha, Tienda y Ventas respectivamente, y el formato de las celdas si fuera necesario. Al importar a Access podremos agregar una clave principal. Por defecto es un campo autonumérico, que rellenará automáticamente con valores de identificador únicos, comenzando por 1.

Entradas relacionadas:
  1. Agrupar tablas dinámicas por meses
  2. Normalización y claves
Nube de datos