파이썬으로 미분양주택현황 데이터 조회하기

PNG

Python 라이브러리 PublicDataReader를 이용하면 최신 지역별 주민등록인구 데이터를 쉽게 가져올 수 있다. 해당 데이터는 국가통계포털(KOSIS) 웹 사이트에 접속해 직접 조회할 수도 있지만, KOSIS 공유서비스 Open API를 이용해서도 조회할 수 있다. PublicDataReader는 KOSIS 공유서비스 Open API의 데이터 조회 기능을 포함하고 있어, 이를 활용하면 원하는 데이터를 쉽게 찾고 조회할 수 있다. KOSIS 공유서비스 Open API 신청 방법과 PublicDataReader에서 제공하는 KOSIS 공유서비스 Open API의 모든 기능을 살펴보려면 Python으로 KOSIS 데이터 조회하기를 참고하면 된다. 여기서는 ‘미분양주택현황(시도/시/군/구)’ 데이터를 조회하는 방법을 다루기로 한다.


설치하기

  • 운영체제(OS)에 따라 아래 중 하나를 선택한다.
    • Windows: CMD(명령 프롬프트) 실행
    • Mac: Terminal(터미널) 실행

아래 Shell 명령어를 입력 후 실행한다.

pip install PublicDataReader --upgrade


라이브러리 임포트하기

앞에서 설치한 PublicDataReader에서 Kosis 클래스를 임포트한다. KOSIS 공유서비스에서 발급받은 오픈 API 사용자 인증키 정보를 service_key 변수에 할당한다. Kosis의 인자료 service_key를 입력하여 데이터 조회 인스턴스 api를 만든다.

from PublicDataReader import Kosis

# KOSIS 공유서비스 Open API 사용자 인증키
service_key = "사용자 인증키"

# 인스턴스 생성하기
api = Kosis(service_key)


조회할 데이터 찾기

api.get_data() 메서드의 첫 번째 인자로 ‘KOSIS통합검색’을 지정한다. searchNm에는 조회할 데이터를 찾기 위한 키워드를 입력한다. 반환된 데이터프레임에서 조회할 데이터를 찾아 기관ID(ORG_ID)통계표ID(TBL_ID) 값을 확인한다. ‘미분양주택현황(시도/시/군/구)’ 데이터의 기관ID101이고, 통계표IDDT_1YL202001E 이므로 이 값들을 데이터를 조회할 때 사용한다. 참고로 api.get_data() 메서드에 translate=False 옵션을 지정하면 영문 컬럼명으로 데이터를 조회할 수 있다. 이 인자의 기본값은 True이므로 국문 컬럼명으로 조회한다.

df = api.get_data(
    "KOSIS통합검색",
    searchNm="시군구 미분양"
)
df.head(1)
기관ID 기관명 통계표ID 통계표명 조사ID 조사명 KOSIS목록구분 KOSIS통계표위치 통계표위치 통계표주요내용 수록기간시작일 수록기간종료일 통계표주석 추천통계표여부 KOSIS목록URL KOSIS통계표URL 검색결과건수 검색어명
0 116 국토교통부 DT_MLTM_5328 공사완료후 미분양현황 1998033 미분양주택현황보고 MT_ZTITLE 주거 > 미분양주택현황보고 I1 > I1_2 구분 시군구 부문 규모 울산 대전 전남 경기 충남 세종 경남 제주 전국 광주 강원 ... 2007 2022 자료 : 국토교통부 주택토지실 주택정책관 주택정책과 N https://kosis.kr/statisticsList/statisticsList... http://kosis.kr/statHtml/statHtml.do?orgId=116... 251 시군구 미분양


데이터 수록 주기와 시점 확인

api.get_data() 메서드의 첫 번째 인자로 ‘통계표설명’을 지정한다. 통계표설명의 경우 상세기능도 추가적으로 지정해야 한다. 두 번째 인자로 ‘자료갱신일’을 입력하고, 위에서 복사해둔 기관ID와 통계표ID의 값들을 api.get_data()의 인자로 입력해 데이터 수록주기와 수록시점을 확인한다. 수록주기(PRD_SE) 별 최근 수록시점(PRD_DE) 값을 조회하면 수록주기는 월 기준이며, 2000년 12월 ~ 2022년 11월 데이터가 수록되어 있는 것을 알 수 있다.

df = api.get_data(
    "통계표설명",
    "자료갱신일",
    orgId="101",
    tblId="DT_1YL202001E"
)

df.groupby(by=['수록주기']).agg({"수록시점": ["min", "max"]})
수록시점
min max
수록주기
200012 202211


데이터 항목 및 분류 확인하기

api.get_data() 메서드의 첫 번째 인자로 ‘통계표설명’을 지정한다. 두 번째 인자로 ‘분류항목’을 입력하고, 이번에도 기관ID와 통계표ID를 api.get_data()의 인자로 입력해 결과를 확인한다. 분류ID의 값이 ‘ITEM’ 이면 항목을 뜻하고 이 때, 분류값ID의 값을 통계자료 조회 시 itmId의 값으로 입력한다. 분류ID 값이 ITEM 이 아니고, 분류값순번 값에 숫자가 입력되어 있는 경우 이는 분류를 뜻하고, 분류값순번의 숫자 값이 분류 수준을 뜻한다. 예를 들어, 분류ID 값이 A이고, 분류값순번 값이 1이라면, 분류ID 값을 통계자료 조회 시 objL1의 값으로 입력한다.

item = api.get_data(
    "통계표설명",
    "분류항목",
    orgId="101",
    tblId="DT_1YL202001E",
)
item.head()
기관ID 통계표ID 분류ID 분류명 분류영문명 분류값ID 분류값명 분류값영문명 분류값순번
0 101 DT_1YL202001E ITEM 항목 Item code list 13103871087T1 미분양현황 Unsold Housing NaN
1 101 DT_1YL202001E 13101871087A 구분 SiGunGu 13102871087A.0001 총계 Total 1
2 101 DT_1YL202001E 13101871087A 구분 SiGunGu 13102871087A.0002 전국 Whole Country 1
3 101 DT_1YL202001E 13101871087A 구분 SiGunGu 13102871087A.0003 서울 Seoul 1
4 101 DT_1YL202001E 13101871087A 구분 SiGunGu 13102871087A.0004 부산 Busan 1

항목을 조회한 결과를 살펴보면 ‘미분양현황’ 하나만 선택 가능하다. 분류값ID의 값인 13103871087T1를 복사해둔다.

item.loc[item["분류값순번"].isna()]
기관ID 통계표ID 분류ID 분류명 분류영문명 분류값ID 분류값명 분류값영문명 분류값순번
0 101 DT_1YL202001E ITEM 항목 Item code list 13103871087T1 미분양현황 Unsold Housing NaN

다음은 분류1의 조회 결과다. 분류1은 구분을 뜻하며 전국, 서울, 부산, 대구 등 여러 시도 단위 지역 기준들이 존재한다. 전체 선택할 것이므로 별도로 분류값ID(ITM_ID)를 복사하지 않아도 된다.

item.loc[item["분류값순번"]=="1"]
기관ID 통계표ID 분류ID 분류명 분류영문명 분류값ID 분류값명 분류값영문명 분류값순번
1 101 DT_1YL202001E 13101871087A 구분 SiGunGu 13102871087A.0001 총계 Total 1
2 101 DT_1YL202001E 13101871087A 구분 SiGunGu 13102871087A.0002 전국 Whole Country 1
3 101 DT_1YL202001E 13101871087A 구분 SiGunGu 13102871087A.0003 서울 Seoul 1
4 101 DT_1YL202001E 13101871087A 구분 SiGunGu 13102871087A.0004 부산 Busan 1
5 101 DT_1YL202001E 13101871087A 구분 SiGunGu 13102871087A.0005 대구 Daegu 1
6 101 DT_1YL202001E 13101871087A 구분 SiGunGu 13102871087A.0006 인천 Incheon 1
7 101 DT_1YL202001E 13101871087A 구분 SiGunGu 13102871087A.0007 광주 Gwangju 1
8 101 DT_1YL202001E 13101871087A 구분 SiGunGu 13102871087A.0008 대전 Daejeon 1
9 101 DT_1YL202001E 13101871087A 구분 SiGunGu 13102871087A.0009 울산 Ulsan 1
10 101 DT_1YL202001E 13101871087A 구분 SiGunGu 13102871087A.0019 세종 Sejong 1
11 101 DT_1YL202001E 13101871087A 구분 SiGunGu 13102871087A.0010 경기 Gyeonggi 1
12 101 DT_1YL202001E 13101871087A 구분 SiGunGu 13102871087A.0011 강원 Gangwon-do 1
13 101 DT_1YL202001E 13101871087A 구분 SiGunGu 13102871087A.0012 충북 Chungcheongbuk-do 1
14 101 DT_1YL202001E 13101871087A 구분 SiGunGu 13102871087A.0013 충남 Chungcheongnam-do 1
15 101 DT_1YL202001E 13101871087A 구분 SiGunGu 13102871087A.0014 전북 Jeollabuk-do 1
16 101 DT_1YL202001E 13101871087A 구분 SiGunGu 13102871087A.0015 전남 Jeollanam-do 1
17 101 DT_1YL202001E 13101871087A 구분 SiGunGu 13102871087A.0016 경북 Gyeongsangbuk-do 1
18 101 DT_1YL202001E 13101871087A 구분 SiGunGu 13102871087A.0017 경남 Gyeongsangnam-do 1
19 101 DT_1YL202001E 13101871087A 구분 SiGunGu 13102871087A.0018 제주 Jeju 1

다음은 분류2의 조회 결과다. 분류2는 시군구를 뜻하며 종로구, 강남구 등 여러 시군구 단위 지역 기준들이 존재한다. 분류1에서와 마찬가지로 전체 선택하기로 한다. 분류값ID(ITM_ID)를 따로 복사하지 않아도 된다.

item.loc[item["분류값순번"]=="2"]
기관ID 통계표ID 분류ID 분류명 분류영문명 분류값ID 분류값명 분류값영문명 분류값순번
20 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0001 총계 NaN 2
21 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0002 NaN 2
22 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0003 소계 Sub Total 2
23 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0004 종로구 Jongno-gu 2
24 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0005 강남구 NaN 2
25 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0006 중구 NaN 2
26 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0007 강동구 NaN 2
27 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0008 용산구 NaN 2
28 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0009 강북구 Gangbuk-gu 2
29 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0010 성동구 Seongdong-gu 2
30 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0011 강서구 NaN 2
31 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0012 광진구 NaN 2
32 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0013 동대문구 Dongdaemun-gu 2
33 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0014 관악구 Gwanak-gu 2
34 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0015 중랑구 Jungnang-gu 2
35 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0016 성북구 Seongbuk-gu 2
36 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0017 구로구 Guro-gu 2
37 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0018 금천구 Geumcheon-gu 2
38 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0019 노원구 Nowon-gu 2
39 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0020 도봉구 Dobong-gu 2
40 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0021 은평구 Eunpyeong-gu 2
41 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0022 서대문구 Seodaemun-gu 2
42 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0023 동작구 Dongjak-gu 2
43 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0024 마포구 Mapo-gu 2
44 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0025 양천구 Yangcheon-gu 2
45 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0026 서초구 Seocho-gu 2
46 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0027 영등포구 Yeongdeungpo-gu 2
47 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0028 송파구 Songpa-gu 2
48 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0029 서구 Seo-gu 2
49 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0030 동구 NaN 2
50 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0031 금정구 NaN 2
51 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0032 영도구 NaN 2
52 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0033 기장군 NaN 2
53 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0034 남구 Nam-gu 2
54 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0035 부산진구 Busanjin-gu 2
55 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0036 동래구 Dongnae-gu 2
56 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0037 북구 Buk-gu 2
57 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0038 해운대구 Haeundae-gu 2
58 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0039 사상구 NaN 2
59 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0040 사하구 NaN 2
60 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0041 연제구 Yeonje-gu 2
61 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0042 수영구 Suyeong-gu 2
62 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0043 수성구 Suseong-gu 2
63 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0044 달서구 Dalseo-gu 2
64 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0045 달성군 Dalseong-gun 2
65 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0046 남동구 Namdong-gu 2
66 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0047 연수구 Yeonsu-gu 2
67 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0048 미추홀구 Michuhol-gu 2
68 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0049 부평구 Bupyeong-gu 2
69 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0050 계양구 Gyeyang-gu 2
70 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0051 강화군 Ganghwa-gun 2
71 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0052 옹진군 Ongjin-gun 2
72 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0053 광산구 Gwangsan-gu 2
73 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0054 유성구 Yuseong-gu 2
74 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0055 대덕구 Daedeok-gu 2
75 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0056 울주군 Ulju-gun 2
76 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0057 수원시 Suwon-si 2
77 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0058 세종시 NaN 2
78 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0059 가평군 Gapyeong-gun 2
79 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0060 성남시 NaN 2
80 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0061 고양시 NaN 2
81 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0062 의정부시 NaN 2
82 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0063 과천시 NaN 2
83 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0064 안양시 NaN 2
84 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0065 광명시 Gwangmyeong-si 2
85 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0066 부천시 NaN 2
86 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0067 광주시 NaN 2
87 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0068 구리시 Guri-si 2
88 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0069 평택시 NaN 2
89 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0070 동두천시 NaN 2
90 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0071 군포시 NaN 2
91 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0072 김포시 NaN 2
92 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0073 안산시 NaN 2
93 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0074 남양주시 NaN 2
94 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0075 시흥시 NaN 2
95 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0076 오산시 NaN 2
96 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0077 안성시 NaN 2
97 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0078 의왕시 NaN 2
98 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0079 하남시 NaN 2
99 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0080 양주시 NaN 2
100 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0081 양평군 NaN 2
101 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0082 용인시 NaN 2
102 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0083 여주군 Yeoju-gun 2
103 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0084 파주시 NaN 2
104 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0085 이천시 NaN 2
105 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0086 연천군 NaN 2
106 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0087 여주시 NaN 2
107 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0088 화성시 NaN 2
108 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0089 포천시 NaN 2
109 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0090 춘천시 NaN 2
110 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0091 원주시 NaN 2
111 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0092 강릉시 NaN 2
112 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0093 동해시 NaN 2
113 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0094 태백시 NaN 2
114 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0095 속초시 NaN 2
115 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0096 삼척시 NaN 2
116 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0097 홍천군 NaN 2
117 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0098 횡성군 NaN 2
118 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0099 영월군 NaN 2
119 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0100 평창군 NaN 2
120 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0101 정선군 NaN 2
121 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0102 철원군 NaN 2
122 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0103 화천군 NaN 2
123 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0104 양구군 NaN 2
124 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0105 인제군 NaN 2
125 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0106 고성군 NaN 2
126 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0107 양양군 NaN 2
127 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0108 청주시 NaN 2
128 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0109 괴산군 NaN 2
129 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0110 충주시 NaN 2
130 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0111 단양군 Danyang-gun 2
131 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0112 제천시 NaN 2
132 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0113 보은군 NaN 2
133 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0114 청원군 NaN 2
134 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0115 옥천군 NaN 2
135 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0116 영동군 NaN 2
136 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0117 증평군 NaN 2
137 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0118 음성군 NaN 2
138 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0119 진천군 NaN 2
139 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0120 천안시 NaN 2
140 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0121 공주시 NaN 2
141 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0122 보령시 NaN 2
142 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0123 계룡시 NaN 2
143 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0124 아산시 NaN 2
144 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0125 금산군 NaN 2
145 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0126 서산시 NaN 2
146 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0127 논산시 NaN 2
147 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0128 당진시 NaN 2
148 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0129 부여군 NaN 2
149 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0130 연기군 NaN 2
150 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0131 서천군 NaN 2
151 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0132 청양군 NaN 2
152 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0133 홍성군 NaN 2
153 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0134 예산군 NaN 2
154 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0135 태안군 NaN 2
155 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0136 당진군 NaN 2
156 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0137 전주시 Jeonju-si 2
157 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0138 조치원읍 Jochiwon-eup 2
158 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0139 군산시 Gunsan-si 2
159 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0140 익산시 Iksan-si 2
160 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0141 정읍시 Jeongeup-si 2
161 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0142 남원시 Namwon-si 2
162 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0143 김제시 Gimje-si 2
163 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0144 완주군 Wanju-gun 2
164 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0145 진안군 Jinan-gun 2
165 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0146 무주군 Muju-gun 2
166 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0147 장수군 Jangsu-gun 2
167 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0148 임실군 Imsil-gun 2
168 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0149 순창군 Sunchang-gun 2
169 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0150 고창군 Gochang-gun 2
170 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0151 부안군 Buan-gun 2
171 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0152 목포시 Mokpo-si 2
172 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0153 여수시 Yeosu-si 2
173 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0154 순천시 Suncheon-si 2
174 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0155 나주시 Naju-si 2
175 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0156 광양시 Gwangyang-si 2
176 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0157 담양군 Damyang-gun 2
177 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0158 곡성군 Gokseong-gun 2
178 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0159 구례군 Gurye-gun 2
179 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0160 고흥군 Goheung-gun 2
180 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0161 보성군 Boseong-gun 2
181 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0162 화순군 Hwasun-gun 2
182 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0163 장흥군 Jangheung-gun 2
183 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0164 강진군 Gangjin-gun 2
184 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0165 해남군 Haenam-gun 2
185 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0166 영암군 Yeongam-gun 2
186 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0167 무안군 Muan-gun 2
187 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0168 함평군 Hampyeong-gun 2
188 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0169 영광군 Yeonggwang-gun 2
189 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0170 장성군 Jangseong-gun 2
190 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0171 완도군 Wando-gun 2
191 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0172 진도군 Jindo-gun 2
192 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0173 신안군 Sinan-gun 2
193 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0174 포항시 Pohang-si 2
194 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0175 경주시 Gyeongju-si 2
195 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0176 김천시 Gimcheon-si 2
196 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0177 안동시 Andong-si 2
197 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0178 구미시 Gumi-si 2
198 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0179 영주시 Yeongju-si 2
199 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0180 영천시 Yeongcheon-si 2
200 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0181 상주시 Sangju-si 2
201 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0182 문경시 Mungyeong-si 2
202 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0183 경산시 Gyeongsan-si 2
203 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0184 군위군 Gunwi-gun 2
204 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0185 의성군 Uiseong-gun 2
205 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0186 청송군 Cheongsong-gun 2
206 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0187 영양군 Yeongyang-gun 2
207 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0188 영덕군 Yeongdeok-gun 2
208 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0189 청도군 Cheongdo-gun 2
209 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0190 고령군 Goryeong-gun 2
210 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0191 성주군 Seongju-gun 2
211 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0192 칠곡군 Chilgok-gun 2
212 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0193 예천군 Yecheon-gun 2
213 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0194 봉화군 Bonghwa-gun 2
214 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0195 울진군 Uljin-gun 2
215 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0196 울릉군 Ulleung-gun 2
216 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0197 창원시 Changwon-si 2
217 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0198 진주시 Jinju-si 2
218 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0199 마산시 Masan-si 2
219 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0200 통영시 Tongyeong-si 2
220 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0201 사천시 Sacheon-si 2
221 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0202 진해시 Jinhae-si 2
222 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0203 김해시 Gimhae-si 2
223 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0204 밀양시 Miryang-si 2
224 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0205 거제시 Geoje-si 2
225 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0206 양산시 Yangsan-si 2
226 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0207 의령군 Uiryeong-gun 2
227 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0208 함안군 Haman-gun 2
228 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0209 창녕군 Changnyeong-gun 2
229 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0210 남해군 Namhae-gun 2
230 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0211 하동군 Hadong-gun 2
231 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0212 산청군 Sancheong-gun 2
232 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0213 함양군 Hamyang-gun 2
233 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0214 거창군 Geochang-gun 2
234 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0215 합천군 Hapcheon-gun 2
235 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0216 제주시 Jeju-si 2
236 101 DT_1YL202001E 13101871087B 시군구 SiGunGu 13102871087B.0217 서귀포시 Seogwipo-si 2


통계표 조회하기

api.get_data() 메서드의 첫 번째 인자로 ‘통계자료’를 지정한다. 미분양현황_종합 통계표를 조회를 위해 위에서 복사해둔 값들을 순서대로 api.get_data()의 인자로 입력한다. itmId의 값으로 선택 항목을 직접 나열해도 되지만 전체 선택 시 ‘ALL’이라는 값을 입력하면 된다.

df = api.get_data(
    "통계자료",
    orgId="101",
    tblId="DT_1YL202001E",
    objL1="ALL",
    objL2="ALL",
    itmId="ALL",
    prdSe="M",
    startPrdDe="202205",
    endPrdDe="202211",
)
df.head()
기관ID 통계표ID 통계표명 분류명1 분류영문명1 분류값명1 분류값영문명1 분류값ID1 분류명2 분류영문명2 분류값명2 분류값영문명2 분류값ID2 항목ID 항목명 항목영문명 단위명 단위영문명 수록주기 수록시점 수치값
0 101 DT_1YL202001E 미분양주택현황(시도/시/군/구) 구분 SiGunGu 서울 Seoul 13102871087A.0003 시군구 SiGunGu NaN 13102871087B.0002 13103871087T1 미분양현황 Unsold Housing House M 202205 688
1 101 DT_1YL202001E 미분양주택현황(시도/시/군/구) 구분 SiGunGu 서울 Seoul 13102871087A.0003 시군구 SiGunGu NaN 13102871087B.0002 13103871087T1 미분양현황 Unsold Housing House M 202206 719
2 101 DT_1YL202001E 미분양주택현황(시도/시/군/구) 구분 SiGunGu 서울 Seoul 13102871087A.0003 시군구 SiGunGu NaN 13102871087B.0002 13103871087T1 미분양현황 Unsold Housing House M 202207 592
3 101 DT_1YL202001E 미분양주택현황(시도/시/군/구) 구분 SiGunGu 서울 Seoul 13102871087A.0003 시군구 SiGunGu NaN 13102871087B.0002 13103871087T1 미분양현황 Unsold Housing House M 202208 610
4 101 DT_1YL202001E 미분양주택현황(시도/시/군/구) 구분 SiGunGu 서울 Seoul 13102871087A.0003 시군구 SiGunGu NaN 13102871087B.0002 13103871087T1 미분양현황 Unsold Housing House M 202209 719


피벗 테이블 만들기

통계표 조회 결과를 아래와 같이 원하는 형태로 재구조화하여 분석 목적에 맞게 사용하면 된다.

target = df.loc[df['분류값명2']=='계']
target['수록시점'] = pd.to_datetime(target['수록시점'], format="%Y%m")
target['수치값'] = pd.to_numeric(target['수치값'])
pv = target.pivot(index=["수록시점"], columns=["분류값명1","분류값명2"], values="수치값")
newCols = list(map(lambda x: x[0]+"_"+x[1], pv.columns))
pv.columns = newCols
pv = pv.reset_index()
pv['수록시점'] = pd.to_datetime(pv['수록시점'], format="%Y%m")
for col in pv.columns[1:]:
    pv[col] = pd.to_numeric(pv[col])
pv = pv.set_index("수록시점")
pv
서울_계 부산_계 대구_계 인천_계 광주_계 대전_계 울산_계 경기_계 강원_계 충북_계 충남_계 전북_계 전남_계 경북_계 경남_계 제주_계 세종_계
수록시점
2022-05-01 688 1220 6816 426 46 460 641 2449 1242 1088 1386 107 2327 5369 1979 1119 12
2022-06-01 719 1267 6718 418 198 523 627 3319 1303 862 1326 103 2585 4823 2044 1063 12
2022-07-01 592 1503 7523 544 198 509 788 3393 1239 885 1406 178 2534 6517 2238 1227 10
2022-08-01 610 1799 8301 1222 198 668 775 3180 1348 619 1386 157 2503 6693 2042 1213 8
2022-09-01 719 1973 10539 1541 163 1430 1426 5553 1262 1107 2418 621 2627 6520 2401 1299 5
2022-10-01 866 2514 10830 1666 161 1374 1414 5080 2287 1732 2840 1383 2797 6369 4176 1722 6
2022-11-01 865 2574 11700 2471 161 1853 2999 7037 2365 2632 5046 1951 2925 7667 4076 1699 6


시각화

import plotly.express as px

fig = px.line(target, 
              x="수록시점", 
              y="수치값", 
              color='분류값영문명1')
fig


참고

댓글남기기