[PYTHON] [Introduction à Scipy] Calcul de la courbe de Lorenz et du coefficient de Gini ♬

La courbe de Lorenz et le coefficient de Gini du problème global d'hier soir semblent être profonds lorsque je les examine, donc je vais résumer ce que j'ai étudié.

Ce que j'ai fait

・ Courbe de Lorenz · Coefficient de Gini ・ Intégration numérique avec Scipy ・ Dérivation

・ Courbe de Lorenz

Quelle est la courbe de Lorenz? "Par exemple, lorsque vous examinez la répartition des revenus, catégorisez le revenu. Classez le revenu catégorisé par ordre croissant. Mettez en parallèle le nombre de personnes appartenant à cette catégorie. Calculez la valeur cumulée de chacun. Standardisez chaque valeur maximale cumulée à 1. Et l'axe vertical représente la valeur du revenu cumulatif normalisé et l'axe horizontal est la courbe qui apparaît lorsque les valeurs numériques normalisées dans l'ordre ordonné sont tracées. " Cette fois, je dessinerai une courbe de Lorenz avec la distribution des scores des élèves hier soir. Ici, comme le nombre de personnes est petit, nous ne ferons que classer et accumuler sans catégoriser. À partir des données d'hier soir, la distribution des scores G1 peut être établie comme suit.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

#Capture de données
student_data_math = pd.read_csv('./chap3/student-mat.csv', sep =';')
#'M'Obtenez des données pour
df0 = student_data_math[student_data_math['sex'].isin(['M'])]
#'G1'Ordonné par ordre croissant
df = df0.sort_values(by=['G1'])
#'Ct'Ajoutez une colonne numérique appelée
df['Ct']=np.arange(1,len(df)+1)

#Remplacez x par une chaîne numérique
x = df['Ct']
#Remplacer la valeur cumulée des données G1 par y
y = df['G1'].cumsum()
#Dessin graphique
fig, (ax1,ax2) = plt.subplots(2, 1, figsize=(8,2*5))
#x,Normaliser avec la valeur maximale de y et dessiner avec une ligne bleue
ax1.plot(x/max(x),y/max(y),'blue', label='M')
#En tant que distribution uniforme, y=Dessin graphique de x
ax1.plot(x/max(x),x/max(x),'black', label = 'y = x')
#Dessinez la distribution de fréquence sur ax2 (Puisque la note est de 20 niveaux,=20)
ax2.hist(y/max(y), bins = 20, range =(0,1),label ='M')
ax1.set_xlabel('peoples')
ax1.set_ylabel('G1_Grade.cumsum')
ax2.set_ylabel('freq.')
ax2.set_xlabel('G1_Grade.cumsum')
ax1.legend()
ax1.grid(True)
plt.show()

Figure_19-LorenzMhist.png Figure_19-LorenzFhist.png Et quand je l'ai répété, c'est devenu comme suit. En d'autres termes, nous pouvons voir qu'il n'y a presque aucune différence entre les hommes et les femmes. Figure_19-LorenzMF.png

· Coefficient de Gini

Pour référence, le coefficient de Gini est défini comme le double de la zone délimitée par le graphique y = x et la courbe de Lorenz dans la figure ci-dessus. 【référence】 ・ Coefficient de Gini @ wikipedia Ci-dessous, je citerai la référence. Economics_Gini_coefficient2.svg.png 「G = A/(A + B). It is also equal to 2A and to 1 − 2B due to the fact that A + B = 0.5 (since the axes scale from 0 to 1).」

・ Scipy

Exemple Comment utiliser integr.cumtrapz

from scipy import integrate
x = np.linspace(0, 2, num=2**4+1)
y = x**4
y_int = integrate.cumtrapz(y, x, initial=0)
plt.plot(x, y_int, 'ro', x, y[0] + 0.2 * x**5, 'b-')
plt.show()

Figure_20ex.png Similaire à ce qui précède, le coefficient de Gini peut également être dessiné ci-dessous.

df0 = student_data_math[student_data_math['sex'].isin(['M'])] #F
df = df0.sort_values(by=['G1'])
df['Ct']=np.arange(1,len(df)+1)
x = df['Ct'] 
y1 = df['Ct']
#y2 est la valeur cumulée des points
y2 = df['G1'].cumsum()
#y_int1 est y=Valeur intégrée de x
y_int1 = integrate.cumtrapz(y1/max(y1), x/max(x), initial=0)
#y_int2 est la valeur intégrée de la valeur cumulée de G1
y_int2 = integrate.cumtrapz(y2/max(y2), x/max(x), initial=0)
#Tracer chacun
plt.plot(x/max(x), 2*y_int1,'black', label = 'y=x')
plt.plot(x/max(x), 2*y_int2, 'blue',label = 'M_A')
plt.plot(x/max(x), 1-2*y_int1,'black',label ='1-2*(y=x)')
plt.plot(x/max(x), 1-2*y_int2,'blue', label ='M_1-2*A')
plt.xlabel('peoples')
plt.ylabel('integrate')
plt.legend()
plt.show()

La différence entre les deux lorsque peaples = 1 est le coefficient de Gini. Figure_19-GiniM.png En regardant les chiffres

print(1-2*y_int2[len(df)-1]) 
#0.17198115609880305 M 
#0.17238700073127444 F

print(2*y_int1[len(df)-1]) 
#0.999971403242873 

est. En d'autres termes, il semble y avoir une erreur autour du 5e chiffre, mais la différence entre les hommes et les femmes se situe probablement au 4e chiffre. La femme semble être un peu plus grande.

Une autre façon de trouver le coefficient de Gini

\begin{align}
GI &=& \frac{\Sigma_{i=1}^{n}\Sigma_{j=1}^{n}|x_i-x_j|}{2\Sigma_{i=1}^{n}\Sigma_{j=1}^{n}x_j}\\
&=& \frac{\Sigma_{i=1}^{n}\Sigma_{j=1}^{n}|x_i-x_j|}{2n\Sigma_{i=1}^{n}x_i}\\
&=& \frac{\Sigma_{i=1}^{n}\Sigma_{j=1}^{n}|x_i-x_j|}{2n^2\bar x}\\
\end{align}

En plus de dériver la première équation, le calcul peut être effectué avec le code suivant.

xbar = df['G1'].mean() #Trouvez la valeur moyenne
s = []
s = df['G1'].loc[:].values #Extraire uniquement la valeur de G1
n = len(df) #Demandez le nombre de personnes
GI = 0
#La moyenne semble être un peu différente entre les hommes et les femmes
print(xbar)  #10.620192307692308 F  11.229946524064172 M
for i in range(1,len(df),1):
    a = s[i]
    for j in range(1,len(df),1):
        b = s[j]
        GI += np.abs(a-b)

GI = GI/(2*n*n*xbar)
print(GI)  #0.16938137688477206 F  0.16805449452508275 M

Les nombres obtenus ont tendance à être relativement les mêmes, mais légèrement différents de ceux obtenus à partir de la zone dite ci-dessus.

・ Dérivation

Après tout, je pense que nous devons sérieusement dériver la formule de cette méthode. Tout d'abord, trouvez la zone de la partie bleue A dans la figure ci-dessous. Lorenz-.png Dans la figure ci-dessus, l'axe vertical est normalisé, donc x1 et x2 doivent être lus comme $ x1⇒ \ frac {x1} {x1 + x2} $, $ x2⇒ \ frac {x2} {x1 + x2} $. Ensuite, si vous effectuez la transformation forcée suivante de la formule, vous pouvez voir que la formule ci-dessus du coefficient de Gini est valable dans le cas de ces deux points. Il semble que cela puisse être prouvé en généralisant cela, mais je ne suis pas motivé, je vais donc saisir une autre occasion.

\begin{align}
2*A&=2(1*1*1/2-1/2*\frac{x1}{x1+x2}*1/2-\frac{x1}{x1+x2}*1/2-1/2*\frac{x2}{x1+x2}*1/2)\\
&=\frac{2(x1+x2)}{2(x1+x2)}-\frac{x1}{2(x1+x2)}-\frac{2x1}{2(x1+x2)}-\frac{x2}{2(x1+x2)}\\
&=\frac{2(x1+x2)-x1-2x1-x2}{2(x1+x2)}\\
&=\frac{x2-x1}{2(x1+x2)}\\
&=\frac{|x2-x1|+|x1-x2|}{2*2^2\bar x}
\end{align}

Résumé

・ J'ai essayé de trouver la courbe de Lorenz et le coefficient de Gini. ・ Le coefficient de Gini qui reflète la distribution des notes de l'élève a été calculé. ・ La différence de distribution des scores entre les hommes et les femmes est faible

・ Je veux prouver la formule générale du coefficient de Gini ・ Je voudrais l'appliquer à l'efficacité des investissements (portefeuille) tels que les actions, les échanges, les dépôts et l'épargne.

Recommended Posts

[Introduction à Scipy] Calcul de la courbe de Lorenz et du coefficient de Gini ♬
[Statistiques pour les programmeurs] Courbe de Lorenz et coefficient de Gini
[Introduction à Data Scientist] Bases du calcul scientifique, du traitement des données et comment utiliser la bibliothèque de dessins graphiques graph Bases de Scipy
Calcul de l'écart type et du coefficient de corrélation en Python
[Introduction à cx_Oracle] Présentation de cx_Oracle
[Introduction à cx_Oracle] (Partie 4) Récupération et défilement du jeu de résultats
[Introduction to Data Scientists] Bases de Python ♬ Fonctions et classes
Introduction de DataLiner ver.1.3 et comment utiliser Union Append
Introduction et astuces de mlflow.
[Introduction à Data Scientist] Bases du calcul scientifique, du traitement des données et comment utiliser la bibliothèque de dessins graphiques graph Bases de Pandas
[Introduction à Data Scientist] Bases du calcul scientifique, du traitement des données et comment utiliser la bibliothèque de dessin de graphes ♬ Bases de Matplotlib
[Introduction à Python] J'ai comparé les conventions de nommage de C # et Python.
[Introduction à Udemy Python3 + Application] 69. Importation du chemin absolu et du chemin relatif
[Introduction à l'application Udemy Python3 +] 12. Indexation et découpage des chaînes de caractères
Introduction à TensorFlow - Résumé de quatre règles et fonctions mathématiques de base
[Introduction à cx_Oracle] (Partie 2) Principes de base de la connexion et de la déconnexion à Oracle Database
[Introduction to Data Scientists] Bases de Python ♬ Branchements conditionnels et boucles
[Introduction aux Data Scientists] Bases de Python ♬ Fonctions et fonctions anonymes, etc.
Introduction et mise en œuvre de JoCoR-Loss (CVPR2020)
[Introduction à Python3 Jour 1] Programmation et Python
Calcul de la classe auto-fabriquée et de la classe existante
[Python] Calcul du coefficient kappa (k)
Calcul du coefficient de corrélation de rang de Spearman
Calcul numérique de la fonction de distribution d'image du point de l'objectif et de la courbe MTF (calcul de diffraction)
[Introduction aux data scientists] Bases de la probabilité et des statistiques ♬ Variable de probabilité / probabilité et distribution de probabilité
Introduction du cadre de cybersécurité "MITRE CALDERA": utilisation et formation
Introduction au Deep Learning ~ Pliage et mise en commun ~
[Python] Calcul de la similarité d'image (coefficient de dés)
[Introduction à AWS] Conversion de texte-voix et lecture ♪
Introduction facile de la série python3 et d'OpenCV3
Introduction à Scapy ① (De l'installation à l'exécution de Scapy)
[Introduction au Data Scientist] Bases de Python ♬