6. Simulación de Encuestas de Hogares

numpy/numpy-aplicado-parte7
@Lautaroff 04-03-2025

Este ejercicio te lo dejo para que lo intentes solo/a. Abajo encontrarás un código de ejemplo para que lo compares y un video explicativo, pero intenta verlo después de hacer el tuyo.


Consigna

En este ejercicio, deberás simular datos sobre ingresos, gastos y características demográficas de una población ficticia. Para ello, implementarás funciones que generen aleatoriamente categorías de edad, números de identificación (DNI), ingresos y gastos.

Pasos a seguir:

1️⃣ Generar la edad de las personas:

2️⃣ Generar el número de DNI según la edad:

3️⃣ Asignar ingresos:

4️⃣ Generar número de miembros en el hogar:

5️⃣ Calcular gastos mensuales:

6️⃣ Ejecutar simulaciones:


¡Intenta resolverlo y luego compara con el código de ejemplo y el video explicativo! 🚀

import numpy as np

def generar_dni(edad_categoria):
    if edad_categoria == 'mayor_60':
        return np.random.randint(5000000, 15000000)
    elif edad_categoria == 'mayor_21':
        return np.random.randint(15000000, 40000000)
    else:
        return np.random.randint(40000000, 50000000)

def generar_edad():
    valor = np.random.rand()
    if valor <= 0.7:
        return 'joven'
    elif valor <= 0.9:
        return 'mayor_21'
    else:
        return 'mayor_60'

def generar_ingreso(edad_categoria):
    if edad_categoria in ['mayor_21', 'mayor_60']:
        return np.random.randint(800000, 1500000)
    else:
        return np.random.randint(800000, 1500000) * 0.8

for n in [100, 1000]:
    edades = np.array([generar_edad() for _ in range(n)])
    dni = [generar_dni(edad) for edad in edades]
    ingresos = np.array([generar_ingreso(edad) for edad in edades])
    miembros_hogar = np.round(np.random.normal(5, 1, n))
    gastos_total = ingresos * np.where(np.random.rand(n) < 0.8, 0.9, 0.8)
    gasto_telefonia = gastos_total * 0.15
    gasto_internet = gastos_total * 0.078

    print(f"Simulación para {n} personas:")
    print(f"Promedio de ingresos mensuales: ${np.mean(ingresos):.2f}")
    print(f"Desvío estándar de ingresos mensuales: ${np.std(ingresos):.2f}")
    print(f"Promedio de gastos mensuales totales: ${np.mean(gastos_total):.2f}")
    print(f"Desvío estándar de gastos mensuales totales: ${np.std(gastos_total):.2f}")
    
    prop_jovenes = np.sum(edades == 'joven') / n
    print(f"Proporción de jóvenes: {prop_jovenes:.2%}")
    print("Datos de jóvenes:")
    print(f"Promedio de miembros en hogar: {np.mean(miembros_hogar[edades == 'joven']):.2f}")
    print(f"Promedio de gasto en telefonía: ${np.mean(gasto_telefonia[edades == 'joven']):.2f}")
    print(f"Promedio de gasto en internet: ${np.mean(gasto_internet[edades == 'joven']):.2f}")
    print("\n")
Lección Anterior Curso Siguiente Lección