Inscription / Connexion Nouveau Sujet
Niveau calculatrices
Partager :

Casse tête dans les ménages.

Posté par
Bertie
19-02-24 à 12:36

Bonjour,

Je bute, je m'arrache les cheveux. Je peine à trouver la bonne formule pour un problème qu'a priori je pensais simple, mais qui semble-t-il : est trop complexe pour moi..

Pour un ménage de deux personnes mari et femme, ou ce que l'on voudra, disons 2 personnes : Personne A et Personne B, quelle est la bonne formule pour calculer les justes contributions financières que l'une et de l'autre devrons apporter (si elles le souhaitent) relativement à leurs consommations, dépenses et frais divers de leur ménage, en fonction de leurs consommations, dépenses et frais divers respectifs (individuels et répartis), et de leurs dépenses respectives ?

Revenus A

Revenus B

Revenus A différents de Revenus B

Consommation, dépenses et frais A -------> Notons les CDF A

Consommation, dépenses et frais B -------> Notons les CDF B

CDF A différents de CDF B

Contribution A et Contribution B sont les inconnues du problème.

Si quelqu'un pourrait me mettre sur la voie. Ce serait super sympa. Merci d'avance

Posté par
Ulmiere
re : Casse tête dans les ménages. 19-02-24 à 16:33

On appelle r_A et r_B les revenus respectifs et f_A et f_B les frais respectifs.

Ca dépend à quelle variable tu veux donner le plus de poids dans la réparition de ce qu'il reste. Par exemple, si tu veux que ce soit celui qui a les plus gros revenus qui paie le plus en proportion, tu poses q_A = \dfrac{r_A}{r_A+r_B} et q_B = \dfrac{r_B}{r_A+r_B} les proprtions de revenus respectives.

Alors si C est le montant total de la contribution, A devra payer q_AC et B devra payer q_BC, ce qui fera bien un total de (q_A+q_B)C = 1\times C = C.

Si tu veux prendre en compte seulement les frais, ce sera q_X = \dfrac{f_X}{f_A+f_B} qu'il faudra poser.

Si tu veux prendre en compte le revenu disponible après les frais, ce sera q_X = \dfrac{r_X-f_X}{r_A-f_A+r_B-f_A}.

Tu peux aussi t'amuser à faire des combinaisons barycentriques de tout cela, en prenant par exemple q_X = \dfrac{u_X}{u_A+u_B}u_X = \alpha r_X + (1-\alpha)f_X pour donner plus ou moins d'importance à l'un où à l'autre. Et tu peux généraliser cela à u_X = \sum_{i=1}^n \alpha_i d_X^{(i)} où les d^{(i)} sont des paramètres de ton choix et \sum \alpha_i = 1

Posté par
verdurin
re : Casse tête dans les ménages. 19-02-24 à 19:08

Bonsoir,
le problème me semble mal posé.
On peut imaginer le cas extrême où A et B sont deux colocataires qui n'ont aucune relation autre que d'habiter au même endroit : la solution la plus juste est sans doute de partager le loyer en deux sans  considération pour les revenus.

Posté par
Bertie
re : Casse tête dans les ménages. 19-02-24 à 20:09

@ Ulmiere

Bonsoir,

Merci pour ta réponse Ulmiere.

Je vais voir si je peux me débrouiller en mettant des coefficients. C'est intéressant de procéder comme tu le suggères. Ceci dit ça me semble plutôt arbitraire.

En reprenant X pour A ou B selon que l'on fait le calcul pour A ou B, j'avais trouvé une formule :

Contribution de  X = CDF X . (Revenus A / (Revenus A + Revenus de B)) . 2

(Rappel : avec CDF X pour Consommation, dépenses et frais de X)

Mais cette formule est fausse parce qu'en faisant le calcul de Contribution de A et de contribution de B, Contribution de A + Contribution de B  ≠ CDF A + CDF B, ce qui pose problème..

--------------------------

@ verdurin ,

Bonsoir,

Oui, ce que les uns et les autres considèrent comme équitable est très variable des uns aux autres.

Je n'avais pas défini ce que j'entends par "équitable", c'est vrai.

Disons que je voudrais que la contribution de A et celle de B soient en fonction des revenus et des CDF de A et de B, mais sans y mêler d'autres arbitraires.

Alors je cherche encore...

Posté par
GBZM
re : Casse tête dans les ménages. 20-02-24 à 18:35

Bonsoir,
Une question qui n'a pas grand-chose à voir avec les mathématiques, et posée sur plusieurs forums à la fois :

Posté par
Bertie
re : Casse tête dans les ménages. 20-02-24 à 22:32

C'est des maths, c'est pas des maths... Je posais un problème qui devait avoir une résolution mathématique, mais l'on vient me parler de politique et de purisme mathématique ?  Ulmiere que je remercie m'a répondu respectueusement.

Posté par
Bertie
re : Casse tête dans les ménages. 21-02-24 à 11:58

Bonjour,

Voilà à quoi e suis arrivé comme un grand :

Avec X pour A ou B selon que l'on fait le calcul pour A ou B

Contr X = Alpha . CDF X . Rev X / Total Rev  

Avec

Alpha = (Total CDF + Total Rev) / (CDF A . Rev A + CDF B . Rev B)

Avec le coef ça résoud le problème évoqué plus haut, mais je ne sais pas si c'est correct de procéder ainsi.

Posté par
Ulmiere
re : Casse tête dans les ménages. 21-02-24 à 12:40

C'est la même formule que celle que je t'ai donnée, à peu de choses près, appliquée à u_X = f_X r_X.

La seule différence, c'est qu'il y a un facteur 1 + \dfrac{f_A+f_B}{r_A+r_B} qui traine devant.
Ce facteur est d'importance très marginale si la somme des revenus dépasse de loin la somme des frais, i.e si ta femme et toi arrivez ensemble à gagner plus que ce que vous dépensez.

Mais ça ne veut pas dire que ce soit juste pour autant, puisque si tu gagnes 10x plus qu'elle, ce facteur sera très faible aussi mais pas grâce à elle.

L'autre problème, plus grave, c'est que la somme des contributions avec ta formule, est justement \beta C, où \beta = \dfrac{\alpha}{\rm{TotalRev}} = 1 + \dfrac{f_A+f_B}{r_A+r_B} est le facteur dont je parle plus haut.

Donc ta formule de partage est incorrecte! La somme de vos proportions de contribution n'est pas égale à 1

Posté par
Bertie
re : Casse tête dans les ménages. 21-02-24 à 14:50

Bonjour Ulmière,

Merci pour ta réponse.

Ok, donc je ne suis pas encore au bout de mes peines...

Comment faire pour régler ce problème ? Je suis perdu.

Posté par
Ulmiere
re : Casse tête dans les ménages. 21-02-24 à 18:07

Le mieux est de faire au plus simple et de se concentrer sur le cas simple de deux personnes et une seule fonction u.


Une fois donnée la fonction u qui soit
* à valeurs réelles
* définie sur {a,b}
* fixée par tes soins
* telle que u(a) + u(b) != 0

Tu peux définir une autre fonction q, sur le même ensemble, par q(x) = u(x) / (u(a)+u(b)).
Cette fonction est (automatiquement) à valeurs dans [0,1] et vérifie q(a)+q(b) = 1.

La contribution de a au paiement de C sera q(a) * C, et de même, celle de b sera q(b) * C.

La seule que tu as à faire, c'est de trouver une bonne fonction u, mais ça il n'y a que toi qui puisses le faire, ça dépend de ce que tu veux prendre en compte ou privilégier parmi tes paramètres. Je t'en ai proposé quelques unes dans ma première réponse

* u = r, pour ne prendre en compte que le revenu
* u = f, pour ne prendre en compte que les frais
* u = r - f, pour ne prendre en compte que le revenu restant après paiement des frais
* u = α r + (1-α) f pour prendre en compte les deux, mais avec un coefficient alpha de ton choix qui donne plus de poids à l'un ou l'autre

Tu es libre de rendre u aussi complexe que tu veux, tant qu'elle respecte les conditions que je t'ai énoncées

Posté par
Sylvieg Moderateur
re : Casse tête dans les ménages. 21-02-24 à 20:34

Bonjour,
@Bertie,

attentionextrait de c_faq la FAQ du forum :

Q03 - Pourquoi ne faut-il pas faire du ''multi-post'' ?


attentionextrait de c_faq la FAQ du forum :

Q30 - J'ai été averti ou banni, pourquoi, et que faire ?

Posté par
Bertie
re : Casse tête dans les ménages. 21-02-24 à 21:10

Bonsoir Sylvieg,

Désolé.

Posté par
Bertie
re : Casse tête dans les ménages. 21-02-24 à 21:26

Bonsoir Ulmiere,

J'ai essayé différentes choses à partir de tes indications dans le dernier post, mais j'aboutis toujours à des résultats incohérents.

Sinon j'ai testé et retesté ma formule avec plein de valeurs différentes. Et contrairement à ce que tu as dit, elle me donne à chaque fois des contributions de A et de B dont la somme est égale à celle des frais et dépenses de A et de B.

Alors je ne sais pas..

Posté par
Bertie
re : Casse tête dans les ménages. 21-02-24 à 21:35

Erratum :

J'ai relu, il semble que tu parlais d'autre chose..
Je suis perdu.

(À savoir : je n'ai pas l'habitude de faire des maths et j'ai tout oublié de mes cours de lycée.)

Posté par
Ulmiere
re : Casse tête dans les ménages. 24-02-24 à 13:04

Voici un code qui t'aidera peut-être à y voir plus clair.
Tu peux le copier-coller ici (https://www.online-python.com/) pour l'exécuter

import numpy as np

def somme_ponderee(coeffs, *parametres):
    """
    Une fonction u qui se contente de faire la somme pondérée des parametres
    
    `parametres` est un tuple (ou une liste) de taille m, composé de listes de taille n
    `coeffs` est un tuple (ou une liste) de taille m
    """
    
    m = len(coeffs)
    if m == 0 or len(parametres) != m:
        raise ValueError(f"Erreur: le nombre de paramètres ({len(parametres)}) et le nombre de coefficients ({m}) ne coincident pas ou ce nombre est égal à 0")
    
    n = len(parametres[0])
    if any(len(param) != n for param in parametres):
        raise ValueError(f"Erreur: les parametres n'ont pas tous la même taille {n}")
    
    U = np.array(coeffs)
    
    p = tuple(np.array(p) for p in parametres)
    P = np.stack(p)
    
    return np.dot(U, P)


def q(u):
    """
    Etant donné une liste (ou tuple) u de réels positifs,
    
    calcule la proportion que représente chaque valeur
    """
    s = sum(np.array(u))
    
    if len(u.shape) != 1 or s == 0:
        raise ValueError(f"Erreur: sum_X u_X = 0, ou bien u n'a pas la bonne forme (u.shape = {u.shape})")
    
    if np.any(u < 0):
        raise ValueError("Erreur: u contient des valeurs négatives")
    
    return u / s

def repartition(contributions, u):
    """
    Etant donné un tuple (ou liste) `contributions` de trucs à payer (tous positifs), de taille k
    et un vecteur `u` de pouvoir d'achat, de taille n (nombre de personnes),
    
    calcule la juste contribution que chaque personne devra payer
    
    """
    
    contributions = np.array(contributions)
    if np.any(contributions < 0):
        raise ValueError("Erreur: les contributions doivent toutes être positives ou nulles")
    
    
    proportions = q(u)
    return np.stack(tuple( c*proportions for c in contributions ))



#################################
    

if __name__ == "__main__":
    revenus = [5_000, 2_800]
    frais = [1_400, 950]
    
    # c'est la même chose que [r-f for r,f in zip(revenus, frais)], mais généralisable à un nombre quelconque de variables
    u = somme_ponderee([1,-1], revenus, frais) 
    contributions = [215, 840, 1366, 2111]
    
    print("pouvoirs d'achat respectifs ", u)
    print("proportions de contribution respectives", q(u), end="\n\n")
    
    print("-> Dans notre cas, la première colonne est ce que paie A, et la seconde ce que paie B")
    r = repartition(contributions, u)
    print(r)
    
    print("A paiera donc", ' + '.join(map(str, r[:, 0])))
    print("Alors que B paiera", ' + '.join(map(str, r[:, 1])))



Vous devez être membre accéder à ce service...

Pas encore inscrit ?

1 compte par personne, multi-compte interdit !

Ou identifiez-vous :


Rester sur la page

Désolé, votre version d'Internet Explorer est plus que périmée ! Merci de le mettre à jour ou de télécharger Firefox ou Google Chrome pour utiliser le site. Votre ordinateur vous remerciera !