Letzte Nacht habe ich die Grundlagen der wissenschaftlichen Berechnung, Datenverarbeitung und Verwendung der Graph Drawing Library zusammengefasst (https://qiita.com/MuAuan/items/d4475e15599b8c6e147e). Ab heute Abend werde ich sie endlich nutzen, um zum Hauptthema zu gelangen. Heute Abend werde ich deskriptive Statistiken und einfache Regressionsanalysen zusammenfassen. Ich werde die Erklärungen in diesem Buch ergänzen. 【Hinweis】 ["Data Scientist Training Course an der Universität von Tokio"](https://www.amazon.co.jp/%E6%9D%B1%E4%BA%AC%E5%A4%A7%E5%AD%A6%E3 % 81% AE% E3% 83% 87% E3% 83% BC% E3% 82% BF% E3% 82% B5% E3% 82% A4% E3% 82% A8% E3% 83% B3% E3% 83 % 86% E3% 82% A3% E3% 82% B9% E3% 83% 88% E8% 82% B2% E6% 88% 90% E8% AC% 9B% E5% BA% A7-Python% E3% 81 % A7% E6% 89% 8B% E3% 82% 92% E5% 8B% 95% E3% 81% 8B% E3% 81% 97% E3% 81% A6% E5% AD% A6% E3% 81% B6 % E3% 83% 87% E2% 80% 95% E3% 82% BF% E5% 88% 86% E6% 9E% 90-% E5% A1% 9A% E6% 9C% AC% E9% 82% A6% Ich werde E5% B0% 8A / dp / 4839965250 / ref = tmm_pap_swatch_0? _ Encoding = UTF8 & qid = & sr =) lesen und die Teile zusammenfassen, an denen ich einige Zweifel habe oder die ich nützlich finde. Daher denke ich, dass die Zusammenfassung unkompliziert sein wird, aber bitte lesen Sie sie und denken Sie, dass der Inhalt nichts mit diesem Buch zu tun hat.
Statistische Analysemethoden sind in deskriptive Statistiken und Inferenzstatistiken unterteilt.
"Eine Methode, um die Eigenschaften der gesammelten Daten zu erfassen, sie leicht verständlich zu organisieren und leicht sichtbar zu machen. Berechnen Sie die Eigenschaften der Daten, indem Sie den Mittelwert, die Standardabweichung usw. berechnen, die Daten klassifizieren und mithilfe von Abbildungen und Grafiken ausdrücken. Es ist eine beschreibende Statistik. "
"Die Idee der Inferenzstatistik besteht darin, eine genaue Analyse unter Verwendung eines Modells durchzuführen, das auf einer Wahrscheinlichkeitsverteilung aus nur Teildaten basiert, und das Ganze abzuleiten, um Statistiken zu erhalten." "Es wird auch verwendet, um die Zukunft anhand vergangener Daten vorherzusagen. In diesem Kapitel wird eine einfache Regressionsanalyse beschrieben, die die Grundlage für Inferenzstatistiken bildet. Komplexere Inferenzstatistiken werden in den nächsten vier Kapiteln behandelt."
import numpy as np
import scipy as sp
import pandas as pd
from pandas import Series, DataFrame
import matplotlib as mpl
import seaborn as sns
import matplotlib.pyplot as plt
sns.set()
from sklearn import linear_model
Installieren Sie sklearn unten.
$ sudo pip3 install scikit-learn
Wie unten gezeigt, scheint es, dass es auch mit Rasipi4 verwendet werden kann.
$ python3
Python 3.7.3 (default, Jul 25 2020, 13:03:44)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from sklearn import linear_model
>>>
Derzeit wurde python3-sklearn-doc nicht gefunden, aber es scheint, dass es unter Debian / Ubuntu installiert werden könnte.
$ sudo apt-get install python3-sklearn python3-sklearn-lib
...Kürzung 3-2-1-5 Beziehen Sie die Daten student.zip von der folgenden Site mit dem folgenden Programm. https://archive.ics.uci.edu/ml/machine-learning-databases/00356/student.zip
import requests, zipfile
from io import StringIO
import io
url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/00356/student.zip'
r = requests.get(url, stream = True)
z = zipfile.ZipFile(io.BytesIO(r.content))
z.extractall()
Die folgenden vier Dateien wurden erweitert. student.txt student-mat.csv student-merge.R student-pcr.csv
Stellen Sie eine Verbindung zum obigen Import her und führen Sie Folgendes aus
student_data_math = pd.read_csv('./chap3/student-mat.csv')
print(student_data_math.head())
Daten; Sie können das Trennzeichen überprüfen.
school;sex;age;address;famsize;Pstatus;Medu;Fedu;Mjob;Fjob;reason;guardian;traveltime;studytime;failures;schoolsup;famsup;paid;activities;nursery;higher;internet;romantic;famrel;freetime;goout;Dalc;Walc;health;absences;G1;G2;G3
0 GP;"F";18;"U";"GT3";"A";4;4;"at_home";"teacher...
1 GP;"F";17;"U";"GT3";"T";1;1;"at_home";"other";...
2 GP;"F";15;"U";"LE3";"T";1;1;"at_home";"other";...
3 GP;"F";15;"U";"GT3";"T";4;2;"health";"services...
4 GP;"F";16;"U";"GT3";"T";3;3;"other";"other";"h...
Ändern Sie den Lesevorgang in und laden Sie ihn neu.
student_data_math = pd.read_csv('./chap3/student-mat.csv', sep =';')
print(student_data_math.head())
Es sah wunderschön aus.
school sex age address famsize Pstatus Medu Fedu ... goout Dalc Walc health absences G1 G2 G3
0 GP F 18 U GT3 A 4 4 ... 4 1 1 3 6 5 6 6
1 GP F 17 U GT3 T 1 1 ... 3 1 1 3 4 5 5 6
2 GP F 15 U LE3 T 1 1 ... 2 2 3 3 10 7 8 10
3 GP F 15 U GT3 T 4 2 ... 2 1 1 5 2 15 14 15
4 GP F 16 U GT3 T 3 3 ... 2 1 2 5 4 6 10 10
[5 rows x 33 columns]
print(student_data_math.info())
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 395 entries, 0 to 394
Data columns (total 33 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 school 395 non-null object
1 sex 395 non-null object
2 age 395 non-null int64
3 address 395 non-null object
4 famsize 395 non-null object
5 Pstatus 395 non-null object
6 Medu 395 non-null int64
7 Fedu 395 non-null int64
8 Mjob 395 non-null object
9 Fjob 395 non-null object
10 reason 395 non-null object
11 guardian 395 non-null object
12 traveltime 395 non-null int64
13 studytime 395 non-null int64
14 failures 395 non-null int64
15 schoolsup 395 non-null object
16 famsup 395 non-null object
17 paid 395 non-null object
18 activities 395 non-null object
19 nursery 395 non-null object
20 higher 395 non-null object
21 internet 395 non-null object
22 romantic 395 non-null object
23 famrel 395 non-null int64
24 freetime 395 non-null int64
25 goout 395 non-null int64
26 Dalc 395 non-null int64
27 Walc 395 non-null int64
28 health 395 non-null int64
29 absences 395 non-null int64
30 G1 395 non-null int64
31 G2 395 non-null int64
32 G3 395 non-null int64
dtypes: int64(16), object(17)
memory usage: 102.0+ KB
Wenn man sich den Inhalt von cat student.txt ansieht, scheint es, dass diese Daten den folgenden Inhalt haben.
$ cat student.txt
# Attributes for both student-mat.csv (Math course) and student-por.csv (Portuguese language course) datasets:
1 school - student's school (binary: "GP" - Gabriel Pereira or "MS" - Mousinho da Silveira)
2 sex - student's sex (binary: "F" - female or "M" - male)
3 age - student's age (numeric: from 15 to 22)
4 address - student's home address type (binary: "U" - urban or "R" - rural)
5 famsize - family size (binary: "LE3" - less or equal to 3 or "GT3" - greater than 3)
6 Pstatus - parent's cohabitation status (binary: "T" - living together or "A" - apart)
7 Medu - mother's education (numeric: 0 - none, 1 - primary education (4th grade), 2 – 5th to 9th grade, 3 – secondary education or 4 – higher education)
8 Fedu - father's education (numeric: 0 - none, 1 - primary education (4th grade), 2 – 5th to 9th grade, 3 – secondary education or 4 – higher education)
9 Mjob - mother's job (nominal: "teacher", "health" care related, civil "services" (e.g. administrative or police), "at_home" or "other")
10 Fjob - father's job (nominal: "teacher", "health" care related, civil "services" (e.g. administrative or police), "at_home" or "other")
11 reason - reason to choose this school (nominal: close to "home", school "reputation", "course" preference or "other")
12 guardian - student's guardian (nominal: "mother", "father" or "other")
13 traveltime - home to school travel time (numeric: 1 - <15 min., 2 - 15 to 30 min., 3 - 30 min. to 1 hour, or 4 - >1 hour)
14 studytime - weekly study time (numeric: 1 - <2 hours, 2 - 2 to 5 hours, 3 - 5 to 10 hours, or 4 - >10 hours)
15 failures - number of past class failures (numeric: n if 1<=n<3, else 4)
16 schoolsup - extra educational support (binary: yes or no)
17 famsup - family educational support (binary: yes or no)
18 paid - extra paid classes within the course subject (Math or Portuguese) (binary: yes or no)
19 activities - extra-curricular activities (binary: yes or no)
20 nursery - attended nursery school (binary: yes or no)
21 higher - wants to take higher education (binary: yes or no)
22 internet - Internet access at home (binary: yes or no)
23 romantic - with a romantic relationship (binary: yes or no)
24 famrel - quality of family relationships (numeric: from 1 - very bad to 5 - excellent)
25 freetime - free time after school (numeric: from 1 - very low to 5 - very high)
26 goout - going out with friends (numeric: from 1 - very low to 5 - very high)
27 Dalc - workday alcohol consumption (numeric: from 1 - very low to 5 - very high)
28 Walc - weekend alcohol consumption (numeric: from 1 - very low to 5 - very high)
29 health - current health status (numeric: from 1 - very bad to 5 - very good)
30 absences - number of school absences (numeric: from 0 to 93)
# these grades are related with the course subject, Math or Portuguese:
31 G1 - first period grade (numeric: from 0 to 20)
31 G2 - second period grade (numeric: from 0 to 20)
32 G3 - final grade (numeric: from 0 to 20, output target)
Additional note: there are several (382) students that belong to both datasets .
These students can be identified by searching for identical attributes
that characterize each student, as shown in the annexed R file.
・ Quantitative Daten Es sind Daten, die durch kontinuierliche Werte ausgedrückt werden, auf die die vier Regeln angewendet werden können, und das Verhältnis ist aussagekräftig. Beispiel: Anzahl der Personen, Geldbetrag usw. ・ Qualitätsdaten Es sind diskontinuierliche Daten, auf die die vier Regeln nicht angewendet werden können und die zum Ausdrücken des Zustands verwendet werden. Beispiel: Rangfolge, Kategorie usw.
Geschlecht ist qualitative Daten
print(student_data_math['sex'].head())
0 F
1 F
2 F
3 F
4 F
Name: sex, dtype: object
Die Anzahl der Abwesenden sind quantitative Daten
print(student_data_math['absences'].head())
0 6
1 4
2 10
3 2
4 4
Name: absences, dtype: int64
print(student_data_math.groupby('sex')['age'].mean())
sex
F 16.730769
M 16.657754
Name: age, dtype: float64
Frauen studieren.
print(student_data_math.groupby('sex')['studytime'].mean())
sex
F 2.278846
M 1.764706
Name: studytime, dtype: float64
fig, (ax1) = plt.subplots(1, 1, figsize=(8,6))
y1 = student_data_math['absences']
ax1.hist(y1, bins = 10, range =(0.0,max(y1)))
ax1.set_ylabel('count')
ax1.set_xlabel('absences')
plt.grid(True)
plt.show()
print('Durchschnittswert{}'.format(student_data_math['absences'].mean()))
print('Median{}'.format(student_data_math['absences'].median()))
print('Häufigster Wert{}'.format(student_data_math['absences'].mode()))
Durchschnittswert 5.708860759493671
Medianwert 4.0
Häufigster Wert 0 0
dtype: int64
Vergrößern Sie die Abbildung oben, um sie in der Abbildung zu überprüfen.
fig, (ax1) = plt.subplots(1, 1, figsize=(8,6))
y1 = student_data_math['absences']
ax1.hist(y1, bins = 30, range =(0.0,30)) #,max(y1)
x0 = student_data_math['absences'].mean()
ax1.plot(x0+0.5, 70, 'red', marker = 'o',markersize=10,label ='mean')
x0 = student_data_math['absences'].median()
ax1.plot(x0+0.5, 70, 'blue', marker = 'o',markersize=10,label ='median')
x0 = student_data_math['absences'].mode()
ax1.plot(x0+0.5, 70, 'black', marker = 'o',markersize=10,label ='mode')
ax1.legend()
ax1.set_ylabel('count')
ax1.set_xlabel('absences')
plt.grid(True)
plt.show()
Definitionsformel Verteilung $ σ ^ 2 $
σ^2 = \frac{1}{n}\Sigma_{i=1}^{n}(x_i-\bar{x})^2
Standardabweichung $ σ $ std(standered deviation)
σ = \sqrt{\frac{1}{n}\Sigma_{i=1}^{n}(x_i-\bar{x})^2}
print('Verteilt{}'.format(student_data_math['absences'].var(ddof=0)))
print('Standardabweichung{}'.format(student_data_math['absences'].std(ddof = 0)))
print('Standardabweichung{}'.format(np.sqrt(student_data_math['absences'].var())))
Dispersion 63.887389841371565
Standardabweichung 7.99295876640006
Standardabweichung 8.00309568710818
Tragen Sie den Mittelwert ± Standardabweichung auf.
fig, (ax1) = plt.subplots(1, 1, figsize=(8,6))
y1 = student_data_math['absences']
ax1.hist(y1, bins = 30, range =(0.0,30)) #,max(y1)
x0 = student_data_math['absences'].mean()
ax1.plot(x0+0.5, 70, 'red', marker = 'o',markersize=10,label ='mean')
x1 = student_data_math['absences'].std(ddof=0)
ax1.plot(x0+x1+0.5, 70, 'blue', marker = 'o',markersize=10,label ='mean+std')
ax1.plot(x0-x1+0.5, 70, 'black', marker = 'o',markersize=10,label ='mean-std')
ax1.legend()
ax1.set_ylabel('count')
ax1.set_xlabel('absences')
plt.grid(True)
plt.show()
Der Perzentilwert ist die Rangfolge, wenn die Gesamtzahl 100 beträgt 25. Perzentil, 25. Perzentil, 1. Quadrant Das 75. ist das 75. Perzentil, der dritte Quadrant 50. Perzentil, Median
print('Zusammengefasste Statistiken', student_data_math['absences'].describe())
Zusammenfassende Statistik zählt 395.000000
mean 5.708861
std 8.003096
min 0.000000
25% 0.000000
50% 4.000000
75% 8.000000
max 75.000000
Name: absences, dtype: float64
student_data_math [' Abwesenheiten '] .describe () [6] -student_data_math [' Abwesenheiten '] .describe () [4])
75-25% Century 8.0fig, (ax1) = plt.subplots(1, 1, figsize=(8,6))
y1 = student_data_math['absences']
ax1.hist(y1, bins = 30, range =(0.0,30)) #,max(y1)
x0 = student_data_math['absences'].median()
ax1.plot(x0+0.5, 70, 'red', marker = 'o',markersize=10,label ='median')
x1 = student_data_math['absences'].describe()[4]
ax1.plot(x1+0.5, 70, 'blue', marker = 'o',markersize=10,label ='25percentile')
x1 = student_data_math['absences'].describe()[6]
ax1.plot(x1+0.5, 70, 'black', marker = 'o',markersize=10,label ='75percentile')
ax1.legend()
ax1.set_ylabel('count')
ax1.set_xlabel('absences')
plt.grid(True)
plt.show()
print('Vollständige Statistik der Spaltenzusammenfassung', student_data_math.describe())
Vollständige Statistik der Spaltenzusammenfassung
age Medu Fedu traveltime ... absences G1 G2 G3
count 395.000000 395.000000 395.000000 395.000000 ... 395.000000 395.000000 395.000000 395.000000
mean 16.696203 2.749367 2.521519 1.448101 ... 5.708861 10.908861 10.713924 10.415190
std 1.276043 1.094735 1.088201 0.697505 ... 8.003096 3.319195 3.761505 4.581443
min 15.000000 0.000000 0.000000 1.000000 ... 0.000000 3.000000 0.000000 0.000000
25% 16.000000 2.000000 2.000000 1.000000 ... 0.000000 8.000000 9.000000 8.000000
50% 17.000000 3.000000 2.000000 1.000000 ... 4.000000 11.000000 11.000000 11.000000
75% 18.000000 4.000000 3.000000 2.000000 ... 8.000000 13.000000 13.000000 14.000000
max 22.000000 4.000000 4.000000 4.000000 ... 75.000000 19.000000 19.000000 20.000000
[8 rows x 16 columns]
Box Whisker ist (Mindestwert, 1 .. 1 Quadrant, Median, 3. Quadrant, Maximum) wie unten gezeigt.
fig, (ax1,ax2) = plt.subplots(2, 1, figsize=(8,2*4))
y1 = student_data_math['G1']
ax1.hist(y1, bins = 30, range =(0.0,max(y1))) #,max(y1)
x0 = student_data_math['G1'].median()
ax1.plot(x0+0.5, 60, 'red', marker = 'o',markersize=10,label ='median')
x1 = student_data_math['G1'].describe()[4]
ax1.plot(x1+0.5, 60, 'blue', marker = 'o',markersize=10,label ='25percentile')
x1 = student_data_math['G1'].describe()[6]
ax1.plot(x1+0.5, 60, 'black', marker = 'o',markersize=10,label ='75percentile')
ax2.boxplot(y1)
ax2.set_xlabel('G1')
ax2.set_ylabel('count')
ax1.legend()
ax1.set_ylabel('count')
ax1.set_xlabel('G1')
plt.grid(True)
plt.show()
fig, (ax1) = plt.subplots(1, 1, figsize=(8,6))
y1 = [student_data_math['G1'],student_data_math['G2'],student_data_math['G3'],student_data_math['absences']]
ax1.boxplot(y1,labels=['G1', 'G2', 'G3', 'absences'])
ax1.set_xlabel('category')
ax1.set_ylabel('count')
ax1.legend()
ax1.set_ylabel('count')
ax1.set_xlabel('category')
plt.grid(True)
plt.show()
Der Fluktuationskoeffizient CV ist die Standardabweichung σ / Durchschnittswert $ \ bar {x} $ Der Fluktuationskoeffizient hängt nicht von der Skala ab, und der Dispersionsgrad ist erkennbar.
print(student_data_math.std()/student_data_math.mean())
age 0.076427
Medu 0.398177
Fedu 0.431565
traveltime 0.481668
studytime 0.412313
failures 2.225319
famrel 0.227330
freetime 0.308725
goout 0.358098
Dalc 0.601441
Walc 0.562121
health 0.391147
absences 1.401873
G1 0.304266
G2 0.351086
G3 0.439881
dtype: float64
fig, (ax1) = plt.subplots(1, 1, figsize=(8,6))
x = student_data_math['G1']
y = student_data_math['G3']
ax1.plot(x,y, 'o')
ax1.set_xlabel('G1-grade')
ax1.set_ylabel('G3-grade')
ax1.legend()
plt.grid(True)
plt.show()
Diejenigen, die einen hohen G1-Grad hatten, haben auch einen hohen G3-Grad. Es gibt jedoch einige Leute, die 0 G3-Klasse haben. Dies ist ein Ausreißer, aber es gibt verschiedene Gründe dafür, und es gibt eine Debatte darüber, ob er ausgeschlossen werden soll. Wie steht es also mit der Anzahl der Tage, an denen Personen mit G3-Note 0 teilnehmen? Zeichnen Sie das folgende Korrelationsdiagramm.
fig, (ax1) = plt.subplots(1, 1, figsize=(8,6))
x = student_data_math['G3']
y = student_data_math['absences']
ax1.plot(x,y, 'o')
ax1.set_xlabel('G3-grade')
ax1.set_ylabel('absences')
ax1.legend()
plt.grid(True)
plt.show()
Das Ergebnis ist, dass Personen mit einer G3-Note von 0 nicht anwesend sind. Irgendwas stimmt nicht. Eigentlich kann ich mir vorstellen, dass ich auf halber Strecke stehen geblieben bin und nicht gezählt habe. Darüber hinaus ist die Korrelation zwischen dem G1-Grad und der Anzahl der Abwesenden wie folgt. Erstens sind zum Zeitpunkt der G2-Klasse einige Personen 0-Grad. Und wenn man die Korrelation zwischen G2-Grad und G3-Grad betrachtet, kann man sehen, dass einige Menschen auf 0 Grad gefallen sind und dass die Anzahl solcher Menschen allmählich zunimmt. Und es scheint, dass die Verstorbenen von denen mit niedrigen Punktzahlen sind. Daher ist es wichtiger, verschiedene Daten zu analysieren, als mit einem Diagramm zum Schluss zu kommen.
Die Definitionsformel lautet wie folgt
S_{xy}=\frac{1}{n}\Sigma_{i=1}^{n}(x_i-\bar{x})(y_i-\bar{y})
Das heißt, der diagonale Term ist die oben definierte Varianz. Was bedeutet der Ausdruck außerhalb der Diagonale? Wenn $ x $ und $ y $ eine inhärent lineare Beziehung haben, lautet die Gleichung für die durch die Methode der kleinsten Quadrate abgeleitete Gerade als Referenz 【Referenz】 Lineare Regressionsanalyse / Minimum-Square-Methode bedeutet Kovarianz / Korrelationskoeffizient
y=\frac{S_{xy}}{\sigma^2_{x}}x + \bar y−\frac{S_{xy}}{\sigma^2_x}\bar x \\
Wenn transformiert,\\
\frac{y-\bar y}{\sigma_y}=\frac{S_{xy}}{\sigma_x\sigma_y}\frac{x-\bar x}{\sigma_x}
Das heißt, die Steigung der linearen Gleichung, die durch die Standardabweichung und den Durchschnittswert standardisiert ist, ist wie folgt.
r_{xy}=\frac{S_{xy}}{\sigma_x\sigma_y}
Das heißt, die Kovarianz wird durch die Standardabweichung standardisiert, und dies ist die Definitionsformel des sogenannten Korrelationskoeffizienten $ r_ {xy} $.
Hier werden die Kovarianz und der Korrelationskoeffizient berechnet. Kovarianz ist die Varianz von nicht diagonalen Termen und diagonale Terme sind G1 und G3.
print(np.cov(student_data_math['G1'],student_data_math['G3']))
[[11.01705327 12.18768232]
[12.18768232 20.9896164 ]]
Die Front ist der Korrelationskoeffizient und der zweite Term ist der p-Wert.
print(sp.stats.pearsonr(student_data_math['G1'],student_data_math['G3']))
(0.801467932017414, 9.001430312277865e-90)
Die Korrelationsmatrix wird wie folgt berechnet.
print(np.corrcoef(student_data_math['G1'],student_data_math['G3']))
[[1. 0.80146793]
[0.80146793 1. ]]
Dalc; Alkoholkonsum an Wochentagen Walc; Alkoholkonsum am Wochenende Zeichnen Sie ein Streudiagramm, um festzustellen, ob eine Korrelation zwischen den G1- und G3-Werten besteht. Ergebnis, scheint unwahrscheinlich
g = sns.pairplot(student_data_math[['Dalc','Walc','G1','G3']])
g.savefig('seaborn_pairplot_g.png')
【Referenz】 Erstellen Sie ein Paar-Plot-Diagramm (Streudiagramm-Matrix) mit Python, Pandas, Seaborn Keine Korrelation zwischen Walc- und G3-Werten
print(np.corrcoef(student_data_math['Walc'],student_data_math['G3']))
[[ 1. -0.05193932]
[-0.05193932 1. ]]
Keine Variation für jede Gruppe
print(student_data_math.groupby('Walc')['G3'].mean())
Walc
1 10.735099
2 10.082353
3 10.725000
4 9.686275
5 10.142857
Name: G3, dtype: float64
age Medu Fedu traveltime ... absences G1 G2 G3
count 649.000000 649.000000 649.000000 649.000000 ... 649.000000 649.000000 649.000000 649.000000
mean 16.744222 2.514638 2.306626 1.568567 ... 3.659476 11.399076 11.570108 11.906009
std 1.218138 1.134552 1.099931 0.748660 ... 4.640759 2.745265 2.913639 3.230656
min 15.000000 0.000000 0.000000 1.000000 ... 0.000000 0.000000 0.000000 0.000000
25% 16.000000 2.000000 1.000000 1.000000 ... 0.000000 10.000000 10.000000 10.000000
50% 17.000000 2.000000 2.000000 1.000000 ... 2.000000 11.000000 11.000000 12.000000
75% 18.000000 4.000000 3.000000 2.000000 ... 6.000000 13.000000 13.000000 14.000000
max 22.000000 4.000000 4.000000 4.000000 ... 32.000000 19.000000 19.000000 19.000000
df =student_data_math.merge(student_data_por,left_on=['school','sex','age','address','famsize','Pstatus','Medu','Fedu','Mjob','Fjob','reason','nursery','internet'], right_on=['school','sex','age','address','famsize','Pstatus','Medu','Fedu','Mjob','Fjob','reason','nursery','internet'], suffixes=('_math', '_por'))
print(df.head())
school sex age address famsize Pstatus ... Walc_por health_por absences_por G1_por G2_por G3_por
0 GP F 18 U GT3 A ... 1 3 4 0 11 11
1 GP F 17 U GT3 T ... 1 3 2 9 11 11
2 GP F 15 U LE3 T ... 3 3 6 12 13 12
3 GP F 15 U GT3 T ... 1 5 0 14 14 14
4 GP F 16 U GT3 T ... 2 5 0 11 13 13
[5 rows x 53 columns]
gm = sns.pairplot(df[['G1_math','G3_math','G1_por','G3_por']])
gm.savefig('seaborn_pairplot_gm.png')
Die Korrelation zwischen Mathematik und Por scheint hoch zu sein Die Dispersion scheint in por kleiner zu sein als in Mathe Es wird auch durch die folgenden Ergebnisse unterstützt.
print(np.corrcoef(df['G1_math'],df['G3_math']))
[[1. 0.8051287]
[0.8051287 1. ]]
print(np.corrcoef(df['G3_math'],df['G3_por']))
[[1. 0.48034936]
[0.48034936 1. ]]
print(np.cov(df['G1_math'],df['G3_math']))
[[11.2169202 12.63919693]
[12.63919693 21.9702354 ]]
print(np.cov(df['G3_math'],df['G3_por']))
[[21.9702354 6.63169394]
[ 6.63169394 8.67560567]]
"Neben der deskriptiven Statistik lernen wir die Grundlagen der Regressionsanalyse." "Die Regressionsanalyse ist eine Analyse, die Zahlen vorhersagt. Ich habe die Schülerdaten oben grafisch dargestellt. Aus diesem Streudiagramm kann ich ersehen, dass G1 und G3 wahrscheinlich miteinander zusammenhängen."
fig, (ax1) = plt.subplots(1, 1, figsize=(8,6))
ax1.plot(student_data_math['G1'],student_data_math['G3'],'o')
ax1.set_xlabel('G1_Grade')
ax1.set_ylabel('G3_Grade')
ax1.grid(True)
plt.show()
"Im Regressionsproblem nehmen wir einen relationalen Ausdruck aus den angegebenen Daten an und finden den Koeffizienten, der am besten zu den Daten passt. Insbesondere prognostizieren wir die G3-Leistung basierend auf der G1-Leistung, die wir im Voraus kennen. Das heißt, es gibt eine Zielvariable G3 (als Zielvariable bezeichnet) und eine Variable G1 (als erklärende Variable bezeichnet), die erklärt, dass sie zur Vorhersage verwendet wird. Bei der Regressionsanalyse werden eine erklärende Variable und eine erklärende Variable verwendet. Ersteres wird als einfache Regression und letzteres als multiple Regressionsanalyse bezeichnet. In diesem Kapitel werden wir die einfache Regressionsanalyse erläutern. "
"Hier werden wir erklären, wie das Regressionsproblem mit einer Methode namens lineare einfache Regression gelöst werden kann, bei der davon ausgegangen wird, dass Ausgabe und Eingabe in der einfachen Regressionsanalyse eine lineare Beziehung haben."
import pandas as pd
from sklearn import linear_model
reg = linear_model.LinearRegression()
student_data_math = pd.read_csv('./chap3/student-mat.csv', sep =';')
x = student_data_math.loc[:,['G1']].values
y = student_data_math['G3'].values
reg.fit(x,y)
print('Regressionskoeffizienten;',reg.coef_)
print('Sektion;',reg.intercept_)
Regressionskoeffizienten;[1.10625609]
Sektion;-1.6528038288004616
fig, (ax1) = plt.subplots(1, 1, figsize=(8,6))
ax1.plot(student_data_math['G1'],student_data_math['G3'],'o')
ax1.plot(x,reg.predict(x))
ax1.set_xlabel('G1_Grade')
ax1.set_ylabel('G3_Grade')
ax1.grid(True)
plt.show()
R^2 = 1- \frac{\Sigma_{i=1}^{n}(y_i-f(x_i))^2}{\Sigma_{i=1}^{n}(y_i-\bar y)^2}
Die obige Gleichung wird als Bestimmungskoeffizient bezeichnet, und $ R ^ 2 = 1 $ ist der Maximalwert. Je näher er an 1 liegt, desto besser ist das Modell.
print('Koeffizient bestimmen;',reg.score(x,y))
Entscheidungskoeffizient; 0.64235084605227
df0 = student_data_math[student_data_math['sex'].isin(['M'])]
df = df0.sort_values(by=['G1'])
df['Ct']=np.arange(1,len(df)+1)
x = df['Ct']
print(x)
y = df['G1'].cumsum()
print(y)
fig, (ax1) = plt.subplots(1, 1, figsize=(8,6))
ax1.plot(x/max(x),y/max(y))
ax1.set_xlabel('peoples')
ax1.set_ylabel('G1_Grade.cumsum')
ax1.grid(True)
plt.show()
248 1
144 2
164 3
161 4
153 5
...
113 183
129 184
245 185
42 186
47 187
Name: Ct, Length: 187, dtype: int32
248 3
144 8
164 13
161 18
153 23
...
113 2026
129 2044
245 2062
42 2081
47 2100
Name: G1, Length: 187, dtype: int64
M F Referenz M;G1 vs peaples F;G1 vs peaples
Recommended Posts