본문 바로가기
Python/데이터 분석 예제

서울시 구별 병원 현황 분석 - 데이터 병합 및 그래프 분석

by 지식광부키우기 2019. 9. 26.

 

병원 데이터와 인구 데이터 '구별' 기준으로 병합하기 

data_result = pd.merge(HOS_Seoul, pop_Seoul, on='구별')
data_result.head()

그림1

 

병원 수 데이터와 인구수 데이터를 구를 기준으로 병합해주었습니다.

 

 

사용하지 않을 열 삭제하기 

del data_result['2015년도 이전']
del data_result['2016년']
del data_result['2017년']
del data_result['2018년']
data_result.head()

그림2

 

사용하지 않을 연도 별 병원 수는 삭제해주겠습니다.

 

열 삭제 명령은 del을 사용합니다.

 

 

부분 인덱스를 설정해주기 

data_result.set_index('구별', inplace=True)
data_result.head()

그림3

 

'구별'을 기준으로 인덱스를 한 번 더 설정해 줬습니다. 

 

 

상관관계 보기 

np.corrcoef(data_result['고령자비율'],data_result['소계'])

그림4

 

고령자비율과 병원 수의 상관계수는 위와 같습니다. 음의 상관관계를 가집니다.

 

np.corrcoef(data_result['인구수'],data_result['소계'])

그림5

 

인구 수와 병원 수의 상관관계는 위와 같습니다. 양의 상관관계를 가집니다.

 

 

데이터 인덱스 정해서 정렬하기

data_result.sort_values(by='소계', ascending=False).head(5)

그림6

 

병원 수를 기준으로 내림차순 정렬했습니다. 강남구가 압도적으로 병원 수가 많습니다.

 

data_result.sort_values(by='인구수', ascending=False).head(5)

그림7

 

인구수를 기준으로 내림차순 정렬했습니다. 송파구가 인구가 가장 많습니다.

 

 

시각화 한글 에러 방지 설정해주기

import platform

from matplotlib import font_manager, rc
plt.rcParams['axes.unicode_minus'] = False

if platform.system() == 'Darwin':
    rc('font', family='AppleGothic')
elif platform.system() == 'Windows':
    path = "c:/Windows/Fonts/malgun.ttf"
    font_name = font_manager.FontProperties(fname=path).get_name()
    rc('font', family=font_name)
else:
    print('Unknown system... sorry~~~~')

 

시각화 시 한글을 쓸 때 에러가 나는 것을 방지하는 코드입니다.

 

 

matplotlib import 하기

import matplotlib.pyplot as plt
%matplotlib inline

 

matplotlib을 import 해주고 jupyter에서 나타날 수 있게 % matplotlib inline을 추가로 넣어줍니다.

 

 

막대그래프 그리기

plt.figure()
data_result['소계'].plot(kind='barh', grid=True, figsize=(10,10))
plt.show()

그림8

 

그래프를 그려주는데 종류는 가로 bar로 설정해줍니다. 격자도 넣어주고, 사이즈도 정해줍니다. 

 

보기 좋게 정렬해주겠습니다.

 

data_result['소계'].sort_values().plot(kind='barh', 
                                     grid=True, figsize=(10,10))
plt.show()

그림9

 

많은 순서대로 위쪽부터 보이게 정렬해주었습니다.

 

data_result['HOS비율'] = data_result['소계'] / data_result['인구수'] * 100

data_result['HOS비율'].sort_values().plot(kind='barh', 
                                         grid=True, figsize=(10,10))
plt.show()

 

그림10

 

새롭게 인구 수 대비 병원 수 비율을 구한 다음 그래프에 반영합니다.

 

강남구, 중구, 종로구, 서초구가 인구 수 대비 병원 수가 4배 정도 많습니다.

 

 

산포도 그리기

plt.figure(figsize=(6,6))
plt.scatter(data_result['인구수'], data_result['소계'], s=50)
plt.xlabel('인구수')
plt.ylabel('HOSPITAL')
plt.show()

그림11

 

그래프 종류를 scatter로 설정합니다. s = 50은 동그라미 크기를 의미합니다.

 

 

회귀 직선 만들기

fp1 = np.polyfit(data_result['인구수'], data_result['소계'], 1)
fp1

그림12

 

직선을 구성하는 기울기와 절편을 구해주었습니다. 이를 위해 polyfit 명령을 사용하였습니다.

 

polyfit에서 세번째 인자는 함수의 차수를 의미합니다.

 

f1 = np.poly1d(fp1)
fx = np.linspace(100000, 700000, 100)

 

polyld로 일차식을 표현해주고 linspace로 범위를 지정해줍니다.

 

plt.figure(figsize=(10,10))
plt.scatter(data_result['인구수'], data_result['소계'], s=50)
plt.plot(fx, f1(fx), ls='dashed', lw=3, color='g')
plt.xlabel('인구수')
plt.ylabel('HOSPITAL')
plt.show()

그림13

 

회귀 직선까지 그래프에 표현해주었습니다. lw 옵션은 line width로 선 굵기를 조정할 수 있습니다.

 

 

오차항 추가하기

fp1 = np.polyfit(data_result['인구수'], data_result['소계'], 1)

f1 = np.poly1d(fp1)
fx = np.linspace(100000, 700000, 100)

data_result['오차'] = np.abs(data_result['소계'] - f1(data_result['인구수']))

df_sort = data_result.sort_values(by='오차', ascending=False)
df_sort.head()

그림14

 

직선과 실제 데이터의 오차의 절댓값을 구하고 데이터에 추가해줬습니다.

 

 

최종 그래프

plt.figure(figsize=(14,10))
plt.scatter(data_result['인구수'], data_result['소계'], 
            c=data_result['오차'], s=50)
plt.plot(fx, f1(fx), ls='dashed', lw=3, color='g')

for n in range(10):
    plt.text(df_sort['인구수'][n]*1.02, df_sort['소계'][n]*0.98, 
             df_sort.index[n], fontsize=15)
    
plt.xlabel('인구수')
plt.ylabel('HOSPITAL')
plt.colorbar()
plt.show()

그림15

 

좀 더 그럴듯한 그래프를 만들어줬습니다. scatter에서 c 옵션으로 마커의 색상을 오차에 따라 다르게 설정해주었습니다.

 

text 함수를 통해 해당 좌표에 comment를 추가했습니다. 

 

강남구의 경우 인구 대비 병원 수가 엄청 많습니다. 서초구도 많다고 볼 수 있고 

 

강서구, 노원구, 은평구는 인구에 비해 병원 수가 적다고 할 수 있습니다.

댓글