EJERCICIO 1
María es la dueña de una pequeña tienda de tecnología y accesorios, y quiere analizar el desempeño de sus productos durante un periodo de ventas. Para esto, necesita un programa que le permita registrar los productos, sus categorías y precios unitarios, generar aleatoriamente las unidades vendidas, calcular el ingreso total por producto, identificar el producto con mayor ingreso y agrupar los ingresos por categoría para obtener un panorama general de las ventas. Además, desea visualizar los ingresos por categoría y la proporción de unidades vendidas por producto mediante gráficos.
RESOLUCIÓN
# Importamos librerías necesarias
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# Creamos el DataFrame inicial con productos, categorías y precios
datos_iniciales = {
'Producto': ['Laptop', 'Mouse', 'Teclado', 'Monitor', 'Webcam', 'Audífonos', 'SSD 500GB'],
'Categoría': ['Computación', 'Periférico', 'Periférico', 'Monitor', 'Periférico', 'Audio', 'Almacenamiento'],
'Precio_Unitario_USD': [1200, 25, 45, 300, 50, 80, 60]
}
df_ventas = pd.DataFrame(datos_iniciales)
# Generamos aleatoriamente las unidades vendidas
np.random.seed(42)
df_ventas['Unidades_Vendidas'] = np.random.randint(10, 51, size=len(df_ventas))
# Calculamos el ingreso total por producto
df_ventas['Ingreso_Total_USD'] = df_ventas['Precio_Unitario_USD'] * df_ventas['Unidades_Vendidas']
# Agrupamos ingresos por categoría y encontramos el producto con mayor ingreso
ingreso_por_categoria = df_ventas.groupby('Categoría')['Ingreso_Total_USD'].sum().sort_values(ascending=False)
producto_estrella = df_ventas.loc[df_ventas['Ingreso_Total_USD'].idxmax()]
print("--- Ingreso Total por Categoría ---")
print(ingreso_por_categoria)
print("\n--- Producto con Mayor Ingreso Total ---")
print(producto_estrella)
# Visualizamos los resultados
plt.figure(figsize=(10, 6))
plt.bar(ingreso_por_categoria.index, ingreso_por_categoria.values, color='skyblue')
plt.title('Ingreso Total por Categoría de Producto')
plt.xlabel('Categoría')
plt.ylabel('Ingreso Total (USD)')
plt.xticks(rotation=45)
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.tight_layout()
plt.show()
plt.figure(figsize=(8, 8))
unidades_por_producto = df_ventas.groupby('Producto')['Unidades_Vendidas'].sum()
plt.pie(unidades_por_producto, labels=unidades_por_producto.index, autopct='%1.1f%%')
plt.title('Proporción de Unidades Vendidas por Producto')
plt.axis('equal')
plt.show()
EJERCICIO 2
Se tiene un archivo CSV con datos de empleados de una empresa. Se solicita cargar la información en un DataFrame, eliminar las filas con valores nulos, identificar empleados de TI con cargo Senior y empleados de Ventas con menos de 5 años de servicio, agregar una columna de bono por antigüedad para quienes tienen 5 o más años de servicio, y guardar toda la información en un archivo Excel con tres hojas: la lista completa de empleados, los empleados Senior de TI y los empleados Junior de Ventas.
RESOLUCIÓN
# Importamos pandas
import pandas as pd
# Cargamos los datos desde el archivo CSV y limpiamos nulos
df = pd.read_csv('empleados.csv', encoding='utf-8')
df_limpio = df.dropna().copy()
# Filtramos empleados de TI con cargo Senior y de Ventas con menos de 5 años de servicio
df_it_senior = df_limpio[(df_limpio['Departamento'] == 'TI') & (df_limpio['Cargo'] == 'Senior')]
df_ventas_junior = df_limpio[(df_limpio['Departamento'] == 'Ventas') & (df_limpio['Años_Servicio'] < 5)]
# Agregamos columna de bono por antigüedad
df_limpio['Bono_Antiguedad'] = 0
df_limpio.loc[df_limpio['Años_Servicio'] >= 5, 'Bono_Antiguedad'] = 1000
# Guardamos todo en Excel en hojas separadas
with pd.ExcelWriter('reporte_empleados.xlsx') as writer:
df_limpio.to_excel(writer, sheet_name='Empleados', index=False)
df_it_senior.to_excel(writer, sheet_name='TI_Senior', index=False)
df_ventas_junior.to_excel(writer, sheet_name='Ventas_Junior', index=False)
EJERCICIO 3
Se dispone de un archivo CSV llamado ventas_videojuegos.csv con información de ventas de videojuegos. Se solicita cargar los datos en un DataFrame, calcular el ingreso total por género, determinar el género con mayor ingreso total, calcular el precio promedio de los productos, identificar los 3 productos más vendidos y guardar esta información en dos archivos CSV: uno con el ingreso por género y otro con un resumen que incluya el precio promedio y los 3 productos más vendidos. Además, se deben visualizar los resultados con un gráfico de barras para ingreso por género y un gráfico circular de proporción de ventas por plataforma.
RESOLUCIÓN
# Importamos pandas y matplotlib
import pandas as pd
import matplotlib.pyplot as plt
# Cargamos los datos desde el archivo CSV
df = pd.read_csv('ventas_videojuegos.csv', encoding='utf-8')
# Calculamos el ingreso total por género
ingreso_por_genero = df.groupby('Género')['Ingreso'].sum()
# Identificamos el género con mayor ingreso
genero_top = ingreso_por_genero.idxmax()
# Calculamos el precio promedio de todos los productos
precio_promedio = df['Precio'].mean()
# Obtenemos el top 3 de productos más vendidos (por unidades)
top3_productos = df.groupby('Producto')['Unidades_Vendidas'].sum().sort_values(ascending=False).head(3)
# Guardamos el reporte de ingreso por género en CSV
ingreso_por_genero.to_csv('reporte_ingreso_por_genero.csv')
# Creamos un reporte resumen con el precio promedio y los top 3 productos
reporte = pd.DataFrame({
'Precio_Promedio': [precio_promedio],
'Top_3_Productos': [', '.join(top3_productos.index)]
})
# Guardamos el reporte resumen en CSV
reporte.to_csv('reporte_resumen.csv', index=False)
# Graficamos el ingreso por género en un gráfico de barras
ingreso_por_genero.sort_values().plot(kind='bar')
plt.title('Ingreso por Género')
plt.xlabel('Género')
plt.ylabel('Ingreso')
plt.tight_layout()
plt.show()
# Calculamos el porcentaje de ventas por plataforma
plataforma_porcentaje = df['Plataforma'].value_counts(normalize=True)
# Graficamos la distribución por plataforma en un gráfico circular
plataforma_porcentaje.plot(kind='pie', autopct='%1.1f%%')
plt.ylabel('')
plt.title('Distribución por Plataforma')
plt.tight_layout()
plt.show()
EJERCICIO 4
Se dispone de un archivo CSV con información de películas llamado peliculas.csv con columnas: Título, Presupuesto_USD, Ingresos_USD, Rating y Género. Se solicita: (1) calcular el ROI de cada película como (Ingresos - Presupuesto) / Presupuesto
, (2) identificar la película con mayor ROI, (3) calcular el promedio de rating por género, (4) guardar la información en un archivo CSV llamado reporte_peliculas.csv y (5) generar un gráfico de dispersión que muestre la relación entre presupuesto y rating.
RESOLUCIÓN
# Importamos pandas y matplotlib
import pandas as pd
import matplotlib.pyplot as plt
# Cargamos el archivo CSV
df_peliculas = pd.read_csv('peliculas.csv', encoding='utf-8')
# Calculamos ROI para cada película
df_peliculas['ROI'] = (df_peliculas['Ingresos_USD'] - df_peliculas['Presupuesto_USD']) / df_peliculas['Presupuesto_USD']
# Identificamos la película con mayor ROI
pelicula_top = df_peliculas.loc[df_peliculas['ROI'].idxmax()]
# Calculamos promedio de rating por género
promedio_rating_genero = df_peliculas.groupby('Género')['Rating'].mean()
# Mostramos resultados en consola
print("--- Película con Mayor ROI ---")
print(pelicula_top)
print("\n--- Promedio de Rating por Género ---")
print(promedio_rating_genero)
# Guardamos resultados en CSV
df_peliculas.to_csv('reporte_peliculas.csv', index=False)
print("\nReporte 'reporte_peliculas.csv' generado exitosamente.")
# --- Gráfico de Dispersión: Presupuesto vs Rating ---
plt.figure(figsize=(8, 5))
plt.scatter(df_peliculas['Presupuesto_USD'], df_peliculas['Rating'], color='purple', alpha=0.6)
plt.title('Relación entre Presupuesto y Rating')
plt.xlabel('Presupuesto (USD)')
plt.ylabel('Rating')
plt.grid(True, linestyle='--', alpha=0.5)
plt.tight_layout()
plt.show()