korean-stats-mcp 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +301 -0
  3. package/dist/api/client.d.ts +65 -0
  4. package/dist/api/client.d.ts.map +1 -0
  5. package/dist/api/client.js +143 -0
  6. package/dist/api/client.js.map +1 -0
  7. package/dist/api/types.d.ts +157 -0
  8. package/dist/api/types.d.ts.map +1 -0
  9. package/dist/api/types.js +5 -0
  10. package/dist/api/types.js.map +1 -0
  11. package/dist/cache/index.d.ts +55 -0
  12. package/dist/cache/index.d.ts.map +1 -0
  13. package/dist/cache/index.js +102 -0
  14. package/dist/cache/index.js.map +1 -0
  15. package/dist/config/index.d.ts +46 -0
  16. package/dist/config/index.d.ts.map +1 -0
  17. package/dist/config/index.js +54 -0
  18. package/dist/config/index.js.map +1 -0
  19. package/dist/data/quickStatsParams.d.ts +76 -0
  20. package/dist/data/quickStatsParams.d.ts.map +1 -0
  21. package/dist/data/quickStatsParams.js +1344 -0
  22. package/dist/data/quickStatsParams.js.map +1 -0
  23. package/dist/index.d.ts +13 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +56 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/prompts/index.d.ts +5 -0
  28. package/dist/prompts/index.d.ts.map +1 -0
  29. package/dist/prompts/index.js +5 -0
  30. package/dist/prompts/index.js.map +1 -0
  31. package/dist/prompts/statisticsAssistant.d.ts +25 -0
  32. package/dist/prompts/statisticsAssistant.d.ts.map +1 -0
  33. package/dist/prompts/statisticsAssistant.js +43 -0
  34. package/dist/prompts/statisticsAssistant.js.map +1 -0
  35. package/dist/resources/categoryTree.d.ts +18 -0
  36. package/dist/resources/categoryTree.d.ts.map +1 -0
  37. package/dist/resources/categoryTree.js +80 -0
  38. package/dist/resources/categoryTree.js.map +1 -0
  39. package/dist/resources/index.d.ts +6 -0
  40. package/dist/resources/index.d.ts.map +1 -0
  41. package/dist/resources/index.js +6 -0
  42. package/dist/resources/index.js.map +1 -0
  43. package/dist/resources/keyIndicators.d.ts +20 -0
  44. package/dist/resources/keyIndicators.d.ts.map +1 -0
  45. package/dist/resources/keyIndicators.js +108 -0
  46. package/dist/resources/keyIndicators.js.map +1 -0
  47. package/dist/server-http.d.ts +10 -0
  48. package/dist/server-http.d.ts.map +1 -0
  49. package/dist/server-http.js +134 -0
  50. package/dist/server-http.js.map +1 -0
  51. package/dist/server.d.ts +10 -0
  52. package/dist/server.d.ts.map +1 -0
  53. package/dist/server.js +194 -0
  54. package/dist/server.js.map +1 -0
  55. package/dist/tools/analyzeTimeSeries.d.ts +70 -0
  56. package/dist/tools/analyzeTimeSeries.d.ts.map +1 -0
  57. package/dist/tools/analyzeTimeSeries.js +204 -0
  58. package/dist/tools/analyzeTimeSeries.js.map +1 -0
  59. package/dist/tools/chains.d.ts +197 -0
  60. package/dist/tools/chains.d.ts.map +1 -0
  61. package/dist/tools/chains.js +369 -0
  62. package/dist/tools/chains.js.map +1 -0
  63. package/dist/tools/compareStatistics.d.ts +62 -0
  64. package/dist/tools/compareStatistics.d.ts.map +1 -0
  65. package/dist/tools/compareStatistics.js +190 -0
  66. package/dist/tools/compareStatistics.js.map +1 -0
  67. package/dist/tools/fetchKosisExcel.d.ts +62 -0
  68. package/dist/tools/fetchKosisExcel.d.ts.map +1 -0
  69. package/dist/tools/fetchKosisExcel.js +366 -0
  70. package/dist/tools/fetchKosisExcel.js.map +1 -0
  71. package/dist/tools/getRecommendedStats.d.ts +41 -0
  72. package/dist/tools/getRecommendedStats.d.ts.map +1 -0
  73. package/dist/tools/getRecommendedStats.js +251 -0
  74. package/dist/tools/getRecommendedStats.js.map +1 -0
  75. package/dist/tools/getStatisticsData.d.ts +75 -0
  76. package/dist/tools/getStatisticsData.d.ts.map +1 -0
  77. package/dist/tools/getStatisticsData.js +305 -0
  78. package/dist/tools/getStatisticsData.js.map +1 -0
  79. package/dist/tools/getStatisticsList.d.ts +69 -0
  80. package/dist/tools/getStatisticsList.d.ts.map +1 -0
  81. package/dist/tools/getStatisticsList.js +336 -0
  82. package/dist/tools/getStatisticsList.js.map +1 -0
  83. package/dist/tools/getTableInfo.d.ts +66 -0
  84. package/dist/tools/getTableInfo.d.ts.map +1 -0
  85. package/dist/tools/getTableInfo.js +85 -0
  86. package/dist/tools/getTableInfo.js.map +1 -0
  87. package/dist/tools/index.d.ts +14 -0
  88. package/dist/tools/index.d.ts.map +1 -0
  89. package/dist/tools/index.js +19 -0
  90. package/dist/tools/index.js.map +1 -0
  91. package/dist/tools/quickStats.d.ts +71 -0
  92. package/dist/tools/quickStats.d.ts.map +1 -0
  93. package/dist/tools/quickStats.js +490 -0
  94. package/dist/tools/quickStats.js.map +1 -0
  95. package/dist/tools/quickTrend.d.ts +61 -0
  96. package/dist/tools/quickTrend.d.ts.map +1 -0
  97. package/dist/tools/quickTrend.js +328 -0
  98. package/dist/tools/quickTrend.js.map +1 -0
  99. package/dist/tools/searchStatistics.d.ts +41 -0
  100. package/dist/tools/searchStatistics.d.ts.map +1 -0
  101. package/dist/tools/searchStatistics.js +318 -0
  102. package/dist/tools/searchStatistics.js.map +1 -0
  103. package/dist/utils/dataFormatter.d.ts +40 -0
  104. package/dist/utils/dataFormatter.d.ts.map +1 -0
  105. package/dist/utils/dataFormatter.js +142 -0
  106. package/dist/utils/dataFormatter.js.map +1 -0
  107. package/dist/utils/errorHandler.d.ts +33 -0
  108. package/dist/utils/errorHandler.d.ts.map +1 -0
  109. package/dist/utils/errorHandler.js +94 -0
  110. package/dist/utils/errorHandler.js.map +1 -0
  111. package/dist/utils/metaLookup.d.ts +93 -0
  112. package/dist/utils/metaLookup.d.ts.map +1 -0
  113. package/dist/utils/metaLookup.js +170 -0
  114. package/dist/utils/metaLookup.js.map +1 -0
  115. package/dist/utils/queryParser.d.ts +45 -0
  116. package/dist/utils/queryParser.d.ts.map +1 -0
  117. package/dist/utils/queryParser.js +244 -0
  118. package/dist/utils/queryParser.js.map +1 -0
  119. package/dist/utils/regions.d.ts +70 -0
  120. package/dist/utils/regions.d.ts.map +1 -0
  121. package/dist/utils/regions.js +261 -0
  122. package/dist/utils/regions.js.map +1 -0
  123. package/package.json +60 -0
@@ -0,0 +1,1344 @@
1
+ /**
2
+ * Quick Stats 정적 파라미터 매핑
3
+ * - curl로 다운받은 메타데이터를 분석하여 생성
4
+ * - 동적 조회 대신 미리 검증된 파라미터 사용
5
+ */
6
+ // ===== 공통 지역 코드 상수 =====
7
+ // 테이블마다 지역 코드 체계가 다를 수 있음
8
+ /** 인구동향/출산율/혼인율 등에서 사용하는 지역 코드 */
9
+ export const REGION_CODES_DEMOGRAPHIC = {
10
+ '전국': '00',
11
+ '서울': '11',
12
+ '부산': '21',
13
+ '대구': '22',
14
+ '인천': '23',
15
+ '광주': '24',
16
+ '대전': '25',
17
+ '울산': '26',
18
+ '세종': '29',
19
+ '경기': '31',
20
+ '강원': '32',
21
+ '충북': '33',
22
+ '충남': '34',
23
+ '전북': '35',
24
+ '전남': '36',
25
+ '경북': '37',
26
+ '경남': '38',
27
+ '제주': '39',
28
+ };
29
+ /** 인구(주민등록)에서 사용하는 지역 코드 */
30
+ export const REGION_CODES_POPULATION = {
31
+ '전국': '00',
32
+ '서울': '11',
33
+ '부산': '26',
34
+ '대구': '27',
35
+ '인천': '28',
36
+ '광주': '29',
37
+ '대전': '30',
38
+ '울산': '31',
39
+ '세종': '36',
40
+ '경기': '41',
41
+ '강원': '51',
42
+ '충북': '43',
43
+ '충남': '44',
44
+ '전북': '52',
45
+ '전남': '46',
46
+ '경북': '47',
47
+ '경남': '48',
48
+ '제주': '50',
49
+ };
50
+ /** 물가지수에서 사용하는 지역 코드 */
51
+ export const REGION_CODES_CPI = {
52
+ '전국': 'T10',
53
+ '서울': 'T11',
54
+ '부산': 'T12',
55
+ '대구': 'T13',
56
+ '인천': 'T14',
57
+ '광주': 'T15',
58
+ '대전': 'T16',
59
+ '울산': 'T17',
60
+ '세종': 'T18',
61
+ '경기': 'T21',
62
+ '강원': 'T31',
63
+ '충북': 'T41',
64
+ '충남': 'T51',
65
+ '전북': 'T61',
66
+ '전남': 'T71',
67
+ '경북': 'T81',
68
+ '경남': 'T90',
69
+ '제주': 'T96',
70
+ };
71
+ /** 주택/아파트 가격지수에서 사용하는 지역 코드 */
72
+ export const REGION_CODES_HOUSING = {
73
+ '전국': 'a0',
74
+ '서울': 'a7',
75
+ '경기': 'a8',
76
+ '인천': 'a9',
77
+ '부산': 'b1',
78
+ '대구': 'b2',
79
+ '광주': 'b3',
80
+ '대전': 'b4',
81
+ '울산': 'b5',
82
+ '세종': 'b6',
83
+ '강원': 'c1',
84
+ '충북': 'c2',
85
+ '충남': 'c3',
86
+ '전북': 'c4',
87
+ '전남': 'c5',
88
+ '경북': 'c6',
89
+ '경남': 'c7',
90
+ '제주': 'c8',
91
+ };
92
+ /** PM2.5 미세먼지 지역 코드 (환경부 테이블) */
93
+ export const REGION_CODES_PM25 = {
94
+ '전국': '13102128219A.4100001',
95
+ '서울': '13102128219A.4200003',
96
+ '부산': '13102128219A.4200005',
97
+ '대구': '13102128219A.4200007',
98
+ '인천': '13102128219A.4200009',
99
+ '광주': '13102128219A.4200011',
100
+ '대전': '13102128219A.4200013',
101
+ '울산': '13102128219A.4200015',
102
+ '세종': '13102128219A.4200017',
103
+ '경기': '13102128219A.4200050', // 도평균
104
+ '강원': '13102128219A.4200058', // 도평균
105
+ '충북': '13102128219A.4200081', // 도평균
106
+ '충남': '13102128219A.4200101', // 도평균
107
+ '전북': '13102128219A.4200115', // 도평균
108
+ '전남': '13102128219A.4200128', // 도평균
109
+ '경북': '13102128219A.4200152', // 도평균
110
+ '경남': '13102128219A.4200179', // 도평균
111
+ '제주': '13102128219A.4200192', // 도평균
112
+ };
113
+ /** PM10 미세먼지 지역 코드 (환경부 테이블) */
114
+ export const REGION_CODES_PM10 = {
115
+ '전국': '13102128237A.4100001',
116
+ '서울': '13102128237A.4200003',
117
+ '부산': '13102128237A.4200005',
118
+ '대구': '13102128237A.4200007',
119
+ '인천': '13102128237A.4200009',
120
+ '광주': '13102128237A.4200011',
121
+ '대전': '13102128237A.4200013',
122
+ '울산': '13102128237A.4200015',
123
+ '세종': '13102128237A.4200017',
124
+ '경기': '13102128237A.4200050', // 도평균
125
+ '강원': '13102128237A.4200058', // 도평균
126
+ '충북': '13102128237A.4200081', // 도평균
127
+ '충남': '13102128237A.4200101', // 도평균
128
+ '전북': '13102128237A.4200115', // 도평균
129
+ '전남': '13102128237A.4200128', // 도평균
130
+ '경북': '13102128237A.4200152', // 도평균
131
+ '경남': '13102128237A.4200179', // 도평균
132
+ '제주': '13102128237A.4200192', // 도평균
133
+ };
134
+ /**
135
+ * 검증된 Quick Stats 파라미터
136
+ * - 2024년 기준 KOSIS API 메타데이터에서 추출
137
+ */
138
+ export const QUICK_STATS_PARAMS = {
139
+ // ===== 인구 관련 =====
140
+ // DT_1B040A3: 행정구역(시군구)별 성별 인구수 (1992~2025, 최신 데이터)
141
+ '인구': {
142
+ orgId: '101',
143
+ tableId: 'DT_1B040A3',
144
+ tableName: '행정구역(시군구)별 성별 인구수',
145
+ description: '주민등록 총인구',
146
+ objL1: '00', // 전국 (C1: "00")
147
+ itemId: 'T20', // 총인구수 (ITM_ID: "T20")
148
+ unit: '명',
149
+ regionCodes: REGION_CODES_POPULATION,
150
+ },
151
+ '총인구': {
152
+ orgId: '101',
153
+ tableId: 'DT_1B040A3',
154
+ tableName: '행정구역(시군구)별 성별 인구수',
155
+ description: '주민등록 총인구',
156
+ objL1: '00',
157
+ itemId: 'T20',
158
+ unit: '명',
159
+ regionCodes: REGION_CODES_POPULATION,
160
+ },
161
+ // ===== 출산율 관련 =====
162
+ // 주의: 출산율 테이블은 인구 테이블과 다른 지역 코드 체계 사용
163
+ '출산율': {
164
+ orgId: '101',
165
+ tableId: 'DT_1B81A17',
166
+ tableName: '합계출산율',
167
+ description: '합계출산율',
168
+ objL1: '00', // 전국 (OBJ_ID: "A")
169
+ itemId: 'T1', // 합계출산율 (OBJ_ID: "ITEM")
170
+ unit: '명',
171
+ regionCodes: REGION_CODES_DEMOGRAPHIC,
172
+ },
173
+ '합계출산율': {
174
+ orgId: '101',
175
+ tableId: 'DT_1B81A17',
176
+ tableName: '합계출산율',
177
+ description: '합계출산율 (여성 1명당)',
178
+ objL1: '00',
179
+ itemId: 'T1',
180
+ unit: '명',
181
+ regionCodes: REGION_CODES_DEMOGRAPHIC,
182
+ },
183
+ // ===== 고용 관련 =====
184
+ // DT_1DA7004S: 행정구역(시도)별 경제활동인구 (1999~2025, 시도별 지원, 월/분기/연 모두 지원)
185
+ '실업률': {
186
+ orgId: '101',
187
+ tableId: 'DT_1DA7004S',
188
+ tableName: '행정구역(시도)별 경제활동인구',
189
+ description: '실업률',
190
+ objL1: '00', // 전국 (OBJ_ID: "A")
191
+ itemId: 'T80', // 실업률 (%)
192
+ unit: '%',
193
+ regionCodes: REGION_CODES_DEMOGRAPHIC,
194
+ supportedPeriods: ['Y', 'Q', 'M'],
195
+ },
196
+ '고용률': {
197
+ orgId: '101',
198
+ tableId: 'DT_1DA7004S',
199
+ tableName: '행정구역(시도)별 경제활동인구',
200
+ description: '고용률',
201
+ objL1: '00', // 전국 (OBJ_ID: "A")
202
+ itemId: 'T90', // 고용률 (%)
203
+ unit: '%',
204
+ regionCodes: REGION_CODES_DEMOGRAPHIC,
205
+ supportedPeriods: ['Y', 'Q', 'M'],
206
+ },
207
+ // ===== 경제 관련 =====
208
+ 'GDP': {
209
+ orgId: '301',
210
+ tableId: 'DT_200Y001',
211
+ tableName: '국내총생산(GDP)',
212
+ description: '국내총생산(GDP)',
213
+ objL1: '13102134474ACC_ITEM.10101', // 국내총생산 명목 원화표시
214
+ itemId: '13103134474999', // 주요지표
215
+ unit: '십억원',
216
+ },
217
+ '국내총생산': {
218
+ orgId: '301',
219
+ tableId: 'DT_200Y001',
220
+ tableName: '국내총생산(GDP)',
221
+ description: '국내총생산(GDP)',
222
+ objL1: '13102134474ACC_ITEM.10101',
223
+ itemId: '13103134474999',
224
+ unit: '십억원',
225
+ },
226
+ // ===== 물가 관련 =====
227
+ '물가': {
228
+ orgId: '101',
229
+ tableId: 'DT_1J22001',
230
+ tableName: '지출목적별 소비자물가지수',
231
+ description: '소비자물가지수',
232
+ objL1: 'T10', // 전국 (OBJ_ID: "C" - 시도별)
233
+ objL2: '0', // 총지수 (OBJ_ID: "D" - 지출목적별, 0=총지수)
234
+ itemId: 'T', // 소비자물가지수 (OBJ_ID: "ITEM")
235
+ unit: '2020=100',
236
+ regionCodes: REGION_CODES_CPI,
237
+ supportedPeriods: ['Y', 'M'],
238
+ },
239
+ '소비자물가': {
240
+ orgId: '101',
241
+ tableId: 'DT_1J22001',
242
+ tableName: '지출목적별 소비자물가지수',
243
+ description: '소비자물가지수',
244
+ objL1: 'T10',
245
+ objL2: '0', // 총지수
246
+ itemId: 'T',
247
+ unit: '2020=100',
248
+ regionCodes: REGION_CODES_CPI,
249
+ supportedPeriods: ['Y', 'M'],
250
+ },
251
+ '소비자물가지수': {
252
+ orgId: '101',
253
+ tableId: 'DT_1J22001',
254
+ tableName: '지출목적별 소비자물가지수',
255
+ description: '소비자물가지수 (2020=100)',
256
+ objL1: 'T10',
257
+ objL2: '0', // 총지수
258
+ itemId: 'T',
259
+ unit: '2020=100',
260
+ regionCodes: REGION_CODES_CPI,
261
+ supportedPeriods: ['Y', 'M'],
262
+ },
263
+ // ===== 혼인 관련 =====
264
+ '혼인율': {
265
+ orgId: '101',
266
+ tableId: 'DT_1B83A34',
267
+ tableName: '시도/일반혼인율',
268
+ description: '일반혼인율 (인구 천명당)',
269
+ objL1: '00', // 전국
270
+ itemId: 'T10', // 남편 기준 혼인율
271
+ unit: '‰',
272
+ regionCodes: REGION_CODES_DEMOGRAPHIC, // 인구동향 지역코드 사용 (POPULATION 코드가 아님)
273
+ },
274
+ // ===== 수명 관련 =====
275
+ '기대수명': {
276
+ orgId: '101',
277
+ tableId: 'DT_1B42',
278
+ tableName: '완전생명표(1세별)',
279
+ description: '기대수명 (0세 기대여명)',
280
+ objL1: '050', // 0세 (출생시)
281
+ itemId: 'T6', // 기대여명(전체)
282
+ unit: '년',
283
+ },
284
+ '기대여명': {
285
+ orgId: '101',
286
+ tableId: 'DT_1B42',
287
+ tableName: '완전생명표(1세별)',
288
+ description: '기대수명 (0세 기대여명)',
289
+ objL1: '050', // 0세 (출생시)
290
+ itemId: 'T6', // 기대여명(전체)
291
+ unit: '년',
292
+ },
293
+ '평균수명': {
294
+ orgId: '101',
295
+ tableId: 'DT_1B42',
296
+ tableName: '완전생명표(1세별)',
297
+ description: '기대수명 (0세 기대여명)',
298
+ objL1: '050', // 0세 (출생시)
299
+ itemId: 'T6', // 기대여명(전체)
300
+ unit: '년',
301
+ },
302
+ // ===== 무역 관련 =====
303
+ '수출액': {
304
+ orgId: '101',
305
+ tableId: 'DT_1YL6901',
306
+ tableName: '수출액(시도)',
307
+ description: '수출액',
308
+ objL1: '00', // 전국
309
+ itemId: 'T10', // 수출액
310
+ unit: '100만달러',
311
+ regionCodes: REGION_CODES_DEMOGRAPHIC,
312
+ },
313
+ '수출': {
314
+ orgId: '101',
315
+ tableId: 'DT_1YL6901',
316
+ tableName: '수출액(시도)',
317
+ description: '수출액',
318
+ objL1: '00',
319
+ itemId: 'T10',
320
+ unit: '100만달러',
321
+ regionCodes: REGION_CODES_DEMOGRAPHIC,
322
+ },
323
+ // ===== 수입 관련 =====
324
+ '수입액': {
325
+ orgId: '134',
326
+ tableId: 'DT_134001_001',
327
+ tableName: '수출입총괄',
328
+ description: '수입액',
329
+ objL1: 'DATA', // 가상분류
330
+ itemId: 'T004', // 수입금액
331
+ unit: '천달러',
332
+ },
333
+ '수입': {
334
+ orgId: '134',
335
+ tableId: 'DT_134001_001',
336
+ tableName: '수출입총괄',
337
+ description: '수입액',
338
+ objL1: 'DATA',
339
+ itemId: 'T004',
340
+ unit: '천달러',
341
+ },
342
+ '무역수지': {
343
+ orgId: '134',
344
+ tableId: 'DT_134001_001',
345
+ tableName: '수출입총괄',
346
+ description: '무역수지 (수출-수입)',
347
+ objL1: 'DATA',
348
+ itemId: 'T005',
349
+ unit: '천달러',
350
+ },
351
+ // ===== 인구동향 (출생/사망/혼인/이혼) =====
352
+ // DT_1B8000G: 종합 인구동향 테이블 (월/분기/연 모두 지원)
353
+ // objL1 = 지역코드 (B), objL2 = 종류코드 (A), itmId = T1
354
+ '출생아수': {
355
+ orgId: '101',
356
+ tableId: 'DT_1B8000G',
357
+ tableName: '월.분기.연간 인구동향',
358
+ description: '출생아수',
359
+ objL1: '00', // 전국 (지역)
360
+ objL2: '10', // 출생아수(명) (종류)
361
+ itemId: 'T1',
362
+ unit: '명',
363
+ regionCodes: REGION_CODES_DEMOGRAPHIC,
364
+ supportedPeriods: ['Y', 'Q', 'M'],
365
+ },
366
+ '출생아': {
367
+ orgId: '101',
368
+ tableId: 'DT_1B8000G',
369
+ tableName: '월.분기.연간 인구동향',
370
+ description: '출생아수',
371
+ objL1: '00',
372
+ objL2: '10',
373
+ itemId: 'T1',
374
+ unit: '명',
375
+ regionCodes: REGION_CODES_DEMOGRAPHIC,
376
+ supportedPeriods: ['Y', 'Q', 'M'],
377
+ },
378
+ '조출생률': {
379
+ orgId: '101',
380
+ tableId: 'DT_1B8000G',
381
+ tableName: '월.분기.연간 인구동향',
382
+ description: '조출생률 (인구 천명당)',
383
+ objL1: '00',
384
+ objL2: '11', // 조출생률(천명당)
385
+ itemId: 'T1',
386
+ unit: '‰',
387
+ regionCodes: REGION_CODES_DEMOGRAPHIC,
388
+ supportedPeriods: ['Y', 'Q', 'M'],
389
+ },
390
+ '사망자수': {
391
+ orgId: '101',
392
+ tableId: 'DT_1B8000G',
393
+ tableName: '월.분기.연간 인구동향',
394
+ description: '사망자수',
395
+ objL1: '00',
396
+ objL2: '15', // 사망자수(명)
397
+ itemId: 'T1',
398
+ unit: '명',
399
+ regionCodes: REGION_CODES_DEMOGRAPHIC,
400
+ supportedPeriods: ['Y', 'Q', 'M'],
401
+ },
402
+ '사망자': {
403
+ orgId: '101',
404
+ tableId: 'DT_1B8000G',
405
+ tableName: '월.분기.연간 인구동향',
406
+ description: '사망자수',
407
+ objL1: '00',
408
+ objL2: '15',
409
+ itemId: 'T1',
410
+ unit: '명',
411
+ regionCodes: REGION_CODES_DEMOGRAPHIC,
412
+ supportedPeriods: ['Y', 'Q', 'M'],
413
+ },
414
+ '조사망률': {
415
+ orgId: '101',
416
+ tableId: 'DT_1B8000G',
417
+ tableName: '월.분기.연간 인구동향',
418
+ description: '조사망률 (인구 천명당)',
419
+ objL1: '00',
420
+ objL2: '16', // 조사망률(천명당)
421
+ itemId: 'T1',
422
+ unit: '‰',
423
+ regionCodes: REGION_CODES_DEMOGRAPHIC,
424
+ supportedPeriods: ['Y', 'Q', 'M'],
425
+ },
426
+ '사망률': {
427
+ orgId: '101',
428
+ tableId: 'DT_1B8000G',
429
+ tableName: '월.분기.연간 인구동향',
430
+ description: '조사망률 (인구 천명당)',
431
+ objL1: '00',
432
+ objL2: '16',
433
+ itemId: 'T1',
434
+ unit: '‰',
435
+ regionCodes: REGION_CODES_DEMOGRAPHIC,
436
+ supportedPeriods: ['Y', 'Q', 'M'],
437
+ },
438
+ '이혼건수': {
439
+ orgId: '101',
440
+ tableId: 'DT_1B8000G',
441
+ tableName: '월.분기.연간 인구동향',
442
+ description: '이혼건수',
443
+ objL1: '00',
444
+ objL2: '30', // 이혼건수(건)
445
+ itemId: 'T1',
446
+ unit: '건',
447
+ regionCodes: REGION_CODES_DEMOGRAPHIC,
448
+ supportedPeriods: ['Y', 'Q', 'M'],
449
+ },
450
+ '조이혼율': {
451
+ orgId: '101',
452
+ tableId: 'DT_1B8000G',
453
+ tableName: '월.분기.연간 인구동향',
454
+ description: '조이혼율 (인구 천명당)',
455
+ objL1: '00',
456
+ objL2: '31', // 조이혼율(천명당)
457
+ itemId: 'T1',
458
+ unit: '‰',
459
+ regionCodes: REGION_CODES_DEMOGRAPHIC,
460
+ supportedPeriods: ['Y', 'Q', 'M'],
461
+ },
462
+ '이혼율': {
463
+ orgId: '101',
464
+ tableId: 'DT_1B8000G',
465
+ tableName: '월.분기.연간 인구동향',
466
+ description: '조이혼율 (인구 천명당)',
467
+ objL1: '00',
468
+ objL2: '31',
469
+ itemId: 'T1',
470
+ unit: '‰',
471
+ regionCodes: REGION_CODES_DEMOGRAPHIC,
472
+ supportedPeriods: ['Y', 'Q', 'M'],
473
+ },
474
+ '혼인건수': {
475
+ orgId: '101',
476
+ tableId: 'DT_1B8000G',
477
+ tableName: '월.분기.연간 인구동향',
478
+ description: '혼인건수',
479
+ objL1: '00',
480
+ objL2: '20', // 혼인건수(건)
481
+ itemId: 'T1',
482
+ unit: '건',
483
+ regionCodes: REGION_CODES_DEMOGRAPHIC,
484
+ supportedPeriods: ['Y', 'Q', 'M'],
485
+ },
486
+ '조혼인율': {
487
+ orgId: '101',
488
+ tableId: 'DT_1B8000G',
489
+ tableName: '월.분기.연간 인구동향',
490
+ description: '조혼인율 (인구 천명당)',
491
+ objL1: '00',
492
+ objL2: '21', // 조혼인율(천명당)
493
+ itemId: 'T1',
494
+ unit: '‰',
495
+ regionCodes: REGION_CODES_DEMOGRAPHIC,
496
+ supportedPeriods: ['Y', 'Q', 'M'],
497
+ },
498
+ '자연증가': {
499
+ orgId: '101',
500
+ tableId: 'DT_1B8000G',
501
+ tableName: '월.분기.연간 인구동향',
502
+ description: '자연증가건수 (출생-사망)',
503
+ objL1: '00',
504
+ objL2: '17', // 자연증가건수(명)
505
+ itemId: 'T1',
506
+ unit: '명',
507
+ regionCodes: REGION_CODES_DEMOGRAPHIC,
508
+ supportedPeriods: ['Y', 'Q', 'M'],
509
+ },
510
+ '자연증가율': {
511
+ orgId: '101',
512
+ tableId: 'DT_1B8000G',
513
+ tableName: '월.분기.연간 인구동향',
514
+ description: '자연증가율 (인구 천명당)',
515
+ objL1: '00',
516
+ objL2: '18', // 자연증가율(천명당)
517
+ itemId: 'T1',
518
+ unit: '‰',
519
+ regionCodes: REGION_CODES_DEMOGRAPHIC,
520
+ supportedPeriods: ['Y', 'Q', 'M'],
521
+ },
522
+ // ===== 경제성장률 관련 =====
523
+ '경제성장률': {
524
+ orgId: '301',
525
+ tableId: 'DT_200Y101',
526
+ tableName: '주요지표(연간지표)',
527
+ description: 'GDP 실질성장률',
528
+ objL1: '13102136288ACC_ITEM.20101', // 국내총생산(실질성장률)
529
+ itemId: '13103136288999', // 주요지표
530
+ unit: '%',
531
+ },
532
+ '성장률': {
533
+ orgId: '301',
534
+ tableId: 'DT_200Y101',
535
+ tableName: '주요지표(연간지표)',
536
+ description: 'GDP 실질성장률',
537
+ objL1: '13102136288ACC_ITEM.20101',
538
+ itemId: '13103136288999',
539
+ unit: '%',
540
+ },
541
+ 'GDP성장률': {
542
+ orgId: '301',
543
+ tableId: 'DT_200Y101',
544
+ tableName: '주요지표(연간지표)',
545
+ description: 'GDP 실질성장률',
546
+ objL1: '13102136288ACC_ITEM.20101',
547
+ itemId: '13103136288999',
548
+ unit: '%',
549
+ },
550
+ // ===== 고용 추가 지표 =====
551
+ // DT_1DA7001S: 성별 경제활동인구 총괄
552
+ '취업자수': {
553
+ orgId: '101',
554
+ tableId: 'DT_1DA7001S',
555
+ tableName: '성별 경제활동인구 총괄',
556
+ description: '취업자수',
557
+ objL1: '0', // 계 - 성별
558
+ itemId: 'T30', // 취업자 (천명)
559
+ unit: '천명',
560
+ },
561
+ '취업자': {
562
+ orgId: '101',
563
+ tableId: 'DT_1DA7001S',
564
+ tableName: '성별 경제활동인구 총괄',
565
+ description: '취업자수',
566
+ objL1: '0',
567
+ itemId: 'T30',
568
+ unit: '천명',
569
+ },
570
+ '경제활동인구': {
571
+ orgId: '101',
572
+ tableId: 'DT_1DA7001S',
573
+ tableName: '성별 경제활동인구 총괄',
574
+ description: '경제활동인구',
575
+ objL1: '0', // 계 - 성별
576
+ itemId: 'T20', // 경제활동인구 (천명)
577
+ unit: '천명',
578
+ },
579
+ '실업자수': {
580
+ orgId: '101',
581
+ tableId: 'DT_1DA7001S',
582
+ tableName: '성별 경제활동인구 총괄',
583
+ description: '실업자수',
584
+ objL1: '0', // 계 - 성별
585
+ itemId: 'T40', // 실업자 (천명)
586
+ unit: '천명',
587
+ },
588
+ '실업자': {
589
+ orgId: '101',
590
+ tableId: 'DT_1DA7001S',
591
+ tableName: '성별 경제활동인구 총괄',
592
+ description: '실업자수',
593
+ objL1: '0',
594
+ itemId: 'T40',
595
+ unit: '천명',
596
+ },
597
+ '비경제활동인구': {
598
+ orgId: '101',
599
+ tableId: 'DT_1DA7001S',
600
+ tableName: '성별 경제활동인구 총괄',
601
+ description: '비경제활동인구',
602
+ objL1: '0',
603
+ itemId: 'T50', // 비경제활동인구 (천명)
604
+ unit: '천명',
605
+ },
606
+ // ===== 부동산 관련 =====
607
+ // DT_1YL13501E: 주택매매가격지수 (2003.11~, 월간)
608
+ '주택가격': {
609
+ orgId: '101',
610
+ tableId: 'DT_1YL13501E',
611
+ tableName: '주택매매가격지수(시도/시/군/구)',
612
+ description: '주택매매가격지수',
613
+ objL1: 'a0', // 전국
614
+ itemId: 'sales', // 주택매매가격지수
615
+ unit: '(2021.6=100)',
616
+ regionCodes: REGION_CODES_HOUSING,
617
+ supportedPeriods: ['M'],
618
+ },
619
+ '주택매매가격': {
620
+ orgId: '101',
621
+ tableId: 'DT_1YL13501E',
622
+ tableName: '주택매매가격지수(시도/시/군/구)',
623
+ description: '주택매매가격지수',
624
+ objL1: 'a0',
625
+ itemId: 'sales',
626
+ unit: '(2021.6=100)',
627
+ regionCodes: REGION_CODES_HOUSING,
628
+ supportedPeriods: ['M'],
629
+ },
630
+ '주택가격지수': {
631
+ orgId: '101',
632
+ tableId: 'DT_1YL13501E',
633
+ tableName: '주택매매가격지수(시도/시/군/구)',
634
+ description: '주택매매가격지수',
635
+ objL1: 'a0',
636
+ itemId: 'sales',
637
+ unit: '(2021.6=100)',
638
+ regionCodes: REGION_CODES_HOUSING,
639
+ supportedPeriods: ['M'],
640
+ },
641
+ // DT_1YL20161E: 아파트매매가격지수 (2003.11~, 월간)
642
+ '아파트가격': {
643
+ orgId: '101',
644
+ tableId: 'DT_1YL20161E',
645
+ tableName: '아파트매매가격지수(시도/시/군/구)',
646
+ description: '아파트매매가격지수',
647
+ objL1: 'a0', // 전국
648
+ itemId: 'sales', // 아파트매매가격지수
649
+ unit: '(2021.6=100)',
650
+ regionCodes: REGION_CODES_HOUSING,
651
+ supportedPeriods: ['M'],
652
+ },
653
+ '아파트매매가격': {
654
+ orgId: '101',
655
+ tableId: 'DT_1YL20161E',
656
+ tableName: '아파트매매가격지수(시도/시/군/구)',
657
+ description: '아파트매매가격지수',
658
+ objL1: 'a0',
659
+ itemId: 'sales',
660
+ unit: '(2021.6=100)',
661
+ regionCodes: REGION_CODES_HOUSING,
662
+ supportedPeriods: ['M'],
663
+ },
664
+ '아파트가격지수': {
665
+ orgId: '101',
666
+ tableId: 'DT_1YL20161E',
667
+ tableName: '아파트매매가격지수(시도/시/군/구)',
668
+ description: '아파트매매가격지수',
669
+ objL1: 'a0',
670
+ itemId: 'sales',
671
+ unit: '(2021.6=100)',
672
+ regionCodes: REGION_CODES_HOUSING,
673
+ supportedPeriods: ['M'],
674
+ },
675
+ '아파트': {
676
+ orgId: '101',
677
+ tableId: 'DT_1YL20161E',
678
+ tableName: '아파트매매가격지수(시도/시/군/구)',
679
+ description: '아파트매매가격지수',
680
+ objL1: 'a0',
681
+ itemId: 'sales',
682
+ unit: '(2021.6=100)',
683
+ regionCodes: REGION_CODES_HOUSING,
684
+ supportedPeriods: ['M'],
685
+ },
686
+ // ===== 임금/소득 관련 =====
687
+ // DT_1YL15006: 월평균 임금 및 임금상승률 (시도별, 연간)
688
+ '임금': {
689
+ orgId: '101',
690
+ tableId: 'DT_1YL15006',
691
+ tableName: '월평균 임금 및 임금상승률(시도)',
692
+ description: '상용근로자 월평균 임금',
693
+ objL1: '00', // 전국
694
+ itemId: 'T001', // 상용 월평균 임금
695
+ unit: '원',
696
+ regionCodes: REGION_CODES_DEMOGRAPHIC,
697
+ },
698
+ '월평균임금': {
699
+ orgId: '101',
700
+ tableId: 'DT_1YL15006',
701
+ tableName: '월평균 임금 및 임금상승률(시도)',
702
+ description: '상용근로자 월평균 임금',
703
+ objL1: '00',
704
+ itemId: 'T001',
705
+ unit: '원',
706
+ regionCodes: REGION_CODES_DEMOGRAPHIC,
707
+ },
708
+ '월급': {
709
+ orgId: '101',
710
+ tableId: 'DT_1YL15006',
711
+ tableName: '월평균 임금 및 임금상승률(시도)',
712
+ description: '상용근로자 월평균 임금',
713
+ objL1: '00',
714
+ itemId: 'T001',
715
+ unit: '원',
716
+ regionCodes: REGION_CODES_DEMOGRAPHIC,
717
+ },
718
+ '평균임금': {
719
+ orgId: '101',
720
+ tableId: 'DT_1YL15006',
721
+ tableName: '월평균 임금 및 임금상승률(시도)',
722
+ description: '상용근로자 월평균 임금',
723
+ objL1: '00',
724
+ itemId: 'T001',
725
+ unit: '원',
726
+ regionCodes: REGION_CODES_DEMOGRAPHIC,
727
+ },
728
+ // ===== GRDP (지역내총생산) =====
729
+ // INH_1C91: GRDP 시도별 (연간)
730
+ 'GRDP': {
731
+ orgId: '101',
732
+ tableId: 'INH_1C91',
733
+ tableName: 'GRDP(시도)',
734
+ description: '지역내총생산(명목)',
735
+ objL1: '00', // 전국
736
+ objL2: 'Z10', // 지역내총생산(시장가격)
737
+ itemId: 'T1', // 명목
738
+ unit: '백만원',
739
+ regionCodes: REGION_CODES_DEMOGRAPHIC,
740
+ },
741
+ '지역내총생산': {
742
+ orgId: '101',
743
+ tableId: 'INH_1C91',
744
+ tableName: 'GRDP(시도)',
745
+ description: '지역내총생산(명목)',
746
+ objL1: '00',
747
+ objL2: 'Z10',
748
+ itemId: 'T1',
749
+ unit: '백만원',
750
+ regionCodes: REGION_CODES_DEMOGRAPHIC,
751
+ },
752
+ // ===== 전세 가격지수 =====
753
+ // DT_1YL13601E: 주택전세가격지수 (2003.11~, 월간)
754
+ '전세가격': {
755
+ orgId: '101',
756
+ tableId: 'DT_1YL13601E',
757
+ tableName: '주택전세가격지수(시도/시/군/구)',
758
+ description: '주택전세가격지수',
759
+ objL1: 'a0',
760
+ itemId: 'sales',
761
+ unit: '(2021.6=100)',
762
+ regionCodes: REGION_CODES_HOUSING,
763
+ supportedPeriods: ['M'],
764
+ },
765
+ '전세가격지수': {
766
+ orgId: '101',
767
+ tableId: 'DT_1YL13601E',
768
+ tableName: '주택전세가격지수(시도/시/군/구)',
769
+ description: '주택전세가격지수',
770
+ objL1: 'a0',
771
+ itemId: 'sales',
772
+ unit: '(2021.6=100)',
773
+ regionCodes: REGION_CODES_HOUSING,
774
+ supportedPeriods: ['M'],
775
+ },
776
+ '주택전세': {
777
+ orgId: '101',
778
+ tableId: 'DT_1YL13601E',
779
+ tableName: '주택전세가격지수(시도/시/군/구)',
780
+ description: '주택전세가격지수',
781
+ objL1: 'a0',
782
+ itemId: 'sales',
783
+ unit: '(2021.6=100)',
784
+ regionCodes: REGION_CODES_HOUSING,
785
+ supportedPeriods: ['M'],
786
+ },
787
+ '전세': {
788
+ orgId: '101',
789
+ tableId: 'DT_1YL13601E',
790
+ tableName: '주택전세가격지수(시도/시/군/구)',
791
+ description: '주택전세가격지수',
792
+ objL1: 'a0',
793
+ itemId: 'sales',
794
+ unit: '(2021.6=100)',
795
+ regionCodes: REGION_CODES_HOUSING,
796
+ supportedPeriods: ['M'],
797
+ },
798
+ // DT_1YL20171E: 아파트전세가격지수 (2003.11~, 월간)
799
+ '아파트전세': {
800
+ orgId: '101',
801
+ tableId: 'DT_1YL20171E',
802
+ tableName: '아파트전세가격지수(시도/시/군/구)',
803
+ description: '아파트전세가격지수',
804
+ objL1: 'a0',
805
+ itemId: 'sales',
806
+ unit: '(2021.6=100)',
807
+ regionCodes: REGION_CODES_HOUSING,
808
+ supportedPeriods: ['M'],
809
+ },
810
+ '아파트전세가격': {
811
+ orgId: '101',
812
+ tableId: 'DT_1YL20171E',
813
+ tableName: '아파트전세가격지수(시도/시/군/구)',
814
+ description: '아파트전세가격지수',
815
+ objL1: 'a0',
816
+ itemId: 'sales',
817
+ unit: '(2021.6=100)',
818
+ regionCodes: REGION_CODES_HOUSING,
819
+ supportedPeriods: ['M'],
820
+ },
821
+ // ===== 자동차 등록 =====
822
+ // DT_1YL20731: 1인당 자동차 등록대수 (시도별, 연간)
823
+ '자동차': {
824
+ orgId: '101',
825
+ tableId: 'DT_1YL20731',
826
+ tableName: '1인당 자동차 등록대수(시도/시/군/구)',
827
+ description: '자동차 등록대수',
828
+ objL1: '00',
829
+ itemId: 'T001', // 자동차등록대수
830
+ unit: '대',
831
+ regionCodes: REGION_CODES_DEMOGRAPHIC,
832
+ },
833
+ '자동차등록': {
834
+ orgId: '101',
835
+ tableId: 'DT_1YL20731',
836
+ tableName: '1인당 자동차 등록대수(시도/시/군/구)',
837
+ description: '자동차 등록대수',
838
+ objL1: '00',
839
+ itemId: 'T001',
840
+ unit: '대',
841
+ regionCodes: REGION_CODES_DEMOGRAPHIC,
842
+ },
843
+ '자동차대수': {
844
+ orgId: '101',
845
+ tableId: 'DT_1YL20731',
846
+ tableName: '1인당 자동차 등록대수(시도/시/군/구)',
847
+ description: '자동차 등록대수',
848
+ objL1: '00',
849
+ itemId: 'T001',
850
+ unit: '대',
851
+ regionCodes: REGION_CODES_DEMOGRAPHIC,
852
+ },
853
+ // ===== 범죄 통계 =====
854
+ // DT_1YL3001: 인구 천명당 범죄발생건수 (시도별, 연간)
855
+ '범죄': {
856
+ orgId: '101',
857
+ tableId: 'DT_1YL3001',
858
+ tableName: '인구 천명당 범죄발생건수(시도)',
859
+ description: '인구 천명당 범죄발생건수',
860
+ objL1: '00',
861
+ itemId: 'T10', // 인구 천명당 범죄발생건수
862
+ unit: '건',
863
+ regionCodes: REGION_CODES_DEMOGRAPHIC,
864
+ },
865
+ '범죄율': {
866
+ orgId: '101',
867
+ tableId: 'DT_1YL3001',
868
+ tableName: '인구 천명당 범죄발생건수(시도)',
869
+ description: '인구 천명당 범죄발생건수',
870
+ objL1: '00',
871
+ itemId: 'T10',
872
+ unit: '건',
873
+ regionCodes: REGION_CODES_DEMOGRAPHIC,
874
+ },
875
+ '범죄발생': {
876
+ orgId: '101',
877
+ tableId: 'DT_1YL3001',
878
+ tableName: '인구 천명당 범죄발생건수(시도)',
879
+ description: '범죄발생건수',
880
+ objL1: '00',
881
+ itemId: 'T001', // 범죄발생건수 (총)
882
+ unit: '건',
883
+ regionCodes: REGION_CODES_DEMOGRAPHIC,
884
+ },
885
+ // ===== 관광 통계 =====
886
+ // DT_TRD_TGT_ENT_AGG_MONTH: 외래관광객 입국 (월간)
887
+ '관광객': {
888
+ orgId: '314',
889
+ tableId: 'DT_TRD_TGT_ENT_AGG_MONTH',
890
+ tableName: '외래객 입국-목적별/국적별',
891
+ description: '외래관광객수',
892
+ objL1: '13102314422A.1', // 총계
893
+ itemId: '13103314422T01', // 계
894
+ unit: '명',
895
+ supportedPeriods: ['M'],
896
+ },
897
+ '외래관광객': {
898
+ orgId: '314',
899
+ tableId: 'DT_TRD_TGT_ENT_AGG_MONTH',
900
+ tableName: '외래객 입국-목적별/국적별',
901
+ description: '외래관광객수',
902
+ objL1: '13102314422A.1',
903
+ itemId: '13103314422T01',
904
+ unit: '명',
905
+ supportedPeriods: ['M'],
906
+ },
907
+ '입국자': {
908
+ orgId: '314',
909
+ tableId: 'DT_TRD_TGT_ENT_AGG_MONTH',
910
+ tableName: '외래객 입국-목적별/국적별',
911
+ description: '외래관광객수',
912
+ objL1: '13102314422A.1',
913
+ itemId: '13103314422T01',
914
+ unit: '명',
915
+ supportedPeriods: ['M'],
916
+ },
917
+ // ===== 교통사고 =====
918
+ '교통사고': {
919
+ orgId: '101',
920
+ tableId: 'DT_1YL21051',
921
+ tableName: '자동차 천대당 교통사고발생건수(시도/시/군/구)',
922
+ description: '교통사고 발생건수',
923
+ objL1: '00',
924
+ itemId: 'T001',
925
+ unit: '건',
926
+ regionCodes: REGION_CODES_DEMOGRAPHIC,
927
+ },
928
+ '교통사고발생': {
929
+ orgId: '101',
930
+ tableId: 'DT_1YL21051',
931
+ tableName: '자동차 천대당 교통사고발생건수(시도/시/군/구)',
932
+ description: '교통사고 발생건수',
933
+ objL1: '00',
934
+ itemId: 'T001',
935
+ unit: '건',
936
+ regionCodes: REGION_CODES_DEMOGRAPHIC,
937
+ },
938
+ '사고건수': {
939
+ orgId: '101',
940
+ tableId: 'DT_1YL21051',
941
+ tableName: '자동차 천대당 교통사고발생건수(시도/시/군/구)',
942
+ description: '교통사고 발생건수',
943
+ objL1: '00',
944
+ itemId: 'T001',
945
+ unit: '건',
946
+ regionCodes: REGION_CODES_DEMOGRAPHIC,
947
+ },
948
+ // ===== 의료 (의사수) =====
949
+ '의사': {
950
+ orgId: '101',
951
+ tableId: 'DT_1YL20981',
952
+ tableName: '인구 천명당 의료기관 종사 의사수(시도/시/군/구)',
953
+ description: '의료기관 종사 의사수',
954
+ objL1: '00',
955
+ itemId: 'T001',
956
+ unit: '명',
957
+ regionCodes: REGION_CODES_DEMOGRAPHIC,
958
+ },
959
+ '의사수': {
960
+ orgId: '101',
961
+ tableId: 'DT_1YL20981',
962
+ tableName: '인구 천명당 의료기관 종사 의사수(시도/시/군/구)',
963
+ description: '의료기관 종사 의사수',
964
+ objL1: '00',
965
+ itemId: 'T001',
966
+ unit: '명',
967
+ regionCodes: REGION_CODES_DEMOGRAPHIC,
968
+ },
969
+ '의료인력': {
970
+ orgId: '101',
971
+ tableId: 'DT_1YL20981',
972
+ tableName: '인구 천명당 의료기관 종사 의사수(시도/시/군/구)',
973
+ description: '의료기관 종사 의사수',
974
+ objL1: '00',
975
+ itemId: 'T001',
976
+ unit: '명',
977
+ regionCodes: REGION_CODES_DEMOGRAPHIC,
978
+ },
979
+ // ===== 초혼연령 관련 =====
980
+ // INH_1B83A09: 평균 초혼연령(시도/시/군/구) - 2019~2024, 시도별 지원
981
+ '초혼연령': {
982
+ orgId: '101',
983
+ tableId: 'INH_1B83A09',
984
+ tableName: '평균 초혼연령(시도/시/군/구)',
985
+ description: '남편 평균 초혼연령',
986
+ objL1: '00', // 전국
987
+ itemId: 'T10', // 남편
988
+ unit: '세',
989
+ regionCodes: REGION_CODES_DEMOGRAPHIC,
990
+ },
991
+ '평균초혼연령': {
992
+ orgId: '101',
993
+ tableId: 'INH_1B83A09',
994
+ tableName: '평균 초혼연령(시도/시/군/구)',
995
+ description: '남편 평균 초혼연령',
996
+ objL1: '00',
997
+ itemId: 'T10',
998
+ unit: '세',
999
+ regionCodes: REGION_CODES_DEMOGRAPHIC,
1000
+ },
1001
+ '남성초혼연령': {
1002
+ orgId: '101',
1003
+ tableId: 'INH_1B83A09',
1004
+ tableName: '평균 초혼연령(시도/시/군/구)',
1005
+ description: '남편 평균 초혼연령',
1006
+ objL1: '00',
1007
+ itemId: 'T10',
1008
+ unit: '세',
1009
+ regionCodes: REGION_CODES_DEMOGRAPHIC,
1010
+ },
1011
+ '여성초혼연령': {
1012
+ orgId: '101',
1013
+ tableId: 'INH_1B83A09',
1014
+ tableName: '평균 초혼연령(시도/시/군/구)',
1015
+ description: '아내 평균 초혼연령',
1016
+ objL1: '00',
1017
+ itemId: 'T20', // 아내
1018
+ unit: '세',
1019
+ regionCodes: REGION_CODES_DEMOGRAPHIC,
1020
+ },
1021
+ // ===== 노령화지수 관련 =====
1022
+ // DT_1YL12501E: 노령화지수(시도) - 장래추계 데이터 (2033~2052, 미래연도)
1023
+ '노령화지수': {
1024
+ orgId: '101',
1025
+ tableId: 'DT_1YL12501E',
1026
+ tableName: '노령화지수(시도)',
1027
+ description: '노령화지수 (65세이상/15세미만*100, 장래추계)',
1028
+ objL1: '00', // 전국
1029
+ itemId: 'T10', // 노령화지수
1030
+ unit: '',
1031
+ regionCodes: REGION_CODES_DEMOGRAPHIC,
1032
+ isProjection: true,
1033
+ },
1034
+ '고령화지수': {
1035
+ orgId: '101',
1036
+ tableId: 'DT_1YL12501E',
1037
+ tableName: '노령화지수(시도)',
1038
+ description: '노령화지수 (65세이상/15세미만*100, 장래추계)',
1039
+ objL1: '00',
1040
+ itemId: 'T10',
1041
+ unit: '',
1042
+ regionCodes: REGION_CODES_DEMOGRAPHIC,
1043
+ isProjection: true,
1044
+ },
1045
+ // ===== 고령인구 관련 =====
1046
+ // DT_1YL20631: 고령인구비율(시도/시/군/구) - 2000~2025, 시도별 지원
1047
+ '고령인구': {
1048
+ orgId: '101',
1049
+ tableId: 'DT_1YL20631',
1050
+ tableName: '고령인구비율(시도/시/군/구)',
1051
+ description: '65세 이상 고령인구',
1052
+ objL1: '00', // 전국
1053
+ itemId: 'T001', // 65세이상인구
1054
+ unit: '명',
1055
+ regionCodes: REGION_CODES_DEMOGRAPHIC,
1056
+ },
1057
+ '노인인구': {
1058
+ orgId: '101',
1059
+ tableId: 'DT_1YL20631',
1060
+ tableName: '고령인구비율(시도/시/군/구)',
1061
+ description: '65세 이상 노인인구',
1062
+ objL1: '00',
1063
+ itemId: 'T001',
1064
+ unit: '명',
1065
+ regionCodes: REGION_CODES_DEMOGRAPHIC,
1066
+ },
1067
+ '65세이상인구': {
1068
+ orgId: '101',
1069
+ tableId: 'DT_1YL20631',
1070
+ tableName: '고령인구비율(시도/시/군/구)',
1071
+ description: '65세 이상 인구',
1072
+ objL1: '00',
1073
+ itemId: 'T001',
1074
+ unit: '명',
1075
+ regionCodes: REGION_CODES_DEMOGRAPHIC,
1076
+ },
1077
+ // ===== 대기환경 (미세먼지) =====
1078
+ '미세먼지': {
1079
+ orgId: '106',
1080
+ tableId: 'DT_106N_03_0200145',
1081
+ tableName: '미세먼지(PM2.5) 월별 도시별 대기오염도',
1082
+ description: '초미세먼지(PM2.5) 농도',
1083
+ objL1: '13102128219A.4100001', // 전국(총계)
1084
+ itemId: '13103128219T.1100001', // 월평균
1085
+ unit: 'μg/m³',
1086
+ regionCodes: REGION_CODES_PM25,
1087
+ supportedPeriods: ['M'],
1088
+ },
1089
+ 'PM2.5': {
1090
+ orgId: '106',
1091
+ tableId: 'DT_106N_03_0200145',
1092
+ tableName: '미세먼지(PM2.5) 월별 도시별 대기오염도',
1093
+ description: '초미세먼지(PM2.5) 농도',
1094
+ objL1: '13102128219A.4100001',
1095
+ itemId: '13103128219T.1100001',
1096
+ unit: 'μg/m³',
1097
+ regionCodes: REGION_CODES_PM25,
1098
+ supportedPeriods: ['M'],
1099
+ },
1100
+ '초미세먼지': {
1101
+ orgId: '106',
1102
+ tableId: 'DT_106N_03_0200145',
1103
+ tableName: '미세먼지(PM2.5) 월별 도시별 대기오염도',
1104
+ description: '초미세먼지(PM2.5) 농도',
1105
+ objL1: '13102128219A.4100001',
1106
+ itemId: '13103128219T.1100001',
1107
+ unit: 'μg/m³',
1108
+ regionCodes: REGION_CODES_PM25,
1109
+ supportedPeriods: ['M'],
1110
+ },
1111
+ 'PM10': {
1112
+ orgId: '106',
1113
+ tableId: 'DT_106N_03_0200045',
1114
+ tableName: '미세먼지(PM10) 월별 도시별 대기오염도',
1115
+ description: '미세먼지(PM10) 농도',
1116
+ objL1: '13102128237A.4100001', // 전국(총계)
1117
+ itemId: '13103128237T.1100001', // 월평균
1118
+ unit: 'μg/m³',
1119
+ regionCodes: REGION_CODES_PM10,
1120
+ supportedPeriods: ['M'],
1121
+ },
1122
+ '대기오염': {
1123
+ orgId: '106',
1124
+ tableId: 'DT_106N_03_0200145',
1125
+ tableName: '미세먼지(PM2.5) 월별 도시별 대기오염도',
1126
+ description: '초미세먼지(PM2.5) 농도',
1127
+ objL1: '13102128219A.4100001',
1128
+ itemId: '13103128219T.1100001',
1129
+ unit: 'μg/m³',
1130
+ regionCodes: REGION_CODES_PM25,
1131
+ supportedPeriods: ['M'],
1132
+ },
1133
+ };
1134
+ /**
1135
+ * 자연어 별칭 → 정식 키워드 매핑
1136
+ *
1137
+ * 설계 (korean-law-mcp의 LAW_ALIAS_ENTRIES 패턴 차용):
1138
+ * - 공무원 보고서·민원 응답·연설문에서 흔히 등장하는 구어체/줄임말 포괄
1139
+ * - 영문(소문자)도 동일 dict (영문은 lowercase로 정규화)
1140
+ * - 률↔율 오타 보정은 BASIC_TYPO_MAP이 별도 담당
1141
+ */
1142
+ export const KEYWORD_ALIASES = {
1143
+ // 인구/출산/사망/혼인
1144
+ '저출산': '출산율',
1145
+ '저출생': '출산율',
1146
+ '합계출산': '출산율',
1147
+ '출산': '출산율',
1148
+ '출생': '출생아수',
1149
+ '출생수': '출생아수',
1150
+ '신생아수': '출생아수',
1151
+ '사망': '사망자수',
1152
+ '사망수': '사망자수',
1153
+ '혼인': '혼인건수',
1154
+ '결혼': '혼인건수',
1155
+ '이혼': '이혼건수',
1156
+ '인구통계': '인구',
1157
+ '총인구수': '총인구',
1158
+ '주민등록인구': '인구',
1159
+ '국민': '인구',
1160
+ // 고령화
1161
+ '고령화': '고령인구',
1162
+ '노령화': '노령화지수',
1163
+ '노인': '고령인구',
1164
+ '노년': '고령인구',
1165
+ '노년층': '고령인구',
1166
+ '노인층': '고령인구',
1167
+ '실버': '고령인구',
1168
+ '65세이상': '고령인구',
1169
+ // 일자리/임금
1170
+ '취업': '취업자수',
1171
+ '취업률': '고용률',
1172
+ '청년실업': '실업률',
1173
+ '청년실업률': '실업률',
1174
+ '실엄': '실업률',
1175
+ '월소득': '월급',
1176
+ '월수입': '월급',
1177
+ '연봉': '월급',
1178
+ '연소득': '월급',
1179
+ '봉급': '월급',
1180
+ '급여': '월급',
1181
+ '소득': '월급',
1182
+ // 경제
1183
+ '국민총생산': 'GDP',
1184
+ '국내총생산': 'GDP',
1185
+ '실질gdp': 'GDP',
1186
+ '명목gdp': 'GDP',
1187
+ '경제규모': 'GDP',
1188
+ '지역gdp': 'GRDP',
1189
+ '시도gdp': 'GRDP',
1190
+ '시도총생산': 'GRDP',
1191
+ '성장률': '경제성장률',
1192
+ // 물가
1193
+ '물가상승률': '물가',
1194
+ '인플레이션': '물가',
1195
+ '소비자물가상승률': '소비자물가',
1196
+ // 주거
1197
+ '집값': '주택가격',
1198
+ '주택값': '주택가격',
1199
+ '주택매매값': '주택가격',
1200
+ '아파트값': '아파트가격',
1201
+ '아파트매매값': '아파트가격',
1202
+ '전셋값': '전세가격',
1203
+ '전세값': '전세가격',
1204
+ // 환경
1205
+ '미세먼지농도': '미세먼지',
1206
+ '대기질': '미세먼지',
1207
+ '대기상태': '미세먼지',
1208
+ '공기질': '미세먼지',
1209
+ // 의료
1210
+ '의료진': '의사수',
1211
+ '의료인': '의사수',
1212
+ '병원의사': '의사수',
1213
+ // 교통/안전
1214
+ '차량': '자동차',
1215
+ '차량등록': '자동차',
1216
+ '차량대수': '자동차',
1217
+ '사고': '교통사고',
1218
+ '범죄': '범죄율',
1219
+ // 관광
1220
+ '입국객': '외래관광객',
1221
+ '방한객': '외래관광객',
1222
+ '관광객수': '외래관광객',
1223
+ // 무역
1224
+ '무역': '수출',
1225
+ '수출액수': '수출액',
1226
+ '수입액수': '수입액',
1227
+ // 영문 (lowercase로 정규화 매칭)
1228
+ 'population': '인구',
1229
+ 'unemployment': '실업률',
1230
+ 'employment': '고용률',
1231
+ 'fertility': '출산율',
1232
+ 'birth': '출생아수',
1233
+ 'birthrate': '출산율',
1234
+ 'death': '사망자수',
1235
+ 'mortality': '사망률',
1236
+ 'marriage': '혼인율',
1237
+ 'divorce': '이혼율',
1238
+ 'inflation': '물가',
1239
+ 'cpi': '소비자물가',
1240
+ 'export': '수출',
1241
+ 'import': '수입',
1242
+ 'aging': '고령인구',
1243
+ 'elderly': '고령인구',
1244
+ 'gdp': 'GDP',
1245
+ 'grdp': 'GRDP',
1246
+ 'pm25': 'PM2.5',
1247
+ 'pm10': 'PM10',
1248
+ };
1249
+ /**
1250
+ * 자주 발생하는 오타·표기 변형 → 정식 키워드 매핑
1251
+ * (korean-law-mcp의 BASIC_CHAR_MAP 패턴 차용 — 키워드 단위로 확장)
1252
+ *
1253
+ * 주요 케이스:
1254
+ * - 률/율 받침 규칙 위반 (출산률, 고용율, 이혼률 등)
1255
+ * - 공백·중점 변형 (이미 normalizeKeywordKey가 제거하나 명시 매핑도 둠)
1256
+ */
1257
+ const BASIC_TYPO_MAP = {
1258
+ // 률 ↔ 율 오타 (받침 ㄴ/ㅇ 뒤는 율, 그 외 률)
1259
+ '출산률': '출산율',
1260
+ '출생률': '조출생률',
1261
+ '사망율': '사망률',
1262
+ '혼인률': '혼인율',
1263
+ '이혼률': '이혼율',
1264
+ '고용율': '고용률',
1265
+ '실엄률': '실업률',
1266
+ '실엄율': '실업률',
1267
+ '실업율': '실업률',
1268
+ '취업율': '고용률',
1269
+ '범죄률': '범죄율',
1270
+ // 공백 제거 후 흔한 변형
1271
+ '65세이상인구': '고령인구',
1272
+ '의료기관종사의사수': '의사수',
1273
+ };
1274
+ /**
1275
+ * 키워드 정규화 키 (공백 제거 + 소문자 + 일부 특수문자 제거)
1276
+ *
1277
+ * 정규화 후 동등 비교에 사용. 비교용으로만 사용 — 사용자 입력 자체를 바꾸지 않음.
1278
+ */
1279
+ function normalizeKeywordKey(value) {
1280
+ if (!value)
1281
+ return '';
1282
+ return value
1283
+ .normalize('NFC')
1284
+ .toLowerCase()
1285
+ .replace(/\s+/gu, '')
1286
+ .replace(/[·•・.\-_]/gu, '');
1287
+ }
1288
+ /** 정규화 키 → 정식 키워드 lookup (사전 빌드) */
1289
+ const KEYWORD_LOOKUP = new Map();
1290
+ for (const k of Object.keys(QUICK_STATS_PARAMS)) {
1291
+ KEYWORD_LOOKUP.set(normalizeKeywordKey(k), k);
1292
+ }
1293
+ for (const [alias, target] of Object.entries(KEYWORD_ALIASES)) {
1294
+ const key = normalizeKeywordKey(alias);
1295
+ if (!KEYWORD_LOOKUP.has(key))
1296
+ KEYWORD_LOOKUP.set(key, target);
1297
+ }
1298
+ for (const [typo, fix] of Object.entries(BASIC_TYPO_MAP)) {
1299
+ const key = normalizeKeywordKey(typo);
1300
+ if (!KEYWORD_LOOKUP.has(key))
1301
+ KEYWORD_LOOKUP.set(key, fix);
1302
+ }
1303
+ export { normalizeKeywordKey, KEYWORD_LOOKUP, BASIC_TYPO_MAP };
1304
+ /**
1305
+ * 키워드 조회 — 정확/별칭/정규화/오타 모두 시도
1306
+ *
1307
+ * 우선순위:
1308
+ * 1. 정확 매칭 (사용자 입력 그대로)
1309
+ * 2. 별칭 매핑 (대소문자 변형 포함)
1310
+ * 3. 정규화 매칭 (공백·소문자·특수문자 무시 + 오타 교정)
1311
+ */
1312
+ export function getQuickStatsParam(keyword) {
1313
+ if (!keyword)
1314
+ return undefined;
1315
+ const trimmed = keyword.trim();
1316
+ if (!trimmed)
1317
+ return undefined;
1318
+ // 1. 정확 매칭
1319
+ if (QUICK_STATS_PARAMS[trimmed])
1320
+ return QUICK_STATS_PARAMS[trimmed];
1321
+ // 2. 별칭 (대소문자 그대로 + 소문자 모두 시도)
1322
+ const lower = trimmed.toLowerCase();
1323
+ const aliasTarget = KEYWORD_ALIASES[trimmed] ?? KEYWORD_ALIASES[lower];
1324
+ if (aliasTarget && QUICK_STATS_PARAMS[aliasTarget]) {
1325
+ return QUICK_STATS_PARAMS[aliasTarget];
1326
+ }
1327
+ // 3. 정규화 매칭 (공백·소문자·중점·하이픈 무시 + 오타 교정)
1328
+ const normKey = normalizeKeywordKey(trimmed);
1329
+ const target = KEYWORD_LOOKUP.get(normKey);
1330
+ if (target && QUICK_STATS_PARAMS[target]) {
1331
+ return QUICK_STATS_PARAMS[target];
1332
+ }
1333
+ return undefined;
1334
+ }
1335
+ /**
1336
+ * 지역 코드 조회
1337
+ */
1338
+ export function getRegionCode(param, regionName) {
1339
+ if (param.regionCodes && param.regionCodes[regionName]) {
1340
+ return param.regionCodes[regionName];
1341
+ }
1342
+ return param.objL1; // 기본값
1343
+ }
1344
+ //# sourceMappingURL=quickStatsParams.js.map