서울시 젠트리피케이션 지수 개발¶
공공데이터 기반 젠트리피케이션 측정 및 예측 프로젝트
개요¶
서울시 공공데이터 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년간 지수 변화 예측
주요 발견¶
| 구분 | 지역 | 특징 |
|---|---|---|
| 심화 단계 | 성수동, 연남동 | 임대료 급등, 기존 상권 이탈 |
| 진행 단계 | 익선동, 을지로 | 상권 변화 활발, 유동인구 증가 |
| 초기 단계 | 문래동, 충정로 | 임대료 상승 시작, 문화시설 유입 |
배운 점¶
- 공공데이터 활용: API와 웹스크래핑을 조합한 효율적인 데이터 수집
- BigQuery 활용: 대용량 데이터 처리에 클라우드 DW의 효용성
- 복합 지표 설계: 단일 지표의 한계, 다차원 분석의 중요성
- 시각화 커뮤니케이션: Tableau를 통한 비전문가 대상 효과적 전달
기술 스택¶
| 분류 | 도구 |
|---|---|
| 언어 | Python, SQL |
| 수집 | requests, Selenium |
| 저장 | Google BigQuery |
| 분석 | pandas, scikit-learn, statsmodels |
| 시각화 | Tableau, matplotlib |
| 환경 | Jupyter Notebook, Google Cloud Platform |