Setiap analisis yang bisa dipercaya dimulai dari langkah yang paling tidak glamor: memahami data. Sebelum mean apa pun dihitung, kita perlu tahu berapa banyak barisnya, kolom apa saja isinya, tipe data apa yang tersimpan, dan apakah ada sel yang kosong. Kebiasaan ini murah dikerjakan di awal dan mahal bila dilewatkan — kesalahan tipe atau baris yang tanpa sengaja hilang akan menjalar ke seluruh statistik turunannya. Pada bagian ini kita memuat dataset nilai ujian 30 siswa, memeriksa strukturnya dengan alat pandas dari chapter Analisis Data dengan pandas, dan menutup dengan statistik awal yang memberi gambaran kasar sebelum pendalaman pada bagian berikutnya.

Berkas Dataset #

Dataset tersimpan sebagai berkas CSV dengan empat kolom: nama siswa diikuti nilai tiga mata pelajaran. Berikut isi lengkapnya — 30 baris data, satu baris per siswa:

csv nilai_ujian.csv
siswa,matematika,bahasa,sains
Adi,70,78,88
Bunga,88,70,60
Cakra,76,91,93
Dewi,80,84,73
Eka,65,67,70
Fajar,84,82,78
Gilang,92,74,64
Hana,68,89,90
Intan,78,76,75
Joko,86,80,83
Kirana,73,86,58
Lukman,62,64,71
Maya,82,93,68
Nadia,45,72,76
Okta,90,88,92
Putri,66,75,65
Qori,77,81,74
Rafi,81,68,79
Sari,60,95,62
Tirta,79,77,72
Utami,74,69,85
Vina,87,85,67
Wahyu,67,73,77
Yuni,76,90,70
Zaki,83,80,81
Bagas,69,87,59
Citra,75,71,86
Danu,64,92,74
Eni,72,83,63
Filda,85,80,82

Seluruh nama adalah nama fiktif dan seluruh angka dibuat untuk latihan — kebiasaan yang sama dengan contoh-contoh sebelumnya di course ini. Nilai bergerak pada skala 0 sampai 100 dengan sebaran yang meniru kelas sungguhan: mayoritas di kisaran 60-an hingga 90-an, dengan satu nilai yang tampak menyendiri di tabel (baris ke-14, milik Nadia). Nilai 45 itu akan menjadi bahan diskusi menarik justru karena letaknya yang menjauh dari kelompok.

Memuat Data ke pandas #

Jika Anda mengunduh berkas tersebut ke folder kerja, satu baris pandas memuatnya menjadi DataFrame:

python
import pandas as pd

df = pd.read_csv("nilai_ujian.csv")

Cuplikan di atas adalah cara pemakaian sungguhan pada berkas di disk — jalankan dari folder yang sama dengan nilai_ujian.csv. Agar cuplikan pada halaman ini dapat dijalankan tanpa bergantung pada lokasi berkas, contoh berikut membangun DataFrame yang persis sama dari daftar baris yang tertanam langsung di dalam kode; hasil akhirnya identik karena pandas membaca baris yang sama:

python
import pandas as pd

data = [
    ("Adi", 70, 78, 88), ("Bunga", 88, 70, 60), ("Cakra", 76, 91, 93),
    ("Dewi", 80, 84, 73), ("Eka", 65, 67, 70), ("Fajar", 84, 82, 78),
    ("Gilang", 92, 74, 64), ("Hana", 68, 89, 90), ("Intan", 78, 76, 75),
    ("Joko", 86, 80, 83), ("Kirana", 73, 86, 58), ("Lukman", 62, 64, 71),
    ("Maya", 82, 93, 68), ("Nadia", 45, 72, 76), ("Okta", 90, 88, 92),
    ("Putri", 66, 75, 65), ("Qori", 77, 81, 74), ("Rafi", 81, 68, 79),
    ("Sari", 60, 95, 62), ("Tirta", 79, 77, 72), ("Utami", 74, 69, 85),
    ("Vina", 87, 85, 67), ("Wahyu", 67, 73, 77), ("Yuni", 76, 90, 70),
    ("Zaki", 83, 80, 81), ("Bagas", 69, 87, 59), ("Citra", 75, 71, 86),
    ("Danu", 64, 92, 74), ("Eni", 72, 83, 63), ("Filda", 85, 80, 82),
]
df = pd.DataFrame(data, columns=["siswa", "matematika", "bahasa", "sains"])

Memeriksa Struktur #

Pemeriksaan struktur merangkum lima pertanyaan dasar sekaligus: seperti apa isi awal tabel, tipe apa tiap kolom, berapa ukurannya, apakah ada nama ganda, dan apakah ada sel kosong:

python
import pandas as pd

data = [
    ("Adi", 70, 78, 88), ("Bunga", 88, 70, 60), ("Cakra", 76, 91, 93),
    ("Dewi", 80, 84, 73), ("Eka", 65, 67, 70), ("Fajar", 84, 82, 78),
    ("Gilang", 92, 74, 64), ("Hana", 68, 89, 90), ("Intan", 78, 76, 75),
    ("Joko", 86, 80, 83), ("Kirana", 73, 86, 58), ("Lukman", 62, 64, 71),
    ("Maya", 82, 93, 68), ("Nadia", 45, 72, 76), ("Okta", 90, 88, 92),
    ("Putri", 66, 75, 65), ("Qori", 77, 81, 74), ("Rafi", 81, 68, 79),
    ("Sari", 60, 95, 62), ("Tirta", 79, 77, 72), ("Utami", 74, 69, 85),
    ("Vina", 87, 85, 67), ("Wahyu", 67, 73, 77), ("Yuni", 76, 90, 70),
    ("Zaki", 83, 80, 81), ("Bagas", 69, 87, 59), ("Citra", 75, 71, 86),
    ("Danu", 64, 92, 74), ("Eni", 72, 83, 63), ("Filda", 85, 80, 82),
]
df = pd.DataFrame(data, columns=["siswa", "matematika", "bahasa", "sains"])

print(df.head())
print()
print(df.dtypes)
print()
print(df.isna().sum())
print()
print("ukuran tabel :", df.shape)
print("siswa unik   :", df["siswa"].nunique())
print()
for mapel in ["matematika", "bahasa", "sains"]:
    print(f"mean {mapel:<11s}: {df[mapel].mean():.2f}")

Output yang Dihasilkan:

text
   siswa  matematika  bahasa  sains
0    Adi          70      78     88
1  Bunga          88      70     60
2  Cakra          76      91     93
3   Dewi          80      84     73
4    Eka          65      67     70

siswa         object
matematika     int64
bahasa         int64
sains          int64
dtype: object

siswa         0
matematika    0
bahasa        0
sains         0
dtype: int64

ukuran tabel : (30, 4)
siswa unik   : 30

mean matematika : 75.13
mean bahasa     : 80.00
mean sains      : 74.50

Mari kita bedah hasilnya:

  1. df.head() menampilkan lima baris pertama — cukup untuk memastikan urutan kolom dan format penulisan nama benar. Baris tampil normal: satu nama diikuti tiga angka.
  2. df.dtypes melaporkan tipe tiap kolom: object untuk teks nama siswa dan int64 untuk ketiga kolom nilai. Tipe yang benar penting — bila nilai tersimpan sebagai teks, operasi hitung akan gagal atau menghasilkan kejutan.
  3. df.isna().sum() menghitung sel kosong per kolom: seluruhnya nol. Dataset ini lengkap, tidak ada nilai hilang seperti contoh Gilang pada chapter pandas; untuk proyek ini, pekerjaan pembersihan akan kita temui di proyek kedua.
  4. df.shape mengonfirmasi ukuran (30, 4) — 30 baris, 4 kolom — dan nunique() memastikan 30 nama semuanya berbeda, sehingga tidak ada siswa yang tercatat dua kali.
  5. Mean awal (dibulatkan ke dua desimal) memberi gambaran pertama: bahasa unggul dengan 80.00, disusul matematika 75.13 dan sains 74.50. Selisih hampir lima poin antara bahasa dan dua mapel lainnya adalah petunjuk pertama bahwa ketiga mata pelajaran ini memang berbeda karakter.

Apa yang Sudah dan Belum Kita Ketahui #

Struktur data terkonfirmasi sehat: ukuran sesuai, tipe benar, tidak ada sel kosong, dan setiap baris mewakili satu siswa. Gambaran mean juga sudah terbentuk. Namun mean saja menjawab satu pertanyaan saja — kita belum tahu posisi tengah yang tahan terhadap nilai ekstrem (median), nilai yang paling sering muncul (modus), seberapa lebar sebarannya, dan bagaimana bentuk sebaran ketiganya. Pertanyaan-pertanyaan itulah yang dikerjakan Bagian 2 dengan perangkat lengkap statistik deskriptif.