<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:media="http://search.yahoo.com/mrss/"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>부동산파이썬 &#8211; 투데이즈.kr</title>
	<atom:link href="https://2days.kr/tag/%EB%B6%80%EB%8F%99%EC%82%B0%ED%8C%8C%EC%9D%B4%EC%8D%AC/feed/" rel="self" type="application/rss+xml" />
	<link>https://2days.kr</link>
	<description>투데이즈</description>
	<lastBuildDate>Sun, 16 Nov 2025 13:10:22 +0000</lastBuildDate>
	<language>ko-KR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8</generator>

<image>
	<url>https://2days.kr/wp-content/uploads/2025/10/cropped-simbol-1-32x32.png</url>
	<title>부동산파이썬 &#8211; 투데이즈.kr</title>
	<link>https://2days.kr</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>부동산 매매가 데이터 통계 정보 만들기 2편</title>
		<link>https://2days.kr/21/09/22/56570/it/program/</link>
		
		<dc:creator><![CDATA[urjent]]></dc:creator>
		<pubDate>Sat, 21 Sep 2024 13:32:01 +0000</pubDate>
				<category><![CDATA[program]]></category>
		<category><![CDATA[매매가조회]]></category>
		<category><![CDATA[부동산매매]]></category>
		<category><![CDATA[부동산매매조회]]></category>
		<category><![CDATA[부동산매매크롤링]]></category>
		<category><![CDATA[부동산보고서]]></category>
		<category><![CDATA[부동산자동보고서]]></category>
		<category><![CDATA[부동산정보]]></category>
		<category><![CDATA[부동산파이썬]]></category>
		<category><![CDATA[부동산파이썬크롤링]]></category>
		<guid isPermaLink="false">https://2days.kr/?p=56570</guid>

					<description><![CDATA[부동산 매매가 데이터 통계 정보 만들기 2편 ㅣ 부동산 매매가 데이터를 가지고 추가적인 통계 자료와 시각적인 그래프를 추가적인 코드를 추가하겠습니다. 부동산 매매가로 충분한 데이터를 따로 만들 수 있지만 우리는 이 자료를 자동화 하는 것이 목표이기 때문이죠. 아직 1편을 못보신 분들은 1편을 보고 따라 가시면 쉬울 겁니다~ 부동산 매매가 데이터 통계 정보 만들기 1편 2024.09.21 &#8211; [&#8230;]]]></description>
										<content:encoded><![CDATA[<p data-ke-size="size16">부동산 매매가 데이터 통계 정보 만들기 2편 ㅣ 부동산 매매가 데이터를 가지고 추가적인 통계 자료와 시각적인 그래프를 추가적인 코드를 추가하겠습니다. 부동산 매매가로 충분한 데이터를 따로 만들 수 있지만 우리는 이 자료를 자동화 하는 것이 목표이기 때문이죠.</p>
<p data-ke-size="size16">아직 1편을 못보신 분들은 1편을 보고 따라 가시면 쉬울 겁니다~</p>
<p data-ke-size="size16"><a href="https://2days.kr/21/09/09/56566/coding/data/">부동산 매매가 데이터 통계 정보 만들기 1편</a></p>
<p><a href="https://aboda.kr/entry/%EB%B6%80%EB%8F%99%EC%82%B0-%EB%A7%A4%EB%A7%A4%EA%B0%80-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%86%B5%EA%B3%84-%EC%A0%95%EB%B3%B4-%EB%A7%8C%EB%93%A4%EA%B8%B0-1%ED%8E%B8" target="_blank" rel="noopener">2024.09.21 &#8211; [부동산/자동화 프로젝트] &#8211; 부동산 매매가 데이터 통계 정보 만들기 1편</a></p>
<h3 data-ke-size="size23"><b>부동산 매매가 데이터 통계 정보 만들기 3편</b></h3>
<figure data-ke-type="image" data-ke-mobilestyle="widthOrigin" data-ke-style="alignCenter"><figure style="width: 2560px" class="wp-caption alignnone"><img fetchpriority="high" decoding="async" src="https://blog.kakaocdn.net/dn/bembM4/btsJIt4kHLS/Nm256mOoYJF2mih3enK1tK/img.png" alt="부동산 매매가 데이터 통계 정보 만들기 2편" width="2560" height="2560" data-is-animation="false" data-origin-width="2560" data-origin-height="2560" data-filename="[부동산:자동화 프로젝트] - 부동산 매매가 데이터 통계 정보 만들기 2편.png" data-origin- title="부동산 매매가 데이터 통계 정보 만들기 2편 2"><figcaption class="wp-caption-text">부동산 매매가 데이터 통계 정보 만들기 2편</figcaption></figure></figure><div class='code-block code-block-2' style='margin: 8px auto; text-align: center; display: block; clear: both;'>
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8940400388075870"
     crossorigin="anonymous"></script>
<!-- 중간 -->
<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-8940400388075870"
     data-ad-slot="8794586137"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script></div>

<p data-ke-size="size16">1편에서 만든 코드를 다시 불러오겠습니다.</p>
<pre id="code_1726906830556" class="bash hljs" contenteditable="false" data-ke-language="bash" data-ke-type="codeblock">import streamlit as st
import pandas as pd
import PublicDataReader as pdr
from datetime import datetime
import json
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
import os

<span class="hljs-comment"># Streamlit secrets에서 API 키 및 파일 경로 가져오기</span>
service_key = st.secrets[<span class="hljs-string">"general"</span>][<span class="hljs-string">"SERVICE_KEY"</span>]
json_file_path = <span class="hljs-string">"district.json"</span>

<span class="hljs-comment"># PublicDataReader API 서비스 키 사용</span>
api = pdr.TransactionPrice(service_key)

<span class="hljs-comment"># DistrictConverter 클래스 정의</span>
class DistrictConverter:
    def __init__(self):
        self.districts = self.__read_district_file()

    def __read_district_file(self):
        with open(json_file_path, <span class="hljs-string">'r'</span>) as f:
            <span class="hljs-built_in">return</span> json.loads(f.read())

    def get_si_do_code(self, si_do_name):
        <span class="hljs-keyword">for</span> district <span class="hljs-keyword">in</span> self.districts:
            <span class="hljs-keyword">if</span> si_do_name == district[<span class="hljs-string">"si_do_name"</span>]:
                <span class="hljs-built_in">return</span> district[<span class="hljs-string">"si_do_code"</span>]

    def get_sigungu(self, si_do_code):
        <span class="hljs-keyword">for</span> district <span class="hljs-keyword">in</span> self.districts:
            <span class="hljs-keyword">if</span> si_do_code == district[<span class="hljs-string">"si_do_code"</span>]:
                <span class="hljs-built_in">return</span> district[<span class="hljs-string">"sigungu"</span>]

<span class="hljs-comment"># 사용자 입력 받기</span>
st.title(<span class="hljs-string">"부동산 데이터 조회"</span>)
si_do_name = st.sidebar.text_input(<span class="hljs-string">"시/도를 입력하세요 (예: 서울특별시) 또는 '전국' 입력"</span>, <span class="hljs-string">"전국"</span>)
start_year_month = st.sidebar.text_input(<span class="hljs-string">"조회 시작 년월 (YYYYMM 형식, 예: 202301)"</span>, <span class="hljs-string">""</span>)
end_year_month = st.sidebar.text_input(<span class="hljs-string">"조회 종료 년월 (YYYYMM 형식, 예: 202312)"</span>, <span class="hljs-string">""</span>)
data_query_button = st.sidebar.button(<span class="hljs-string">"데이터 조회"</span>)

<span class="hljs-comment"># 사용자 정의 폰트 설정</span>
font_path = os.path.join(os.getcwd(), <span class="hljs-string">'NanumGothicCoding.ttf'</span>)
fm.fontManager.addfont(font_path)
plt.rcParams[<span class="hljs-string">'font.family'</span>] = <span class="hljs-string">'NanumGothicCoding'</span>

<span class="hljs-comment"># 현재 날짜를 기준으로 기간 설정</span>
now = datetime.now()
<span class="hljs-keyword">if</span> not start_year_month:
    start_year_month = f<span class="hljs-string">"{now.year}01"</span>
<span class="hljs-keyword">if</span> not end_year_month:
    end_year_month = now.strftime(<span class="hljs-string">"%Y%m"</span>)

<span class="hljs-comment"># 진행 상황 표시</span>
progress_text = st.sidebar.empty()
status_text = st.sidebar.empty()

<span class="hljs-keyword">if</span> data_query_button:
    <span class="hljs-keyword">if</span> si_do_name and start_year_month and end_year_month:
        <span class="hljs-comment"># DistrictConverter 인스턴스 생성</span>
        converter = DistrictConverter()

        <span class="hljs-comment"># 데이터 수집 및 처리</span>
        all_data = pd.DataFrame()

        <span class="hljs-keyword">if</span> si_do_name == <span class="hljs-string">"전국"</span>:
            total_count = sum(len(district[<span class="hljs-string">"sigungu"</span>]) <span class="hljs-keyword">for</span> district <span class="hljs-keyword">in</span> converter.districts)
            processed_count = 0

            <span class="hljs-keyword">for</span> district <span class="hljs-keyword">in</span> converter.districts:
                si_do_code = district[<span class="hljs-string">"si_do_code"</span>]
                sigungu_list = district[<span class="hljs-string">"sigungu"</span>]

                <span class="hljs-keyword">for</span> sigungu <span class="hljs-keyword">in</span> sigungu_list:
                    sigungu_code = sigungu[<span class="hljs-string">"sigungu_code"</span>]
                    sigungu_name = sigungu[<span class="hljs-string">"sigungu_name"</span>]

                    <span class="hljs-comment"># 현재 진행 상황 업데이트</span>
                    processed_count += 1
                    progress_text.text(f<span class="hljs-string">"진행율: {100 * processed_count / total_count:.2f}% ({processed_count}/{total_count})"</span>)
                    status_text.text(f<span class="hljs-string">"현재 처리 중: {sigungu_name} ({sigungu_code})"</span>)

                    df = api.get_data(
                        property_type=<span class="hljs-string">"아파트"</span>,
                        trade_type=<span class="hljs-string">"매매"</span>,
                        sigungu_code=sigungu_code,
                        start_year_month=start_year_month,
                        end_year_month=end_year_month
                    )

                    df[<span class="hljs-string">"sigungu_name"</span>] = sigungu_name
                    df[<span class="hljs-string">"si_do_name"</span>] = district[<span class="hljs-string">"si_do_name"</span>]

                    all_data = pd.concat([all_data, df], ignore_index=True)
        <span class="hljs-keyword">else</span>:
            si_do_code = converter.get_si_do_code(si_do_name)
            sigungu_list = converter.get_sigungu(si_do_code)

            total_count = len(sigungu_list)
            processed_count = 0

            <span class="hljs-keyword">for</span> sigungu <span class="hljs-keyword">in</span> sigungu_list:
                sigungu_code = sigungu[<span class="hljs-string">"sigungu_code"</span>]
                sigungu_name = sigungu[<span class="hljs-string">"sigungu_name"</span>]

                <span class="hljs-comment"># 현재 진행 상황 업데이트</span>
                processed_count += 1
                progress_text.text(f<span class="hljs-string">"진행율: {100 * processed_count / total_count:.2f}% ({processed_count}/{total_count})"</span>)
                status_text.text(f<span class="hljs-string">"현재 처리 중: {sigungu_name} ({sigungu_code})"</span>)

                df = api.get_data(
                    property_type=<span class="hljs-string">"아파트"</span>,
                    trade_type=<span class="hljs-string">"매매"</span>,
                    sigungu_code=sigungu_code,
                    start_year_month=start_year_month,
                    end_year_month=end_year_month
                )

                df[<span class="hljs-string">"sigungu_name"</span>] = sigungu_name
                df[<span class="hljs-string">"si_do_name"</span>] = si_do_name

                all_data = pd.concat([all_data, df], ignore_index=True)

        <span class="hljs-comment"># 컬럼 이름 변환</span>
        columns_to_select = {
            <span class="hljs-string">"si_do_name"</span>: <span class="hljs-string">"시도"</span>,
            <span class="hljs-string">"sigungu_name"</span>: <span class="hljs-string">"시군구"</span>,
            <span class="hljs-string">"umdNm"</span>: <span class="hljs-string">"법정동"</span>,
            <span class="hljs-string">"roadNm"</span>: <span class="hljs-string">"도로명"</span>,
            <span class="hljs-string">"bonbun"</span>: <span class="hljs-string">"지번"</span>,
            <span class="hljs-string">"aptNm"</span>: <span class="hljs-string">"아파트"</span>,
            <span class="hljs-string">"buildYear"</span>: <span class="hljs-string">"건축년도"</span>,
            <span class="hljs-string">"excluUseAr"</span>: <span class="hljs-string">"전용면적"</span>,
            <span class="hljs-string">"floor"</span>: <span class="hljs-string">"층"</span>,
            <span class="hljs-string">"dealYear"</span>: <span class="hljs-string">"거래년도"</span>,
            <span class="hljs-string">"dealMonth"</span>: <span class="hljs-string">"거래월"</span>,
            <span class="hljs-string">"dealDay"</span>: <span class="hljs-string">"거래일"</span>,
            <span class="hljs-string">"dealAmount"</span>: <span class="hljs-string">"거래금액"</span>,
            <span class="hljs-string">"aptSeq"</span>: <span class="hljs-string">"일련번호"</span>,
            <span class="hljs-string">"dealingGbn"</span>: <span class="hljs-string">"거래유형"</span>,
            <span class="hljs-string">"estateAgentSggNm"</span>: <span class="hljs-string">"중개사소재지"</span>,
            <span class="hljs-string">"cdealType"</span>: <span class="hljs-string">"해제여부"</span>,
            <span class="hljs-string">"cdealDay"</span>: <span class="hljs-string">"해제사유발생일"</span>
        }

        selected_data = all_data.rename(columns=columns_to_select)[list(columns_to_select.values())]

        <span class="hljs-comment"># 데이터 표로 표시</span>
        st.write(<span class="hljs-string">"### 조회 결과"</span>)
        st.dataframe(selected_data)

        <span class="hljs-comment"># 분석 자료</span>
        st.write(<span class="hljs-string">"### 분석 자료"</span>)
        total_transactions = selected_data.shape[0]
        st.write(f<span class="hljs-string">"총 거래량: {total_transactions}"</span>)

        <span class="hljs-comment"># 매월 거래량</span>
        monthly_transactions = selected_data.groupby([<span class="hljs-string">'거래년도'</span>, <span class="hljs-string">'거래월'</span>]).size().reset_index(name=<span class="hljs-string">'거래량'</span>)
        monthly_transactions[<span class="hljs-string">'합계'</span>] = monthly_transactions[<span class="hljs-string">'거래량'</span>].sum()
        
        st.write(<span class="hljs-string">"매월 거래량"</span>)
        plt.figure(figsize=(10, 6))
        plt.bar(monthly_transactions[<span class="hljs-string">'거래년도'</span>].astype(str) + <span class="hljs-string">'-'</span> + monthly_transactions[<span class="hljs-string">'거래월'</span>].astype(str), monthly_transactions[<span class="hljs-string">'거래량'</span>], color=<span class="hljs-string">'skyblue'</span>)
        plt.title(<span class="hljs-string">'매월 거래량'</span>, fontsize=16)
        plt.xlabel(<span class="hljs-string">'년도-월'</span>, fontsize=14)
        plt.ylabel(<span class="hljs-string">'거래량'</span>, fontsize=14)
        plt.xticks(rotation=45)
        plt.tight_layout()
        st.pyplot(plt)

        st.dataframe(monthly_transactions)

        <span class="hljs-comment"># 지역별 거래량 (월별)</span>
        regional_monthly_transactions = selected_data.groupby([<span class="hljs-string">'거래년도'</span>, <span class="hljs-string">'거래월'</span>, <span class="hljs-string">'시군구'</span>]).size().reset_index(name=<span class="hljs-string">'거래량'</span>)

        <span class="hljs-comment"># 원형 그래프로 거래 비중 시각화</span>
        plt.figure(figsize=(8, 8))
        regional_summary = selected_data[<span class="hljs-string">'시군구'</span>].value_counts()
        plt.pie(regional_summary, labels=regional_summary.index, autopct=<span class="hljs-string">'%1.1f%%'</span>, startangle=140, colors=plt.cm.Paired.colors)
        plt.title(<span class="hljs-string">'지역별 거래 비중'</span>, fontsize=16)
        plt.axis(<span class="hljs-string">'equal'</span>)  <span class="hljs-comment"># Equal aspect ratio ensures that pie is drawn as a circle.</span>
        st.pyplot(plt)

        st.write(<span class="hljs-string">"지역별 거래량 (월별)"</span>)
        regional_pivot = regional_monthly_transactions.pivot_table(index=<span class="hljs-string">'시군구'</span>, columns=<span class="hljs-string">'거래월'</span>, values=<span class="hljs-string">'거래량'</span>, fill_value=0)
        regional_pivot[<span class="hljs-string">'합계'</span>] = regional_pivot.sum(axis=1)
        st.dataframe(regional_pivot)

    <span class="hljs-keyword">else</span>:
        st.error(<span class="hljs-string">"모든 필드를 채워주세요."</span>)</pre>
<figure data-ke-type="image" data-ke-mobilestyle="widthOrigin" data-ke-style="alignCenter"><img decoding="async" src="https://blog.kakaocdn.net/dn/MK1Lr/btsJHQFXTCU/syG0aZC0oiTNEQqCCjB3RK/img.png" data-is-animation="false" data-origin-width="1524" data-origin-height="1272" data-filename="스크린샷 2024-09-21 오후 10.22.01.png" alt="img" title="부동산 매매가 데이터 통계 정보 만들기 2편 3"><figcaption>부동산 매매가 데이터 통계 정보 만들기 2편</figcaption></figure>
<p>이제 이 코드를 바탕으로 아래와 같은 출력을 만들기 위해서, 코드를 수정해보겠습니다.</p>

<pre id="code_1726910337296" class="bash hljs" contenteditable="false" data-ke-language="bash" data-ke-type="codeblock">import streamlit as st
import pandas as pd
import PublicDataReader as pdr
from datetime import datetime
import json
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
import os

<span class="hljs-comment"># Streamlit secrets에서 API 키 및 파일 경로 가져오기</span>
service_key = st.secrets[<span class="hljs-string">"general"</span>][<span class="hljs-string">"SERVICE_KEY"</span>]
json_file_path = <span class="hljs-string">"district.json"</span>

<span class="hljs-comment"># PublicDataReader API 서비스 키 사용</span>
api = pdr.TransactionPrice(service_key)

<span class="hljs-comment"># DistrictConverter 클래스 정의</span>
class DistrictConverter:
    def __init__(self):
        self.districts = self.__read_district_file()

    def __read_district_file(self):
        with open(json_file_path, <span class="hljs-string">'r'</span>) as f:
            <span class="hljs-built_in">return</span> json.loads(f.read())

    def get_si_do_code(self, si_do_name):
        <span class="hljs-keyword">for</span> district <span class="hljs-keyword">in</span> self.districts:
            <span class="hljs-keyword">if</span> si_do_name == district[<span class="hljs-string">"si_do_name"</span>]:
                <span class="hljs-built_in">return</span> district[<span class="hljs-string">"si_do_code"</span>]

    def get_sigungu(self, si_do_code):
        <span class="hljs-keyword">for</span> district <span class="hljs-keyword">in</span> self.districts:
            <span class="hljs-keyword">if</span> si_do_code == district[<span class="hljs-string">"si_do_code"</span>]:
                <span class="hljs-built_in">return</span> district[<span class="hljs-string">"sigungu"</span>]

<span class="hljs-comment"># 사용자 입력 받기</span>
st.title(<span class="hljs-string">"부동산 데이터 조회"</span>)
si_do_name = st.sidebar.text_input(<span class="hljs-string">"시/도를 입력하세요 (예: 서울특별시) 또는 '전국' 입력"</span>, <span class="hljs-string">"전국"</span>)
start_year_month = st.sidebar.text_input(<span class="hljs-string">"조회 시작 년월 (YYYYMM 형식, 예: 202301)"</span>, <span class="hljs-string">""</span>)
end_year_month = st.sidebar.text_input(<span class="hljs-string">"조회 종료 년월 (YYYYMM 형식, 예: 202312)"</span>, <span class="hljs-string">""</span>)
data_query_button = st.sidebar.button(<span class="hljs-string">"데이터 조회"</span>)

<span class="hljs-comment"># 폰트 파일 경로 설정</span>
current_dir = os.getcwd()
font_path = os.path.join(current_dir, <span class="hljs-string">'NanumGothicCoding.ttf'</span>)
fm.fontManager.addfont(font_path)
plt.rcParams[<span class="hljs-string">'font.family'</span>] = <span class="hljs-string">'NanumGothicCoding'</span>  <span class="hljs-comment"># 사용자 선택한 폰트 적용</span>

<span class="hljs-comment"># 현재 날짜를 기준으로 기간 설정</span>
now = datetime.now()
<span class="hljs-keyword">if</span> not start_year_month:
    start_year_month = f<span class="hljs-string">"{now.year}01"</span>
<span class="hljs-keyword">if</span> not end_year_month:
    end_year_month = now.strftime(<span class="hljs-string">"%Y%m"</span>)

<span class="hljs-comment"># 진행 상황 표시</span>
progress_text = st.sidebar.empty()
status_text = st.sidebar.empty()

<span class="hljs-keyword">if</span> data_query_button:
    <span class="hljs-keyword">if</span> si_do_name and start_year_month and end_year_month:
        <span class="hljs-comment"># DistrictConverter 인스턴스 생성</span>
        converter = DistrictConverter()

        <span class="hljs-comment"># 데이터 수집 및 처리</span>
        all_data = pd.DataFrame()

        <span class="hljs-keyword">if</span> si_do_name == <span class="hljs-string">"전국"</span>:
            total_count = sum(len(district[<span class="hljs-string">"sigungu"</span>]) <span class="hljs-keyword">for</span> district <span class="hljs-keyword">in</span> converter.districts)
            processed_count = 0

            <span class="hljs-keyword">for</span> district <span class="hljs-keyword">in</span> converter.districts:
                si_do_code = district[<span class="hljs-string">"si_do_code"</span>]
                sigungu_list = district[<span class="hljs-string">"sigungu"</span>]

                <span class="hljs-keyword">for</span> sigungu <span class="hljs-keyword">in</span> sigungu_list:
                    sigungu_code = sigungu[<span class="hljs-string">"sigungu_code"</span>]
                    sigungu_name = sigungu[<span class="hljs-string">"sigungu_name"</span>]

                    <span class="hljs-comment"># 현재 진행 상황 업데이트</span>
                    processed_count += 1
                    progress_text.text(f<span class="hljs-string">"진행율: {100 * processed_count / total_count:.2f}% ({processed_count}/{total_count})"</span>)
                    status_text.text(f<span class="hljs-string">"현재 처리 중: {sigungu_name} ({sigungu_code})"</span>)

                    df = api.get_data(
                        property_type=<span class="hljs-string">"아파트"</span>,
                        trade_type=<span class="hljs-string">"매매"</span>,
                        sigungu_code=sigungu_code,
                        start_year_month=start_year_month,
                        end_year_month=end_year_month
                    )

                    df[<span class="hljs-string">"sigungu_name"</span>] = sigungu_name
                    df[<span class="hljs-string">"si_do_name"</span>] = district[<span class="hljs-string">"si_do_name"</span>]

                    all_data = pd.concat([all_data, df], ignore_index=True)
        <span class="hljs-keyword">else</span>:
            si_do_code = converter.get_si_do_code(si_do_name)
            sigungu_list = converter.get_sigungu(si_do_code)

            total_count = len(sigungu_list)
            processed_count = 0

            <span class="hljs-keyword">for</span> sigungu <span class="hljs-keyword">in</span> sigungu_list:
                sigungu_code = sigungu[<span class="hljs-string">"sigungu_code"</span>]
                sigungu_name = sigungu[<span class="hljs-string">"sigungu_name"</span>]

                <span class="hljs-comment"># 현재 진행 상황 업데이트</span>
                processed_count += 1
                progress_text.text(f<span class="hljs-string">"진행율: {100 * processed_count / total_count:.2f}% ({processed_count}/{total_count})"</span>)
                status_text.text(f<span class="hljs-string">"현재 처리 중: {sigungu_name} ({sigungu_code})"</span>)

                df = api.get_data(
                    property_type=<span class="hljs-string">"아파트"</span>,
                    trade_type=<span class="hljs-string">"매매"</span>,
                    sigungu_code=sigungu_code,
                    start_year_month=start_year_month,
                    end_year_month=end_year_month
                )

                df[<span class="hljs-string">"sigungu_name"</span>] = sigungu_name
                df[<span class="hljs-string">"si_do_name"</span>] = si_do_name

                all_data = pd.concat([all_data, df], ignore_index=True)

        <span class="hljs-comment"># 컬럼 이름 변환</span>
        columns_to_select = {
            <span class="hljs-string">"si_do_name"</span>: <span class="hljs-string">"시도"</span>,
            <span class="hljs-string">"sigungu_name"</span>: <span class="hljs-string">"시군구"</span>,
            <span class="hljs-string">"umdNm"</span>: <span class="hljs-string">"법정동"</span>,
            <span class="hljs-string">"roadNm"</span>: <span class="hljs-string">"도로명"</span>,
            <span class="hljs-string">"bonbun"</span>: <span class="hljs-string">"지번"</span>,
            <span class="hljs-string">"aptNm"</span>: <span class="hljs-string">"아파트"</span>,
            <span class="hljs-string">"buildYear"</span>: <span class="hljs-string">"건축년도"</span>,
            <span class="hljs-string">"excluUseAr"</span>: <span class="hljs-string">"전용면적"</span>,
            <span class="hljs-string">"floor"</span>: <span class="hljs-string">"층"</span>,
            <span class="hljs-string">"dealYear"</span>: <span class="hljs-string">"거래년도"</span>,
            <span class="hljs-string">"dealMonth"</span>: <span class="hljs-string">"거래월"</span>,
            <span class="hljs-string">"dealDay"</span>: <span class="hljs-string">"거래일"</span>,
            <span class="hljs-string">"dealAmount"</span>: <span class="hljs-string">"거래금액"</span>,
            <span class="hljs-string">"aptSeq"</span>: <span class="hljs-string">"일련번호"</span>,
            <span class="hljs-string">"dealingGbn"</span>: <span class="hljs-string">"거래유형"</span>,
            <span class="hljs-string">"estateAgentSggNm"</span>: <span class="hljs-string">"중개사소재지"</span>,
            <span class="hljs-string">"cdealType"</span>: <span class="hljs-string">"해제여부"</span>,
            <span class="hljs-string">"cdealDay"</span>: <span class="hljs-string">"해제사유발생일"</span>
        }

        selected_data = all_data.rename(columns=columns_to_select)[list(columns_to_select.values())]

        <span class="hljs-comment"># 데이터 표로 표시</span>
        st.write(<span class="hljs-string">"### 조회 결과"</span>)
        st.dataframe(selected_data)

        <span class="hljs-comment"># 분석 자료</span>
        st.write(<span class="hljs-string">"### 분석 자료"</span>)
        total_transactions = selected_data.shape[0]
        st.write(f<span class="hljs-string">"총 거래량: {total_transactions}"</span>)

        <span class="hljs-comment"># 전용면적 데이터 타입 변환 및 결측치 처리</span>
        selected_data[<span class="hljs-string">'전용면적'</span>] = pd.to_numeric(selected_data[<span class="hljs-string">'전용면적'</span>], errors=<span class="hljs-string">'coerce'</span>)
        selected_data.dropna(subset=[<span class="hljs-string">'전용면적'</span>], inplace=True)  <span class="hljs-comment"># 결측치 삭제</span>

        <span class="hljs-comment"># 매월 거래량</span>
        monthly_transactions = selected_data.groupby([<span class="hljs-string">'거래년도'</span>, <span class="hljs-string">'거래월'</span>]).size().reset_index(name=<span class="hljs-string">'거래량'</span>)
        
        <span class="hljs-comment"># 매월 거래량 시각화</span>
        st.header(<span class="hljs-string">"매월 거래량 📅"</span>)
        plt.figure(figsize=(10, 6))
        plt.bar(monthly_transactions[<span class="hljs-string">'거래년도'</span>].astype(str) + <span class="hljs-string">'-'</span> + monthly_transactions[<span class="hljs-string">'거래월'</span>].astype(str), monthly_transactions[<span class="hljs-string">'거래량'</span>], color=<span class="hljs-string">'skyblue'</span>)
        plt.xlabel(<span class="hljs-string">'연도-월'</span>, fontsize=14)
        plt.ylabel(<span class="hljs-string">'거래량'</span>, fontsize=14)
        plt.xticks(rotation=45)
        plt.tight_layout()
        st.pyplot(plt)
        
        <span class="hljs-comment"># 매월 거래량 표</span>
        st.dataframe(monthly_transactions)

        <span class="hljs-comment"># 전용면적 범위별 거래량</span>
        bins = [0, 80, 100, 120, 140, <span class="hljs-built_in">float</span>(<span class="hljs-string">'inf'</span>)]
        labels = [<span class="hljs-string">'0~80'</span>, <span class="hljs-string">'80~100'</span>, <span class="hljs-string">'100~120'</span>, <span class="hljs-string">'120~140'</span>, <span class="hljs-string">'140 이상'</span>]
        selected_data[<span class="hljs-string">'면적 범위'</span>] = pd.cut(selected_data[<span class="hljs-string">'전용면적'</span>], bins=bins, labels=labels, right=False)
        area_counts = selected_data[<span class="hljs-string">'면적 범위'</span>].value_counts().sort_index()

        <span class="hljs-comment"># 전용면적 범위별 거래량 시각화</span>
        st.header(<span class="hljs-string">"전용면적 범위별 거래량 📏"</span>)
        plt.figure(figsize=(10, 6))
        plt.bar(area_counts.index, area_counts.values, color=<span class="hljs-string">'lightgreen'</span>)
        plt.xlabel(<span class="hljs-string">'면적 범위'</span>, fontsize=14)
        plt.ylabel(<span class="hljs-string">'거래량'</span>, fontsize=14)
        plt.xticks(rotation=45)
        plt.tight_layout()
        st.pyplot(plt)
        
        <span class="hljs-comment"># 전용면적 범위별 거래량 표</span>
        st.dataframe(area_counts.reset_index().rename(columns={<span class="hljs-string">'index'</span>: <span class="hljs-string">'면적 범위'</span>, 0: <span class="hljs-string">'거래량'</span>}))

        <span class="hljs-comment"># 지역별 면적 대비 거래량</span>
        regional_area_counts = selected_data.groupby([<span class="hljs-string">'시군구'</span>]).size()
        
        <span class="hljs-comment"># 지역별 면적 대비 거래량 시각화</span>
        st.header(<span class="hljs-string">"지역별 면적 대비 거래량 🌍"</span>)
        plt.figure(figsize=(10, 6))
        plt.bar(regional_area_counts.index, regional_area_counts.values, color=<span class="hljs-string">'salmon'</span>)
        plt.xlabel(<span class="hljs-string">'시군구'</span>, fontsize=14)
        plt.ylabel(<span class="hljs-string">'거래량'</span>, fontsize=14)
        plt.xticks(rotation=45)
        plt.tight_layout()
        st.pyplot(plt)
        
        <span class="hljs-comment"># 지역별 면적 대비 거래량 표</span>
        st.dataframe(regional_area_counts.reset_index().rename(columns={0: <span class="hljs-string">'거래량'</span>, <span class="hljs-string">'시군구'</span>: <span class="hljs-string">'시군구'</span>}))

        <span class="hljs-comment"># 거래유형 분석</span>
        transaction_types = selected_data[<span class="hljs-string">'거래유형'</span>].value_counts()
        
        <span class="hljs-comment"># 거래유형 분석 시각화</span>
        st.header(<span class="hljs-string">"거래유형 분석 🏠"</span>)
        plt.figure(figsize=(10, 6))
        plt.pie(transaction_types, labels=transaction_types.index, autopct=<span class="hljs-string">'%1.1f%%'</span>, startangle=140, colors=[<span class="hljs-string">'#ff9999'</span>,<span class="hljs-string">'#66b3ff'</span>])
        plt.axis(<span class="hljs-string">'equal'</span>)  <span class="hljs-comment"># Equal aspect ratio ensures that pie is drawn as a circle.</span>
        st.pyplot(plt)
        
        <span class="hljs-comment"># 거래유형 분석 표</span>
        st.dataframe(transaction_types.reset_index().rename(columns={<span class="hljs-string">'index'</span>: <span class="hljs-string">'거래유형'</span>, 0: <span class="hljs-string">'거래량'</span>}))

        <span class="hljs-comment"># 거래량 합계</span>
        total_volume = monthly_transactions[<span class="hljs-string">'거래량'</span>].sum()
        st.write(f<span class="hljs-string">"거래량 합계: {total_volume} 🏆"</span>)</pre>
<p>이 코드를 실행하면, 간단한 통계 정보까지 포함합니다. 조금 더 다듬는 과정은 3편에서 진행하겠습니다.</p>
<p>감사합니다.</p>
<p>부동산 관련 크롤링 포스팅 모아서 정리해봅니다.</p>
<p><a href="https://aboda.kr/entry/%EB%B6%80%EB%8F%99%EC%82%B0-%EB%A7%A4%EB%AC%BC-%EC%A0%95%EB%B3%B4-%EC%88%98%EC%A7%91%ED%95%98%EA%B8%B0-%EB%B6%80%EB%8F%99%EC%82%B0-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%84%A4%EC%9D%B4%EB%B2%84-%EB%B6%80%EB%8F%99%EC%82%B0-%ED%81%AC%EB%A1%A4%EB%A7%81-%EB%B0%8F-%EA%B0%80%EA%B3%B5-1" target="_blank" rel="noopener">2024.09.15 &#8211; [부동산/자동화 프로젝트] &#8211; 부동산 매물 정보 수집하기 &#8211; 부동산 데이터 네이버 부동산 크롤링 및 가공 #1</a></p>
<p><a href="https://aboda.kr/entry/%EB%B6%80%EB%8F%99%EC%82%B0-%EB%A7%A4%EB%AC%BC-%EC%A0%95%EB%B3%B4-%EC%88%98%EC%A7%91%ED%95%98%EA%B8%B0-%EB%B6%80%EB%8F%99%EC%82%B0-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%84%A4%EC%9D%B4%EB%B2%84-%EB%B6%80%EB%8F%99%EC%82%B0-%ED%81%AC%EB%A1%A4%EB%A7%81-%EB%B0%8F-%EA%B0%80%EA%B3%B5-2" target="_blank" rel="noopener">2024.09.15 &#8211; [부동산/자동화 프로젝트] &#8211; 부동산 매물 정보 수집하기 &#8211; 부동산 데이터 네이버 부동산 크롤링 및 가공 #2</a></p>
<p><a href="https://aboda.kr/entry/%EB%B6%80%EB%8F%99%EC%82%B0-%EB%A7%A4%EB%AC%BC-%EC%A0%95%EB%B3%B4-%EC%88%98%EC%A7%91%ED%95%98%EA%B8%B0-%EB%B6%80%EB%8F%99%EC%82%B0-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%84%A4%EC%9D%B4%EB%B2%84-%EB%B6%80%EB%8F%99%EC%82%B0-%ED%81%AC%EB%A1%A4%EB%A7%81-%EB%B0%8F-%EA%B0%80%EA%B3%B5-3" target="_blank" rel="noopener">2024.09.15 &#8211; [부동산/자동화 프로젝트] &#8211; 부동산 매물 정보 수집하기 &#8211; 부동산 데이터 네이버 부동산 크롤링 및 가공 #3</a></p>
<p><a href="https://aboda.kr/entry/%EA%B3%A0%EA%B8%89-%EB%B6%80%EB%8F%99%EC%82%B0-%EC%A0%95%EB%B3%B4-%ED%95%84%ED%84%B0-%EA%B3%A0%EB%8F%84%ED%99%94-%EB%84%A4%EC%9D%B4%EB%B2%84-%EB%A7%A4%EB%AC%BC-%EC%A0%95%EB%A6%AC%ED%95%98%EA%B8%B0" target="_blank" rel="noopener">2024.09.17 &#8211; [부동산/자동화 프로젝트] &#8211; [고급] 부동산 정보 필터 고도화 &#8211; 네이버 매물 정리하기</a></p>
<p>&nbsp;</p>
<p># 부동산매매, 부동산매매크롤링, 부동산정보, 매매가조회, 부동산매매조회, 부동산보고서, 부동산자동보고서, 부동산파이썬, 부동산파이썬크롤링</p>
<!-- CONTENT END 2 -->
]]></content:encoded>
					
		
		
		<media:content url="https://2days.kr/wp-content/uploads/2024/09/부동산자동화-프로젝트-부동산-매매가-데이터-통계-정보-만들기-2편.png" medium="image"></media:content>
            	</item>
	</channel>
</rss>
