jueves, 29 de febrero de 2024

¿Cómo definir adecuadamente un indicador?

Concepto de indicador.

Un indicador representa los productos obtenidos en las actividades de medición, y deben emplearse como fuente de información de soporte para la toma de decisiones. Para el diseño de los indicadores es importante considerar la frecuencia adecuada de toma de datos, el tiempo requerido para generarlo, la necesidad de datos históricos, entre otros factores.

Tipos de indicadores.

Indicadores de progreso: se utilizan para dar seguimiento a la ejecución de tareas definidas. El cumplimiento del indicador es señal de que la tarea se sta cumpliendo, más no significa que este garantizado el logro de los objetivos del negocio, el incumplimiento de un indicador por otra parte si es indicativo de problemas.
Indicadores de análisis: se emplean para ayudar en el análisis de las salidas producidas por las tareas. Pueden resultar positivos o negativos dependiendo del resultado del cálculo fijado como base para el análisis.
Indicador en estilo coordenadas polares.
Fuente: elaboración propia


Requisitos previos para generar un indicador

  1. Diseñar las preguntas clave que se busca responder con el indicador es el primer paso para que los mismos sean de utilidad.
  2. Seleccionar los elementos de datos necesarios y adecuados para generar el indicador es la base para que el mismo cumpla su objetivo.
  3. Definir las métricas adecuadas para el indicador es la base para que el mismo responda a las preguntas que se plantearon al diseñarlo.

¿Qué hacer con los valores obtenidos por los indicadores?

Una vez que se  ponen en marcha los indicadores es importante que previamente se haya definido que pasos seguir en consecuencia de los valores que los mismos devuelvan.
Los resultados de los indicadores definidos (si es que contaremos con más de uno) y su evolución a través de los tiempos de medición definidos deberán servir de base para la planificación de las acciones correctivas, preventivas, de mantenimiento o mejora a seguir para asegurar el éxito del negocio.
¿Qué puntos deben definirse al elaborar un indicador?
  • Objetivo del indicador: su propósito.
  • Preguntas: la lista de preguntas que intentan responderse con el indicador.
  • Representación gráfica del indicador: definiendo su correcta representación en cuanto a simbología, colores, escalas.
  • Perspectiva: la descripción de la audiencia de interés para la que se definió el indicador.
  • Entradas: la lista y definiciones de las métricas para construir el indicador, así como de las fuentes de los datos.
  • Algoritmos: descripción de los pasos necesarios para construir el indicador a partir de las métricas definidas.
  • Suposiciones: lista de supuestos de la organización, sus procesos modelo del ciclo de vida, y demás datos importantes para obtener y usar el indicador.
  • Información de la toma de datos: Cómo, cuándo y con que frecuencia se recolectaran los datos para construir el indicador, así como las consideraciones sobre la calidad de los datos y su proceso previo (si es que lo tuviesen). 
  • Información de la generación de informes de los datos: quien será responsable de generar los informes,   para quienes y la frecuencia de almacenamiento, recuperación, seguridad de los datos, así como su conservación.
  • Análisis e interpretación de resultados: información sobre como interpretar el resultado del indicador.

¿Cómo dar seguimiento a los indicadores?

Las principales actividades que deben cumplirse para dar utilidad al establecimiento de indicadores en una organización son:
Planificar la medición basandose en los destinatarios de la medición, las entidades a ser medidas, y las métricas adecuadas para los mismos.
Realizar la medición y presentar los resultados.
Evaluar la medida y ajustarla periodicamente en caso necesario.
Establecer y mantener el compromiso de mantener los indicadores validados, es decir, capacitar, formar y dotar de herramientas a la parte encargada de realizar las mediciones, así como asegurarse de que los mismos dispongan de los medios para cumplir su función adecuadamente.

Bibliografía.

Piattini, Mario G.; García, Felix O.; Caballero, Ismael (2009) Calidad de sistemas informáticos, Tercera reimpresión, Alfaomega-Ra-Ma, México.

martes, 22 de agosto de 2023

Crear gráficos a partir de un conjunto de datos con pandas y Python

 Cárdenas, Tabasco a 22 de agosto de 2023.- Cuando se trabaja con datos por lo general se nos pide que realicemos tareas de clasificación, comparación y gráficos con los mismos, en esta ocasión trabajaremos en la creación de tablas resumen de los datos y en sus gráficos respectivos utilizando como entrada archivos csv (valores separados por comas) que bien podrían ser datos obtenidos directamente de una consulta SQL a la base de datos, pero como casi todas las bases de datos tienen inconsistencias en los datos almacenados, en preferencia vamos primero a obtener los datos en un archivo csv, y posteriormente procederemos a limpiar los datos para que nuestros resúmenes de los datos y sus gráficas sean lo más precisas y claras posible.

El primer paso consiste en leer los datos usando la librería pandas a través de las siguientes instrucciones:

Paso 1.- importar la librería pandas, leer el archivo y colocarlo en un DataFrame.  

Con estas instrucciones iniciales creamos el conjunto de datos que va a ser la base de la creación de nuestro archivo xlsx de resumen y sus gráficas.

Paso 2.- Creamos dos DataFrames adicionales que contengan el resumen de los datos creado con un pivoteo de los datos.
Los DataFrames creados contendrán la información resumida por los índices definidos en el pivoteo, los valores a contar será un campo que nos sirva para contar en este caso las matrícula y el conteo lo realizará la función agregada "count",  las columnas serán a aquellos valores contenido en la columna que deseamos clasificar, en este caso los sexos (Masculino/Femenino) y los turnos (Matituno/Vespertino); así mismo, utilizaremos la opción fill_value= para indicar que rellene con ceros aquellos espacios de columna que no tengan ningún elemento (por ejemplo filas en las que solo hay sexo femenino, o turnos vespertinos)
Resultado de pivotear la tabla sobre varios índices presentes en nuestro DataFrame.
Podemos observar que los datos se han agrupado y se han contado cuantas matrículas están presentes en cada uno de los planes, en este caso vemos que todas las columnas tienen valores. Pero hay ocasiones en las que alguna de las columnas no registra valores como es el caso de los turnos, en este caso el valor no presente se rellena con un cero.

La columnas sin valores en este resumen se rellenan con cero.
En los dos ejemplos anteriores, se realizó un resumen sobre una columna que contaba con dos posibles valores (Sexo y Turno), sin embargo, existen situaciones en las que las columnas resultantes son múltiples o solo una, en estos casos para facilitar el resumen de los datos vamos a hacer uso del agrupamiento de datos en lugar del pivoteo de tablas, como podemos ver a continuación.

Este otro método permite clasificar fácilmente datos cuando solo nos interesa la sumatoria final de los mismos. 
Como podemos ver el objetivo es conocer la cantidad de incidencias que hay en cada uno de los municipios que aparecen en la columna de municipios de procedencia (MUN_PROC), para ello usamos una función muy similar a los comandos de SQL que se denomina "groupby" e indicamos que queremos en conteo de apariciones de cada valor, podemos observar que en este caso los diferentes nombres se organizan en filas, en lugar de hacerlo en forma de columnas como en el caso de los sexos y los turnos.

Al usar la instrucción groupby los diferentes valores contenidos en la columna MUN_PROC se ordenan como filas de la tabla resumen, en lugar de hacerlo como columnas como en los resúmenes de sexos y turnos.

La misma operación de conteo podemos hacer la para las carreras, en cuyo caso nos interesa saber ya no la cantidad de personas de un sexo u otro, sino el total presente en cada programa educativo.

Con la función groupby obtenemos ahora los programas educativos y sus matrículas totales.
Resultado de contar el número de personas que están inscritas en cada programa educativo

El resultado de estos resúmenes de datos podemos trasladarlo ya fácilmente a un archivo formato xlsx, que deberá ser formateado para entrega a quien requiere la información, utilizando las instrucciones ExcelWriter y to_excel de los DataFrames de pandas.

Con estas sencillas instrucciones los DataFrames creados con los resúmenes de los datos son trasladados a un archivo formato xlsx que puede ser editado para su presentación ejecutiva.

Lo último que necesitamos son la generación de los gráficos que presenten la información de las tablas de manera visual y eso lo logramos con la instrucción plot de los DataFrames y la configuración de los correspondientes parámetros.

Creación del gráfico correspondiente para el conjunto de datos resumen de turnos.
Con las instrucciones anteriores lo que logramos es un gráfico en formato png, que tiene una resolución de 300 dpi, y un tamaño de 10 pulgadas por 3 pulgadas.

Resultado de usar el comando plot sobre el DataFrame que resume la matrícula por programa educativo.

Como podemos ver es posible definir el tipo de la imagen, su tamaño y los colores de las series de datos, así como, los títulos de los ejes y del gráfico. La imagen será guardada en un archivo en formato png con las características definidas en los parámetros que enviamos a la funcionalidad plot.

Resultado del procesamiento de los datos en un archivo xlsx

En el directorio que trabajemos la información quedarán guardados todos los archivos resultantes del procesamiento, en este caso podemos ver el archivo py de las instrucciones, el archivo csv que contienen los datos a procesar, los archivos png resultantes de la graficación del comando plot de los DataFrames, y el archivo xlsx resultante de la aplicación de los comandos ExcelWriter y to_excel, así como el archivo con el mismo nombre que el xlsx y la palabra gráficos que es donde integramos todo para su presentación ejecutiva.

Realizar la consulta a la BD y limpiar los datos nos tomará unos 30 minutos dependiendo de la cantidad de registros, escribir el código nos tomará aproximadamente 10 minutos, procesar los datos unos segundos,  y editar el archivo para su presentación ejecutiva otros 30 minutos, estos tiempo disminuyen mucho conforme más práctica vayamos tomando en el proceso de los datos. Y podrían beneficiarnos en disminuir el tiempo de generación de la información de días o semanas a minutos o en el peor de los casos horas.

Espero que las explicaciones proporcionadas basten para guiar la creación de tus propios cuadros resumen y sus correspondientes gráficos y faciliten tu trabajo administrativo.







viernes, 13 de mayo de 2022

Obtener datos de una consulta Oracle directo a un DataFrame de PANDAS y renombrar las columnas

En esta ocasión les compartiré mi experiencia obteniendo datos directamente de la base de dsatos Oracle sin almacenar los resultados en un archivo CSV, para losgrar esto deberemos instalar el instant client correspondiente a nuestra versión de sistema operativo en el equipo (funciona para Linux Ubuntu 20.04, Windows 10) y ponerlo en la ruta de búsqueda definida del sistema (PATH), una vez realizado esto, podremos conectar a la BD de Oracle de forma habitual en cualquiera de los métodos que para ello nos propociona la libreria cx_Oracle, en mi caso me gusta conectarme en un solo paso escribiendo los datops de conexión en el programa (asumiendo que trabajamos en un entorno seguro, de no ser así, les aconsejo que pidan los datos de conexión a través de variables en cada ejecución (más tedioso, pero más seguro).

Librerias Python (cx_Oracle, pandas)
Figura 1.- Librerias necesarias para obtener los datos y manipularlos.
Fuente: elaboración propia.

El primer paso como se ve en la figura 1 es importar las librerias que nos permitirán realizar la conexión a la base de datos y almacenar los datos en un DataFrame. posteriormente se deberá de realizar las instrucciones necesarias para localizar la instancia de la base de datos, el alías del servidor, el usuario y la contraseña del mismo, como mencione antes, en mi caso escribo la cadena de conexión directamente en el script, ya que mi equipo se encuientra en una ubicación segura y el usuario que se emplea en la consulta no tiene ´rivilegios para afectar los datos consultados. En la figura 2 podemos observar las instrucciones necesarias para lograr la conexión, hecho esto el script de Python esta listo para realizar la consulta y devolvernos los datos.
Cadenas de conexión a oracle
Figura 2.- Instrucciones necesarias para preparar la consulta a la base de datos de oracle.
Fuente: elaboración propia. 
La cadena de conexión deberá estar formada por los siguientes datos <usuario oracle>/<contraseña>@<dirección del servidor>/<nombre de la instancia> todo ello concatenado en una cadena de texto, que se pasa a la variable conn_str.
Por ejemplo: si tu usuario es 'miguel', tu contraseña es 'm2022a', la dirección de servidor es '192.168.1.254', el puerto de Oracle es '1521' y la instancia se llama 'datawarehouse' la cadena de conexión será 'miguel/m2022a@192.168.1.254/datawarehouse'
Figura 3.- La consulta a la base de datos se puede escribir en una sola línea.
Fuente: elaboración propia.
Ya que para Python es indiferente que usemos un apostrofe simple o una comilla doble para definir textos, pero para Oracle no es así y se pide que los textos en una consulta se delimiten con apostrofes, se aconseja que la consulta SQL se entrecomille, y así podemos conservar la consulta SQL tal cual la tenemos escrita en nuestro ambiente PL/SQL.
Variables obtenidas
Figura 4.- En el explorador de variables del IDE Spyder podemos ver que el DataFrame dadm tiene como nombres de columna los números 0 a 22.
Fuente: elaboración propia.
Al ejecutar estas instrucciones podemos ver que despues de la consulta los resultados de la misma se almacenan en un objeto tipo DataFrame que se crea de forma dinámica (no se define su estructura con anterioridad), y que el mismo se popula con los resultados de la consulta con la instrucción fetchall(). 
Figura 5.- El DataFrame obtenido al ejecutar el script, con sus columnas numeradas de 0 a 23.
Fuente: elaboración propia.
La variable creada contendra todos los datos de la consulta pero los nombres de las columnas definidos en nuestra consulta SQL, que exportados a un CSV nos permitirian al cargarlos en un DataFrame con la instrucción read_csv() de pandas, obtener las columnas nombradas de forma correcta, en este caso dichos encabezados no existen y las columnas con datos se numeran a partir de 0 (cero), lo cual podría resultarnos dificil de manejar al procesar la información, para solucionar este inconveniente, es posible utilizar la instrucción rename y nombrar las columnas como mejor nos convenga.
rename()
Figura 6.- instrucciones necesarias para renombrar las columnas del DataFrame.
Fuente: elaboración propia.
Para renombrar las columnas tendremos que crear un diccionario al cual podremos nombrar como se nos ocurra, en este caso se nombro como colnom (abreviación de columnas nombre) y posteriormente aplicar la instrucción rename() sobre el propio DataFrame para que se actualicen los nombre de las colñumnas.
variables actualizadas
Figura 7
.- Variables despues del renombrado de las columnas, ahora existe una variable de tipo diccionario y el DataFrame tienen nombres en vez de números en sus columnas.
Fuente: elaboración propia.
Renombrar las columnas de un DataFrame nos será de mucha utilidad para clarificar nuestro código a futuros lectores, si bien, no es algo necesario, si es una buena práctica, es mucho más fácil inferir que una columna llamada promedios contiene el promedio de algo, que memorizar que la columna con los promedios es la numero 28. En el caso de la consulta de nuestro ejemplo, no hay níngún dato de dificil identificación para un ojo experto, pero los usuarios nuevos (recien contratados por lo general) suelen desconocer por completo los datos, no esta demás que tengamos la buena costumbre de facilitar las posibles revisiones de códigos por parte de terceros y disminuir la curva de aprendizaje de los mismos desde el origen mismo de nuestros scripts.
DataFrame nombrado
Figura 8.- El DataFrame con las columnas renombradas es más descriptivo de su contenido.
Fuente: elaboración propia.
Siempre srá más fácil para todos comprender un código donde cada cosa se nombra por su nombre común o por una abreviatura consistente que un código donde dejamos que el lenguaje asigne arbitrariamente los indices a nuestras estructuras de datos. Es posible que el programador autor del script sea muy bueno recordando como organizao la información, pero siempre es mejor preveer que es posible que en algún momento no estemos y nuestro código deberá ser modificado, y en caso de que no se logre modifiicar, indudablemente sera desechado y se escribirá un nuevo script que lo sustituya.
Espero que este pequeño aporte contribuya a facilitar el camino en el aprendizaje de Python para aquellos entusiastas del aprendelo por tu cuenta, y que este lenguaje gane cada vez más adeptos en el ambiente administrativo ya que la libreria pandas es como un Excel con super poderes, y facilita hasta la visualización de datos mediante la propia libreria pandas o mediante muchas otras librerias especializadas como matplotlib, seaborn y muchas otras. Trabajos administrativos que con Excel podrían tomar 7 o más días en lo que se realizan las consultas a base da datos, se depuuran los datos, se obtienen los archivos fuentes, se procesan para obtener las tablas de datos, se conviernten estás mismas en tablas dinámicas y se generan diferentes gráfi, es posible hacerlos en un solo día inviertiendo algo de tiempo en la elaboración de un script de Python que utilizando pandas, cx_Oracle y algunas otras librerias según la necesidad obtengan los datos y los procesen automáticamente.
En mi experiencia un proceso de generación de indicadores para informes trimestrales nos podía tomar entre 7 y 9 días debido a errores al mover los datos de una tabla a otra o en la escritura de las fómulas, hoy el script de Python se encarga de todo y tenemos la certeza de que los cálculos cuadran se manipulen de la forma que sea ya que las validaciones no permiten que haya esas problematicas diferencias de 1 dato más o un dato menos, que suelen ocurrir cuando movemos datos entre libros de Excel o hasta entre las hojas de un mismo libro de forma manual.