Data bersih sudah di tangan; sekarang gilirannya angka. Bagian ini menjawab lima pertanyaan analisis atas 29 karyawan PT Maju Bersama: bagaimana sebaran gaji secara keseluruhan, bagaimana profil tiap departemen, seberapa kuat gaji bergerak bersama masa kerja dan skor kinerja, serta adakah gaji yang menyimpang jauh dari kelompoknya. Setiap contoh pada bagian ini mandiri: dataset bersih hasil Bagian 1 — 29 baris dengan umur P012 terisi 33.5 dan skor P027 terisi 70 — disematkan sebagai teks CSV dan dibaca lewat io.StringIO, sehingga blok mana pun dapat dijalankan tanpa berkas pendamping.

Ringkasan Statistik dengan describe #

Satu panggilan describe() merangkum count, mean, standard deviation, minimum, kuartil, dan maksimum untuk seluruh kolom numerik sekaligus — kebiasaan pembuka analisis yang diperkenalkan pada chapter Analisis Data dengan pandas. Tabel di bawah adalah versi dibulatkan dua desimal:

python
import pandas as pd
import io

csv_bersih = """id,nama,departemen,umur,masa_kerja,gaji,skor_kinerja
P001,Budi Santoso,Produksi,34,6,11.5,79
P002,Agus Wijaya,Produksi,28,3,9.4,74
P003,Joko Prasetyo,Produksi,41,12,14.6,81
P004,Tono Hartono,Produksi,25,1,8.0,70
P005,Eko Saputra,Produksi,38,9,13.5,83
P006,Hendra Gunawan,Produksi,31,5,10.8,77
P007,Udin Samsudin,Produksi,46,16,16.2,80
P008,Wahyu Nugroho,Produksi,52,20,18.8,85
P009,Yanto Kurniawan,Produksi,24,2,8.7,72
P010,Siti Rahmawati,Keuangan,35,8,12.0,76
P011,Dewi Lestari,Keuangan,29,4,9.8,73
P012,Rina Marlina,Keuangan,33.5,6,11.0,75
P013,Fajar Ramadhan,Keuangan,42,14,15.0,78
P014,Indra Maulana,Keuangan,33,7,11.2,74
P015,Prakasa Wibowo,Keuangan,56,22,45.0,88
P016,Maya Anggraini,Pemasaran,30,5,12.3,86
P017,Rian Hidayat,Pemasaran,27,3,11.0,84
P018,Gita Permata,Pemasaran,36,10,14.8,89
P019,Nanda Pratama,Pemasaran,32,7,13.2,87
P020,Citra Kirana,Pemasaran,26,2,10.2,82
P021,Bayu Setiawan,Pemasaran,39,13,16.4,90
P022,Laila Sari,Pemasaran,30,6,12.4,85
P023,Oka Mahendra,Pemasaran,44,18,18.8,91
P024,Tuti Handayani,SDM,37,9,11.7,71
P025,Yuni Astuti,SDM,28,3,8.5,68
P026,Putri Ayu,SDM,33,6,10.2,70
P027,Dedi Kurnia,SDM,40,11,12.4,70
P028,Wawan Susanto,SDM,45,15,14.7,73
P029,Sari Wulandari,SDM,26,1,7.5,67
"""

df = pd.read_csv(io.StringIO(csv_bersih))

print("ringkasan dataset bersih (29 baris):")
print(df[["umur", "masa_kerja", "gaji", "skor_kinerja"]].describe().round(2))
print()
print(f"mean gaji   : {df['gaji'].mean():.2f} juta")
print(f"median gaji : {df['gaji'].median():.2f} juta")

Output yang Dihasilkan:

text
ringkasan dataset bersih (29 baris):
        umur  masa_kerja   gaji  skor_kinerja
count  29.00       29.00  29.00         29.00
mean   35.19        8.41  13.43         78.55
std     8.10        5.78   6.75          7.20
min    24.00        1.00   7.50         67.00
25%    29.00        4.00  10.20         73.00
50%    33.50        7.00  12.00         78.00
75%    40.00       12.00  14.70         85.00
max    56.00       22.00  45.00         91.00

mean gaji   : 13.43 juta
median gaji : 12.00 juta

Tiga hal layak digarisbawahi dari tabel tersebut:

  1. count seragam 29.00: bukti langsung bahwa pembersihan Bagian 1 berhasil — tidak ada lagi sel kosong pada kolom numerik.
  2. Gaji condong ke kanan: mean 13.43 juta melampaui median 12.00 juta dengan selisih 1.43. Pada sebaran simetris keduanya hampir sama; mean yang lebih tinggi menandakan beberapa nilai besar menarik rata-rata ke atas — dugaan yang akan dikonfirmasi pada bagian z-score.
  3. Skor kinerja hampir simetris: mean 78.55 dan median 78.00 hanya berselisih setengah poin, dengan rentang 67 sampai 91. Kolom umur juga condong ringan (mean 35.19 di atas median 33.50), sementara masa_kerja membentang dari 1 sampai 22 tahun.

Statistik per Departemen #

Pertanyaan kedua membandingkan kelompok. Pola split-apply-combine dari groupby membagi 29 baris menurut departemen, menghitung rata-rata, lalu menggabungkan hasilnya — plus size() untuk mengetahui banyaknya anggota tiap kelompok:

python
import pandas as pd
import io

csv_bersih = """id,nama,departemen,umur,masa_kerja,gaji,skor_kinerja
P001,Budi Santoso,Produksi,34,6,11.5,79
P002,Agus Wijaya,Produksi,28,3,9.4,74
P003,Joko Prasetyo,Produksi,41,12,14.6,81
P004,Tono Hartono,Produksi,25,1,8.0,70
P005,Eko Saputra,Produksi,38,9,13.5,83
P006,Hendra Gunawan,Produksi,31,5,10.8,77
P007,Udin Samsudin,Produksi,46,16,16.2,80
P008,Wahyu Nugroho,Produksi,52,20,18.8,85
P009,Yanto Kurniawan,Produksi,24,2,8.7,72
P010,Siti Rahmawati,Keuangan,35,8,12.0,76
P011,Dewi Lestari,Keuangan,29,4,9.8,73
P012,Rina Marlina,Keuangan,33.5,6,11.0,75
P013,Fajar Ramadhan,Keuangan,42,14,15.0,78
P014,Indra Maulana,Keuangan,33,7,11.2,74
P015,Prakasa Wibowo,Keuangan,56,22,45.0,88
P016,Maya Anggraini,Pemasaran,30,5,12.3,86
P017,Rian Hidayat,Pemasaran,27,3,11.0,84
P018,Gita Permata,Pemasaran,36,10,14.8,89
P019,Nanda Pratama,Pemasaran,32,7,13.2,87
P020,Citra Kirana,Pemasaran,26,2,10.2,82
P021,Bayu Setiawan,Pemasaran,39,13,16.4,90
P022,Laila Sari,Pemasaran,30,6,12.4,85
P023,Oka Mahendra,Pemasaran,44,18,18.8,91
P024,Tuti Handayani,SDM,37,9,11.7,71
P025,Yuni Astuti,SDM,28,3,8.5,68
P026,Putri Ayu,SDM,33,6,10.2,70
P027,Dedi Kurnia,SDM,40,11,12.4,70
P028,Wawan Susanto,SDM,45,15,14.7,73
P029,Sari Wulandari,SDM,26,1,7.5,67
"""

df = pd.read_csv(io.StringIO(csv_bersih))

print("rata-rata per departemen:")
print(df.groupby("departemen")[["umur", "gaji", "skor_kinerja"]].mean().round(2))
print()
print("jumlah karyawan per departemen:")
print(df.groupby("departemen").size())

Output yang Dihasilkan:

text
rata-rata per departemen:
             umur   gaji  skor_kinerja
departemen                            
Keuangan    38.08  17.33         77.33
Pemasaran   33.00  13.64         86.75
Produksi    35.44  12.39         77.89
SDM         34.83  10.83         69.83

jumlah karyawan per departemen:
departemen
Keuangan     6
Pemasaran    8
Produksi     9
SDM          6
dtype: int64

Tabel agregasi tersebut menyimpan cerita paling penting proyek ini:

  1. Skor kinerja Pemasaran tertinggi: 86.75 — unggul 16.92 poin atas SDM yang berada di dasar tabel dengan 69.83. Produksi (77.89) dan Keuangan (77.33) nyaris berimpit di tengah. Pertanyaan “mengapa berbeda” tidak dapat dijawab tabel ini; itu urusan Bagian 4.
  2. Rata-rata gaji Keuangan tampak tertinggi (17.33 juta) — namun menyesatkan bila dibaca sendirian: nanti kita buktikan bahwa angka ini dinaikkan oleh satu gaji direktur 45.0 juta, sementara separuh karyawan Keuangan justru berpengaji di bawah 11.60 juta. Bandingkan dengan SDM yang justru paling rendah (10.83 juta).
  3. Kelompok kecil: masing-masing departemen hanya beranggotakan 6-9 orang. Rata-rata dari kelompok sekecil itu mudah berubah bila beberapa baris berubah — keterbatasan yang kita bawa sepanjang sisa proyek.
  4. Umur paling senior di Keuangan (38.08 tahun) dan termuda di Pemasaran (33.00 tahun) — pola yang wajar mengingat masa kerja rata-ratanya juga mengikuti urutan serupa.

Korelasi Gaji, Masa Kerja, dan Skor Kinerja #

Bergerak dari deskripsi ke hubungan: apakah gaji naik bersama masa kerja? Apakah gaji mengikuti skor kinerja? Korelasi Pearson menjawab dengan satu angka antara −1 dan +1. Method corr() pada DataFrame menghitungnya untuk semua pasangan kolom numerik sekaligus dalam bentuk matriks:

python
import pandas as pd
import io

csv_bersih = """id,nama,departemen,umur,masa_kerja,gaji,skor_kinerja
P001,Budi Santoso,Produksi,34,6,11.5,79
P002,Agus Wijaya,Produksi,28,3,9.4,74
P003,Joko Prasetyo,Produksi,41,12,14.6,81
P004,Tono Hartono,Produksi,25,1,8.0,70
P005,Eko Saputra,Produksi,38,9,13.5,83
P006,Hendra Gunawan,Produksi,31,5,10.8,77
P007,Udin Samsudin,Produksi,46,16,16.2,80
P008,Wahyu Nugroho,Produksi,52,20,18.8,85
P009,Yanto Kurniawan,Produksi,24,2,8.7,72
P010,Siti Rahmawati,Keuangan,35,8,12.0,76
P011,Dewi Lestari,Keuangan,29,4,9.8,73
P012,Rina Marlina,Keuangan,33.5,6,11.0,75
P013,Fajar Ramadhan,Keuangan,42,14,15.0,78
P014,Indra Maulana,Keuangan,33,7,11.2,74
P015,Prakasa Wibowo,Keuangan,56,22,45.0,88
P016,Maya Anggraini,Pemasaran,30,5,12.3,86
P017,Rian Hidayat,Pemasaran,27,3,11.0,84
P018,Gita Permata,Pemasaran,36,10,14.8,89
P019,Nanda Pratama,Pemasaran,32,7,13.2,87
P020,Citra Kirana,Pemasaran,26,2,10.2,82
P021,Bayu Setiawan,Pemasaran,39,13,16.4,90
P022,Laila Sari,Pemasaran,30,6,12.4,85
P023,Oka Mahendra,Pemasaran,44,18,18.8,91
P024,Tuti Handayani,SDM,37,9,11.7,71
P025,Yuni Astuti,SDM,28,3,8.5,68
P026,Putri Ayu,SDM,33,6,10.2,70
P027,Dedi Kurnia,SDM,40,11,12.4,70
P028,Wawan Susanto,SDM,45,15,14.7,73
P029,Sari Wulandari,SDM,26,1,7.5,67
"""

df = pd.read_csv(io.StringIO(csv_bersih))

matriks = df[["masa_kerja", "gaji", "skor_kinerja"]].corr().round(3)
print("matriks korelasi Pearson:")
print(matriks)
print()
print("r gaji-masa_kerja  :", f"{matriks.loc['gaji', 'masa_kerja']:.3f}")
print("r gaji-skor_kinerja:", f"{matriks.loc['gaji', 'skor_kinerja']:.3f}")

Output yang Dihasilkan:

text
matriks korelasi Pearson:
              masa_kerja   gaji  skor_kinerja
masa_kerja         1.000  0.775         0.498
gaji               0.775  1.000         0.527
skor_kinerja       0.498  0.527         1.000

r gaji-masa_kerja  : 0.775
r gaji-skor_kinerja: 0.527

Matriks dibaca dengan baris-tetak-kolom: nilai pada baris gaji, kolom masa_kerja adalah r antara keduanya. Matriks selalu simetris dengan diagonal 1.000 — korelasi sebuah variabel dengan dirinya sendiri. Pedoman kekuatan hubungan linear yang lazim (dari chapter Korelasi): 0.30-0.50 sedang, 0.50-0.70 kuat, 0.70-1.00 sangat kuat. Tiga pasangan yang penting bagi proyek:

PasanganrKekuatan hubungan
gaji dan masa_kerja0.775sangat kuat
gaji dan skor_kinerja0.527kuat
masa_kerja dan skor_kinerja0.498sedang

Gaji bergerak paling erat bersama masa kerja — pola senioritas yang wajar pada struktur gaji — dan lebih longgar bersama skor kinerja. Perlu dicatat pula bahwa masa kerja dan skor sendiri berkorelasi 0.498, sehingga keduanya membawa informasi yang bertumpang tindih: karyawan berkinerja tinggi cenderung juga lebih lama bekerja. Korelasi hanya mengukur kekuatan hubungan linear — r 0.775 tidak berarti setiap tambahan masa kerja menaikkan gaji dengan jumlah tetap; bentuk hubungannya kita lihat sebagai scatter plot pada Bagian 3.

Outlier Gaji dengan z-score #

Pertanyaan terakhir: adakah gaji yang menyimpang jauh? z-score menjawabnya dengan mengukur jarak tiap gaji ke mean dalam satuan standard deviation — rumus yang diperkenalkan pada chapter Standar Deviasi:

text
z = (x − mean) / std

Konvensi pembacaan yang umum: nilai |z| di atas 2 menandai data yang layak diperiksa. Kita hitung z untuk seluruh 29 gaji (std memakai versi sampel, konsisten dengan describe()):

python
import pandas as pd
import io

csv_bersih = """id,nama,departemen,umur,masa_kerja,gaji,skor_kinerja
P001,Budi Santoso,Produksi,34,6,11.5,79
P002,Agus Wijaya,Produksi,28,3,9.4,74
P003,Joko Prasetyo,Produksi,41,12,14.6,81
P004,Tono Hartono,Produksi,25,1,8.0,70
P005,Eko Saputra,Produksi,38,9,13.5,83
P006,Hendra Gunawan,Produksi,31,5,10.8,77
P007,Udin Samsudin,Produksi,46,16,16.2,80
P008,Wahyu Nugroho,Produksi,52,20,18.8,85
P009,Yanto Kurniawan,Produksi,24,2,8.7,72
P010,Siti Rahmawati,Keuangan,35,8,12.0,76
P011,Dewi Lestari,Keuangan,29,4,9.8,73
P012,Rina Marlina,Keuangan,33.5,6,11.0,75
P013,Fajar Ramadhan,Keuangan,42,14,15.0,78
P014,Indra Maulana,Keuangan,33,7,11.2,74
P015,Prakasa Wibowo,Keuangan,56,22,45.0,88
P016,Maya Anggraini,Pemasaran,30,5,12.3,86
P017,Rian Hidayat,Pemasaran,27,3,11.0,84
P018,Gita Permata,Pemasaran,36,10,14.8,89
P019,Nanda Pratama,Pemasaran,32,7,13.2,87
P020,Citra Kirana,Pemasaran,26,2,10.2,82
P021,Bayu Setiawan,Pemasaran,39,13,16.4,90
P022,Laila Sari,Pemasaran,30,6,12.4,85
P023,Oka Mahendra,Pemasaran,44,18,18.8,91
P024,Tuti Handayani,SDM,37,9,11.7,71
P025,Yuni Astuti,SDM,28,3,8.5,68
P026,Putri Ayu,SDM,33,6,10.2,70
P027,Dedi Kurnia,SDM,40,11,12.4,70
P028,Wawan Susanto,SDM,45,15,14.7,73
P029,Sari Wulandari,SDM,26,1,7.5,67
"""

df = pd.read_csv(io.StringIO(csv_bersih))

mean_gaji = df["gaji"].mean()
std_gaji = df["gaji"].std(ddof=1)
df["z_gaji"] = ((df["gaji"] - mean_gaji) / std_gaji).round(2)

print(f"mean gaji = {mean_gaji:.2f} juta | std gaji = {std_gaji:.2f} juta")
print()
print("karyawan dengan |z| > 2 :")
print(df.loc[df["z_gaji"].abs() > 2, ["id", "nama", "departemen", "gaji", "z_gaji"]].to_string(index=False))
print()
print("jumlah karyawan |z| > 2 :", int((df["z_gaji"].abs() > 2).sum()))
print("nilai |z| tertinggi kedua:", df["z_gaji"].abs().nlargest(2).tolist()[1])

Output yang Dihasilkan:

text
mean gaji = 13.43 juta | std gaji = 6.75 juta

karyawan dengan |z| > 2 :
  id           nama departemen  gaji  z_gaji
P015 Prakasa Wibowo   Keuangan  45.0    4.68

jumlah karyawan |z| > 2 : 1
nilai |z| tertinggi kedua: 0.88

Hasilnya tunggal dan tegas. Prakasa Wibowo (P015) memiliki gaji 45.0 juta — 4.68 standard deviation di atas rata-rata — sementara |z| tertinggi kedua hanya 0.88 (gaji terendah, 7.5 juta milik P029). Tidak ada nilai di antara keduanya yang mendekati ambang 2, sehingga P015 adalah satu-satunya outlier gaji, terpisah jauh dari 28 karyawan lainnya. Namanya, usianya (56 tahun), dan masa kerjanya (22 tahun) mengesankan jabatan pimpinan — gaji direktur yang wajar secara bisnis, bukan galat pencatatan. Keputusan kita: data ini sah dan tidak dibuang; konsekuensinya (mean Keuangan menggelembung menjadi 17.33 juta) kita kelola dengan melaporkan median berdampingan — persis praktik mean lawan median pada chapter Mean dan Median.

Tabel Ringkasan Temuan #

Lima pertanyaan awal bagian ini telah terjawab dengan angka yang dapat diverifikasi ulang:

PertanyaanTemuanAngka kunci
Bagaimana sebaran gaji?condong ke kananmean 13.43, median 12.00, std 6.75 (juta)
Bagaimana tiap departemen?skor Pemasaran tertinggi, SDM terendah86.75 lawan 69.83
Apakah gaji mengikuti masa kerja?ya, hubungan linear sangat kuatr = 0.775
Apakah gaji mengikuti skor kinerja?ya, kuat namun lebih lemahr = 0.527
Adakah outlier gaji?satu, dan valid secara bisnisP015: 45.0 juta, z = 4.68

Angka-angka ini menjawab “berapa”, tetapi belum “seperti apa bentuknya dan mengapa begitu”. Dokumentasi pandas untuk describe, groupby, dan corr dapat ditelusuri di pandas.pydata.org , dan pedoman resmi ringkasan data beserta deteksi pencilan dirangkum dalam NIST/SEMATECH e-Handbook . Bagian 3 menggambar bentuk di balik angka-angka tersebut: histogram, box plot, scatter plot, dan diagram batang — semuanya dari dataset yang sama.