아파트 인텔리전스! 아파트엔

 

서비스를 개설하며...

20년, 제가 공간정보 분야에서 일한 시간입니다. 20년을 일하고 보니 아쉬운게 있습니다. 공간정보에 종사하는 것은 대부분 공공 부문의 정보화용역 사업을 하는 것이라 열심히 했지만 남는 것이 없습니다. 용역은 용역일 뿐, 갑의 행복만이 존재하니까요.
그래서 무엇인가 남기고 싶었습니다. 호랑이가 아니어서 가죽을 남길 수도 없고 배움이 짧아 이름을 남길 수도 없습니다. 그래서 인터넷에 서비스라도 남겨보자고 마음먹었습니다.

누구나 관심을 가지는 주제와 모두를 대상으로 하는 서비스를 기획했습니다. 그리고 탄탄한 설계를 통한 제작이 아닌 프로토타입(베타서비스)을 공개하고 사용자 인터뷰를 통해 지속적으로 보완해가는 방법론을 적용합니다.
기술적으로 상용 클라우드서비스(IaaS) 환경에서 PostGIS 등 공개SW를 이용하고 공공개방되는 데이터를 적극 활용합니다.

아파트엔 서비스는 ...

아파트엔서비스는 호갱노노 등 요즘 관심을 받는 프롭테크(Property + Technology) 분야의 서비스입니다.
여타 부동산 앱과 구분되는 차이점은 매물을 중개하는 서비스가 아니라는 것과 아파트의 위치, 주변 학교 등 물리적 특징을 소개하는 서비스가 아니라는 것입니다.
아파트엔 서비스는 아파트의 가격을 결정하는 원인요소의 지수화를 통해 아파트의 투자가치를 평가하는 서비스 입니다.

아파트엔 개요

 

아파트엔 서비스는 아파트를 대상으로 제공되는 BI (Business Intelligence : 비즈니스 인텔리전스) 서비스 입니다.  위키피디아를 인용하면 비즈니스 인텔리전스는 데이터를 수집하고, 이 데이터를 가공하여 올바른 의사결정을 내릴 수 있도록 지원하는 시스템 및 기술입니다.
아파트엔 서비스는 아파트를 투자 자산 측면에서 바라보고 개별 아파트의 보유 가치를 평가합니다.

 

아파트 신호등! 아파트엔

빨간색, 노란색 녹색으로 아파트의 가치를 요약합니다.
누구라도 한 눈에 지도 위에 표시되는 색상으로 아파트의 가치를 구분할 수 있도록 합니다. 혹시 아파트 마커를 클릭한다면 좀더 상세한 정보를 볼 수 있습니다.
아래 4분면 그래프에서 점이 오른 쪽에 있을 수록 투자가치가 좋다는 것, 위에 있을 수록 실거주 가치가 좋다는 것을 의미합니다. 베타 기간이라 현재 틀릴 수도 있습니다.

실거주/투자가치 평가


아파트엔지수아파트엔 서비스는 투자 또는 보유 가치 평가를 위한 기준으로 아파트엔지수를 정의합니다. 아파트엔지수의 시간적 흐름에 따른 분석으로부터 아파트의 자산 가치 변화를 추적하게 합니다. 아파트엔지수는 아파트 가격을 결정하는 여러 원인인자를 종합하여 부여되는 점수입니다. 점수가 높을 수록 좋고, 1 ~ 100 까지의 숫자로 나타납니다.아파트엔지수가 전달하는 인사이트(Insights)는 다음과 같습니다.아파트엔지수가 시간의 흐름에 따라 변동이 없다면, 다른 아파트의 가치가 변한 비율만큼 가치가 유지됨을 의미합니다.
만일 아파트엔지수가 상승했다면 우리 아파트의 절대적 가치가 상승했다는 것을 의미합니다. 가격은 상승했더라도 아파트엔지수가 하락했다면 상대적으로 보유가치가 하락했다는 것을 나타냅니다.

아파트엔지수

 

앞으로는...

Fun & Joy 또는 사용자의 관심을 위하여 아파트 관련 사회적 이슈나 분석 정보를 게시할 예정입니다.

전국의 모든 아파트를 아파트엔지수라는 점수를 부여한 것에 대한 부담이 있습니다.
하지만 보통의 부동산서비스가 실거래가만으로 이미 서열을 매기고 있습니다. 오히려 가격을 포함한 다른 요인으로부터 지수를 부여했기에 좀 더 객관적이라고 생각합니다.

베타이기에 평가를 위한 모델 부분에 지속적 개량이 수행될 예정입니다.
저희 프로그웍스를 아껴주시는 많은 분들께 작은 응원과 격려 부탁드립니다. 또한 격려와 응원에 보답하고자 서비스 제작 중 터득한 노하우도 본 블로그를 통해 점차로 공개하겠습니다.




 

 

 

 

'아파트' 카테고리의 다른 글

하이 리스크, 하이 리턴?  (0) 2020.08.24

본 카테고리의 이전글(PostGIS를 이용한 격자 만들기)에서 사각형 그리드 격자를 만들었습니다. 격자를 제작한 목적은 이전글에서 설명했듯이 특정 데이터셋의 격자별 집계 수행을 통해 분석을 진행하기 위함입니다. 본 게시글을 통해 실제 집계를 설명합니다.

1. 데이터 준비

 

격자는 준비했습니다. 실제 집계의 대상이 되어야 하는 데이터가 필요합니다. 저는 "공공데이터포털(data.go.kr)"에 접근하여 "데이터셋 > 표준데이터"메뉴에서 "전국 CCTV 표준 데이터"를 선택했습니다. CSV형식으로 제공받았기에 실제 PostGIS에 적재하는 전처리 작업이 요구됩니다. 전처리 작업 절차는 아래와 같습니다.

  1. Qgis에서 "쉽표로 구분된 텍스트 레이어 추가" 후 형상을 확인합니다. 이 후 DB연결을 통해 PostGIS에 적재합니다.
  2. Qgis에서 Import된 레이어를 선택한 후 내보내기를 실시하여 Shp 형식으로 저장합니다.
  3. Qgis에서 데이터베이스 연결 후 "파일가져오기"를 실시하여 PostGIS에 적재합니다.
  4. 원본에 위도, 경도 속성이 존재하며, 좌표계는 4326입니다. 필자는 PostGIS에 적재 후 좌표계를 5179로 변환했습니다. 미리 제작된 격자가 5179좌표계이기 때문에 변환했습니다. 
  5. 마지막으로 공간인덱스를 생성합니다.

2. 집계 실행

실제 질의는 아래처럼 단순합니다. SQL의 세부사항을 설명하지는 않겠습니다. 격자개수만큼 박복하며 교차여부를 검사하여 CCTV를 격자별로 개수합니다. 즉 격자 개수가 많으면 많을 수록 실행 성능은 떨어질 수 밖에 없습니다. 집계하고자 하는 대상에 따라 격자크기가 결정되야 합니다.
또한 눈썰미가 있다면 "count()"함수를 대신하여 숫자 필드를 대상으로 sum, median 등 다양한 함수의 적용이 가능합니다. 개수가 아닌 양, 추세 등이 중요한 경우입니다.



CREATE TABLE tempsubtotal AS
SELECT count(*) AS cnt, bound.geom AS geom
FROM temp_20200206020231 bound
LEFT JOIN ms101_20200207020227 counted ON ST_Intersects(bound.geom, counted.geom)
GROUP BY bound.geom;

이 후 Qgis를 통해 PostGIS에 접속하여 새로이 생성된 집계 테이블을 레이어로 추가한 후 보게되면, CCTV가 많을 수록 짙은 빨간색으로 나타나는 것을 볼 수 있습니다. 이는 Qgis의 시각화 속성을 이용한 것으로 고정색이 아닌 특정 컬럼을 대상으로 시각화를 지정한 것 입니다. 

데이터 및 처리는 PostGIS 에서 수행하고, 시각화는 사용자가 가지는 도구를 이용합니다. 아마도 실제 프로젝트에 적용한다면 데이터 처리 영역과 시각화 영역은 특별한 경우를 제외하고 철저히 분리하는 것이 좋습니다. 

3. 맺으며

PostGIS 사랑스럽지 않습니까? DBMS에 SDE(Spatial Data Extension)를 추가하는 것만으로 GIS업무의 많은 부분을 처리할 수 있습니다. 시각화라는 부분을 제외하면 일반적 공공정보화사업에 무리없이 사용될 수 있습니다. 정의도 제대로 못하는 GIS엔진이 정말 필요할까요? 

 

"자세히 보아야 예쁘다. 오래 보아야 사랑스럽다. 너도그렇다" 나태주님의 "풀꽃"입니다. 

제게는 PostGIS가 그런 존재입니다. 사용하면 할수록 대견스럽고 사랑스럽습니다. 데이터 시각화라는 부분만 제외하면 대부분의 공간정보 처리가 가능합니다. 한동안 바쁘다는 핑계로 포스트 작성에 소홀했습니다. 하지만 사랑이 변할 수 있나요. PostGIS가 제공하는 함수(ST_Translate)를 이용하여 격자 데이터를 만들겠습니다. 응용하면 "Hexagonal Grid"등 반복되는 도형을 가지는 격자 데이터를 생성할 수 있습니다. 모양은 아래 그림을 참조하십시오.

격자의 쓰임은 다음과 같습니다.
첫째, 격자 단위로 다른 객체(POI 등)를 위상관계(Topology)에 따라 집계해서, 개별 격자 별 밀집도가 높은 지역을 식별하기 용이합니다.
둘째, 불변하는 집계(Sub Total) 데이터를 생성하는 기준 도형이 될 수 있습니다. 변하지 않는 격자를 기준으로 데이터 생산 시점 별 집계를 수행하여 일관된 비교가 가능한 시계열 데이터를 생성할 수 있습니다. 
이러한 기준은 행정경계도 가능하겠지만 인구의 가감 등으로 향후 변경이 발생할 여지가 있기 때문에 격자가 기준으로 적합할 수 있습니다.

이러한 격자는 육각형의 벌집 모양으로도 반복할 수 있지만 가장 쉬운 바둑판 형식의 격자를 제작하겠습니다. 인터넷에서 "Fishnet Grid"를 검색하면 다양한 제작 방법을 찾을 수 있습니다. 저는 PostGIS의 공간함수를 이용하여 SQL Function을 제작합니다. 제작된 Grid는 Qgis에서 형상을 확인합니다.

1. 함수 원형 및 설명



CREATE OR REPLACE FUNCTION __progworks_rect_grid_on_linearUnit_M(
grid_count_x integer, grid_count_y integer,
grid_size_x integer, grid_size_y integer,
start_x double precision, start_y double precision,
target_srid integer) RETURNS varchar AS
$$
DECLARE
target_table_name text;
BEGIN
EXECUTE format('SELECT ___progworks_new_table_name(''%s'')', 'temp' ) INTO target_table_name;
EXECUTE format('CREATE TABLE IF NOT EXISTS %I AS
               SELECT i+1 AS col, j+1 AS row, ST_Translate(cell, i * %s + %s, j * %s + %s) AS geom
   FROM 
   generate_series(0, %s - 1) AS i,
   generate_series(0, %s - 1) AS j,
   (SELECT ST_GeomFromText(''POLYGON((0 0, 0 %s, %s %s, %s 0,0 0))'')  AS cell) AS ORIGIN;',
                target_table_name,
    grid_size_x, start_x,
    grid_size_y, start_y,
    grid_count_x, grid_count_y,
    grid_size_y, grid_size_x, grid_size_y, grid_size_x
  );
EXECUTE format('SELECT UpdateGeometrySRID(''%I'', ''geom'', %s);', target_table_name, target_srid );
return target_table_name;
END
$$
LANGUAGE plpgsql;

 

2. 함수 설명

위 함수의 입력 파라미터를 간단히 설명하면
입력된 좌표(start_x, start_y)를 바둑판의 시작점(우리나라에서 사각형의 좌하단 지점)으로,
가로길이(grid_size_x)와 세로길이(grid_size_y)의 격자가,
가로축 방향으로 지정된 갯수(grid_count_x), 세로축으로 지정된 갯수(grid_count_y)만큼 가지는 격자를 생성하라는 것입니다.

이 때, 생성되는 격자는 지정된 좌표계(target_srid)를 가지도록 정의합니다.
굳이 SQL 함수 이름 끝에  LinearUnit_M을 붙여준 이유는 meter로 거리를 나타내는 좌표계를 사용하라는 뜻입니다.
4326으로 표시되는 경위도 좌표계는 AngularUnit의 degree를 사용하는 구면좌표계로 위경도에 따라 정확한 거리 지정이 불가능합니다. 물론 좁은 지역이라면 상관없습니다. 하지만 정확한 격자크기의 보장을 위해 평면으로 투영된 좌표계 사용을 권장합니다.

함수 내부를 보면 미리 정의된 격자 폴리곤이 WKT 형식으로 존재합니다. 기준 폴리곤은 가로, 세로 각각 0을 기준으로 사용자가 지정한 크기(grid_size)로 이루어지도록 정의 됩니다.
이후 질의 실행에 따라 generate_series 함수가 호출될 때 마다 ST_Translate 함수가 기준 폴리곤을 지정된 위치로 옮기며 새로운 개별 격자를 생성하는 형식입니다.

실제 함수를 실행하여 등록한 후 아래와 같이 함수를 호출합니다. 만들어진 격자는 Qgis를 통해 확인하겠습니다.



 SELECT __progworks_rect_grid_on_linearUnit_M(30, 30, 1000, 1000, 955000, 1937000, 5179);

 

 

3. 맺으며

격자 만들기는 어떤 목적을 이루기 위해 데이터를 준비하는 중간 과정 입니다.

격자를 왜 만들었을까요? 앞에서 설명한대로 격자에 의미있는 무언가를 담기 위해서 입니다. 다음 글에서 만들어진 격자를 이용해 다른 테이블과 위상관계를 분석하여 집계 하는 것을 설명하겠습니다.

자주 하는 말이지만 수학문제 눈으로 풀지 않듯이 개발자는 손이 부지런해야 합니다. 즐코딩~~~

+ Recent posts