🐍 Python pour Économistes

Guide pratique conçu pour les économistes ayant de l'expérience avec Excel qui souhaitent effectuer des analyses statistiques en Python

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 lignesdf.head()
Voir les dernières lignesdf.tail()
Info sur les typesdf.info()
Statistiques descriptivesdf.describe()
Nombre de lignes/colonnesdf.shape
Noms des colonnesdf.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 CSVdf = pd.read_csv("fichier.csv")
Charger Exceldf = pd.read_excel("fichier.xlsx")
Voir les donnéesdf.head()
Statistiques descriptivesdf.describe()
Compter les valeursdf['var'].value_counts()
Tableau croisépd.crosstab(df['var1'], df['var2'])
Créer une variabledf['y'] = df['x'] + 1
Transformation logdf['logx'] = np.log(df['x'])
Remplacement conditionneldf.loc[df['x'] < 0, 'y'] = 0
Supprimer une colonnedf = df.drop('nom_var', axis=1)
Filtrer les lignesdf = df[df['x'] > 0]
Trier les donnéesdf = df.sort_values('var')
Moyenne par groupedf.groupby('groupe')['x'].mean()
Fusionner des jeux de donnéespd.merge(df1, df2, on='id')
Concaténer des jeux de donnéespd.concat([df1, df2])
Régression MCOsmf.ols('y ~ x1 + x2', data=df).fit()
Erreurs standard robustes.fit(cov_type='HC1')
Régression logistiquesmf.logit('y ~ x1 + x2', data=df).fit()
Prédictionsdf['y_predit'] = modele.predict(df)
Nuage de pointsplt.scatter(df['x'], df['y'])
Histogrammeplt.hist(df['x'])
Sauvegarder CSVdf.to_csv("fichier.csv", index=False)

📚 Ressources recommandées

Tutoriels en ligne gratuits

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

  1. Commencez avec les notebooks Jupyter — Ils permettent d'exécuter le code de manière interactive et de voir les résultats immédiatement.
  2. Cherchez vos erreurs sur Google — Les messages d'erreur Python sont généralement utiles. Copiez-collez-les dans Google pour trouver des solutions.
  3. Ne mémorisez pas — cherchez — Même les programmeurs expérimentés consultent constamment la documentation.
  4. Pratiquez avec des données familières — Essayez de reproduire des analyses que vous avez faites dans Excel.
  5. Rejoignez des communautés — Stack Overflow et r/learnpython sur Reddit sont des ressources utiles.