Python untuk Data Science: NumPy, Pandas, dan Scikit-Learn di Tahun 2026
Panduan praktis menggunakan NumPy 2.1, Pandas 2.2, dan Scikit-Learn 1.6 dengan Python 3.12. Dari pembersihan data dan feature engineering hingga pipeline ML siap produksi -- lengkap dengan contoh kode.

Python tetap menjadi bahasa pemrograman utama di bidang data science pada tahun 2026 -- bukan karena sekadar tren, melainkan karena ekosistemnya yang matang dan teruji. Tiga pustaka inti menjadi fondasi dari hampir seluruh pipeline data modern: NumPy menyediakan operasi matriks dan array berkinerja tinggi, Pandas memungkinkan manipulasi data tabular secara fleksibel, dan Scikit-Learn menghadirkan algoritma machine learning siap pakai. Dengan menguasai ketiga pustaka ini, seorang praktisi data science dapat menangani seluruh alur kerja -- mulai dari pembersihan data mentah hingga deployment model -- sepenuhnya dalam Python. Artikel ini menyajikan contoh praktis yang saling berkesinambungan, yaitu analisis dan prediksi promosi karyawan, untuk mendemonstrasikan penggunaan efektif ketiga pustaka tersebut.
Seluruh contoh kode dalam artikel ini dikembangkan dan diuji menggunakan Python 3.12+, NumPy 2.1, Pandas 2.2, dan Scikit-Learn 1.6. Versi yang lebih lama mungkin memiliki perbedaan pada beberapa detail API, khususnya perilaku Copy-on-Write pada Pandas 2.2 dan kompatibilitas Array API baru pada NumPy 2.1.
Operasi Array NumPy: Dasar-Dasar dan Boolean Indexing
NumPy menggantikan list Python dan loop konvensional dengan operasi tervektorisasi yang secara internal dijalankan pada kode C yang telah dioptimasi. Alih-alih mengiterasi elemen satu per satu menggunakan for loop, fungsi-fungsi NumPy beroperasi pada seluruh array secara serentak -- menghasilkan peningkatan kecepatan 10 hingga 100 kali lipat pada beban kerja data science yang umum.
Contoh berikut menampilkan operasi array fundamental: pembuatan array dari berbagai sumber, aritmetika tervektorisasi, serta Boolean Indexing yang memungkinkan pemfilteran data tanpa loop.
# numpy_basics.py
import numpy as np
# Create arrays from different sources
prices = np.array([29.99, 49.99, 19.99, 99.99, 39.99])
quantities = np.arange(1, 6) # [1, 2, 3, 4, 5]
# Vectorized arithmetic — no loops needed
revenue = prices * quantities
print(revenue) # [29.99, 99.98, 59.97, 399.96, 199.95]
# Statistical aggregations
print(f"Total revenue: ${revenue.sum():.2f}") # $789.85
print(f"Mean price: ${prices.mean():.2f}") # $47.99
print(f"Std deviation: ${prices.std():.2f}") # $27.64
# Boolean indexing — filter without loops
premium_mask = prices > 40
premium_items = prices[premium_mask] # [49.99, 99.99]Boolean Indexing merupakan pola sentral dalam NumPy: ekspresi prices > 40 menghasilkan array berisi nilai True/False yang langsung berfungsi sebagai masker filter. Konsep ini akan ditemui kembali pada Pandas DataFrame, karena Pandas secara internal dibangun di atas NumPy. Fungsi-fungsi agregasi statistik -- sum(), mean(), std() -- secara default beroperasi pada seluruh elemen array. Untuk array multidimensi, parameter axis memungkinkan agregasi dilakukan pada sumbu tertentu.
Reshaping dan Broadcasting pada NumPy
Array multidimensi sangat lazim dijumpai dalam praktik sehari-hari: data penjualan berdasarkan produk dan bulan, nilai piksel pada citra, maupun matriks fitur untuk model machine learning. NumPy menyediakan kemampuan untuk mengubah bentuk struktur data ini secara fleksibel melalui reshape(), serta broadcasting otomatis saat melakukan operasi aritmetika pada array dengan dimensi yang berbeda.
# numpy_reshape.py
import numpy as np
# Monthly sales data: 4 products x 3 months
sales = np.array([
[120, 150, 130], # Product A
[200, 180, 220], # Product B
[90, 110, 95], # Product C
[300, 280, 310], # Product D
])
# Column-wise mean (average per month)
monthly_avg = sales.mean(axis=0) # [177.5, 180.0, 188.75]
# Row-wise sum (total per product)
product_totals = sales.sum(axis=1) # [400, 600, 295, 890]
# Normalize each product relative to its own max
normalized = sales / sales.max(axis=1, keepdims=True)
# keepdims=True preserves the shape for broadcasting
print(normalized[0]) # [0.8, 1.0, 0.867] — Product A relative to its peak
# Reshape for Scikit-Learn (requires 2D input)
flat_sales = sales.flatten() # 1D array of 12 values
reshaped = flat_sales.reshape(-1, 1) # 12x1 column vectorParameter axis berperan krusial dalam menentukan arah agregasi: axis=0 melakukan agregasi per kolom (melintasi baris), sedangkan axis=1 melakukan agregasi per baris (melintasi kolom). Pada proses normalisasi, keepdims=True mempertahankan shape (4, 1) sehingga broadcasting pada operasi pembagian berjalan dengan benar. Pola reshape(-1, 1) di bagian akhir merupakan teknik yang sangat umum digunakan, karena Scikit-Learn mensyaratkan input berupa array minimal dua dimensi.
Manipulasi dan Pembersihan Data dengan Pandas DataFrame
Pandas merupakan alat utama untuk menangani data tabular dalam Python. Sebuah DataFrame berperilaku serupa dengan tabel database atau spreadsheet Excel, namun menawarkan kemampuan transformasi yang jauh lebih kuat. Dalam praktik nyata, pembersihan data merupakan tahap yang paling memakan waktu di setiap proyek data science -- nilai yang hilang, outlier, duplikat, serta tipe data yang tidak konsisten harus ditangani secara sistematis.
Pendekatan yang direkomendasikan adalah rangkaian transformasi yang reprodusibel, yaitu menjaga DataFrame asli tetap utuh dan menyimpan hasilnya ke dalam variabel baru. Contoh berikut menggunakan dataset berisi 1.500 profil kandidat.
# pandas_cleaning.py
import pandas as pd
import numpy as np
# Load and inspect raw data
df = pd.read_csv("candidates.csv")
print(df.shape) # (1500, 8)
print(df.dtypes) # Check column types
print(df.isna().sum()) # Count missing values per column
# Clean in a reproducible chain
df_clean = (
df
.dropna(subset=["salary", "experience_years"]) # Drop rows missing critical fields
.assign(
salary=lambda x: x["salary"].clip(lower=20000, upper=500000), # Cap outliers
experience_years=lambda x: x["experience_years"].astype(int),
hired_date=lambda x: pd.to_datetime(x["hired_date"], errors="coerce"),
)
.drop_duplicates(subset=["email"]) # Remove duplicate candidates
.query("experience_years >= 0") # Filter invalid entries
.reset_index(drop=True)
)
print(f"Cleaned: {len(df)} -> {len(df_clean)} rows")Metode .assign() menambahkan kolom baru atau menimpa kolom yang sudah ada tanpa mengubah DataFrame asli. Argumen clip() membatasi rentang gaji pada batas yang masuk akal, mencegah nilai ekstrem mendistorsi model yang akan dibangun. Pola pd.to_datetime(..., errors="coerce") mengonversi format tanggal yang tidak valid menjadi NaT (Not a Time) alih-alih memunculkan error -- pendekatan yang robust untuk menangani data dunia nyata.
Mulai Pandas 2.2, fitur Copy-on-Write (CoW) diaktifkan secara default. Artinya, operasi pada subset DataFrame (slice) selalu menghasilkan salinan, bukan view. Dengan demikian, peringatan SettingWithCopyWarning yang selama ini kerap membingungkan tidak lagi muncul. Bagi yang memerlukan akses in-place secara langsung, disarankan untuk memanggil .copy() secara eksplisit atau menggunakan pola-pola baru yang kompatibel dengan CoW.
Agregasi GroupBy dan Feature Engineering dengan Pandas
Memasukkan data mentah langsung ke dalam model jarang menghasilkan performa yang baik. Feature engineering -- proses transformasi dan penggabungan data mentah menjadi fitur-fitur yang lebih informatif -- seringkali menjadi faktor terbesar dalam meningkatkan kualitas model. Operasi GroupBy pada Pandas sangat penting dalam proses ini: memungkinkan perhitungan statistik agregat per kelompok, yang kemudian dijadikan fitur baru.
Contoh berikut menghitung statistik per departemen dan menurunkan fitur-fitur baru yang membantu model memahami posisi seorang kandidat relatif terhadap departemennya. Pembahasan lebih mendalam tentang strategi feature engineering tersedia di halaman Feature Engineering untuk Interview Data Science.
# pandas_groupby.py
import pandas as pd
# Aggregate candidate stats by department
dept_stats = (
df_clean
.groupby("department")
.agg(
avg_salary=("salary", "mean"),
median_experience=("experience_years", "median"),
headcount=("email", "count"),
max_salary=("salary", "max"),
)
.sort_values("avg_salary", ascending=False)
)
print(dept_stats.head())
# Create features for ML: encode categorical + add aggregated stats
df_features = (
df_clean
.assign(
# Ratio of individual salary to department average
salary_ratio=lambda x: x["salary"] / x.groupby("department")["salary"].transform("mean"),
# Time since hire in days
tenure_days=lambda x: (pd.Timestamp.now() - x["hired_date"]).dt.days,
# Binary encoding
is_senior=lambda x: (x["experience_years"] >= 5).astype(int),
)
)Pola transform("mean") memiliki keunggulan tersendiri: berbeda dengan agg() yang mengembalikan tabel agregat, transform() mempertahankan jumlah baris asli dan mengembalikan nilai kelompok yang bersesuaian untuk setiap baris -- sangat ideal untuk menghitung rasio seperti salary_ratio. Fitur tenure_days mengkonversi data tanggal menjadi nilai numerik yang dapat langsung diproses oleh model.
Siap menguasai wawancara Data Science & ML Anda?
Berlatih dengan simulator interaktif, flashcards, dan tes teknis kami.
Membangun Pipeline Scikit-Learn
Pipeline Scikit-Learn merupakan konsep sentral untuk membangun alur kerja machine learning yang reprodusibel dan siap produksi. Sebuah pipeline merangkai langkah-langkah preprocessing dan model ke dalam satu objek tunggal -- hal ini mencegah data leakage, menyederhanakan proses hyperparameter tuning, dan memungkinkan serialisasi yang bersih untuk deployment ke lingkungan produksi.
Hal kritis yang perlu diperhatikan: pemisahan data train-test harus dilakukan sebelum preprocessing apa pun. Parameter skalasi (mean, standard deviation) hanya boleh dihitung pada data training, tidak pernah pada data test. Pipeline menegakkan pemisahan ini secara otomatis. Pemahaman lebih lanjut tentang supervised learning dan klasifikasi dapat membantu dalam memahami algoritma GradientBoosting yang digunakan.
# sklearn_pipeline.py
from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.metrics import classification_report
import pandas as pd
# Define column groups
numeric_features = ["salary", "experience_years", "salary_ratio", "tenure_days"]
categorical_features = ["department", "role_level"]
target = "promoted"
# Split before any preprocessing
X = df_features[numeric_features + categorical_features]
y = df_features[target]
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42, stratify=y
)
# Build the preprocessing + model pipeline
preprocessor = ColumnTransformer(
transformers=[
("num", StandardScaler(), numeric_features), # Scale numeric columns
("cat", OneHotEncoder(handle_unknown="ignore"), categorical_features), # Encode categories
]
)
pipeline = Pipeline([
("preprocessor", preprocessor),
("classifier", GradientBoostingClassifier(
n_estimators=200,
learning_rate=0.1,
max_depth=4,
random_state=42,
)),
])
# Train and evaluate
pipeline.fit(X_train, y_train)
y_pred = pipeline.predict(X_test)
print(classification_report(y_test, y_pred))ColumnTransformer memungkinkan pendefinisian langkah-langkah preprocessing yang berbeda untuk kolom numerik dan kategoris. StandardScaler menormalisasi fitur numerik ke mean 0 dan standard deviation 1. OneHotEncoder(handle_unknown="ignore") mengubah nilai kategoris menjadi kolom biner dan menangani kategori baru yang muncul di data test secara aman. Meskipun GradientBoostingClassifier cukup robust terhadap fitur yang belum diskalasi, keberadaan StandardScaler dalam pipeline memudahkan penggantian model ke model linear atau SVM di kemudian hari tanpa perubahan signifikan.
Cross-Validation dan Hyperparameter Tuning
Satu kali pembagian train-test saja memberikan estimasi kualitas model yang terlalu bervariasi. Cross-validation membagi data ke dalam beberapa fold dan merata-ratakan hasilnya -- sehingga menghasilkan estimasi yang lebih stabil terhadap kemampuan generalisasi model. Selanjutnya, GridSearchCV mengoptimasi hyperparameter model secara sistematis menggunakan mekanisme cross-validation yang sama. Pembahasan lebih komprehensif tentang algoritma machine learning dapat ditemukan di artikel Algoritma Machine Learning Dijelaskan.
# sklearn_tuning.py
from sklearn.model_selection import cross_val_score, GridSearchCV
import numpy as np
# 5-fold cross-validation on the full pipeline
scores = cross_val_score(pipeline, X_train, y_train, cv=5, scoring="f1")
print(f"F1 scores: {scores}")
print(f"Mean F1: {scores.mean():.3f} (+/- {scores.std() * 2:.3f})")
# Grid search over hyperparameters
param_grid = {
"classifier__n_estimators": [100, 200, 300],
"classifier__max_depth": [3, 4, 5],
"classifier__learning_rate": [0.05, 0.1, 0.2],
}
grid_search = GridSearchCV(
pipeline,
param_grid,
cv=5,
scoring="f1",
n_jobs=-1, # Use all CPU cores
verbose=1,
)
grid_search.fit(X_train, y_train)
print(f"Best params: {grid_search.best_params_}")
print(f"Best F1: {grid_search.best_score_:.3f}")
# Evaluate the best model on held-out test set
best_model = grid_search.best_estimator_
print(classification_report(y_test, best_model.predict(X_test)))Notasi garis bawah ganda pada "classifier__n_estimators" merupakan konvensi Scikit-Learn untuk mengakses parameter pada langkah pipeline yang bersarang: classifier adalah nama langkah pipeline, sedangkan n_estimators adalah parameter dari estimator di dalamnya. Pengaturan n_jobs=-1 memanfaatkan seluruh inti CPU yang tersedia dan mempercepat proses pencarian secara signifikan -- pada grid berukuran 3x3x3 kombinasi dengan 5-fold CV, total 135 model akan dilatih.
Kesalahan paling umum saat melakukan cross-validation dengan preprocessing adalah menghitung parameter skalasi pada seluruh dataset training sebelum pembagian fold dilakukan. Hal ini menghasilkan estimasi performa yang terlalu optimistis, karena data validasi secara tidak langsung mempengaruhi proses skalasi. Pipeline Scikit-Learn menyelesaikan masalah ini secara otomatis: di dalam setiap fold, seluruh langkah preprocessing hanya di-fit pada fold training yang bersangkutan.
Menyimpan dan Memuat Model untuk Produksi
Sebuah model yang telah dilatih hanya memiliki nilai praktis jika dapat disimpan secara persisten dan dimuat kembali di lingkungan lain -- server web, proses batch, maupun microservice. Pipeline Scikit-Learn dapat diserialisasi secara lengkap: parameter preprocessing (mean dari scaler, kategori dari encoder) beserta bobot model disimpan dalam satu file tunggal. Untuk pemahaman menyeluruh mengenai lanskap teknologi Data Science, tersedia berbagai jalur pembelajaran yang dapat diikuti.
# sklearn_export.py
import joblib
from pathlib import Path
# Save the complete pipeline (preprocessor + model)
model_dir = Path("models")
model_dir.mkdir(exist_ok=True)
joblib.dump(best_model, model_dir / "promotion_model_v1.joblib")
# Load and predict in a different process
loaded_model = joblib.load(model_dir / "promotion_model_v1.joblib")
new_data = pd.DataFrame({
"salary": [75000],
"experience_years": [4],
"salary_ratio": [1.05],
"tenure_days": [730],
"department": ["Engineering"],
"role_level": ["Mid"],
})
prediction = loaded_model.predict(new_data)
probability = loaded_model.predict_proba(new_data)[:, 1]
print(f"Promoted: {bool(prediction[0])}, Confidence: {probability[0]:.2%}")joblib dioptimasi untuk array numerik dibandingkan pickle dan jauh lebih cepat pada model berukuran besar. Hal penting yang perlu diperhatikan: file .joblib menyimpan seluruh parameter scaler dan dictionary encoder -- saat dimuat di proses lain, tidak perlu lagi memproses ulang data training. Metode predict_proba() mengembalikan probabilitas untuk setiap kelas; slice [:, 1] mengekstrak probabilitas untuk kelas positif (dipromosikan), yang dalam praktiknya lebih informatif dibandingkan prediksi biner semata.
Kesimpulan
NumPy, Pandas, dan Scikit-Learn saling melengkapi secara mulus dalam ekosistem data science Python:
- NumPy menyediakan operasi matriks dan array sebagai fondasi komputasi numerik -- dari aritmetika tervektorisasi hingga Boolean Indexing dan broadcasting.
- Pandas membangun di atas NumPy dan menghadirkan manipulasi data tabular yang fleksibel dengan kolom bernama, indeks, serta kemampuan GroupBy untuk agregasi dan feature engineering.
- Scikit-Learn memanfaatkan keduanya sebagai format input dan menyediakan pipeline yang menggabungkan preprocessing dan model dalam satu objek -- mencegah data leakage dan menyederhanakan deployment.
- Alur kerja yang ditunjukkan dalam artikel ini -- memuat dan membersihkan data, melakukan feature engineering, membangun pipeline, melakukan cross-validation, serta menyimpan model -- bukan sekadar konstruksi akademis, melainkan standar yang diterapkan di tim data science profesional.
Bagi yang ingin memperdalam pemahaman tentang algoritma di balik pustaka-pustaka ini, SharpSkill menyediakan latihan khusus untuk Feature Engineering dan Supervised Classification. Penguasaan ketiga pustaka ini membuka jalan menuju framework yang lebih kompleks seperti PyTorch atau XGBoost -- karena konvensi API mereka dibangun di atas prinsip dasar yang sama.
Mulai berlatih!
Uji pengetahuan Anda dengan simulator wawancara dan tes teknis kami.
Tag
Bagikan
Artikel terkait

Algoritma Machine Learning untuk Wawancara Teknis: Panduan Lengkap 2026
Panduan komprehensif algoritma machine learning untuk persiapan wawancara teknis: supervised learning, ensemble methods, clustering, evaluasi model, dan regularisasi dengan contoh kode Python.

25 Pertanyaan Wawancara Data Science Teratas di 2026
Pertanyaan wawancara data science mencakup statistika, machine learning, rekayasa fitur, deep learning, SQL, dan desain sistem — dengan contoh kode Python dan jawaban mendalam untuk tahun 2026.