PLAYCITY 홈페이지는 인구를 460,439명으로 표시합니다. 이 값은 접속자 수도, 주민 등록 수도 아닙니다. GIS에 등록된 완공 건물의 주거 세대수에 건물 유형별 평균 세대원수를 적용해 계산한 건물 기반 추정 인구입니다. 무엇을 세었는지 밝히지 않은 숫자는 오해를 만들기 때문에, 계산 규칙과 한계를 먼저 공개합니다.
무엇을 센 숫자인가
현실의 인구 통계는 사람을 세어 만듭니다. 출생, 사망, 전입, 전출을 기록하고 그 합으로 인구를 갱신합니다. PLAYCITY에는 그 기록이 없습니다. 대신 도시에 무엇이 지어졌는지에 대한 기록이 있습니다. 그래서 이 지표는 사람이 아니라 등록된 주거 수용력에서 출발합니다.
계산의 뼈대는 한 문장입니다. 완공된 건물의 주거 세대수를 세고, 건물 유형별로 정한 평균 세대원수를 곱합니다. 여기에 건물마다 다른 가구 규모를 표현하는 이질성과 월별 변동, 도시 간 재배분을 더합니다. 결과는 사람을 관측한 값이 아니라 등록된 주거 수용력 × 모형 가구 규모에 가깝습니다.
건물 기반 추정 인구 = 등록된 주거 세대수 × 유형별 평균 세대원수 × 건물별 이질성 → 월별 변동 → 도시 간 재배분
이 보고서가 다루는 숫자의 기준은 다음과 같습니다. 모든 공개 값에는 이 정보가 함께 표시되어야 합니다.
| 값 | 460,439명 |
|---|---|
| 성격 | 모형 산출값 (관측값 아님) |
| 기준월 | 2026-06-01 (마감 완료) |
| 계산 시각 | 2026-07-16 01:55 UTC |
| 알고리즘 버전 | v7-households-lognormal-heterogeneity-variation-0.24 |
| 포괄 범위 | 41개 도시, 완공 건물 1,652동 중 주거 945동, 세대 118,925 |
오늘은 7월인데 기준월이 6월인 이유가 있습니다. 월별 집계는 그 달 말까지 등록되는 건물을 포함하므로, 진행 중인 달은 아직 확정값이 아닙니다. 그래서 PLAYCITY는 종료된 달만 마감해 공개하고, 진행 중인 달은 잠정 상태로 두어 공개 화면에 올리지 않습니다. 7월 값은 7월이 끝난 뒤에 확정되어 공개됩니다.
계산 방법
지표는 네 단계를 거칩니다. 각 단계는 결정론적입니다. 같은 입력에서 항상 같은 결과가 나오며, 누구든 같은 규칙으로 다시 계산할 수 있습니다.
데이터 분석 파이프라인
등록 건물에서 공개 인구 지표까지
건물·월·도시·연령의 네 grain을 섞지 않고 단계별로 닫습니다. 마지막에는 도시 합계, 연령 합계, 성별 합계와 공개 화면이 같은 총량인지 다시 확인합니다.
- 01 건물 자격 판정 기준월에 유효한 완공·비철거 건물과 주거 세대수, 도시 관계만 선택합니다.
- 02 건물 추정 세대수와 유형별 평균, 건물에 고정된 로그정규 배수로 건물 인구를 만듭니다.
- 03 월간 스냅샷 유효기간과 수동 조정값을 적용하고 월·도시 seed의 ±0.24% 변동을 더합니다.
- 04 도시 재배분 주거 기반 88%와 일자리 매력도 12%를 섞되 도시별 이동은 ±15%로 제한합니다.
- 05 연령·성별 배분 고정 기준으로 정규화한 도시 특성과 성숙도를 기본 인구구조에 적용합니다.
- 06 정합·발행 largest remainder로 정수 합을 맞추고 도시·공간·API·홈페이지 값을 대조합니다.
건물마다 인구를 만듭니다
완공 상태이고 철거되지 않았으며 주거 세대수가 1 이상인 건물만 셉니다. 세대수에 유형별 평균 세대원수를 곱한 뒤, 건물 ID로 고정한 난수로 가구 규모의 이질성을 더합니다.
월별 변동을 더합니다
도시 합계에 기준월과 도시 ID로 고정한 잡음을 적용합니다. 변동 폭은 월 ±0.24%로 제한됩니다.
도시 사이에 재배분합니다
비주거 건물이 만드는 일자리 용량을 매력도로 삼아 인구를 옮깁니다. 각 도시의 이동 폭은 ±15%로 제한하고, 전체 합계는 정확히 보존합니다.
연령과 성별을 나눕니다
도시의 성숙도와 건물·POI 특성으로 기본 연령 비중을 조정하고, 합이 총인구와 정확히 같아지도록 맞춥니다.
건물 인구 계산식
건물 b의 세대수를 h, 유형별 평균 세대원수를 μ라고 할 때 계산식은 다음과 같습니다.
sigma = min(0.6, 0.25 / sqrt(h))
u1, u2 = SHA256("households:<building_id>") → two values in (0, 1)
z = sqrt(-2 * ln(u1)) * cos(2*pi*u2)
factor = exp(sigma * z - sigma^2 / 2)
population = max(0, round(h * mu * factor))
factor의 기댓값은 1입니다. 따라서 건물마다 가구 규모를 다르게 만들면서도 유형별 평균은 그대로 보존합니다. 세대수가 많은 건물일수록 sigma가 작아져 평균에 수렴합니다. 큰 아파트 단지는 평균에 가깝고 작은 건물은 편차가 크다는 뜻입니다.
평균 세대원수 μ는 주거 4명, 상업 2명, 오피스 2명, 복합 3명이며 그 밖의 유형은 2명입니다. 이 값들은 관측으로 보정한 것이 아니라 규칙으로 정한 가정입니다. 지표의 전체 규모를 결정하는 가장 강한 가정이기도 합니다.
월별 변동과 수동 조정
건물 합계에 이전에 승인된 수동 조정값을 더한 뒤, 기준월과 도시 식별자에서 만든 정규 잡음을 적용합니다. 조정값은 다음 변경 전까지 이월되지만, 2026년 6월 스냅샷에는 총량을 바꾸는 활성 조정이 없습니다.
base = max(0, round(sum_building_population + carried_adjustment))
z_month = Normal(0, 1), seed = "population:<city_id>:<month>"
monthly_rate = clamp(0.0008 * z_month, -0.0024, 0.0024)
monthly_population = max(0, base + round(base * monthly_rate))
총량을 보존하는 도시 재배분
일자리 용량은 비주거 건물 수에 유형별 가중치를 곱해 만듭니다. 오피스 28, 산업 22, 복합 20, 상업 18, 공공 14, 문화 12, 그 밖은 4이며 주거는 0입니다. 이것은 건물 수를 센 값이지 실제 고용자 수나 연면적이 아닙니다.
B = sum_i base_i; A = sum_i job_capacity_i
target_share_i = 0.88 * (base_i / B) + 0.12 * (job_capacity_i / A)
lower_i = 0.85 * base_i; upper_i = 1.15 * base_i
target_i = clamp(B * target_share_i, lower_i, upper_i)
water_fill(target, lower, upper) so that sum_i target_i = B
final_i = largest_remainder(target_i), with sum_i final_i = B
일자리 용량 합 A가 0이면 재배분을 생략합니다. 그 밖에는 먼저 상·하한에 닿은 도시를 고정하고 남은 잔차를 여유가 있는 도시의 headroom 비율로 최대 64회 재배분합니다. 마지막에는 소수부가 큰 순서로 1명씩 더하는 largest remainder 반올림을 써서 정수 합계를 원래 총량과 정확히 맞춥니다. 기본 인구가 0이면 상·하한도 0이므로 일자리 건물만으로 새 인구가 생기지는 않습니다.
도시 분포는 매우 치우쳐 있습니다
41개 도시 중 추정 인구가 1명 이상인 곳은 20개이고, 21개 도시는 0명입니다. 도시별 중앙값은 0명입니다. 송주시 한 곳이 전체의 65.35%를 차지하고, 상위 3개 도시가 79.44%, 상위 10개 도시가 95.38%입니다. 불평등도를 나타내는 Gini 계수는 0.8968입니다.
도시 분포
2026년 6월 상위 도시의 추정 인구 비중
분모는 마감된 41개 도시 합계 460,439명입니다. 막대는 0~100% 동일 축을 사용하며 0명인 21개 도시는 순위표에서 제외했습니다.
| 순위 | 도시 | 추정 인구 | 비중 |
|---|---|---|---|
| 1 | 송주시 | 300,876 | 65.35% |
| 2 | 오천시 | 44,738 | 9.72% |
| 3 | 은산시 | 20,152 | 4.38% |
| 4 | 동명시 | 16,790 | 3.65% |
| 5 | 미리내시 | 12,537 | 2.72% |
| 6 | 화명시 | 12,434 | 2.70% |
| 7 | 두도군 | 11,027 | 2.39% |
| 8 | 월산시 | 8,664 | 1.88% |
| 9 | 신현시 | 6,126 | 1.33% |
| 10 | 평천군 | 5,834 | 1.27% |
41개 도시 중 21개의 추정 인구가 0명입니다. 사람이 없어서가 아니라 주거 건물이 등록되지 않았기 때문입니다.
이 치우침을 도시의 실제 규모 차이로 읽으면 안 됩니다. 지표의 입력이 등록된 건물이기 때문에, 건물을 많이 등록한 도시가 곧 인구가 많은 도시가 됩니다. 21개 도시의 0명은 그 도시에 주거 데이터가 아직 들어오지 않았다는 뜻입니다. 도시 간 격차의 상당 부분은 실제 규모 차이가 아니라 데이터 포괄률 차이에서 옵니다.
재배분 단계도 이 한계를 그대로 물려받습니다. 이번 달에는 20개 도시 중 7개가 +15% 상한에 닿았습니다. 상한에 닿는 도시가 이렇게 많다는 것은 매력도 모형이 만들어 내는 힘이 제한선에 자주 가로막힌다는 뜻이며, 결과가 모형보다 상수에 더 많이 의존하고 있음을 시사합니다.
89개월 추이는 관측 기록이 아닙니다
공개되는 시계열은 2019년 2월부터 2026년 6월까지 마감된 89개월입니다. 그러나 이 89개월은 당시에 관측해 쌓은 값이 아닙니다. 모든 달이 2026년 7월 16일에 현행 알고리즘으로 한 번에 다시 계산되었습니다. 건물 등록일과 경계 관계의 유효기간을 과거 시점에 적용해 "그때 이 데이터가 있었다면 얼마였을까"를 재구성한 계열입니다.
그래서 월별 변화를 인구 증감으로 읽을 수 없습니다. 어떤 달의 급증은 그 달에 사람이 늘어난 것이 아니라, 그 달을 유효기간으로 갖는 건물이 뒤늦게 등록되었다는 뜻입니다. 2026년 1월의 +156,854명(+83.60%)이 대표적입니다.
알고리즘이 바뀌면 과거 89개월이 통째로 다시 계산되어 값이 바뀝니다. 이것은 결함이 아니라 재구성 계열의 성질입니다. 다만 그 성질을 밝히지 않으면 사용자는 시계열을 관측 기록으로 오해합니다. 공개 차트에는 각 점의 알고리즘 버전과 재계산 시각을 함께 제공하고, 알고리즘이 바뀌면 이전 계열을 보존하거나 단절선을 표시합니다.
연령 구조는 합성 분포입니다
연령과 성별은 관측하지 않습니다. 도시의 성숙도, 세대수, 인구 밀도, POI, 고용 건물, 활동과 성장 특성으로 기본 연령 비중을 조정해 만든 합성 분포입니다. 합계는 정확합니다. 5개 연령 구간의 합과 남녀 합이 모든 도시에서 총인구와 오차 없이 일치합니다.
연령 비중 계산식
입력 특성은 도시 집합의 현재 최댓값이 아니라 버전에 고정된 기준으로 0~1 정규화합니다. 로그 점수는 세대수·POI·활동·밀도처럼 치우친 값에, 선형 점수는 고용 건물 수처럼 범위가 제한된 값에 씁니다. 대표 기준은 세대 90,000, 학교 30, 의료 10, 교통 24, 상업 56, 문화 40, 공원 18, 활동시간 800,000초, 인구밀도 50,000, 고용 건물 210입니다.
성장률은 전월 대비 값을 먼저 ±8%로 제한합니다. 양의 성장 점수는 clamp(growth_rate / 0.04, 0, 1), 감소 점수는 clamp(-growth_rate / 0.04, 0, 1)이므로 절대 4% 이상에서는 같은 1로 포화됩니다.
log_score(x, S) = clamp(ln(1+x) / ln(1+S), 0, 1)
linear_score(x, S) = clamp(x / S, 0, 1)
maturity = 1 - exp(-months_since_registration / 72)
maturity_multiplier_k = max(0.4, 1 + age_shift_k * maturity)
weight_k = base_share_k * feature_factor_k * maturity_multiplier_k
share_k = weight_k / sum_j weight_j
count_k = largest_remainder(total_population * share_k)
| 구간 | 기본 비중 | feature factor · clamp | 성숙 shift |
|---|---|---|---|
| 0–14세 | 14.5% | 1 + .18학교 + .08공원 + .08세대 + .04성장 − .05의료 · 0.65~1.50 | −0.06 |
| 15–24세 | 11.5% | 1 + .10학교 + .10교통 + .06문화 + .05활동 + .03성장 · 0.65~1.45 | −0.10 |
| 25–44세 | 35.0% | 1 + .12상업 + .10고용 + .09교통 + .06활동 + .05밀도 + .05성장 − .03의료 · 0.70~1.55 | −0.16 |
| 45–64세 | 26.5% | 1 + .06공공문화 + .05산업 + .03상업 + .03의료 + .03세대 − .02성장 · 0.75~1.35 | +0.18 |
| 65세 이상 | 12.5% | 1 + .16의료 + .08공원 + .05공공문화 + .04감소 + .03(1−활동) − .05교통 · 0.70~1.45 | +0.34 |
성별은 각 연령 구간의 여성 기본 비중 48.6%, 49.0%, 49.5%, 50.6%, 53.2%에 같은 도시 특성의 작은 보정을 더해 47~58% 범위로 제한합니다. 여성 수를 반올림한 뒤 남성 수를 연령 인구 − 여성으로 두므로, 각 구간과 전체의 성별 합은 언제나 정확히 닫힙니다.
| 구간 | 추정 인구 | 비중 |
|---|---|---|
| 0–14세 | 70,776 | 15.37% |
| 15–24세 | 53,000 | 11.51% |
| 25–44세 | 158,665 | 34.46% |
| 45–64세 | 117,064 | 25.42% |
| 65세 이상 | 60,934 | 13.23% |
| 남성 | 229,298 | 49.80% |
| 여성 | 231,141 | 50.20% |
중위연령 추정은 38.42세, 노령화지수는 86.09, 총부양비는 40.07입니다. 그러나 도시별로 보면 값의 범위가 매우 좁습니다. 유소년 비율은 13.04~15.85%, 중위연령은 37.78~40.90세 안에 모여 있습니다. 도시마다 다른 인구 구조를 보여 주는 것처럼 보이지만, 실제로는 같은 기본 분포를 조금씩 흔든 결과에 가깝습니다.
연령 모형은 도시의 활동시간을 입력으로 받습니다. 6월에는 인구가 있는 20개 도시 중 19곳에 활동시간이 들어왔습니다. 다만 이 입력이 도시 간 연령 차이를 크게 벌리지는 못합니다. 위의 좁은 범위가 그 결과입니다. 활동시간은 연령을 관측한 값이 아니라 연령 비중을 조금 조정하는 특성 중 하나일 뿐입니다.
한계와 사용 범위
내부 계산의 정합성은 높습니다. 다음 항목은 모두 확인되었습니다.
- 도시 합계, 연령 합계, 성별 합계, 홈페이지 표시값이 모두 460,439명으로 일치합니다.
- 도시 간 재배분 전후 총량이 오차 없이 보존됩니다.
- 음수 인구나 인구–세대 연결 위반이 없습니다.
- 같은 입력에서 같은 결과가 다시 계산됩니다.
그러나 정합성은 정확성이 아닙니다. 다음 한계가 남아 있습니다.
- 세대수는 실제 거주 여부, 공실, 다중 거주를 구분하지 않습니다.
- 유형별 평균 세대원수는 관측으로 보정되지 않은 가정값입니다.
- 건물 등록이 늦거나 소급되면 과거 시계열이 함께 바뀝니다.
- 일자리 용량은 건물 수의 가중합이지 실제 고용이 아닙니다.
- 512블록 격자로 집계한 공간 인구는 460,211명으로 도시 합계보다 228명(0.05%) 적습니다. 집계 경로와 갱신 시각이 달라 생기는 차이입니다.
- 위키에 기재된 인구와의 비교는 41개 도시 중 36개에서만 가능합니다. 비교에서 빠지는 5개 도시의 추정 인구 합은 54명이라 결론을 바꾸지 않지만, 두 값의 포괄 범위가 다르다는 점은 남습니다.
기준 인구와의 격차는 -146,395명(-24.13%)입니다. 이 격차는 양쪽 값이 모두 있는 36개 도시만으로 계산합니다. 기준 인구가 없는 도시의 추정 인구까지 섞어서 빼면 포괄 범위의 차이가 실제 차이처럼 보이기 때문입니다.
쓸 수 있는 것 → 도시 건설 규모 비교, 주거 수용력 추정, 공간 분포 탐색
쓸 수 없는 것 → 공식 인구, 실제 거주자 수, 출생·사망·이동, 접속자 수, 미래 예측
이 지표의 가장 큰 위험은 계산 오류가 아니라 이름입니다. "인구"라는 단어는 현실의 인구를 뜻한다고 읽히기 때문입니다. 그래서 PLAYCITY는 이 값을 건물 기반 추정 인구로 부르고, 표시되는 모든 자리에 기준월과 계산 시각, 알고리즘 버전, 모형값이라는 사실을 함께 붙입니다. 작은 도시의 값은 건물 하나가 등록되는 것만으로 크게 움직이므로, 도시별 월 변화는 변동성 경고와 함께 제공합니다.
앞으로의 과제는 세 가지입니다. 도시별 데이터 포괄률을 품질지표로 만들어 인구값과 함께 제공하는 것, 재배분 강도와 상한의 민감도를 실험해 상수 의존을 줄이는 것, 그리고 건물 기반 수용 인구와 활동 기반 체류 인구를 별도 지표로 분리하는 것입니다. 각각의 결과는 후속 보고서로 공개합니다.