--- title: Verif des extractions CASD keywords: fastai sidebar: home_sidebar nb_path: "notebooks/analyses/csg_40_verif_extractions_casd.ipynb" ---
{% raw %}
{% endraw %} {% raw %}
from IPython.core.interactiveshell import InteractiveShell

InteractiveShell.ast_node_interactivity = "all"
{% endraw %} {% raw %}
import pandas as pd
{% endraw %} {% raw %}
import seaborn as sns
from leximpact_socio_fisca_simu_etat.config import Configuration

config = Configuration(project_name="leximpact-prepare-data")
{% endraw %} {% raw %}
!ls ./csg/data
{% endraw %}

Calibration RFR POTE

{% raw %}
calib_rfr = pd.read_csv(config.get("DATA_IN") + "CalibPOTE_2019.csv")
calib_rfr.tail(3)
{% endraw %}

Assiettes de la CSG

{% raw %}
liste_des_variables_csg = pd.read_csv(
    config.get("DATA_IN") + "liste_des_variables_csg-POTE_2019.csv"
)
liste_des_variables_csg.columns
{% endraw %} {% raw %}
liste_des_variables_csg = liste_des_variables_csg.loc[
    liste_des_variables_csg["nom_variable"].str.len() > 6
]
{% endraw %} {% raw %}
liste_des_variables_csg_style = liste_des_variables_csg.style.format(
    {"somme_en_euros": "{:,.2f} €", "pct_zero": "{:.0f} %"}
)
liste_des_variables_csg_style.bar(subset=["somme_en_euros"], color="#d65f5f")
{% endraw %}

PROBLEMES

  • Pourquoi le montant du chomage est si faible ? Chomage soumis à CSG ?

Copule de RFR et d'assiette de CSG

{% raw %}
def read_copule(filepath):
    # On charge notre distribution de RFR et de Rk
    with open(filepath) as fichier:
        contenu = fichier.read()
        dictionnaire_fichier = eval(contenu)
    return dictionnaire_fichier
{% endraw %} {% raw %}
dictionnaire_fichier = read_copule(
    config.get("COPULE_FOLDER") + "20210610ExportCopule-rev_capital_partiel.txt"
)
{% endraw %}
  • lower_bound : revenu minimum de RFR
  • upper_bound : revenu maximum de RFR
  • nb_people : { 'zero' : Nb foyers tels que Rk==0 , 'nonzero': Nb foyers tels que Rk > 0 }
  • nonzerobucket : Tableau de couple [nb foye] du bucket, Seuil plafond Rk du bucket
{% raw %}
len(dictionnaire_fichier)
len(dictionnaire_fichier[50]["nonzerobuckets"])
{% endraw %} {% raw %}
def copule_to_df(copule, sub_bucket_id):
    """
    ::copule:: Le contenu brut du copule
    ::sub_bucket_id:: 0 : Nombre de personne, 1 : somme de Var, -1 : moyenne
    """
    out = []
    for bucket in copule:
        out_dict = {
            "lower_bound": bucket["lower_bound"],
            "upper_bound": bucket["upper_bound"],
            "nb_people_zero": bucket["nb_people"]["zero"],
            "nb_people_nonzero": bucket["nb_people"]["nonzero"],
        }
        for i, sub_bucket in enumerate(bucket["nonzerobuckets"]):
            if sub_bucket_id < 0:
                out_dict[i] = sub_bucket[1] / sub_bucket[0]
            else:
                out_dict[i] = sub_bucket[sub_bucket_id]
        out.append(out_dict)
    df = pd.DataFrame(out)
    return df
{% endraw %} {% raw %}
df_foyer = copule_to_df(dictionnaire_fichier, 0)
df_rk = copule_to_df(dictionnaire_fichier, 1)
df_rk_moyen = copule_to_df(dictionnaire_fichier, -1)
{% endraw %} {% raw %}
 
{% endraw %} {% raw %}
df_foyer[56].min()
{% endraw %} {% raw %}
def copule_to_df_mean_rk(copule):
    out = []
    for bucket in copule:
        for i, sub_bucket in enumerate(bucket["nonzerobuckets"]):
            out_dict = {
                "lower_rfr": bucket["lower_bound"],
                "mean_rk": sub_bucket[1] / sub_bucket[0],
            }
            out.append(out_dict)
    df = pd.DataFrame(out)
    return df
{% endraw %} {% raw %}
df_rfr_rk_moyen_yo_plot = copule_to_df_mean_rk(dictionnaire_fichier)
df_rfr_rk_moyen_yo_plot.head(3)
{% endraw %} {% raw %}
def sum_copule_col(row):
    """
    Somme toute les colonnes de VAr d'un bucket
    """
    sum = 0
    for i in range(99 + 1):
        sum += row[i]
    return sum
{% endraw %} {% raw %}
df_rk["sum_rk"] = df_rk.apply(sum_copule_col, axis=1)
print(f"Sommes des revenus du capital {df_rk['sum_rk'].sum():,} €")
{% endraw %} {% raw %}
assert 33836323865 == df_rk["sum_rk"].sum()
{% endraw %} {% raw %}
 
{% endraw %} {% raw %}
import plotly.express as px

fig = px.scatter(df_rfr_rk_moyen_yo_plot, x="lower_rfr", y="mean_rk", trendline="ols")
fig.show()
{% endraw %}

Copule : nombre de foyer

{% raw %}
pd.options.display.float_format = "{:,.2f}".format
# df_foyer
{% endraw %}

Comment interpréter ces tableaux ?

Dans la tranche des personnes ayant un RFR entre 0 et 8 euros, il y a 2 595 993 de foyers qui n'ont pas de revenus du capital et 148 595 qui en ont.

  • Ces foyers qui ont un revenu du capital sont répartis en 100 groupes (soit 1 486 foyer par groupe pour le premier groupe de RFR), en fonction de leur revenu du capital.
  • Pour chaque groupe on indique la somme des revenus du capital du groupe.
PROBLEMES
  • La sommes des RK par groupe est souvent égale au nombre de personne dans ces groupes !!! => Il faudrait vérifier sur le CASD s'ils ont bien un RK de 1 €uros, ce qui est peut probalble.
{% raw %}
 
{% endraw %} {% raw %}
df = df_rk_moyen.drop(
    [
        "lower_bound",
        "upper_bound",
        "nb_people_zero",
        "nb_people_nonzero",
    ],
    axis=1,
)
cm = sns.light_palette("green", as_cmap=True)
s = df.style.background_gradient(cmap=cm)
# s
{% endraw %} {% raw %}
1486 * 100
{% endraw %} {% raw %}
#!poetry run python -m ipykernel install --name leximpact-socio-fiscal-simu-etat-kernel --user
{% endraw %} {% raw %}
df = df_foyer.drop(
    [
        "lower_bound",
        "upper_bound",
        "nb_people_zero",
        "nb_people_nonzero",
    ],
    axis=1,
)
cm = sns.light_palette("green", as_cmap=True)
s = df.style.background_gradient(cmap=cm)
# s
{% endraw %}

Copule : cumul de revenu fiscal

{% raw %}
pd.options.display.float_format = "{:,.2f}".format
df_rk
{% endraw %} {% raw %}
df = df_rk.drop(
    [
        "lower_bound",
        "upper_bound",
        "nb_people_zero",
        "nb_people_nonzero",
    ],
    axis=1,
)
cm = sns.light_palette("green", as_cmap=True)

s = df.style.background_gradient(cmap=cm)
# s
{% endraw %}