{
 "no": 1,
 "slug": "01-ansan-foreigners",
 "title": "안산은 하나의 다문화 도시가 아니다",
 "date": "2026-07",
 "workdir": "analysis",
 "steps": [
  {
   "name": "analyze",
   "script": "analyze.py"
  },
  {
   "name": "build",
   "script": "build_magazine.py"
  }
 ],
 "outputs": {
  "ledger": "수치대장.csv",
  "html": "모연매거진_1호_안산_군집분석.html",
  "raw": "analysis/ansan_typed.csv"
 },
 "sanity": {
  "key": "행정동",
  "rows": 25,
  "columns": [
   "행정동",
   "총인구",
   "외국인",
   "외국인비율",
   "외국인성비",
   "유형"
  ],
  "no_nulls": true,
  "drift_pct": 20
 },
 "_주석": {
  "rows": "안산시 행정동은 25개. 이 수가 달라지면 원자료 파싱이 깨진 것이므로 FAIL.",
  "drift_pct": "이전 스냅샷 대비 20% 초과 변동은 WARN — 실제 변화일 수도 있어 멈추지는 않음.",
  "출처": "공공데이터포털 '경기도 안산시_내국인 및 외국인 현황' (기준일 2026-02-20)"
 },
 "cards": {
  "dek": "'외국인 15%'라는 한 숫자 뒤에는 성격이 전혀 다른 동네들이 숨어 있다. 25개 행정동 데이터를 군집분석에 넣자, 안산은 4가지 얼굴로 갈라졌다.",
  "body": [
   "안산의 외국인은 하나가 아니다. 외국인이 다수인 원곡동, 남성이 여성의 <b>4.9배</b>인 초지동, 외곽 소수, 그리고 가족과 정착한 주거지 — 비율이 아니라 '성비'가 이 넷을 가른다.",
   "외국인 '비율'로 동네를 줄 세우면 원곡동(<b>72%</b>)만 튀고 나머지는 뭉뚱그려진다. 하지만 축을 하나 더 — 외국인 성비(남÷여) — 넣으면 이야기가 달라진다. 성비는 '왜 왔는가'를 드러낸다. 균형(≈1)은 가족과 정착한 사람들이고, 극단적 남초는 홀로 온 노동자다.",
   "세 지표(외국인비율·성비·인구)로 K-평균 군집분석을 돌렸다. 프로파일러가 원곡동·초지동을 이상치로 자동 감지했고, K-평균·계층군집이 같은 결과(실루엣 <b>0.63</b>)를 냈다. 데이터가 스스로 4개 유형으로 갈린 것이다.",
   "외국인은 단원구 서부(원곡·신길·백운·선부2동)에 몰려 하나의 밀집 벨트를 이룬다. 그런데 같은 벨트 안에서도 성격이 갈린다 — 초지동은 비율이 낮은데도 완전히 다른 유형(공단 남성노동)으로 분류됐다."
  ],
  "chart": "analysis/plots/clu_02_pca_scatter.png",
  "chart_cap": "네 유형을 외국인 비율(가로)과 성비(세로)로 놓은 것. 공단 남성노동(초지동)은 비율이 낮은데도 성비만 극단이라 혼자 위로 튄다. 비율로만 줄 세우면 안 보이는 자리다. 남초의 원인이 공단 노동인지는 이 자료만으로 확정되지 않는다.",
  "sowhat": "안산 전체가 '외국인 도시'인 게 아니라, 특정 벨트에 집중된 도시다. 같은 '외국인 동네'라도 초지동(극단적 남초)과 원곡동(성비 균형)은 완전히 다른 정책이 필요하다.",
  "source": "공공데이터포털 「경기도 안산시_내국인 및 외국인 현황」(2026.2.20 기준 · 25개 행정동) · data.go.kr/3069669 · 맥락: 안산 외국인주민 108,033명(2023, 전국 1위 · 15.2%) 행정안전부",
  "limit": "남초의 원인이 공단 노동인지는 이 자료만으로 확정되지 않는다. 군집에 넣은 지표는 외국인비율·성비·총인구 셋뿐이라 체류자격·거주기간·산업 같은 축은 들어 있지 않다. 행정동은 행정 경계일 뿐이어서 생활권과 일치하지 않는다.",
  "chart_card": "analysis/plots/card_types.png"
 },
 "magazine": {
  "정합": [
   {
    "말": "크기",
    "주장": "같은 안산인데 외국인 비율이 정의에 따라 8.19% 와 15.2% 로 갈린다",
    "근거": [
     "N21",
     "N22",
     "N23",
     "N24",
     "N20"
    ],
    "한마디": "행안부 광의(장기체류 + 국적취득 + 자녀)로는 <b>{{N21}}</b>% (<b>{{N20:,}}</b>명), 안산시 집계 체류외국인으로는 <b>{{N22}}</b>% (<b>{{N23:,}}</b> ÷ <b>{{N24:,}}</b>)다. 두 배 가까이 차이 나므로 어느 정의인지 적지 않은 「안산 외국인 비율」은 그 자체로 값이 아니다. 그래서 둘을 병기하고, 분자와 분모를 따로 실었다."
   },
   {
    "말": "분포",
    "주장": "안산 전체가 「외국인 도시」인 것이 아니라 특정 벨트에 몰려 있다",
    "근거": [
     "N01",
     "N51",
     "N52:퍼짐",
     "N53:퍼짐",
     "N22"
    ],
    "한마디": "시 전체는 <b>{{N22}}</b>% 인데 <b>동별 중앙값은 {{N52}}%</b> 다 — 절반 넘는 동이 그 근처다. 그런데 위아래로는 원곡동 <b>{{N01}}</b>% 와 성포동 <b>{{N51}}</b>% 로 <b>{{N53}}</b>%p 벌어져 있다. 「25개 동 중 몇 곳」이라는 개수로는 이 폭이 안 보여서 중앙값과 범위를 값으로 함께 냈다."
   }
  ],
  "검증": [
   {
    "한계": "군집 <b>K=4 는 우리가 고른 것</b>이다 — 지표가 가리킨 값이 아니다",
    "방향": "내려간다",
    "크기": [
     "N31",
     "N32",
     "N33"
    ],
    "판정": "결론을 좁혔다",
    "왜": "실루엣은 <b>K=2 가 {{N32:.3f}}</b> · <b>K=3 이 {{N33:.3f}}</b> 으로 채택한 <b>K=4({{N31:.3f}})</b> 보다 «높다». K=2 는 원곡동만, K=3 은 원곡동·초지동만 떼어 낸다. K=4 를 고른 것은 「안산동·대부동」이라는 넷째 갈래가 정책적으로 다르게 다뤄야 할 동네라고 봤기 때문이지 지표가 그쪽을 가리켜서가 아니다. 그래서 이 글은 「4유형이 옳다」고 말하지 않고 「4유형으로 나눠 보면 이렇게 갈린다」까지만 쓴다. K를 줄여도 원곡동과 초지동이 서로 다른 동네라는 결론은 그대로 남는다."
   },
   {
    "한계": "이 파일의 「외국인」은 <b>등록·거소 정의가 명시되지 않은 시점 스냅샷</b>이다",
    "방향": "올라간다",
    "크기": [
     "N21",
     "N22",
     "N20",
     "N23",
     "N24"
    ],
    "판정": "결론이 선다",
    "왜": "시 전체로 <b>{{N22}}</b>% 인데 행안부 광의치는 <b>{{N21}}</b>% 다 — 이 표가 좁은 정의라는 뜻이므로 보정하면 «올라가는» 쪽이다. 그래도 이 글의 결론은 서는데, 이 글이 말하는 것이 «수준»이 아니라 «동별로 갈린다»이기 때문이다. 두 정의는 시 전체에 같은 방향으로 걸리므로 동 사이의 순서와 폭을 뒤집지 않는다. 다만 「안산 외국인이 몇 %다」를 이 글에서 인용할 때는 반드시 어느 정의인지 함께 적어야 한다."
   },
   {
    "한계": "「공단 남성노동」이라는 유형 이름은 <b>성비에 기댄 추론</b>이다",
    "방향": "모른다",
    "크기": [],
    "판정": "말하지 않는다",
    "왜": "이 표에는 국적·연령·체류자격이 없다. 초지동의 성비가 높다는 사실까지가 자료가 보여 준 것이고, 그 남성들이 공단 노동자인지는 확인되지 않았다. 확인하려면 체류자격별 통계를 붙여야 하는데 동 단위로 그 표가 없다. 그래서 유형 이름은 «해석»이고, 본문에도 「이 자료만으로 확정되지 않는다」고 적었다."
   },
   {
    "한계": "국적·연령·체류자격이 <b>없다</b> — 같은 「외국인」 안의 차이를 못 본다",
    "방향": "모른다",
    "크기": [],
    "판정": "말하지 않는다",
    "왜": "유학생이 많은 동네와 공단 노동자가 많은 동네는 필요한 정책이 다른데, 이 표는 둘을 같은 칸에 넣는다. 그 차이의 크기를 재려면 체류자격별 동 단위 표가 있어야 하고 공개돼 있지 않다. 그래서 이 글은 「어떤 외국인인가」를 말하지 않고 「어디에 몰려 있고 성비가 어떻게 갈리는가」까지만 쓴다."
   },
   {
    "한계": "<b>한 시점의 스냅샷</b>(2026-02-20)이라 늘고 있는지 줄고 있는지 알 수 없다",
    "방향": "모른다",
    "크기": [],
    "판정": "말하지 않는다",
    "왜": "이 파일은 한 날짜의 25개 동 값만 준다. 시계열이 없어 「밀집 벨트가 넓어지는 중인가」 같은 질문에 답할 수 없고, 그 변화 폭도 값으로 못 낸다. 이 글의 모든 문장은 그 하루의 사진에 대한 것이다."
   }
  ]
 },
 "고친이력": [
   {
     "때": "2026-09-06",
     "무엇": "한계 문단 끝의 「게재 전 국적·시계열 데이터 보강 권장」을 「국적·시계열 자료가 붙으면 이 해석은 다시 재야 한다」로 바꿨다",
     "왜": "이미 게재한 글에 「게재 전 … 권장」이 남아 있었다 — 독자에게 보내는 한계가 아니라 우리 작업 메모였다",
     "찾은곳": "내부 감사"
   },
   {
     "때": "2026-09-06",
     "무엇": "글에 쓰던 내부 메모 기호(경고 표시)를 빼고, 「대장에 등록했다」처럼 우리끼리 쓰던 말을 독자의 말로 바꿨다. 소스 주석에 남아 있던 작업 메모도 걷었다",
     "왜": "매거진은 밖으로 나가는 글인데 내부 작업 문서의 표기가 그대로 실려 있었다 — 수치와 주장은 바뀌지 않았다",
     "찾은곳": "우리"
   }
 ]
}