📘 Pertemuan 3 - Manipulasi Data dengan Pandas

🎯 Tujuan Pembelajaran

  1. Memahami konsep DataFrame dan Series di Pandas
  2. Membaca, menampilkan, dan menyimpan data dari/ke file CSV
  3. Melakukan operasi dasar: filtering, sorting, dan indexing
  4. 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

  1. Buat DataFrame dengan data 10 mahasiswa (nama, nilai, jurusan, semester)
  2. Tampilkan mahasiswa dengan nilai > 75
  3. Tambahkan kolom "Keterangan": "Lulus" jika nilai ≥ 70, "Tidak Lulus" jika < 70
  4. Urutkan data berdasarkan nilai dari tertinggi ke terendah
  5. Hitung rata-rata nilai per jurusan

Latihan 2: Manipulasi Data Karyawan

  1. Buat DataFrame berisi: nama, departemen, gaji, tahun_masuk
  2. Filter karyawan dengan gaji > 5000000
  3. Tambahkan kolom "Masa_Kerja" (2024 - tahun_masuk)
  4. Hitung rata-rata gaji per departemen
  5. Tampilkan 3 karyawan dengan gaji tertinggi

Latihan 3: Analisis Data Cuaca

  1. Download dataset cuaca sederhana atau buat sendiri (tanggal, suhu, kelembaban, curah_hujan)
  2. Convert kolom tanggal ke tipe datetime
  3. Filter hari-hari dengan curah hujan > 0
  4. Hitung rata-rata suhu dan kelembaban
  5. 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.