Help me met het automatiseren van Pandas DataFrame data-anomaliedetectie
description
Met deze prompt kan de gebruiker een geautomatiseerd systeem opzetten om datakwaliteitsproblemen vroegtijdig te signaleren, wat fouten in analyses voorkomt en de betrouwbaarheid van datasets verhoogt. Dit is efficiënter dan handmatige controles en biedt flexibiliteit voor diverse datatypes en anomalievormen.
prompt
Ik werk met een Pandas DataFrame dat de volgende gegevens bevat: <voer een beschrijving of voorbeeld van je DataFrame in>. Help me een Python-script te schrijven dat automatisch anomalieën detecteert, zoals uitbijters, onver ...
try_prompt
generate_helper
disclaimerOnPageApi
tags
ai_answers
provider: openai
model: gpt-4.1-nano
no_answer_for_language
error: Generation failed [openai] prompt_id=3652 locale=nl err=OpenAI connection/timeout | Generation failed [openai] prompt_id=3652 locale=en err=OpenAI connection/timeout | Generation failed [openai] prompt_id=3652 locale=de err=OpenAI connection/timeout | Generation failed [openai] prompt_id=3652 locale=fr err=OpenAI connection/timeout | Generation failed [openai] prompt_id=3652 locale=pt err=OpenAI connection/timeout | Generation failed [openai] prompt_id=3652 locale=es err=OpenAI connection/timeout | Generation failed [openai] prompt_id=3652 locale=zh err=OpenAI connection/timeout
provider: deepseek
model: deepseek-chat
Ik help je graag met het schrijven van een Python-script voor anomaliedetectie in je Pandas DataFrame. Hier is een complete oplossing:
```python
import pandas as pd
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
import seaborn as sns
from datetime import datetime
class AnomalieDetector:
def __init__(self, df):
self.df = df.copy()
self.anomalieën = pd.DataFrame()
def detecteer_numerieke_anomalieën(self, kolom, methode='zscore', drempel=3):
"""Detecteert anomalieën in numerieke kolommen"""
if methode == 'zscore':
z_scores = np.abs(stats.zscore(self.df[kolom].dropna()))
anomalie_mask = z_scores > drempel
elif methode == 'iqr':
Q1 = self.df[kolom].quantile(0.25)
Q3 = self.df[kolom].quantile(0.75)
IQR = Q3 - Q1
anomalie_mask = (self.df[kolom] < (Q1 - 1.5 * IQR)) | (self.df[kolom] > (Q3 + 1.5 * IQR))
anomalie_data = self.df[anomalie_mask].copy()
anomalie_data['AnomalieType'] = f'Numerieke uitbijter ({methode})'
anomalie_data['AnomalieKolom'] = kolom
self.anomalieën = pd.concat([self.anomalieën, anomalie_data])
def detecteer_categorische_anomalieën(self, kolom, zeldzaamheidsdrempel=0.01):
"""Detecteert zeldzame categorische waarden"""
waarde_frequenties = self.df[kolom].value_counts(normalize=True)
zeldzame_waarden = waarde_frequenties[waarde_frequenties < zeldzaamheidsdrempel].index
anomalie_mask = self.df[kolom].isin(zeldzame_waarden)
anomalie_data = self.df[anomalie_mask].copy()
anomalie_data['AnomalieType'] = 'Zeldzame categorische waarde'
anomalie_data['AnomalieKolom'] = kolom
self.anomalieën = pd.concat([self.anomalieën, anomalie_data])
def detecteer_datum_anomalieën(self, kolom):
"""Detecteert anomalieën in datumkolommen"""
# Controleer op toekomstige datums (indien van toepassing)
huidige_datum = pd.Timestamp.now()
toekomstige_datum_mask = self.df[kolom] > huidige_datum
if toekomstige_datum_mask.any():
anomalie_data = self.df[toekomstige_datum_mask].copy()
anomalie_data['AnomalieType'] = 'Toekomstige datum'
anomalie_data['AnomalieKolom'] = kolom
self.anomalieën = pd.concat([self.anomalieën, anomalie_data])
def detecteer_ontbrekende_waarden(self):
"""Detecteert ontbrekende waarden in alle kolommen"""
ontbrekend_mask = self.df.isnull().any(axis=1)
if ontbrekend_mask.any():
anomalie_data = self.df[ontbrekend_mask].copy()
anomalie_data['AnomalieType'] = 'Ontbrekende waarde'
anomalie_data['AnomalieKolom'] = 'Meerdere kolommen'
self.anomalieën = pd.concat([self.anomalieën, anomalie_data])
def voer_complete_detectie_uit(self):
"""Voert complete anomaliedetectie uit voor alle kolommen"""
self.anomalieën = pd.DataFrame()
# Controleer kolomdatatypes
for kolom in self.df.columns:
dtype = self.df[kolom].dtype
if np.issubdtype(dtype, np.number):
self.detecteer_numerieke_anomalieën(kolom, methode='zscore')
self.detecteer_numerieke_anomalieën(kolom, methode='iqr')
elif dtype == 'object':
self.detecteer_categorische_anomalieën(kolom)
elif np.issubdtype(dtype, np.datetime64):
self.detecteer_datum_anomalieën(kolom)
self.detecteer_ontbrekende_waarden()
return self.anomalieën
def genereer_rapport(self):
"""Genereert een overzichtelijk rapport van alle anomalieën"""
if self.anomalieën.empty:
print("Geen anomalieën gedetecteerd!")
return
print("=" * 60)
print("ANOMALIE DETECTIE RAPPORT")
print("=" * 60)
# Samenvatting per anomalie type
print("\nSamenvatting per type:")
print(self.anomalieën['AnomalieType'].value_counts())
print(f"\nTotaal aantal anomalieën: {len(self.anomalieën)}")
print(f"Percentage van dataset: {len(self.anomalieën)/len(self.df)*100:.2f}%")
# Gedetailleerd overzicht
print("\nGedetailleerd overzicht:")
for idx, anomalie in self.anomalieën.iterrows():
print(f"\nTransactieID: {anomalie['TransactieID']}")
print(f"Type: {anomalie['AnomalieType']}")
print(f"Kolom: {anomalie['AnomalieKolom']}")
print(f"Waarde: {anomalie[anomalie['AnomalieKolom']]}")
# Visualisatie (optioneel)
self.visualiseer_anomalieën()
def visualiseer_anomalieën(self):
"""Maakt visualisaties van de gedetecteerde anomalieën"""
plt.figure(figsize=(12, 6))
# Boxplot voor numerieke waarden
if 'Bedrag' in self.df.columns:
plt.subplot(1, 2, 1)
sns.boxplot(y=self.df['Bedrag'])
plt.title('Boxplot van Bedrag met uitbijters')
# Barplot voor categorische waarden
if 'Categorie' in self.df.columns:
plt.subplot(1, 2, 2)
self.df['Categorie'].value_counts().plot(kind='bar')
plt.title('Verdeling van Categorieën')
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()
# Gebruiksvoorbeeld:
# df = pd.read_csv('jouw_data.csv') # Laad je DataFrame
# detector = AnomalieDetector(df)
# anomalieën = detector.voer_complete_detectie_uit()
# detector.genereer_rapport()
```
## Aanpassingen voor verschillende datatypes:
### 1. **Numerieke kolommen (Bedrag)**:
- **Z-score methode**: Ideaal voor normaal verdeelde data
- **IQR methode**: Beter voor niet-normale verdelingen
- **Aanpassen**: Wijzig de `drempel` parameter voor gevoeligheid
### 2. **Categorische kolommen (Categorie)**:
- **Zeldzaamheidsdrempel**: Stel in met `zeldzaamheidsdrempel`
- **Domain knowledge**: Voeg verwachte waarden toe aan whitelist
### 3. **Datumkolommen (Datum)**:
- **Toekomstige datums**: Automatische detectie
- **Ongebruikelijke patterns**: Voeg custom checks toe
## Beste methoden voor jouw situatie:
1. **Voor Bedrag**: Gebruik zowel Z-score als IQR voor dubbele zekerheid
2. **Voor Categorie**: Stel zeldzaamheidsdrempel in op 1-5% afhankelijk van datasetgrootte
3. **Combineer methoden**: Gebruik domeinkennis voor extra validatieregels
## Extra aanbevelingen:
```python
# Domeinspecifieke checks toevoegen:
def voeg_custom_checks_toe(self):
# Bijvoorbeeld: bedragen onder €0.01 of boven €10.000
bedrag_anomalie = (self.df['Bedrag'] < 0.01) | (self.df['Bedrag'] > 10000)
# Onverwachte categorieën
verwachte_categorieën = ['Voedsel', 'Transport', 'Wonen', 'Entertainment']
categorie_anomalie = ~self.df['Categorie'].isin(verwachte_categorieën)
```
Dit script geeft je een complete oplossing die je eenvoudig kunt aanpassen voor jouw specifieke dataset!