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 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.
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.
##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.