[PYTHON] [Introduction aux Data Scientists] Statistiques descriptives et analyse de régression simple ♬

Hier soir, j'ai résumé [Introduction to Data Scientists] Bases du calcul scientifique, du traitement des données et comment utiliser la bibliothèque de dessins graphiques. A partir de ce soir, je vais enfin les utiliser pour entrer dans le sujet principal. Ce soir, je vais résumer les statistiques descriptives et une simple analyse de régression. Je compléterai les explications de ce livre. 【Mise en garde】 ["Cours de formation de scientifique des données à l'Université de Tokyo"](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% Je vais lire E5% B0% 8A / dp / 4839965250 / ref = tmm_pap_swatch_0? _ Encoding = UTF8 & qid = & sr =) et résumer les parties que j'ai des doutes ou que je trouve utiles. Par conséquent, je pense que le synopsis sera simple, mais veuillez le lire en pensant que le contenu n'a rien à voir avec ce livre.

Chapitre 3 Statistiques descriptives et analyse de régression simple

Chapitre 3-1 Types d'analyse statistique

3-1-1 Statistiques descriptives et inférences

Les méthodes d'analyse statistique sont divisées en statistiques descriptives et statistiques d'inférence.

3-1-1-1 Statistiques descriptives

"Une méthode pour saisir les caractéristiques des données collectées, les organiser de manière facile à comprendre et les rendre faciles à voir. Calculer les caractéristiques des données en calculant la moyenne, l'écart type, etc., classer les données et les exprimer à l'aide de chiffres et de graphiques. Ce sont des statistiques descriptives. "

3-1-1-2 Statistiques d'inférence

"L'idée des statistiques d'inférence est d'effectuer une analyse précise à l'aide d'un modèle basé sur une distribution de probabilité à partir de données partielles seulement, et d'en déduire le tout pour obtenir des statistiques." "Il est également utilisé pour prédire l'avenir à partir de données passées. Ce chapitre décrit une analyse de régression simple, qui est la base des statistiques d'inférence. Les statistiques d'inférence plus complexes seront traitées dans les quatre prochains chapitres."

3-1-2 Importation de bibliothèques
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

Installez sklearn ci-dessous.


$ sudo pip3 install scikit-learn

Comme indiqué ci-dessous, il semble qu'il puisse également être utilisé avec Rasipi4.

 $ 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 
>>> 

Pour le moment, python3-sklearn-doc n'a pas été trouvé, mais il semble qu'il puisse être installé sous Debian / Ubuntu.

$ sudo apt-get install python3-sklearn python3-sklearn-lib

Chapitre 3-2 Lecture et interaction avec les données

...réduction 3-2-1-5 Obtenez les données student.zip sur le site suivant avec le programme suivant. 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()

Les quatre fichiers suivants ont été développés. student.txt student-mat.csv student-merge.R student-pcr.csv

3-2-2 Lecture et confirmation des données

Connectez-vous à l'importation ci-dessus et exécutez ce qui suit

student_data_math = pd.read_csv('./chap3/student-mat.csv')
print(student_data_math.head())

Données; vous pouvez vérifier le délimiteur.

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... 

Remplacez la lecture par et rechargez.

student_data_math = pd.read_csv('./chap3/student-mat.csv', sep =';')
print(student_data_math.head())

C'était magnifique.

  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]
3-2-3 Vérifier la nature des données

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

En regardant le contenu de cat student.txt, il semble que ces données aient le contenu suivant.

$ 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.
3-2-4 Données quantitatives et qualitatives

· Des données quantitatives Ce sont des données exprimées par des valeurs continues auxquelles les quatre règles peuvent être appliquées, et le rapport est significatif. Exemple: nombre de personnes, montant d'argent, etc. ・ Données de qualité Ce sont des données discontinues auxquelles les quatre règles ne peuvent pas être appliquées et qui sont utilisées pour exprimer l'état. Exemple: classement, catégorie, etc.

Le genre est une donnée qualitative

print(student_data_math['sex'].head())
0    F
1    F
2    F
3    F
4    F
Name: sex, dtype: object

Le nombre d'absents est une donnée quantitative

print(student_data_math['absences'].head())
0     6
1     4
2    10
3     2
4     4
Name: absences, dtype: int64
3-2-4-2 Calculer la valeur moyenne pour chaque axe
print(student_data_math.groupby('sex')['age'].mean())
sex
F    16.730769
M    16.657754
Name: age, dtype: float64

Les femmes étudient.

print(student_data_math.groupby('sex')['studytime'].mean())
sex
F    2.278846
M    1.764706
Name: studytime, dtype: float64

Statistiques descriptives

3-3-1 histogramme
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()

Figure_13absences.png

3-3-2 Moyenne, médiane, la plus fréquente
print('Valeur moyenne{}'.format(student_data_math['absences'].mean()))
print('Médian{}'.format(student_data_math['absences'].median()))
print('Valeur la plus fréquente{}'.format(student_data_math['absences'].mode()))

Valeur moyenne 5.708860759493671
Valeur médiane 4.0
Valeur la plus fréquente 0 0
dtype: int64

Agrandissez la figure ci-dessus pour la vérifier dans la figure.

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()

Figure_13absences30m-.png

3-3-3 Dispersion et écart type

Formule de définition Distribution $ σ ^ 2 $

σ^2 = \frac{1}{n}\Sigma_{i=1}^{n}(x_i-\bar{x})^2

Écart type $ σ $ std(standered deviation)

σ = \sqrt{\frac{1}{n}\Sigma_{i=1}^{n}(x_i-\bar{x})^2}
print('Distribué{}'.format(student_data_math['absences'].var(ddof=0)))
print('écart-type{}'.format(student_data_math['absences'].std(ddof = 0)))
print('écart-type{}'.format(np.sqrt(student_data_math['absences'].var())))
Dispersion 63.887389841371565
Écart type 7.99295876640006
Écart type 8.00309568710818

Tracez la moyenne ± écart type.

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()

Figure_13absences30m-std.png

3-3-4 Statistiques récapitulatives et valeurs des centiles

La valeur du centile est le classement lorsque le nombre total est de 100 25e centile, 25e centile, 1er quadrant Le 75e est le 75e centile, le troisième quadrant 50e centile, médiane

print('Statistiques récapitulatives', student_data_math['absences'].describe())
Statistiques récapitulatives comptent 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
Trouvez la plage de quadrants

25e centile; décrire (4) 75e centile: décrire (6) Différence; décrire (6) -décrire (4) print ('75 -25 percentile ', Student_data_math [' absences '] .describe () [6] -student_data_math [' absences '] .describe () [4]) 75-25% Siècle 8.0

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'].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()

Figure_13absences30mpp.png

3-3-4-2 describe () pour toutes les lignes
print('Statistiques récapitulatives de la colonne complète', student_data_math.describe())
Statistiques récapitulatives de la colonne complète
              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]

3-3-5 Moustaches de boîte

Box whiskers est (valeur minimale, 1er 1 point de quadrant, valeur médiane, 3e point de quadrant, valeur maximale) est exprimé par une case et une moustache comme suit.

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()

Figure_14-G1pp.png

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()

Figure_14-G1pp4.png

3-3-6 Coefficient de fluctuation

Le coefficient de fluctuation CV est l'écart type σ / valeur moyenne $ \ bar {x} $ Le coefficient de fluctuation ne dépend pas de l'échelle et le degré de dispersion peut être vu.

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

3-3-7 Diagramme de dispersion et coefficient de corrélation

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()

Ceux qui avaient un grade G1 élevé ont également un grade G3 élevé. Cependant, certaines personnes ont une note de 0 G3. C'est une valeur aberrante, mais il y a plusieurs raisons à cela, et il y a un débat sur l'opportunité de l'exclure. Figure_15-G1G3.png Alors, qu'en est-il du nombre de jours suivis par des personnes de G3-Grade 0, dessinez le diagramme de corrélation suivant.

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()

Le résultat est que les personnes avec une note G3 de 0 sont absentes de 0. Quelque chose ne va pas. En fait, je peux imaginer que je me suis arrêté à mi-chemin et que je n'ai pas compté. Figure_15-G3absences.png De plus, la corrélation entre G1-Grade et le nombre d'absents est la suivante. Figure_15-G1absences.png En premier lieu, au moment du G2-Grade, certaines personnes sont de 0 Grade. Figure_15-G1G2.png Et, en regardant la corrélation entre G2-Grade et G3-Grade, on peut voir que certaines personnes sont tombées à 0 Grade, et que le nombre de ces personnes augmente progressivement. Et il semble que les défunts soient parmi ceux qui ont de faibles scores. Par conséquent, il est plus important d'analyser diverses données que de se précipiter vers la conclusion avec un seul graphique. Figure_15-G2G3.png

3-3-7-1 Co-dispersion

La formule de définition est la suivante

S_{xy}=\frac{1}{n}\Sigma_{i=1}^{n}(x_i-\bar{x})(y_i-\bar{y})

Autrement dit, le terme diagonal est la variance définie ci-dessus. Alors, que signifie le terme hors diagonale? Selon la référence, si $ x $ et $ y $ ont une relation intrinsèquement linéaire, l'équation de la ligne droite dérivée par la méthode des moindres carrés est la suivante. 【référence】 Analyse de régression linéaire / méthode du carré minimum signifie covariance / coefficient de corrélation

y=\frac{S_{xy}}{\sigma^2_{x}}x + \bar y−\frac{S_{xy}}{\sigma^2_x}\bar x \\
Une fois transformé,\\
\frac{y-\bar y}{\sigma_y}=\frac{S_{xy}}{\sigma_x\sigma_y}\frac{x-\bar x}{\sigma_x}

Autrement dit, la pente de l'équation linéaire normalisée par l'écart type et la valeur moyenne est la suivante.

r_{xy}=\frac{S_{xy}}{\sigma_x\sigma_y}

En d'autres termes, il s'agit d'une valeur obtenue en standardisant la covariance avec l'écart type, et c'est la formule de définition du soi-disant coefficient de corrélation $ r_ {xy} $.

3-3-7-2 Coefficient de corrélation

Ici, la covariance et le coefficient de corrélation sont calculés. La covariance est la variance des termes hors diagonale et les termes diagonaux sont G1 et G3.

print(np.cov(student_data_math['G1'],student_data_math['G3']))
[[11.01705327 12.18768232]
 [12.18768232 20.9896164 ]]

Le front est le coefficient de corrélation et le deuxième terme est la valeur p.

print(sp.stats.pearsonr(student_data_math['G1'],student_data_math['G3']))
(0.801467932017414, 9.001430312277865e-90)

La matrice de corrélation est calculée comme suit.

print(np.corrcoef(student_data_math['G1'],student_data_math['G3']))
[[1.         0.80146793]
 [0.80146793 1.        ]]

3-3-8 Dessinez un histogramme ou un diagramme de dispersion de toutes les variables

Dalc; consommation d'alcool en semaine Walc; Consommation d'alcool le week-end Dessinez un diagramme de dispersion pour voir s'il existe une corrélation entre les scores G1 et G3. Résultat; semble peu probable

g = sns.pairplot(student_data_math[['Dalc','Walc','G1','G3']])
g.savefig('seaborn_pairplot_g.png')

seaborn_pairplot_g.png

【référence】 Créer un diagramme de tracé de paires (matrice de diagramme de dispersion) avec Python, pandas, seaborn Aucune corrélation entre les scores de Walc et G3

print(np.corrcoef(student_data_math['Walc'],student_data_math['G3']))
[[ 1.         -0.05193932]
 [-0.05193932  1.        ]]

Aucune variation pour chaque groupe

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

Exercice 3-1

              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

Exercice 3-2

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]

Exercice 3-3

gm = sns.pairplot(df[['G1_math','G3_math','G1_por','G3_por']])
gm.savefig('seaborn_pairplot_gm.png')

La corrélation entre mathématiques et por semble élevée La dispersion semble plus faible en por qu'en math seaborn_pairplot_gm.png Il est également soutenu par les résultats suivants.

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]]

Chapitre 3-4 Analyse de régression simple

"En plus des statistiques descriptives, apprenons les bases de l'analyse de régression." "L'analyse de régression est une analyse qui prédit des nombres ... J'ai représenté graphiquement les données des élèves ci-dessus. À partir de ce diagramme de dispersion, je peux voir que G1 et G3 sont probablement liés."

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()

Figure_16-G1G3.png «Dans le problème de régression, nous supposons une expression relationnelle à partir des données données et trouvons le coefficient qui correspond le mieux aux données. Plus précisément, nous prédisons les performances du G3 sur la base des performances G1 précédemment connues. Autrement dit, il existe une variable cible G3 (appelée variable objective) et une variable G1 (appelée variable explicative) qui l'explique est utilisée pour la prédiction. Dans l'analyse de régression, une variable explicative et une variable explicative sont utilisées. La première est appelée régression simple et la seconde est appelée analyse de régression multiple. Dans ce chapitre, nous expliquerons l'analyse de régression simple. "

3-4-1 Analyse de régression simple linéaire

"Ici, nous allons expliquer comment résoudre le problème de régression par une méthode appelée régression simple linéaire, qui suppose que la sortie et l'entrée ont une relation linéaire dans l'analyse de régression simple."

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('Coefficient de régression;',reg.coef_)
print('Section;',reg.intercept_)
Coefficient de régression;[1.10625609]
Section;-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()

Figure_16-G1G3predict.png

3-4-2 Facteur de décision

R^2 = 1- \frac{\Sigma_{i=1}^{n}(y_i-f(x_i))^2}{\Sigma_{i=1}^{n}(y_i-\bar y)^2}

L'équation ci-dessus s'appelle le coefficient de détermination, et $ R ^ 2 = 1 $ est la valeur maximale, et plus elle est proche de 1, meilleur est le modèle.

print('Déterminer le coefficient;',reg.score(x,y))
Coefficient de décision; 0.64235084605227

Problème global 3-2-1 Courbe de Lorenz

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 Figure_17-G1cumsumvspplesM.png F Figure_17-G1cumsumvspples.png référence M;G1 vs peaples Figure_17-G1vspeoplesM.png F;G1 vs peaples Figure_17-G1vspeoples.png

Recommended Posts

[Introduction aux Data Scientists] Statistiques descriptives et analyse de régression simple ♬
Analyse des données: application facile des statistiques descriptives et des statistiques d'estimation aux données CSV en Python
[Introduction aux data scientists] Bases de la probabilité et des statistiques ♬ Variable de probabilité / probabilité et distribution de probabilité
[Introduction to Data Scientists] Bases de Python ♬ Fonctions et classes
[Introduction to Data Scientists] Bases de Python ♬ Branchements conditionnels et boucles
[Introduction aux Data Scientists] Bases de Python ♬ Fonctions et fonctions anonymes, etc.
[Introduction au Data Scientist] Bases de Python ♬
Introduction à la modélisation statistique pour l'analyse des données Test de rapport de ressemblance GLM et asymétrie de test
Introduction à la modélisation statistique pour l'analyse des données
[Introduction à minimiser] Analyse des données avec le modèle SEIR ♬
Note de lecture: Introduction à l'analyse de données avec Python
J'ai décidé de faire une analyse de régression simple manuellement-1-
[Livre technique] Introduction à l'analyse de données avec Python -1 Chapitre Introduction-
20200329_Introduction à l'analyse de données avec Python 2nd Edition Personal Summary
Notes de lecture (en Python et Stan) pour une introduction à la modélisation statistique pour l'analyse de données (Midorimoto)
Analyse de régression simple avec Python
[Introduction à Python] Combinaison des données Nikkei Average et NY Dow CSV
Introduction à la modélisation statistique pour l'analyse des données Sélection du modèle GLM
[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
[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 à l'analyse de données par modélisation statistique bayésienne à partir de R et Stan" implémenté en Python
Résolution de l'introduction d'AOJ aux algorithmes et aux structures de données en Python -Partie1-
Introduction à l'analyse de données avec Python P32-P43 [ch02 3.US Baby Names 1880-2010]
Introduction à l'analyse de données par Python P17-P26 [ch02 1.usa.gov données de bit.ly]
Résolution de l'introduction d'AOJ aux algorithmes et aux structures de données en Python -Partie2-
Résolution de l'introduction d'AOJ aux algorithmes et aux structures de données en Python -Partie4-
Introduction à la modélisation statistique pour le modèle linéaire généralisé d'analyse de données (GLM)
Résolution de l'introduction d'AOJ aux algorithmes et aux structures de données en Python -Partie3-
Première analyse de régression simple en Python
[Introduction à Python3 Jour 1] Programmation et Python
Algorithme d'apprentissage automatique (analyse de régression unique)
Statistiques prédictives (pratique de la régression simple) Python
Analyse de données pour améliorer POG 3 ~ Analyse de régression ~
Implémentation simple de l'analyse de régression avec Keras
Introduction à l'analyse d'image opencv python
Résumé des distributions de probabilité qui apparaissent souvent dans les statistiques et l'analyse des données
J'ai essayé l'analyse de données IRMf avec python (Introduction au décodage des informations cérébrales)
[Introduction to Data Scientist] Bases du calcul scientifique, du traitement des données et comment utiliser la bibliothèque de dessins graphiques ♬ Construction d'environnement
Visualisation et analyse des informations de localisation des données Twitter Stava
[Introduction à Python3, jour 17] Chapitre 8 Destinations de données (8.1-8.2.5)
[Introduction à Python3, jour 17] Chapitre 8 Destinations de données (8.3-8.3.6.1)
Apprentissage automatique avec python (2) Analyse de régression simple
Introduction au Deep Learning ~ Pliage et mise en commun ~
[Introduction à Python3 Jour 19] Chapitre 8 Destinations de données (8.4-8.5)
[Introduction à Python3 Day 18] Chapitre 8 Destinations de données (8.3.6.2 à 8.3.6.3)
Vider les données SQLite3 et migrer vers MySQL
Seulement 8 techniques pour prétendre être un data scientist
Comprendre les types de données et le début de la régression linéaire
Compressez les données python et écrivez sur sqlite
[Introduction à AWS] Conversion de texte-voix et lecture ♪
Analyse des séries chronologiques n ° 6 Faux retour et partie républicaine
[Python] De l'analyse morphologique des données CSV à la sortie CSV et à l'affichage graphique [GiNZA]
[Introduction à cx_Oracle] (Partie 9) Mappage des types de données DB et Python (version 8 ou ultérieure)
Introduction aux statistiques de quiz (1) -Analyse mathématique des phrases de questions pour connaître la tendance des questions-
Introduction à la modélisation statistique pour l'analyse des données Élargissement de la gamme d'applications de GLM
Introduction à l'analyse des séries temporelles ~ Modèle d'ajustement saisonnier ~ Implémenté en R et Python
Une introduction à l'analyse de données à l'aide de Python - Pour augmenter le nombre de vues vidéo -
La première étape de l'analyse du journal (comment formater et mettre les données du journal dans Pandas)