Enunciado Proyecto N4
Enunciado Proyecto N4
Enunciado Proyecto N4
Objetivo general
El objetivo de este proyecto es crear una aplicación para analizar información sobre la ejecución presupuestal que hizo
el Estado colombiano en el año 2019. En el desarrollo de esta aplicación pondrá en práctica los conceptos del nivel 4.
Objetivos específicos
1. Implementar algoritmos para construir y recorrer matrices.
2. Utilizar las librerías pandas y matplotlib, así como consultar los sitios web oficiales donde se encuentra toda la
documentación.
3. Descomponer un problema en subproblemas e implementar las funciones que los resuelven.
Instrucciones generales
La descripción de la aplicación le permitirá conocer el alcance, las funcionalidades esperadas y lo que debe realizar en
este proyecto. Tenga en cuenta que, a lo largo de la descripción de la aplicación encontrará secciones con el título
"ATENCIÓN" con indicaciones para conseguir que el resultado de su proyecto corresponda con lo esperado. Es
importante que las siga cuidadosamente. Antes de empezar, le sugerimos leer con atención todo el proyecto. Mientras
lo lee, trate de reconocer los conceptos del curso que tendrá que poner en práctica. Recuerda que este proyecto debe
realizarse de forma completamente individual.
Descripción de la aplicación
La corrupción ha sido uno de los flagelos que más han afectado a Colombia durante toda su historia. Empresas,
municipios, el Estado, e incluso personas del común en su día a día han replicado estas conductas que tanto daño hacen
al país. No obstante, los esfuerzos para combatirla también han sido enormes. Líderes políticos y organismos
gubernamentales han tratado, sin detenerse, de disminuir el efecto de la corrupción en la nación. Uno de estos muchos
esfuerzos se ve reflejado en vigilar los recursos destinados en la celebración de contratos. La Agencia Nacional de
Contratación Pública Colombia Compra Eficiente puso hace casi 10 años la plataforma SECOP II a disposición de todas
las entidades del país para que registren todos sus contratos. Esto no solo ha ayudado a llevar un registro del dinero
invertido, sino que les ha dado la oportunidad a entidades de menor tamaño (como alcaldías de pequeños municipios)
de conocer qué empresas son confiables y cuáles son los precios que deberían pagar por productos y servicios. Como
ciudadanos, todos nosotros podemos enterarnos de qué está comprando cada entidad, a quién, por cuánto dinero y
utilizando qué tipo de método de contratación. Vale la pena aclarar que la información que se registra hoy en día en el
SECOP II no representa ni la totalidad ni la mayoría de los contratos que se firman en el país, aunque se espera que en
el futuro cercano se logre este objetivo.
En este proyecto usted trabajará con datos de una parte de los contratos registrados en el SECOP II, que está disponible
a través del portal de datos abiertos del gobierno colombiano (https://www.datos.gov.co/Gastos-
Gubernamentales/SECOP-II-Contratos-Electr-nicos/jbjy-vk9h). En el archivo “2019.csv” usted encontrará una versión
simplificada de los datos originales: suprimimos algunas entradas incompletas, contratos en borrador, y columnas que
no vamos a utilizar en este proyecto. Además, eliminamos los contratos de años anteriores al 2019. Con este conjunto
de datos usted puede participar en la difícil tarea de combatir la corrupción y conocer un poco más sobre cómo se
invierten los recursos del país para construir un mejor futuro para todos.
Nota: Las tildes y eñes han sido suprimidas del archivo para evitar problemas de formatos al leer los datos. Los demás
errores de ortografía, como el uso indebido de mayúsculas/minúsculas en algunas palabras, se deben a que los datos
originales del SECOP II se encuentran así.
ATENCIÓN: cuando esté estudiando el problema y el archivo, recuerde que las funciones describe() y unique() pueden
serle de utilidad. La función describe() aplicada sobre un DataFrame retorna información estadística de todas las
columnas numéricas. La función unique(), aplicada sobre una columna, retorna una lista con los valores únicos que
aparezcan en esa columna.
Requerimiento 4: Repartición porcentual del valor total de los contratos entre las diferentes ramas del Estado
El cuarto requerimiento de la aplicación es permitir generar una gráfica de tipo pie que muestre la repartición
porcentual del valor total de los contratos del Estado entre las diferentes ramas que los celebran. Recuerde que esta
información se encuentra en la columna Rama del DataFrame. La siguiente figura muestra la apariencia que debe tener
esta gráfica.
1
Piense, por ejemplo, en los contratos relacionados con el metro de Bogotá.
ATENCIÓN: Puede configurar el tamaño de la figura con el parámetro figsize=(8,8) al momento de crear la figura.
En esta última parte de la aplicación no se trabajará directamente sobre el DataFrame original, sino que se creará una
matriz a partir de este. La matriz debe relacionar el monto de los contratos de cada uno de los departamentos y los
sectores en los cuales se desarrollan dichos contratos.
La primera fila (fila 0) tiene los nombres de cada uno de los diferentes sectores de inversión definidos en la columna
Sector del DataFrame, mientras que la primera columna (columna 0) tiene los nombres de los departamentos tal como
están definidos en la columna Departamento del DataFrame. Cada posición (f, c) en la matriz representa el valor total
de los contratos firmados por el departamento f y desarrollados en el sector c. Por ejemplo, si “Antioquia” está en la
fila 9, y “Cultura” se encuentra en la columna 8, la casilla de la posición (9, 8) representa la suma del valor de todos los
contratos del departamento de Antioquia desarrollados en el sector de Cultura. Note también que la suma de una fila
completa de la matriz nos da como resultado el valor total de todos los contratos del respectivo departamento,
mientras que la suma de una columna completa de la matriz nos da como resultado el valor total de los contratos
invertidos en el respectivo sector.
La función que usted implementará en este punto debe recibir por parámetro el DataFrame original y retornar una
matriz con la estructura e información descritas anteriormente. Es importante que antes de proceder a construir la
matriz, realice un filtro sobre el DataFrame para excluir las filas que tienen como valor en la columna Departamento
un “No Definido”.
ATENCIÓN:
Recuerde que tiene a su disposición la función unique() para obtener todos los valores únicos de una columna
en un DataFrame.
Para comprobar que los valores de la matriz creada son los correctos puede utilizar filtros, agrupaciones y
sumas sobre el DataFrame original y verificar que estos arrojen el mismo resultado que el almacenado en su
matriz.
Puede ser de mucha utilidad pensar en descomponer el problema en varios problemas más pequeños e
implementar la solución usando varias funciones.
Nota importante: Dado que el tamaño del DataFrame es bastante grande, es muy probable que la construcción de la
matriz tarde más tiempo del que suelen tardar otras funciones. Si el tiempo supera los 2 minutos es muy probable que
haya un problema en el código. Le recomendamos que detenga el programa y revise si existe algún error en sus
funciones. También le recomendamos que pruebe sus funciones con un subconjunto de los datos (por ejemplo sólo
con los contratos que tengan un valor inferior a 1 millón de pesos).
Utilizando como base la matriz anterior, usted deberá implementar los siguientes requerimientos.
Requerimiento 7: Sectores en los que el estado invierte más y menos, de acuerdo al valor de sus contratos
Este requerimiento debe calcular en cuáles sectores el estado ha gastado más y menos dinero teniendo en cuenta
todos los contratos celebrados en cada sector. Para esto, el usuario debe indicar si desea conocer el sector de mayor
gasto o el sector de menor gasto y suministrar la matriz de departamentos vs. sectores. La función que implemente
esta opción debe retornar una tupla que tenga en la primera posición el nombre del sector y en la segunda posición el
valor total de los contratos. Estos dos datos se le deben informar al usuario.
ATENCIÓN: Para calcular con mayor facilidad el resultado, le recomendamos guardar el valor total de los contratos de
cada departamento en un diccionario auxiliar y usar este diccionario para armar el diccionario final.
Una vez obtenidos los 10 departamentos con mayor gasto, se debe mostrar la información en una gráfica de barras.
Para la construcción de esta gráfica, primero construiremos un nuevo DataFrame a partir del diccionario que se acaba
de generar. El siguiente fragmento de código permite construir un DataFrame con las características deseadas a partir
de un diccionario:
df = pd.DataFrame.from_dict(diccionario,orient='index',columns=['Gasto'])
En la instrucción anterior “diccionario” es el nombre de la variable donde se guardó el diccionario con los 10
departamentos con mayor gasto y “Gasto” es el nombre que se le va a dar a la columna en el nuevo DataFrame que
contendrá los valores del diccionario.
Luego de construir este nuevo DataFrame, el siguiente paso es generar una gráfica de barras. La gráfica resultante debe
tener la siguiente apariencia:
El usuario debe suministrar la matriz de departamentos vs. sectores y el nombre de un sector de su interés. La función
que usted desarrolle debe construir un diccionario que tenga como llaves los nombres de los 5 departamentos que
lideran en dicho sector de acuerdo con esta estadística, y como valores sus respectivos porcentajes dedicados al sector
de interés.
Una vez obtenidos los 5 departamentos con mayor gasto, se debe mostrar la información sobre un mapa de Colombia.
Para esta visualización utilizaremos el archivo mapa.png (que se encuentra adjunto a este enunciado), el cual es una
imagen del mapa de Colombia en blanco y negro con resolución de 800x800 píxeles. La idea es indicar dentro del mapa
los departamentos que hayamos encontrado como los de mayor dedicación al sector. Para cada uno de estos
Departamentos, se pintará un pequeño cuadrado de 13x13 píxeles centrado en las coordenadas (en píxeles) del
Departamento dentro el mapa. Las coordenadas de los 33 departamentos se encuentran en el archivo coordenadas.txt
(que se encuentra adjunto a este enunciado).
Para cargar el mapa como una matriz de píxeles y luego visualizarlo puede guiarse por el siguiente fragmento de código:
import matplotlib.image as mpimg
mapa = mpimg.imread("mapa.png").tolist()
plt.imshow(mapa)
plt.show()
La siguiente función le permitirá cargar el archivo de coordenadas y retornar un diccionario, cuyas llaves son los
nombres de los departamentos y los valores son tuplas con las coordenadas (x,y) de cada departamento. El nombre del
departamento en este archivo es idéntico al que se encuentra en el DataFrame y en la matriz.
def cargar_coordenadas(nombre_archivo:str)->dict:
deptos = {}
archivo = open(nombre_archivo, encoding="utf8")
titulos = archivo.readline()
linea = archivo.readline()
while len(linea) > 0:
linea = linea.strip()
datos = linea.split(";")
deptos[datos[0]] = (int(datos[1]),int(datos[2]))
linea = archivo.readline()
return deptos
Una vez cargado el mapa y construido el diccionario de coordenadas, el siguiente paso es utilizar dichas coordenadas
para pintar en el mapa los 5 departamentos más dedicados a este sector. Para esta visualización se desea que cada
puesto en la clasificación (de los departamentos más dedicados a un sector) esté asociado a un color RGB en particular.
La siguiente tabla indica los colores deseados.
Cada uno de los cuadrados en el mapa debe utilizar uno estos colores, y se debe respetar el orden de la clasificación.
La siguiente gráfica muestra el mapa para el sector de “Ley de Justicia”, en donde el top 5 de estados está compuesto
en ese orden por: Norte de Santander, Cauca, Sucre, Cesar y Narinho:
ATENCIÓN: Tenga en cuenta que puede suceder que alguno de los sectores no alcance a tener contratos en al menos
5 departamentos. Es decir que el número de departamentos que han celebrado contratos para dicho sector es menor
a 5. En este caso el diccionario debe solo incluir tantas parejas llave-valor como departamentos haya, y no incluir ningún
departamento que tenga 0% de sus gastos dedicados a tal sector.
Entrega
7. Comprima los dos archivos: contratos.py y consola.py en un solo archivo .zip. El archivo comprimido debe llamarse
“N4-PROY-login.zip”, donde login es su nombre de usuario de Uniandes.
8. Entregue el archivo comprimido a través de BrightSpace en la actividad designada como “Proyecto N4”.