LLM + 데이터 분석 흐름
flowchart LR
USER["자연어 질문"]
LLM["LLM\n(GPT / Claude)"]
CODE["Python 코드 생성"]
DATA["데이터프레임 실행"]
ANSWER["자연어 답변"]
USER --> LLM --> CODE --> DATA --> ANSWER
OpenAI API로 데이터 질문하기
import pandas as pd
import numpy as np
from openai import OpenAI
client = OpenAI() # OPENAI_API_KEY 환경변수 필요
# 샘플 데이터
df = pd.DataFrame({
"월": range(1, 13),
"매출": [120, 135, 148, 162, 175, 190, 185, 178, 165, 155, 145, 160],
"비용": [80, 88, 92, 105, 112, 120, 118, 115, 108, 100, 95, 105],
})
df["이익"] = df["매출"] - df["비용"]
def ask_data(question: str, df: pd.DataFrame) -> str:
# 데이터 개요를 컨텍스트로 제공
context = f"""
데이터프레임 정보:
- 열: {list(df.columns)}
- 행 수: {len(df)}
- 샘플:
{df.head(3).to_string()}
통계:
{df.describe().to_string()}
"""
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{
"role": "system",
"content": "당신은 데이터 분석가입니다. 데이터를 분석하고 인사이트를 한국어로 설명합니다.",
},
{
"role": "user",
"content": f"{context}\n\n질문: {question}",
},
],
)
return response.choices[0].message.content
# 자연어로 데이터 탐색
print(ask_data("매출이 가장 높은 달과 낮은 달은?", df))
print(ask_data("이익률 추세를 분석해줘", df))
코드 생성 + 실행 패턴
def analyze_with_code(question: str, df: pd.DataFrame):
schema = df.dtypes.to_string()
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{
"role": "system",
"content": """Python pandas 코드만 생성합니다.
- 변수명 df 사용
- 결과를 result 변수에 저장
- import 없이 pandas는 pd, numpy는 np로 사용 가능
- 코드만 출력, 설명 없음""",
},
{
"role": "user",
"content": f"스키마:\n{schema}\n\n질문: {question}",
},
],
)
code = response.choices[0].message.content.strip()
# 마크다운 코드 블록 제거
if code.startswith("```"):
code = "\n".join(code.split("\n")[1:-1])
# 코드 실행
local_vars = {"df": df.copy(), "pd": pd, "np": np}
exec(code, local_vars)
return local_vars.get("result"), code
result, code = analyze_with_code("월별 이익률(이익/매출*100)을 계산하고 평균 이익률을 구해줘", df)
print(f"생성된 코드:\n{code}")
print(f"\n결과:\n{result}")
pandas-ai 활용
# pip install pandasai
from pandasai import SmartDataframe
from pandasai.llm import OpenAI as PandasOpenAI
llm = PandasOpenAI(api_token="your-api-key")
sdf = SmartDataframe(df, config={"llm": llm})
# 자연어로 질문
response = sdf.chat("매출과 이익의 상관관계를 분석해줘")
print(response)
# 시각화 요청
sdf.chat("월별 매출과 이익을 비교하는 막대 그래프를 그려줘")
LangChain으로 데이터 분석 에이전트
from langchain_openai import ChatOpenAI
from langchain_experimental.agents import create_pandas_dataframe_agent
from langchain.agents.agent_types import AgentType
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
agent = create_pandas_dataframe_agent(
llm,
df,
verbose=True,
agent_type=AgentType.OPENAI_FUNCTIONS,
allow_dangerous_code=True,
)
# 복잡한 분석 질문
agent.invoke("이익이 전월 대비 감소한 달을 모두 찾고, 감소율을 계산해줘")
agent.invoke("계절성 패턴이 있는지 분석하고 인사이트를 제공해줘")
자동 EDA 보고서 생성
import json
def generate_eda_report(df: pd.DataFrame) -> str:
stats = {
"shape": df.shape,
"columns": list(df.columns),
"dtypes": df.dtypes.astype(str).to_dict(),
"missing": df.isnull().sum().to_dict(),
"describe": df.describe().to_dict(),
"correlations": df.select_dtypes(include="number").corr().to_dict(),
}
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{
"role": "system",
"content": "데이터 분석 전문가로서 EDA 보고서를 한국어 마크다운으로 작성합니다.",
},
{
"role": "user",
"content": f"""다음 데이터 통계를 기반으로 EDA 보고서를 작성해주세요:
{json.dumps(stats, ensure_ascii=False, indent=2)}
포함할 내용:
1. 데이터 개요
2. 주요 통계적 특성
3. 상관관계 분석
4. 주요 인사이트 3가지
5. 추천 분석 방향""",
},
],
)
return response.choices[0].message.content
report = generate_eda_report(df)
print(report)
이상값 자동 설명
def explain_anomalies(df: pd.DataFrame, column: str) -> str:
Q1 = df[column].quantile(0.25)
Q3 = df[column].quantile(0.75)
IQR = Q3 - Q1
anomalies = df[(df[column] < Q1 - 1.5*IQR) | (df[column] > Q3 + 1.5*IQR)]
if anomalies.empty:
return f"{column} 열에 이상값이 없습니다."
context = f"""
컬럼: {column}
전체 통계: 평균={df[column].mean():.2f}, 표준편차={df[column].std():.2f}
Q1={Q1:.2f}, Q3={Q3:.2f}, IQR={IQR:.2f}
이상값:
{anomalies[[column]].to_string()}
"""
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "system", "content": "데이터 이상값을 분석하고 가능한 원인을 한국어로 설명합니다."},
{"role": "user", "content": context},
],
)
return response.choices[0].message.content
정리
| 방법 | 도구 | 장점 |
|---|---|---|
| 직접 API | OpenAI API | 유연성 최대, 커스터마이징 가능 |
| 코드 생성 | GPT + exec | 재현 가능, 감사 가능 |
| pandas-ai | SmartDataframe | 간단한 인터페이스 |
| LangChain 에이전트 | create_pandas_dataframe_agent | 복잡한 다단계 분석 |
다음 편에서는 실전 프로젝트 — 이커머스 데이터를 처음부터 끝까지 분석하는 종합 프로젝트를 진행합니다.