Tipe Data I:
Klasifikasi & Karakteristik
Sebelum menganalisis data, kita harus tahu apa jenis datanya. Menggunakan rata-rata untuk data nominal, atau membuat boxplot untuk data ordinal, adalah kesalahan dasar yang sering terjadi. Sesi ini membangun fondasi pemahaman tipe data yang benar.
1. Mengapa Memahami Tipe Data Itu Krusial?
Setiap analisis statistik dan machine learning mengasumsikan tipe data tertentu. Salah tipe data = metode yang salah = kesimpulan yang menyesatkan.
Bayangkan Anda ingin membuat mie goreng tapi menggunakan blender — hasilnya bukan mie goreng, melainkan bubur aneh. Alat yang salah menghasilkan output yang salah, meski bahan bakunya sama.
Begitu pula dengan analisis data: menghitung rata-rata kode pos (nominal) tidak ada maknanya, walau secara teknis bisa dihitung. Atau membuat histogram warna favorit (nominal) menghasilkan informasi yang keliru. Kenali tipe datamu sebelum memilih alat analisisnya.
• Menghitung rata-rata "nomor rumah sakit" (nominal) → angkanya ada, tapi tidak bermakna
• Melakukan uji-t pada data "peringkat kepuasan 1–5" (ordinal) → asumsi skala jarak tidak terpenuhi
• Memperlakukan "jumlah anak: 0, 1, 2, 3" sebagai kontinu → 2.4 anak tidak ada artinya
• Mengkodekan "jenis kelamin: L=1, P=2" lalu menghitung rata-ratanya → "1.5 jenis kelamin" tidak bermakna
2. Peta Klasifikasi Tipe Data
(Kategorikal)
(Numerik)
Bayangkan formulir pendaftaran mahasiswa. Di dalamnya ada berbagai jenis pertanyaan:
Nama → Kualitatif Nominal | Peringkat SMA → Kualitatif Ordinal | Jumlah Saudara → Kuantitatif Diskrit | Tinggi Badan → Kuantitatif Kontinu
Empat pertanyaan, empat tipe data yang berbeda — masing-masing memerlukan pendekatan analisis yang berbeda pula.
3. Data Kualitatif (Kategorikal)
Data kualitatif mewakili kategori atau label — bukan angka dalam arti matematis. Meski bisa dikodekan dengan angka (1, 2, 3), angka tersebut hanya label, bukan nilai numerik sejati.
Kategori yang tidak memiliki urutan yang bermakna. Satu kategori tidak "lebih besar" dari yang lain.
Warna favorit: merah / biru / hijau
Golongan darah: A / B / AB / O
Kode pos: 12830, 10110
Status: menikah / lajang
Kategori yang memiliki urutan bermakna, tapi jarak antar kategori tidak harus sama.
Kepuasan: tidak puas < netral < puas
Ukuran baju: S < M < L < XL
Peringkat lomba: Juara 1, 2, 3
Skala Likert: 1=sangat tidak setuju ... 5=sangat setuju
Nama peserta (Budi, Andi, Citra) = Nominal — tidak ada yang "lebih besar".
Peringkat finish (Juara 1, 2, 3) = Ordinal — ada urutan, tapi jarak waktu antara Juara 1 dan 2 bisa saja berbeda jauh dengan jarak antara Juara 2 dan 3. Kita tahu urutannya, tapi tidak tahu seberapa besar perbedaannya dari peringkat saja.
4. Data Kuantitatif (Numerik)
Data kuantitatif adalah angka sejati yang merepresentasikan jumlah atau ukuran — operasi aritmatika seperti penjumlahan dan pengurangan memiliki makna.
Nilai yang dapat dihitung satu per satu dan biasanya berupa bilangan bulat. Ada "celah" antar nilai — tidak ada nilai di antara dua nilai berurutan.
Jumlah kendaraan: 0, 1, 2, 3...
Jumlah gol dalam pertandingan
Jumlah klik iklan
Skor kuis (0, 10, 20, 30...)
Nilai yang dapat mengambil semua nilai dalam suatu rentang — termasuk pecahan. Hanya dibatasi oleh presisi alat ukur.
Suhu: 36.7°C, 36.75°C...
Berat badan: 65.3 kg
Nilai IPK: 3.75
Waktu berlari: 9.58 detik
Data Diskrit = Foto snapshot. Kita hanya bisa punya foto ke-1, ke-2, ke-3 — tidak ada foto ke-1.7. Nilai "loncat" dari satu ke yang berikutnya.
Data Kontinu = Video. Setiap momen bisa ditangkap — 1 detik, 1.5 detik, 1.51 detik. Ada nilai di antara setiap dua nilai yang ada. Hanya kualitas kamera (presisi alat ukur) yang membatasi detail yang bisa direkam.
5. Empat Skala Pengukuran (Stevens, 1946)
Klasifikasi yang lebih detail dikembangkan oleh Stanley Smith Stevens. Setiap skala "mewarisi" semua kemampuan skala di bawahnya, plus kemampuan tambahan.
Skala Nominal — Hanya Label
Angka hanya digunakan sebagai label atau kode. Tidak ada makna matematis sama sekali.
Contoh: Nomor jersey pemain (Ronaldo #7 tidak "lebih besar" dari Messi #10)
Skala Ordinal — Ada Urutan, Jarak Tidak Pasti
Kategori memiliki urutan bermakna, tetapi selisih antar peringkat tidak harus setara.
Contoh: Peringkat kelas (Juara 1 lebih baik dari Juara 2, tapi tidak tahu seberapa lebih baik)
Skala Interval — Jarak Sama, Nol Relatif
Ada urutan DAN jarak antar nilai setara. Namun nol tidak berarti "tidak ada" — hanya titik referensi.
Contoh: Suhu Celsius: 0°C bukan "tidak ada suhu", dan 20°C tidak berarti "dua kali lebih panas" dari 10°C
Skala Rasio — Lengkap, Nol Absolut
Skala paling lengkap. Ada urutan, jarak sama, DAN nol berarti "tidak ada". Perbandingan rasio bermakna.
Contoh: Tinggi badan: 0 cm = tidak ada tinggi; 180 cm benar-benar dua kali 90 cm.
Suhu Celsius (Interval): 20°C tidak "dua kali lebih panas" dari 10°C — karena 0°C bukan "tidak ada panas", hanya titik beku air.
Suhu Kelvin (Rasio): 200K memang dua kali lebih panas dari 100K — karena 0K = nol absolut (tidak ada gerakan molekul sama sekali).
Berat badan (Rasio): 80 kg memang dua kali 40 kg — 0 kg benar-benar tidak ada berat.
6. Operasi Statistik yang Diizinkan per Skala
7. Representasi Tipe Data di Pandas Python
Pandas memetakan konsep statistik tipe data ke dalam dtype (data type) teknis. Memilih dtype yang tepat menghemat memori dan mengaktifkan operasi yang benar.
kota: "Jakarta"
ukuran: "S", "M", "L", "XL"
aktif: True
waktu: 2024-01-01 08:30
Jika kolom teks memiliki kardinality rendah (sedikit nilai unik, seperti jenis kelamin, grade, status), gunakan dtype category bukan object.
Manfaatnya: hemat memori hingga 5–10×, mendukung pengurutan ordinal, dan operasi groupby menjadi lebih cepat.
8. Kesalahan Umum Penanganan Tipe Data
9. Praktik: Identifikasi & Konversi Tipe Data di Pandas
9.1 Dataset dengan Berbagai Tipe Data
import pandas as pd
import numpy as np
# Dataset mahasiswa dengan berbagai tipe data
data = {
'nim': ['2021001', '2021002', '2021003', '2021004', '2021005'],
'nama': ['Andi', 'Budi', 'Citra', 'Dewi', 'Eko'],
'jenis_kelamin': ['L', 'L', 'P', 'P', 'L'], # nominal
'grade': ['B', 'A', 'A', 'C', 'B'], # ordinal
'jumlah_mk': [6, 7, 6, 5, 7], # diskrit
'ipk': [3.45, 3.78, 3.92, 2.85, 3.60], # kontinu (rasio)
'tgl_masuk': ['2021-09-01']*5, # tanggal (string → datetime)
'aktif': [True, True, True, False, True] # boolean
}
df = pd.DataFrame(data)
print("=== INFO AWAL (DTYPE DEFAULT) ===")
print(df.dtypes)
print(f"\nMemori digunakan: {df.memory_usage(deep=True).sum():,} bytes")
=== INFO AWAL (DTYPE DEFAULT) ===
nim object ← harusnya tetap string
nama object ← sudah benar
jenis_kelamin object ← sebaiknya category (nominal)
grade object ← sebaiknya category ordered (ordinal)
jumlah_mk int64 ← sudah benar (diskrit)
ipk float64 ← sudah benar (kontinu)
tgl_masuk object ← harusnya datetime64!
aktif bool ← sudah benar
dtype: object
Memori digunakan: 2,728 bytes
9.2 Konversi Tipe Data yang Tepat
# ── 1. Nominal → category ────────────────────────────
df['jenis_kelamin'] = df['jenis_kelamin'].astype('category')
# ── 2. Ordinal → category dengan urutan ─────────────
grade_order = pd.CategoricalDtype(
categories=['D', 'C', 'B', 'A'],
ordered=True # D < C < B < A
)
df['grade'] = df['grade'].astype(grade_order)
# ── 3. String → datetime64 ──────────────────────────
df['tgl_masuk'] = pd.to_datetime(df['tgl_masuk'])
# ── 4. Cek hasil konversi ───────────────────────────
print("=== SETELAH KONVERSI ===")
print(df.dtypes)
print(f"\nMemori setelah: {df.memory_usage(deep=True).sum():,} bytes")
# ── 5. Manfaat urutan ordinal ───────────────────────
print("\n=== MANFAAT ORDINAL TERURUT ===")
print("Apakah grade 'A' > 'B'? :", df['grade'][1] > df['grade'][0])
print("Mahasiswa dengan grade ≥ B:")
print(df[df['grade'] >= 'B'][['nama', 'grade', 'ipk']])
=== SETELAH KONVERSI ===
nim object
nama object
jenis_kelamin category ✓ nominal
grade category (ordered) ✓ ordinal terurut D < C < B < A
jumlah_mk int64
ipk float64
tgl_masuk datetime64[ns] ✓ bisa ekstrak tahun/bulan
aktif bool
Memori setelah: 1,856 bytes ← lebih hemat!
=== MANFAAT ORDINAL TERURUT ===
Apakah grade 'A' > 'B'? : True
Mahasiswa dengan grade ≥ B:
nama grade ipk
0 Andi B 3.45
1 Budi A 3.78
2 Citra A 3.92
4 Eko B 3.60
9.3 Eksplorasi dan Analisis Sesuai Tipe Data
import matplotlib.pyplot as plt
# Dataset lebih besar untuk visualisasi
np.random.seed(42)
n = 100
df_besar = pd.DataFrame({
'jk' : np.random.choice(['L','P'], n),
'grade': np.random.choice(['A','B','C','D'], n, p=[.25,.40,.25,.10]),
'mk' : np.random.randint(4, 9, n),
'ipk' : np.random.normal(3.2, 0.4, n).clip(0, 4)
})
fig, axes = plt.subplots(1, 3, figsize=(14, 4))
# ① Nominal → Bar chart (frekuensi)
df_besar['jk'].value_counts().plot(kind='bar', ax=axes[0],
color=['#3B82F6','#C084FC'], edgecolor='white')
axes[0].set_title('Jenis Kelamin (Nominal)\n→ Bar Chart Frekuensi')
# ② Ordinal → Bar chart terurut
grade_counts = df_besar['grade'].value_counts().reindex(['A','B','C','D'])
grade_counts.plot(kind='bar', ax=axes[1],
color=['#22D3EE','#3B82F6','#F59E0B','#F87171'], edgecolor='white')
axes[1].set_title('Grade (Ordinal)\n→ Bar Chart Berurutan A→D')
# ③ Kontinu → Histogram
axes[2].hist(df_besar['ipk'], bins=15, color='#4ADE80',
edgecolor='white', alpha=0.85)
axes[2].set_title('IPK (Kontinu/Rasio)\n→ Histogram Distribusi')
axes[2].axvline(df_besar['ipk'].mean(), color='red',
linestyle='--', label=f"Mean={df_besar['ipk'].mean():.2f}")
axes[2].legend()
plt.tight_layout()
plt.show()
Latihan Identifikasi Tipe Data
Klik tipe data yang paling tepat untuk setiap variabel berikut:
Uji Pemahaman Sesi 6
- Memilih tipe data yang tepat adalah fondasi analisis yang benar — alat analisis yang salah menghasilkan kesimpulan yang menyesatkan
- Data Kualitatif: Nominal (hanya label, tanpa urutan) dan Ordinal (ada urutan, jarak tidak pasti)
- Data Kuantitatif: Diskrit (bilangan bulat terhitung, ada "celah") dan Kontinu (nilai tak terbatas dalam rentang, dibatasi presisi alat ukur)
- 4 Skala Stevens: Nominal → Ordinal → Interval → Rasio; setiap skala mewarisi kemampuan skala sebelumnya plus tambahan baru
- Perbedaan kunci Interval vs Rasio: nol absolut (Rasio punya, Interval tidak). Contoh: Celsius=Interval, Kelvin=Rasio, Berat badan=Rasio
- Operasi yang diizinkan meningkat dari Nominal ke Rasio: Nominal (=), Ordinal (+urutan), Interval (+mean/std), Rasio (+perbandingan rasio A=2×B)
- Pandas dtype: int64 (diskrit), float64 (kontinu), object (teks/nominal), category (nominal/ordinal efisien), bool, datetime64
- Gunakan category ordered untuk data ordinal agar perbandingan (grade ≥ 'B') bekerja dengan benar
- Kesalahan umum: angka sebagai kategori tidak dikonversi, ordinal diperlakukan nominal, tanggal disimpan string, mean pada data ordinal
- Python: astype('category'), CategoricalDtype(ordered=True), pd.to_datetime()