국토교통부실거래가 + 네이버매매호가를 조합한 통계

지역별 아파트 매매호가대비 실거래가 비율
>Ratio of Actual Transaction Price to Asking Price for Apartment Sales by Region(2019~2024)

현재 네이버매매호가 대비, 과거 실거래가(최대매매가격)을 비교했을때의 비율을 알고싶어서 작성해보았습니다.

 

app.js
0.01MB
index.html
0.02MB

 

호가 대비 실거래가 비율

        string sql = $@"
SELECT A.ComplexName, 
       A.AreaSquareMeters,  -- 전용면적(㎡)
       MAX(A.TransactionAmount) AS MaxTransactionAmount,  -- 실거래가 최대값
       MAX(CAST(B.MAXPRICE AS REAL)) AS MaxMarketPrice,  -- 최대 호가 값
       MAX(A.TransactionAmount) / MAX(CAST(B.MAXPRICE AS REAL)) * 100 AS RealToMarketRatio,  -- 실거래가 대비 호가 비율
       B.COMPLEXNAME, 
       B.LNBRMNNM, 
       B.LNBRSLNO
FROM REALESTATEAPTALL A
JOIN (
    SELECT COMPLEXNAME, LNBRMNNM, LNBRSLNO, MAX(MAXPRICE) AS MAXPRICE
    FROM ESTATENAVERALLINFOATTACH
    WHERE CORTARADDRESS LIKE '{cityCountryText}%' AND REALESTATETYPECODE <> 'OPST'
    GROUP BY COMPLEXNAME, LNBRMNNM, LNBRSLNO
) B
ON A.ComplexName = B.COMPLEXNAME 
AND A.MainNumber = B.LNBRMNNM 
AND A.SubNumber = B.LNBRSLNO
WHERE A.CityCounty LIKE '{cityCountryNM}%'
AND B.MAXPRICE IS NOT NULL AND B.MAXPRICE != ''  -- 빈 값 및 NULL 처리
GROUP BY A.ComplexName, A.AreaSquareMeters, B.COMPLEXNAME, B.LNBRMNNM, B.LNBRSLNO
ORDER BY RealToMarketRatio DESC, A.AreaSquareMeters DESC  -- 실거래가 최대값 기준으로 정렬

 

 

Program.cs
0.02MB

1. 가격 변동 및 트렌드 분석

1.1. 매매가 변동률 (연도별 평균 매매가 변화율)

 
SELECT strftime('%Y', ContractYearMonth) AS Year, AVG(TransactionAmount) AS AvgPrice FROM REALESTATEAPTALL GROUP BY Year ORDER BY Year;

1.2. 호가 대비 실거래가 비율

 
SELECT A.ComplexName, AVG(A.TransactionAmount) / AVG(CAST(B.MAXPRICE AS REAL)) * 100 AS RealToMarketRatio FROM REALESTATEAPTALL A JOIN ESTATENAVERALLINFOATTACH B ON A.CityCounty = B.CORTARADDRESS AND A.MainNumber = B.LNBRMNNM AND A.SubNumber = B.LNBRSLNO GROUP BY A.ComplexName;

1.3. 최대-최소 가격 범위 (단지별로)

 
SELECT A.ComplexName, MAX(A.TransactionAmount) - MIN(A.TransactionAmount) AS PriceRange FROM REALESTATEAPTALL A GROUP BY A.ComplexName;

🏢 2. 아파트별 상세 분석

2.1. 단지별 거래량

 
SELECT ComplexName, COUNT(*) AS TransactionCount FROM REALESTATEAPTALL GROUP BY ComplexName ORDER BY TransactionCount DESC;

2.2. 평형대별 평균가

 
SELECT ROUND(AreaSquareMeters / 3.3) AS Pyeong, AVG(TransactionAmount) AS AvgPrice FROM REALESTATEAPTALL GROUP BY Pyeong ORDER BY Pyeong;

2.3. 신축 vs 구축 가격 차이

 
SELECT CASE WHEN ConstructionYear >= 2015 THEN '신축' ELSE '구축' END AS BuildingAge, AVG(TransactionAmount) AS AvgPrice FROM REALESTATEAPTALL GROUP BY BuildingAge;

📈 3. 투자 가치 및 수익률 분석

3.1. 매매-전세 갭

 
SELECT A.ComplexName, AVG(A.TransactionAmount) - AVG(CAST(B.MAXLEASEPRICE AS REAL)) AS GapPrice FROM REALESTATEAPTALL A JOIN ESTATENAVERALLINFOATTACH B ON A.CityCounty = B.CORTARADDRESS AND A.MainNumber = B.LNBRMNNM AND A.SubNumber = B.LNBRSLNO GROUP BY A.ComplexName;

3.2. 전세가율

 
SELECT A.ComplexName, AVG(CAST(B.MAXLEASEPRICE AS REAL)) / AVG(CAST(B.MAXPRICE AS REAL)) * 100 AS LeaseRatio FROM ESTATENAVERALLINFOATTACH B JOIN REALESTATEAPTALL A ON A.CityCounty = B.CORTARADDRESS AND A.MainNumber = B.LNBRMNNM AND A.SubNumber = B.LNBRSLNO GROUP BY A.ComplexName;

📌 4. 지역별 비교 분석

4.1. 지역별 시세 격차

 
SELECT CityCounty, AVG(TransactionAmount) AS AvgPrice FROM REALESTATEAPTALL GROUP BY CityCounty ORDER BY AvgPrice DESC;

4.2. 인기 지역 분석 (거래량 많은 순)

 
SELECT CityCounty, COUNT(*) AS TransactionCount FROM REALESTATEAPTALL GROUP BY CityCounty ORDER BY TransactionCount DESC;

📊 5. 특이사항 및 추가 분석

5.1. 급매 vs 일반 매물 (평균 이하 가격 비율)

 
WITH AvgPrice AS ( SELECT ComplexName, AVG(TransactionAmount) AS AvgTransPrice FROM REALESTATEAPTALL GROUP BY ComplexName ) SELECT A.ComplexName, SUM(CASE WHEN A.TransactionAmount < B.AvgTransPrice THEN 1 ELSE 0 END) * 100.0 / COUNT(*) AS BelowAvgRatio FROM REALESTATEAPTALL A JOIN AvgPrice B ON A.ComplexName = B.ComplexName GROUP BY A.ComplexName;

5.2. 공시지가 대비 매매가
공시지가 테이블이 없다면 가정하고 작성한 쿼리입니다.

 
SELECT A.ComplexName, AVG(A.TransactionAmount) / AVG(B.OfficialPrice) * 100 AS PriceToOfficialRatio FROM REALESTATEAPTALL A JOIN OFFICIALPRICES B ON A.CityCounty = B.CityCounty AND A.MainNumber = B.MainNumber AND A.SubNumber = B.SubNumber GROUP BY A.ComplexName;

'기획 > 기획및 컨텐츠' 카테고리의 다른 글

호가 대비 실거래가 비율  (0) 2025.03.06
부동산통계(특이사항 및 추가 분석)  (1) 2025.03.06

국토교통부의 실거래가 매매현황(2019~2024) 데이터와 네이버부동산의 아파트 리스트 및 호가 데이터를 주소와 지번을 기준으로 매칭해 사용할 수 있는 통계 항목들은 다음과 같습니다.


📊 1. 가격 변동 및 트렌드 분석

  1. 매매가 변동률:
    • 연도별, 분기별 매매가 상승 또는 하락 비율.
  2. 호가 대비 실거래가 비율:
    • 실거래가 / 매매호가 평균 비율 분석.
  3. 최대-최소 가격 범위:
    • 동일 단지 내 연도별 최대-최소 매매가 및 호가 차이.
  4. 평균 매매가 및 호가 추이:
    • 연도별 평균 매매가, 매매호가, 전세호가 변화 추이.
  5. 시세 대비 실거래가 차이:
    • 특정 시점의 호가와 실거래가 비교.

🏢 2. 아파트별 상세 분석

  1. 단지별 거래량:
    • 연도별, 월별 매매 거래 횟수.
  2. 평형대별 평균가:
    • 전용면적별 평균 매매가, 매매호가, 전세호가.
  3. 신축 vs 구축 가격 차이:
    • 준공 연도 기준으로 구분한 매매가 차이.

📈 3. 투자 가치 및 수익률 분석

  1. 연평균 상승률:
    • 매매가의 연평균 상승률 및 호가 상승률.
  2. 매매-전세 갭:
    • 매매가와 전세가의 차이를 통해 갭 투자 가능성 분석.
  3. 전세가율:
    • (전세호가 / 매매호가) × 100% 비율.
  4. 투자 회수 기간:
    • 매매가 대비 연간 임대 수익을 통한 투자 회수 기간.

📌 4. 지역별 비교 분석

  1. 지역별 시세 격차:
    • 시군구 또는 행정동별 평균 매매가 및 호가 비교.
  2. 인기 지역 분석:
    • 거래량 및 호가가 높은 지역 순위.
  3. 주변 개발 호재 영향:
    • 특정 지역 개발 이슈 전후 매매가 비교.

📊 5. 특이사항 및 추가 분석

  1. 급매 vs 일반 매물:
    • 평균보다 낮은 호가로 나온 매물 비율 및 실거래가 비교.
  2. 거래 비수기 분석:
    • 거래량이 급감하는 시기 및 가격 변화 패턴.
  3. 공시지가 대비 매매가:
    • 공시지가 대비 매매가의 비율.

'기획 > 기획및 컨텐츠' 카테고리의 다른 글

호가 대비 실거래가 비율  (0) 2025.03.06
가격 변동 및 트렌드 분석(SQLite.SQL)  (0) 2025.03.06

부동산.크롤링.국토교통부.실거래가.통계.조회조건추가(금액대별)
부동산.크롤링.국토교통부.실거래가.통계.조회조건추가(금액대별)
부동산.크롤링.국토교통부.실거래가.통계.조회조건추가(금액대별)

조회조건추가)
1. 지역
2. 조회조건
3. 건수
4. 금액대별

 

 

index.html
0.03MB

 

 



1) SQLite 테이블을 메모리기반으로 SQL을 실행할경우

void LoadDatabaseIntoMemory(string filePath, SQLiteConnection memoryConn)
{
    using (var fileConn = new SQLiteConnection($"Data Source={filePath};Version=3;"))
    {
fileConn.Open();
fileConn.BackupDatabase(memoryConn, "main", "main", -1, null, 0);
    }
}
        workingDirectory = Directory.GetCurrentDirectory();

        DESCENDING_DB = Path.Combine(workingDirectory, @"descending_in_base_all.db");
        ANESTATE_DB = Path.Combine(workingDirectory, @"database_all_total.db");
        ESTATENAVER_DB = Path.Combine(workingDirectory, @"naver_attach_estate_info_file.db");

        // 메모리 기반 SQLite 연결 생성
        memoryConn1 = new SQLiteConnection("Data Source=:memory:;Version=3;");
        memoryConn2 = new SQLiteConnection("Data Source=:memory:;Version=3;");
        memoryConn3 = new SQLiteConnection("Data Source=:memory:;Version=3;");

        memoryConn1.Open();
        memoryConn2.Open();
        memoryConn3.Open();

        try
        {
            // 파일 DB 데이터를 메모리 DB로 복사
            LoadDatabaseIntoMemory(DESCENDING_DB, memoryConn1);
            LoadDatabaseIntoMemory(ANESTATE_DB, memoryConn2);
            LoadDatabaseIntoMemory(ESTATENAVER_DB, memoryConn3);

            // 메모리 DB로 사용
            APMSQLite.GetInstance.FetchDescendingConn = memoryConn1;
            APMSQLite.GetInstance.FetchEstateConn = memoryConn2;
            APMSQLite.GetInstance.FetchNaverAttachConn = memoryConn3;

            // 메모리 DB에 테이블이 정상적으로 로드되었는지 확인
            Console.WriteLine("\n===== Memory DB Loaded Tables =====");
            PrintTables(memoryConn1, "Descending DB");
            PrintTables(memoryConn2, "Estate DB");
            PrintTables(memoryConn3, "Naver Attach DB");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error: {ex.Message}");
        }

수행시간)

시작: 2025-02-27 10:03:55.089
종료: 2025-02-27 10:04:02.441

  1. 초 차이 계산
    • 10:04:02.441 - 10:03:55.089
    • 02.441초 - 55.089초 = 7.352초
따라서, 두 타임스탬프의 차이는 7.352초입니다.

 

2) SQLite 테이블을 파일기반으로 SQL을 실행할경우

string workingDirectory = Directory.GetCurrentDirectory();

        string DESCENDING_DB = Path.Combine(workingDirectory, @"descending_in_base_all.db");
        string ANESTATE_DB = Path.Combine(workingDirectory, @"database_all_total.db");
        string ESTATENAVER_DB = Path.Combine(workingDirectory, @"naver_attach_estate_info_file.db");
        
        APMSQLite.GetInstance.FetchDescendingConn = new SQLiteConnection($"Data Source={DESCENDING_DB};Version=3;");
        APMSQLite.GetInstance.FetchDescendingConn.Open();
        
        APMSQLite.GetInstance.FetchEstateConn = new SQLiteConnection($"Data Source={ANESTATE_DB};Version=3;");
        APMSQLite.GetInstance.FetchEstateConn.Open();
        
        APMSQLite.GetInstance.FetchNaverAttachConn = new SQLiteConnection($"Data Source={ESTATENAVER_DB};Version=3;");
        APMSQLite.GetInstance.FetchNaverAttachConn.Open();

수행시간

시작: 2025-02-27 10:04:54.994
종료: 2025-02-27 10:05:28.504

  1. 초 차이 계산
    • 10:05:28.504 - 10:04:54.994
    • 분 차이: 10:05 - 10:04 = 1분 (60초)
    • 초 차이: 28.504초 - 54.994초 = -26.490초
    • 1분(60초)을 고려하면, 60 - 26.490 = 33.510초
따라서, 두 타임스탬프의 차이는 33.510초입니다.


결론)
테이블의 데이타를 메모리에 올려서 실행하는것이 파일기반으로 실행하는것보다 5배정도 빠르다.
테이블의 데이타를 메모리에 올려서 실행하는것이 파일기반으로 실행하는것보다 5배정도 빠르다.

 



index.html
0.03MB

naver_attach_info + apt_real_info

let etheaders_han = [
"Query ",
"DescendingNumber",
"네이버고유아파트번호",
"아파트이름",
"지역번호",
"승인일",
"네이버주소",
"지번",
"부번",
"매매금액차이",
"매매금액비율(%)",
"평형",
"최대매매금액",
"최대매매년도",
"최대매매해당층",
"최대매매금액",
"최대매매년도",
"최대매매해당층",
"지역번호",
"네이버 최저매매호가",
"네이버 최대매매호가",
"네이버 최저전세호가",
"네이버 최대전세호가",
"네이버 최저매매호가",
"네이버 최대매매호가",
"네이버 최저전세호가",
"네이버 최대전세호가",
"국토교통부주소",
"RealEstateTypeCode",
"RealEstateTypeName",
"LotNumber",
"Building",
"Buyer",
"Seller",
"국토교통부실거래금액",
"준공년도",
"국토교통부도로명주소",
"CancellationReasonDate",
"부동산거래타입",
"DataClass",
"InfoMarketClass",
"TransactionTime",
"중개장소",
"매매계약신고일",
"HousingType"
];
let etheaders = [
"Query", 
"DescendingNumber",
"ComplexNo",
"ComplexName",
"CortarNo",
"UseApproveYmd",
"CortarAddress",
"MainNumber",
"SubNumber",
"CapitalGain",
"CapitalGain(%)",
"AreaSquareMeters",
"PurchasePrice",
"ContractYearMonth",
"Floor",
"PurchasePrice",
"ContractYearMonth",
"Floor",
"Region",
"MinPriceByLetter",
"MaxPriceByLetter",
"MinLeasePriceByLetter",
"MaxLeasePriceByLetter",
"MinPrice",
"MaxPrice",
"MinLeasePrice",
"MaxLeasePrice",
"CityCounty",
"RealEstateTypeCode",
"RealEstateTypeName",
"LotNumber",
"Building",
"Buyer",
"Seller",
"TransactionAmount",
"ConstructionYear",
"RoadName",
"CancellationReasonDate",
"TransactionType",
"DataClass",
"InfoMarketClass",
"TransactionTime",
"BrokerLocation",
"RegistrationDate",
"HousingType"
];

let esheaders_han = [
"Query ",
"DescendingNumber",
"네이버고유아파트번호",
"아파트이름",
"지역번호",
"승인일",
"네이버주소",
"지번",
"부번",
"매매금액차이",
"매매금액비율(%)",
"평형",
"최대매매금액",
"최대매매년도",
"최대매매해당층",
"최소매매금액",
"최소매매년도",
"최소매매해당층",
"지역번호",
"네이버 최저매매호가",
"네이버 최대매매호가",
"네이버 최저전세호가",
"네이버 최대전세호가",
"네이버 최저매매호가",
"네이버 최대매매호가",
"네이버 최저전세호가",
"네이버 최대전세호가",
"국토교통부주소",
"RealEstateTypeCode",
"RealEstateTypeName",
"LotNumber",
"Building",
"Buyer",
"Seller",
"국토교통부실거래금액",
"준공년도",
"국토교통부도로명주소",
"CancellationReasonDate",
"부동산거래타입",
"DataClass",
"InfoMarketClass",
"TransactionTime",
"중개장소",
"매매계약신고일",
"HousingType"
];
let esheaders = [
"Query", 
"DescendingNumber",
"ComplexNo",
"ComplexName",
"CortarNo",
"UseApproveYmd",
"CortarAddress",
"MainNumber",
"SubNumber",
"CapitalGain",
"CapitalGain(%)",
"AreaSquareMeters",
"MaxPurchasePrice",
"MaxContractYearMonth",
"MaxFloor",
"MinPurchasePrice",
"MinContractYearMonth",
"MinFloor",
"Region",
"MinPriceByLetter",
"MaxPriceByLetter",
"MinLeasePriceByLetter",
"MaxLeasePriceByLetter",
"MinPrice",
"MaxPrice",
"MinLeasePrice",
"MaxLeasePrice",
"CityCounty",
"RealEstateTypeCode",
"RealEstateTypeName",
"LotNumber",
"Building",
"Buyer",
"Seller",
"TransactionAmount",
"ConstructionYear",
"RoadName",
"CancellationReasonDate",
"TransactionType",
"DataClass",
"InfoMarketClass",
"TransactionTime",
"BrokerLocation",
"RegistrationDate",
"HousingType"
];

 

index.html
0.03MB

+ Recent posts