Pertemuan 02: Data Wrangling

🎯 Tujuan Pembelajaran

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
📊 Materi Presentasi
💡 Catatan: Slide presentasi di atas akan otomatis terupdate ketika dosen melakukan perubahan pada Google Slides. Pastikan koneksi internet Anda stabil untuk viewing yang optimal.

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:

Python
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']
)
⚠️ Penting: Pilihan metode handling missing values bergantung pada: persentase missing data, pola missing (random vs systematic), dan tipe analisis yang akan dilakukan. Untuk well log, interpolasi sering lebih baik daripada deletion karena data bersifat sequential.

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.

Python
# 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.

Python
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.

Python
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

✅ Tips Data Wrangling untuk Geofisika:
  1. Document Everything: Catat setiap preprocessing step untuk reproducibility
  2. Visualize Before & After: Selalu plot data sebelum dan sesudah cleaning/transformation
  3. Preserve Raw Data: Jangan overwrite data asli, simpan hasil preprocessing terpisah
  4. Domain Knowledge: Konsultasi dengan geoscientist untuk validasi data cleaning
  5. Test Multiple Methods: Compare hasil dari berbagai metode imputation/scaling
  6. Check Distributions: Pastikan transformasi tidak mengubah informasi penting

Resources Tambahan

📚

Pandas Documentation

Official docs untuk data manipulation

Visit →
🔧

Lasio Library

Python library untuk LAS file handling

Visit →
💻

Sample Notebooks

Jupyter notebooks dengan contoh lengkap

Download →
📊

Sample LAS Files

Well log data untuk praktek

Download →

Tugas & Latihan

📝 Tugas Mingguan:
  1. Download sample LAS file dan load menggunakan lasio
  2. Identifikasi dan handle missing values dengan minimal 3 metode berbeda
  3. Detect dan remove outliers, dokumentasikan berapa data yang di-remove
  4. Lakukan normalization dengan StandardScaler dan MinMaxScaler, bandingkan hasilnya
  5. Buat visualization sebelum dan sesudah preprocessing (minimum 4 plots)
  6. 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
← Previous: Introduction ML Next: EDA →