PandasAI: Analisis Data dengan Natural Language di Python

# 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 mengi...

By Ruby Abdullah · · tutorial
PandasAIData AnalysisNatural LanguagePandasPython

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(dfsensitif, 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_privacy untuk 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

Artikel Terkait

Tutorial Pandera: Validasi Data Statistik untuk DataFrame

Pandera: Validasi Data Statistik untuk DataFrame pandas dan Polars Pipeline data sering gagal tanpa suara. Sebuah kolom ...

Tutorial MergeKit: Menggabungkan Model LLM untuk Membuat Model AI Kustom

Tutorial MergeKit: Menggabungkan Model LLM untuk Membuat Model AI Kustom Model bahasa besar (LLM) open-source terus berk...

Tutorial LlamaParse: Parsing Dokumen Kompleks untuk RAG Pipeline

Tutorial LlamaParse: Parsing Dokumen Kompleks untuk RAG Pipeline Membangun aplikasi Retrieval-Augmented Generation (RAG)...

Tutorial Semantic Router: Routing Cerdas untuk Aplikasi LLM

Tutorial Semantic Router: Routing Cerdas untuk Aplikasi LLM Semantic Router adalah library Python yang memungkinkan Anda...