PandasAI: Analisis Data dengan Natural Language di Python
Pendahuluan
Bayangkan Anda bisa bertanya kepada data Anda dalam bahasa sehari-hari, tanpa perlu menulis query SQL yang rumit atau mengingat syntax Pandas yang kompleks. Itulah yang ditawarkan oleh PandasAI, sebuah library Python yang mengintegrasikan kemampuan Large Language Model (LLM) dengan Pandas DataFrame.
PandasAI memungkinkan data analyst, data scientist, bahkan non-technical stakeholder untuk melakukan analisis data cukup dengan mengetikkan pertanyaan dalam bahasa natural. Library ini secara otomatis mengkonversi pertanyaan Anda menjadi kode Python/Pandas yang executable, menjalankannya, dan mengembalikan hasilnya.
Dalam tutorial ini, kita akan mempelajari cara menggunakan PandasAI secara komprehensif, mulai dari instalasi hingga membangun analitik bisnis yang praktis.
Prasyarat
Sebelum memulai, pastikan Anda memiliki:
- Python 3.9 atau lebih baru
- pip package manager
- API key OpenAI (atau LLM lokal seperti Ollama)
- Pemahaman dasar tentang Pandas DataFrame
Instalasi
Instalasi Dasar
pip install pandasai
Instalasi dengan Dependencies Tambahan
# Dengan dukungan plotting
pip install pandasai[plotting]
Dengan dukungan Excel
pip install pandasai[excel]
Instalasi lengkap
pip install pandasai[all]
Verifikasi Instalasi
import pandasai
print(pandasai.version)
Setup dan Konfigurasi LLM
Menggunakan OpenAI
import os
from pandasai import SmartDataframe
from pandasai.llm.openai import OpenAI
Set API key
os.environ["OPENAIAPIKEY"] = "sk-your-api-key-here"
Atau langsung saat inisialisasi
llm = OpenAI(apitoken="sk-your-api-key-here", model="gpt-4o")
Menggunakan LLM Lokal dengan Ollama
Jika Anda ingin menjalankan analisis secara offline atau menghemat biaya API, Anda bisa menggunakan Ollama:
# Install Ollama terlebih dahulu
curl -fsSL https://ollama.ai/install.sh | sh
Download model
ollama pull llama3
ollama pull codellama
from pandasai.llm.localllm import LocalLLM
Konfigurasi LLM lokal via Ollama
llm = LocalLLM(
apibase="http://localhost:11434/v1",
model="llama3"
)
Menggunakan Azure OpenAI
from pandasai.llm.azureopenai import AzureOpenAI
llm = AzureOpenAI(
apitoken="your-azure-api-key",
azureendpoint="https://your-resource.openai.azure.com/",
apiversion="2024-02-15-preview",
deploymentname="gpt-4o"
)
Query Dasar dengan SmartDataframe
Membuat SmartDataframe
import pandas as pd
from pandasai import SmartDataframe
Buat sample data penjualan
data = {
"produk": ["Laptop", "Mouse", "Keyboard", "Monitor", "Headset",
"Laptop", "Mouse", "Keyboard", "Monitor", "Headset"],
"kategori": ["Elektronik", "Aksesoris", "Aksesoris", "Elektronik", "Aksesoris",
"Elektronik", "Aksesoris", "Aksesoris", "Elektronik", "Aksesoris"],
"harga": [15000000, 250000, 500000, 5000000, 750000,
16000000, 200000, 450000, 5500000, 800000],
"jumlahterjual": [120, 500, 350, 80, 200,
150, 600, 400, 95, 250],
"bulan": ["Januari", "Januari", "Januari", "Januari", "Januari",
"Februari", "Februari", "Februari", "Februari", "Februari"]
}
df = pd.DataFrame(data)
sdf = SmartDataframe(df, config={"llm": llm})
Menjalankan Query Natural Language
# Query sederhana
result = sdf.chat("Berapa total penjualan di bulan Januari?")
print(result)
Query agregasi
result = sdf.chat("Produk apa yang paling banyak terjual?")
print(result)
Query dengan filter
result = sdf.chat("Tampilkan produk dengan harga di atas 1 juta")
print(result)
Query statistik
result = sdf.chat("Berapa rata-rata harga produk per kategori?")
print(result)
Query Kompleks
# Perhitungan revenue
result = sdf.chat(
"Hitung total revenue (harga x jumlahterjual) untuk setiap produk, "
"urutkan dari yang terbesar"
)
print(result)
Perbandingan antar bulan
result = sdf.chat(
"Bandingkan total penjualan Januari vs Februari, "
"produk mana yang mengalami kenaikan?"
)
print(result)
Analisis persentase
result = sdf.chat("Berapa persentase kontribusi setiap kategori terhadap total revenue?")
print(result)
SmartDatalake: Analisis Multi-DataFrame
SmartDatalake memungkinkan Anda menganalisis beberapa DataFrame sekaligus, sangat berguna ketika data tersebar di beberapa tabel.
from pandasai import SmartDatalake
DataFrame Pelanggan
dfpelanggan = pd.DataFrame({
"customerid": [1, 2, 3, 4, 5],
"nama": ["Budi", "Siti", "Ahmad", "Dewi", "Reza"],
"kota": ["Jakarta", "Bandung", "Surabaya", "Jakarta", "Medan"],
"segment": ["Enterprise", "SMB", "Enterprise", "SMB", "Enterprise"]
})
DataFrame Transaksi
dftransaksi = pd.DataFrame({
"transactionid": range(1, 11),
"customerid": [1, 2, 3, 1, 4, 5, 2, 3, 4, 5],
"produk": ["Laptop", "Mouse", "Server", "Monitor", "Keyboard",
"Laptop", "Headset", "Server", "Mouse", "Monitor"],
"amount": [15000000, 250000, 50000000, 5000000, 500000,
16000000, 750000, 55000000, 200000, 5500000],
"tanggal": pd.daterange("2026-01-01", periods=10, freq="W")
})
Gabungkan dalam SmartDatalake
lake = SmartDatalake(
[dfpelanggan, dftransaksi],
config={"llm": llm}
)
Query lintas tabel
result = lake.chat("Siapa pelanggan dengan total pembelian terbesar?")
print(result)
result = lake.chat("Berapa rata-rata transaksi per kota?")
print(result)
result = lake.chat(
"Bandingkan total pembelian antara segment Enterprise dan SMB"
)
print(result)
Plotting dan Visualisasi
PandasAI dapat menghasilkan visualisasi langsung dari query natural language.
import matplotlib
matplotlib.use("Agg") # Untuk environment tanpa GUI
sdf = SmartDataframe(df, config={
"llm": llm,
"savecharts": True,
"savechartspath": "./charts",
"enablecache": True
})
Generate bar chart
result = sdf.chat("Buatkan bar chart total penjualan per produk")
Generate pie chart
result = sdf.chat("Buatkan pie chart distribusi revenue per kategori")
Generate line chart
result = sdf.chat(
"Buatkan line chart perbandingan jumlah terjual per produk "
"antara Januari dan Februari"
)
Chart dengan kustomisasi
result = sdf.chat(
"Buatkan horizontal bar chart top 5 produk berdasarkan revenue, "
"gunakan warna biru dan tambahkan label nilai"
)
Menyimpan dan Mengekspor Chart
# Konfigurasi path penyimpanan
sdf = SmartDataframe(df, config={
"llm": llm,
"savecharts": True,
"savechartspath": "/path/to/charts/directory",
"opencharts": False # Jangan buka otomatis
})
Chart akan tersimpan otomatis di directory yang ditentukan
result = sdf.chat("Buatkan scatter plot harga vs jumlah terjual")
print(f"Chart tersimpan di: {result}")
Custom Prompts dan Konfigurasi Lanjutan
Menggunakan Custom Prompt
from pandasai import SmartDataframe
sdf = SmartDataframe(df, config={
"llm": llm,
"customhead": df.head(3), # Berikan sample data ke LLM
"description": (
"Dataset ini berisi data penjualan produk IT. "
"Kolom 'harga' dalam Rupiah. "
"Kolom 'jumlahterjual' adalah unit yang terjual."
)
})
LLM sekarang memiliki konteks lebih baik
result = sdf.chat("Analisis tren penjualan dan berikan insight")
print(result)
Konfigurasi Response
sdf = SmartDataframe(df, config={
"llm": llm,
"conversational": True, # Response dalam format percakapan
"verbose": True, # Tampilkan proses di console
"maxretries": 3, # Retry jika gagal
"customwhitelisteddependencies": ["scipy", "sklearn"]
})
Menambahkan Skills Custom
from pandasai import Agent
agent = Agent([df], config={"llm": llm})
Tambahkan instruksi khusus
agent.addmessage(
"Selalu format angka dalam Rupiah dengan pemisah ribuan. "
"Gunakan bahasa Indonesia untuk semua response."
)
result = agent.chat("Berapa total revenue?")
print(result)
Caching untuk Performa
PandasAI mendukung caching untuk menghindari pemanggilan API yang berulang untuk query yang sama.
# Aktifkan caching
sdf = SmartDataframe(df, config={
"llm": llm,
"enablecache": True
})
Query pertama akan memanggil LLM
result1 = sdf.chat("Berapa total penjualan?") # Panggil API
Query yang sama akan menggunakan cache
result2 = sdf.chat("Berapa total penjualan?") # Dari cache, lebih cepat
Untuk membersihkan cache
sdf.clearcache()
Konfigurasi Cache Lanjutan
import os
Cache disimpan di directory default
Anda bisa mengubahnya via environment variable
os.environ["PANDASAICACHEPATH"] = "/path/to/cache"
Atau disable cache untuk development
sdf = SmartDataframe(df, config={
"llm": llm,
"enablecache": False
})
Pertimbangan Keamanan
Karena PandasAI mengeksekusi kode yang di-generate oleh LLM, keamanan adalah aspek penting yang harus diperhatikan.
Sandboxing
# PandasAI menjalankan kode dalam environment terbatas
sdf = SmartDataframe(df, config={
"llm": llm,
"enforceprivacy": True, # Jangan kirim data aktual ke LLM
"customwhitelisteddependencies": [
"numpy",
"pandas",
"matplotlib"
] # Hanya izinkan library tertentu
})
Best Practices Keamanan
# 1. Gunakan enforceprivacy untuk data sensitif
sdf = SmartDataframe(df
sensitif, config={
"llm": llm,
"enforceprivacy": True # Hanya kirim metadata, bukan data aktual
})
2. Validasi output sebelum digunakan
result = sdf.chat("Tampilkan data pelanggan")
if isinstance(result, pd.DataFrame):
# Validasi kolom yang dikembalikan
allowedcolumns = ["nama", "kota", "segment"]
result = result[[c for c in result.columns if c in allowedcolumns]]
3. Jangan expose API key di kode
Gunakan environment variable
import os
os.environ["OPENAIAPIKEY"] = "your-key" # Set di .env file, bukan di kode
4. Batasi akses file system
sdf = SmartDataframe(df, config={
"llm": llm,
"savecharts": True,
"savechartspath": "./safedirectory" # Batasi ke directory tertentu
})
Contoh Praktis: Analitik Bisnis E-Commerce
Mari kita bangun contoh analitik bisnis yang komprehensif menggunakan PandasAI.
import pandas as pd
import numpy as np
from pandasai import SmartDatalake, Agent
from datetime import datetime, timedelta
Simulasi data e-commerce
np.random.seed(42)
Data Produk
products = pd.DataFrame({
"productid": range(1, 21),
"namaproduk": [
"Laptop Gaming", "Laptop Office", "Mouse Wireless", "Mouse Gaming",
"Keyboard Mechanical", "Keyboard Membrane", "Monitor 24inch", "Monitor 27inch",
"Headset Gaming", "Headset Wireless", "SSD 500GB", "SSD 1TB",
"RAM 8GB", "RAM 16GB", "Webcam HD", "Webcam 4K",
"USB Hub", "Laptop Stand", "Mousepad XL", "Cable Management"
],
"kategori": [
"Laptop", "Laptop", "Mouse", "Mouse",
"Keyboard", "Keyboard", "Monitor", "Monitor",
"Audio", "Audio", "Storage", "Storage",
"Memory", "Memory", "Camera", "Camera",
"Aksesoris", "Aksesoris", "Aksesoris", "Aksesoris"
],
"harga": [
18000000, 12000000, 350000, 750000,
1200000, 300000, 3500000, 5500000,
1500000, 2000000, 800000, 1500000,
500000, 1000000, 500000, 1500000,
150000, 400000, 200000, 100000
],
"stok": np.random.randint(10, 200, 20)
})
Data Transaksi (3 bulan terakhir)
ntransactions = 500
transactions = pd.DataFrame({
"orderid": range(1, ntransactions + 1),
"productid": np.random.randint(1, 21, ntransactions),
"customerid": np.random.randint(1, 101, ntransactions),
"quantity": np.random.randint(1, 5, ntransactions),
"tanggal": [
datetime(2026, 1, 1) + timedelta(days=np.random.randint(0, 90))
for in range(ntransactions)
],
"paymentmethod": np.random.choice(
["Transfer Bank", "E-Wallet", "Kartu Kredit", "COD"],
ntransactions,
p=[0.35, 0.30, 0.20, 0.15]
)
})
Data Pelanggan
customers = pd.DataFrame({
"customerid": range(1, 101),
"nama": [f"Customer{i}" for i in range(1, 101)],
"kota": np.random.choice(
["Jakarta", "Bandung", "Surabaya", "Medan", "Semarang",
"Yogyakarta", "Makassar", "Bali", "Palembang", "Malang"],
100
),
"tipe": np.random.choice(["Regular", "Premium", "VIP"], 100, p=[0.6, 0.3, 0.1]),
"joindate": [
datetime(2025, 1, 1) + timedelta(days=np.random.randint(0, 365))
for in range(100)
]
})
Inisialisasi Agent dengan semua data
agent = Agent(
[products, transactions, customers],
config={
"llm": llm,
"verbose": True,
"savecharts": True,
"savechartspath": "./businesscharts"
}
)
Analisis 1: Overview Bisnis
print("=" 50)
print("ANALISIS OVERVIEW BISNIS")
print("=" 50)
result = agent.chat(
"Berikan ringkasan bisnis: total revenue, jumlah transaksi, "
"rata-rata nilai order, dan jumlah pelanggan unik"
)
print(result)
Analisis 2: Produk Terlaris
print("\nPRODUK TERLARIS")
result = agent.chat(
"Tampilkan top 5 produk berdasarkan total revenue (harga x quantity), "
"sertakan jumlah unit terjual"
)
print(result)
Analisis 3: Tren Bulanan
print("\nTREN BULANAN")
result = agent.chat(
"Analisis tren penjualan per bulan (Januari, Februari, Maret). "
"Apakah ada pertumbuhan atau penurunan?"
)
print(result)
Analisis 4: Segmentasi Pelanggan
print("\nSEGMENTASI PELANGGAN")
result = agent.chat(
"Bandingkan rata-rata nilai transaksi antara pelanggan Regular, "
"Premium, dan VIP. Kota mana yang memiliki pelanggan VIP terbanyak?"
)
print(result)
Analisis 5: Metode Pembayaran
print("\nANALISIS METODE PEMBAYARAN")
result = agent.chat(
"Buatkan pie chart distribusi metode pembayaran berdasarkan jumlah transaksi"
)
Analisis 6: Rekomendasi Stok
print("\nREKOMENDASI STOK")
result = agent.chat(
"Produk mana yang stoknya perlu ditambah? Bandingkan rata-rata penjualan "
"harian dengan stok saat ini, identifikasi produk yang akan habis "
"dalam 2 minggu ke depan"
)
print(result)
Mengekspor Hasil Analisis
# Export hasil ke Excel
result = agent.chat(
"Buatkan summary table dengan kolom: namaproduk, totalunitsold, "
"totalrevenue, avgmonthlysales"
)
if isinstance(result, pd.DataFrame):
result.toexcel("businesssummary.xlsx", index=False)
print("Summary berhasil diekspor ke businesssummary.xlsx")
Export ke CSV
result = agent.chat("Tampilkan semua transaksi dengan revenue di atas 10 juta")
if isinstance(result, pd.DataFrame):
result.tocsv("highvaluetransactions.csv", index=False)
Tips dan Best Practices
1. Berikan Konteks yang Jelas
# Kurang baik
sdf.chat("total sales")
Lebih baik
sdf.chat(
"Hitung total penjualan (harga x jumlahterjual) "
"untuk semua produk di bulan Januari 2026"
)
2. Gunakan Deskripsi DataFrame
sdf = SmartDataframe(df, config={
"llm": llm,
"description": (
"Data penjualan bulanan produk IT. "
"Harga dalam IDR. "
"Period: Jan-Feb 2026."
)
})
3. Handle Error dengan Graceful
try:
result = sdf.chat("Query yang kompleks")
if result is not None:
print(result)
else:
print("Tidak ada hasil untuk query ini")
except Exception as e:
print(f"Error: {e}")
# Coba dengan query yang lebih sederhana
result = sdf.chat("Tampilkan ringkasan data")
4. Optimalkan Biaya API
# Gunakan model yang lebih murah untuk query sederhana
llmcheap = OpenAI(model="gpt-3.5-turbo")
llmsmart = OpenAI(model="gpt-4o")
Query sederhana
sdfsimple = SmartDataframe(df, config={"llm": llmcheap})
result = sdfsimple.chat("Berapa jumlah baris data?")
Query kompleks
sdfcomplex = SmartDataframe(df, config={"llm": llmsmart})
result = sdfcomplex.chat("Lakukan analisis korelasi mendalam")
Kesimpulan
PandasAI adalah tool yang powerful untuk demokratisasi analisis data. Dengan kemampuan natural language query, siapapun dalam organisasi dapat mengekstrak insight dari data tanpa perlu keahlian coding yang mendalam.
Poin-poin penting yang perlu diingat:
- Mulai dari yang sederhana: Gunakan query basic terlebih dahulu sebelum ke yang kompleks
- Berikan konteks: Semakin jelas query Anda, semakin akurat hasilnya
- Perhatikan keamanan: Gunakan
enforce_privacyuntuk data sensitif - Manfaatkan caching: Hemat biaya API dengan mengaktifkan cache
- Gunakan SmartDatalake: Untuk analisis yang melibatkan multiple DataFrame
- Validasi output: Selalu verifikasi hasil, terutama untuk keputusan bisnis penting
Dengan menggabungkan PandasAI dengan data bisnis Anda, Anda dapat membangun sistem analitik yang interaktif dan mudah digunakan oleh seluruh tim.
Referensi
- Dokumentasi Resmi PandasAI: https://docs.pandas-ai.com
- Repository GitHub PandasAI: https://github.com/Sinaptik-AI/pandas-ai
- OpenAI API Documentation: https://platform.openai.com/docs
- Ollama: https://ollama.ai