{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "# Bab 2: Package & Komputasi Numerik (NumPy, Pandas, Visualisasi)\n",
        "\n",
        "**Awd Course - Buku Modul Praktik Komprehensif**\n",
        "\n",
        "Notebook kompilasi lengkap untuk Bab 2 yang mencakup Manajemen Paket PIP, Komputasi Vektor NumPy, Manipulasi DataFrame Pandas, Visualisasi Data Matplotlib, Visualisasi Seaborn, serta Impor dan Ekspor Berkas Data.\n",
        "\n",
        "---\n"
      ],
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "# Manajemen Paket & Library Menggunakan Pip\n",
        "\n",
        "**Pip** (*Package Installer for Python*) adalah manajer paket standar resmi untuk bahasa pemrograman Python. Pip mempermudah proses pencarian, instalasi, pembaruan, dan penghapusan pustaka dari repositori publik **PyPI** (*Python Package Index*)."
      ],
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## 1. Memeriksa Versi Pip dan Daftar Paket\n",
        "Gunakan perintah `!pip --version` dan `!pip list` di lingkungan notebook."
      ],
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {},
      "source": [
        "! pip --version\n",
        "! pip list | head -n 10"
      ],
      "outputs": [],
      "execution_count": null
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## 2. Menginstal dan Memeriksa Informasi Paket\n",
        "Anda dapat menginstal pustaka seperti `requests` menggunakan perintah `pip install <nama_paket>`."
      ],
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {},
      "source": [
        "! pip install requests"
      ],
      "outputs": [],
      "execution_count": null
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## 3. Menggunakan Paket yang Telah Terinstal"
      ],
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {},
      "source": [
        "import requests\n",
        "\n",
        "# Mengambil status API publik\n",
        "response = requests.get('https://api.github.com')\n",
        "print(\"Status Code:\", response.status_code)\n",
        "print(\"Server Headers:\", response.headers.get('server'))"
      ],
      "outputs": [],
      "execution_count": null
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "\n",
        "---\n",
        "\n"
      ],
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "# Pengenalan & Komputasi Array NumPy\n",
        "\n",
        "**NumPy** (*Numerical Python*) adalah pustaka dasar untuk komputasi ilmiah dalam Python. NumPy menyediakan struktur data **ndarray** (*N-dimensional array*) yang jauh lebih cepat dan hemat memori dibandingkan list bawaan Python."
      ],
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## 1. Inisiasi dan Membuat Array NumPy"
      ],
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {},
      "source": [
        "import numpy as np\n",
        "\n",
        "# Membuat Array 1 Dimensi (Vektor)\n",
        "arr_1d = np.array([10, 20, 30, 40, 50])\n",
        "print(\"Array 1D:\", arr_1d)\n",
        "print(\"Bentuk (shape):\", arr_1d.shape)\n",
        "print(\"Tipe data (dtype):\", arr_1d.dtype)\n",
        "\n",
        "# Membuat Array 2 Dimensi (Matriks)\n",
        "matrix_2d = np.array([\n",
        "    [1, 2, 3],\n",
        "    [4, 5, 6],\n",
        "    [7, 8, 9]\n",
        "])\n",
        "print(\"\n",
        "Matriks 2D:\n",
        "\", matrix_2d)\n",
        "print(\"Dimensi (ndim):\", matrix_2d.ndim)\n",
        "print(\"Ukuran (size):\", matrix_2d.size)"
      ],
      "outputs": [],
      "execution_count": null
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## 2. Fungsi Pembuat Array Otomatis\n",
        "NumPy menyediakan fungsi instan untuk membuat array bernilai nol, satu, deret, atau nilai acak."
      ],
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {},
      "source": [
        "# Array berisi nol (zeros)\n",
        "zeros = np.zeros((2, 4))\n",
        "\n",
        "# Array berisi deret angka urut (arange)\n",
        "deret = np.arange(0, 20, 2)  # start=0, stop=20, step=2\n",
        "\n",
        "# Array linear space (linspace)\n",
        "lin = np.linspace(0, 1, 5)  # 5 titik berjarak sama dari 0 s.d. 1\n",
        "\n",
        "print(\"Zeros (2x4):\n",
        "\", zeros)\n",
        "print(\"Arange (kelipatan 2):\", deret)\n",
        "print(\"Linspace (0 s.d. 1):\", lin)"
      ],
      "outputs": [],
      "execution_count": null
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## 3. Operasi Matematika Vektorisasi (Vectorization)\n",
        "Salah satu keunggulan terbesar NumPy adalah operasi aritmatika dieksekusi secara instan per elemen (*element-wise*) tanpa perlu menuliskan perulangan `for`."
      ],
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {},
      "source": [
        "a = np.array([1, 2, 3, 4])\n",
        "b = np.array([10, 20, 30, 40])\n",
        "\n",
        "print(\"Penjumlahan (a + b) =\", a + b)\n",
        "print(\"Perkalian (a * 3)   =\", a * 3)\n",
        "print(\"Kuadrat (a ** 2)    =\", a ** 2)\n",
        "print(\"Sinus np.sin(a)     =\", np.round(np.sin(a), 4))"
      ],
      "outputs": [],
      "execution_count": null
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## 4. Fungsi Agregasi Statistik NumPy"
      ],
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {},
      "source": [
        "data_sampel = np.array([45, 82, 67, 90, 54, 78, 88, 95, 72, 84])\n",
        "\n",
        "print(\"Rata-rata (Mean)      :\", np.mean(data_sampel))\n",
        "print(\"Median (Nilai Tengah) :\", np.median(data_sampel))\n",
        "print(\"Standar Deviasi (Std) :\", np.std(data_sampel))\n",
        "print(\"Varians (Variance)    :\", np.var(data_sampel))\n",
        "print(\"Nilai Minimum         :\", np.min(data_sampel))\n",
        "print(\"Nilai Maksimum        :\", np.max(data_sampel))"
      ],
      "outputs": [],
      "execution_count": null
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "\n",
        "---\n",
        "\n"
      ],
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "# Pengenalan Struktur Data Pandas (Series & DataFrame)\n",
        "\n",
        "**Pandas** adalah pustaka paling populer dalam Python untuk manipulasi, pembersihan, dan analisis data terstruktur."
      ],
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## 1. Pandas Series (Struktur 1 Dimensi Berlabel)\n",
        "Series adalah array satu dimensi yang dilengkapi dengan label indeks."
      ],
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {},
      "source": [
        "import pandas as pd\n",
        "\n",
        "# Membuat Series dengan indeks kustom\n",
        "populasi_juta = pd.Series([10.56, 2.93, 2.51, 1.83], index=['Jakarta', 'Surabaya', 'Bekasi', 'Bandung'])\n",
        "populasi_juta.name = \"Populasi (Juta Jiwa)\"\n",
        "\n",
        "print(populasi_juta)\n",
        "print(\"\n",
        "Populasi Surabaya:\", populasi_juta['Surabaya'], \"juta\")"
      ],
      "outputs": [],
      "execution_count": null
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## 2. Pandas DataFrame (Struktur Tabel 2 Dimensi)\n",
        "DataFrame adalah representasi tabel dua dimensi yang terdiri dari baris (*rows*) dan kolom (*columns*)."
      ],
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {},
      "source": [
        "# Membuat DataFrame dari Dictionary\n",
        "data_karyawan = {\n",
        "    'Nama': ['Andi', 'Budi', 'Citra', 'Dewi', 'Eko'],\n",
        "    'Divisi': ['Engineering', 'Data', 'Data', 'Design', 'Engineering'],\n",
        "    'Gaji_Juta': [15.5, 18.0, 16.5, 12.0, 14.0],\n",
        "    'Pengalaman_Tahun': [3, 5, 4, 2, 3]\n",
        "}\n",
        "\n",
        "df = pd.DataFrame(data_karyawan)\n",
        "print(\"DataFrame Karyawan:\n",
        "\", df)"
      ],
      "outputs": [],
      "execution_count": null
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## 3. Inspeksi Cepat & Ringkasan DataFrame"
      ],
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {},
      "source": [
        "# Mengambil kolom tertentu\n",
        "print(\"Daftar Gaji Karyawan:\n",
        "\", df['Gaji_Juta'])\n",
        "\n",
        "# Ringkasan statistik cepat\n",
        "print(\"\n",
        "Statistik Gaji:\n",
        "\", df['Gaji_Juta'].describe())\n",
        "\n",
        "# Rata-rata gaji per divisi\n",
        "print(\"\n",
        "Rata-rata Gaji per Divisi:\n",
        "\", df.groupby('Divisi')['Gaji_Juta'].mean())"
      ],
      "outputs": [],
      "execution_count": null
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "\n",
        "---\n",
        "\n"
      ],
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "# Visualisasi Data Dasar dengan Matplotlib\n",
        "\n",
        "**Matplotlib** adalah pustaka visualisasi data tingkat dasar yang memberikan kontrol penuh atas setiap elemen grafik (garis, sumbu, label, warna, dan legenda)."
      ],
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## 1. Inisiasi & Membuat Line Plot (Tren Waktu)\n",
        "Line Plot sangat ideal untuk menampilkan tren data deret waktu (*time series*)."
      ],
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {},
      "source": [
        "import matplotlib.pyplot as plt\n",
        "import pandas as pd\n",
        "\n",
        "# Data tren penjualan bulanan\n",
        "bulan = ['Jan', 'Feb', 'Mar', 'Apr', 'Mei', 'Jun', 'Jul', 'Agu']\n",
        "penjualan_2025 = [120, 135, 148, 160, 175, 190, 210, 230]\n",
        "penjualan_2026 = [140, 150, 170, 185, 205, 220, 245, 270]\n",
        "\n",
        "plt.figure(figsize=(10, 5))\n",
        "plt.plot(bulan, penjualan_2025, marker='o', linestyle='--', color='#2563eb', label='Tahun 2025')\n",
        "plt.plot(bulan, penjualan_2026, marker='s', linestyle='-', color='#059669', label='Tahun 2026')\n",
        "\n",
        "plt.title('Perbandingan Tren Penjualan Bulanan (2025 vs 2026)', fontsize=14, fontweight='bold')\n",
        "plt.xlabel('Bulan', fontsize=11)\n",
        "plt.ylabel('Total Penjualan (Unit)', fontsize=11)\n",
        "plt.legend()\n",
        "plt.grid(True, linestyle=':', alpha=0.6)\n",
        "plt.tight_layout()\n",
        "plt.show()"
      ],
      "outputs": [],
      "execution_count": null
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## 2. Bar Plot (Perbandingan Antar Kategori)\n",
        "Bar Plot digunakan untuk membandingkan besaran nilai diskrit antar kategori."
      ],
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {},
      "source": [
        "kategori_kursus = ['Python', 'SQL', 'Data Science', 'Web Dev', 'Cloud']\n",
        "jumlah_peserta = [450, 380, 520, 290, 310]\n",
        "\n",
        "plt.figure(figsize=(9, 5))\n",
        "bars = plt.bar(kategori_kursus, jumlah_peserta, color='#3b82f6', edgecolor='#1e40af')\n",
        "\n",
        "# Menambahkan label angka di atas setiap batang\n",
        "for bar in bars:\n",
        "    yval = bar.get_height()\n",
        "    plt.text(bar.get_x() + bar.get_width()/2, yval + 8, f\"{int(yval)}\", ha='center', fontweight='bold')\n",
        "\n",
        "plt.title('Jumlah Peserta Berdasarkan Kategori Kursus', fontsize=13, fontweight='bold')\n",
        "plt.xlabel('Kategori Kursus')\n",
        "plt.ylabel('Jumlah Siswa Terdaftar')\n",
        "plt.ylim(0, 600)\n",
        "plt.grid(axis='y', linestyle=':', alpha=0.7)\n",
        "plt.tight_layout()\n",
        "plt.show()"
      ],
      "outputs": [],
      "execution_count": null
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## 3. Histogram & Scatter Plot\n",
        "- **Histogram**: Melihat sebaran frekuensi data numerik kontinu.\n",
        "- **Scatter Plot**: Memeriksa korelasi / hubungan antara dua variabel kuantitatif."
      ],
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {},
      "source": [
        "import numpy as np\n",
        "\n",
        "# 1. Histogram Nilai Ujian\n",
        "np.random.seed(42)\n",
        "nilai_mahasiswa = np.random.normal(loc=78, scale=8, size=200)\n",
        "\n",
        "plt.figure(figsize=(10, 4))\n",
        "plt.hist(nilai_mahasiswa, bins=15, color='#8b5cf6', edgecolor='white')\n",
        "plt.title('Distribusi Sebaran Nilai Mahasiswa', fontsize=13, fontweight='bold')\n",
        "plt.xlabel('Rentang Nilai')\n",
        "plt.ylabel('Frekuensi')\n",
        "plt.grid(axis='y', linestyle=':', alpha=0.6)\n",
        "plt.show()\n",
        "\n",
        "# 2. Scatter Plot: Jam Belajar vs Nilai Ujian\n",
        "jam_belajar = np.random.uniform(2, 10, size=50)\n",
        "nilai_ujian = 50 + (jam_belajar * 4.5) + np.random.normal(0, 3, size=50)\n",
        "\n",
        "plt.figure(figsize=(9, 5))\n",
        "plt.scatter(jam_belajar, nilai_ujian, color='#ef4444', alpha=0.8, edgecolors='black')\n",
        "plt.title('Hubungan Waktu Belajar terhadap Nilai Ujian', fontsize=13, fontweight='bold')\n",
        "plt.xlabel('Waktu Belajar (Jam / Minggu)')\n",
        "plt.ylabel('Nilai Ujian Akhir')\n",
        "plt.grid(True, linestyle=':', alpha=0.6)\n",
        "plt.show()"
      ],
      "outputs": [],
      "execution_count": null
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "\n",
        "---\n",
        "\n"
      ],
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "# Visualisasi Data Statistik dengan Seaborn\n",
        "\n",
        "**Seaborn** adalah pustaka visualisasi tingkat tinggi yang dibangun di atas Matplotlib. Seaborn dirancang untuk menghasilkan grafik statistik yang indah dan informatif secara otomatis."
      ],
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## 1. Inisiasi & Menyiapkan Dataset Sampel"
      ],
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {},
      "source": [
        "import seaborn as sns\n",
        "import matplotlib.pyplot as plt\n",
        "import pandas as pd\n",
        "\n",
        "# Mengatur tema visual modern bawaan seaborn\n",
        "sns.set_theme(style=\"whitegrid\")\n",
        "\n",
        "# Membuat dataset transaksi e-commerce\n",
        "data_transaksi = pd.DataFrame({\n",
        "    'Kategori': ['Elektronik', 'Pakaian', 'Elektronik', 'Buku', 'Pakaian', 'Elektronik', 'Buku', 'Pakaian', 'Elektronik', 'Buku'] * 10,\n",
        "    'Rating': [4.5, 4.2, 4.8, 3.9, 4.1, 4.6, 4.0, 3.8, 4.9, 4.3] * 10,\n",
        "    'Harga_Ribu': [1200, 250, 1800, 95, 320, 2100, 120, 180, 1500, 85] * 10,\n",
        "    'Metode_Bayar': ['QRIS', 'Transfer', 'Kartu Kredit', 'QRIS', 'QRIS', 'Kartu Kredit', 'Transfer', 'QRIS', 'Kartu Kredit', 'Transfer'] * 10\n",
        "})\n",
        "\n",
        "data_transaksi.head()"
      ],
      "outputs": [],
      "execution_count": null
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## 2. Barplot dengan Kategorisasi Warna (`hue`)"
      ],
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {},
      "source": [
        "plt.figure(figsize=(10, 5))\n",
        "sns.barplot(data=data_transaksi, x='Kategori', y='Harga_Ribu', hue='Metode_Bayar', palette='Set2')\n",
        "plt.title('Rata-rata Nilai Transaksi per Kategori & Metode Pembayaran', fontsize=13, fontweight='bold')\n",
        "plt.ylabel('Rata-rata Harga (Ribu Rp)')\n",
        "plt.show()"
      ],
      "outputs": [],
      "execution_count": null
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## 3. Histogram Distribusi dengan Kurva KDE (`sns.histplot`)\n",
        "KDE (*Kernel Density Estimate*) memperlihatkan perkiraan kurva kepadatan probabilitas kontinu."
      ],
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {},
      "source": [
        "plt.figure(figsize=(9, 5))\n",
        "sns.histplot(data=data_transaksi, x='Rating', kde=True, color='#0284c7', bins=10)\n",
        "plt.title('Sebaran Distribusi Rating Produk dengan Kurva KDE', fontsize=13, fontweight='bold')\n",
        "plt.xlabel('Rating Produk (Skala 1 - 5)')\n",
        "plt.show()"
      ],
      "outputs": [],
      "execution_count": null
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## 4. Scatter Plot & Boxplot Statistik Multi-Dimensi"
      ],
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {},
      "source": [
        "plt.figure(figsize=(9, 5))\n",
        "sns.boxplot(data=data_transaksi, x='Kategori', y='Harga_Ribu', palette='pastel')\n",
        "plt.title('Distribusi Variasi Harga per Kategori Produk (Boxplot)', fontsize=13, fontweight='bold')\n",
        "plt.ylabel('Harga Produk (Ribu Rp)')\n",
        "plt.show()"
      ],
      "outputs": [],
      "execution_count": null
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "\n",
        "---\n",
        "\n"
      ],
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "# Teknik Impor & Ekspor Data\n",
        "\n",
        "Dalam pekerjaan sains data nyata, data hampir selalu dimuat dari sumber file eksternal seperti CSV, Excel (.xlsx), atau format JSON."
      ],
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## 1. Membaca & Menulis File CSV (`pd.read_csv` & `df.to_csv`)\n",
        "CSV (*Comma Separated Values*) adalah format penyimpanan data tabular yang paling universal."
      ],
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {},
      "source": [
        "import pandas as pd\n",
        "\n",
        "# Membuat data sampel\n",
        "df_sampel = pd.DataFrame({\n",
        "    'Kode': ['A01', 'A02', 'A03', 'A04'],\n",
        "    'Produk': ['Laptop Pro', 'Mouse Wireless', 'Keyboard Mekanikal', 'Monitor 4K'],\n",
        "    'Harga': [14500000, 250000, 850000, 4200000],\n",
        "    'Stok': [12, 45, 28, 15]\n",
        "})\n",
        "\n",
        "# Ekspor ke file CSV lokal\n",
        "df_sampel.to_csv('daftar_produk.csv', index=False)\n",
        "print(\"File CSV berhasil disimpan!\")\n",
        "\n",
        "# Membaca kembali file CSV\n",
        "df_baca = pd.read_csv('daftar_produk.csv')\n",
        "print(\"\n",
        "Hasil Baca File CSV:\n",
        "\", df_baca)"
      ],
      "outputs": [],
      "execution_count": null
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## 2. Membaca & Menulis Format JSON (`pd.read_json` & `df.to_json`)"
      ],
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {},
      "source": [
        "# Ekspor ke file JSON\n",
        "df_sampel.to_json('daftar_produk.json', orient='records', indent=2)\n",
        "\n",
        "# Membaca kembali dari JSON\n",
        "df_json = pd.read_json('daftar_produk.json')\n",
        "print(\"Hasil Baca JSON:\n",
        "\", df_json)"
      ],
      "outputs": [],
      "execution_count": null
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## 3. Tips Penanganan Delimiter dan Encoding\n",
        "- Gunakan parameter `delimiter=';'` atau `sep='\\t'` jika file menggunakan pemisah titik koma atau tab.\n",
        "- Gunakan `encoding='utf-8'` untuk mendukung karakter khusus atau non-ASCII."
      ],
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "\n",
        "---\n",
        "\n"
      ],
      "outputs": []
    }
  ],
  "metadata": {
    "kernelspec": {
      "display_name": "Python 3",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "name": "python",
      "version": "3.11.0"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 2
}