📘 Pertemuan 3 - Manipulasi Data dengan Pandas
🎯 Tujuan Pembelajaran
- Memahami konsep DataFrame dan Series di Pandas
- Membaca, menampilkan, dan menyimpan data dari/ke file CSV
- Melakukan operasi dasar: filtering, sorting, dan indexing
- Menerapkan manipulasi data menggunakan dataset nyata
🧩 1. Pengenalan Pandas
Pandas adalah library Python yang sangat populer untuk manipulasi dan analisis data tabular.
Dua struktur data utama di Pandas:
- Series → struktur data satu dimensi (seperti kolom tunggal)
- DataFrame → struktur data dua dimensi (seperti tabel Excel/SQL)
Pandas sangat efisien untuk:
- Membaca data dari berbagai format (CSV, Excel, JSON, SQL)
- Cleaning dan transformasi data
- Agregasi dan grouping data
- Analisis time series
📦 2. Mengimpor dan Membuat DataFrame
Import Library
import pandas as pd
import numpy as np
print(f"Pandas version: {pd.__version__}")
Membuat DataFrame dari Dictionary
# Membuat DataFrame sederhana
data = {
"Nama": ["Ani", "Budi", "Cici", "Dodi", "Eka"],
"Nilai": [85, 70, 90, 65, 75],
"Jurusan": ["Matematika", "Fisika", "Biologi", "Kimia", "Matematika"],
"Semester": [5, 3, 7, 5, 3]
}
df = pd.DataFrame(data)
print(df)
print(f"
Bentuk data: {df.shape}") # (5, 4) - 5 baris, 4 kolom
Membuat Series
# Series adalah kolom tunggal
nilai_series = pd.Series([85, 70, 90, 65, 75], name="Nilai")
print(nilai_series)
print(f"Tipe data: {type(nilai_series)}")
📁 3. Membaca dan Menulis File CSV
Menyimpan DataFrame ke CSV
# Simpan ke file CSV
df.to_csv("data_mahasiswa.csv", index=False)
print("Data berhasil disimpan ke data_mahasiswa.csv")
# Simpan dengan delimiter tertentu
df.to_csv("data_mahasiswa_tab.csv", sep=' ', index=False)
Membaca File CSV
# Membaca file CSV
df_baru = pd.read_csv("data_mahasiswa.csv")
print(df_baru)
# Membaca dengan parameter tambahan
df_custom = pd.read_csv(
"data_mahasiswa.csv",
encoding='utf-8',
na_values=['NA', 'null', ''], # Nilai yang dianggap missing
dtype={'Semester': int} # Menentukan tipe data kolom
)
🔍 4. Mengeksplorasi Data
Menampilkan Informasi Dasar
# Menampilkan beberapa baris pertama print(df.head()) # 5 baris pertama (default) print(df.head(3)) # 3 baris pertama # Menampilkan beberapa baris terakhir print(df.tail()) # 5 baris terakhir print(df.tail(2)) # 2 baris terakhir # Informasi struktur data print(df.info()) # Tipe data, jumlah non-null, memory usage # Statistik deskriptif print(df.describe()) # Mean, std, min, max untuk kolom numerik print(df.describe(include='all')) # Semua kolom termasuk kategorikal
Mengakses Kolom dan Baris
# Mengakses kolom print(df["Nama"]) # Satu kolom (Series) print(df[["Nama", "Nilai"]]) # Multiple kolom (DataFrame) # Mengakses baris berdasarkan index print(df.loc[0]) # Baris pertama print(df.loc[0:2]) # Baris 0 sampai 2 # Mengakses berdasarkan posisi print(df.iloc[0]) # Baris pertama print(df.iloc[0:3, 1:3]) # Baris 0-2, kolom 1-2 # Mengakses nilai spesifik print(df.at[0, "Nama"]) # Lebih cepat untuk akses single value print(df.iat[0, 0]) # Akses by position
🔧 5. Filtering dan Sorting Data
Filtering (Memfilter Data)
# Filter mahasiswa dengan nilai >= 80
tinggi = df[df["Nilai"] >= 80]
print(tinggi)
# Multiple conditions dengan & (AND)
matematika_tinggi = df[(df["Jurusan"] == "Matematika") & (df["Nilai"] >= 75)]
print(matematika_tinggi)
# Multiple conditions dengan | (OR)
ekstrim = df[(df["Nilai"] >= 85) | (df["Nilai"] < 70)]
print(ekstrim)
# Filter dengan isin()
jurusan_exact = df[df["Jurusan"].isin(["Matematika", "Fisika"])]
print(jurusan_exact)
# Filter string contains
nama_dengan_i = df[df["Nama"].str.contains("i", case=False)]
print(nama_dengan_i)
Sorting (Mengurutkan Data)
# Urutkan berdasarkan nilai (ascending) df_sorted_asc = df.sort_values(by="Nilai") print(df_sorted_asc) # Urutkan berdasarkan nilai (descending) df_sorted_desc = df.sort_values(by="Nilai", ascending=False) print(df_sorted_desc) # Urutkan berdasarkan multiple kolom df_multi_sort = df.sort_values(by=["Jurusan", "Nilai"], ascending=[True, False]) print(df_multi_sort) # Urutkan berdasarkan index df_sorted_index = df.sort_index() print(df_sorted_index)
Indexing
# Mengubah kolom menjadi index
df_indexed = df.set_index("Nama")
print(df_indexed)
# Akses data dengan index baru
print(df_indexed.loc["Ani"])
# Reset index
df_reset = df_indexed.reset_index()
print(df_reset)
# Multi-level index
df_multi = df.set_index(["Jurusan", "Nama"])
print(df_multi)
🛠️ 6. Operasi Kolom dan Baris
Menambah Kolom Baru
# Menambah kolom dengan nilai konstan
df["Universitas"] = "Universitas XYZ"
print(df)
# Menambah kolom berdasarkan kondisi
df["Status"] = df["Nilai"].apply(lambda x: "Lulus" if x >= 70 else "Tidak Lulus")
print(df)
# Menambah kolom dari operasi kolom lain
df["Nilai_Normalized"] = (df["Nilai"] - df["Nilai"].min()) / (df["Nilai"].max() - df["Nilai"].min())
print(df)
# Menggunakan np.where untuk kondisi
df["Kategori"] = np.where(df["Nilai"] >= 85, "A",
np.where(df["Nilai"] >= 75, "B",
np.where(df["Nilai"] >= 65, "C", "D")))
print(df)
Menghapus Kolom dan Baris
# Menghapus kolom
df_drop_col = df.drop("Universitas", axis=1)
df_drop_cols = df.drop(["Status", "Nilai_Normalized"], axis=1)
print(df_drop_col)
# Menghapus baris berdasarkan index
df_drop_row = df.drop(0, axis=0) # Hapus baris index 0
print(df_drop_row)
# Menghapus baris berdasarkan kondisi
df_clean = df[df["Nilai"] >= 70] # Hanya ambil yang lulus
print(df_clean)
Menambah Baris Baru
# Menambah satu baris
baris_baru = pd.DataFrame({
"Nama": ["Fajar"],
"Nilai": [82],
"Jurusan": ["Fisika"],
"Semester": [5]
})
df = pd.concat([df, baris_baru], ignore_index=True)
print(df)
# Alternatif dengan loc
df.loc[len(df)] = ["Gina", 78, "Biologi", 3]
print(df)
📊 7. Studi Kasus Mini - Analisis Data Penjualan
🛒 Kasus: Analisis Penjualan Toko Online
Sebuah toko online ingin menganalisis data penjualan produknya untuk mengetahui produk terlaris dan total revenue.
# Dataset penjualan
data_penjualan = {
"Tanggal": ["2024-01-01", "2024-01-01", "2024-01-02", "2024-01-02", "2024-01-03", "2024-01-03"],
"Produk": ["Laptop", "Mouse", "Laptop", "Keyboard", "Mouse", "Laptop"],
"Jumlah": [2, 5, 1, 3, 4, 2],
"Harga": [10000000, 150000, 10000000, 500000, 150000, 10000000]
}
df_penjualan = pd.DataFrame(data_penjualan)
df_penjualan["Tanggal"] = pd.to_datetime(df_penjualan["Tanggal"])
print("Data Penjualan:")
print(df_penjualan)
# Hitung total penjualan per transaksi
df_penjualan["Total"] = df_penjualan["Jumlah"] * df_penjualan["Harga"]
print("
Data dengan Total:")
print(df_penjualan)
# Analisis per produk
print("
=== ANALISIS PER PRODUK ===")
analisis_produk = df_penjualan.groupby("Produk").agg({
"Jumlah": "sum",
"Total": "sum"
}).reset_index()
analisis_produk.columns = ["Produk", "Total_Terjual", "Total_Revenue"]
analisis_produk = analisis_produk.sort_values("Total_Revenue", ascending=False)
print(analisis_produk)
# Produk terlaris berdasarkan jumlah
produk_terlaris = analisis_produk.loc[analisis_produk["Total_Terjual"].idxmax()]
print(f"
🏆 Produk Terlaris: {produk_terlaris['Produk']} ({produk_terlaris['Total_Terjual']:.0f} unit)")
# Produk dengan revenue tertinggi
produk_revenue_tinggi = analisis_produk.loc[analisis_produk["Total_Revenue"].idxmax()]
print(f"💰 Revenue Tertinggi: {produk_revenue_tinggi['Produk']} (Rp {produk_revenue_tinggi['Total_Revenue']:,.0f})")
# Total revenue keseluruhan
total_revenue = df_penjualan["Total"].sum()
print(f"
📊 Total Revenue: Rp {total_revenue:,.0f}")
# Analisis per tanggal
print("
=== ANALISIS PER TANGGAL ===")
analisis_tanggal = df_penjualan.groupby("Tanggal").agg({
"Total": "sum",
"Jumlah": "sum"
}).reset_index()
print(analisis_tanggal)
# Tambahkan persentase kontribusi revenue
analisis_produk["Persentase_Revenue"] = (analisis_produk["Total_Revenue"] / total_revenue * 100).round(2)
print("
=== KONTRIBUSI REVENUE PER PRODUK ===")
print(analisis_produk)
💡 Output yang Diharapkan:
=== ANALISIS PER PRODUK ===
Produk Total_Terjual Total_Revenue
0 Laptop 5 50000000
1 Mouse 9 1350000
2 Keyboard 3 1500000
🏆 Produk Terlaris: Mouse (9 unit)
💰 Revenue Tertinggi: Laptop (Rp 50,000,000)
📊 Total Revenue: Rp 52,850,000
=== KONTRIBUSI REVENUE PER PRODUK ===
Produk Total_Terjual Total_Revenue Persentase_Revenue
0 Laptop 5 50000000 94.61
1 Mouse 9 1350000 2.55
2 Keyboard 3 1500000 2.84
🧠 8. Latihan Mandiri
Latihan 1: Analisis Data Mahasiswa
- Buat DataFrame dengan data 10 mahasiswa (nama, nilai, jurusan, semester)
- Tampilkan mahasiswa dengan nilai > 75
- Tambahkan kolom "Keterangan": "Lulus" jika nilai ≥ 70, "Tidak Lulus" jika < 70
- Urutkan data berdasarkan nilai dari tertinggi ke terendah
- Hitung rata-rata nilai per jurusan
Latihan 2: Manipulasi Data Karyawan
- Buat DataFrame berisi: nama, departemen, gaji, tahun_masuk
- Filter karyawan dengan gaji > 5000000
- Tambahkan kolom "Masa_Kerja" (2024 - tahun_masuk)
- Hitung rata-rata gaji per departemen
- Tampilkan 3 karyawan dengan gaji tertinggi
Latihan 3: Analisis Data Cuaca
- Download dataset cuaca sederhana atau buat sendiri (tanggal, suhu, kelembaban, curah_hujan)
- Convert kolom tanggal ke tipe datetime
- Filter hari-hari dengan curah hujan > 0
- Hitung rata-rata suhu dan kelembaban
- Tampilkan 5 hari dengan suhu tertinggi
✍️ Kesimpulan
Pada pertemuan ini, mahasiswa telah mempelajari:
- ✅ Dasar penggunaan Pandas untuk manipulasi data tabular
- ✅ Membaca dan menulis file CSV
- ✅ Filtering data berdasarkan kondisi
- ✅ Sorting dan indexing data
- ✅ Operasi dasar pada kolom dan baris (tambah, hapus, modifikasi)
- ✅ Agregasi data dengan groupby
- ✅ Penerapan pada studi kasus nyata
Pertemuan selanjutnya: Exploratory Data Analysis (EDA) untuk memahami pola dan karakteristik data lebih dalam.