Cours

Qu’est-ce que la donnée synthétique ?
La donnée synthétique est une donnée générée par ordinateur qui ressemble à des données du monde réel. Son objectif principal est d’améliorer la confidentialité et l’intégrité des systèmes. Par exemple, pour protéger les informations personnelles identifiables (PII) ou les données de santé (PHI) des utilisateurs, les entreprises doivent mettre en place des stratégies de protection des données. L’utilisation de données synthétiques peut aider à tester de nouvelles applications tout en protégeant la vie privée des utilisateurs.
En apprentissage automatique, on utilise aussi les données synthétiques pour améliorer les performances des modèles, notamment lorsque les données sont rares ou déséquilibrées. Les usages courants incluent les véhicules autonomes, la sécurité, la robotique, la prévention de la fraude et la santé.

Image issue de Nvidia
Selon Gartner, d’ici 2024, 60 % des données utilisées pour développer des applications d’IA et d’analytique seront générées de manière synthétique. Pourquoi observe-t-on une telle tendance ?
Collecter et nettoyer des données réelles est coûteux et, parfois, les cas sont rares. Par exemple, des données sur la fraude bancaire, le cancer du sein, les accidents de voitures autonomes ou les attaques par malware sont difficiles à obtenir. Même en disposant de ces données, il faut du temps et des ressources pour les nettoyer et les préparer à des tâches de machine learning.
Dans la première partie du tutoriel, nous verrons pourquoi nous avons besoin de données synthétiques, leurs usages, et comment les générer. Dans la seconde partie, nous explorerons la bibliothèque Python Faker pour créer des données synthétiques destinées aux tests et à la protection de la vie privée.
Pourquoi générer des données synthétiques ?

Image de l’auteur
Nous avons recours aux données synthétiques pour la confidentialité des utilisateurs, les tests applicatifs, l’amélioration des performances des modèles, la représentation de cas rares et la réduction des coûts d’exploitation.
- Confidentialité : protéger les données des utilisateurs. Vous pouvez remplacer noms, emails et adresses par des données synthétiques. Cela permet d’éviter les cyberattaques et les attaques de type "boîte noire" où les modèles déduisent des informations sur les données d’entraînement.
- Tests : tester des applications sur des données réelles est coûteux. Tester des bases de données, des interfaces et des applications d’IA sur des données synthétiques est plus économique et plus sûr.
- Performance des modèles : les données synthétiques générées peuvent améliorer les performances. Par exemple, pour des classificateurs d’images, on applique cisaillement, décalage et rotation afin d’augmenter la taille du jeu de données et d’améliorer la précision.
- Cas rares : on ne peut pas attendre qu’un événement rare survienne pour collecter des données réelles. Exemples : détection de fraude, accidents de voiture, données sur le cancer.
- Coûts : la collecte de données prend du temps et mobilise des ressources. Acquérir des données réelles, les nettoyer, les annoter et les préparer pour des tests ou l’entraînement de modèles est onéreux.
Quelles sont les applications des données synthétiques ?
Dans cette section, nous verrons comment les entreprises utilisent les données synthétiques pour concevoir des applications performantes, respectueuses de la vie privée et économiquement viables.
- Partage de données : les données synthétiques permettent de partager des données sensibles en interne et avec des tiers. Elles facilitent aussi la migration de données privées vers le cloud et la conservation de données pour l’analytique.
- Services financiers : génération d’événements rares comme des transactions frauduleuses, la détection d’anomalies ou des scénarios de récession. Elles servent aussi à analyser les comportements clients via des outils d’analytique.
- Assurance qualité : maintenir et tester la qualité d’applications ou de systèmes de données. Les données synthétiques permettent d’évaluer les systèmes sur des anomalies rares et d’améliorer leurs performances.
- Santé : partager des dossiers médicaux en interne et en externe tout en préservant la confidentialité des patients. On peut également les utiliser pour des essais cliniques et la détection de maladies rares. Apprenez à traiter des informations sensibles avec un cours sur la confidentialité et l’anonymisation des données en Python ou en R.
- Automobile et robotique : obtenir des données réelles pour des robots, des drones et des voitures autonomes est difficile et lent. Les entreprises entraînent et testent leurs systèmes sur des données de simulation synthétiques, ce qui réduit les coûts sans sacrifier les performances.
- Apprentissage automatique : augmenter la taille des jeux d’entraînement, corriger les déséquilibres, et tester les modèles pour garantir performance et précision. Elles servent aussi à réduire les biais dans les jeux d’images et de textes existants. Exemple : DeepFake pour éprouver des systèmes de reconnaissance faciale.
Comment générer des données synthétiques
On peut utiliser des générateurs de fausses données, des outils statistiques, des réseaux neuronaux et des GANs (generative adversarial networks) pour produire des données synthétiques.
Générer de fausses bases de données avec la bibliothèque Faker pour tester des bases et des systèmes. Elle peut produire de faux profils utilisateurs avec adresses et informations essentielles. On peut aussi générer du texte et des paragraphes aléatoires. Cela aide à protéger la vie privée des utilisateurs pendant la phase de test et à réduire les coûts d’acquisition de jeux de données réels.
Modéliser la distribution des données afin de générer un nouveau jeu de données via des lois statistiques (gaussienne, exponentielle, khi-deux, t, log-normale, uniforme). Il faut une expertise métier pour produire des données synthétiques basées sur des distributions.
Variational Autoencoder (VAE) : méthode non supervisée avec encodeur et décodeur pour compresser le jeu d’origine et générer une représentation des données initiales. Conçu pour optimiser la corrélation entre jeux d’entrée et de sortie.
Generative Adversarial Network (GAN) : l’approche la plus populaire. Permet de produire des images, sons, données tabulaires et données de simulation synthétiques. Elle s’appuie sur une architecture générateur/discriminateur de deep learning qui compare des échantillons aléatoires aux données réelles. Lisez notre tutoriel Demystifying Generative Adversarial Nets pour créer vos propres données synthétiques avec Keras.
Qu’est-ce que Python Faker ?
Python Faker est un paquet Python open source utilisé pour créer de faux jeux de données afin de tester des applications, amorcer une base de données et préserver l’anonymat des utilisateurs.

Image de l’auteur
Vous pouvez installer Faker avec :
pip install faker
Faker propose une interface en ligne de commande, des fixtures Pytest, la localisation (prise en charge de différentes régions), la reproductibilité et des providers dynamiques (adaptation à vos besoins).
Vous pouvez aussi utiliser les fonctions de base de Faker pour créer rapidement un jeu de données et le personnaliser. Le tableau ci-dessous présente plusieurs fonctions Faker et leur usage.
|
Fonction Faker |
Usage |
|
name() |
Génère un nom complet factice |
|
credit_card_full() |
Génère un numéro de carte avec date d’expiration et CVV |
|
email() |
Génère une adresse email factice |
|
url() |
Génère une URL factice |
|
phone_number() |
Génère un numéro de téléphone factice avec indicatif pays |
|
address() |
Génère une adresse complète factice |
|
license_plate() |
Génère une plaque d’immatriculation factice |
|
currency() |
Génère un tuple (code devise, libellé) |
|
color_name() |
Génère un nom de couleur aléatoire |
|
local_latlng() |
Génère latitude, longitude, zone, pays et régions |
|
domain_name() |
Génère un nom de domaine basé sur un nom de personne |
|
text() |
Génère un court texte factice |
|
company() |
Génère un nom d’entreprise factice |
Pour découvrir des fonctions plus avancées, consultez la documentation Faker.
Il est important de passer en revue ces fonctions, car nous allons les utiliser pour créer divers exemples et dataframes.
Générer des données synthétiques avec Python Faker
Dans cette section, nous allons utiliser Python Faker pour générer des données synthétiques. Elle comprend 5 exemples d’usages selon les besoins. L’objectif est d’adopter une approche centrée sur la confidentialité pour tester les systèmes. Dans la dernière partie, nous générerons des données factices pour compléter les données originales grâce au provider localisé de Faker.
Vous trouverez l’intégralité du code de ce tutoriel dans ce workbook DataLab ; vous pouvez en créer une copie pour exécuter tout le code dans le navigateur, sans rien installer sur votre ordinateur.
Commençons par initialiser un générateur avec `Faker()`. Par défaut, la locale utilisée est « en_US ».
from faker import Faker
fake = Faker()
Exemple 1
L’objet « fake » peut générer des données via des propriétés. Par exemple, `fake.name()` permet de générer aléatoirement le nom complet d’une personne.
print(fake.name())
>>> Jessica Robinson
De même, on peut générer une adresse email, un pays, du texte, une géolocalisation et une URL, comme ci-dessous.
print(fake.email())
print(fake.country())
print(fake.name())
print(fake.text())
print(fake.latitude(), fake.longitude())
print(fake.url())
Sortie
ybanks@example.com
Mayotte
Mr. Jose Browning DDS
Dog might bank dog total life financial. Dark view doctor time just.
Stay second treatment language theory. Space seek adult create matter imagine lay.
51.7514185 -148.802970
http://fischer.info/
Exemple 2
Vous pouvez changer de locale pour générer des données dans d’autres langues et régions.
Dans l’exemple ci-dessous, nous générons des données en espagnol pour l’Espagne.
fake = Faker("es_ES")
print(fake.email())
print(fake.country())
print(fake.name())
print(fake.text())
print(fake.latitude(), fake.longitude())
print(fake.url())
Sortie
On observe que le nom a changé et que le texte est en espagnol.
casandrahierro@example.com
Tonga
Juan Solera-Mancebo
Cumque adipisci eligendi aperiam. Quas laboriosam amet at dignissimos. Excepturi pariatur ipsam esse.
89.180798 -2.274117
https://corbacho-galan.net/
Essayons maintenant avec l’allemand et l’Allemagne. Pour générer un profil utilisateur complet, utilisons la fonction `profile()`.
fake = Faker("de_DE")
fake.profile()
Sortie
On voit clairement comment Faker permet de générer des données dans différentes langues et pour différents pays. Changer de locale modifie le nom, l’emploi, l’adresse, l’entreprise et d’autres informations d’identification selon la langue et le pays.
{'job': 'Erzieher',
'company': 'Stadelmann Thanel GmbH',
'ssn': '631-64-0521',
'residence': 'Leo-Schinke-Allee 298\n26224 Altötting',
'current_location': (Decimal('51.5788595'), Decimal('29.780659')),
'blood_group': 'B+',
'website': ['https://www.schmidtke.de/',
'https://roskoth.com/',
'http://www.textor.de/',
'https://www.zirme.com/'],
'username': 'vdoerr',
'name': 'Francesca Fröhlich',
'sex': 'F',
'address': 'Steinbergallee 13\n84765 Saarbrücken',
'mail': 'smuehle@gmail.com',
'birthdate': datetime.date(1998, 3, 19)}
Exemple 3
Dans cet exemple, nous allons créer un dataframe pandas avec Faker.
- Créer un dataframe pandas vide (data)
- Boucler x fois pour créer plusieurs lignes
- Utiliser `randint()` pour un identifiant unique
- Utiliser Faker pour générer nom, adresse et géolocalisation
- Exécuter la fonction `input_data()` avec x=10
from random import randint
import pandas as pd
fake = Faker()
def input_data(x):
# pandas dataframe
data = pd.DataFrame()
for i in range(0, x):
data.loc[i,'id']= randint(1, 100)
data.loc[i,'name']= fake.name()
data.loc[i,'address']= fake.address()
data.loc[i,'latitude']= str(fake.latitude())
data.loc[i,'longitude']= str(fake.longitude())
return data
input_data(10)
La sortie est parlante : nous avons des colonnes id, name, address, latitude et longitude avec des données uniques par utilisateur.

Pour rendre le résultat reproductible, il faut fixer la graine (seed). Ainsi, à chaque exécution, on obtiendra les mêmes résultats.
Faker.seed(2)
input_data(10)
Exemple 4
On peut aussi générer des phrases contenant des mots-clés de notre choix, de manière similaire à `text()`, `texts()`, `paragraph()`, `word()` et `words()`. Vous pouvez augmenter le nombre de mots d’une phrase avec l’argument nb_words.
Ci-dessous, nous générons cinq phrases à partir d’une liste de mots. Ce n’est pas parfait, mais cela suffit pour tester des applications nécessitant beaucoup de texte.
word_list = ["DataCamp", "says", "great", "loves", "tutorial", "workplace"]
for i in range(0, 5):
print(fake.sentence(ext_word_list=word_list))
Sortie
Loves great says.
Says workplace workplace tutorial great loves.
Loves workplace workplace loves workplace loves great DataCamp.
Loves says workplace great.
Workplace great DataCamp.
Mélanger données synthétiques et données réelles
Dans cette partie, nous utiliserons les données e-commerce du dépôt de DataCamp et y ajouterons des données factices via les colonnes CustomerID et Country. Cela nous aidera à préserver la confidentialité et à tester le système avec des paramètres supplémentaires.
Pour charger un fichier CSV, nous utiliserons la fonction pandas `read_csv()` et afficherons les cinq premières lignes avec `head()`
# Loading CSV file
Ecommerce = pd.read_csv("e-commerce.csv")
Ecommerce.head()
Le jeu de données comprend InvoiceNo, StockCode (ID produit), Description, Product (nom d’article), Quantity (par transaction), InvoiceDate, UnitPrice (en livres), CustomerID et Country.

Pour créer un objet Faker localisé, nous allons afficher la liste des pays uniques et l’utiliser pour créer un dictionnaire. On observe sept pays, pour lesquels nous créerons sept générateurs localisés dans la suite.
Ecommerce.Country.dropna().unique()
>>> array(['United Kingdom', 'France', 'Australia', 'Netherlands', 'Germany',
'Norway', 'EIRE'], dtype=object)
Dans la fonction `anonymous`, nous avons :
- Extrait les identifiants clients uniques et supprimé les valeurs manquantes
- Créé un dictionnaire associant pays et code de locale
- Récupéré l’index de ligne et le pays pour chaque identifiant unique
- Utilisé le dictionnaire et le pays pour initialiser un générateur Faker localisé
- Ajouté nom, adresse et géolocalisation au dataframe existant.
La fonction ci-dessous prend un dataframe et ajoute quatre colonnes de données utilisateur basées sur CustomerID et Country.
def anonymous(df):
# Extracting unique CustomerID
unique_id = df.CustomerID.dropna().unique()
# Creating the dictionary for Faker localized providers
local = {
"United Kingdom": "en_GB",
"France": "fr_FR",
"Australia": "en_AU",
"Netherlands": "nl_NL",
"Germany": "de_DE",
"Norway": "no_NO",
"EIRE": "ga_IE",
}
for i in unique_id:
# Extracting row index
row_id = df[df["CustomerID"] == i].index
# Extracting country name for faker locale
CountryName = Ecommerce.loc[
Ecommerce["CustomerID"] == i, "Country"
].to_numpy()[0]
# Using locale dictionary to create faker locale generator
code = local[CountryName]
fake = Faker(code)
# Generating fake data and adding it to dataframe
CustomerName = fake.name()
Address = fake.address()
Latitude = str(fake.latitude())
Longitude = str(fake.longitude())
for x in row_id:
df.loc[x, "CustomerName"] = CustomerName
df.loc[x, "Address"] = Address
df.loc[x, "Latitude"] = Latitude
df.loc[x, "Longitude"] = Longitude
return df
Nous utiliserons seed(5) pour la reproductibilité et exécuterons la fonction `anonymous` sur le dataframe Ecommerce.
# Using seed for reproducibility
Faker.seed(5)
secure_db = anonymous(Ecommerce)
secure_db
Les premières lignes affichent les données pour 17850, United Kingdom, et Pamela Cox-James.

Pour visualiser les résultats localisés de la fonction, affichons une ligne par valeur unique de la colonne Country.
display_db = []
for i in Ecommerce.Country.dropna().unique():
display_db.append(secure_db[secure_db["Country"] == i].to_numpy()[0])
pd.DataFrame(display_db, columns=Ecommerce.columns)
Le résultat est convaincant : on observe des noms différents selon la région et la langue, et des adresses cohérentes avec le pays. Avec cette méthode, vous pouvez supprimer les données identifiantes et créer des données localisées avec Faker pour protéger la vie privée et réduire les coûts.

Le code source est disponible dans ce workbook DataLab.
Conclusion
L’une des limites de Python Faker est la qualité parfois inégale des données produites. C’est très utile pour les tests applicatifs, mais la précision n’est pas toujours au rendez-vous : par exemple, les noms peuvent ne pas correspondre aux emails, aux domaines ou aux identifiants.
Vous pouvez personnaliser les providers ou en créer de nouveaux selon vos besoins, mais cela demande du temps pour obtenir un résultat abouti. Dans certains cas, vous pourriez aussi concevoir votre propre paquet Python en vous appuyant sur `random.choice()`.
Dans la tech, les data scientists utilisent divers outils pour traiter des données sensibles et préserver la confidentialité. Ils recourent également aux données synthétiques pour améliorer les performances des modèles, réduire les biais, tester les applications et diminuer les coûts de développement de solutions d’IA de pointe.
Pour aller plus loin, découvrez le parcours Data Scientist with Python et lancez-vous pour devenir un ou une data scientist accompli·e.
Dans ce tutoriel, nous avons vu l’importance des données synthétiques et leurs usages. Nous avons aussi généré des données factices de bout en bout avec Python Faker pour tester des systèmes de données et préserver la vie privée des utilisateurs.
