Membangun Agen Analisis Data
Buat agen analisis data dari awal hingga akhir yang menerima berkas CSV dan pertanyaan dalam bahasa alami, menulis kode pandas dan matplotlib secara iteratif, lalu menghasilkan laporan yang rapi.
Membangun Agen Analisis Data adalah pelajaran AI Engineering Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar AI Engineering Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus AI Engineering Academy mencakup 4 pelajaran total.
Visi Agen Analisis Data
Agen analisis data menerima file CSV dan pertanyaan dalam bahasa alami, lalu secara mandiri menjelajahi data, membersihkannya, menghitung statistik, membuat visualisasi, dan menghasilkan laporan yang rapi—semuanya melalui pembuatan serta eksekusi kode secara iteratif. Ini adalah salah satu penerapan agen kode yang paling praktis dan secara langsung meniru alur kerja analis data, tanpa upaya manusia.
Arsitektur Keseluruhan Agen
Agen analisis data memiliki empat fase konseptual: Eksplorasi (memahami bentuk, tipe, dan kualitas data), Pembersihan (menangani nilai yang hilang, pencilan, dan konversi tipe), Analisis (menghitung metrik dan statistik yang menjawab pertanyaan), serta Pelaporan (membuat grafik dan merangkum temuan dalam bentuk tulisan). Setiap fase terdiri atas 1–5 iterasi eksekusi kode.
DATA_AGENT_SYSTEM_PROMPT = '''
You are a data analysis agent. Given a CSV file and a question, answer it through iterative Python code.
Phases to follow:
1. EXPLORE: Load the data, print shape, dtypes, head(), describe(), and check for nulls.
2. CLEAN: Handle missing values, fix dtypes, remove outliers.
3. ANALYZE: Compute statistics, groupbys, correlations - whatever answers the question.
4. REPORT: Generate a matplotlib chart saved to /workspace/chart.png and write a text summary.
Rules:
- Write code in ```python ... ``` blocks.
- Save intermediate results to /workspace/ for use in later steps.
- Print key findings after each computation so you can observe them.
- When all phases are done, say TASK COMPLETE and summarize the answer.
'''Fase 1: Kode Eksplorasi Data
Fase eksplorasi memuat data dan segera mencetak semua informasi yang diperlukan untuk merencanakan analisis: bentuk, nama dan tipe kolom, baris contoh, statistik ringkasan, serta jumlah nilai null. LLM membaca keluaran ini dan menggunakannya untuk mengambil keputusan yang tepat tentang pembersihan dan analisis pada iterasi berikutnya.
import pandas as pd
import numpy as np
# Load dataset
df = pd.read_csv('/workspace/data.csv')
# Basic exploration
print('=== SHAPE ===' )
print(df.shape)
print('\n=== DTYPES ===')
print(df.dtypes)
print('\n=== HEAD ===')
print(df.head())
print('\n=== DESCRIBE ===')
print(df.describe(include='all'))
print('\n=== NULL COUNTS ===')
print(df.isnull().sum())
print('\n=== UNIQUE VALUES (categorical) ===')
for col in df.select_dtypes(include='object').columns:
print(f'{col}: {df[col].nunique()} unique values: {df[col].unique()[:5]}')
# Save for next iteration
df.to_parquet('/workspace/raw.parquet')
print('\nData saved to workspace.')Fase 2: Pembersihan Data
Setelah eksplorasi, agen menulis kode pembersihan yang terarah berdasarkan hal-hal yang diamatinya. Strategi pembersihan bersifat dinamis—jika LLM mengamati 15% nilai null dalam sebuah kolom, LLM memutuskan apakah nilai tersebut akan dihapus atau diimputasi. Jika LLM menemukan nilai negatif dalam kolom yang seharusnya non-negatif, LLM menyaringnya. Pembersihan adaptif yang didasarkan pada pengamatan inilah yang membuat agen benar-benar berguna, bukan sekadar menjalankan alur pemrosesan tetap.
import pandas as pd
import numpy as np
# Load from previous iteration
df = pd.read_parquet('/workspace/raw.parquet')
# Fill numeric nulls with median (robust to outliers)
for col in df.select_dtypes(include='number').columns:
if df[col].isnull().sum() > 0:
median_val = df[col].median()
df[col] = df[col].fillna(median_val)
print(f'Filled nulls in {col} with median {median_val:.2f}')
# Drop rows where categorical key columns are null
df = df.dropna(subset=['category', 'date'])
# Fix date column type
df['date'] = pd.to_datetime(df['date'], errors='coerce')
df = df.dropna(subset=['date']) # drop unparseable dates
# Remove clear outliers: revenue > 3 std deviations from mean
if 'revenue' in df.columns:
z_scores = (df['revenue'] - df['revenue'].mean()) / df['revenue'].std()
df = df[z_scores.abs() < 3]
print(f'Removed outliers, rows remaining: {len(df)}')
df.to_parquet('/workspace/cleaned.parquet')
print('Cleaning complete:', df.shape)Fase 3: Menjawab Pertanyaan
Pada fase analisis, agen berfokus menghitung jawaban spesifik atas pertanyaan pengguna. Jika pertanyaannya adalah 'kategori produk mana yang memiliki pendapatan tertinggi pada kuartal terakhir?', agen menulis kode untuk menyaring berdasarkan tanggal, mengelompokkan berdasarkan kategori, menjumlahkan pendapatan, lalu mengurutkannya. Kode analisis dibuat dari awal berdasarkan pertanyaan dan hal-hal yang diamati agen selama eksplorasi—kode tersebut bukan templat umum.
import pandas as pd
import matplotlib
matplotlib.use('Agg') # non-interactive backend for server use
import matplotlib.pyplot as plt
df = pd.read_parquet('/workspace/cleaned.parquet')
# Analysis: revenue by category for last quarter
df['date'] = pd.to_datetime(df['date'])
last_quarter = df[df['date'] >= '2024-10-01']
revenue_by_category = (
last_quarter
.groupby('category')['revenue']
.sum()
.sort_values(ascending=False)
)
print('Revenue by category (last quarter):')
print(revenue_by_category)
print(f'\nTop category: {revenue_by_category.index[0]} (${revenue_by_category.iloc[0]:,.0f})')
# Save analysis result
revenue_by_category.to_json('/workspace/analysis_result.json')Fase 4: Membuat Grafik
Visualisasi membuat temuan analitis menjadi jelas dan meyakinkan. Agen analisis data membuat grafik matplotlib dan menyimpannya sebagai file PNG di ruang kerja. Keputusan desain grafik utama—jenis grafik, palet warna, label sumbu, judul, dan anotasi—dibuat oleh LLM berdasarkan sifat data. Agen selalu menyimpan grafik ke /workspace/ agar dapat disertakan dalam laporan akhir.
import pandas as pd
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import json
with open('/workspace/analysis_result.json') as f:
data = json.load(f)
categories = list(data.keys())
values = [data[k] / 1e6 for k in categories] # convert to millions
fig, ax = plt.subplots(figsize=(10, 6))
bars = ax.barh(categories, values, color='steelblue', edgecolor='white')
# Add value labels on bars
for bar, val in zip(bars, values):
ax.text(bar.get_width() + 0.05, bar.get_y() + bar.get_height()/2,
f'${val:.1f}M', va='center', fontsize=11)
ax.set_xlabel('Revenue ($ Millions)', fontsize=12)
ax.set_title('Revenue by Product Category - Q4 2024', fontsize=14, fontweight='bold')
ax.invert_yaxis() # highest on top
plt.tight_layout()
plt.savefig('/workspace/chart.png', dpi=150, bbox_inches='tight')
print('Chart saved to /workspace/chart.png')Membuat Laporan Tertulis
Iterasi terakhir menghasilkan laporan ringkasan tertulis. LLM membaca hasil analisis dan deskripsi grafik, lalu menulis narasi yang ringkas dan akurat untuk menjawab pertanyaan awal dengan angka-angka spesifik. Laporan tersebut merujuk pada grafik dan mencakup wawasan utama, data pendukung, serta rekomendasi atau implikasi bagi bisnis.
import json
with open('/workspace/analysis_result.json') as f:
revenue_data = json.load(f)
top_category = max(revenue_data, key=revenue_data.get)
top_revenue = revenue_data[top_category]
total_revenue = sum(revenue_data.values())
share = top_revenue / total_revenue * 100
report = f'''# Q4 2024 Revenue Analysis
## Answer
The **{top_category}** category generated the highest revenue in Q4 2024:
**${top_revenue:,.0f}** ({share:.1f}% of total Q4 revenue).
## Key Findings
- Total Q4 revenue: ${total_revenue:,.0f}
- Top 3 categories: {list(revenue_data.items())[:3]}
- The top category outperformed the average by {top_revenue / (total_revenue / len(revenue_data)):.1f}x
## Chart
See chart.png for the full breakdown by category.
## Recommendation
Consider reallocating marketing budget toward {top_category} to
capitalize on its demonstrated strong performance.
'''
with open('/workspace/report.md', 'w') as f:
f.write(report)
print('TASK COMPLETE')
print(report)Menyusun Pengatur Agen
Pengatur menghubungkan semua fase: menginisialisasi ruang kerja, menyalin CSV masukan, menjalankan perulangan eksekusi kode, memantau sinyal TASK COMPLETE, lalu mengumpulkan file keluaran (report.md, chart.png). Pengatur juga menangani kesalahan, percobaan ulang, dan pembersihan akhir file perantara.
import shutil
from pathlib import Path
def run_data_analysis_agent(csv_path: str, question: str) -> dict:
workspace = setup_workspace()
shutil.copy(csv_path, workspace / 'data.csv')
messages = [
{'role': 'system', 'content': DATA_AGENT_SYSTEM_PROMPT},
{'role': 'user', 'content': f'File: /workspace/data.csv\nQuestion: {question}'}
]
state = ExecutionState(task=question)
for iteration in range(15): # max 15 iterations
response = llm.complete(messages)
code = extract_code_block(response)
if not code or 'TASK COMPLETE' in response:
break
stdout, stderr = execute_in_docker(code, workspace=workspace)
observation = format_observation(stdout, stderr)
messages += [
{'role': 'assistant', 'content': response},
{'role': 'user', 'content': observation}
]
state.after_execution(stdout, f'iteration_{iteration}')
return {
'report': (workspace / 'report.md').read_text() if (workspace / 'report.md').exists() else '',
'chart_path': str(workspace / 'chart.png'),
'iterations': state.iteration
}Menangani Pertanyaan yang Ambigu
Pengguna sering mengajukan pertanyaan ambigu seperti 'produk mana yang berkinerja baik?'. Agen analisis data yang tangguh mengklarifikasi ambiguitas sebelum memulai: agen terlebih dahulu menjelajahi data, mengidentifikasi metrik yang tersedia, lalu menyimpulkan interpretasi yang paling masuk akal atau meminta klarifikasi kepada pengguna. Langkah refleksi ini mencegah agen menghasilkan jawaban yang benar secara teknis tetapi tidak berguna secara praktis.
def handle_ambiguous_question(question: str, df_summary: dict) -> str:
clarification_prompt = f'''The user asked: '{question}'
Available data:
- Columns: {df_summary['columns']}
- Date range: {df_summary['date_range']}
- Metrics available: {df_summary['numeric_columns']}
Is the question clear enough to answer definitively?
If yes, restate the specific interpretation you will use.
If no, list the 2-3 clarifications needed to proceed.'''
response = llm.complete([{'role': 'user', 'content': clarification_prompt}])
return responsePemeriksaan Kualitas Keluaran Agen
Setelah agen selesai, validasilah kualitas output-nya. Periksa apakah file laporan benar-benar telah dibuat, apakah PNG bagan merupakan file gambar yang valid, apakah angka dalam laporan sesuai dengan data di analysis_result.json, dan apakah laporan benar-benar menjawab pertanyaan awal. Langkah QA otomatis menggunakan panggilan LLM kedua dapat mendeteksi kasus ketika agen telah menyelesaikan seluruh alur, tetapi menghasilkan jawaban yang buruk.
def validate_analysis_output(workspace: str, question: str, report: str) -> dict:
validation_prompt = f'''Original question: {question}
Agent report:
{report[:2000]}
Rate this analysis on a scale of 1-5 for:
1. Does it directly answer the question? (1=No, 5=Yes)
2. Are specific numbers cited? (1=No, 5=Yes)
3. Is the conclusion clearly stated? (1=No, 5=Yes)
Return JSON: {{"question_answered": N, "numbers_cited": N, "clear_conclusion": N, "overall": N}}'''
result = llm.complete([{'role': 'user', 'content': validation_prompt}],
response_format={'type': 'json_object'})
scores = json.loads(result)
passed = scores['overall'] >= 4
return {'scores': scores, 'passed': passed}Memperluas Agen dengan Alat Khusus Domain
Agen kode dasar menjadi lebih kuat ketika diperluas dengan alat khusus domain. Untuk agen data keuangan, tambahkan fungsi yang mengambil harga saham terkini. Untuk agen data pemasaran, tambahkan akses ke API Google Analytics. Untuk agen penjualan, tambahkan kueri Salesforce. Alat-alat ini tersedia bagi LLM melalui definisi fungsi dalam perintah sistem atau melalui dekorator @tool milik LangChain.
Pemeriksaan Singkat
Ujilah pemahaman Anda tentang agen analisis data dari pelajaran ini.
Rangkuman Pelajaran
Dalam pelajaran ini, Anda mempelajari bahwa agen analisis data mengikuti empat fase — menjelajah, membersihkan, menganalisis, dan melaporkan — yang masing-masing diimplementasikan melalui pembuatan serta eksekusi kode secara berulang; pembuatan bagan dengan matplotlib dan persistensi status berbasis file menyatukan fase-fase tersebut menjadi alur kerja yang koheren; dan validasi output memastikan jawaban akhir agen benar-benar menjawab pertanyaan awal. Selanjutnya, kita akan mempelajari observabilitas dan penelusuran LLM.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Membangun Agen Analisis Data” gratis?
Ya — teks lengkap “Membangun Agen Analisis Data” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus AI Engineering Academy, upgrade ke CoddyKit PRO. Kursus AI Engineering Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Membangun Agen Analisis Data”?
Buat agen analisis data dari awal hingga akhir yang menerima berkas CSV dan pertanyaan dalam bahasa alami, menulis kode pandas dan matplotlib secara iteratif, lalu menghasilkan laporan yang rapi. Kamu berlatih AI Engineering Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai AI Engineering Academy?
Tidak diperlukan pengalaman sebelumnya. AI Engineering Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.
Berapa lama pelajaran “Membangun Agen Analisis Data” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran AI Engineering Academy ini?
Ya. Setiap pelajaran AI Engineering Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Perulangan Eksekusi Kode
- Pengotakan Pasir dengan Docker dan RestrictedPython
- Mengelola Status di Berbagai Langkah Eksekusi
- Membangun Agen Analisis Data