Pandas & NumPy Academy · Pelajaran

Interpolasi dan Imputasi Lanjutan

Gunakan interpolate() untuk pengisian berbasis waktu yang mulus dan pahami kapan imputasi dengan rata-rata atau median lebih tepat.

Pelajaran 4 dari 413 langkah

Interpolasi dan Imputasi Lanjutan adalah pelajaran Pandas & NumPy Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Pandas & NumPy Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Pandas & NumPy Academy mencakup 4 pelajaran total.

Kapan Interpolasi Lebih Baik daripada fillna()

Forward fill dan backward fill meneruskan nilai terdekat yang diketahui tanpa mempertimbangkan tren data. Interpolasi memperkirakan nilai yang hilang dengan mengasumsikan adanya perubahan yang mulus antara nilai-nilai yang diketahui — misalnya, jika suhu 20°C pada hari Senin dan 30°C pada hari Jumat, interpolasi memperkirakan suhu 25°C pada hari Rabu. Metode ini menghasilkan imputasi yang lebih realistis untuk sinyal yang berubah secara bertahap, seperti data sensor, harga, atau jumlah penduduk.

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'day': [1, 2, 3, 4, 5],
    'temp': [20.0, np.nan, np.nan, np.nan, 30.0]
})

# Linear interpolation fills gaps smoothly
df['temp_interp'] = df['temp'].interpolate(method='linear')
print(df)
#    day  temp  temp_interp
# 0    1  20.0         20.0
# 1    2   NaN         22.5
# 2    3   NaN         25.0
# 3    4   NaN         27.5
# 4    5  30.0         30.0

Metode interpolate()

Pandas interpolate() mendukung beberapa metode. Yang paling umum adalah 'linear' (berjarak sama di antara nilai yang diketahui), 'time' (memperhitungkan jeda waktu yang tidak sama ketika DatetimeIndex ditetapkan), 'polynomial' (menyesuaikan kurva polinomial dan memerlukan argumen order), serta 'spline' (polinomial bagian demi bagian yang mulus). Linear adalah bawaan yang paling aman; metode berorde lebih tinggi dapat terlalu menyesuaikan celah kecil.

import pandas as pd
import numpy as np

s = pd.Series([0, np.nan, np.nan, 8.0])

print('linear:', s.interpolate('linear').tolist())
# [0.0, 2.6666..., 5.3333..., 8.0]

print('polynomial(2):', s.interpolate('polynomial', order=2).tolist())
# [0.0, 2.222..., 5.111..., 8.0]

Interpolasi time dengan DatetimeIndex

Ketika Series Anda memiliki DatetimeIndex dengan jeda waktu yang tidak sama (misalnya, hanya hari kerja dan akhir pekan yang hilang), method='time' melakukan interpolasi secara proporsional terhadap waktu yang benar-benar telah berlalu, bukan hanya berdasarkan posisi. Metode ini lebih akurat daripada interpolasi linear, yang menganggap setiap baris memiliki jarak yang sama tanpa memedulikan jeda kalender.

import pandas as pd
import numpy as np

# Unequal gaps: Jan 1, Jan 3, Jan 10
idx = pd.to_datetime(['2024-01-01', '2024-01-03', '2024-01-10'])
s = pd.Series([100.0, np.nan, 170.0], index=idx)

# linear treats gaps as equal (position-based)
print(s.interpolate('linear').tolist())  # [100.0, 135.0, 170.0]

# time accounts for actual day count
# Jan 1 to Jan 3 = 2 days, Jan 1 to Jan 10 = 9 days
# fraction: 2/9 of the way from 100 to 170
print(s.interpolate('time').tolist())   # [100.0, 115.55..., 170.0]

Membatasi Rentang Interpolasi

Seperti ffill(), interpolate() menerima parameter limit untuk membatasi jumlah posisi NaN berurutan yang diisi. NaN yang tersisa setelah batas tersebut tetap hilang. Ini mencegah interpolasi berjalan melewati celah yang sangat panjang, karena nilai sebenarnya bisa berupa apa saja — celah yang panjang sebaiknya ditandai untuk ditinjau secara manual.

import pandas as pd
import numpy as np

s = pd.Series([1.0, np.nan, np.nan, np.nan, np.nan, 10.0])

# Only fill the first 2 NaN positions
filled = s.interpolate('linear', limit=2)
print(filled.tolist())
# [1.0, 2.8, 4.6, NaN, NaN, 10.0]

Memilih Imputasi Mean atau Median

Imputasi mean dan median sederhana, tetapi memiliki kompromi yang penting. Mean sensitif terhadap pencilan — beberapa nilai yang sangat besar dapat menaikkannya, sehingga mean menjadi pengisi yang buruk untuk distribusi miring ke kanan seperti pendapatan atau harga rumah. Median lebih tahan terhadap pencilan dan merupakan pilihan yang lebih baik untuk kolom yang miring. Gunakan mean hanya jika data Anda kira-kira simetris dan bebas dari pencilan ekstrem.

import pandas as pd
import numpy as np

# Skewed income data with an outlier
income = pd.Series([30000, 35000, 32000, 1_000_000, np.nan])

print('Mean:  ', income.mean())    # ~274000 — pulled by outlier
print('Median:', income.median())  # ~33500 — robust choice

# Prefer median for skewed data
filled = income.fillna(income.median())
print(filled.tolist())
# [30000, 35000, 32000, 1000000, 33500.0]

Konsep Imputasi KNN

Imputasi K-Nearest Neighbour (KNN) mengganti nilai yang hilang dengan mean (atau mean berbobot) dari k baris yang paling mirip, yang diukur berdasarkan jarak pada fitur yang tidak hilang. Ini merupakan strategi multivariat — metode ini menggunakan informasi dari kolom lain untuk menentukan pengisian, sehingga lebih akurat daripada imputasi mean satu kolom ketika fitur-fitur saling berkorelasi.

Scikit-learn KNNImputer terintegrasi langsung dengan array NumPy dan DataFrame Pandas.

import pandas as pd
import numpy as np
from sklearn.impute import KNNImputer

df = pd.DataFrame({
    'age': [25, 35, np.nan, 45],
    'income': [50000, 70000, 60000, np.nan]
})

imputer = KNNImputer(n_neighbors=2)
df_imputed = pd.DataFrame(
    imputer.fit_transform(df),
    columns=df.columns
)
print(df_imputed.round(1))
#     age   income
# 0  25.0  50000.0
# 1  35.0  70000.0
# 2  30.0  60000.0   <- filled from neighbours
# 3  45.0  65000.0   <- filled from neighbours

Imputasi Berganda dengan IterativeImputer

Imputasi berganda merupakan standar emas untuk menangani data yang hilang dalam penelitian statistik. Scikit-learn IterativeImputer menerapkan pendekatan MICE (Multiple Imputation by Chained Equations): metode ini memodelkan setiap kolom yang memiliki nilai hilang sebagai fungsi dari kolom lainnya, lalu mengulangi imputasi hingga nilai-nilainya konvergen. Pendekatan ini menangkap hubungan antarfitur dengan lebih baik daripada strategi satu kolom.

import pandas as pd
import numpy as np
from sklearn.experimental import enable_iterative_imputer  # noqa
from sklearn.impute import IterativeImputer

df = pd.DataFrame({
    'x1': [1, 2, np.nan, 4, 5],
    'x2': [2, np.nan, 6, 8, 10],
    'y':  [3, 5, 7, np.nan, 11]
})

imp = IterativeImputer(max_iter=10, random_state=0)
df_filled = pd.DataFrame(imp.fit_transform(df), columns=df.columns)
print(df_filled.round(2))

Kolom Indikator untuk Data yang Hilang

Daripada menyembunyikan fakta bahwa suatu nilai telah diimputasi, praktik yang baik adalah menambahkan kolom indikator biner yang menandai baris mana yang memiliki nilai hilang sebelum imputasi. Dengan demikian, model berikutnya dapat mempelajari pola nilai yang hilang itu sendiri — terkadang, apakah suatu nilai hilang sama prediktifnya dengan nilai tersebut.

import pandas as pd
import numpy as np

df = pd.DataFrame({'salary': [50000, np.nan, 70000, np.nan, 90000]})

# Add indicator before filling
df['salary_was_missing'] = df['salary'].isna().astype(int)

# Then fill
df['salary'] = df['salary'].fillna(df['salary'].median())
print(df)
#    salary  salary_was_missing
# 0  50000.0                   0
# 1  70000.0                   1
# 2  70000.0                   0
# 3  70000.0                   1
# 4  90000.0                   0

Imputasi dan Kebocoran Data

Aturan penting dalam alur pembelajaran mesin: hitung statistik imputasi (mean, median, mode) hanya pada kumpulan data latih, lalu terapkan nilai yang sama pada kumpulan data uji. Menghitung statistik pada seluruh kumpulan data sebelum membaginya menyebabkan kebocoran data — model secara tidak langsung melihat data uji selama pelatihan, sehingga perkiraan kinerja menjadi terlalu tinggi. Selalu sesuaikan imputers pada data latih dan lakukan transformasi pada data latih maupun data uji.

import pandas as pd
import numpy as np
from sklearn.impute import SimpleImputer
from sklearn.model_selection import train_test_split

df = pd.DataFrame({'feature': [1, 2, np.nan, 4, np.nan, 6, 7, 8]})
train, test = train_test_split(df, test_size=0.25, random_state=0)

# Fit ONLY on training data
imp = SimpleImputer(strategy='mean')
train['feature'] = imp.fit_transform(train[['feature']])

# Transform test using training statistics
test['feature'] = imp.transform(test[['feature']])
print('Train mean used:', imp.statistics_[0])

Membandingkan Strategi Imputasi Secara Visual

Setelah menerapkan beberapa metode imputasi, bandingkan dampaknya dengan memplot distribusi kolom asli dan kolom hasil imputasi secara berdampingan. Imputasi yang baik seharusnya mempertahankan bentuk (mean, varians, kemiringan) distribusi asli sedekat mungkin. Imputasi mean mempersempit distribusi; KNN dan MICE cenderung mempertahankannya dengan lebih baik.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

np.random.seed(0)
original = np.random.exponential(scale=5, size=200)
with_nan = original.copy()
with_nan[np.random.choice(200, 40, replace=False)] = np.nan

s = pd.Series(with_nan)

fig, axes = plt.subplots(1, 2, figsize=(10, 4))
s.dropna().hist(ax=axes[0], bins=20, title='Original (no NaN)')
s.fillna(s.mean()).hist(ax=axes[1], bins=20, title='Mean-imputed')
plt.tight_layout()
plt.savefig('imputation_comparison.png')
print('Saved comparison chart')

Memilih Strategi Imputasi yang Tepat

Tidak ada strategi imputasi yang terbaik untuk semua keadaan — pilihan yang tepat bergantung pada konteks. Gunakan mean/median untuk kasus univariat sederhana dengan sedikit nilai yang hilang. Gunakan ffill/bfill untuk deret waktu dengan tren yang stabil. Gunakan KNN atau IterativeImputer ketika fitur saling berkorelasi dan Anda ingin memanfaatkan hubungan tersebut. Gunakan konstanta domain (misalnya, 0 untuk tidak ada, -1 untuk tidak diketahui) ketika nilai yang hilang memiliki makna bisnis yang jelas. Selalu dokumentasikan pilihan Anda.

# Decision guide (no runnable code)
#
# Missing < 5%  AND data is MCAR?  -> Mean/median fill is fine
# Time series with stable trend?   -> ffill() with limit
# Features are correlated?         -> KNNImputer or IterativeImputer
# Categorical column?              -> Mode fill or 'Unknown' sentinel
# Going into ML model?             -> Add indicator column + fill
# Research / publication quality?  -> Multiple imputation (MICE)
print('Strategy selected based on context')

Pemeriksaan Singkat

Uji pemahaman Anda tentang interpolasi dan imputasi tingkat lanjut.

Ringkasan Pelajaran

Dalam pelajaran ini Anda mempelajari bahwa interpolate() memperkirakan nilai yang hilang dengan mengasumsikan tren yang mulus di antara nilai yang diketahui, method='time' menangani jeda DatetimeIndex yang tidak sama, dan strategi tingkat lanjut seperti KNNImputer serta IterativeImputer menggunakan kolom lain untuk menentukan pengisian. Selalu tambahkan kolom indikator sebelum imputasi dan sesuaikan statistik hanya pada kumpulan data latih untuk mencegah kebocoran data. Selanjutnya, kita akan memeriksa dan mengonversi tipe data kolom DataFrame.

Gratis untuk memulai

Belajar Python dengan tutor AI — gratis

Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.

Kursus
30
Pelajaran
120

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Interpolasi dan Imputasi Lanjutan” gratis?

Ya — teks lengkap “Interpolasi dan Imputasi Lanjutan” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Pandas & NumPy Academy, upgrade ke CoddyKit PRO. Kursus Pandas & NumPy Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Interpolasi dan Imputasi Lanjutan”?

Gunakan interpolate() untuk pengisian berbasis waktu yang mulus dan pahami kapan imputasi dengan rata-rata atau median lebih tepat. Kamu berlatih Pandas & NumPy Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Pandas & NumPy Academy?

Tidak diperlukan pengalaman sebelumnya. Pandas & NumPy Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.

Berapa lama pelajaran “Interpolasi dan Imputasi Lanjutan” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Pandas & NumPy Academy ini?

Ya. Setiap pelajaran Pandas & NumPy Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Mendeteksi Nilai yang Hilang
  2. Menghapus Nilai yang Hilang
  3. Mengisi Nilai yang Hilang
  4. Interpolasi dan Imputasi Lanjutan
← Kembali ke Pandas & NumPy Academy