Dalam analisis data, frasa “setelah mengontrol variabel Z” seringkali terdengar seperti sihir statistik. Bagaimana mungkin kita bisa secara matematis “menjaga sesuatu tetap konstan” pada dataset yang sudah dikumpulkan? Apakah kita memanipasi data? Ataukah ini sebuah ‘kotak hitam’ yang hanya bisa kita percayai outputnya? Kebingungan ini seringkali membuat analis ragu untuk menggunakan salah satu alat paling kuat untuk mendekati hubungan sebab-akibat: korelasi parsial.
Dalam artikel ini, kita akan membongkar kotak hitam tersebut. Kita akan belajar bahwa di balik konsep yang terdengar rumit ini terdapat sebuah ide yang sangat intuitif: ‘korelasi dari sisa-sisa’ (residual). Melalui panduan langkah-demi-langkah dengan Python, kita akan membangun korelasi parsial dari nol dan membuktikan bahwa kita tidak perlu menjadi seorang ahli statistik untuk benar-benar memahami cara kerjanya.
Skenario Masalah: Hubungan yang Membingungkan
Mari kita mulai dengan sebuah skenario klasik dari analisis HR. Kita ingin memahami hubungan antara pengalaman_kerja
dan gaji_juta_rp
. Kita curiga bahwa pendidikan_tahun
mungkin menjadi variabel perancu (confounder), yaitu variabel yang memengaruhi baik pengalaman maupun gaji, sehingga mengaburkan hubungan asli di antara keduanya.
Pertama, mari kita siapkan data simulasi.
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import statsmodels.api as sm
import pingouin as pg
# Simulasi data
np.random.seed(42)
n_karyawan = 150
pendidikan_tahun = np.random.randint(12, 19, size=n_karyawan)
pengalaman_kerja = -0.5 * pendidikan_tahun + np.random.normal(loc=15, scale=3, size=n_karyawan)
pengalaman_kerja = np.clip(pengalaman_kerja, 1, 25).round(1)
gaji_juta_rp = (2.5 * pendidikan_tahun) + (0.2 * pengalaman_kerja) + np.random.normal(loc=5, scale=2, size=n_karyawan)
gaji_juta_rp = np.clip(gaji_juta_rp, 10, 80).round(1)
df = pd.DataFrame({
'pengalaman_kerja': pengalaman_kerja,
'pendidikan_tahun': pendidikan_tahun,
'gaji_juta_rp': gaji_juta_rp
})
df.head()

Memahami Masalah dengan Analogi
Bayangkan kita sedang mencoba mendengarkan stasiun radio musik klasik yang siarannya lemah (ini adalah hubungan murni antara pengalaman_kerja
dan gaji_juta_rp
). Masalahnya, ada stasiun berita lokal yang sangat kuat dan bising (pendidikan_tahun
) yang frekuensinya berdekatan.
Stasiun berita yang bising ini menyebabkan dua masalah:
- Suaranya bocor dan mengganggu siaran musik kita, membuatnya terdengar lebih keras dari yang sebenarnya. (Pengaruh
pendidikan
padagaji
). - Dengungannya juga mengganggu sinyal lain di sekitarnya, termasuk kebisingan latar belakang yang kita kira adalah kesunyian. (Pengaruh
pendidikan
padapengalaman_kerja
).
Jika kita langsung menilai kerasnya suara musik, kesimpulan kita akan salah karena tercampur oleh suara berita. Tugas kita sebagai analis adalah menjadi seorang teknisi audio: kita harus menyaring (filter) semua suara bising yang berasal dari stasiun berita dari sinyal musik kita. Apa yang tersisa setelah penyaringan itulah “suara musik yang sebenarnya”.
Dalam statistik, “menyaring kebisingan” ini persis apa yang kita lakukan saat kita menghitung residual.
Korelasi Sederhana: Pandangan yang Menyesatkan
Sekarang mari kita buktikan analogi tadi dengan data. Langkah pertama yang biasa dilakukan adalah menghitung matriks korelasi sederhana (bivariate).
### ---- Matriks Korelasi Bivariate (Sederhana): ---- ####
df.corr()

Dari matriks di atas, kita melihat korelasi negatif yang sangat lemah ($r = -0.142$) antara pengalaman_kerja
dan gaji_juta_rp
. Ini adalah “sinyal musik yang tercampur noise”. Jika berhenti di sini, kita bisa salah menyimpulkan bahwa pengalaman kerja justru sedikit menurunkan gaji, sebuah kesimpulan yang aneh.
Mari kita lihat visualisasinya.
plt.figure(figsize=(10, 6))
sns.scatterplot(data=df, x='pengalaman_kerja', y='gaji_juta_rp', hue='pendidikan_tahun', palette='viridis', alpha=0.8)
plt.title('Hubungan Gaji dan Pengalaman (Diwarnai oleh Pendidikan)', fontsize=16)
plt.xlabel('Pengalaman Kerja (Tahun)', fontsize=12)
plt.ylabel('Gaji (Juta Rupiah)', fontsize=12)
plt.legend(title='Pendidikan (Tahun)')
plt.grid(True, linestyle=':', alpha=0.6)
plt.show()

Perhatikan plot di atas. Secara keseluruhan, tidak ada tren yang jelas terlihat, yang sejalan dengan nilai korelasi yang mendekati nol. Plot ini terlihat seperti awan titik tanpa arah yang pasti. Ini adalah tanda visual klasik dari “gangguan” variabel perancu (pendidikan_tahun
) yang mengaburkan hubungan sebenarnya.
Intuisi Inti: Korelasi dari Sisa-Sisa (Residuals)
Di sinilah letak keindahan korelasi parsial. Idenya sederhana:
Hubungan murni antara Pengalaman dan Gaji (setelah mengontrol Pendidikan) adalah korelasi antara:
- Bagian dari Pengalaman yang tidak bisa dijelaskan oleh Pendidikan.
- Bagian dari Gaji yang juga tidak bisa dijelaskan oleh Pendidikan.
Bagian yang “tidak dapat dijelaskan” inilah yang kita sebut residual atau “sinyal bersih” dalam analogi kita.
Diagram Alur Konseptual
Proses ini dapat divisualisasikan dengan diagram alur sederhana berikut:
flowchart TD %% Mendefinisikan kelas gaya yang konsisten classDef process fill:#4A5568,stroke:#A0AEC0,stroke-width:2px,color:#fff; classDef intermediate fill:#d1ecf1,stroke:#bee5eb,stroke-width:2px,color:#0c5460; classDef result fill:#28a745,stroke:#28a745,stroke-width:2px,color:#fff; %% Mendefinisikan node/titik dalam flowchart A["Pengalaman Kerja (X)"]:::process; B["Pendidikan (Z)"]:::process; D["Gaji (Y)"]:::process; C{"Residual Pengalaman"}:::intermediate; E{"Residual Gaji"}:::intermediate; F("Korelasi Parsial"):::result; %% Menghubungkan semua node A -->|Regresi Linear| C; B --> A; B --> D; D -->|Regresi Linear| E; C -->|Korelasi Pearson| F; E -->|Korelasi Pearson| F;
Implementasi Manual Langkah-demi-Langkah dengan Python
Untuk mendapatkan ‘sisa-sisa’ ini, kita akan menggunakan regresi linear. Ingat, tujuan kita di sini bukan untuk prediksi, tetapi untuk “menyaring noise”.
Langkah 1: “Bersihkan” Pengalaman dari Pengaruh Pendidikan
# Definisikan variabel dependen (X) dan independen/kontrol (Z)
X = df['pengalaman_kerja']
Z = sm.add_constant(df['pendidikan_tahun']) # Tambahkan konstanta untuk intercept
# Lakukan model regresi linear: Pengalaman ~ Pendidikan
model_pengalaman = sm.OLS(X, Z).fit()
# Ambil residualnya dan simpan ke dataframe
df['res_pengalaman'] = model_pengalaman.resid
df.head()

Langkah 2: “Bersihkan” Gaji dari Pengaruh Pendidikan
# Definisikan variabel dependen (Y)
Y = df['gaji_juta_rp']
# Lakukan model regresi linear: Gaji ~ Pendidikan
model_gaji = sm.OLS(Y, Z).fit()
# Ambil residualnya dan simpan ke dataframe
df['res_gaji'] = model_gaji.resid
df.head()

Langkah 3: Korelasikan Kedua Residual
Sekarang kita memiliki dua variabel ‘murni’ yang telah ‘dibersihkan’ dari pengaruh pendidikan. Dengan menghitung korelasi Pearson di antara keduanya, kita sedang mengukur hubungan asli yang tersembunyi.
# Hitung korelasi Pearson sederhana antara kedua residual
korelasi_manual_parsial = df['res_pengalaman'].corr(df['res_gaji'])
print(f"Hasil Korelasi Parsial (Manual dari Residual): r = {korelasi_manual_parsial:.4f}")
Hasil Korelasi Parsial (Manual dari Residual): r = 0.3521
Hasilnya, $r = 0.3521$, menunjukkan hubungan positif yang moderat. Inilah “suara musik asli” kita, yang sangat berbeda dari sinyal awal yang bising dan menyesatkan ($r = -0.142$).
Validasi dengan Library: Jalan Pintas yang Kini Dapat Kita Percayai
Proses manual tadi sangat bagus untuk memahami konsep. Namun dalam praktik, kita menggunakan fungsi yang sudah dioptimalkan seperti pingouin.partial_corr
.
# Hitung korelasi parsial menggunakan library
korelasi_parsial_df = pg.partial_corr(data=df, x='pengalaman_kerja', y='gaji_juta_rp', covar='pendidikan_tahun')
### ---- Hasil Korelasi Parsial (dari Library Pingouin): ------ ####
korelasi_parsial_df

Momen “Aha!”
Perhatikan nilai r
dari output Pingouin: 0.3521. Nilai ini identik dengan hasil perhitungan manual kita. Ini adalah momen pencerahan: hubungan yang awalnya tampak negatif lemah kini terbukti positif dan moderat setelah kita ‘membersihkan’ pengaruh pendidikan. Fenomena di mana variabel ketiga menyembunyikan hubungan asli seperti ini dikenal sebagai efek supresor (suppressor effect).
Praktik Langsung: Unduh Kode Lengkap
Ingin mencoba sendiri analisis ini? Unduh Jupyter Notebook yang berisi seluruh kode.
Ukuran file: 115,3 kB
Menambahkan Dimensi Matematis
Di balik metode residual, terdapat formula matematis yang ringkas untuk korelasi parsial antara variabel X dan Y, dengan mengontrol Z:
$$ r_{XY \cdot Z} = \frac{r_{XY} - r_{XZ}r_{YZ}}{\sqrt{(1 - r_{XZ}^2)(1 - r_{YZ}^2)}} $$Di mana:
- $r_{XY \cdot Z}$ adalah korelasi parsial antara X dan Y, mengontrol Z.
- $r_{XY}$ adalah korelasi sederhana antara X dan Y (sinyal bising).
- $r_{XZ}$ dan $r_{YZ}$ adalah korelasi dari setiap variabel dengan “sumber noise” Z.
Formula ini secara matematis “menghapus” pengaruh Z dari hubungan antara X dan Y, menghasilkan hasil yang sama dengan metode residual kita.
Kesimpulan Akhir: Sihir yang Telah Terungkap
‘Sihir’ di balik ‘mengontrol sebuah variabel’ telah terungkap. Itu bukanlah manipulasi data, melainkan sebuah proses logis untuk mengisolasi informasi relevan dengan menganalisis hubungan antara sisa-sisa varians (residual).
Dengan memahami logika ini, kita tidak hanya dapat menggunakan korelasi parsial dengan lebih percaya diri, tetapi juga membangun fondasi intuisi yang kuat untuk model statistik yang lebih kompleks seperti regresi linear berganda. Kemampuan untuk melihat melampaui korelasi sederhana yang menyesatkan dan mengungkap hubungan murni adalah langkah fundamental menuju analisis data yang lebih jujur dan berdampak.
Perdalam pemahaman Quantitative Anda di sini
Referensi
Field, A., Miles, J., & Field, Z. (2012). Discovering Statistics Using R.SAGE Publications (halaman buku di penerbit).
Seabold, S., & Perktold, J. (2010). Statsmodels: Econometric and statistical modeling with Python. 9th Python in Science Conference.Makalah (SciPy 2010 proceedings PDF).
Vallat, R. (2018). Pingouin: statistics in Python. Journal of Open Source Software.JOSS paper (doi:10.21105/joss.01025)— atau repositori proyek di GitHub.
Penelusuran Terkait
- Partial Correlation: Definition, Formula, and Example - Statistics By Jim
- Partial correlation - Wikipedia
- Partial Correlation and the Logic of Residuals - Towards Data Science
- Suppressor effect in regression: definition and visual explanation - Cross Validated (Stack Exchange)
- pingouin.partial_corr — Pingouin documentation
- statsmodels.regression.linear_model.OLS — Statsmodels documentation
Partial Correlation in Python — Python for Data Science
- How to Calculate Partial Correlation in Python — Statology