[부동산 | Phase2] 아파트 현황조사(고양시) - Python pandas 기본 (2부)
이제 지난 시간 가졌던 몇가지 예시 물음에 대해 답을 찾아가보자.
(1) 행신동에 지은지 20년 이내 아파트 단지는 어떤 것이 있을까?
우선 우리의 물음에 대한 정의 부터 파악해 보자.
'지은지 20년 이내'에서 지었다라고 표현하려면 어느 항목이 적합할까?
사용검사일이라는 항목의 정의를 검색해 보았더니, 아래의 간략한 정의를 찾을 수 있었다.
준공일을 의미하며 입주 개시 약 2~5일 전이 일반적으로 사용 검사일이 됩니다
정의로 보아, 사용검사일을 지은 날로 보는 것이 타당하겠다.
이제 그렇다면 우리가 할 일은 오늘날짜로부터 사용검사일까지의 시간차가 20년 이내에 있는 아파트만 계산상 분리해 내면 되겠다.
정확히 오늘 날짜로부터 20년을 세기 위한 알고리즘을 구성하면 좋겠지만, 나중에 단계를 심화하여 글을 보충하도록 하고, 단순히 금년도로부터 사용승인일의 연도를 뺀 숫자로 20년을 가늠하기로 하자.
필자가 작성한 코드를 아래와 같이 제시한다.
# (1) 행신동에 지은지 20년 이내 아파트 단지는 어떤 것이 있을까?
z = apt_Goyang['사용검사일']
apt_Goyang['사용승인연도'] = z.str[0:4]
apt_Goyang['사용승인연도'] = apt_Goyang['사용승인연도'].astype(int)
apt_Goyang['건령'] = 2020 - apt_Goyang['사용승인연도']
zz = apt_Goyang.loc[apt_Goyang['건령'] <=20, :]
zz['행정동'] = zz['지번'].str[0:3]
zzz = zz.loc[zz['행정동'] =="행신동", :]
zzz = zzz.loc[zzz['건물유형'] =="아파트", :]
zzz.to_excel('경로명\\df_APTstat_Goyang.xlsx', sheet_name = "sheet1")
필자는 데이터프레임의 이름을 정의할 때 대충 짓는 경향이 있다. 상기 코드에서는 'z', 'zz' 라는 데이터 프레임이름으로 대강 적어 넣었는데, 원하는 프로그램을 만들고자 데이터프레임을 수도 없이 만들어 대던 때의 습관 때문이다.
일반적으로 설명을 위해 데이터프레임명을 정의할 땐 'df'라는 값을 주로 사용한다. 하지만, 필자에겐 2타를 쳐야하는 것도 불편하기 그지 없었다. 데이터프레임수가 증가하면 z1, z2, z3와 같이 naming함으로서 그러한 불편점을 최대한 줄여서 작업하였는데, 코드를 타인에게 개방할 의사가 있다면 사실 좋지 못한 습관일 수 있다. 하지만, 나 혼자 볼 거라면 내가 일단 편해야 한다. 수도 없이 데이터프레임을 만드는데, 이름을 거창하게 지을 겨를이 없다. 이 점 독자분들께 너그러이 양해 부탁 드린다.
각설하고 코드를 보면서, 항목 번호를 두어 상세를 열거하겠다.
1) z = apt_Goyang['사용검사일']
Pandas data frame에서, 우리가 열이라고 부르는 특정 series를 콕 찝어 선택하기 위해서는 해당 열의 이름을 [] 괄호안에 적시해 주면 된다.
pandas data frame에 Series 신규 추가, 문자열 슬라이싱하기
2) apt_Goyang['사용승인연도'] = z.str[0:4]
여기서는 두 가지 포인트가 있다.
첫째, 존재하는 data frame에 신규 series를 추가하고 싶다면, 해당 data frame에 해당 series의 이름을 지어 값을 넣어주면 된다.
원래 apt_Goyang이라는 데이터프레임에는 '사용승인연도'라는 series는 없다. 다만, 사용검사일상의 연도값만 추출해 별도의 series로 나열하기 위해 '사용승인연도' series를 신규 추가한 것이다.
둘째, 사용승인연도의 데이터는 String(문자열) 데이터로, 인식되어 진다. 파이썬의 문자열 슬라이싱 기법으로 str 메소드를 통해 추출하고자 하는 '첫문자열번호(0)'부터 '마지막 문자열번호+1'을 해주면 해당 문자만큼이 슬라이싱 된다.
예를 들어, '1998-01-01'이라는 데이터가 있다고 하자.
이 데이터가 String이라고 하면, 문자열은 파이썬에서 다음과 같은 순번을 갖는다.
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
1 9 9 8 - 0 1 - 0 1
따라서, str[0:4]라는 메소드는 '1998'이라는 값으로 문자를 슬라이싱 해준다.
pandas data frame의 자료형 변환하기(str to int)
3) apt_Goyang['사용승인연도'] = apt_Goyang['사용승인연도'].astype(int)
사용승인연도로부터 금년도까지의 연도 차를 계산하기 위해 뺄셈을 적용할 계획인데, 앞서 슬라이싱을 통해 알 수 있듯이 데이터는 문자열이다.
문자열에 사칙연산을 적용하려하면, 파이썬은 오류가 있음을 알린다. 따라서, 추출한 '사용승인연도' 값을 문자열에서 숫자로 변환키 위해 astype이라는 메소드를 활용한 것이다. astype은 str to int / int to str과 같이 자료형 변환을 가능케 해준다.
이외에도 pandas에서 str to int 자료형 변환을 위해 다음과 같이 pandas에서 제공하는 to_numeric함수를 사용하는 것도 유효하다.
apt_Goyang['사용승인연도'] = pd.to_numeric(apt_Goyang['사용승인연도'])
pandas data frame의 사칙연산
4) apt_Goyang['건령'] = 2020 - apt_Goyang['사용승인연도']
필자가 파이썬을 사랑하는 이유 중의 하나가 이 코드에 들어 있다. '건령'이라는 건물 나이 series를 새롭게 만들고 각 아파트별 건령을 계산하고자 한다. 그런데, pandas에서는 단순히 해당 기준 숫자로부터 series를 뺄셈하는 위와 같은 형태의 계산법도 아무 문제 없이 값을 돌려 준다.
2020이라는 값을 '사용승인연도' series의 각 데이터로부터 빼서 '건령'이라는 series로 새롭게 만들어 apt_Goyang이라는 data frame에 갖다 붙여주는 것이다... 정말 간단하다... 감탄이 아니 나올 수 없다. 엑셀 같으면 함수를 걸고 '채우기'라는 동작을 해야 된다. 손목 아프게... 그런데, 파이썬에서는 위와 같은 코드로 일괄 처리가 가능하다. 만약 데이터라인이 10000 줄이라고 가정해 보자... 상상만 해도 손목터널증후군이 오는 느낌이다. (채우기 단축키[더블클릭]가 있지만, 연산속도에서도 엑셀은 파이썬에 대적할 수 없다.) 이러한 편리성을 염두에 두고, 업무상 통계가 필요하실 때엔 파이썬을 적극 활용하시길 권장 드린다.
pandas data frame loc()함수 필터링
5) zz = apt_Goyang.loc[apt_Goyang['건령'] <=20, :]
pandas에서 loc함수는 필요한 데이터만 보고자 할 때, 사용한다. 엑셀에서의 필터추가와 같은 역할이다.
데이터프레임명에 loc메소드를 호출하고 apt_Goyang['건령']이라는 series에서 그 값이 20이하에 해당하는 모든 행을 추출해 달라는 의미가 된다.
즉, df.loc[조건식, :]는 조건에 맞는 모든 행 값을 반환해 주게 된다.
loc함수는 꾸준히 쓰일 것이기 때문에, 나올 때마다 부연 설명 및 기타 이용방법 등을 추가하도록 하겠다.
6) zz['행정동'] = zz['지번'].str[0:3]
zzz = zz.loc[zz['행정동'] =="행신동", :]
zzz = zzz.loc[zzz['건물유형'] =="아파트", :]
이 코드에서는 앞서 5)번, 6)번 항목에서 반영한 것과 같은 논리의 코드가 반복되었음을 알 수 있다. 원하는 조건이었던, 1) 건령이 20년 이내일 것 2) 행신동에 위치할 것 3) 건물유형은 아파트일것 이라는 조건을 5, 6번 코드를 통해 순차적으로 data frame에 적용한 것이다. 원하는 조건을 통해 narrow-down해 나가는 과정은 우리가 원하는 값만을 얻기 위해 이와 같이, 순차적으로 나열해 나가는 것이 가독성에서 꽤나 좋은 면이 있다. 코드를 작성하여 결과를 볼 때, 오류가 발견되는 경우가 종종 있는데, 순차 나열된 형태를 갖추면 나중에 오류 부분을 찾아 수정하기가 쉽다.
이제, 최종 결과 data frame은 zzz라는 명칭을 갖게 되었다.
pd.to_excel()
8) zzz.to_excel('C:\\Users\\LG\\Desktop\\example\\df_APTstat_Goyang.xlsx', sheet_name = "sheet1")
마지막으로 이 코드는 검색이 완료된 값을 excel파일로 저장할 때 사용하게 된다. 해당 데이터프레임에 to_excel함수를 호출하고, 저장경로를 지정하는 방식이다. 이 코드가 돌게 되면 지정한 경로에서 지정한 파일명으로 엑셀파일이 생성된 것을 확인할 수 있다.
다시 한번 말씀 드리지만, 대부분의 유저들에겐 엑셀의 GUI가 훨씬 익숙하다. 따라서, 필자는 보통의 유저분들의 편리한 가독성을 위해 최종 결과물은 엑셀 파일로 export하는 작업을 자주 할 것이다.
여기까지, 첫번째 질문인 '행신동에 지은지 20년 이내인 아파트단지'에 대한 1차 자료 추출을 완료하였다.
그 결과물인 엑셀 파일의 결과물은 아래와 같다.
P열에 사용승인연도, Q열에 건령 항목이 신설되었고, Q열 건령 값 기준으로 20 이하이면서, H열 건물유형은 아파트 그리고 행정동은 행신동인 값들만 선별 저장된 것을 확인하실 수 있다.
이번 질문을 통해 우리는 아래와 같은 항목들을 새롭게 배웠다.
a. pandas data frame에 Series 신규로 추가하기
b. Python에서 문자열 슬라이싱하기
c. pandas data frame의 자료형 변환하기(str to int)
d. pandas data frame의 series에 사칙연산 적용하기
e. pandas data frame에서 loc함수를 이용하여 원하는 값 필터링하기
f. pandas to_excel함수를 이용하여 엑셀파일로 export하기
이제 2번 질문을 통해 또 새로운 데이터분석을 위한 코드들을 익혀보자.
(3부에서 계속...)
'파이썬(Python) > 고양시 아파트 현황 조사' 카테고리의 다른 글
[부동산 | Phase2] 아파트 현황조사(고양시) - Python pandas 기본 (4부) (0) | 2020.06.09 |
---|---|
[부동산 | Phase2] 아파트 현황조사(고양시) - Python pandas 기본 (3부) (0) | 2020.06.09 |
[부동산 | Phase2] 아파트 현황조사(고양시) - Python coding (1부) (0) | 2020.06.05 |
[부동산 | Phase1] 아파트 현황조사(고양시) - Data Mining & Refining (2부) (0) | 2020.06.04 |
[부동산 | Phase1] 아파트 현황조사(고양시) - Data Mining & Refining (1부) (0) | 2020.06.03 |