donut

'Data preprocess'에 해당되는 글 1건

  1. Python 데이터 전처리 실습(부동산거래량)

Python 데이터 전처리 실습(부동산거래량)

Data preprocess

 

 

 

부동산 거래현황Data로 실습하는 Python 빅데이터처리(전처리, 시각화)

안녕하세요. 이번 포스팅은 파이썬을 활용하여 빅데이터를 실제로 다루어 보는 실습내용입니다
빅데이터라고 하기엔 자료의 양이 적고, 이미 정돈되어 있는것 같아 머쓱한데요,
일단 시작하겠습니다.

필요한 모듈 세팅

우선 데이터는 국가통계포털에서 csv로다운로드 받습니다.

In [30]:
import numpy as np
from pandas import read_csv
import pandas as pd
from pandas import DataFrame
from pandas import merge
from pandas import ExcelWriter
from matplotlib import pyplot
 

파일 확인

.head()는 파이썬 데이터프레임 조회시 상위 5줄을 보여준다

In [31]:
#파일 읽기 및 확인
시도별거래량csv = read_csv(r"/Users/donut/tstory/행정구역별_주택매매거래현황_20200812163714.csv", encoding="euc-kr")
시도별거래량csv.head()
Out[31]:
  행정구역별(1) 행정구역별(2) 2018. 01 2018. 02 2018. 03 2018. 04 2018. 05 2018. 06 2018. 07 2018. 08 ... 2019. 09 2019. 10 2019. 11 2019. 12 2020. 01 2020. 02 2020. 03 2020. 04 2020. 05 2020. 06
0 행정구역별(1) 행정구역별(2) 동(호)수 (동(호)수) 동(호)수 (동(호)수) 동(호)수 (동(호)수) 동(호)수 (동(호)수) 동(호)수 (동(호)수) 동(호)수 (동(호)수) 동(호)수 (동(호)수) 동(호)수 (동(호)수) ... 동(호)수 (동(호)수) 동(호)수 (동(호)수) 동(호)수 (동(호)수) 동(호)수 (동(호)수) 동(호)수 (동(호)수) 동(호)수 (동(호)수) 동(호)수 (동(호)수) 동(호)수 (동(호)수) 동(호)수 (동(호)수) 동(호)수 (동(호)수)
1 전국 소계 70354 69679 92795 71751 67789 65027 63687 65945 ... 64088 82393 92413 118415 101334 115264 108677 73531 83494 138578
2 서울특별시 소계 15107 17685 24122 12347 11719 10401 11753 13577 ... 11779 14145 17313 22156 16834 16661 16315 9452 10255 19463
3 서울특별시 종로구 220 189 305 358 139 163 164 165 ... 139 164 203 298 217 244 212 120 153 235
4 서울특별시 중구 246 293 404 185 177 167 153 181 ... 114 178 240 317 237 203 156 81 102 206

5 rows × 32 columns

In [32]:
시도별거래량csv.shape
Out[32]:
(281, 32)
 

데이터프레임 결측치확인하기

In [33]:
결측치확인 = 시도별거래량csv.isna()
결측치합계=결측치확인.sum()
결측치합계
Out[33]:
행정구역별(1)    0
행정구역별(2)    0
2018. 01    0
2018. 02    0
2018. 03    0
2018. 04    0
2018. 05    0
2018. 06    0
2018. 07    0
2018. 08    0
2018. 09    0
2018. 10    0
2018. 11    0
2018. 12    0
2019. 01    0
2019. 02    0
2019. 03    0
2019. 04    0
2019. 05    0
2019. 06    0
2019. 07    0
2019. 08    0
2019. 09    0
2019. 10    0
2019. 11    0
2019. 12    0
2020. 01    0
2020. 02    0
2020. 03    0
2020. 04    0
2020. 05    0
2020. 06    0
dtype: int64
 

데이터 전처리

데이터프레임 복사

In [34]:
시도별거래량DF = 시도별거래량csv.copy()
 

컬럼명 확인

In [35]:
#컬럼명 확인방법
시도별거래량col = list(시도별거래량DF.columns)
print(시도별거래량col)
 
['행정구역별(1)', '행정구역별(2)', '2018. 01', '2018. 02', '2018. 03', '2018. 04', '2018. 05', '2018. 06', '2018. 07', '2018. 08', '2018. 09', '2018. 10', '2018. 11', '2018. 12', '2019. 01', '2019. 02', '2019. 03', '2019. 04', '2019. 05', '2019. 06', '2019. 07', '2019. 08', '2019. 09', '2019. 10', '2019. 11', '2019. 12', '2020. 01', '2020. 02', '2020. 03', '2020. 04', '2020. 05', '2020. 06']
 

새롭게 지정해줄 컬럼명 설정

데이터프레임 리스트 공백제거 = .replace(" ","")

In [36]:
시도별거래량ncol = []
for i in range(len(시도별거래량col)):
    if i==0:
        시도별거래량ncol.append("시도")
    elif i==1:
        시도별거래량ncol.append("구군")    
    else:
        변환=시도별거래량col[i].replace(" ","")
        시도별거래량ncol.append(변환)
시도별거래량ncol
Out[36]:
['시도',
 '구군',
 '2018.01',
 '2018.02',
 '2018.03',
 '2018.04',
 '2018.05',
 '2018.06',
 '2018.07',
 '2018.08',
 '2018.09',
 '2018.10',
 '2018.11',
 '2018.12',
 '2019.01',
 '2019.02',
 '2019.03',
 '2019.04',
 '2019.05',
 '2019.06',
 '2019.07',
 '2019.08',
 '2019.09',
 '2019.10',
 '2019.11',
 '2019.12',
 '2020.01',
 '2020.02',
 '2020.03',
 '2020.04',
 '2020.05',
 '2020.06']
 

컬럼명 바꾸기

컬럼명을 바꾸기 위해, 기존 컬럼명과, 새로운 컬럼명을 Dict형태로 대치시켜준다

In [37]:
colDict = {}
for i, v in enumerate(시도별거래량ncol):
    # `이름`의 i번째에 대응되는 항목을 `현재인덱스`에서 가져옴
    before = 시도별거래량col[i];
    colDict[before] = v
    
colDict
Out[37]:
{'행정구역별(1)': '시도',
 '행정구역별(2)': '구군',
 '2018. 01': '2018.01',
 '2018. 02': '2018.02',
 '2018. 03': '2018.03',
 '2018. 04': '2018.04',
 '2018. 05': '2018.05',
 '2018. 06': '2018.06',
 '2018. 07': '2018.07',
 '2018. 08': '2018.08',
 '2018. 09': '2018.09',
 '2018. 10': '2018.10',
 '2018. 11': '2018.11',
 '2018. 12': '2018.12',
 '2019. 01': '2019.01',
 '2019. 02': '2019.02',
 '2019. 03': '2019.03',
 '2019. 04': '2019.04',
 '2019. 05': '2019.05',
 '2019. 06': '2019.06',
 '2019. 07': '2019.07',
 '2019. 08': '2019.08',
 '2019. 09': '2019.09',
 '2019. 10': '2019.10',
 '2019. 11': '2019.11',
 '2019. 12': '2019.12',
 '2020. 01': '2020.01',
 '2020. 02': '2020.02',
 '2020. 03': '2020.03',
 '2020. 04': '2020.04',
 '2020. 05': '2020.05',
 '2020. 06': '2020.06'}
 

컬럼명 바꾸기

파이썬 데이터프레임 컬럼명 바꾸기 = .rename()

In [38]:
시도별거래량전처리 = 시도별거래량DF.rename(columns = colDict)
시도별거래량전처리.head()
Out[38]:
  시도 구군 2018.01 2018.02 2018.03 2018.04 2018.05 2018.06 2018.07 2018.08 ... 2019.09 2019.10 2019.11 2019.12 2020.01 2020.02 2020.03 2020.04 2020.05 2020.06
0 행정구역별(1) 행정구역별(2) 동(호)수 (동(호)수) 동(호)수 (동(호)수) 동(호)수 (동(호)수) 동(호)수 (동(호)수) 동(호)수 (동(호)수) 동(호)수 (동(호)수) 동(호)수 (동(호)수) 동(호)수 (동(호)수) ... 동(호)수 (동(호)수) 동(호)수 (동(호)수) 동(호)수 (동(호)수) 동(호)수 (동(호)수) 동(호)수 (동(호)수) 동(호)수 (동(호)수) 동(호)수 (동(호)수) 동(호)수 (동(호)수) 동(호)수 (동(호)수) 동(호)수 (동(호)수)
1 전국 소계 70354 69679 92795 71751 67789 65027 63687 65945 ... 64088 82393 92413 118415 101334 115264 108677 73531 83494 138578
2 서울특별시 소계 15107 17685 24122 12347 11719 10401 11753 13577 ... 11779 14145 17313 22156 16834 16661 16315 9452 10255 19463
3 서울특별시 종로구 220 189 305 358 139 163 164 165 ... 139 164 203 298 217 244 212 120 153 235
4 서울특별시 중구 246 293 404 185 177 167 153 181 ... 114 178 240 317 237 203 156 81 102 206

5 rows × 32 columns

 

인덱스삭제

데이터프레임 0번째 인덱스(로우)를 삭제하기

In [39]:
시도별거래량DF = 시도별거래량전처리.drop(시도별거래량전처리.index[0])
시도별거래량DF.head()
Out[39]:
  시도 구군 2018.01 2018.02 2018.03 2018.04 2018.05 2018.06 2018.07 2018.08 ... 2019.09 2019.10 2019.11 2019.12 2020.01 2020.02 2020.03 2020.04 2020.05 2020.06
1 전국 소계 70354 69679 92795 71751 67789 65027 63687 65945 ... 64088 82393 92413 118415 101334 115264 108677 73531 83494 138578
2 서울특별시 소계 15107 17685 24122 12347 11719 10401 11753 13577 ... 11779 14145 17313 22156 16834 16661 16315 9452 10255 19463
3 서울특별시 종로구 220 189 305 358 139 163 164 165 ... 139 164 203 298 217 244 212 120 153 235
4 서울특별시 중구 246 293 404 185 177 167 153 181 ... 114 178 240 317 237 203 156 81 102 206
5 서울특별시 용산구 546 1064 1041 309 304 372 418 417 ... 316 325 437 657 488 356 292 165 227 488

5 rows × 32 columns

 

인덱스 설정하기

인덱스로 설정할 열을 전처리 한 후 인덱스로 지정하겠음

In [40]:
old시도 =list(set(시도별거래량DF['시도']))
old시도
Out[40]:
['충청남도',
 '경상남도',
 '강원도',
 '전라남도',
 '인천광역시',
 '전라북도',
 '대구광역시',
 '전국',
 '광주광역시',
 '충청북도',
 '제주특별자치도',
 '부산광역시',
 '울산광역시',
 '세종특별자치시',
 '경상북도',
 '서울특별시',
 '경기도',
 '대전광역시']
In [41]:
#스위치문을 사용해도 무관합니다.
new시도 = []
for i in range(len(old시도)):
    if len(old시도[i]) == 4:
        new시도.append(old시도[i][::2])
        
    elif len(old시도[i]) == 3:
        new시도.append(old시도[i][:2])  
    
    elif len(old시도[i]) >4:
        new시도.append(old시도[i][:2])
        
    else:
        new시도.append(old시도[i])
new시도
Out[41]:
['충남',
 '경남',
 '강원',
 '전남',
 '인천',
 '전북',
 '대구',
 '전국',
 '광주',
 '충북',
 '제주',
 '부산',
 '울산',
 '세종',
 '경북',
 '서울',
 '경기',
 '대전']
In [42]:
시도DF = DataFrame(old시도)
시도DF['1'] = new시도
시도DF
Out[42]:
  0 1
0 충청남도 충남
1 경상남도 경남
2 강원도 강원
3 전라남도 전남
4 인천광역시 인천
5 전라북도 전북
6 대구광역시 대구
7 전국 전국
8 광주광역시 광주
9 충청북도 충북
10 제주특별자치도 제주
11 부산광역시 부산
12 울산광역시 울산
13 세종특별자치시 세종
14 경상북도 경북
15 서울특별시 서울
16 경기도 경기
17 대전광역시 대전
In [43]:
시도DF.rename(columns = {0:'시도2', '1': 'sido'}, inplace=True)
시도DF
Out[43]:
  시도2 sido
0 충청남도 충남
1 경상남도 경남
2 강원도 강원
3 전라남도 전남
4 인천광역시 인천
5 전라북도 전북
6 대구광역시 대구
7 전국 전국
8 광주광역시 광주
9 충청북도 충북
10 제주특별자치도 제주
11 부산광역시 부산
12 울산광역시 울산
13 세종특별자치시 세종
14 경상북도 경북
15 서울특별시 서울
16 경기도 경기
17 대전광역시 대전
 

기존DF에 새로운 시도DF join하기

원본DF.join(붙힐DF.set_index('붙일DF의 기준컬럼명')['실제 붙일 컬럼명'],on='원본DF의 기준 컬럼명')

In [44]:
#데이터 프레임이름이 너무 길어서 df로이름을 줄이겠습니다.
df=시도별거래량DF.join(시도DF.set_index('시도2')['sido'],on='시도')
df.head()
Out[44]:
  시도 구군 2018.01 2018.02 2018.03 2018.04 2018.05 2018.06 2018.07 2018.08 ... 2019.10 2019.11 2019.12 2020.01 2020.02 2020.03 2020.04 2020.05 2020.06 sido
1 전국 소계 70354 69679 92795 71751 67789 65027 63687 65945 ... 82393 92413 118415 101334 115264 108677 73531 83494 138578 전국
2 서울특별시 소계 15107 17685 24122 12347 11719 10401 11753 13577 ... 14145 17313 22156 16834 16661 16315 9452 10255 19463 서울
3 서울특별시 종로구 220 189 305 358 139 163 164 165 ... 164 203 298 217 244 212 120 153 235 서울
4 서울특별시 중구 246 293 404 185 177 167 153 181 ... 178 240 317 237 203 156 81 102 206 서울
5 서울특별시 용산구 546 1064 1041 309 304 372 418 417 ... 325 437 657 488 356 292 165 227 488 서울

5 rows × 33 columns

 

인덱스 바꾸기

sido 열로 인덱스 바꿔주기

In [45]:
현재인덱스 = list(df.index)
시도리스트 = list(df['sido'])

indexDict ={}
for i, v in enumerate(시도리스트):
    before = 현재인덱스[i]
    indexDict[before] = v
indexDict
Out[45]:
{1: '전국',
 2: '서울',
 3: '서울',
 4: '서울',
 5: '서울',
 6: '서울',
 7: '서울',
 8: '서울',
 9: '서울',
 10: '서울',
 11: '서울',
 12: '서울',
 13: '서울',
 14: '서울',
 15: '서울',
 16: '서울',
 17: '서울',
 18: '서울',
 19: '서울',
 20: '서울',
 21: '서울',
 22: '서울',
 23: '서울',
 24: '서울',
 25: '서울',
 26: '서울',
 27: '서울',
 28: '부산',
 29: '부산',
 30: '부산',
 31: '부산',
 32: '부산',
 33: '부산',
 34: '부산',
 35: '부산',
 36: '부산',
 37: '부산',
 38: '부산',
 39: '부산',
 40: '부산',
 41: '부산',
 42: '부산',
 43: '부산',
 44: '부산',
 45: '대구',
 46: '대구',
 47: '대구',
 48: '대구',
 49: '대구',
 50: '대구',
 51: '대구',
 52: '대구',
 53: '대구',
 54: '인천',
 55: '인천',
 56: '인천',
 57: '인천',
 58: '인천',
 59: '인천',
 60: '인천',
 61: '인천',
 62: '인천',
 63: '인천',
 64: '인천',
 65: '인천',
 66: '광주',
 67: '광주',
 68: '광주',
 69: '광주',
 70: '광주',
 71: '광주',
 72: '대전',
 73: '대전',
 74: '대전',
 75: '대전',
 76: '대전',
 77: '대전',
 78: '울산',
 79: '울산',
 80: '울산',
 81: '울산',
 82: '울산',
 83: '울산',
 84: '세종',
 85: '세종',
 86: '경기',
 87: '경기',
 88: '경기',
 89: '경기',
 90: '경기',
 91: '경기',
 92: '경기',
 93: '경기',
 94: '경기',
 95: '경기',
 96: '경기',
 97: '경기',
 98: '경기',
 99: '경기',
 100: '경기',
 101: '경기',
 102: '경기',
 103: '경기',
 104: '경기',
 105: '경기',
 106: '경기',
 107: '경기',
 108: '경기',
 109: '경기',
 110: '경기',
 111: '경기',
 112: '경기',
 113: '경기',
 114: '경기',
 115: '경기',
 116: '경기',
 117: '경기',
 118: '경기',
 119: '경기',
 120: '경기',
 121: '경기',
 122: '경기',
 123: '경기',
 124: '경기',
 125: '경기',
 126: '경기',
 127: '경기',
 128: '경기',
 129: '경기',
 130: '경기',
 131: '경기',
 132: '경기',
 133: '경기',
 134: '경기',
 135: '강원',
 136: '강원',
 137: '강원',
 138: '강원',
 139: '강원',
 140: '강원',
 141: '강원',
 142: '강원',
 143: '강원',
 144: '강원',
 145: '강원',
 146: '강원',
 147: '강원',
 148: '강원',
 149: '강원',
 150: '강원',
 151: '강원',
 152: '강원',
 153: '강원',
 154: '충북',
 155: '충북',
 156: '충북',
 157: '충북',
 158: '충북',
 159: '충북',
 160: '충북',
 161: '충북',
 162: '충북',
 163: '충북',
 164: '충북',
 165: '충북',
 166: '충북',
 167: '충북',
 168: '충북',
 169: '충북',
 170: '충남',
 171: '충남',
 172: '충남',
 173: '충남',
 174: '충남',
 175: '충남',
 176: '충남',
 177: '충남',
 178: '충남',
 179: '충남',
 180: '충남',
 181: '충남',
 182: '충남',
 183: '충남',
 184: '충남',
 185: '충남',
 186: '충남',
 187: '충남',
 188: '전북',
 189: '전북',
 190: '전북',
 191: '전북',
 192: '전북',
 193: '전북',
 194: '전북',
 195: '전북',
 196: '전북',
 197: '전북',
 198: '전북',
 199: '전북',
 200: '전북',
 201: '전북',
 202: '전북',
 203: '전북',
 204: '전북',
 205: '전남',
 206: '전남',
 207: '전남',
 208: '전남',
 209: '전남',
 210: '전남',
 211: '전남',
 212: '전남',
 213: '전남',
 214: '전남',
 215: '전남',
 216: '전남',
 217: '전남',
 218: '전남',
 219: '전남',
 220: '전남',
 221: '전남',
 222: '전남',
 223: '전남',
 224: '전남',
 225: '전남',
 226: '전남',
 227: '전남',
 228: '경북',
 229: '경북',
 230: '경북',
 231: '경북',
 232: '경북',
 233: '경북',
 234: '경북',
 235: '경북',
 236: '경북',
 237: '경북',
 238: '경북',
 239: '경북',
 240: '경북',
 241: '경북',
 242: '경북',
 243: '경북',
 244: '경북',
 245: '경북',
 246: '경북',
 247: '경북',
 248: '경북',
 249: '경북',
 250: '경북',
 251: '경북',
 252: '경북',
 253: '경북',
 254: '경남',
 255: '경남',
 256: '경남',
 257: '경남',
 258: '경남',
 259: '경남',
 260: '경남',
 261: '경남',
 262: '경남',
 263: '경남',
 264: '경남',
 265: '경남',
 266: '경남',
 267: '경남',
 268: '경남',
 269: '경남',
 270: '경남',
 271: '경남',
 272: '경남',
 273: '경남',
 274: '경남',
 275: '경남',
 276: '경남',
 277: '경남',
 278: '제주',
 279: '제주',
 280: '제주'}
In [46]:
df.rename(index=indexDict, inplace=True)
df.drop(['시도','sido'], axis=1, inplace=True)
df
Out[46]:
  구군 2018.01 2018.02 2018.03 2018.04 2018.05 2018.06 2018.07 2018.08 2018.09 ... 2019.09 2019.10 2019.11 2019.12 2020.01 2020.02 2020.03 2020.04 2020.05 2020.06
전국 소계 70354 69679 92795 71751 67789 65027 63687 65945 76141 ... 64088 82393 92413 118415 101334 115264 108677 73531 83494 138578
서울 소계 15107 17685 24122 12347 11719 10401 11753 13577 19228 ... 11779 14145 17313 22156 16834 16661 16315 9452 10255 19463
서울 종로구 220 189 305 358 139 163 164 165 243 ... 139 164 203 298 217 244 212 120 153 235
서울 중구 246 293 404 185 177 167 153 181 177 ... 114 178 240 317 237 203 156 81 102 206
서울 용산구 546 1064 1041 309 304 372 418 417 522 ... 316 325 437 657 488 356 292 165 227 488
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
경남 거창군 101 66 90 112 57 72 42 57 49 ... 64 73 80 90 85 94 73 61 80 82
경남 합천군 50 50 51 34 33 24 41 24 36 ... 21 37 20 52 16 40 39 44 40 39
제주 소계 887 706 735 836 703 1000 858 680 617 ... 548 704 767 1003 888 792 789 652 640 930
제주 제주시 658 477 480 559 450 684 616 453 400 ... 426 535 621 793 641 581 605 485 443 587
제주 서귀포시 229 229 255 277 253 316 242 227 217 ... 122 169 146 210 247 211 184 167 197 343

280 rows × 31 columns

 

데이터 값 확인

임의 숫자 타입 조사,
해당 자료에선 숫자가 int가 아닌 object로 확인됨

따라서 int로 바꿔줘야함

In [47]:
print(df.dtypes.head())
print(df['2019.02'][2])
print(type(df['2019.02'][2]))
 
구군         object
2018.01    object
2018.02    object
2018.03    object
2018.04    object
dtype: object
88
<class 'str'>
 

데이터형식 변환 문자열을 숫자형으로 (str->int)

먼저 df데이터 프레임의 '구군'열은 문자열이기 때문에,
숫자 부분만 숫자열로 바꿔줘야함.
필터를 통해 데이터프레임을 나눈후 다시 합쳐주겠음

In [48]:
df문자 = df.filter(df.columns[0:1])
df문자
Out[48]:
  구군
전국 소계
서울 소계
서울 종로구
서울 중구
서울 용산구
... ...
경남 거창군
경남 합천군
제주 소계
제주 제주시
제주 서귀포시

280 rows × 1 columns

In [49]:
df숫자 = df.filter(df.columns[2:])
df숫자.head()
Out[49]:
  2018.02 2018.03 2018.04 2018.05 2018.06 2018.07 2018.08 2018.09 2018.10 2018.11 ... 2019.09 2019.10 2019.11 2019.12 2020.01 2020.02 2020.03 2020.04 2020.05 2020.06
전국 69679 92795 71751 67789 65027 63687 65945 76141 92566 64804 ... 64088 82393 92413 118415 101334 115264 108677 73531 83494 138578
서울 17685 24122 12347 11719 10401 11753 13577 19228 18787 9324 ... 11779 14145 17313 22156 16834 16661 16315 9452 10255 19463
서울 189 305 358 139 163 164 165 243 224 134 ... 139 164 203 298 217 244 212 120 153 235
서울 293 404 185 177 167 153 181 177 221 104 ... 114 178 240 317 237 203 156 81 102 206
서울 1064 1041 309 304 372 418 417 522 497 216 ... 316 325 437 657 488 356 292 165 227 488

5 rows × 29 columns

 

파이썬 데이터프레임 문자를 숫자로 바꾸기

df숫자.apply(pd.to_numeric)사용시 "-"라는 문자 때문에 실행이 불가하다는 오류가 뜸
"-"를 "0"으로 바꿔준후 다시 df숫자.apply(pd.to_numeric)를 실행하겠음

In [50]:
df숫자.replace("-","0",inplace =True)
df숫자2=df숫자.apply(pd.to_numeric)
df숫자2.dtypes.head()
Out[50]:
2018.02    int64
2018.03    int64
2018.04    int64
2018.05    int64
2018.06    int64
dtype: object
 

데이터 프레임 합치기 concat

문자열을 숫자로 바꿔주기위해 나눠놨던 데이터프레임을 다시 합쳐주겠습니다.
다만 concat이 알수없는 이유로 실행되지않아 다른방법을 사용하였습니다.
아래와 같은 방법으로 데이터 프레임의 컬럼명을 재정렬하여 반영하겠습니다.

In [52]:
df숫자2['구군']=list(df문자['구군'])
cols = df숫자2.columns.tolist()
newcols = cols[-1:] + cols[:-1]
'''
colDict = {}
for i,v in enumerate(newcols):
    before = cols[i]
    colDict[before] = v
colDict
'''
Out[52]:
'\ncolDict = {}\nfor i,v in enumerate(newcols):\n    before = cols[i]\n    colDict[before] = v\ncolDict\n'
In [53]:
df완성=df숫자2[newcols]
df완성.head()
Out[53]:
  구군 2018.02 2018.03 2018.04 2018.05 2018.06 2018.07 2018.08 2018.09 2018.10 ... 2019.09 2019.10 2019.11 2019.12 2020.01 2020.02 2020.03 2020.04 2020.05 2020.06
전국 소계 69679 92795 71751 67789 65027 63687 65945 76141 92566 ... 64088 82393 92413 118415 101334 115264 108677 73531 83494 138578
서울 소계 17685 24122 12347 11719 10401 11753 13577 19228 18787 ... 11779 14145 17313 22156 16834 16661 16315 9452 10255 19463
서울 종로구 189 305 358 139 163 164 165 243 224 ... 139 164 203 298 217 244 212 120 153 235
서울 중구 293 404 185 177 167 153 181 177 221 ... 114 178 240 317 237 203 156 81 102 206
서울 용산구 1064 1041 309 304 372 418 417 522 497 ... 316 325 437 657 488 356 292 165 227 488

5 rows × 30 columns

 

데이터프레임 전치 구하기

데이터 프레임의 행과 열을 바꾸기

In [54]:
소계df = df완성.query('구군 == "소계"')
전치 = 소계df.T
전치.drop(전치.index[0],inplace = True)
In [55]:
전치.head()
Out[55]:
  전국 서울 부산 대구 인천 광주 대전 울산 세종 경기 강원 충북 충남 전북 전남 경북 경남 제주
2018.02 69679 17685 3718 3444 4094 2436 2071 916 337 18759 1593 1676 2382 2406 1983 2544 2929 706
2018.03 92795 24122 6096 4504 5328 3294 2576 1150 600 24694 2182 2255 3262 2581 2640 3085 3691 735
2018.04 71751 12347 4456 4275 5393 3072 2312 1024 341 19305 2091 1954 2780 2421 2642 3005 3497 836
2018.05 67789 11719 4209 4167 5102 2887 2072 958 391 18233 1977 2153 2511 2283 2663 2645 3116 703
2018.06 65027 10401 4357 4837 4681 2819 2108 946 332 16439 1713 1820 2539 3103 2255 2723 2954 1000
In [56]:
# 한글폰트, 그래픽 크기 설정
pyplot.rcParams["font.family"] = 'AppleGothic'
pyplot.rcParams["font.size"] = 16
pyplot.rcParams["figure.figsize"] = (20, 10)
In [57]:
전치.plot()
pyplot.grid()
pyplot.legend(bbox_to_anchor=(1, 0.9))
pyplot.title("월별 시도별 부동산 거래량")
pyplot.xlabel("월")
pyplot.ylabel("거래량")
pyplot.show()
 
/Users/donut/opt/anaconda3/lib/python3.7/site-packages/pandas/plotting/_matplotlib/core.py:1192: UserWarning: FixedFormatter should only be used together with FixedLocator
  ax.set_xticklabels(xticklabels)
 
 

작업한 파일 저장하기

In [58]:
writer = ExcelWriter('부동산내역.xlsx')
전치.to_excel(writer, '부동산거래량원장')

writer.save()
 

마무리

전처리 연습을 위해 라이트하게 자료를 정리하였습니다.
대략 부동산 거래량이 언제 줄었고, 언제 다시 폭발적으로 증가했는지 파악이 가능했습니다.

추후에 해당 자료를 좀더 근사하게 가공 하도록 하겠습니다.

In [ ]: