Pertemuan 02: Data Wrangling
Setelah mengikuti pertemuan ini, mahasiswa diharapkan mampu:
- Memahami sumber-sumber data geofisika dan format file yang umum digunakan
- Menguasai teknik handling missing values pada well log dan data seismik
- Mengimplementasikan data cleaning untuk mengatasi outlier dan noise
- Melakukan transformasi data menggunakan library Pandas
- Mempersiapkan data geofisika untuk machine learning pipeline
Ringkasan Materi
1. Sumber Data Geofisika
Data geofisika berasal dari berbagai sumber pengukuran yang masing-masing memiliki karakteristik dan format unik. Memahami sumber data sangat penting untuk preprocessing yang efektif.
- Well Log Data: Format LAS (Log ASCII Standard), CSV, DLIS - pengukuran 1D sepanjang sumur
- Seismic Data: Format SEG-Y, SEGY - data 2D/3D/4D dengan jutaan trace
- Core Data: Hasil analisis laboratorium dalam format spreadsheet
- Production Data: Time series data produksi minyak, gas, dan air
2. Tantangan Data Geofisika
Data geofisika memiliki tantangan khusus yang harus ditangani sebelum digunakan untuk machine learning:
- Missing Values: Bad hole sections, sensor failure, incomplete logging
- Outliers: Spike noise, washout zones, tool malfunction
- Scale Differences: Fitur dengan range nilai yang sangat berbeda (GR: 0-200 API, RHOB: 1.5-3.0 g/cc)
- Format Inconsistency: Berbagai vendor dengan format proprietary
- Large Volume: Seismic 3D bisa mencapai terabytes data
3. Teknik Handling Missing Values
Berbagai strategi untuk menangani missing values pada data geofisika:
import pandas as pd
import numpy as np
# Load well log data
df = pd.read_csv('well_log.csv')
# Check missing values
print(df.isnull().sum())
# Strategy 1: Drop rows with missing values (use with caution)
df_clean = df.dropna()
# Strategy 2: Forward fill (untuk data sequential seperti depth)
df['GR_filled'] = df['GR'].fillna(method='ffill')
# Strategy 3: Interpolation (linear, polynomial, spline)
df['RHOB_interp'] = df['RHOB'].interpolate(method='linear')
# Strategy 4: Fill with median/mean (untuk data non-sequential)
df['NPHI_filled'] = df['NPHI'].fillna(df['NPHI'].median())
# Strategy 5: Predictive imputation using other features
from sklearn.impute import KNNImputer
imputer = KNNImputer(n_neighbors=5)
df_imputed = pd.DataFrame(
imputer.fit_transform(df[['GR', 'RHOB', 'NPHI']]),
columns=['GR', 'RHOB', 'NPHI']
)
4. Data Cleaning: Outlier Detection & Removal
Outlier pada data geofisika bisa disebabkan oleh tool malfunction atau kondisi geologi ekstrem. Penting untuk membedakan keduanya sebelum removal.
# Method 1: Statistical approach (Z-score)
from scipy import stats
z_scores = np.abs(stats.zscore(df['GR']))
df_no_outliers = df[z_scores < 3] # Remove data beyond 3 std
# Method 2: IQR (Interquartile Range)
Q1 = df['RHOB'].quantile(0.25)
Q3 = df['RHOB'].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
df_filtered = df[(df['RHOB'] >= lower_bound) & (df['RHOB'] <= upper_bound)]
# Method 3: Domain knowledge (physics-based constraints)
# For RHOB (bulk density), physically impossible values
df_clean = df[(df['RHOB'] > 1.0) & (df['RHOB'] < 3.5)]
# Method 4: Isolation Forest (ML-based outlier detection)
from sklearn.ensemble import IsolationForest
iso_forest = IsolationForest(contamination=0.1, random_state=42)
outlier_labels = iso_forest.fit_predict(df[['GR', 'RHOB', 'NPHI']])
df_clean = df[outlier_labels == 1] # Keep only inliers
5. Data Transformation & Normalization
Transformasi data diperlukan untuk membuat fitur-fitur geofisika comparable dan meningkatkan performa model ML.
from sklearn.preprocessing import StandardScaler, MinMaxScaler, RobustScaler
# StandardScaler: mean=0, std=1 (sensitive to outliers)
scaler = StandardScaler()
df_scaled = scaler.fit_transform(df[['GR', 'RHOB', 'NPHI']])
# MinMaxScaler: scale to [0,1] range
scaler = MinMaxScaler()
df_normalized = scaler.fit_transform(df[['GR', 'RHOB', 'NPHI']])
# RobustScaler: uses median and IQR (robust to outliers)
scaler = RobustScaler()
df_robust = scaler.fit_transform(df[['GR', 'RHOB', 'NPHI']])
# Log transformation (for skewed data)
df['GR_log'] = np.log1p(df['GR']) # log1p = log(1+x) to handle zeros
# Box-Cox transformation (requires positive values)
from scipy.stats import boxcox
df['RHOB_boxcox'], lambda_param = boxcox(df['RHOB'])
6. Working with LAS Files
LAS (Log ASCII Standard) adalah format standar industri untuk well log. Python library lasio
memudahkan pembacaan dan manipulasi file LAS.
import lasio
# Read LAS file
las = lasio.read('well_data.las')
# Access well information
print(f"Well Name: {las.well.WELL.value}")
print(f"Field: {las.well.FLD.value}")
print(f"Start Depth: {las.well.STRT.value} {las.well.STRT.unit}")
# Convert to pandas DataFrame
df = las.df()
print(df.head())
# Access specific curves
gr_curve = las.curves['GR']
print(f"GR units: {gr_curve.unit}")
print(f"GR description: {gr_curve.descr}")
# Filter by depth range
df_filtered = df[(df.index >= 2000) & (df.index <= 3000)]
# Export to CSV
df.to_csv('well_log_clean.csv')
Best Practices
- Document Everything: Catat setiap preprocessing step untuk reproducibility
- Visualize Before & After: Selalu plot data sebelum dan sesudah cleaning/transformation
- Preserve Raw Data: Jangan overwrite data asli, simpan hasil preprocessing terpisah
- Domain Knowledge: Konsultasi dengan geoscientist untuk validasi data cleaning
- Test Multiple Methods: Compare hasil dari berbagai metode imputation/scaling
- Check Distributions: Pastikan transformasi tidak mengubah informasi penting
Resources Tambahan
Tugas & Latihan
- Download sample LAS file dan load menggunakan lasio
- Identifikasi dan handle missing values dengan minimal 3 metode berbeda
- Detect dan remove outliers, dokumentasikan berapa data yang di-remove
- Lakukan normalization dengan StandardScaler dan MinMaxScaler, bandingkan hasilnya
- Buat visualization sebelum dan sesudah preprocessing (minimum 4 plots)
- Submit Jupyter notebook dengan dokumentasi lengkap
Persiapan Pertemuan Selanjutnya
Pada pertemuan berikutnya, kita akan membahas Exploratory Data Analysis (EDA). Pastikan Anda sudah:
- Familiar dengan plotting library: Matplotlib dan Seaborn
- Memahami statistik deskriptif dasar (mean, median, std, correlation)
- Install library:
seaborn,plotly(untuk visualisasi interaktif) - Data yang sudah di-clean dari tugas minggu ini akan digunakan untuk EDA