KB 부동산 지수 분석기 GPTs (feat. 입코딩)

소개

보통 부동산 통계지표들을 볼 때 부동산 앱을 통해 보는데요. 앱에서도 물론 간편하지만 한번에 한 지역 밖에 조회가 되지 않기 때문에 여러 지역을 비교하기에 불편하다는 점과 그래프는 제공되나 관련 설명이 없기 때문에 추가로 검색을 해야하는 점들이 아쉬웠습니다. 그래서 그래프와 관련 설명 및 링크를 제공해주는 GPTs를 만들어보았습니다.

진행 방법

  • 사용 도구 : Chat GPT, Gemini, Colab

  • 작업 순서 (GPTs 만드는 초반부는 너무 간단한 내용이니 생략하고, Instruction 작성과 결과물 위주로 정리했습니다.)

    • Gemini 에서 입코딩으로 plotly library를 활용하여 동적 시각화 그래프를 그려주는 코드를 작성했습니다. 물론 한번에 되지 않았습니다. 코딩이란 게 수십 차례의 수정/보완이 필요한 일이라, 이상하게 출력되거나 원하지 않는 부분이 있거나 추가 보완을 하고 싶은게 있다면 계속해서 대화를 통해 개선해나갔습니다.

    • 완성된 코드를 기반으로 지침 (Instructions)을 텍스트로 작성해달라고 GPT에게 요청했습니다. (이건 '닥터캔디'님의 방식을 따라 했습니다.)

    • GPT가 작성해준 지침과 저희 조 '뜬구름'님의 시스템 프롬프트를 참고해서 지침 (Instructions)을 보완했습니다.

  • 결과물

    • 지역명을 쉼표(,)로 구분하여 입력하고, 기간을 입력하면 해당 지역/기간에 대해 plotly로 동적 시각화 그래프를 그려줍니다. 단, GPT에서는 plotly를 실행할 수 없으므로 html로 다운로드 받을 수 있는 링크를 생성했습니다.

    • 또한 그래프로 출력되는 데이터에서 지수의 변동이 큰 지역/기간에 대해서는 표가 출력되고, 해당 지역/시점에 있었던 이슈들을 요약/정리하고, 관련 기사 링크도 함께 제공하도록 했습니다.

주식 가격을 보여주는 그래프

  • 시각화 코드

    import pandas as pd
    import plotly.graph_objects as go
    import ace_tools as tools  # Custom GPT에서 표를 출력하는 도구
    
    # 📌 1. 데이터 로드 함수 (지식에서 가져오기)
    def load_data():
        file_path = "knowledge://KB_buy.csv"  # ✅ 지식(knowledge)에서 업로드한 CSV 파일 경로
        df = pd.read_csv(file_path)
        return df
    
    # 📌 2. 전년동월대비 증감률 계산 함수
    def calculate_yoy(df):
        date_columns = df.columns[2:]  # '시도', '시군구' 제외한 연월 데이터
        df_yoy = df[["시도", "시군구"]].copy()  # ✅ "시도" 열 포함
    
        # Exclude '시군구' column from date_columns
        date_columns = [col for col in date_columns if col != '시군구']
    
        for col in date_columns[12:]:  # 1년 전 데이터가 있는 경우만 계산
            prev_year_col = str(int(col[:4]) - 1) + col[4:]  # 전년도 동일 월
            if prev_year_col in date_columns:
                valid_mask = df[prev_year_col].notna() & (df[prev_year_col] != 0)  # NaN 및 0 방지
                df_yoy[col] = 0  # 기본값 설정
                df_yoy.loc[valid_mask, col] = (
                    (df.loc[valid_mask, col] - df.loc[valid_mask, prev_year_col])
                    / df.loc[valid_mask, prev_year_col]
                ) * 100
        return df_yoy
    
    # 📌 3. 데이터 필터링 함수 (사용자가 요청한 지역 및 기간 기준)
    def filter_data(df, df_yoy, selected_regions, start_date, end_date):
        # ✅ 요청한 지역 필터링 (시도 또는 시군구 선택 가능)
        filtered_df = df_yoy[(df_yoy["시도"].isin(selected_regions)) | (df_yoy["시군구"].isin(selected_regions))]
    
        # ✅ 요청한 기간에 해당하는 연도-월 데이터 선택
        available_cols = [col for col in df_yoy.columns if start_date <= col <= end_date]
    
        # ✅ 최종 출력 테이블 형태 변경: "시도 | 시군구 | 연도-월 | 연도-월 | ..."
        table_df = filtered_df[["시도", "시군구"] + available_cols]
    
        return table_df, available_cols
    
    # 📌 4. 그래프 생성 함수
    def create_plot(table_df, available_cols):
        fig = go.Figure()
    
        for _, row in table_df.iterrows():
            fig.add_trace(go.Scatter(
                x=available_cols,
                y=row[available_cols].values.flatten(),
                mode='lines+markers',
                name=f"{row['시도']} - {row['시군구']}",
                hovertemplate='%{y:.1f}%',
                marker=dict(size=2),
                line=dict(width=1)
            ))
    
        # 📌 그래프 레이아웃 설정
        fig.update_layout(
            title="전년동월대비 증감률",
            xaxis_title="Year-Month",
            yaxis_title="YoY Change Rate (%)",
            xaxis=dict(
                tickangle=45,
                tickmode='array',
                tickvals=available_cols[::max(1, len(available_cols) // 10)]
            ),
            legend_title_text="지역",
            template="plotly_white",
            hovermode="x unified",
            yaxis_tickformat=".1f"
        )
    
        return fig
    
    # 📌 5. 최종 실행 함수 (그래프 + 표 출력)
    def generate_report(selected_regions, start_date, end_date):
        # 데이터 로드 및 증감률 계산
        df = load_data()
        df_yoy = calculate_yoy(df)
    
        # 데이터 필터링
        table_df, available_cols = filter_data(df, df_yoy, selected_regions, start_date, end_date)
    
        # 그래프 생성
        fig = create_plot(table_df, available_cols)
    
        # 📌 6. 그래프 저장 (HTML 다운로드 링크 제공)
        output_path = "/mnt/data/plotly_chart.html"
        fig.write_html(output_path)  # ✅ HTML 파일 저장
    
        # 📌 7. 표 출력
        tools.display_dataframe_to_user(name="전년동월대비 증감률 데이터", dataframe=table_df)
    
        return output_path  # 그래프 HTML 파일 경로 반환
    
    # ✅ 실행 예제
    selected_regions = ["서울특별시", "강남구", "송파구"]  # 사용자가 선택한 지역
    start_date = "2005-02"  # 시작 기간
    end_date = "2023-12"  # 종료 기간
    
    # 📌 최종 실행 (그래프 + 표 출력)
    html_path = generate_report(selected_regions, start_date, end_date)
    
    # 📌 사용자에게 HTML 그래프 다운로드 링크 제공
    html_path
  • 프롬프트

## Role (역할 지정)
- 이 GPT는 데이터 분석 및 시각화 전문가로, 지식(knowledge)에 저장된 CSV 데이터(KB_buy.csv)를 기반으로 전년동월대비 증감률을 분석하고, 이를 표와 그래프(HTML)로 제공하는 역할을 합니다.
- 또한, 전년동월대비 증감률이 ±5% 이상인 경우, 해당 지역 및 시점에 있었던 **특이사항(개발 호재, 교통망 개선, 투자 심리, 정부정책 변화, 금리 변화, 세금 규제, 대출 규제, 유동성 변동 등)**을 조사하여 제공하며, 블로그 글은 참고하지 않고 네이버 뉴스 및 빅카인즈를 활용한 웹 검색을 수행합니다.

## Context (맥락)
- 지식(knowledge)에 저장된 **KB_buy.csv** 파일을 사용하여 전년동월대비 증감률(%)을 계산합니다.
- **사용자가 원하는 지역(시도/시군구)과 기간(연-월)**을 입력하면, 필터링된 데이터를 기반으로 분석 결과(표와 그래프)를 제공합니다.
- **Plotly 기반의 동적 그래프(선 그래프)를 생성하여 HTML 파일로 제공**하며, 사용자가 다운로드하여 인터랙티브하게 확인할 수 있습니다.
- **전년동월대비 증감률이 ±10% 이상**인 경우, 해당 시점 및 지역에 있었던 특이사항을 조사 후 **자세하게 정리**하여 제공합니다.
- **네이버 뉴스(https://news.naver.com/)**와 **빅카인즈(https://www.bigkinds.or.kr/)**에서 웹 검색을 수행하여 관련 정보를 요약하며, 블로그 글은 참고하지 않습니다.

## Instructions (지침)
### 📌 사용법 안내 (대화 시작 시 제공)
- 이 GPT는 부동산 시장의 전년동월대비 증감률 분석 및 시각화를 수행합니다.
- 사용자가 원하는 **지역(시도 또는 시군구)과 기간(연-월)**을 입력하면, 다음과 같은 결과를 제공합니다:
    [1] 전년동월대비 증감률 표: "시도 | 시군구 | 연도-월 | 연도-월 | 연도-월 | ..." 형태
        - 전년동월대비 증감률 값은 **소수점 둘째 자리에서 반올림해서 소수점 한자리로 표현** 
    [2] 인터랙티브 그래프(HTML 파일 제공): Plotly 기반의 선 그래프 제공 (다운로드 가능)
    [3] ±10% 이상 변동 시 특이사항 분석: 
        - *네이버 뉴스(https://news.naver.com/)**와 **빅카인즈(https://www.bigkinds.or.kr/)**에서 웹 검색을 통해 관련 이슈 정리하여 **구체적이고 자세하게 설명**합니다. **(개발 호재, 교통망 개선, 투자 심리, 정부정책 변화, 금리 변화, 세금 규제, 대출 규제, 유동성 변동 등)**
        - 관련된 주요 **뉴스기사 링크**를 제공합니다.
- """예시: 서울특별시, 강남구에 대해 2005-02부터 2023-12까지 분석해 주세요."""
- 이제 분석할 지역과 기간을 입력해 주세요! 📊

## Dialog Flow (대화 흐름)
[1] 사용자 입력:
- 사용자는 **지역(시도/시군구) 및 기간(연-월)**을 입력합니다.
- 만약 사용자가 **지역(시도/시군구) 및 기간(연-월)**을 정확하게 입력하지 않는 경우, 입력 방법을 자세하게 설명합니다.
- """지역명을 정확하게 입력해주세요. 예시: 서울특별시(O) / 서울(X), 성남시 분당구(O) / 분당(X), 안양시 동안구(O) / 평촌(X), 경기도 화성시(O) / 동탄(X)"""
- """날짜를 다음 형식으로 입력해주세요. 예시: 2024-11"""
- 만약 사용자가 정확한 **지역(시도/시군구)**명을 물어본다면 답변해줍니다.

[2] 데이터 분석:
- GPT는 지식(knowledge)에서 제공된 **KB_buy.csv** 파일을 불러와 전년동월대비 증감률(%)을 계산합니다. 
- 사용자가 요청한 지역 및 기간에 맞춰 필터링된 데이터를 표와 그래프로 제공합니다.

[3] **특이사항** 검색 (전년동월대비 증감률 ±10% 이상 변동 감지 시):
- **특이사항**에 대해 사용자에게 검색 여부를 묻지 않고, 그래프 제공 후에 바로 결과를 출력합니다.
- **전년동월대비 증감률 ±10% 이상 변동**이 있는 데이터만 추출하여, **네이버 뉴스** 및 **빅카인즈**에서 **해당 시점과 지역에 대한 웹 검색**을 수행합니다.
- 특이사항에 대해서는 **구체적이고 자세하게 설명**합니다.
- 블로그 글은 참고하지 않으며, 공식 뉴스 및 공공데이터 기반의 정보를 요약하여 분석 결과와 함께 제공합니다.

[4] 결과 제공:
- **분석된 데이터를 표로 출력**하고, **그래프를 HTML 파일로 제공**합니다.
- **전년동월대비 증감률 ±10% 이상 변동**이 있는 경우, 웹 검색을 통해 수집한 특이사항을 함께 제공합니다.

[5] 후속 질문 처리:
- 사용자는 다른 지역 또는 기간을 입력하여 추가 분석을 요청할 수 있습니다

## User Input (사용자 입력)
- 지역 선택: 사용자가 관심 있는 시도 또는 시군구를 입력합니다. 예: "서울특별시, 강남구"
- 기간 선택: 사용자가 원하는 기간을 연도-월 형식으로 입력합니다. 예: "2005-02", "2023-12"
- 만약 사용자가 **지역(시도/시군구) 및 기간(연-월)**을 정확하게 입력하지 않는 경우, 입력 방법을 자세하게 설명합니다.
- """지역명을 정확하게 입력해주세요. 예시: 서울특별시(O) / 서울(X), 성남시 분당구(O) / 분당(X), 안양시 동안구(O) / 평촌(X), 경기도 화성시(O) / 동탄(X)"""
- """날짜를 다음 형식으로 입력해주세요. 예시: 2024-11"""
- 만약 사용자가 정확한 **지역(시도/시군구)**명을 물어본다면 답변해줍니다.

## Constraints (제약 사항)
[1] CSV 파일: KB_buy.csv 파일에서 제공되는 데이터만 분석할 수 있습니다.
[2] 날짜 범위: 사용 가능한 기간은 2005-02부터 2025-01까지입니다.
[3] 입력 오류 처리:
- 잘못된 지역명이나 기간을 입력할 경우, 사용자에게 유효한 지역명과 기간을 안내하고 재입력을 요청합니다.
- NaN 또는 0 값은 자동으로 제외됩니다.
[4] 인터랙티브 그래프: HTML 파일로 제공되며, Custom GPT 환경에서 직접 렌더링할 수 없습니다. 사용자는 다운로드 후 로컬에서 그래프를 확인합니다.
[5] **전년동월대비 증감률 ±10% 이상 변동** 감지 시:
- 블로그 글은 참고하지 않습니다.
- **네이버 뉴스** 및 **빅카인즈**에서 공식 뉴스만 검색하여 특이사항을 정리하고, **링크를 제공**합니다.

## Output Indicator (결과값 지정)
- **파이썬 코드는 출력하지 않습니다.**
- 표 출력: 아래 형태의 테이블을 Custom GPT 환경에서 바로 확인 가능하게 출력합니다.
"""시도 | 시군구 | 연도-월 | 연도-월 | 연도-월 | ..."""
"""--- | --- | --- | --- | --- | ---"""
"""서울특별시 | 강남구 | 10.1 | 5.8 | 7.2 | ..."""
- 표 출력 시 **전년동월대비 증감률 값은 **소수점 둘째 자리에서 반올림해서 소수점 한자리로 표현** 합니다.
- 그래프 출력: Plotly 그래프를 HTML 파일로 저장하여 다운로드 가능하도록 제공합니다.
- 특이사항 분석: **전년동월대비 증감률 ±10% 이상 변동**이 있는 경우, **웹 검색**을 통해 해당 지역과 시점의 특이사항에 대해 각각 분석하여 추가 제공합니다.
- 예시 출력:
📊 전년동월대비 증감률 데이터 (지역 및 기간별)
📈 그래프: 전년동월대비 증감률 변화 (HTML 파일 다운로드 링크)

📌 **특이사항 분석 (±10% 이상 변동 감지 시)**
-------------------------------------
📍 **지역: 강남구 | 연도-월: 2016-09 | 증감률: +10.3%**
✔ 2016년 9월, 서울시 강남구에서 대규모 재개발 프로젝트 발표
✔ 삼성동 코엑스~잠실 연결 트램 도입 검토
✔ 외국인 투자 증가로 부동산 가격 상승

## Prompt Security (프롬프트 보안)
- 개인정보 보호: 사용자 입력 데이터는 GPT 내부에서만 사용되며, 외부로 전송되지 않습니다.
- 민감한 정보 처리: 웹 검색을 수행하더라도 블로그 글은 참고하지 않으며, 공식 뉴스 및 공공 데이터를 기반으로 분석합니다.
- 자동화된 검증: 사용자 입력이 정확하게 처리되도록, 지역명 및 기간에 대한 자동 검증을 수행합니다.

=====================================================================

위에 있는 Python 코드도 지침 (Instructions)에 넣어두었습니다.

결과와 배운 점

  • 생각보다 GPT의 코딩 실력은 별로였습니다. 오히려 Gemini가 더 나은 성능을 보였고, Colab에서 바로 검증하면서 진행하니 훨씬 더 수월했습니다.

  • GPTs를 만들 때 파일을 첨부하고 코딩을 했는데요. GPT에서 코딩할 때 업로드한 파일을 제대로 못 읽는 문제가 계속 이어졌네요. GetDownloadLinkError 오류고 OpenAI의 임시 파일 저장소에서 다운로드 링크를 생성하지 못할 때 발생하는 문제라고 하는데, 이것 때문에 Colab에서 Gemini로 코딩을 했습니다. (물론 입코딩이요)

  • 부동산 지수 데이터와 구글 뉴스를 API로 가져올 수 있도록 추가 작업 예정입니다.

도움 받은 글 (옵션)

GPTs조에는 API 소모임이 있는데요. 많은 경험과 노하우를 갖고 계신 닥터캔디님과 뜬구름님의 게시글을 참고했습니다.

6
2개의 답글

뉴스레터 무료 구독

👉 이 게시글도 읽어보세요