현재의 컬럼명을 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()는 데이터 프레임의 한 행을 한 줄씩 가져올 수 있다.
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);
✏️ 그래프 한 줄로 작성할 줄 아는 능력치 요구