Pourquoi Python pour les économistes ?
En tant qu'économiste familier avec Excel et les concepts statistiques, vous êtes prêt à améliorer vos capacités d'analyse de données. Python offre plusieurs avantages :
- Gratuit et open-source — pas de frais de licence
- Polyvalent — web scraping, automatisation, machine learning dans un seul langage
- Vaste écosystème — des milliers de packages pour chaque tâche
- Demande sur le marché — largement utilisé dans la tech, la finance et la data science
- Reproductibilité — les notebooks Jupyter combinent code, résultats et documentation
Bonne nouvelle : la bibliothèque pandas de Python tire son nom de « panel data analysis » (analyse de données de panel) — elle a été conçue avec les économistes en tête.
Plan d'apprentissage
| Jour | Sujet | Ce que vous apprendrez |
|---|---|---|
| 1 | Installation + Bases Python | Variables, boucles, conditions |
| 2 | pandas pour la manipulation de données | Chargement, nettoyage, transformation |
| 3 | Visualisation des données | Graphiques professionnels |
| 4 | Analyse statistique | Régression, tests d'hypothèses |
| 5 | Projet pratique | Workflow d'analyse complet |
Jour 1 Installation et bases de Python
Installation
Installez Anaconda (recommandé) — il inclut Python, les notebooks Jupyter et toutes les bibliothèques scientifiques : anaconda.com/download
Après l'installation, ouvrez Jupyter Notebook depuis Anaconda Navigator. C'est là que vous écrirez et exécuterez votre code de manière interactive.
Concepts clés : Excel vs Python
| Concept | Excel | Python |
|---|---|---|
| Stockage des données | Un classeur avec des feuilles | Plusieurs DataFrames |
| Colonnes | Lettres (A, B, C) | df['nom_colonne'] |
| Lignes | Numéros (1, 2, 3) | Index |
| Formules | =SOMME(A1:A10) |
df['colonne'].sum() |
| Scripts | Macros VBA | Fichiers .py ou notebooks |
Syntaxe de base Python
# Ceci est un commentaire
# Variables (stockage de valeurs)
x = 5
nom = "économie"
ma_liste = [1, 2, 3, 4, 5]
# Afficher une sortie
print(x)
print(f"Le sujet est {nom}")
# Opérations de base
y = x + 10 # y égale 15
z = x ** 2 # z égale 25 (exponentiation)
# Instructions conditionnelles
if x > 3:
print("x est supérieur à 3")
else:
print("x est inférieur ou égal à 3")
# Boucles (répétition d'opérations)
for i in range(5):
print(i)
⚠️ Important : L'indentation compte !
Contrairement aux formules Excel, Python utilise l'indentation pour définir les blocs de code. Tout ce qui est à l'intérieur d'une instruction if ou d'une boucle doit être indenté.
# CORRECT
if x > 3:
print("oui")
print("toujours dans le if")
print("en dehors du if")
# FAUX - provoquera une erreur
if x > 3:
print("oui") # IndentationError!
Jour 2 pandas pour la manipulation des données
pandas est la puissante bibliothèque de manipulation de données de Python. Importez-la au début de chaque script :
import pandas as pd
import numpy as np
Chargement des données
# Charger un fichier CSV
df = pd.read_csv("mes_donnees.csv")
# Charger un fichier Excel
df = pd.read_excel("mes_donnees.xlsx")
# Charger depuis une URL
df = pd.read_csv("https://exemple.com/donnees.csv")
Visualiser les données
| Tâche | Code Python |
|---|---|
| Voir les premières lignes | df.head() |
| Voir les dernières lignes | df.tail() |
| Info sur les types | df.info() |
| Statistiques descriptives | df.describe() |
| Nombre de lignes/colonnes | df.shape |
| Noms des colonnes | df.columns |
Sélection et filtrage
# Sélectionner une seule colonne
df['pib']
# Sélectionner plusieurs colonnes
df[['pib', 'population', 'annee']]
# Filtrer les lignes où pib > 1000
df[df['pib'] > 1000]
# Conditions multiples (utilisez & pour ET, | pour OU)
df[(df['pib'] > 1000) & (df['annee'] >= 2000)]
# Filtrer avec une liste de valeurs
df[df['pays'].isin(['France', 'Allemagne', 'Espagne'])]
# Supprimer les valeurs manquantes
df = df.dropna()
Création et modification de variables
# Créer une nouvelle variable
df['pib_par_habitant'] = df['pib'] / df['population']
# Transformation logarithmique
df['log_pib'] = np.log(df['pib'])
# Variable conditionnelle (comme SI dans Excel)
df['categorie'] = np.where(df['pib'] > 1000, 'élevé', 'faible')
# Conditions multiples
conditions = [
df['pib'] < 500,
df['pib'] < 1000,
df['pib'] >= 1000
]
choix = ['faible', 'moyen', 'élevé']
df['categorie_pib'] = np.select(conditions, choix)
Opérations par groupe (comme les tableaux croisés dynamiques)
# Statistiques par groupe
df.groupby('pays')['pib'].mean()
df.groupby('pays')['pib'].agg(['mean', 'std', 'count'])
# Créer une moyenne de groupe comme nouvelle variable
df['pib_moyen_pays'] = df.groupby('pays')['pib'].transform('mean')
# Agréger au niveau du groupe
agregat = df.groupby('pays').agg({
'pib': 'mean',
'population': 'sum'
}).reset_index()
Fusion de données (comme RECHERCHEV mais plus puissant)
# Fusion interne
fusionne = pd.merge(df1, df2, on='id_pays', how='inner')
# Fusion à gauche
fusionne = pd.merge(df1, df2, on='id_pays', how='left')
# Fusion sur plusieurs clés
fusionne = pd.merge(df1, df2, on=['pays', 'annee'], how='left')
# Empiler des jeux de données verticalement
combine = pd.concat([df1, df2])
Sauvegarde des données
# Sauvegarder en CSV
df.to_csv("sortie.csv", index=False)
# Sauvegarder en Excel
df.to_excel("sortie.xlsx", index=False)
Jour 3 Visualisation des données
import matplotlib.pyplot as plt
import seaborn as sns
# Définir le style pour des graphiques plus jolis
sns.set_style("whitegrid")
Graphiques de base
# Histogramme (distribution d'une variable)
plt.figure(figsize=(10, 6))
plt.hist(df['pib'], bins=30, edgecolor='black')
plt.xlabel('PIB')
plt.ylabel('Fréquence')
plt.title('Distribution du PIB')
plt.show()
# Nuage de points
plt.figure(figsize=(10, 6))
plt.scatter(df['population'], df['pib'], alpha=0.5)
plt.xlabel('Population')
plt.ylabel('PIB')
plt.title('PIB vs Population')
plt.show()
# Graphique en ligne (tendances)
plt.figure(figsize=(10, 6))
plt.plot(df['annee'], df['pib'])
plt.xlabel('Année')
plt.ylabel('PIB')
plt.title('Évolution du PIB dans le temps')
plt.show()
Seaborn pour les graphiques statistiques
# Nuage de points avec droite de régression
sns.lmplot(data=df, x='population', y='pib')
plt.show()
# Boîte à moustaches par catégorie
sns.boxplot(data=df, x='region', y='pib')
plt.xticks(rotation=45)
plt.show()
# Carte de chaleur des corrélations
matrice_correlation = df[['pib', 'population', 'commerce']].corr()
sns.heatmap(matrice_correlation, annot=True, cmap='coolwarm')
plt.show()
Jour 4 Analyse statistique avec statsmodels
statsmodels fournit des résultats de régression professionnels avec coefficients, erreurs standard, statistiques t, p-values et R².
import statsmodels.api as sm
import statsmodels.formula.api as smf
Régression par MCO (Moindres Carrés Ordinaires)
# API par formule (recommandée - syntaxe intuitive)
modele = smf.ols('pib ~ population + commerce + inflation', data=df).fit()
print(modele.summary())
Lecture des résultats de régression
La sortie affiche tout ce dont vous avez besoin :
OLS Regression Results
==============================================================================
Dep. Variable: pib R-squared: 0.850
Model: OLS Adj. R-squared: 0.845
Method: Least Squares F-statistic: 175.3
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
Intercept 100.2345 15.234 6.581 0.000 70.234 130.235
population 0.0523 0.008 6.538 0.000 0.037 0.068
commerce 2.3456 0.345 6.799 0.000 1.667 3.024
inflation -1.2345 0.234 -5.276 0.000 -1.695 -0.774
==============================================================================
Accès aux résultats
# Coefficients
modele.params
# Erreurs standard
modele.bse
# P-values
modele.pvalues
# R²
modele.rsquared
# Intervalles de confiance
modele.conf_int()
# Valeurs prédites
df['predit'] = modele.predict(df)
# Résidus
df['residus'] = modele.resid
Erreurs standard robustes
# Erreurs standard robustes à l'hétéroscédasticité
modele = smf.ols('pib ~ population + commerce', data=df).fit(cov_type='HC1')
# Erreurs standard clusterisées
modele = smf.ols('pib ~ population + commerce', data=df).fit(
cov_type='cluster',
cov_kwds={'groups': df['pays']}
)
Autres modèles de régression
# Régression logistique (pour les résultats binaires)
modele_logit = smf.logit('employe ~ education + age', data=df).fit()
print(modele_logit.summary())
# Régression probit
modele_probit = smf.probit('employe ~ education + age', data=df).fit()
# Effets fixes (variables catégorielles)
modele = smf.ols('pib ~ population + commerce + C(pays)', data=df).fit()
Tests d'hypothèses
from scipy import stats
# Test t (comparer les moyennes de deux groupes)
groupe1 = df[df['traitement'] == 1]['resultat']
groupe2 = df[df['traitement'] == 0]['resultat']
stat_t, p_value = stats.ttest_ind(groupe1, groupe2)
print(f"Statistique t : {stat_t:.4f}, P-value : {p_value:.4f}")
# Corrélation
correlation = df['pib'].corr(df['population'])
print(f"Corrélation : {correlation:.4f}")
Jour 5 Mise en pratique — Projet complet
Voici un exemple de workflow complet :
# Importer les bibliothèques
import pandas as pd
import numpy as np
import statsmodels.formula.api as smf
import matplotlib.pyplot as plt
import seaborn as sns
# Charger les données
df = pd.read_csv("donnees_pays.csv")
# Explorer les données
print(df.head())
print(df.info())
print(df.describe())
# Nettoyer les données
df = df.dropna(subset=['pib', 'population'])
df = df[df['pib'] > 0]
# Créer des variables
df['log_pib'] = np.log(df['pib'])
df['log_pop'] = np.log(df['population'])
df['croissance_pib'] = df.groupby('pays')['pib'].pct_change()
# Visualiser
fig, axes = plt.subplots(1, 2, figsize=(14, 5))
axes[0].hist(df['log_pib'], bins=30, edgecolor='black')
axes[0].set_xlabel('Log PIB')
axes[0].set_title('Distribution du Log PIB')
axes[1].scatter(df['log_pop'], df['log_pib'], alpha=0.5)
axes[1].set_xlabel('Log Population')
axes[1].set_ylabel('Log PIB')
axes[1].set_title('Log PIB vs Log Population')
plt.tight_layout()
plt.savefig('graphiques_analyse.png', dpi=150)
plt.show()
# Exécuter la régression
modele = smf.ols('log_pib ~ log_pop + ouverture_commerciale + C(region)', data=df).fit(cov_type='HC1')
print(modele.summary())
# Exporter les résultats
resultats_df = pd.DataFrame({
'Variable': modele.params.index,
'Coefficient': modele.params.values,
'Erreur Standard': modele.bse.values,
'P-value': modele.pvalues.values
})
resultats_df.to_csv('resultats_regression.csv', index=False)
📋 Aide-mémoire : Opérations courantes
| Tâche | Code Python |
|---|---|
| Charger CSV | df = pd.read_csv("fichier.csv") |
| Charger Excel | df = pd.read_excel("fichier.xlsx") |
| Voir les données | df.head() |
| Statistiques descriptives | df.describe() |
| Compter les valeurs | df['var'].value_counts() |
| Tableau croisé | pd.crosstab(df['var1'], df['var2']) |
| Créer une variable | df['y'] = df['x'] + 1 |
| Transformation log | df['logx'] = np.log(df['x']) |
| Remplacement conditionnel | df.loc[df['x'] < 0, 'y'] = 0 |
| Supprimer une colonne | df = df.drop('nom_var', axis=1) |
| Filtrer les lignes | df = df[df['x'] > 0] |
| Trier les données | df = df.sort_values('var') |
| Moyenne par groupe | df.groupby('groupe')['x'].mean() |
| Fusionner des jeux de données | pd.merge(df1, df2, on='id') |
| Concaténer des jeux de données | pd.concat([df1, df2]) |
| Régression MCO | smf.ols('y ~ x1 + x2', data=df).fit() |
| Erreurs standard robustes | .fit(cov_type='HC1') |
| Régression logistique | smf.logit('y ~ x1 + x2', data=df).fit() |
| Prédictions | df['y_predit'] = modele.predict(df) |
| Nuage de points | plt.scatter(df['x'], df['y']) |
| Histogramme | plt.hist(df['x']) |
| Sauvegarder CSV | df.to_csv("fichier.csv", index=False) |
📚 Ressources recommandées
Tutoriels en ligne gratuits
- Coding for Economists — Guide complet pour l'analyse de données
aeturrell.github.io/coding-for-economists - DataCamp — Cours interactifs sur statsmodels
datacamp.com
Documentation officielle
Livres
- Python for Data Analysis de Wes McKinney (créateur de pandas)
- Introduction to Python for Econometrics de Kevin Sheppard (PDF gratuit)
💡 Conseils pour réussir
- Commencez avec les notebooks Jupyter — Ils permettent d'exécuter le code de manière interactive et de voir les résultats immédiatement.
- Cherchez vos erreurs sur Google — Les messages d'erreur Python sont généralement utiles. Copiez-collez-les dans Google pour trouver des solutions.
- Ne mémorisez pas — cherchez — Même les programmeurs expérimentés consultent constamment la documentation.
- Pratiquez avec des données familières — Essayez de reproduire des analyses que vous avez faites dans Excel.
- Rejoignez des communautés — Stack Overflow et r/learnpython sur Reddit sont des ressources utiles.