지역 빅데이터 알아보기

로보리포트 서비스에서 지역이름으로 되어있는 아이콘을 누르면 지역 부동산거래, 인구, 통계, 경매 등의 지역 빅데이터를 확인 할 수 있어요. (은평구 아이콘을 짙게 하거나 손 아이콘이나 화살표 등으로 강조 부탁드립니다)

지역별 인구 구성

인구 세부 탭으로 들어가면 지역별 인구 구성 및 지역별 전입 TOP5, 지역별 전출 지역 TOP 5, 인구 추세, 전입 추세 등을 확인할 수 있어요. 기간 슬라이드를 옮기면 해당 기간의 데이터만 확인 할 수 있어요.

인구 데이터는 2011년 데이터부터 있어요. 통계청에서 분기마다 올려주는 데이터를 사용하고 있습니다.

지역정보_미분양

검색 필터에서 통계를 누를경우 조사 기간에 따라 지역별 신규 분양과 미분양, 공사후 미분양 정보를 확인할 수 있어요. ( 왼쪽 아래의 지역 정보 아이콘 강조 부탁드립니다)

지하철 평균 승차수 정보

지하철 평균승차수, 평균하차수, 승차변동률, 하차변동률 정보를 지도에서 바로 확인할 수 있습니다. 지하철 조건 검색으로 유동 인구가 증가하는 도시 등의 세부 검색을 할 수 있습니다.

지역별 학군 정보

지도에서 학교 아이콘을 클릭하면 학구군이 색으로 표시가 됩니다. 특목고 진학률 등의 진학정보, 학생수, 전입/전출 비율, 교육비, 방과 후 학교 등 학교 세부 정보를 확인 할 수 있습니다.

자주묻는 질문

Q. 데이터는 어디서 가져오나요?

인구는 통계청, 건축물 거래 현황/신규분양/미분양 데이터는 한국 감정원, 학교 정보는 학교알리미 등 데이터 종류에 따라 다양합니다.

Q. 데이터 업데이트 주기는 어떻게 되나요?

데이터의 출처가 다양한 만큼 데이터 업데이트 주기는 그 데이터를 제공해주는 기관의 정책에 따라갑니다. 인구 정보는 분기별로 업데이트 되며 학교 정보와 미분양 정보도 매 달마다 업데이트 됩니다. 지역 세부 정보에서 출처 옆의 ? 아이콘을 누르면 데이터 출처 및 업데이트 주기 등의 세부사항을 확인 할 수 있습니다. 혹시 데이터가 너무 오래되었다고 생각되면 support@connectdot.co.kr 로 업데이트 요청 부탁드립니다.

정말로 이번 정부의 폐업률이 역대 최악일까?


최근 자영업 폐업률이 거의 90%로 역대 최악이다 라는 뉴스를 자주 접할 수 있습니다. 자영업 폐업률이 90%라는 단어를 들으면 많은 사람들이 10개의 상점에서 9개가 망했다고 생각 하게 됩니다. 하지만 언론에서 이야기하는 폐업률은 실제 폐업률이 아닌 신규 대비 폐업률에 가깝습니다. 새로 10개의 상점이 문을 열고 같은 해 8개의 상점이 문을 닫으면 신규 대비 폐업률이 80%이 됩니다. 일부 언론에서 이야기하는 폐업률 87%는 그렇게 만들어졌습니다.

KBS뉴스 에서 개인 사업자의 역대 신규 대비 폐업 비율을 분석해 놓은 그래프를 보면 2017년 신규 대비 폐업 비율은 72%으로 오히려 지난 10년 동안의 평균 79%보다 적은 것을 확인 할 수 있습니다. 심지어 2012년도에서의 신규대비 폐업률 87%보다 15%나 낮은 수치입니다.

그렇다면 실제 폐업률은 어떻게 계산하는 것일까요? 한 해 얼마나 많은 자영업자가 폐업하는지 알고 싶다면, 해당 연도의 폐업자 수를 ‘전년도의 개인사업자 총계’와 비교하면 됩니다. 이 그래프 역시 KBS 뉴스에서 가져왔습니다. 이렇게 계산된 2017년도 폐업률은 13.8로 오히려 작년보다는 0.4 프로 낮고 2008년의 17.5%보다는 3.7%나 낮습니다. 2008년 이후로 오히려 폐업률이 점차 낮아지고 있는 추세를 보이는 것을 확인할 수 있습니다.


위 그래프의 폐업률은 자영업자 전체 폐업률의 추이를 확인할 수 있다는 장점이 있습니다. 그렇지만 개별적인 자영업자의 폐업률 또는 생존율은 어떻게 계산할 수 있을까요. 이런 목적에 어울리는 또다른 지표가 있습니다. 자영업자 개별 ‘기업 생존율’입니다. 생존율이란 신생기업(1년~5년)중 기준 연도까지 생존해 있는 기업의 비율을 의미합니다. 창업후 살아남는 기업이 얼마나 되는지 확인할 수 있습니다.

기업 생멸 통계 데이터로 확인하는 자영업자 생존율

통계청에서는 기업생멸통계 데이터를 1년마다 작성하여 배표합니다. (자료 링크) 가장 최근 데이터인 2017년 기준 기업생멸통계 데이터를 확인해보겠습니다. 참고로 KOSIS 국가 통계 포털에서는 데이터를 직접 엑셀 이나 기타 파일로 다운로드 받을 수 있습니다. (자료실 링크)

2017년도 기준 전체 개인사업자(자영업자)자의 수는 542만명입니다. 2017년도에 91만개의 신생기업이 생기고 62만개의 신생기업이 소멸했습니다. 그 중 90%이상이 개인 사업자입니다.

사업분류별 신생기업 생존률

사업분류별 신생기업 생존률입니다. 자영업자가 많은 숙박 및 음식점업의 경우 1년 생존율이 61%밖에 되지 않습니다 ㅠㅠ 10개의 음식점중에 4개 음식점이 1년 안에 망한다는 것인데 식당을 내기 위한 창업 비용을 생각하면 안타까운 현실입니다. 그러고보니 백종원의 골목식당 프로그램에서 백종원이 왠만하면 창업하지 마라고 하는게 이해가 되네요. 정말로 준비를 잘해서 상권도 분석을 하고 메뉴도 구성을 하고 음식맛도 좋아야 5년 생존율의 18%에 들어갈 수 있는 것이겠죠.

결론을 내리면 실질적인 폐업률은 일부 언론에서 강조하는 것처럼 이번 정권에서 역대 최악이 아니다. 오히려 평균 이상의 수치를 보여주고 있다. 그렇지만 대부분의 자영업자들이 있는 숙박 및 음식점업의 생존율은 너무나 낮습니다. 정말 창업을 하겠다고 결심하면 제대로된 분석 서비스가 필요합니다.

로보리포트에서는 골목식당을 위한 상권분석 서비스를 준비하고 있습니다. 로보리포트의 상권분석 서비스를 받고 싶으신 분은 로보리포트 사이트(https://land.roboreport.co.kr)에서 회원 가입시 서비스 업데이트 알람을 체크해 주시거나 아니면 아래 메일링 리스트 가입 폼으로 이메일 구독을 신청해주세요!

상권분석 서비스 이메일 구독 바로가기

글에서 참고했던 링크들

http://kostat.go.kr/portal/korea/kor_nw/1/9/6/index.board

http://news.kbs.co.kr/news/view.do?ncd=4029966&ref=A

doc2vec 훈련 파라미터 설명

Word2vec이 단어를 vector로 변경하는 word embedding 방식이라면 doc2vec은 문서를 vector로 변경하는 document embedding 방식입니다. Word2vec 방식을 문서에 대해서 확장하였기 때문에 기존의 word2vec의 장점을 그대로 가지며 훈련 방식도 word2vec의 cbow와 skip-gram과 유사한 distributed memory(dm)과 distributed bag of words(dbow)을 사용합니다.

주변의 단어들로 가운데 있는 단어를 유추하는 CBOW, 가운데 있는 단어로 주변 단어들을 유추하는 skip-gram

doc2vec 알고리즘 소개

논문 연결

Doc2vec에서는 paragraph id(document id)를 하나의 단어(paragraph token)처럼 사용해서 문서를 훈련 데이터로 사용합니다. paragraph id, paragraph vector, paragraph token 등 다양한 이름으로 불리지만 의미는 동일합니다.  

PV-DM 방식은 이런 paragraph vector 와 앞의 단어들을 사용해서 다음에 나오는 단어를 유추합니다.  window라는 정해진 사이즈의 단어들을 문맥정보(context)로 사용하며 맨 앞에서부터 한 단어씩 옆으로 이동하면서 훈련 데이터로 사용합니다.

같은 패러그래프에서 생성된 훈련 데이터에서는 하나의 패러그래프 벡터로 공유되기 때문에 패러그래프 벡터는 훈련시 문서의 주제를 잡아주는 memory 같은 역할을 하고 있습니다. 그래서 이 알고리즘의 이름 자체가 분산화된 메모리를 가진 패러그래프 벡터(paragraph vector with distributed memory) 로 지어졌습니다.

PV-DBOW 방식은 위 방식에서 나오는 context 단어들을 사용하지 않고 paragraph id 만 가지고 이 패러그래프에서 나오는 단어를 랜덤하게 예측하는 방식을 사용합니다.  input은 패러그래프 벡터이고 output은 패러그래프에서 random하게 뽑인 단어들입니다.

 

doc2vec 훈련시 주요 파라미터

class gensim.models.doc2vec.Doc2Vec(documents=None,

 corpus_file=Nonedm_mean=Nonedm=1dbow_words=0,

 dm_concat=0dm_tag_count=1docvecs=None

docvecs_mapfile=Nonecomment=None,

 trim_rule=Nonecallbacks=()**kwargs)

document는 doc2vec 모델을 훈련시키기 위한 말뭉치(corpus) 입니다. taggeddocument 리스트를 생성해서 입력하면 됩니다. taggedDocument는 문서 별로 문서 tag, 문서 안의 단어들의 리스트로 구성됩니다.

dm은 doc2vec 훈련 알고리즘입니다. dm=1으로 설정하면 distributed memory(PV-DM)이 사용되고 그 외는 distributed bag of words( PV-DBOW) 알고리즘이 사용됩니다.  Distributed Representations of Sentences and Documents 페이퍼에서는 PV-DM 방식만 사용해도 대부분의 작업에 좋은 결과를 보였으나 PV-DBOW와 함께 사용하는 것을 추천한다고 합니다.

 


vector_size 는 임베딩 벡터의 크기입니다. 벡터 사이즈가 클수록 생성된 모델의 성능이 정교해지나 훈련 시간 및 메모리의 크기가 사이즈가 커진다는 단점이 있습니다. Glove 논문에 따르면 vector size가 커질수록 모델 성능이 좋아지는 것을 확인할 수 있습니다. vector 사이즈가 100까지 증가할 경우 가장 극적인 성능 향상을 보이고 그 이상의 사이즈일 경우 정확도 그래프가 완만하게 증가하는 것을 확인 할 수 있습니다.


alpha 는 learning rate 입니다.

window 는 훈련시 앞 뒤로 고려하는 단어의 개수입니다.  “a little, (cat), sit, on”의 windows 는 2 입니다.  window 사이즈가 커지면 훈련 결과로 나오는 word vectors의 성능이 높아지지만 대신 훈련 시간이 오래 걸린다는 단점이 있습니다. 보통 5에서 10 사이의 값이면 적당합니다.

min count 는 데이터에서 등장하는 단어의 최소빈도수입니다.  Word2Vec/Doc2vec 은 자주 등장하지 않은 단어에 대해서는 제대로 학습이 이뤄지지 않습니다. 또한 min_count 가 작으면 모델에 지나치게 많은 단어가 포함되어 모델의 크기가매우 커집니다.   10에서 100 사이의 값이면 적당할 것 같습니다.

negative 는 negative samples 의 개수입니다. 이 역시 기본값 쓰셔도 됩니다. 클수록 학습속도가 느려집니다. 하지만 지나치게 작으면 학습이 제대로 이뤄지지 않습니다.

그리고….

doc2vec 알고리즘은 일반적인 document embedding 방식으로 훌륭한 성능을 보여줍니다. 하지만 doc2vec 인코딩을 사용하기 위해서는 다량의 말뭉치를 준비하고 형태소 분석기를 사용하여 띄어쓰기를 하고 gensim 등 doc2vec 툴으로 훈련 시키는 등의 다량의 준비 작업이 필요합니다.

로보리포트 기계학습 서비스에서는 이런 준비 과정 없이 간단하게 클릭만으로 기계학습에 사용할 문서를 doc2vec 인코딩으로 변환하거나, 실험에 사용되는 단어 속성들을 word2vec 인코딩으로 변환하도록 준비 하고 있습니다.

저희 서비스에 관심있으신 분들은 로보리포트 사이트에 회원가입하고
(선택) 서비스 업데이트 정보 알람 수신 동의를 클릭하시면 해당 서비스가 업데이트 될 경우 이메일 알람을 받아볼 수 있습니다 : )

그리고 위키 문서 및 경제 뉴스에서 에서 훈련된 doc2vec 모델은 roboreport 오프소스로 이미 등록되어 있으니 이곳도 참조 부탁드립니다.

참고 문서들

https://radimrehurek.com/gensim/models/doc2vec.html

https://lovit.github.io/nlp/representation/2018/03/26/word_doc_embedding/

https://ronxin.github.io/wevi/

https://programmers.co.kr/learn/courses/21/lessons/1698

scikit-learn을 사용하여 부동산 가격 예측하기 – 4) linear regression 사용법

scikit-learn을 사용하여 부동산 가격 예측하기 실험 시리즈 네번째 포스팅입니다.이제 본격적인 실험에 들어갑니다. 

기계학습을 할 경우 실험 과제의 특성(분류화, 클러스터링 등)와 데이터의 속성 및 복잡도, 사이즈에 따라 적합한 학습방법을 선택해야 합니다. 이 실험에서는 데이터 개수와 속성 개수가 적으면서 실제 예측값이 나와야 하므로 싸이킷런에서 제공하는 가장 간단한 알고리즘인 선형 회귀(linear regression) 알고리즘을 사용해 보겠습니다. 나중에 개별 매물 평가 실험에서는 부동산 실거래가 데이터를 사용하여 신경망을 사용한 더 복잡한 기계학습을 사용해보려고 합니다.

이전 포스팅 내용 요약

이전 포스팅에서 속성 소개, 데이터 분석에 대해서 완료했습니다. 그 중 데이터를 읽어와서 pandas dataframe으로 저장한 이후에 이어서 실험을 하겠습니다.

dropna 함수로 속성에 빈 값이 있는 데이터는 실험에서 제거하였습니다.

실험 데이터는 2017년도 이전의 데이터는 훈련 데이터 셋으로, 2017년 이상의 데이터는 테스터 데이터셋으로 구성을 했습니다. 일반적인 fold validation으로 실험데이터를 구성하지 않은 이유는 예측 실험에서는 과거 데이터로 최근의 데이터를 예측하는 것이 중요하다고 생각하였기 때문입니다. 나중에 소개드릴 로보리포트 시계열 예측 서비스에서는 다양한 방식으로 실험 데이터를 구성하도록 지원하고 있습니다.

X_train.shape : (6356, 16) 
X_test.shape : (196, 16)

속성 소개하기

전체 16개의 속성이며 훈련 셋 크기는 6356개, 테스트 셋 크기는 196개 입니다. 참고로 실험 속성은 지역코드, 년도, 월, 빌딩 타입(아파트, 빌라 등), 매매가격 지수, 금리, 환율, 미분양 데이터 등입니다. 자세한 내용은 아래 표를 참조해 주세요.
그리고 target 속성은 다음달 주택 매매가격지수(tradeprice_sido_n1)를 설정했습니다.

region_cd 지역코드(시도)
year 연도
month
building_type 부동산타입
tradeprice_sido 매매가격지수(시도)
construction_realized_amount 건설기성액(백만원)
cd
cd(91일물)

spirit_deposit_rate

정기예금금리
exchange_rate 환율
composite_stock_price_index 종합주가지수
economy_growth 경제성장률
exchequer_bond_three 채3년
household_loan_all 가계대출액(전국)
mortgage_all 주택대출액(전국)
numberofnosells 미분양 가구수(시도)
unsalenum_c 공사완료후 미분양(민간,시도)

실험을 하기 위해 우선 Linear Regression 패키지를 import 합니다. 선형 회귀 알고리즘(linear regression)은 주어진 데이터 집합에 대해 종속 변수 Y 와 설명 변수 X와의 선형 관계를 모델링합니다. 쉽게 이야기해서 아래와 같이 실험 데이터에 가장 근사하게 매치하는 직선을 그린다고 생각하면 됩니다. y절편은 이 직선이 y축과 만나는 점을 의미하며 LinearRegression 클래스의 intercept_ 속성에 그 값이 저장됩니다.

표현식은 아래와 같습니다. 이중에서 베타는 weight, 상관계수 라고도 불리며 각 속성의 영향도를 의미합니다. 실험이 끝나면 훈련이 끝난 모델의 coef_ 속성에 값이 저장됩니다. intercept_ 속성은 항상 실수 값 하나지만, coef_ 속성은 각 입력 특성에 하나씩 대응되는 Numpy 배열입니다. 16개의 속성이므로 coef_ 속성 배열 사이즈도 16이 될 것 입니다.

선형회귀 실험

LinearRegression 함수 인자의 문는 아래를 참고하세요.

fit_intercept는 y 절편을 계산할지에 대한 설정입니다. 데이터를 표현하는 식이 원점을 지나가는 선이 최적화된 선이 아니라면 기본적으로 사용하는 것이 좋습니다. normalize는 regressors X를 정규화 시킬 것인지에 대한 옵션입니다. n_jobs 는 모델 계산에 사용될 작업 개수를 의미합니다. 데이터 개수가 작아 None으로 설정했습니다.

Linear Regression test file accuracy:0.904775830424
Out[12]:
array([ 2.41360754e-06, -1.43348218e-01, -6.30260362e-03, -9.82386414e-03, 9.78713133e-01, -9.70551425e-09, 2.54192891e-01, -1.51807329e-01, 1.58985085e-05, 5.78284319e-04, 1.10692957e-01, -6.18784363e-02, -5.71178866e-06, 1.41955024e-05, -1.97553459e-05, -4.99848193e-06])

sklearn은 기본적으로 fit 함수를 사용하여 훈련 데이터 셋에서 모델을 생성합니다. 그리고 score 함수를 사용해서 생성된 모델의 성능을 확인하고 predict 함수로 테스트 셋의 예측값을 생성합니다. 이 세가지 함수는 알고리즘의 종류와 관계 없이 대부분의 알고리즘에 존재합니다.

Score 함수에서 리턴하는 값은 R2 이며 결정계수, R-Square,
coefficient of determination 로도 불립니다. 결정계수는 모델의 전반적인 성능을 0~1까지의 숫자로 알려줍니다. 종속 변수와 독립 변수와의 상관도가 높을 수록 값은 1에 가까워 집니다. 실험에서 나온 결정계수의 스코어는 0.90으로 그럭저럭 높은 예측값을 보여줍니다. 그리고 coef_ 변수에는 각 속성들의 상관계수 값이 들어있습니다. 상관계수는 -1 에서 1까의 값을 가지며 -는 음의 영향력, +는 양의 영향력을 의미합니다. 부호와 상관없이 숫자의 절대값은 영향력의 크기를 의미합니다.

위 코드에서 속성의 순서에 따라 결정계수의 값이 배열로 들어있긴 하지만 속성과 연관해서 확인하기는 힘들어서 한글 속성 이름으로 변경하고 절대값이 큰 순서로 정렬해서 pandas dataframe으로 다시 확인해 보았습니다.

당연한 결과이지만 해당 월의 매매가격 지수가 0.9로 매우 강한 양의 상관관계를 보이고 그외 단기 금리인 cd와 0.25의 약한 양의 상관관계, 정기예금금리와는 -0.15의 약한 음의 관계, 연도와는 -, 경제성장률은 +의 매우 약한 상관 관계를 보여주고 있습니다. 그 외 나머지는 0.1 이하의 값으로 크게 상관관계가 없어보입니다. 미분양 데이터가 상관관계가 적어보이는 것은 약간 의아하지만 바로 다음달의 매매가격지수를 예측했기에 그럴 수도 있을 것 같습니다. 어느정도 시차를 두고 영향을 끼치는 속성들은 3개월후, 6개월후, 1년후 등으로 예측 시기를 변경해서 실험을 해보는 것도 의미가 있을 것 같습니다.

실험 결과 해석하기

다음은 테스트셋의 실제 값을 x축으로 예측 값을 y축으로 그래프를 그려보겠습니다. 원칙적으로 모든 예측 값이 실제 값과 일치하면 직선이 나올 것이고 모델의 성능이 좋지 않을 수록 흩어진 점들을 볼 수 있을 것입니다. 해당 실험은 아래와 같이 어느정도 직선에 가까운 모습을 보입니다.

mse = sklearn.metrics.mean_squared_error(Y_test, Y_pred)
print(mse)


0.100838171768

그리고 실제 값과 예측 값의 mean squared error를 구해보았습니다. mean squared error는 오차의 제곱의 평균값을 계산한 값으로 숫자가 적을 수록 예측값과 실제 값의 차이가 적은 것을 의미합니다. 0.1의 값이 나왔습니다.

그럼 지금까지 부동산 가격에 영향이 있을 것 같은 속성들을 일부 골라서 선형 회귀로 다음달의 부동산 지수를 예측하는 실험을 해 보았습니다. 처음 작성하는 실험 포스팅이라 최대한 자세하고 쉽게 적으려고 노력을 해보았습니다. 다음 포스팅에서는 각 알고리즘에 대한 설명 및 실험 관련 속성들에 대해서 간략하게 적어보도록 하겠습니다. 포스팅 연재를 읽어주셔서 감사합니다.

참고로 해당 포스팅의 실험 결과는 로보리포트 사이트에 지속적으로 업데이트 될 예정입니다. 관심 있으신 분은 방문 부탁드립니다 +_+

https://land.roboreport.co.kr

읽을만한 글들

linear regression : https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html

https://medium.com/@haydar_ai/learning-data-science-day-9-linear-regression-on-boston-housing-dataset-cd62a80775ef

기계학습 훈련 데이터 구성 방법

기계 학습으로 분석 모형을 만들기 위해서는 학습을 위한 데이터가 필요합니다. 보통 원래의 전체 데이터 셋에서 두 종류의 데이터로 구분해서 실험을 합니다.

  • 학습을 위한 데이터 셋 (training data)
  • 학습된 모델 검증을 위한 테스트용 데이터 셋 (test data)

이번 포스팅에서는 싸이킷런에서 제공하는 실험 데이터 구성을 지원하는 함수들을 살펴보겠습니다. 아래 설명되는 실험 데이터 구성 방식은 로보리포트의 기계학습 툴킷에서 그대로 사용이 가능합니다.

train_test_split 함수

train_test_split 함수는 전체 데이터셋 배열을 받아서 랜덤하게 훈련/테스트 데이터 셋으로 분리해주는 함수입니다. 함수 정의는 아래와 같습니다. 참고로 함수에 대한 자세한 설명은 링크에서 확인 가능합니다.


from sklearn.model_selection import train_test_split


sklearn.model_selection.train_test_split(array*, test_size, train_size, random_state, shuffle, stratify)[source]

필수 인자 값으로는 데이터들을 받습니다. 데이터는 list, arrays, matrics, dataframe 등 다양한 형태를 포함합니다. 클래스 값을 포함하여 하나의 데이터로 받을 수도 있고 클래스 값을 분리해서 두개의 데이터로도 받을 수 있습니다.

  • 클래스 값을 포함하여 하나의 데이터로 받는 경우

df_train, df_test = train_test_split(df, test_size=0.4, random_state=0)

  • 클래스를 개별의 배열로 받는 경우

train_x, test_x, train_y, test_y = train_test_split(X, Y, test_size = 0.5)

아래 다른 파라미터들은 다 옵션으로 선택 가능합니다.

test_size는 float, int 또는 None값을 사용합니다. 0에서 1의 값(float)을 입력하면 전체 데이터 셋에서 test set의 비율을 의미합니다. 0.3을 입력할 경우 전체 데이터의 30%를 랜덤하게 테스트로 사용합니다. 정수 값(int)을 입력하면 데이터 개수를 의미합니다. None을 입력하고 훈련 데이터 셋 사이즈를 지정할 경우 훈련 데이터셋을 뺀 나머지를 테스트 데이터로 사용합니다. 기본 값은 0.25입니다.

train_size는 float, int 또는 None값을 사용합니다. 0에서 1의 값(float)을 입력하면 전체 데이터 셋에서 train set의 비율을 의미합니다. 0.3을 입력할 경우 전체 데이터의 30%를 랜덤하게 훈련 데이터로 사용합니다. 정수 값(int)을 입력하면 훈련에 사용될 데이터 개수를 의미합니다. None을 입력하고 테스트 데이터 셋 사이즈를 지정할 경우 테스트 데이터셋을 뺀 나머지를 훈련 데이터로 사용합니다. 기본 값은 None입니다.

random_state는 int, randomstate instance 또는 None 값을 사용합니다. 정수 값을 입력하면 숫자를 random하게 생성할때 사용되는 seed 숫자로 사용되며, None을 입력하면 np.random에서 제공하는 random number generator가 사용됩니다.

shuffle은 bool 값으로 데이터를 분리하기 전에 데이터를 셖을 것인지 지정하며 기본값은 True이다.

stratify는 훈련/테스트 데이터들이 원래의 input dataset의 클래스의 비율과 같은 비율을 가지도록 할 것인지 지정한다. 예를 들어 0,1의 클래스가 input dataset에 20:80 비율로 있었다면 훈련 데이터와 테스트 데이터 역시 각각의 클래스가 같은 비율로 있도록 지정할 수 있다. 

이런 식으로 데이터를 비율 등으로 간단하게 데이터를 분리하여 실험 데이터를 구성할 수 있습니다. 다음 포스팅에서는 k-fold validation 방식을 설명하겠습니다 : )

scikit-learn을 사용하여 부동산 가격 예측하기 – 3) 실험 데이터 분석하기

scikit-learn을 사용하여 부동산 가격 예측하기

3) 실험 데이터 분석하기

본격적으로 실험을 하기전에 pandas의 resample 함수를 사용해서 데이터의 분포를 확인해 보려고 합니다.  pandas의 resample 함수에서는 시계열 데이터의 시간 간격을 재조정할 수 있습니다. 이 함수를 사용하기 위해서는 dataframe이 시간 관련 index(datetimeIndex, PeriodIndex, TimedeltaIndex 등)를 가져야 합니다. 이전 포스트에서 데이터를 읽어올 때부터 아래와 같이 date 칼럼을 index로 설정하여 바로 사용이 가능합니다. 

df = pd.read_csv(“economy.csv”, parse_dates =[“date”], index_col =”date”)


함수의 사용방법은 아래와 같습니다.

DataFrame.resample(rule, how=None, axis=0, fill_method=None, closed=None, label=None, convention=’start’, kind=None, loffset=None, limit=None, base=0, on=None, level=None)

rule에는 resample을 실행할 시간 단위를 적어둡니다. (아래 표 참조)
이 때 시간 구간이 작아지면 데이터 양이 증가한다고 해서 업-샘플링(up-sampling)이라 하고 시간 구간이 커지면 데이터 양이 감소한다고 해서 다운-샘플링(down-sampling)이라 부릅니다.



좀 더 보기좋게 시간 단위의 alias만 정리된 표는 아래와 같습니다.

시간 단위 alias

그리고 아래와 같은 기본적인 aggregation 함수들을 dispatching이라는 방법으로 간단하게 호출하여 resample 함수와 같이 사용할 수 있습니다.

이제 실제 데이터 분포를 확인해보겠습니다. 예전 포스팅에서 부동산 지수 예측을 위해 저장했던 dataframe을 사용하겠습니다. 기존 데이터를 년말 기준으로 resample을 해서 각 칼럼당 개별 년도의 mean 값을 확인해보겠습니다.

df.resample(rule=’A’).mean()

데이터가 2010년부터 2018년도 까지 있다는 것을 확인할 수 있습니다. 그리고 각각의 속성(칼럼)의 mean 값을 확인할 수 있습니다. 얼핏 봐도 cd 금리(cd)와 국가채(spirit_deposit_rate) 시간이 지날 수록 연도별 평균값이 점점 낮아지고 있는 것을 확인할 수 있습니다.

그럼 실제로 cd 금리로 시계열 그래프를 그려보도록 하겠습니다. jupyter notebook을 사용할 경우 %matplotlib inline 을 명시하면 노트북 내부에서 그래프가 표시됩니다. 월말 기준으로(rule=’M’) 바 그래프(‘bar’)를 plot함수를 사용하여 아래와 같이 그려보겠습니다.

%matplotlib inline
df[‘cd’].resample(rule=’M’).mean().plot(‘bar’)



cd 금리 그래프

간단하게 그래프가 그려졌습니다. 그렇지만 월별 데이터로 그리니 넘 촘촘하게 그려지고 있습니다.

년도 단위로 데이터가 얼마나 있나 확인하고 싶어 count 함수를 rule=’A’ 옵션과 같이 사용해서 그래프를 다시 그려봅니다.

2018년도 데이터가 다른 년도 데이터보다 더 적은 것을 확인 할 수 있습니다.

이런식으로 시계열 데이터를 간단히 그래프를 그릴 수 있습니다.
그럼 이제 본격적인 실험으로 들어가보도록 하겠습니다 : )

부동산 용어 – 국고채 3년 금리란 무엇인가

 

*부동산 기계학습 실험하기에 사용되는 속성들 설명 포스팅입니다.

 

국고채는 간단하게 이야기해서 정부가 발행한 채권입니다.

참고로 채권은 정부, 공공단체, 주식회사 등이 일반인으로부터

거액의 자금을 일시에 조달하기 위하여 발행하는 차용증서를 뜻하며

상환 기간이 정해져 있으며 이자가 확정되어 있다는 특징을 가집니다.

정부에서 도로를 내고, 학교를 세우는 등의 많은 재정이 소모되는 일을 할 경우

정부는 채권을 발행하여 민간 또는 국민에게 돈을 빌리고 차용증권을 발행해줍니다.

 

일반적으로 금리가 높지 않아 큰 수익을 기대하기는 힘들지만

정부에서 발행하는 것이기 때문에 안정성이 높아

주식과 대비하여 보수적인 투자자들에게 선호되는 투자 방식입니다.

 

국고채는 거래단위가 보통 100억원 이상으로 금액이 크며

금융기관에 경쟁입찰식으로 발행을 합니다.

금융기관은 입찰로 국고채를 산 후 이를 기본으로 한 금융 상품을 판매하거나

국고채 자체를 분할하여 수수료를 받고 일반인들에게 판매합니다.

국고채는 만기가 1년, 3년, 5년, 10년, 20년 등이 있습니다.

 

국고채는 국가가 보증하는 채권이므로 위험 프리미엄이 거의 없어 신용도에 따른 금리 변동이 적어

그  국가의 전반적인 금리 흐름, 즉 금리상승/하락 등을 파악하기가 수월합니다.

국고채 3년물은 장기금리의 흐름을 보여주는 대표적인 지표이며

미국, 일본, 독일, 영국 등도 국고채 금리를 장기금리의 지표로 사용하고 있습니다.

 

부동산 기계학습 실험에서는 cd금리가 단기금리 를 대표하는 속성으로 사용되었고

국고채 3년물은 장기금리를 대표하는 속성으로 포함되었습니다.

 

 

 

 

 부동산 매매가격 지수와 금리와의 그래프입니다.

단기 금리, 장기 금리 상관없이 2010년 부터 2018년부터 출렁거리면서 금리는 점점 낮아지고 그에 반해 매매가격지수는 상승하는 것을 확인할 수 있습니다. 금리만 보게 될 경우 그래프 상에서는 장기 금리인 국고채3년 금리가 먼저 움직이고 단기 금리인 cd금리가 따라서 움직이는 것으로 보입니다.

기계학습 실험을 할 경우 선택한 알고리즘에 따라 속성의 weight로 해당 실험에서의 속성의 중요도를 확인할 수 있습니다. 그럼 각각의 부동산 평가 실험에서 각각의 금리가 어느정도의 중요도를 가지고 있는지 실제로 확인해보겠습니다.

scikit-learn을 사용하여 부동산 가격 예측하기 : 2) 실험 데이터 설정하기

scikit-learn을 사용하여 부동산 가격 예측하기

2) 실험 데이터 설정하기

실험 데이터는 pandas dataframe을 사용하여 설정하였습니다.

pandas는 데이터 처리와 분석을 위한 파이썬 라이브러리로

pandas의 dataframe은 엑셀의 스프레드시트와 비슷한 테이블 형태를 지원합니다.

전체 배열의 원소가 동일해야 하는 numpy와는 달리

pandas는 각 열의 타입이 달라도  사용이 가능합니다.

SQL, 엑셀 파일, csv 파일 등 다양한 파일과 데이터베이스에서 데이터를 읽어와서

dataframe으로 간단히 사용을 할 수 있어

python을 사용하는 기계 학습에서 자주 사용되고 있습니다.

이번 실험에 사용할 데이터를 pandas의 read_csv 함수를 사용하여

아래와 같이 pandas 데이터프레임으로 저장 하였습니다.

read_csv 함수에서 parse_dates 인자로날짜 타입인 열 이름( date)을 전달하고

index_col 인자로 date 열을 인덱스로 설정했습니다.

날짜 타입을 인덱스로 설정한 이유는 나중에 시계열 그래프를 그리기 위해서입니다.

dropna 함수를 사용하여 하나의 속성이라도 비어있는 열들은

실험에서 제외 하였습니다.

head 함수를 사용하여 상단의 데이터 값을 확인해 보겠습니다.

각 필드의 간략 설명은 다음과 같습니다.

경제 지표 관련 속성들이 부동산지수에 어떻게 영향을 미치는지 테스트 하기 위해서

금리, 환율 등의 경제지표 속성들을 실험에 포함했습니다.

예측 타겟은 한달 후의 한국감정원의 주택가격지수 중  주택매매지수 (‘tradeprice_sido_n1)입니다.

내가 이번달의 주택매매지수와 다른 경제 지표들을 알고 있을때

다음달의 주택매매지수를 예측할 수 있는지가 이번 실험의 타겟입니다.

시도단위의 매매지수이며 속성에서도 시도값이 따로 있을경우

속성 설명에 (시도)를 따로 적어두었습니다.

속성에 대한 개별적인 포스팅이 추가되면

해당 포스팅의 속성 설명로 링크로 계속 업데이트 하겠습니다.

전반적인 실험 과정을 전달하기 위해서 최대한 기본적인 내용만 실험에 포함해서 진행해보겠습니다.

여기서 더 다양한 속성들과 다른 실험 방식을 사용하는 예시는

추후 다른 포스팅에서 이어서 전달하려고 합니다.

‘region_cd’: ‘지역코드(시도)’,

‘year’: ‘연도’,

‘month’:’월’,

‘building_type’: ‘부동산타입’,
‘tradeprice_sido’ : ‘매매가격지수(시도)’,

‘construction_realized_amount’ : ‘건설기성액(백만원)’,

“cd”: “cd(91일물)“,
‘spirit_deposit_rate’: ‘정기예금금리’,

‘exchange_rate’: ‘환율’,

‘composite_stock_price_index’: ‘종합주가지수’,
‘economy_growth’: ‘경제성장률’,

‘exchequer_bond_three’ : ‘국고채3년‘,

‘household_loan_all’: ‘가계대출액(전국)’,
‘mortgage_all’ : ‘주택대출액(전국)’,

‘numberofnosells’:’미분양 가구수(시도)’,

‘unsalenum_c’:’공사완료후 미분양(민간,시도)’

데이터프레임의 info 함수를 사용해서 index 정보와 컬럼수, 전체 데이터 개수, 각 열의 타입을 확인합니다.

describe 함수를 사용하면 각 필드별로 평균값, 분포, 최소값 등을 간단히 확인할 수 있습니다.

범주형 속성도 있긴 하지만 일단은 별도 처리 없이 진행합니다.

 다음 포스팅에서는 본격적으로 실험을 시작하기 전에 matplotlib 을 사용하여

각 데이터의 분포를 확인해보겠습니다.

 이전 부동산 가격 실험 관련 포스팅

scikit-learn을 사용하여 부동산 가격 예측하기 : 1) target 설정 : 전국주택가격 지수

cd 금리와 부동산 가격 상관 관계 알아보기 (1)

참조: https://www.geeksforgeeks.org/python-pandas-dataframe-resample/

scikit-learn을 사용하여 부동산 가격 예측하기 : 1) target 설정 : 전국주택가격 지수

 

scikit-learn을 사용하여 부동산 가격 예측하기

1 ) target 설정 : 전국주택가격 지수

 

scikit-learn을 사용하여 부동산 가격 예측하기 실험을 연재해보겠습니다.

scikit-learn은 파이썬으로 구현된 기계학습 오픈소스 라이브러리로

보통 싸이킷 런이라 발음합니다.

다양한 기계 학습 알고리즘 동일한 함수로 사용할 수 있어서

알고리즘을 바꿔가면서 간단히 실험하기에 좋습니다.

scikit-learn에 대한 자세한 사용법은 다음 포스팅에 이어서 하겠습니다.

무엇보다 기계학습 실험을 하기 위해서는 실험 대상이 있어야 합니다.

향후 다양한 실험을 하면서 개별 매물 가격 등의 다양한 타겟들을 실험해보겠지만

이번 실험에서는 한국감정원의 전국주택가격 지수를 사용하려고 합니다.

 

전국주택가격지수는 한국감정원에서 매주 또는 월간으로

전국 아파트, 단독, 연립주택을 표본 조사해서 만든 하나의 수치로

주택 시장의 평균적인 가격변화를 측정하는 지표로 사용합니다.

자세한 내용은 아래 한국 감정원에서의

전국주택가격 지수 설명 링크를 참조할 수 있습니다.

 

한국 감정원 전국주택가격 지수 설명 링크

 

다른 주택가격지수들도 있지만 전국주택가격지수 데이터를 타겟으로 설정했던 이유는

시군구 단위의 가격지수를 제공한다는 점,

그리고 월간 데이터긴 하지만 아파트, 단독, 연립주택 지수를 주기 때문입니다.

 

 

 

전국주택가격지수 데이터는 공공데이터 포털에서 수집였고

아래 링크를 따라 가면 데이터 수집에 대한 자세한 설명을 확인할 수 있습니다.

 

데이터 제공 API: https://www.data.go.kr/dataset/15002287/openapi.do

 

그럼 다음 포스팅에서는 실험에 사용해볼 속성들에 대한 소개들을 해보겠습니다.

 

 

 

 

 

 

 

 

 

 

sklearn에서 missing value 처리하기 ( by pandas)

sklearn 에서 missing value 처리하기

실험에서 사용하는 데이터의 속성 필드 값이 비어있을 때

아래와 같은 에러 메세지를 확인할 수 있다.

Input contains NaN, infinity or a value too large for dtype(‘float64’).

sckit-learn 알고리즘은 기본적으로

모든 데이터가 다 값을 가지고 있을 거라 간주하기 때문에

비어있는 값을 발견하면 에러 메세지를 내고 종료를 한다.

이럴 경우 두 가지 방법 중 하나를 선택할 수 있다.

  • 비어있는 값을 가지고 있는 데이터를 제거 하거나 (데이터의 양이 충분한 경우)
  • 비어있는 값을 다른 값으로 치완할 수 있다.  (데이터가 부족하거나 아니면 그 데이터를 사용해서 실험을 해야 하는 경우)

각각의 케이스에 대해 어떻게 처리를 하는지 하나씩 확인해보겠다.

비어있는 값을 가지고 있는 데이터를 제거하는 것은

pandas 패키지의 dropna() 함수를 사용하면 간단하다.

아래는 read_csv 함수를 사용해서 임의의 csv 데이터를 읽어와서

pandas 의 dataframe으로 저장 후

dropna()함수를 사용해 본 예시이다.

dropna()를 사용하면 하나의 속성이라도

비어있는  열이 있으면  모두 드랍한다.

예시에서 사용한 데이터에는 중간 중간 비어있는 예시들이 많아서

dropna()를 사용하니

하나도 남아있는 데이터가 없었다 ; – ;

그럼 조건을 완화해서 함수 인자로 how=’all’을 지정하면

모든 속성이 다 비워져있는 열들만 삭제를 할 수 있다.

또는 N/A 값을 가질 수 있는 최소 개수를 thresh 인자로 명기할 수도 있다.

예시에서는 빈 값을 가질 수 있는 필드를 최소 2개 로 설정해 보았다.

조건에 맞는 데이터들이 노출되는 것을 확인 할 수 있다.

마지막으로 빈 값을 검사하는 필드 이름도 subset 인자로 지정할 수 있다.

사실 비어있는 데이터를 포함하고 있는 것은 지가지수 속성이었기 때문에

전체적으로 빈 값이 리턴되고 있다.

이 외 자세한 내용은 아래 pandas 웹 페이지를 확인 할 수 있다.

다음 포스팅에서는 빈 값을  다른 값으로 대체하는 방법을 확인해보겠다.

참고:  https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.dropna.html