linear regression

2025-09-07 12:31:47 +02:00
parent 60c427d3ae
commit 48b147ea97
6 changed files with 68 additions and 63 deletions

@@ -0,0 +1,25 @@
# Agrégation - Régression linéaire
> La régression linéaire est un modèle qui cherche à établir une relation linéaire entre une variable, dite expliquée, et une ou plusieurs variables, dites explicatives.
La régression linéaire simple cherche une droite : y = a⋅x + b
- a est la pente de la droite (slope),
- b est lordonnée à lorigine (intercept).
![Régression linéaire](regression.svg)
`REGR_SLOPE(y, x)` Calcule la pente de la droite (a),
`REGR_INTERCEPT(y, x)` Calcule lordonnée à lorigine (b).
`REGR_R2(y, x)` Coefficient de détermination (entre 0 et 1).
Mesure la qualité de lajustement :
- 1 : la droite explique parfaitement les données,
- 0 : aucun lien linéaire,
plus cest proche de 1, plus la droite est pertinente.
`REGR_COUNT(y, x)` Nombre de paires (x, y) effectivement utilisées (hors NULL) pour effectuer le calcul. Équivalent à COUNT(*) mais appliqué seulement sur les deux colonnes non nulles.

@@ -14,6 +14,7 @@
<line x1="30" y1="330" x2="30" y2="13" stroke="#000" marker-end="url(#arrow)" /> <line x1="30" y1="330" x2="30" y2="13" stroke="#000" marker-end="url(#arrow)" />
<line x1="10" y1="312.5" x2="330" y2="312" stroke="#000" marker-end="url(#arrow)" /> <line x1="10" y1="312.5" x2="330" y2="312" stroke="#000" marker-end="url(#arrow)" />
<path stroke="#000" d="M55 317.5v-10M80 317.5v-10M105 317.5v-10M130 317.5v-10M155 317.5v-10M180 317.5v-10M205 317.5v-10M230 317.5v-10M255 317.5v-10M280 317.5v-10M305 317.5v-10M25 287.5h10M25 262.5h10M25 237.5h10M25 212.5h10M25 187.5h10M25 162.5h10M25 137.5h10M25 112.5h10M25 87.5h10M25 62.5h10M25 37.5h10"/> <path stroke="#000" d="M55 317.5v-10M80 317.5v-10M105 317.5v-10M130 317.5v-10M155 317.5v-10M180 317.5v-10M205 317.5v-10M230 317.5v-10M255 317.5v-10M280 317.5v-10M305 317.5v-10M25 287.5h10M25 262.5h10M25 237.5h10M25 212.5h10M25 187.5h10M25 162.5h10M25 137.5h10M25 112.5h10M25 87.5h10M25 62.5h10M25 37.5h10"/>
<text x="10" y="30">b</text>
<g fill="#008"> <g fill="#008">
<ellipse rx="4" ry="4" cx="205" cy="186.5" /> <ellipse rx="4" ry="4" cx="205" cy="186.5" />
<ellipse rx="4" ry="4" cx="155" cy="213.75" /> <ellipse rx="4" ry="4" cx="155" cy="213.75" />

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

@@ -1,6 +1,7 @@
# fonctions avancées du langage SQL # fonctions avancées du langage SQL
- [Fonctions d'agrégation](aggregation.md) - [Fonctions d'agrégation](aggregation.md)
- [Régression linéaire](Aggregation/linear_regression.md)
- [Jointure](Jointure.md) - [Jointure](Jointure.md)
- [Sous requêtes](sousrequete.md) - [Sous requêtes](sousrequete.md)
- [Vues et fonctions](View.md) - [Vues et fonctions](View.md)
@@ -11,6 +12,10 @@
## Exercices ## Exercices
### Jointures
- Lister les articles dont la famille n'existe pas.
Arrondir les montant à deux chiffres après la virgule. Arrondir les montant à deux chiffres après la virgule.
- 1a : Pour chaque adhérent unique, afficher son nom et son nombre de ticket. - 1a : Pour chaque adhérent unique, afficher son nom et son nombre de ticket.

@@ -287,36 +287,6 @@ Retourne la valeur la plus fréquente.
Ces fonctions sont en réalité des [fenêtres analytiques](window.md) mais peuvent être utilisées pour explorer la distribution. Ces fonctions sont en réalité des [fenêtres analytiques](window.md) mais peuvent être utilisées pour explorer la distribution.
## Régressions linéaires simples
Ces fonctions permettent de réaliser des régressions linéaires simples directement en SQL, cest-à-dire dajuster une droite de tendance entre deux ensembles de données numériques (variables x et y).
On suppose quon a deux variables :
- x : la variable explicative (indépendante),
- y : la variable à expliquer (dépendante).
La régression linéaire simple cherche une droite : y = a⋅x + b
- a est la pente (slope).
- b est lordonnée à lorigine (intercept),
![Régression linéaire](regression.svg)
`REGR_SLOPE(y, x)` Calcule la pente de la droite (a),
`REGR_INTERCEPT(y, x)` Calcule lordonnée à lorigine (b).
`REGR_R2(y, x)` Coefficient de détermination (entre 0 et 1).
Mesure la qualité de lajustement :
- 1 : la droite explique parfaitement les données,
- 0 : aucun lien linéaire,
plus cest proche de 1, plus la droite est pertinente.
`REGR_COUNT(y, x)` Nombre de paires (x, y) effectivement utilisées (hors NULL) pour effectuer le calcul. Équivalent à COUNT(*) mais appliqué seulement sur les deux colonnes non nulles.
## Agrégats d'intervalles ## Agrégats d'intervalles

@@ -18,7 +18,29 @@ Parce quelle doit produire une table (un jeu de résultats) indépendante **a
- Dans le SELECT, une sous-requête peut être corrélée (elle utilise des colonnes de la requête principale) ou non. - Dans le SELECT, une sous-requête peut être corrélée (elle utilise des colonnes de la requête principale) ou non.
- Dans le WHERE, idem : elle peut être corrélée (EXISTS, IN dépendant de la ligne en cours) ou non (test fixe). - Dans le WHERE, idem : elle peut être corrélée (EXISTS, IN dépendant de la ligne en cours) ou non (test fixe).
**Exercice : ** Sélectionner les articles dont le prix est supérieur à la moyenne générale des prix des articles. ## Sous-requête scalaire
> une sous-requête scalaire est une sous-requête qui retourne **une seule valeur** (un scalaire, cest-à-dire une seule ligne et une seule colonne).
Elle peut être utilisée partout où une valeur simple est attendue, par exemple :
- dans la liste de sélection (SELECT),
- dans une clause WHERE,
- dans une clause HAVING,
- parfois même dans la clause ORDER BY.
```sql
SELECT *
FROM table
WHERE nom_colonne = (
SELECT valeur
FROM table2
LIMIT 1
)
```
**Exercice :** Sélectionner les articles dont le prix est supérieur à la moyenne générale des prix des articles.
Dans un langage procédural on utiliserait deux étapes pour obtenir le résultat. Première étape calculer la moyenne des prix Dans un langage procédural on utiliserait deux étapes pour obtenir le résultat. Première étape calculer la moyenne des prix
@@ -44,6 +66,14 @@ select * from article
Cette fois ci il faut calculer les moyennes des prix pour chacune des familles et comparer les articles avec la moyenne correspondante. Ce n'est plus possible en programmation procédurale. Cette fois ci il faut calculer les moyennes des prix pour chacune des familles et comparer les articles avec la moyenne correspondante. Ce n'est plus possible en programmation procédurale.
```sql
select avg(prix) from article where famille_code = '02CHOU';
select * from article where prix > 3.68 and famille_code = '02CHOU';
select avg(prix) from article where famille_code = '02NARU';
select * from article where prix > 2.47 and famille_code = '02NARU';
```
La sous requête permet de calculer pour chaque ligne d'article la moyenne correspondante à la famille du dit article. La sous requête permet de calculer pour chaque ligne d'article la moyenne correspondante à la famille du dit article.
```sql ```sql
@@ -56,33 +86,6 @@ select code, article, prix from article a1
Remarquez l'utilisation de l'alias `a1` sur la table de la requête principale pour pouvoir être injecter sans confusion dans la sous requête car celle-ci utilise la même table. Remarquez l'utilisation de l'alias `a1` sur la table de la requête principale pour pouvoir être injecter sans confusion dans la sous requête car celle-ci utilise la même table.
## Sous-requête scalaire
> une sous-requête scalaire est une sous-requête qui retourne **une seule valeur** (un scalaire, cest-à-dire une seule ligne et une seule colonne).
Elle peut être utilisée partout où une valeur simple est attendue, par exemple :
- dans la liste de sélection (SELECT),
- dans une clause WHERE,
- dans une clause HAVING,
- parfois même dans la clause ORDER BY.
```sql
SELECT *
FROM table
WHERE nom_colonne = (
SELECT valeur
FROM table2
LIMIT 1
)
```
Sélection des articles dont le prix est supérieur à la moyenne des prix de tous les articles
```sql
select * from article
where prix > (select avg(prix) from article);
```
## Conditions ## Conditions

@@ -226,13 +226,14 @@ from ca_mensuel
order by mois order by mois
``` ```
### Moyenne glissante sur 3 mois **Exercice :** Calculer la moyenne glissante sur 3 mois
```sql ```sql
select *, round(AVG(total) over ( select *,
round(AVG(total) over (
order by mois order by mois
rows between 2 preceding and current row rows between 2 preceding and current row
), 2) as moyenne_glissante_3 ), 2) as moyenne_glissante_3
from ca_mensuel from ca_mensuel
order by mois order by mois
``` ```