EDA TEST | 서울시 인구 데이터

소리·2023년 11월 17일
0

현재의 컬럼명을 NEW_COLUMS와 같이 변경

  • current_columns = ['기간', '자치구', '세대', '인구', '인구.1', '인구.2', '인구.3', '인구.4', '인구.5', '인구.6', '인구.7', '인구.8', '세대당인구', '65세이상고령자']

  • new_columns = ['기간', '자치구', '세대', '합계', '남자', '여자', '한국인 계', '한국인 남자', '한국인 여자', '등록외국인 계', '등록외국인 남자', '등록외국인 여자', '세대당인구', '65세이상고령자']

df_target.columns =  ['기간', '자치구', '세대', '합계', '남자', '여자', '한국인 계', '한국인 남자', '한국인 여자', '등록외국인 계', '등록외국인 남자', '등록외국인 여자', '세대당인구', '65세이상고령자']
df_target

✏️ 그냥 새 컬럼명을 columns에 주면 된다. 이 때 컬럼의 길이가 같아야 한다.

천단위 구분자 " , "를 제거하고, data의 type을 int 또는 float으로 변경

1)

df_change = df_target.iloc[:, 2:] 

for col in df_change.columns:
  if col == '세대당인구':
    df_target[col] = df_target[col].str.replace(',' ,'').astype('float64')
  else:
    df_target[col] = df_target[col].str.replace(',' ,'').astype('int64')

df_target.info()

2)

target_cols = ['세대', '합계', '남자', '여자', '한국인 계', '한국인 남자', '한국인 여자', '등록외국인 계', '등록외국인 남자', '등록외국인 여자', '65세이상고령자']
df_target[target_cols] = df_target[target_cols].apply(axis=1, func=lambda col: col.str.replace(',', '').astype(int))
df_target['세대당인구'] = df_target['세대당인구'].astype(float)

✏️ astype을 활용할 줄 아는 것이 포인트, 1번은 if 절을 써서 코드가 길었다면 2번은 apply를 써서 한 줄로 끝냈다. 이 때 axis와 func을 따로 줄 수 있다!
apply를 적절할 때 생각하지 못하는 나

1단계에서 구한 DataFrame에 '권역' column을 추가하여 해당 구에 맞는 권역을 입력

1)

df_target['권역'] = '서울'

dicKey = list(region_dict.keys())
dicVal = list(region_dict.values())

for i in range(len(df_target)):
  for j in range(len(dicKey)):
    if df_target['자치구'][i] in dicVal[j]:
      df_target['권역'][i] = dicKey[j]
    else:
      continue

df_target

2)

gu_dict = {gu: region for region, gu_list in region_dict.items() for gu in gu_list}

for idx, row in df_target.iterrows():
    df_target.loc[idx, '권역'] = gu_dict[row['자치구']]

✏️둘다 dictionary의 특징을 써서 .keys(), .values(), .items()를 썼다. 2번 처럼 comprehension을 쓰는 방법을 좀 체화하고, items로 keys와 values를 따로 사용하지 않을 수 있음.
✏️ iterrows()는 데이터 프레임의 한 행을 한 줄씩 가져올 수 있다.

iterrows_vs_enumerate

2-1에서 만든 DataFrame을 이용하여 Pandas의 pivot_table 메소드를 활용하여 각 권역별 아래 값의 합을 구하고, '합계'를 기준으로 내림차순 정렬

df_pivot = pd.pivot_table(df_target, index = '권역', values =  ['합계', '세대', '여자', '한국인 계', '등록외국인 계', '65세이상고령자'], aggfunc = sum)
df_pivot.sort_values('합계', ascending = False, inplace = True)

✏️pandas.pivot_table(data, values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All', observed=False, sort=True) [출처](https://pandas.pydata.org/docs/reference/api/pandas.pivot_ta
ble.html)

2-2에서 만든 Pivot Table을 이용하여 각 권역별 ['고령자비율', '외국인비율', '여성비율', '세대당인구'] 컬럼을 만들어 아래와 같이 값을 입력하고 '외국인비율'을 기준으로 오름차순 정렬

df_pivot['고령자비율'] = df_pivot['65세이상고령자'] / df_pivot['합계'] * 100
df_pivot['외국인비율'] = df_pivot['등록외국인 계'] / df_pivot['합계'] * 100
df_pivot['여성비율'] = df_pivot['여자'] / df_pivot['합계'] * 100
df_pivot['세대당인구'] = (df_pivot['합계'] - df_pivot['등록외국인 계']) / df_pivot['세대']

df_pivot.sort_values('외국인비율', ascending=True, inplace=True)

2-1에서 만든 DataFrame을 이용하여 각 구별 ['고령자비율', '외국인비율', '여성비율'] 컬럼을 만들어 아래와 같이 값을 입력하고 '세대당인구'을 기준으로 내림차순 정렬

df_target['고령자비율'] = df_target['65세이상고령자'] / df_target['합계'] * 100
df_target['외국인비율'] = df_target['등록외국인 계'] / df_target['합계'] * 100
df_target['여성비율'] = df_target['여자'] / df_target['합계'] * 100


df_target.sort_values('세대당인구', ascending = False, inplace = True)

2-3에서 만든 DataFrame을 이용하여 ['고령자비율', '외국인비율', '여성비율', '세대당인구']간의 피어슨 상관계수 행렬(Correlation matrix)

pivot_corr = df_pivot[['고령자비율', '외국인비율', '여성비율', '세대당인구']].corr()

시각화

# 한글 설정
import matplotlib.pyplot as plt
import seaborn as sns
import platform
from matplotlib import font_manager, rc

import matplotlib.pyplot as plt
import seaborn as sns
import platform
from matplotlib import font_manager, rc

get_ipython().run_line_magic("matplotlib", "inline")

f_path = 'C:\Windows\Fonts/malgun.ttf'
font_manager.FontProperties(fname=f_path).get_name()
rc('font', family='Malgun Gothic')

자치구별 고령자비율을 내림차순에 따라 barh 그래프로 시각화

1)

# 3-1: barh
plt.figure(figsize=(8, 6))
df_barh = df_target.set_index('자치구')
df_barh["고령자비율"].sort_values().plot(kind="barh")

2)

df_target.sort_values(by='고령자비율', ascending=True).plot(x='자치구', y='고령자비율', kind='barh', grid=True, figsize=(10,10))

권역별 등록외국인 계를 PIE chart로 시각화

1)

plt.figure(figsize=(8, 10))
fig, ax = plt.subplots()

pieRawdata = df_target.groupby('권역').sum()['등록외국인 계']
plt.pie(pieRawdata, labels = pieRawdata.index)
plt.legend(loc= 'lower right', bbox_to_anchor=(1.5,0.5))
plt.show()

2)

df_pivot.sort_values(by='등록외국인 계', ascending=True).plot(y='등록외국인 계', kind='pie', grid=True, figsize=(10,10))

✏️ subplot 등을 배웠음에도 개념이 잘 정립되지 않아서 그래프가 그려지지 않아서 헤맴. 다시 이부분 공부가 필요

권역별 외국인비율을 Box plot으로 시각화

1)

# 3-3: Boxplot
boxRawdata = df_target[['권역','외국인비율']]
regions = boxRawdata['권역'].unique()

dataByRegion = []
for region in regions:
    dataByRegion.append(boxRawdata[boxRawdata['권역'] == region]['외국인비율'])
    
plt.figure(figsize=(10, 10))
plt.boxplot(dataByRegion, labels = regions)
plt.grid()

2)

df_target.boxplot(by='권역', column='외국인비율', fontsize=15, figsize=(10,10))

자치구별 외국인비율-세대당인구를 Scatter plot에 나타내고, 상관관계에 따른 Regression Line을 시각화

1)

plt.figure(figsize=(12, 8))
x = df_target.groupby('자치구')['외국인비율'].mean() 
y = df_target.groupby('자치구')['세대당인구'].mean()

plt.grid()
plt.scatter(x=x, y=y, s=100)
plt.xlabel('외국인비율')
plt.ylabel('세대당인구')

fp1 = np.polyfit(x, y, 1)
f1 = np.poly1d(fp1)
fx = np.linspace(0, 9, 8)
plt.plot(fx, f1(fx))

plt.show()

2)

import seaborn as sns
sns.lmplot(data=df_target, x='외국인비율', y='세대당인구', height=9);

✏️ 그래프 한 줄로 작성할 줄 아는 능력치 요구

profile
데이터로 경로를 탐색합니다.

0개의 댓글