El modelo lineal por tramos que tenemos en España para el IRPF, o en prácticamente cualquier otro país desarrollado (https://en.wikipedia.org/wiki/Income_tax), tiene algunas cosas curiosas. Por ejemplo, penaliza fiscalmente matrimonios con salarios distintos, o donde solamente trabaja uno de los cónyuges. Y las diferencias no son pequeña, como veremos
Para demostrarlo comenzamos por incluir los tramos de IRPF
%pylab inline
from ggplot import *
import pandas as pd
import numpy as np
import collections
brackets = {
17707 : 0.2475,
33007 : 0.30,
53407 : 0.40,
120000 : 0.47,
175000 : 0.49,
300000 : 0.51,
999999 : 0.52
}
od = sorted(brackets.items())
Y hacer una pequeña función que nos calcule los impuestos a pagar en función del salario bruto recibido
base = 50000
def calc_irpf(base):
binf, irpf = 0,0
for k in od:
bsup, rate = k
irpf += (min([bsup, base]) - binf)*rate
if bsup < base:
binf = bsup
else:
break
return irpf
Por ejemplo, una persona con unos ingresos de 25 mil anuales, paga anualmente ...
calc_irpf(25000)
6570.3825
Para validar la hipótesis planteamos 3 escenarios:
total_salaries=np.arange(21)*10000
even_couple_ratio = 0.5
unenven_couple_ratio = 0.25
very_uneven_couple_ratio = 1
Considerando ingresos entre 0 y 200 mil euros, pintamos el total que pagan entre los dos miembros en impuestos
even_taxes=[calc_irpf(t*even_couple_ratio) + calc_irpf(t*(1-even_couple_ratio)) for t in total_salaries]
uneven_taxes=[calc_irpf(t*unenven_couple_ratio) + calc_irpf(t*(1-unenven_couple_ratio)) for t in total_salaries]
very_uneven_taxes =[calc_irpf(t*very_uneven_couple_ratio) + calc_irpf(t*(1-very_uneven_couple_ratio)) for t in total_salaries]
df=pd.DataFrame({'gross_total': total_salaries, 'uneven_taxes': uneven_taxes, 'even_taxes': even_taxes}).set_index('gross_total')
df['very_uneven_taxes']=very_uneven_taxes
df.plot()
<matplotlib.axes._subplots.AxesSubplot at 0x7f3c04d035d0>
Vemos que efectivamente, la pareja en la que sólo uno tiene ingresos (línea roja) está penalizada, pero la escala de ese gráfico no permite extraer información precisa. Calculemos las ganancias netas de cada pareja, y pongamos el impuesto pagado en exceso con la nómina mensual.
De esta forma, si una pareja ingresa 2000 euros en su cuenta mensualmente, y paga 2000 euros de más al año comparado con otra pareja, diremos que paga 1 mes completo de más en ingresos.
df['even_net'] = total_salaries - df.even_taxes
df['uneven_net'] = total_salaries - df.uneven_taxes
df['very_uneven_net'] = total_salaries - df.very_uneven_taxes
df['uneven_loss'] = df['even_net'] - df.uneven_net
df['very_uneven_loss'] = df['even_net'] - df.very_uneven_net
df['uneven_loss_in_months'] = df['uneven_loss'] / (df.uneven_net/14)
df['very_uneven_loss_in_months'] = df['very_uneven_loss'] / (df.very_uneven_net/14)
df=df.fillna(0)
uneven = pd.DataFrame({'ingreso_neto_mensual':df.uneven_net/14,
'exceso_meses_pagados':df.uneven_loss_in_months,'pareja':'A gana 3 veces lo que B'})
very_uneven = pd.DataFrame({'ingreso_neto_mensual':df.very_uneven_net/14,
'exceso_meses_pagados':df.very_uneven_loss_in_months,'pareja':'Solo uno tiene ingresos'})
losses=uneven.append(very_uneven)
ggplot(aes(x='ingreso_neto_mensual',y='exceso_meses_pagados',colour='pareja'), data=losses)+geom_line()+theme_bw()
<ggplot: (8743484714597)>
Curiosamente, el efecto es creciente y luego decreciente (cuando los miembros de la pareja equilibrada llegan a los tramos altos la diferencia se va reduciendo)
Sin embargo, para 3000 euros de ingreso neto total, la pareja con ingresos poco balanceados paga en exceso como impuestos la mitad de una nómina. La situación es aun más pronunciada si sólo uno de los miembros de la pareja tiene ingresos. En ese caso, se trabaja para la Hacienda pública 1.5 meses más que una pareja con ingresos balanceados.