[PYTHON] [Einführung in Scipy] Berechnung der Lorenzkurve und des Gini-Koeffizienten ♬

Die Lorenzkurve und der Gini-Koeffizient des Gesamtproblems der letzten Nacht scheinen tief zu sein, wenn ich sie untersuche, daher werde ich zusammenfassen, was ich untersucht habe.

Was ich getan habe

・ Lorenzkurve · Gini-Koeffizient ・ Numerische Integration mit Scipy ・ Ableitung

・ Lorenzkurve

Was ist die Lorenzkurve? "Wenn Sie beispielsweise die Einkommensverteilung untersuchen, kategorisieren Sie das Einkommen. Ordnen Sie das kategorisierte Einkommen in aufsteigender Reihenfolge. Parallel zur Anzahl der Personen, die zu dieser Kategorie gehören. Berechnen Sie den kumulativen Wert jeder Person. Standardisieren Sie jeden kumulativen Maximalwert auf 1. Und die vertikale Achse ist der standardisierte kumulative Einkommenswert, und die horizontale Achse ist die Kurve, die angezeigt wird, wenn die standardisierten numerischen Werte in der geordneten Reihenfolge gezeichnet werden. " Dieses Mal werde ich eine Lorenzkurve mit der Punkteverteilung der Schüler letzte Nacht zeichnen. Da die Anzahl der Personen gering ist, werden wir hier nur ohne Kategorisierung rangieren und akkumulieren. Aus den Daten der letzten Nacht kann die G1-Punkteverteilung wie folgt gezogen werden.

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

#Datenerfassung
student_data_math = pd.read_csv('./chap3/student-mat.csv', sep =';')
#'M'Daten abrufen für
df0 = student_data_math[student_data_math['sex'].isin(['M'])]
#'G1'In aufsteigender Reihenfolge bestellt
df = df0.sort_values(by=['G1'])
#'Ct'Fügen Sie eine numerische Spalte mit dem Namen hinzu
df['Ct']=np.arange(1,len(df)+1)

#Ersetzen Sie x durch eine numerische Zeichenfolge
x = df['Ct']
#Ersetzen Sie y durch den kumulativen Wert der G1-Daten
y = df['G1'].cumsum()
#Diagrammzeichnung
fig, (ax1,ax2) = plt.subplots(2, 1, figsize=(8,2*5))
#x,Standardisieren Sie mit dem Maximalwert von y und zeichnen Sie mit der blauen Linie
ax1.plot(x/max(x),y/max(y),'blue', label='M')
#Als gleichmäßige Verteilung gilt y=Diagrammzeichnung von x
ax1.plot(x/max(x),x/max(x),'black', label = 'y = x')
#Zeichnen Sie die Häufigkeitsverteilung auf ax2 (Da die Note 20 Stufen beträgt, binz=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 Und als ich es wiederholte, wurde es wie folgt. Mit anderen Worten, wir können sehen, dass es fast keinen Unterschied zwischen Männern und Frauen gibt. Figure_19-LorenzMF.png

· Gini-Koeffizient

Als Referenz ist der Gini-Koeffizient als die doppelte Fläche definiert, die in der obigen Abbildung von dem y = x-Diagramm und der Lorenz-Kurve umgeben ist. 【Referenz】 ・ Gini-Koeffizient @ Wikipedia Unten werde ich aus der Referenz zitieren. 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

Beispiel Verwendung von 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 Ähnlich wie oben kann der Gini-Koeffizient auch unten gezeichnet werden.

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 ist der kumulative Wert von Punkten
y2 = df['G1'].cumsum()
#y_int1 ist y=Integrierter Wert von x
y_int1 = integrate.cumtrapz(y1/max(y1), x/max(x), initial=0)
#y_int2 ist der integrierte Wert des kumulativen Wertes von G1
y_int2 = integrate.cumtrapz(y2/max(y2), x/max(x), initial=0)
#Plotten Sie jeweils
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()

Der Unterschied zwischen den beiden, wenn Peaples = 1 ist, ist der Gini-Koeffizient. Figure_19-GiniM.png Die Zahlen betrachten

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

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

ist. Mit anderen Worten, es scheint einen Fehler um die 5. Ziffer zu geben, aber der Unterschied zwischen Männern und Frauen liegt wahrscheinlich in der 4. Ziffer. Die Frau scheint etwas größer zu sein.

Ein anderer Weg, um den Gini-Koeffizienten zu finden

\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}

Abgesehen von der Ableitung der ersten Gleichung kann die Berechnung mit dem folgenden Code durchgeführt werden.

xbar = df['G1'].mean() #Finden Sie den Durchschnittswert
s = []
s = df['G1'].loc[:].values #Extrahieren Sie nur den Wert von G1
n = len(df) #Fragen Sie nach der Anzahl der Personen
GI = 0
#Der Durchschnitt scheint zwischen Männern und Frauen etwas unterschiedlich zu sein
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

Die erhaltenen Zahlen sind in der Regel relativ gleich, unterscheiden sich jedoch geringfügig von denen, die aus dem oben genannten sogenannten Gebiet erhalten wurden.

・ Ableitung

Ich denke, wir müssen die Formel für diese Methode ernsthaft ableiten. Suchen Sie zuerst den Bereich des blauen Teils A in der folgenden Abbildung. Lorenz-.png In der obigen Abbildung ist die vertikale Achse standardisiert, daher sollten x1 und x2 als $ x1⇒ \ frac {x1} {x1 + x2} $, $ x2⇒ \ frac {x2} {x1 + x2} $ gelesen werden. Wenn Sie dann die folgende erzwungene Transformation der Formel durchführen, können Sie sehen, dass die obige Formel des Gini-Koeffizienten für diese beiden Punkte gilt. Es scheint, dass dies durch Verallgemeinerung bewiesen werden kann, aber ich bin nicht motiviert, also werde ich eine andere Gelegenheit nutzen.

\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}

Zusammenfassung

・ Ich habe versucht, die Lorenzkurve und den Gini-Koeffizienten zu finden. ・ Der Gini-Koeffizient, der die Notenverteilung des Schülers widerspiegelt, wurde berechnet. ・ Der Unterschied in der Punkteverteilung zwischen Männern und Frauen ist gering

・ Ich möchte die allgemeine Formel des Gini-Koeffizienten beweisen ・ Ich möchte es auf die Investitionseffizienz (Portfolio) wie Aktien, Börsen sowie Einlagen und Ersparnisse anwenden.

Recommended Posts

[Einführung in Scipy] Berechnung der Lorenzkurve und des Gini-Koeffizienten ♬
[Statistik für Programmierer] Lorenzkurve und Gini-Koeffizient
[Einführung in Data Scientist] Grundlagen der wissenschaftlichen Berechnung, Datenverarbeitung und Verwendung der Grafikzeichnungsbibliothek ♬ Grundlagen von Scipy
Berechnung der Standardabweichung und des Korrelationskoeffizienten in Python
[Einführung in cx_Oracle] Übersicht über cx_Oracle
[Einführung in cx_Oracle] (Teil 4) Abrufen und Scrollen der Ergebnismenge
[Einführung in Data Scientists] Grundlagen von Python ♬ Funktionen und Klassen
Einführung von DataLiner Version 1.3 und Verwendung von Union Append
Einführung und Tipps von mlflow.Tracking
[Einführung in Data Scientist] Grundlagen der wissenschaftlichen Berechnung, Datenverarbeitung und Verwendung der Grafikzeichnungsbibliothek ♬ Grundlagen von Pandas
[Einführung in Data Scientist] Grundlagen der wissenschaftlichen Berechnung, Datenverarbeitung und Verwendung der Grafikzeichnungsbibliothek ♬ Grundlagen von Matplotlib
[Einführung in Python] Ich habe die Namenskonventionen von C # und Python verglichen.
[Einführung in die Udemy Python3 + -Anwendung] 69. Import des absoluten Pfads und des relativen Pfads
[Einführung in die Udemy Python3 + -Anwendung] 12. Indizieren und Schneiden von Zeichenketten
Einführung in TensorFlow - Zusammenfassung von vier Regeln und grundlegenden mathematischen Funktionen
[Einführung in cx_Oracle] (Teil 2) Grundlagen zum Verbinden und Trennen mit Oracle Database
[Einführung in Data Scientists] Grundlagen von Python ♬ Bedingte Verzweigung und Schleifen
[Einführung in Data Scientists] Grundlagen von Python ♬ Funktionen und anonyme Funktionen usw.
Einführung und Implementierung von JoCoR-Loss (CVPR2020)
[Einführung in Python3 Tag 1] Programmierung und Python
Berechnung der selbst erstellten Klasse und der vorhandenen Klasse
[Python] Berechnung des Kappa (k) -Koeffizienten
Berechnung des Spearman-Rangkorrelationskoeffizienten
Numerische Berechnung der Linsenpunktbildverteilungsfunktion und der MTF-Kurve (Beugungsberechnung)
[Einführung in Datenwissenschaftler] Grundlagen der Wahrscheinlichkeit und Statistik ♬ Wahrscheinlichkeits- / Wahrscheinlichkeitsvariable und Wahrscheinlichkeitsverteilung
Einführung des Cyber-Sicherheits-Frameworks "MITRE CALDERA": Verwendung und Schulung
Einführung in Deep Learning ~ Falten und Pooling ~
[Python] Berechnung der Bildähnlichkeit (Würfelkoeffizient)
[Einführung in AWS] Text-Voice-Konvertierung und Wiedergabe ♪
Einfache Einführung in die Python3-Serie und OpenCV3
Einführung in Scapy ① (Von der Installation bis zur Ausführung von Scapy)
[Einführung in Data Scientist] Grundlagen von Python ♬