PythonPython 데이터 분석 · 7기초

AI 연계 분석 — LLM으로 데이터를 자연어로 탐색하기

PythonLLMAIpandas-aiLangChainOpenAI데이터분석

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

정리

방법도구장점
직접 APIOpenAI API유연성 최대, 커스터마이징 가능
코드 생성GPT + exec재현 가능, 감사 가능
pandas-aiSmartDataframe간단한 인터페이스
LangChain 에이전트create_pandas_dataframe_agent복잡한 다단계 분석

다음 편에서는 실전 프로젝트 — 이커머스 데이터를 처음부터 끝까지 분석하는 종합 프로젝트를 진행합니다.

궁금한 점이 있으신가요?

협업·의뢰는 아래로, 가벼운 소통은 인스타그램 @bluefox._.hi도 환영이에요.