PythonPython 데이터 분석강의 8개 중 7번째난이도 기초

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

발행 읽는 시간 약 5 분

  • Python
  • LLM
  • AI
  • pandas-ai
  • LangChain
  • OpenAI
  • 데이터분석

강의 소개

LLM과 데이터 분석을 결합해 자연어로 데이터를 탐색합니다. pandas-ai, LangChain, OpenAI API를 활용해 코드 없이 데이터에 질문하고, AI가 분석을 자동화하는 방법을 배웁니다.

LLM + 데이터 분석 흐름#

Diagram · Mermaid

OpenAI API로 데이터 질문하기#

Python
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))

코드 생성 + 실행 패턴#

Python
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 활용#

Python
# 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으로 데이터 분석 에이전트#

Python
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 보고서 생성#

Python
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)

이상값 자동 설명#

Python
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복잡한 다단계 분석

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

Follow · Ask · Work

이 글이 도움이 됐다면

짧은 작업 기록과 데모는 인스타그램에 올립니다. 만들고 싶은 것이 있다면 프로젝트 의뢰나 협업 제안도 편하게 보내 주세요.

글쓴이

파란여우

직접 만든 AI 앱·제품의 개발·배포를 공개하는 실전형 테크 크리에이터

파란여우 소개 Instagram @bluefox._.hi

이어서 보기

만들고 싶은 것이 있다면 프로젝트 의뢰로 알려 주세요.