본문 바로가기

데이터분석/pandas

공공데이터 '아파트 분양가격' 동향 파악하기 - 1단계

이번시간에는 공공데이터에 있는 아파트 분양가격 데이터셋으로 분석을 해보는 

포스팅을 해보겠습니다. 

 

인프런 

'공공데이터로 파이썬 데이터 분석 시작하기' 강의를 따라하면서 정리하는 영상입니다. 

강의를 찍은 시점이 2018년 11월이었는데, 2020년 3월 초, 이 파트 강의가 리뉴얼되었습니다. 강의가 최신 데이터로 업데이트되어서 다시 진행하였고, 좀 더 디테일한 방식으로 바뀌었습니다. 참고해주세요 :)

 

먼저, 데이터셋은 

 

https://www.data.go.kr/dataset/3035522/fileData.do

 

공공데이터포털

국가에서 보유하고 있는 다양한 데이터를『공공데이터의 제공 및 이용 활성화에 관한 법률(제11956호)』에 따라 개방하여 국민들이 보다 쉽고 용이하게 공유•활용할 수 있도록 공공데이터(Dataset)와 Open API로 제공하는 사이트입니다.

www.data.go.kr

위 링크에서 '주택도시보증공사_전국 평균 분양가격(2019년 12월)' 라는 이름의 Csv 파일을 받아주시면 됩니다. 

'전국 평균 분양가격(2013년 9월부터 2015년 8월까지).csv' 파일도 받아주세요. 이 2개의 파일을 같은 양식으로 맞춰서 합쳐주는 작업까지 진행합니다. .필요한 csv 파일은 2개입니다. 

 

필요한 라이브러리들을 import 해주시구요.

 

%pwd 

%ls 디렉토리명 

등은 터미널 등에서 사용하는 명령어인데 주피터에서도 사용가능합니다.

매직명령어라고 하는데요.

pwd 는 현재의 위치정보를 알려주며 ls ./ 는 현재 위치(=디렉토리)에 있는 파일들을 보여줍니다. 

 

이제, 데이터를 불러 보겠습니다.

 

 

여기서 잠시 encoding 에 대해 언급하겠습니다.

공공포털에 올라오는 데이터들은 encoding이 'euc-kr'또는 'cp949'인 경우가 많습니다.
보통 인코딩 디폴트값은 'utf-8'입니다. 만약에 안된다면, euc-kr 또는 cp949 로 인코딩 옵션을 다르게 줘서 해보면 됩니다.
위 3가지 인코딩 옵션들은 기본적으로 알고 계시길 권하며, 만약에 위 3가지로 인코딩이 안된다면 따로 열어보려고 하는 파일의 인코딩을 알아보시고 그거에 맞춰서 read_csv 에서 encoding 옵션을 주면 됩니다.
보통은 위 3가지로 다 되긴 합니다. 아직 경험이 부족한 저이지만 이외의 인코딩은 본 적이 없습니다.

 

가져온 데이터의 칼럼은 5가지네요.

 

 

각 칼럼에 Null값은 분양가격 을 제외하고는 없네요. 데이터 타입도 object 는 문자입니다. string 이랑 같다 보시면 되는데 pandas 에서는 문자타입의 데이터 타입은 object 로 나옵니다. isnull().sum() 은 제가 Null 값 체크할때 기계처럼 쓰는 코드인데요. True 는 1과 같고, false는 0과 같습니다. isnull() 메서드를 쓰면 null이냐 아니냐에 따라 true, false 값이 나타나고 이를 sum해주면 true값들만 칼럼을 기준으로 다 더하게 됩니다. 277개의 true값이 있음을 위 메서드를 통해 확인할 수 있습니다.

 

한가지 주의할 것은 값들 중에 빈칸인 값들이 있을 수 있습니다. 이는 Null 로 체크되지 않습니다. 따로 불린인덱싱이나 유니크값으로 공백으로 들어간 값이 있는지 체크해주시는 걸 권유 하겠습니다 :) 

 

# 데이터 타입 변환

 

 

문자 -> 숫자타입으로 변환시 보통 astype 이나 to_numeric 메서드를 사용합니다. 위에서 에러가 난 이유는 공백 문자를 string으로 인식하기 때문에 이를 숫자타입으로 바꿀 수 없다는 뜻에서 valueerror가 발생했습니다.

 

to_numeric을 사용할 때 errors 의 옵션을 사용하면 coerce의 경우는 무시하고 공백값도 숫자타입으로 바꿔줍니다. 헌데 위에서는 float으로 됐습니다. nan값이 float타입이기 때문에 전체가 float형태로 바뀐 겁니다.

 

분양가격 칼럼을 따로 인스턴스화 해줬습니다. 

 

공공데이터포털에 올라와 있는 2013년부터의 데이터(='전국 평균 분양가격(2013년 9월부터 2015년 8월까지).csv' )는 평당분양가격 기준으로 되어 있습니다. 분양가격을 평당기준으로 보기위해 3.3을 곱해서 "평당분양가격" 컬럼을 만들어 추가해 줍니다. 즉, df_first 데이터의 분양가격은 평당 분양가격입니다. df_last는 제곱미터당 분양가격입니다. 단위가 다르므로 이를 통일시켜주기 위해 3.3을 곱하였습니다. 

 

이제, 만들어진 데이터프레임 정보를 다시 보겠습니다. 

 

 

결측치가 갑자기 늘어났죠? 아마도 분양가격(m^2)에서 공백값도 결측치가 아닌 값이 있는 것으로 인식했을 것입니다. object 타입이기에. 반면에, 숫자타입에서는 공백도 결측치로 인식했을 것이입니다.그래서 공백이 nan으로 집계되서 늘어난 것이다. 물론 정확히 검증한 것은 아니지만 공백이 어떤 타입에서는 Null 되고, 안되고 또한 빈 칸 공백이 널이 아닌데 거기다 숫자를 곱하면 null 되는 그러한 변화로 null 값들이 늘어나고 했을 것으로 추측합니다. 

 

describe 메서드를 통해서 숫자 칼럼의 기본적인 통계 수치들을 확인할 수 있습니다. mean이 10685 인데 단위가 천원입니다. 즉, 평당 천만원이네요. 물론 지역마다 편차가 있고 세부적으로 나눠서 볼 필요가 있습니다. 아직까지는 전체적으로 보는 단계입니다. 저기서 기억해줘야할 것은 describe는 숫자 칼럼만 자동으로 요약해서 보여주는 include=[np.object]를 주면 문자 칼럼인 애들만 그 특성에 맞게 보여줍니다.

 

Unique라고 하는 것은 그 칼럼에 들어간 값의 종류들입니다. 

top 은 그 중에서도 제일 많은 빈도수를 가진 값을 보여주고 그 top의 빈도수가 freq로 표시됩니다. 헌데, 지역명의 경우는 모든 지역이 한 군데만 빼고 255로 나와서 실행할때마다 다르게 나옵니다. 

 

만약, 데이터프레임의 object 타입의 컬럼만 선택해서 describe 메서드를 사용하면  include=[np.object] 옵션을 주지 않아도 문자 특성에 맞는 요약을 해서 보여줍니다. 

규모구분을 전용면적 컬럼으로 변경 후 컬럼 제거

규모구분 컬럼은 전용면적에 대한 내용이 있습니다. 전용면적이라는 문구가 공통적으로 들어가고 규모구분보다는 전용면적이 좀 더 직관적이기 때문에 전용면적이라는 컬럼을 새로 만들어주고 기존 규모구분의 값에서 전용면적, 초과, 이하 등의 문구를 빼고 간결하게 만들어 봅니다.

 

 

 

str.replace 를 써야 일부 어절만 찾아서 원하는 글자로 바꿀 수 있습니다.
그냥 시리즈.replace() 하면 적용이 안됩니다. 전용면적 글자를 제거 못합니다.
그냥 replace는 완전히 일치해야 바뀌기 떄문입니다.

 

자, 이제 불필요한 컬럼들을 제거 해보겠습니다. 

 

memory usage 가 줄어든 것을 확인할 수 있습니다.

groupby 로 데이터 집계

현재까지 작업한 데이터프레임을 보겠습니다.

 

이제, groupb 로 집계를 해보겠습니다.

 

groupby의 첫번째 위치인자는 by 부분인데요. In[31]을 보면 "전용면적"을 인덱스로 하고 평당분양가격을 평균 집계하겠다는 코드입니다. 그 다음 groupby는 by 부분에 2가지 컬럼이 들어갔습니다. 그러면 지역명과 전용면적이라는 결합인덱스로 집계가 되는 것을 볼 수 있습니다. 

 

순서를 조금 바꿔서 groupby 하였습니다. 그리고 unstack 메서드를 추가했는데요. unstack을 하면 "지역명"인덱스가 컬럼으로 들어가게 됩니다. 위 결과를 비교하면서 보시면 unstack이 어떤 변화를 주는지 이해가  되실겁니다. 그 다음에 round 메서드까지 붙여주면 위 소수점 자리들이 첫 째자리에서 반올림 시킬 수 있습니다. (따로 캡쳐하지는 않고 깃허브 코드에 나와 있으니 그걸 참고해주세요) 

 

이번에는 연도별 지역별로 분양가의 평균을 보았습니다. 

pivot_table 로 데이터 집계

결과물을 비교해보겠습니다. pivot_table은 좀 더 명시적으로 인자를 준다는 것과 결과가 데이터프레임으로 나온다는 점이 다릅니다. groupby 는 시리즈 형태로 반환해주고, pivot_table은 데이터프레임 형태로 결과를 반환해줍니다. 

 

사용법은 유사합니다. 코드로 비교해서 보시면 될거라 생각해서 pivot_table 인자 넣는 설명은 굳이 안하겠습니다. 리턴해주는 타입이 다르니 각 타입에 맞게끔 쓸 수 있는 메서드가 다릅니다. 피벗테이블의 결과물은 데이터프레임으로 loc 메서드로 인덱스로 조회해서 원하는 결과만 볼 수 있게 할 수도 있었습니다. 

 

 

-----------------------------------------------

메서드 쓰는 법 조회하기

메서드를 모를때는 물음표를 붙여서 입력해주시면 공식 문서에서 사용법을 보여줍니다.  좀전에 했던 pivot_table을 예로 들겠습니다. pre_sale이라고 나온 변수명은 신경쓰지 마세요. 

 

> 데이터프레임이름.pivot_table? 

이런 식으로 검색하면 됩니다. 

 

이런식으로 예제까지 해서 길게 나오는데요. 너무 길어서 위 부분만 캡쳐했습니다. 집계함수의 default는 평균으로 

되어 있습니다. 잠시 pivot_table 공식 문서에 나온 예제를 보고 가겠습니다. 

 

위와 같은 데이터프레임이 있습니다. 코드 사이에 ... 은 신경 안써도 됩니다. 공식문서에 있는 걸 그대로 복붙했는데 주석인지 별 영향이 없어서 그대로 뒀습니다. 

 

pd.pivot_table() 하고 데이터프레임 인스턴스부터 매개변수로 넣어주고 있는데요. 그냥 데이터프레임 닷(.) 피벗테이블해서 사용하는게 더 편한 거 같네요. 명시적으로 value, index 등 위치인자의 이름을 맞춰서 넣어줘도 되는데 그렇지 않고 순서대로 넣으면 기존에 위치인자 순서대로 매개변수가 적용됩니다. 집계함수는 바꿀수 있습니다. 

 

 

집계함수는 값들마다 다르게 적용할 수도 있습니다. 피벗 테이블은 이정도만 살펴 보겠습니다. 

 

이것으로

공공데이터셋을 이용한 아파트 분양가 분석 1단계는 여기서 마치겠습니다. 

다음 시간에는 이를 가지고 시각화를 한 번 해보겠습니다 :) 

 

아래 깃허브에서 '리뉴얼공공데이터_아파트 분양가_리뉴얼_part1' 파일을 다운받아서 실습해보시면 됩니다 :) 

 

https://github.com/JangDaehyuk/basic_data_analysis_tip/blob/master/%EA%B3%B5%EA%B3%B5%EB%8D%B0%EC%9D%B4%ED%84%B0_%EC%95%84%ED%8C%8C%ED%8A%B8%20%EB%B6%84%EC%96%91%EA%B0%80_%EB%A6%AC%EB%89%B4%EC%96%BC_part1.ipynb

 

--------참고 출처------------------

 

https://github.com/corazzon/open-data-analysis-basic