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()
Skenario klasik dari analisis HR

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:

  1. Suaranya bocor dan mengganggu siaran musik kita, membuatnya terdengar lebih keras dari yang sebenarnya. (Pengaruh pendidikan pada gaji).
  2. Dengungannya juga mengganggu sinyal lain di sekitarnya, termasuk kebisingan latar belakang yang kita kira adalah kesunyian. (Pengaruh pendidikan pada pengalaman_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()
Korelasi Sederhana: Pandangan yang Menyesatkan

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()
Visualisasi Python Korelasi Sederhana: Pandangan yang Menyesatkan

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:

  1. Bagian dari Pengalaman yang tidak bisa dijelaskan oleh Pendidikan.
  2. 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()
Implementasi Manual Langkah-demi-Langkah dengan Python menggunakan regresi linear

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()
Implementasi Manual Langkah-demi-Langkah dengan Python menggunakan regresi linear

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
Validasi korelasi parsial

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.

Unduh Jupyter Notebook (.ipynb)

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