[Version 2020] Laissez Python faire tous les calculs de taxes et de recettes

Aperçu

C'est difficile de calculer les impôts, n'est-ce pas? Quand je deviens membre de la société, les impôts et les primes d'assurance sont déduits chaque année, mais je ne connais pas du tout les impôts, alors je suis dans un état de quelque chose. De plus, j'ai entendu dire que les règles relatives aux déductions et aux impôts sur le revenu changeront à partir de cette année. Il y a un dicton (?) "Laissons Python faire toutes les choses ennuyeuses **", donc cette fois je vais essayer de créer une classe de calcul de taxes avec Python pour étudier. Depuis que je l'ai écrit en recherchant diverses choses à partir de zéro, il peut y avoir de nombreuses explications qui sont évidentes pour ceux qui la connaissent.

Github J'ai fait une classe pour le calcul des taxes dans Github.

Le site auquel j'ai fait référence lors de la rédaction du code

Comment utiliser

Avant de parler de la taxe difficile, commençons par une brève explication sur la façon de l'utiliser. La classe Tax créée cette fois est implémentée dans tax.py. À titre d'exemple, considérons ** un homme célibataire avec un revenu annuel de 5 millions **. Faites ce qui suit avec tax.py dans le répertoire parent:

# coding: utf-8
import sys, os
sys.path.append(os.pardir)  #Paramètres d'importation des fichiers dans le répertoire parent
from common.tax import Tax

gross_salary = 5000000
tax = Tax(gross_salary)
print("gross_salary, income = ", tax.gross_salary, tax.income)
print("income_tax, inhabitant_tax, insurance_premiun = ", tax.income_tax(), tax.inhabitant_tax(), tax.social_insurance_premium())
print("net_salary = ", tax.net_salary())
print("max_hurusato_donation = ", tax.max_hurusato_donation())

production


gross_salary, income =  5000000 3560000.0
income_tax, inhabitant_tax, insurance_premiun =  110575.0 215575.0 619249.9999999999
net_salary =  4054600.0
max_hurusato_donation =  56035.593432760994

est. Dans ce cas **, la valeur nominale est de 5 millions de yens et le salaire net est d'environ 4 millions de yens ** en raison de diverses déductions telles que les impôts et les primes d'assurance. Dans l'exemple ci-dessus, l'argument «impôt» ne donne que le revenu («= salaire brut»), mais si vous avez des ** personnes à charge ** ou des ** personnes handicapées **, il sera déduit, alors prenez l'argument Ces cas peuvent être calculés en spécifiant. Maintenant, je vais expliquer chacun dans l'ordre.

Revenu d'emploi

Tout d'abord, sur les ** revenus salariaux **. J'ignorais les impôts, alors je savais que «d'une manière ou d'une autre, l'impôt serait déduit de mon revenu et mon salaire net serait réduit», mais qu'est-ce que le ** revenu salarial **? C'était dans l'état. En fait, divers impôts ne sont pas calculés directement à partir du revenu de la valeur faciale, mais sont appliqués au montant après la déduction de la ** déduction du revenu salarial **. Cette fois, je parle chez un employé de l'entreprise, mais puisque les dépenses nécessaires seront engagées lors du travail initial

(le revenu) - (Dépenses) = (le revenu) 

Le schéma de est établi. Ce n'est peut-être pas très évident pour un employé de bureau embauché, mais ** tous les employés de bureau sont déduits de leur revenu, en supposant qu'ils devraient payer pour cela s'ils travaillaient. ** ** D'ailleurs, cela est également répertorié dans le ** tableau de précompte mobilier ** à côté du revenu de la valeur nominale de l'entreprise sous le nom ** montant après déduction des revenus salariaux ** ↓

スクリーンショット 2020-06-28 15.52.26.png

Le code pour Python est ci-dessous. Après 2020, les règles ont changé et cette ** déduction pour revenu salarial ** a diminué de 100 000 yens, et l '** impôt sur le revenu ** qui sortira plus tard a augmenté de 100 000 yens. Par conséquent, le montant d'argent déduit avec Pramai Zero ne change pas, mais ceux qui ont un revenu annuel de 8,5 millions de yens ou plus paieront plus avec cette révision. Je n'ai pas un revenu annuel de 8,5 millions, mais personnellement, je ne suis pas satisfait de cette révision parce que je ne suis pas motivé à penser que même si je fais de mon mieux et que mon revenu annuel augmente, je serai beaucoup déduit de l'impôt sur le revenu. .. Le montant après déduction des revenus salariaux ainsi calculé est retourné comme «revenu». Puisque la valeur de «revenu» est souvent utilisée dans d'autres fonctions de classe, elle est affectée à «self.income» dans le constructeur.

Tax.income()


def income(self):
    """
Calcul de la déduction pour revenu salarial,Renvoie le montant de la déduction avec le revenu comme argument
Depuis 2020, la déduction a été réduite de 100 000 et l'impôt sur le revenu a augmenté de 100 000, il n'y a donc pratiquement aucun changement.
Cependant, pour 8,5 millions ou plus, le montant de la déduction pour revenus salariaux a diminué, de sorte que l'impôt a en fait augmenté.
    """
    employment_income_deduction = 0

    if self.gross_salary < 550000:
        employment_income_deduction = self.gross_salary

    elif self.gross_salary <1800000:
        employment_income_deduction = self.gross_salary * 0.4 - 100000

    elif self.gross_salary <3600000:
        employment_income_deduction = self.gross_salary*0.3 + 80000

    elif self.gross_salary <6600000:
        employment_income_deduction = self.gross_salary*0.2 + 440000

    elif self.gross_salary <8500000:
        employment_income_deduction = self.gross_salary*0.1 + 1100000

    else:
        employment_income_deduction = 1950000

    income = self.gross_salary - employment_income_deduction
    return income

Primes d'assurance sociale

Voyons ensuite les ** primes d'assurance sociale **. Il s'agit de ** pension sociale **, ** assurance-emploi **, etc., qui sont distinctes des impôts. La formule est écrite ci-dessous, mais il y a ** taux d'assurance-maladie **, ** taux d'assurance d'exemption ** et ** taux d'assurance-emploi **. La prime finale est calculée en multipliant le revenu par le ** taux de prime ** calculé à partir de ceux-ci. ** Le taux de prime de l'assurance maladie ** varie selon la région, mais dans le cas de Tokyo il est de 9,87% self.health_insurance_premium_rate contient 0,0987` par défaut. Le taux de prime d'exemption détermine le montant de l'exonération de la pension sociale. Le taux de prime d'exemption a tendance à augmenter avec l'âge, mais en moyenne, il est d'environ «0,4%», donc «self.rebate_contribution_rate» est «0,04» par défaut. Ces valeurs peuvent être définies individuellement dans le constructeur. Ces valeurs sont divisées par deux car elles partagent la moitié avec l'entreprise. ** Le taux de cotisation à l'emploi ** est uniformément «0,3%», alors additionnez-les pour calculer le taux de cotisation.

Tax.social_insurance_preium()


def social_insurance_premium(self):
    """
Calcul des primes d'assurance
Taux de prime = taux de prime de santé/2
    + (Taux de cotisation de la pension de prévoyance 18.3%-Taux de prime d'exemption)/2
    +Taux de cotisation à l'emploi 0.3%
    """
    #Taux de prime
    insurance_premium_rate = (self.health_insurance_premium_rate)/2 \
                             + (0.183 - self.rebate_contribution_rate)/2 \
                             + 0.003

    #Primes d'assurance sociale=Revenu annuel x taux de prime
    social_insurance_premium = self.gross_salary*insurance_premium_rate
    return social_insurance_premium

impôt sur le revenu

Vient ensuite ** l'impôt sur le revenu **. ** L'impôt sur le revenu ** soustrait d'abord ** la déduction de base ** du revenu calculé par «revenu ()». Jusqu'à présent, la ** déduction de base ** était un taux forfaitaire de «380 000 yens», mais à partir de 2020, elle a été portée à «480 000 yens». (Comme mentionné ci-dessus, la ** déduction pour revenu salarial ** a été réduite de 100 000 yens.) Cependant, comme une nouvelle règle ajoutée à partir de ce moment, si le revenu annuel dépasse 24 millions, le montant de la déduction de base diminuera progressivement, et s'il dépasse 25 millions de yens, il sera nul. En outre, la déduction pour personnes à charge ("dépendant_duction") et la déduction pour invalidité ("déduction_handicapée") en sont déduites. Les deux dependents_deduction et handicapped_deduction sont mis à zéro sauf indication contraire dans le constructeur.

Le revenu après diverses déductions est défini comme «target_of_income_tax», et ** l'impôt sur le revenu ** est calculé à partir de cela. Plus le revenu annuel est élevé, plus vous pouvez en obtenir. Le ** taux d'imposition sur le revenu ** (self.income_tax_rate) qui apparaît ici est également utilisé pour le calcul lorsque vous effectuez le ** paiement de l'impôt local **.

Tax.income_tax()


def income_tax(self):
    """
Calcul de l'impôt sur le revenu
    """

    #Déduction pour personne à charge de l'impôt sur le revenu
    dependents_deduction = self.high_school_student * 480000 + self.college_student * 630000
    #Déduction pour invalidité dans l'impôt sur le revenu
    handicapped_deduction = self.handicapped * 260000
    #La déduction de base était de 380000 yens jusqu'en 2019, mais à partir de 2020, elle sera de 480000 yens. Cependant, s'il dépasse 20 millions, il diminuera progressivement.
    basic_deduction = 0
    if self.income < 24000000:
        basic_deduction = 480000
    elif self.income < 24500000:
        basic_deduction = 320000
    elif self.income < 25000000:
        basic_deduction = 160000

    #Montant assujetti à l'impôt sur le revenu, revenu moins déductions et primes
    target_of_income_tax = (self.income \
                            - self.social_insurance_premium() \
                            - self.spousal_deduction() \
                            - dependents_deduction \
                            - handicapped_deduction \
                            - basic_deduction)
    #Taux d'imposition sur le revenu et montant de la déduction selon le revenu annuel
    if target_of_income_tax < 1950000:
        self.income_tax_rate = 0.05
        deduction = 0

    elif target_of_income_tax < 3300000:
        self.income_tax_rate = 0.1
        deduction = 97500

    elif target_of_income_tax < 6950000:
        self.income_tax_rate = 0.2
        deduction = 427500

    elif target_of_income_tax < 9000000:
        self.income_tax_rate = 0.23
        deduction = 636000

    elif target_of_income_tax < 18000000:
        self.income_tax_rate = 0.33
        deduction = 1536000

    elif target_of_income_tax < 40000000:
        self.income_tax_rate = 0.40
        deduction = 2796000

    else:
        self.income_tax_rate = 0.45
        deduction = 479.6

    #Calcul de l'impôt sur le revenu
    income_tax = target_of_income_tax * self.income_tax_rate - deduction
    #Si l'impôt sur le revenu devient négatif, mettez-le à zéro
    if income_tax <= 0:
        income_tax = 0
    return income_tax

Taxe de séjour

Le calcul de la ** taxe d'habitation ** est similaire à l'impôt sur le revenu, donc je pense que ce ne sera pas si difficile si vous comprenez le mécanisme de l'impôt sur le revenu. Le montant de la déduction est différent de l '** impôt sur le revenu **, et il est également différent en ce que l'impôt est appliqué au revenu de l'année précédente. (Il n'y a pas de distinction particulière entre l'année précédente et cette année dans le programme)

Tax.inhabitant_tax()


def inhabitant_tax(self):
    """
Calcul de la taxe de séjour,Calculer la taxe d'habitation avec le revenu imposable comme argument
    """

    #Déduction pour personne à charge de la taxe d'habitation
    dependents_deduction = self.high_school_student * 330000 + self.college_student * 450000
    #Déduction pour personnes handicapées de la taxe d'habitation
    handicapped_deduction = self.handicapped * 270000
    #Identique à la déduction de base et à l'impôt sur le revenu, modifié à partir de 2020
    basic_deduction = 0
    if self.income < 24000000:
        basic_deduction = 430000
    elif self.income < 24500000:
        basic_deduction = 190000
    elif self.income < 25000000:
        basic_deduction = 150000

    #Diverses déductions et déductions de base (430000 yens) sont déduites du revenu et le taux d'imposition est de 10%multiplier
    #Ajoutez le taux par habitant de 5 000 yens et soustrayez la déduction d'ajustement de 2 500 yens.
    inhabitant_tax = (self.income
                      - self.social_insurance_premium()
                      - self.spousal_deduction()
                      - dependents_deduction
                      - handicapped_deduction
                      - basic_deduction) * 0.1 + 5000 - 2500

    #Si la taxe d'habitation calculée devient négative, elle sera nulle.
    if inhabitant_tax <=0:
        inhabitant_tax = 0
    return inhabitant_tax

Ramener à la maison

À ce stade, vous pouvez calculer le ** à emporter **. Soustrayez les ** primes d'assurance sociale, l'impôt sur le revenu et la taxe d'habitation ** qui ont été calculés jusqu'à présent du revenu de la valeur nominale.

Tax.net_salary()


def net_salary(self):
    """
Calcul à la maison, déduire l'impôt sur le revenu, la taxe d'habitation, les primes d'assurance sociale du revenu
    """
    total_tax = self.inhabitant_tax() + self.income_tax()
    net_salary = self.gross_salary - total_tax - self.social_insurance_premium()
    return net_salary

Paiement de la taxe locale

La couleur des cheveux est un peu différente de celles qui sont apparues jusqu'à présent, mais nous avons également mis en place ** Furusato Tax Payment **. ** Furusato Tax Payment ** est un système qui vous permet de recevoir des récompenses en faisant un don aux zones locales. À ce moment, ** l'impôt sur le revenu et la taxe d'habitation ** peuvent être réduits en fonction du don. Jusqu'à concurrence du montant maximal, seuls «2000 yens» du montant du don sont payés par vous-même, et tout le montant restant peut être déduit. La fonction suivante calcule le montant maximum des dons qui peuvent être entièrement déduits. Veuillez vous référer aux commentaires et au code pour la formule de calcul.

Tax.max_hurusato_donation()


    def max_hurusato_donation(self):
        """
Calcul de la limite supérieure qui peut être entièrement déduite à 2000 yens à vos frais en payant votre taxe de séjour
En d'autres termes, le montant du retour moins 2000 yens sera déduit de l'impôt sur le revenu et de la taxe d'habitation.
        """
        #Pourcentage du revenu fiscal des résidents(=Taxe de séjour)Calculer à partir de
        #Limite supérieure de la déduction fiscale Furusato
        hurusato_deduction = self.inhabitant_tax() * 0.2

        # (Montant de la déduction) =(Montant du don-2000)×(90%-Taux d'imposition sur le revenu x 1.021)
        # (Montant du don) = (Montant de la déduction)/(90%-Taux d'imposition sur le revenu x 1.021)+2000
        max_hurusato_donation = hurusato_deduction / (0.9 - self.income_tax_rate * 1.021) + 2000
        return max_hurusato_donation

Visualisation

Est-il judicieux d'écrire en Python avec juste ça? Je vais donc essayer de le visualiser en utilisant matplotlib. D'abord, «importez» la bibliothèque requise.

Tax.show_ipynb


# coding: utf-8
import sys, os
sys.path.append(os.pardir)  #Paramètres d'importation des fichiers dans le répertoire parent
from common.tax import Tax
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
import seaborn as sns
%matplotlib inline
pd.options.display.precision = 0
plt.rcParams['font.family'] = 'AppleGothic'

Calculez le revenu annuel de 2 à 12 millions de yens par incréments de 1 million de yens et plongez-vous dans la «liste».

Tax.show_ipynb2


#Valeur faciale annuelle, 200-1,Jusqu'à 2 millions par incréments de 10000
gross_salaries = [i for i in range(2000000,12010000, 1000000)]
#le revenu
incomes = []
#impôt
total_taxes = []
#Taxe de séjour
inhabitant_taxes = []
#impôt sur le revenu
income_taxes = []
#Primes d'assurance sociale (=Déduction des primes d'assurance sociale)
social_insurance_premiums = []
#Revenu annuel net
net_salaries = []
#Limite supérieure de la déduction fiscale Furusato et montant du don à ce moment
max_hurusato_donation = []

for gross_salary in gross_salaries:
    tax = Tax(gross_salary)

    #Ajouter de la valeur à la liste
    incomes.append(tax.income)
    total_taxes.append(tax.income_tax() + tax.inhabitant_tax())
    inhabitant_taxes.append(tax.inhabitant_tax())
    income_taxes.append(tax.income_tax())
    social_insurance_premiums.append(tax.social_insurance_premium())
    net_salaries.append(tax.net_salary())
    max_hurusato_donation.append(tax.max_hurusato_donation() - 2000) #Soustrayez 2000 yens à vos frais

Stocker dans dataframe. Vous pouvez voir le contenu avec df.head ().

Tax.show_ipynb3


df = pd.DataFrame()
df['revenu annuel'] = gross_salaries
df['Ramener à la maison'] = net_salaries
df['impôt'] = total_taxes
df['Taxe de séjour'] = inhabitant_taxes
df['impôt sur le revenu'] = income_taxes
df['Primes d'assurance sociale'] = social_insurance_premiums
df['Limite supérieure de la déduction fiscale pour la ville natale'] = max_hurusato_donation

Visualisez avec un graphique à barres.

Tax.show_ipynb4



df.index = ['200', '300', '400', '500', '600', '700',  '800', '900', '1000', '1100', '1200']
plt.figure(figsize=(12,7))
plt.rcParams["font.size"] = 14
plt.grid(axis='y')
yticks = [0, 1000000, 2000000, 3000000, 4000000, 5000000, 6000000, 7000000, 8000000, 9000000, 10000000, 11000000, 12000000]
plt.ylim(0, 12500000)
plt.yticks(yticks)
plt.bar(df.index, df['Ramener à la maison'])
plt.bar(df.index, df['impôt'], bottom= df['Ramener à la maison'])
plt.bar(df.index, df['Limite supérieure de la déduction fiscale pour la ville natale'], bottom= df['Ramener à la maison'] + df['impôt'] - df['Limite supérieure de la déduction fiscale pour la ville natale'])
plt.bar(df.index, df['Primes d'assurance sociale'], bottom= df['Ramener à la maison'] + df['impôt'])
plt.xlabel('Salary (yen*10000)')
plt.ylabel('Breakdown (yen)')
plt.title('')
plt.legend(['net-salary', 'tax','hurusato_deduction', 'insurance'])
plt.show()

ダウンロード (1).png

** Description du graphique **

――L'axe horizontal est le revenu annuel, l'axe vertical est le bleu, (orange + vert) est la taxe, le vert est la limite supérieure qui peut être déduite du paiement de l'impôt de la ville et le rouge est la prime d'assurance sociale.

** Mon impression de voir le graphique **

Résumé

Recommended Posts

[Version 2020] Laissez Python faire tous les calculs de taxes et de recettes
Recevez le formulaire en Python et faites diverses choses
(◎◎) {Laissons Python faire les choses ennuyeuses) ......... (Hé? Laissons Python faire les devoirs} (゜) (゜)
[Python débutant] Comment puis-je développer et exécuter Python après tout?
"Laissez Python faire les choses ennuyeuses" Exercice ~ Command Line Mailer ~
Le websocket de toio (nodejs) et python / websocket ne se connecte pas.
[Python] df Lire et faire le premier mémo (confirmation NaN etc.)
Laissez le modèle japonais BERT faire le test central et la génération de phrases
MoneyForward Cloud automatise l'horodatage [Laissez Python faire le problème]
Que dois-je faire avec la structure de répertoires Python après tout?
[Python] Maîtrisons tout et tout
pyenv-changer la version python de virtualenv
Comment obtenir la version Python
Accélérer le calcul de la séquence de Fibonacci (version Python)
À propos de l'environnement virtuel de Python version 3.7
Laissez Heroku faire le traitement en arrière-plan avec Python
[Python] Essayez pydash de la version Python de lodash
Academia Potter et le mystérieux Python Pass
Python open et io.open sont les mêmes
[Python] Combine tous les éléments dans un tableau
J'ai comparé la vitesse des expressions régulières en Ruby, Python et Perl (version 2013)