티스토리 뷰

이전까지 공부했던 numpy와 pandas를 활용하여 데이터 전처리를 해봅시다 :)


- 공공데이터 포털(https://www.data.go.kr/)에서 제공하는 데이터를 활용

- 민간 아파트 가격동향 데이터(http://bit.ly/ds-house-price)를 이용

 

🌟 /// Error 메세지를 잘 확인해서 전처리를 이어가자 /// 🌟

 


우선 모듈을 불러오겠습니다.

import pandas as pd

 

 

 

오늘 이용할 데이터셋을 불러오겠습니다.

df = pd.read_csv('http://bit.ly/ds-house-price') # df에 저장

 

 

 

데이터셋을 우선 살펴보겠습니다.

df

out::::

- 5개의 컬럼과 4505개의 데이터가 있음

- 컬럼은 '지역명', '규모구분', '연도', '월', '분양가격(m^2)' 가 있음

 

df.info()

out::::

- 컬럼별로 데이터 타입을 확인할 수 있음

- 4505개의 enries로 보았을 때, 이보다 적은 분양가격(m^2)에는 결측치가 있음을 알 수 있음

 

 

 

컬럼명 중 '분양가격(m^2)'에 특수문자가 있기 때문에 편의를 위해 컬럼명을 변경해주겠습니다.

# columns명 바꾸기
df = df.rename(columns={'분양가격(㎡)':'분양가격'})

 

 

 

분양가격의 데이터타입은 object입니다. 여러 통계 연산을 할 떄 편의를 위해 int 타입으로 변경해주겠습니다.

# 분양가격을 int로 변환
df['분양가격'].astype(int) # 공백문자가 있어서 error

out::::

ValueError: invalid literal for int() with base 10: '  '

공백문자 때문에 에러가 났다고 하니 공백문자를 없애봅시다.

 

 

strip() 함수를 이용해서 데이터의 공백을 삭제해줍니다.

# strip()를 사용해서 공백이 있는 데이터의 공백을 삭제
df['분양가격'] = df['분양가격'].str.strip() # 양쪽에 있는 공백을 제거해서 다시 저장

이제 다시 데이터타입을 변경해봅시다.

df['분양가격'].astype(int) # ValueError: invalid literal for int() with base 10: ''

out::::

ValueError: invalid literal for int() with base 10: ''

이번에는 또 데이터가 없는 데이터 때문에 에러가 났다고 알려줍니다.

다시한번 알려준대로 전처리를 해봅시다.

 

 

loc[]를 이용해봅시다.

# 데이터가 없는 경우는 0을 채워줌
df.loc[df['분양가격']=='', '분양가격'] = 0

이제 다시 또 데이터타입을 변경해봅시다.

df['분양가격'].astype(int) # ValueError: cannot convert float NaN to integer

out::::

ValueError: cannot convert float NaN to integer

😂😂😂이번에는 또 결측치 때문에 데이터 타입 변환을 할 수 없다고 합니다.

다시한번더...전처리를 해봅시다.

 

 

# NaN 을 0으로 변환
df['분양가격'] = df['분양가격'].fillna(0)

다시 또 데이터 타입 변환을 해봅시다.

df['분양가격'].astype(int) # ValueError: invalid literal for int() with base 10: '6,657'

out::::

ValueError: invalid literal for int() with base 10: '6,657'

 

 

 

이번에는 ',' 때문에 변환이 안 된다고 합니다. ','을 ''로 바꿔줍시다.

 

 

 

# 콤마를 제거
df['분양가격'] = df['분양가격'].str.replace(',', '')

이제는 되길 바라면서.....

df['분양가격'].astype(int)

out::::

ValueError: invalid literal for int() with base 10: '  '

^_^ 계속 알려주는대로 수행해보겠습니다.

 

# strip()를 사용해서 공백이 있는 데이터의 공백을 삭제
df['분양가격'] = df['분양가격'].str.strip() # 양쪽에 있는 공백을 제거해서 다시 저장
df['분양가격'].astype(int)

out::::

ValueError: invalid literal for int() with base 10: '-'

 

 

 

 

 

 

 

 

 

 

# '-'을 제거
df['분양가격'] = df['분양가격'].str.replace('-','')
df['분양가격'].astype(int)

out::::

ValueError: cannot convert float NaN to integer

 

 

 

df['분양가격'] = df['분양가격'].fillna(0)
df['분양가격'].astype(int)

out::::

ValueError: invalid literal for int() with base 10: ''

 

 

 

 

df.loc[df['분양가격']=='', '분양가격'] = 0
df['분양가격'].astype(int)

out::::

 

 

드디어 제대로 데이터 타입 변환이 되었습니다.

 

 

 

 

 

 

 

다시한번 info를 확인해보겠습니다.

df.info()

out::::

 

 

 

'분양가격'의 데이터타입이 object에서 int로 잘 변환된 것을 다시한번 확인할 수 있습니다.

 

 

 

 

 

'규모구분' 컬럼의 데이터를 확인해보겠습니다.

df['규모구분']

out::::

 

 

모든 데이터에 '전용면적'이라는 문자는 분석 시 불필요해보입니다.

이 문자열을 ''로 바꿔주겠습니다.

 

 

 

 

# 규모구분 column에 불필요한 '전용면적' 글자 삭제
df['규모구분'] = df['규모구분'].str.replace('전용면적 ','')

 

 

 

전처리는 이것으로 끝났고, 몇가지 통계값을 확인해보겠습니다.

  • 규모구분에서 count
df['규모구분'].value_counts()

out::::

 

  • 지역명별로 평균 분양가격을 확인
# 지역명별로 평균 분양가격을 확인
df.groupby('지역명')['분양가격'].mean()

out::::

 

 

  • 지역별 가장 비싼 분양가
# 지역별 최고 비싼 분양가
df.groupby('지역명')['분양가격'].max()

out::::

 

 

  • 연도별 분양가격의 평균
df.groupby('연도')['분양가격'].mean()

 


여기까지 데이터 전처리 활용 및 수행을 해보았습니다 :)

728x90
LIST
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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
글 보관함