Introducción

Este trabajo final tiene como objetivo analizar la evolución mensual de los sueldos registrados en la nómina anual del Ministerio de Educación y Ciencias del Paraguay. Se utiliza un enfoque reproducible combinando R y Python para procesar, analizar y visualizar los datos.

Los Datos

Los datos provienen del archivo resumen_anual_nomina_2023_v2.csv, que contiene información detallada sobre los conceptos de pago, trabajadores y montos mensuales y anuales. Se enfoca el análisis en los importes mensuales de sueldos.

Metodología

Se emplea una metodología cuantitativa basada en:

Limpieza y transformación de datos con polars y pandas. Cálculo del promedio mensual de sueldos. Ajuste de un modelo de regresión lineal para identificar tendencias. Visualización con matplotlib.

Procesamiento

##install.packages("reticulate")# Recién reiniciada la sesión:
#library(reticulate)
#$reticulate::use_condaenv("r_env_nuevo", required = TRUE)
#$reticulate::py_install(c("scikit-learn", "matplotlib"), envname = "r_env_nuevo")

library(reticulate)
use_python("C:/Users/juanj/anaconda3_1/python.exe", required = TRUE)
reticulate::use_condaenv("r_env_nuevo", required = TRUE)
## Warning: Previous request to
## `use_python("C:/Users/juanj/anaconda3_1/python.exe", required = TRUE)` will be
## ignored. It is superseded by request to
## `use_python("C:\Users\juanj\anaconda3\envs\r_env_nuevo/python.exe")
#reticulate::py_install("pyarrow")
import polars as pl
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score

# 1. Leer archivo
df = pl.read_csv(r"C:/Users/juanj\OneDrive\Escritorio/Juanjo Acosta/resumen_anual_nomina_2023_v2.csv",
infer_schema_length=1000,
schema_overrides={"codigo_trabajador": pl.Utf8}
)


# 2. Normalizar nombres de columnas
mapping = {
    col: col.strip().lower()
             .replace("á","a").replace("é","e").replace("í","i")
             .replace("ó","o").replace("ú","u").replace("ñ","n")
             .replace(" ", "_").replace("/", "_")
    for col in df.columns
}
df = df.rename(mapping)

# 3. Filtrar solo filas con concepto "Sueldos"
#df = df.filter(pl.col("nombre_concepto_nomina") == "Sueldos")

# 4. Seleccionar columnas de importes mensuales
df = pl.read_csv(
    "C:/Users/juanj/OneDrive/Escritorio/Juanjo Acosta/resumen_anual_nomina_2023_v2.csv",
    separator=",",
    dtypes={"codigo_trabajador": pl.Utf8}  # fuerza a texto
)
## <string>:6: DeprecationWarning: the argument `dtypes` for `read_csv` is deprecated. It was renamed to `schema_overrides` in version 0.20.31.
meses = [f"importe_total_{str(i).zfill(2)}" for i in range(1, 13)]
df = df.select(meses).with_columns([
    pl.col(m).cast(pl.Float64) for m in meses
])

# 5. Calcular promedio mensual (por si hay más de un trabajador)
promedios = df.mean().to_pandas().T.reset_index()
promedios.columns = ["mes", "valor"]
promedios["mes_num"] = range(1, 13)

# 6. Regresión lineal
X = promedios[["mes_num"]].values
y = promedios["valor"].values
model = LinearRegression().fit(X, y)
y_pred = model.predict(X)

# 7. Métricas
print(f"Pendiente:   {model.coef_[0]:.2f}")
## Pendiente:   71934.59
print(f"Intercepto:  {model.intercept_:.2f}")
## Intercepto:  1022791.97
print(f"MSE:         {mean_squared_error(y, y_pred):.2f}")
## MSE:         104852186931.12
print(f"R²:          {r2_score(y, y_pred):.4f}")
## R²:          0.3703
# 8. Gráfico
plt.figure(figsize=(8,6))
plt.plot(X, y, 'o-', label="Importe mensual promedio")
plt.plot(X, y_pred, 'r--', label="Regresión lineal")
plt.title("Evolución mensual de Sueldos")
plt.xlabel("Mes")
plt.ylabel("Importe (PYG)")
plt.grid(True)
plt.legend()
plt.show()

## Conclusiones

La regresión lineal muestra una tendencia general en los sueldos mensuales. El valor de R² indica qué tan bien se ajusta el modelo a los datos. Este análisis permite detectar patrones estacionales o anomalías en la distribución de pagos.

Referencias