### Latex :
from sympy import symbols, latex
TP4 : Statistique descriptive avec Numpy et PANDAS.
1. Introduction.
- La statistique descriptive est une branche des statistiques qui consiste à résumer, présenter et décrire un ensemble de données de manière claire et concise.
- Elle permet de tirer des informations utiles à partir de données brutes (non organisées),
sans faire de généralisations ou d'inférences sur une population plus large. - On étudie un ensemble d'objets ou personnes sur lesquels on observe des caractères (propriétés ou critères) : variables aléatoires.
- Ces variables sont classées en Variables qualitatives
et Variables quantitatives. - Les variables quantitatives sont de deux types :
- Variable quantitative discrète :
- prend des valeurs $\textbf{isolées}$, souvent des nombres entiers.
- provient généralement d’un $\textbf{comptage}.$
- $\textbf{Exemple :}$
Le nombre de feuilles par branche sur 15 branches d’un arbre :
$$
3;\ 4;\ 2;\ 5;\ 4;\ 3;\ 3;\ 4;\ 5;\ 6;\ 4;\ 6;\ 5;\ 2;\ 3
$$
- Variable quantitative continue.
- peut prendre $\textbf{n’importe quelle valeur}$ dans un intervalle donné.
- provient généralement d’une $\textbf{mesure}$
- peut prendre des valeurs décimales précises, comme 12,4 cm ou 13,05 cm.
- $\textbf{Exemple :}$
La longueur des feuilles d’un arbre (en cm) :
$$
12{,}4,\ 13{,}1;\ 11{,}7;\ 12{,}9;\ 13{,}5,\ 12{,}6;,\ 11{,}9;\ 13{,}0,\ 12{,}8;\ 12{,}5
$$;
- Elle utilise principalement :
- Les paramètres de tendance centrale : moyenne, médiane, mode, etc.
- Les paramètres de dispersion étendue, écart-type, variance , etc.
- Les représentations graphiques diagrammes en barres, histogrammes, diagrammes circulaires, etc.
2. Paramètres de tendance centrale
On va utiliser les deux séries :- Nombre de feuilles par branche sur 15 branches d’un arbre (variable x discrète) : $x_1= 3;\ x_2=4;\ x_3=2;\ x_4=5;\ x_5=4;\ x_6=3;\ x_7=3;\ x_8=4;\ x_9=5;\ x_{10}=6;\ x_{11}=4;\ x_{12}=6;\ x_{13}=5;\ x_{14}=2;\ x_{15}=3$
- Mesures des longueurs (en cm) de 20 feuilles d'un arbre (variable x continue) : $x_1=12{,}4 ;\ x_2=13{,}1 ;\ x_3=11{,}7 ;\ x_4=12{,}9 ;\ x_5=13{,}5 ;\ x_6=12{,}6 ;\ x_7=11{,}9 ;\ x_8=13{,}0 ;\ x_9=12{,}8 ;\ x_{10}=12{,}5;$
$x_{11}=13{,}3 ;\ x_{12}=12{,}1 ;\ x_{13}=12{,}7 ;\ x_{14}=13{,}2 ;\ x_{15}=12{,}4 ;\ x_{16}=12{,}0 ;\ x_{17}=13{,}6 ;\ x_{18}=12{,}8 ;\ x_{19}=13{,}0 ;\ x_{20}=12{,}3$
La moyenne
- La $\textbf{moyenne}$ $\bar{x}$ est la somme des valeurs divisée par le nombre d'observations :
- $\textbf{Moyenne du nombre de feuilles par branche} :$
$\bar{x} = \frac{3 +4 + 2 + 5 + 4 + 3 + 3 +4 + 5 + 6+ 4+ 6 + 5 + 2 +3}{15} = \frac{59}{15} = 3,93 $
- $\textbf{Moyenne la longueur de feuilles} :$
$\bar{x} = \frac{12{,}4 +13{,}1 + 11{,}7 ;\ 12{,}9 + 13{,}5 + 12{,}6 + 11{,}9 + 13{,}0 +12{,}8 + 12{,}5 + 13{,}3 + 12{,}1+ 12{,}7 + 13{,}2 + 12{,}4 +12{,}0+ 13{,}6 + 12{,}8 + 13{,}0 + 12{,}3}{20} = \frac{254{,}7}{20} = 12{,}735 \, \text{cm} $
import numpy as np
import pandas as pd
# Avec NumPy : vecteur de nombres
valeurs = np.array([12.4 , 13.1 , 11.7 , 12.9 , 13.5 , 12.6 , 11.9 , 13.0 , 12.8 , 12.5 ,
13.3 , 12.1 , 12.7 , 13.2 , 12.4 , 12.0 , 13.6 , 12.8 , 13.0 , 12.3])
moyenne = np.mean(valeurs)
print(f"Moyenne de la série 2 : {moyenne}")
# Avec Pandas :
#### comme colonne d'une table e données
df2 = pd.DataFrame({'longfeuil': [12.4 , 13.1 , 11.7 , 12.9 , 13.5 , 12.6 , 11.9 , 13.0 , 12.8 , 12.5 ,
13.3 , 12.1 , 12.7 , 13.2 , 12.4 , 12.0 , 13.6 , 12.8 , 13.0 , 12.3]}) # Une colonne d'une table e données
print('Moyenne de la série 2 :', df2['longfeuil'].mean())
#### Comme série
s2 = pd.Series([12.4 , 13.1 , 11.7 , 12.9 , 13.5 , 12.6 , 11.9 , 13.0 , 12.8 , 12.5 ,
13.3 , 12.1 , 12.7 , 13.2 , 12.4 , 12.0 , 13.6 , 12.8 , 13.0 , 12.3], index=['x1', 'x2', 'x3', 'x4', 'x5', 'x6', 'x7', 'x8', 'x9', 'x10','x11', 'x12', 'x13', 'x14', 'x15', 'x16', 'x17', 'x18', 'x19', 'x20'])
print('Moyenne de la série 2 :', s2.mean())
#### à l'aide d'une liste
L2 = [12.4 , 13.1 , 11.7 , 12.9 , 13.5 , 12.6 , 11.9 , 13.0 , 12.8 , 12.5 , 13.3 , 12.1 , 12.7 , 13.2 , 12.4 , 12.0 , 13.6 , 12.8 , 13.0 , 12.3]
s2 = pd.Series(L, index=['x1', 'x2', 'x3', 'x4', 'x5', 'x6', 'x7', 'x8', 'x9', 'x10','x11', 'x12', 'x13', 'x14', 'x15', 'x16', 'x17', 'x18', 'x19', 'x20'])
print('Moyenne de la série 2 :', s.mean())
La médiane
La $\textbf{médiane}\; M$ est la valeur centrale dans un ensemble trié :$$M = x_{\frac{n+1}{2}} \quad \text{(si n impair)} \;\;\;\;\text{ et}\;\;\;\; M = \frac{x_{\frac{n}{2}} + x_{\frac{n}{2}+1}}{2} \;\;\;\;\text{(si n pair)}$$
##############Série 1 : n = 15 impair
# Avec NumPy
vals = np.array([3, 4, 2, 5, 4, 3, 3, 4, 5, 6, 4, 6, 5, 2, 3])
mediane1 = np.median(vals)
print(f"La médiane de la série 1 est : {mediane1}")
# Avec Pandas
df1 = pd.DataFrame({'nombrefeuil': [3, 4, 2, 5, 4, 3, 3, 4, 5, 6, 4, 6, 5, 2, 3]})
print('La médiane de la série 1 est :',df1['nombrefeuil'].median())
print('=====================================')
############## Série 2 : n = 20 pair
# NumPy
mediane2 = np.median(valeurs)
print(f"La médiane de la série 2 est : {mediane2}")
print(np.median(valeurs))
# Pandas
print('La médiane de la série 2 est :',df2['longfeuil'].median())
print('La médiane = ', s.median())
Le mode
Le $\textbf{mode}$ est la valeur la plus fréquente.# Pandas
df1 = pd.DataFrame({'nombrefeuil': [3, 4, 2, 5, 4, 3, 3, 4, 5, 6, 4, 6, 5, 2, 3]})
df2 = pd.DataFrame({'longfeuil': [12.4 , 13.1 , 11.7 , 12.9 , 13.5 , 12.6 , 11.9 , 13.0 , 12.8 , 12.5 ,
13.3 , 12.1 , 12.7 , 13.2 , 12.4 , 12.0 , 13.6 , 12.8 , 13.0 , 12.3]})
# Calcul du mode
modes1 = df1['nombrefeuil'].mode()
print("Mode(s) de la série 1:", modes1.tolist())
###########
modes2 = df2['longfeuil'].mode()
print("Mode(s) de la série 2:", modes2.tolist())
Calcul dans un fichier
#Fichier CSV
df3 = pd.read_csv('C:/Users/Akharraz/PyDataAnaysis/plantes1.csv')
df3
#########
######## MODE
# Calculer et afficher le mode d'une colonne
mode_nombrefeuil = df3['nombrefeuil'].mode().tolist()
print("Le(s) mode(s) de la colonne 'nombrefeuil' est :", mode_nombrefeuil)
########
mode_longfeuil = df3['longfeuil'].mode().tolist()
print("\nLe(s) mode(s) de la colonne 'longfeuil' est :", mode_longfeuil)
########
# Calculer et afficher le(s) mode(s) de toutes les colonnes
print("\nLe(s) mode(s) par colonnes :")
for col in df3.columns:
print(f"Mode de '{col}' :", df3[col].mode().tolist())
#########
######## Moyenne
# Calculer et afficher le mode d'une colonne
moy_nombrefeuil = df3['nombrefeuil'].mean()
print("La moyenne de la colonne 'nombrefeuil' est :", moy_nombrefeuil)
########
moy_longfeuil = df3['longfeuil'].mean()
print("\nLa moyenne de la colonne 'longfeuil' est :", moy_longfeuil)
########
# Calculer et afficher le(s) mode(s) de toutes les colonnes
print("\nLa moyenne par colonnes :")
for col in df3.columns:
if pd.api.types.is_numeric_dtype(df3[col]):
print(f"Moyenne de '{col}' :", df3[col].mean() )
#else:
#print(f"Impossible de calculer la moyenne de '{col}' : colonne non numérique")
3. Paramètres de despersion
3.1. Variance
- La $\textbf{variance}$ mesure la dispersion autour de la moyenne.$$\sigma^2 = \frac{1}{n} \sum_{i=1}^{n} (x_i - \bar{x})^2$$
- Ecart quadratique moyen.
- Notée aussi : Var(x)
# Exemple avec le DataFrame df3
df3 = pd.DataFrame({
'longfeuil': [12.4, 13.1, 11.7, 12.9, 13.5, 12.6, 11.9, 13.0, 12.8, 12.5,
13.3, 12.1, 12.7, 13.2, 12.4, 12.0, 13.6, 12.8, 13.0, 12.3]
})
# Calcul de la variance
variance = df3['longfeuil'].var()
print("Variance est :", variance)
#Exemple avec le fichier CSV
df = pd.read_csv('C:/Users/Akharraz/PyDataAnaysis/plantes1.csv')
variance = df['longfeuil'].var()
print("La variance des long de feuilles est :", variance)
# Calcul pour toutes les colonnes du fichier
print("La variance par colonnes :")
for col in df.columns:
if pd.api.types.is_numeric_dtype(df[col]):
print(f"Variance de '{col}' :", df[col].var() )
3.2. Ecart type
- L'$\textbf{écart-type}$ est la racine carrée de la variance : $$ \sigma = \sqrt{\sigma^2} $$- Ecart réel.
- Sert à mesurer la dispersion, ou l'étalement des valeurs mesurées autour de leur moyenne.
- Plus l'écart-type est faible, plus la population est homogène.
# Calcul Écart-type : std
df3 = pd.DataFrame({
'longfeuil': [12.4, 13.1, 11.7, 12.9, 13.5, 12.6, 11.9, 13.0, 12.8, 12.5,
13.3, 12.1, 12.7, 13.2, 12.4, 12.0, 13.6, 12.8, 13.0, 12.3]
})
Ecar = df3['longfeuil'].std()
print("L'écart des long de feuilles est :", Ecar)
4. Corrélation entre variables
- La corrélation est une mesure statistique qui indique l’existence d’une relation linéaire entre deux variables numériques.- Donnée par le coefficient de corréaltion : $$ r = \frac{\text{cov}(x,y)}{\sigma_x \sigma_y} $$ - Mesure la force et la direction de la relation linéaire entre les deux variables.
- Varie entre -1 et 1 :
1 : corrélation positive parfaite (quand l’une augmente, l’autre augmente aussi),
0 : pas de lien linéaire,
-1 : corrélation négative parfaite (quand l’une augmente, l’autre diminue).
# Deux séries
df3 = pd.DataFrame({
'longfeuil': [12.4, 13.1, 11.7, 12.9, 13.5, 12.6, 11.9, 13.0, 12.8, 12.5,
13.3, 12.1, 12.7, 13.2, 12.4, 12.0, 13.6, 12.8, 13.0, 12.3]
})
df4 = pd.DataFrame({
'surface': [50.2, 55.3,48.0, 57.5, 59.0,51.2,49.8,56.0,58.1,60.0,54.9,61.3, 57.7,47.5,50.5,49.0,62.0,58.2,56.5,50.0]
})
correlation = df3['longfeuil'].corr(df4['surface'])
print(f"Corrélation : {correlation:.2f}")
#Exemple avec le fichier CSV
df = pd.read_csv('C:/Users/Akharraz/PyDataAnaysis/plantes1.csv')
correlation1 = df['longfeuil'].corr(df['surface'])
print(f"Corrélation longueur-surface: {correlation1:.2f}")
correlation2 = df['longfeuil'].corr(df['poids'])
print(f"Corrélation longueur-poids: {correlation2:.2f}")
correlation3 = df['surface'].corr(df['poids'])
print(f"Corrélation surface-popids: {correlation3:.2f}")
# Matrice de corrélation
df = pd.read_csv('C:/Users/Akharraz/PyDataAnaysis/plantes1.csv')
# Ne garder que les colonnes numériques
df_num = df.select_dtypes(include='number')
matrice_corr = df_num.corr()
print("Matrice de corrélation :")
print(matrice_corr)
import seaborn as sns
import matplotlib.pyplot as plt
plt.figure(figsize=(8, 6))
sns.heatmap(matrice_corr, annot=True, cmap='coolwarm', fmt='.2f')
plt.title("Matrice de corrélation")
plt.show()
5. Régression linéaire simple
- La régression linéaire permet de modéliser la relation entre deux variables numériques.- Elle est utilisée pour prévoir une variable (Y) en fonction d’une autre variable (X).
- Equation d'une droite donnée par : $$ y = a \cdot x + b \quad \text{avec} \quad a = r \cdot \frac{\sigma_y}{\sigma_x}\quad \text{et}\quad b = \bar{y} - a \cdot \bar{x} $$ - $ r $ : coefficient de corrélation entre $ x $ et $ y $ - $ \sigma_x $ : écart-type de $ x $ - $ \sigma_y $ : écart-type de $ y $ - $ \bar{x} $ : moyenne de $ x $ - $ \bar{y} $ : moyenne de $ y $
import pandas as pd
import numpy as np
# Charger les données
df = pd.read_csv("C:/Users/Akharraz/PyDataAnaysis/plantes1.csv")
# Variables
x = df['surface']
y = df['poids']
# Calcul des éléments nécessaires
r = np.corrcoef(x, y)[0, 1] # Coefficient de corrélation
sx = x.std() # Écart-type de x
sy = y.std() # Écart-type de y
x_mean = x.mean() # Moyenne de x
y_mean = y.mean() # Moyenne de y
# Calcul de a (pente) et b (ordonnée à l'origine)
a = r * (sy / sx)
b = y_mean - a * x_mean
# Affichage des résultats
print(f"Coefficient de corrélation (r) : {r:.4f}")
print(f"Écart-type de x (surface) : {sx:.4f}")
print(f"Écart-type de y (poids) : {sy:.4f}")
print(f"Moyenne de x (surface) : {x_mean:.4f}")
print(f"Moyenne de y (poids) : {y_mean:.4f}")
print("\nÉquation de la droite de régression :")
print(f"y = {a:.4f}x + {b:.4f}")
#Création du graphique
import matplotlib.pyplot as plt
import seaborn as sns
plt.figure(figsize=(9, 6))
# Nuage de points
sns.scatterplot(x='surface', y='poids', data=df, color='blue', label='Données observées')
# Droite de régression
x_values = np.array([min(x), max(x)]) # Valeurs min et max de x pour tracer la droite
y_values = a * x_values + b # Calcul des y correspondants
plt.plot(x_values, y_values, color='red', linewidth=2, label=f'Droite de régression\n$y = {a:.2f}x + {b:.2f}$')
# Ajout des labels et titres
plt.title('Régression linéaire : poids en fonction de la surface')
plt.xlabel('Surface (cm²)')
plt.ylabel('Poids (g)')
plt.legend()
plt.grid(True)
# Afficher le graphique
plt.tight_layout()
plt.show()
Aucun commentaire:
Enregistrer un commentaire