Tur stack data

Perkenalan numpy, pandas, dan matplotlib beserta demo kecilnya.

Daftar isi

Pada titik tertentu, pekerjaan data melampaui yang dapat ditangani list dan dictionary murni, misalnya perhitungan atas ribuan angka, tabel dengan puluhan kolom, atau kebutuhan grafik. Tiga pustaka pihak ketiga membentuk fondasi ekosistem data Python, yaitu numpy untuk array numerik, pandas untuk tabel, dan matplotlib untuk grafik. Topik ini memperkenalkan ketiganya melalui demo kecil yang berurutan, sehingga peran masing-masing pustaka terlihat jelas. Diagram berikut menempatkan ketiganya dalam satu alur, dari sumber data hingga hasil visualnya.

sumber data: berkas CSV, JSON, dan basis data SQLnumpyarray numerikpandastabel DataFramematplotlibgrafik dan diagramarray menjadi tabel, tabel menjadi grafik
Alur data pada stack data Python

numpy: array numerik#

Pustaka numpy (Numerical Python) menyediakan ndarray, yaitu array multidimensi yang seluruh elemennya bertipe sama. Operasi matematika atas array bekerja secara vektor, yang berarti satu ekspresi menerapkan operasi yang sama atas seluruh elemen sekaligus tanpa perulangan eksplisit. Cara kerja inilah yang membuat perhitungan numerik menjadi ringkas ditulis dan cepat dijalankan. Ketiga pustaka pada topik ini bukan bagian dari pustaka standar, dan pemasangannya dilakukan lewat pip dengan python3 -m pip install numpy, sedangkan lingkungan yang dipakai pada jalur ini sudah menyertakannya.

python Contoh: operasi vektor pada array numpy
import numpy as np

tinggi = np.array([165.0, 170.0, 158.0, 172.0, 168.0])
print(tinggi.shape)
print(tinggi.mean())
print(tinggi + 5)
print(tinggi[tinggi > 165])
text Keluaran
(5,)
166.6
[170. 175. 163. 177. 173.]
[170. 172. 168.]

Atribut shape menyatakan bentuk array sebagai tuple, dan mean() menghitung rata-ratanya dalam satu pemanggilan. Tipe seluruh elemen tersimpan pada atribut dtype dan dipilih secara otomatis dari data yang diberikan, misalnya float64 untuk deretan angka desimal. Keseragaman tipe inilah pembeda utama array numpy dari list Python yang elemennya boleh bertipe campuran, sekaligus syarat agar operasi vektornya dapat dijalankan pada level bahasa C. Ekspresi tinggi + 5 menghasilkan array baru tanpa mengubah array aslinya, sedangkan ekspresi tinggi[tinggi > 165] menyaring elemen dengan kondisi boolean. Perhatikan pula cara numpy mencetak array, yaitu tanpa koma pemisah dan dengan satu spasi di antara angka, sehingga keluarannya berbeda dari cetakan list Python.

pandas: tabel data#

Pustaka pandas membangun DataFrame, yaitu tabel dengan kolom bernama dan baris berlabel. Struktur ini menjadi wadah data tabular yang paling umum pada ekosistem Python, dan pandas menyediakan pembaca langsung untuk format data umum, seperti pd.read_csv() untuk berkas CSV. Demo berikut membuat tabel kecil dari dictionary, lalu menghitung dan menyaringnya.

python Contoh: DataFrame pandas
import pandas as pd

data = pd.DataFrame({
    "nama": ["Ali", "Budi", "Citra", "Dewi", "Eko"],
    "nilai": [78, 65, 91, 88, 74],
})
print(data)
print(data["nilai"].mean())
print(data["nilai"].max() - data["nilai"].min())
print(data[data["nilai"] >= 78])
text Keluaran
    nama  nilai
0    Ali     78
1   Budi     65
2  Citra     91
3   Dewi     88
4    Eko     74
79.2
26
    nama  nilai
0    Ali     78
2  Citra     91
3   Dewi     88

Kolom paling kiri pada cetakan adalah index, yaitu label baris yang diberi nomor secara otomatis karena tabel dibuat tanpa label eksplisit. Seleksi data["nilai"] menghasilkan Series, yaitu satu kolom lengkap dengan label barisnya, dan statistiknya dihitung langsung atas kolom tersebut. Setelah data dibaca dari berkas dengan pd.read_csv(), pemeriksaan awal yang lazim adalah head() untuk beberapa baris pertama dan atribut columns untuk daftar nama kolomnya, sehingga bentuk data terlihat sebelum dihitung. Penyaringan boolean data[data["nilai"] >= 78] mengembalikan baris yang memenuhi syarat, dan label baris aslinya ikut terbawa, yaitu 0, 2, dan 3, bukan penomoran baru. Perilaku ini penting diingat dan dibahas kembali pada bagian kesalahan umum.

matplotlib: grafik pertama#

Pustaka matplotlib menggambar grafik dari data yang diberikan, mulai dari diagram batang hingga garis dan sebar. Pada lingkungan tanpa layar seperti server, backend yang bersifat noninteraktif diaktifkan lewat matplotlib.use("Agg") sebelum pyplot diimpor, dan hasil gambar disimpan ke berkas melalui savefig() alih-alih ditampilkan pada jendela. Backend Agg merender gambar ke memori, sehingga seluruh proses berjalan tanpa antarmuka grafis apa pun.

python grafik-suhu.py
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
from pathlib import Path

hari = ["Senin", "Selasa", "Rabu", "Kamis", "Jumat"]
suhu = [28.5, 29.0, 27.8, 30.2, 29.5]
plt.bar(hari, suhu, color="#4C78A8")
plt.title("Suhu harian")
plt.ylabel("Suhu (derajat Celsius)")
plt.tight_layout()
plt.savefig("grafik-suhu.png", dpi=72)
print("berkas grafik-suhu.png dibuat:", Path("grafik-suhu.png").exists())
text Keluaran
berkas grafik-suhu.png dibuat: True
bash
# menjalankan skrip pembuat grafik
python3 grafik-suhu.py
text Keluaran
berkas grafik-suhu.png dibuat: True

Fungsi plt.bar() menggambar diagram batang dari dua sekuens sejajar, yaitu label hari dan nilai suhunya, sedangkan title() dan ylabel() memberi teks penjelasan pada gambar. Jenis grafik lain tersedia melalui fungsi serupa, yaitu plt.plot() untuk grafik garis dan plt.scatter() untuk titik sebar, dan semuanya menerima sekuens yang sejajar dengan cara yang sama. Metode tight_layout() merapikan margin sebelum savefig() menulis berkas PNG di samping skripnya, dan argumen dpi menentukan kepadatan titiknya. Konfirmasi True pada keluaran berarti berkas grafik benar-benar tercipta, dan pola pemeriksaan Path(...).exists() semacam ini lazim dipakai pada skrip yang berjalan tanpa layar.

Kesalahan umum#

Kesalahan pertama adalah mencampuradukkan label index dengan posisi baris pada pandas. Penyaringan boolean membawa label lama, sehingga baris pertama hasil penyaringan tidak lagi berlabel 1, dan pemanggilan .loc[1] berakhir dengan error KeyError. Metode .iloc[0] mengambil baris pertama menurut posisi, sedangkan .loc[label] mengambilnya menurut label.

python Contoh: label index versus posisi
import pandas as pd

data = pd.DataFrame({
    "nama": ["Ali", "Budi", "Citra", "Dewi"],
    "nilai": [78, 65, 91, 88],
})
terpilih = data[data["nilai"] >= 78]
print(terpilih.iloc[0, 0])
try:
    print(terpilih.loc[1, "nama"])
except KeyError as e:
    print(type(e).__name__)
text Keluaran
Ali
KeyError

Kesalahan kedua adalah menganggap operasi numpy mengubah array aslinya. Ekspresi tinggi + 5 mengembalikan array baru, dan array tinggi tetap seperti semula kecuali hasilnya ditugaskan kembali ke variabel yang sama. Kesalahan ketiga adalah memanggil plt.show() pada lingkungan tanpa layar dan menunggu jendela yang tidak pernah muncul. Pada lingkungan semacam itu, matplotlib.use("Agg") diaktifkan dan hasilnya disimpan lewat savefig(), sehingga grafik tiba sebagai berkas yang dapat diperiksa setelah skrip selesai.

Ringkasan#

  • numpy menyediakan array bertipe seragam dengan operasi vektor yang bekerja atas seluruh elemen sekaligus dan mengembalikan array baru.
  • pandas menyusun data menjadi DataFrame berlabel dengan seleksi kolom, statistik satu pemanggilan, dan penyaringan boolean yang mempertahankan label baris.
  • matplotlib menggambar grafik dan menyimpannya lewat savefig(), dengan backend Agg untuk lingkungan tanpa layar.
  • Ketiga pustaka membentuk alur yang berurutan, yaitu array numerik menjadi tabel, lalu tabel menjadi grafik.

Referensi#