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

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

💚 (목표) 원하는 모양으로 Grouping 하기.

✔ 칼럼 데이터 수정해서 새로운 칼럼 만들기.

일단 칼럼에 어떤 데이터 값이 있는지부터 확인하자.
그것을 확인해야, 어떻게 데이터를 수정해야할지 알 수 있기 때문이다.
unique 함수를 이용하자~!

df_last["규모구분"].unique()

✔ 칼럼 데이터 공백 제거하거나 다른 단어로 변경하기.

여기서는 문자열에서 사용하는 replace 함수를 이용해주었다.
문자열 함수에는

  • replace : 하나의 문자를 다른 문자로 변경하기.
  • rstrip : 오른쪽 공백 제거하기.
  • lstrip : 왼쪽 공백 제거하기.
  • strip : 양쪽 공백 제거하기.

✔ 위의 함수의 예시 코드

pd.Series(["aa", "bb", "cc", "ac"]).str.contains("a")
"  dks dwdk f fkekk fkkkkk  kkkkkkk    ".strip()
"  dks dwdk f fkekk fkkkkk  kkkkkkk    ".lstrip()
"  dks dwdk f fkekk fkkkkk  kkkkkkk    ".rstrip()

등이 있다. 자주 쓰이니까 잘 알아두기.

# 규모구분에서 초과 -> ~, 이하 -> "", "  " -> ""으로 변경한 뒤 전용면적 칼럼 만들어서 넣어주기.
df_last["규모구분"].head()
df_last["전용면적"] = df_last["규모구분"].str.replace("전용면적", "")
df_last["전용면적"].head()
df_last["전용면적"] = df_last["전용면적"].str.replace("초과", "~")
df_last["전용면적"] = df_last["전용면적"].str.replace("이하", "")
df_last["전용면적"] = df_last["전용면적"].str.replace(" ", "") # 빈 공간을 없애준다.
df_last["전용면적"].head()
df_last

✔ 필요없는 칼럼 제거하기.

  • 데이터 프레임 정보에 대해 확인하기.
df_last.info()
  • 필요없는 칼럼 제거하기. 이 때 반드시 axis 정해서 어떤 것을 어떤 방향으로 제거하는지 꼭 지정해주기~!
df_last_drop = df_last.drop(["규모구분", "분양가격(㎡)"], axis=1)
df_last_drop
  • 이렇게 한 뒤에 다시 .info를 찍어보면, 메모리가 줄어들은 것을 확인할 수 있다.

✔ Groupby로 데이터 집계하기.

  • 우리가 원하는 방식으로 데이터를 묶어낼 수 있다.
df_last.groupby(["지역명"])["분양가격"].mean().to_frame()
df_last.groupby(["연도", "월"])["분양가격"].median().to_frame()
df_last.groupby(["지역명", "연도"])["평당분양가격"].max().to_frame()
  • apply를 이용해서 grouping 할 수도 있다.
  • ✔ map을 이용해보니, 작동하지 않았다,,, apply만 가능하다~!
def f1(x):
    return np.mean(x)-np.std(x)
df_last.groupby(['지역명'])['분양가격'].apply(f1)
# 지역명에 따라 분양가격의 평균 - 분양가격의 표준편차를 계산한 값을 의미한다.

✔ np.nan이 처리되는 방식

NaN 값은 제외하고 함수를 적용한다. NaN은 0이 아니다.

✔ Groupby + Unstack : multi-index인 경우만 가능

  • unstack() : 맨 마지막에 있는 칼럼이 위로 올라간다.
  • unstack(0) : 맨 앞에 있는 칼럼이 위로 올라간다.
  • unstack() -> unstack() : 2번 반복해주면 다시 원상 복귀된다.
  • 순서를 지켜서 인덱싱하면 가져올 수 있다.
d2.loc["one"] # 행이 one인 것들을 다 가져오기
d2.loc['one','a'] # 순서를 지켜서 인덱싱하기
  • 없는 경우는 NaN을 가지고 온다.
  • round 함수를 이용해서 내가 원하는 소수점 자리 수까지 가져올 수 있다.
df_last.groupby(["전용면적", "지역명"])["평당분양가격"].mean().unstack().round()

df_last.groupby(["전용면적", "지역명"])["평당분양가격"].mean().unstack().round(1)

# multi index인 경우에만 unstack이 가능하다..!

✔ Pivot_table로 데이터 집계하기.

  • groupby에서 하던 행위를 pivot_table에서 똑같이 할 수 있다.
  • 여기서 조금 추가되는 내용은, 두 가지 value를 가져오는 경우에 서로 다른 계산 함수를 적용할 수 있다.
  • ✔ groupby 같은 경우는 1가지 값만 가져온다. 인덱스는 상관없다.
df_last.groupby(["지역명"])["평당분양가격"].mean().to_frame()
pd.pivot_table(df_last, index = ["지역명", "연도"], values = "평당분양가격", aggfunc=np.mean)

df1=pd.pivot_table(df_last, index=["전용면적","연도"], aggfunc={'평당분양가격': np.mean, '분양가격': np.max}) 
# aggfunc = {원하는 데이터 칼럼명 : 원하는 계산 메소드} 여러 데이터 -> 사전으로 적기.
df1

df2=pd.pivot_table(df_last, index=["전용면적","월"], aggfunc={'평당분양가격': np.min, '분양가격': np.max}) 
# aggfunc = {원하는 데이터 칼럼명 : 원하는 계산 메소드} 여러 데이터 -> 사전으로 적기.
df2

✔ np.nan이 처리되는 방식

pivot_table에서도 NaN을 처리하는 방식은 groupby와 동일하다.

  • NaN은 0이 아니다!
  • 없는 경우에는 NaN을 출력한다.

✔ Pivot_table + unstack : multi-index인 경우만 가능

df_last.pivot_table(index=["전용면적","지역명"], values="평당분양가격")
t1=df_last.pivot_table(index=["전용면적","지역명"], values="평당분양가격").unstack().round()
t1 # multi-index
t1["평당분양가격", "강원"]

✔ Pivot_table + columns : Unstack 대신에 사용 가능

  • 더 보기에 깔끔하다. -> 위의 인덱스가 사라지기 때문이다.
  • 한 줄로 작성되어서 코드가 깔끔하다.
df_last.pivot_table(index=["전용면적", "지역명"], values="평당분양가격", aggfunc=np.mean).round()

print("### Unstack 이용하지 않고, columns 이용하기. ###")
df_last.pivot_table(index="전용면적", columns="지역명", values="평당분양가격", aggfunc=np.mean).round()
  • 인덱스가 연도와 지역명이고, 값이 평당분양가격의 평균은 데이터 프레임에서 2017년 자료 가져오기.
    ✔ 방법 1은 columns를 사용하지 않고 가져오고, 방법 2는 columns를 사용해서 가져왔다.
## 방법 1
p = pd.pivot_table(df_last, index=["연도", "지역명"], values="평당분양가격")
p.head()
p.loc[2017]

## 방법 2
p = pd.pivot_table(df_last, index="지역명", columns= "연도", values="평당분양가격")
p.head()
p[2017] # Series 형태로 등장한다.
p[[2017]] # DataFrame 형태로 등장한다.

✔ Pandas로 시각화하기.

  • 폰트 설정하기.
# 한글 폰트 사용을 위한 코드
plt.rc("font", family="Malgun Gothic") # window
#plt.rc("font", family="AppleGothic") # mac
  • 그래프를 그리고자 하는 자료를 내가 원하는 방식을 만들어내기.
    : 지역명에 따라 평당분양가격의 평균을 내림차순으로 정렬하였다.
g = df_last.groupby(["지역명"])["평당분양가격"].mean().sort_values(ascending=False) # 내림차순
g

✔ plot

fig = plt.figure(figsize=(10,5), dpi=100)
ax = fig.subplots()
_=g.plot()

fig=plt.figure(figsize=(10,5), dpi=100) # dpi는 선명도를 높여주는 역할을 한다.
ax=fig.subplots()

_=g.plot()
_=plt.xticks(ticks=np.arange(len(g)), labels=g.index) # g.index를 라벨로 이용하기.
# xticks를 이용해서 y값과 맞춰주기.

✔ bar

fig=plt.figure(figsize=(15,5), dpi=100) 
ax1, ax2=fig.subplots(1,2)

_=g.plot(kind='bar', ax=ax1) # 90도 기울어져 있다.
_=g.plot(kind='bar', rot=0, ax=ax2) # 보기 좋게 출력된다.
_=ax1.set_title("평당분양가격")
_=ax2.set_title("평당분양가격")

✔ 여러 개의 도화지 생성하기.

fig=plt.figure(figsize=(5,5), dpi=200) # dpi는 선명도를 높여주는 역할을 한다.
ax=fig.subplots(2,2)

✔ hist

fig=plt.figure(figsize=(10,5), dpi=100) # dpi는 선명도를 높여주는 역할을 한다.
ax=fig.subplots()

_=g.plot(kind='hist', figsize=(10, 3), title='평당분양가격')

✔ boxplot

fig=plt.figure(figsize=(10,5), dpi=100) # dpi는 선명도를 높여주는 역할을 한다.
ax=fig.subplots()

_=g.plot(kind='box', figsize=(5, 5))

좋은 웹페이지 즐겨찾기