콘텐츠로 이동

서울시 젠트리피케이션 지수 개발

공공데이터 기반 젠트리피케이션 측정 및 예측 프로젝트


개요

서울시 공공데이터 7종을 수집하여 젠트리피케이션 지수를 개발하고, 지역별 젠트리피케이션 진행 정도를 측정/예측하는 분석 프로젝트.

  • 수행 기간: 학부 과정
  • 데이터 출처: 서울 열린데이터 광장, 공공데이터포털
  • 분석 도구: BigQuery, Python, Tableau

문제정의

젠트리피케이션(Gentrification)은 낙후된 구도심 지역이 활성화되면서 외부인과 자본이 유입되고, 기존 저소득층 주민이나 소상공인이 밀려나는 현상이다.

핵심 질문: 1. 서울시 내 젠트리피케이션이 진행 중인 지역은 어디인가? 2. 젠트리피케이션 진행 정도를 정량화할 수 있는가? 3. 향후 젠트리피케이션이 예상되는 지역을 예측할 수 있는가?


가설설정

가설 1: 복합 지표로 젠트리피케이션 측정 가능

  • 임대료, 인구 변화, 상권 변화 등 복합 지표의 조합으로 측정 가능

가설 2: 지역별 젠트리피케이션 패턴 존재

  • 특정 유형의 상권(카페, 식당 등)이 젠트리피케이션 선행 지표

가설 3: 시계열 패턴으로 예측 가능

  • 과거 젠트리피케이션 진행 지역의 패턴을 학습하여 예측 가능

데이터

수집 데이터 (7종)

데이터 출처 설명
상가 임대료 서울 열린데이터 지역별 상가 월 임대료
인구 통계 통계청 동별 인구 변화
사업체 현황 공공데이터포털 업종별 사업체 수
부동산 실거래가 국토교통부 아파트/오피스텔 거래가
유동인구 SKT 빅데이터 시간대별 유동인구
소득 수준 국세청 지역별 평균 소득
문화시설 서울시 문화시설 위치 및 현황

데이터 수집 방법

# 공공데이터 API 호출
import requests

def fetch_public_data(api_key, endpoint, params):
    response = requests.get(
        endpoint,
        params={'serviceKey': api_key, **params}
    )
    return response.json()

# 웹스크래핑 (Selenium)
from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get(target_url)
data = driver.find_elements(By.CLASS_NAME, 'data-row')

BigQuery 적재

-- 테이블 스키마 정의
CREATE TABLE gentrification.commercial_rent (
    district STRING,
    dong STRING,
    year INT64,
    month INT64,
    rent_per_sqm FLOAT64,
    deposit FLOAT64
);

-- 데이터 적재 (Python)
from google.cloud import bigquery

client = bigquery.Client()
table_id = 'project.gentrification.commercial_rent'

job = client.load_table_from_dataframe(df, table_id)
job.result()

분석/모델링

젠트리피케이션 지수 산출

복합 지표를 표준화하여 가중 합산한 젠트리피케이션 지수 개발.

from sklearn.preprocessing import StandardScaler

# 지표 표준화
scaler = StandardScaler()
features = ['rent_change', 'population_change', 'business_change', 
            'price_change', 'income_change']

df_scaled = pd.DataFrame(
    scaler.fit_transform(df[features]),
    columns=features
)

# 가중치 적용 (전문가 의견 + 상관관계 분석 기반)
weights = {
    'rent_change': 0.25,
    'population_change': 0.20,
    'business_change': 0.20,
    'price_change': 0.20,
    'income_change': 0.15
}

df['gentrification_index'] = sum(
    df_scaled[col] * weight 
    for col, weight in weights.items()
)

클러스터링 분석

K-Means를 활용하여 지역 유형 분류.

from sklearn.cluster import KMeans

# 최적 클러스터 수 결정 (Elbow Method)
inertias = []
for k in range(2, 10):
    kmeans = KMeans(n_clusters=k, random_state=42)
    kmeans.fit(df_scaled)
    inertias.append(kmeans.inertia_)

# 클러스터링 수행
kmeans = KMeans(n_clusters=4, random_state=42)
df['cluster'] = kmeans.fit_predict(df_scaled)

# 클러스터 해석
# 0: 초기 단계 - 임대료 상승 시작
# 1: 진행 단계 - 상권 변화 활발
# 2: 심화 단계 - 원주민 이탈
# 3: 안정 단계 - 변화 둔화

시계열 분석

ARIMA 모델로 젠트리피케이션 지수 추세 예측.

from statsmodels.tsa.arima.model import ARIMA

# 시계열 모델 학습
model = ARIMA(df['gentrification_index'], order=(1, 1, 1))
fitted = model.fit()

# 예측
forecast = fitted.forecast(steps=12)  # 12개월 예측

결과

Tableau 대시보드

젠트리피케이션 대시보드

서울시 젠트리피케이션 현황 분석 대시보드 - 지역별 위험도 지도 및 포지셔닝맵

월별 이동인구 추이

월별 총 이동인구 시계열 분석 (2022.04 ~ 2024.07)

주요 시각화 구성:

  1. 지역별 젠트리피케이션 지수 히트맵
    서울시 전체 지도에 지수 표시

  2. 시계열 추이
    주요 지역의 연도별 지수 변화

  3. 클러스터별 특성
    각 클러스터의 주요 지표 비교

  4. 예측 결과
    향후 1년간 지수 변화 예측

주요 발견

구분 지역 특징
심화 단계 성수동, 연남동 임대료 급등, 기존 상권 이탈
진행 단계 익선동, 을지로 상권 변화 활발, 유동인구 증가
초기 단계 문래동, 충정로 임대료 상승 시작, 문화시설 유입

배운 점

  1. 공공데이터 활용: API와 웹스크래핑을 조합한 효율적인 데이터 수집
  2. BigQuery 활용: 대용량 데이터 처리에 클라우드 DW의 효용성
  3. 복합 지표 설계: 단일 지표의 한계, 다차원 분석의 중요성
  4. 시각화 커뮤니케이션: Tableau를 통한 비전문가 대상 효과적 전달

기술 스택

분류 도구
언어 Python, SQL
수집 requests, Selenium
저장 Google BigQuery
분석 pandas, scikit-learn, statsmodels
시각화 Tableau, matplotlib
환경 Jupyter Notebook, Google Cloud Platform

관련 문서