전국 아파트 분양가 분석하기 (1)

💗 전국 아파트 분양가 분석하기 (1)

✔ 서버가 터져서 오늘은 깃허브에 올리지 못했다~! 서버가 복구될 때까지 기다리기.

✔ 1. 가상환경에 접속하여 원하는 파일로 Jupyter Notebook 켜기.

(base) C:\Users\dlwlr>conda activate sn2022

(sn2022) C:\Users\dlwlr>cd C:\Users\dlwlr\OneDrive\바탕 화면\USW 22 SS\쇼셜네트워크분석\3w

(sn2022) C:\Users\dlwlr\OneDrive\바탕 화면\USW 22 SS\쇼셜네트워크분석\3w>jupyter notebook

💜 (목표) 평당분양가격 구하기.

평당분양가격 구하기. 평당분양가격 = 분양가격 * 3.3

✔ 2. 필요한 패키지 불러오기.

# 사용할 패키지를 import합니다
import sys
print('python', sys.version)

import numpy as np
print('numpy', np.__version__)

import pandas as pd
print('pandas', pd.__version__)

import matplotlib as mpl
print('matplotlib', mpl.__version__)

import matplotlib.pyplot as plt

import seaborn as sns
print('pandas', sns.__version__)

# 결과 확인을 용이하게 하기 위한 코드
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = 'all'

# # 경고 메시지는 출력되지 않게 합니다.
# import warnings
# warnings.filterwarnings("ignore")

✔ 3. 데이터 로드하기.

df_last = pd.read_csv("전국평균 분양가격 (2015년10월_2019년12월).csv", sep=",", encoding="cp949")
df_first = pd.read_csv("전국평균 분양가격 (2013년12월_2015년8월).csv", sep=",", encoding="cp949")

➕ 데이터 shape도 확인할 수 있다.

df_last
df_last.shape
df_first
df_first.shape

✔ 4. 데이터 일부분 미리보기.

head나 tail을 사용하거나, iloc을 이용해서 원하는 부분을 가져올 수 있다.

df_last.head()
df_last.iloc[:5]

df_last.tail()
df_last.iloc[-5:]

df_first.head()
df_first.iloc[:5]

df_first.tail()
df_first.iloc[-5:]

✔ 5. 데이터 요약하기.

df_last.info()
df_first.info()

✔ 5-1. object type data

a = ["12", "wer", 12, 12.948]
ar1 = np.array(a)
ar1
type(ar1)
ar1[1]

sr1 = pd.Series(a)
sr1
type(sr1)
sr1.loc[0]
sr1.iloc[-1]

for ii in ar1:
    type(ii) # string
# array의 요소들은 모두 string이다.
    
for ii in sr1:
    type(ii) # string, int, float
# series의 요소들은 본인들의 타입을 가지고 있다.
  • Array : 배열의 모든 요소는 String 이다.
  • Series : 시리즈의 모든 요소는 본인들의 타입을 가지고 있다.
    여기서 주의할 점은 np.nan은 float 이다.
sr1 = pd.Series([np.nan, 12.094, 19])
sr1

for ii in sr1:
    type(ii) # float
# 모두 float가 나온다.
# nan도 float이다.

✔ 6. 결측치 찾아내기.

df_last.isnull() # null : true
df_last.notnull() # null이 아닌 것 : true

df_last.isnull().sum()
df_last.notnull().sum()

➕ df_first를 해봤는데 너무너무 깨끗하다. 결측치가 하나도 없었다.
➕ sum에 axis를 지정해주면 원하는 방향 으로 값을 구해낼 수 있다.

df_last.isna().sum(axis=0) # 기본 전제
df_last.isna().sum(axis=1)

✔ 6-1. 데이터 손실이 큰 방법으로 결측치 찾아내기.

  • pd.to_numeric
  1. errors = "raise" : 기본 전제이다. 그냥 numeric이 불가능한 값이 나오면 Error가 뜬다.
  2. errors = "ignore" : numeric이 불가능한 값이 나오면 무시한다.
  3. errors = "coerce" : numeric이 불가능한 값이 나오면 NaN이 나온다.
pd.to_numeric(pd.Series(["wer", "123", "12,456", 12, 12.3049]), errors="raise")
# If 'raise', then invalid parsing will raise an exception.

pd.to_numeric(pd.Series(["wer", "123", "12,456", 12, 12.3049]), errors="ignore")
# If 'ignore', then invalid parsing will return the input.

pd.to_numeric(pd.Series(["wer", "123", "12,456", 12, 12.3049]), errors="coerce")
# If 'coerce', then invalid parsing will be set as NaN.

위와 같은 방법을 써서 이용하자~!

df_last["분양가격"] = pd.to_numeric(df_last["분양가격(㎡)"], errors="coerce")
df_last
df_last["분양가격(㎡)"].isnull().sum()
df_last["분양가격"].isnull().sum()
# 뭔가 섞인 것들을 NaN으로 바꾸었기 때문에, 더 많아졌다. 결국, 데이터 손실이 많아졌다.

✔ 6-2. 데이터 손실이 비교적 작은 방법으로 결측치 찾아내기.

  • object type의 Series는 여러 종류의 데이터를 가질 수 있다.
    이러한 object Series의 특성을 이용하자~!
sr1 = pd.Series([np.nan, 12, 45, "234", "444"])
for ii in sr1:
    type(ii)

💜 결측치 찾아내는 방법의 과정 2 Steps

  • (사실 1) NaN은 자기 자신과 같지 않다.
np.nan == np.nan # False
# NaN은 자기 자신이 서로 같지 않다.

1 == 1
10.34 == 10.34
"we" == "we"
  • (사실 2) 문자열에서 isdigit를 이용하면 숫자로 구성되어 있는지, 그 외의 것으로도 구성되어 있는지 확인할 수 있다.
# 문자열이 숫자로만 구성되어 있는가?
"12345".isdigit() # True
"123,456".isdigit() # False
  • (Step 1) NaN과 NaN이 아닌 값들을 구분하기.
  • (Step 2) NaN이 아닌 값이고 numeric이 가능한 값들은 float로 만들어주기.
for ii in df_last["분양가격(㎡)"]:
    if ii != ii:
        continue # 아래 코드를 실행하지 않고 모두 건너뛰기.
    if ii.isdigit() == False:
        ii # 공백, ",", "-"

💜 결측치 찾아내는 방법의 최종 코드 : map 이용하기.

def f1(ii):
    if ii != ii: # NaN인 경우에 모두 건너뛰기.
        return np.nan
    ii = ii.replace(",", "")
    # ,가 들어간 데이터들은 ,를 모두 없애주기.
    if ii.isdigit() == True:
    # 만약에 numeric으로 바꿀 수 있는 경우
        return float(ii)
    return np.nan # 그게 아니면 NaN으로 만들어주기.

"""
f1("12,3")
f1(np.nan)
f1("12,446")
"""

df_last["분양가격"] = df_last["분양가격(㎡)"].map(f1)
df_last

✔ 이러한 과정을 하는 이유
NaN 값 중에서도 아예 못 쓰는 값들만 있는 것이 아니기 때문에, 이런 식으로 NaN 값 안에 무엇이 있는지 확인해보면서 살릴 수 있는 데이터 값은 살려준다.

df_last["분양가격(㎡)"].isnull().sum()
df_last["분양가격"].isnull().sum()
# NaN의 개수가 그렇게 많이 늘지는 않았다. 
# NaN 중에서도 살릴 수 있는 값들은 살린 셈이다. 

✔ 7. 평당 분양가격 구해내기.

# 분양가격을 실수로 변경해주었으니, 수 처리가 가능해진다.
# 평당 분양가격 = 분양가격 * 3.3

df_last["평당분양가격"] = df_last["분양가격"]*3.3
df_last

✔ 8. 데이터 수치상으로 요약하기.

df_last["분양가격"].describe()
df_last["분양가격"].value_counts()

df_last["분양가격(㎡)"].describe()
df_last["분양가격(㎡)"].value_counts()

df_last["평당분양가격"].describe()
df_last["평당분양가격"].value_counts()

df_last.describe()

좋은 웹페이지 즐겨찾기