병원 데이터와 인구 데이터 '구별' 기준으로 병합하기
data_result = pd.merge(HOS_Seoul, pop_Seoul, on='구별')
data_result.head()
병원 수 데이터와 인구수 데이터를 구를 기준으로 병합해주었습니다.
사용하지 않을 열 삭제하기
del data_result['2015년도 이전']
del data_result['2016년']
del data_result['2017년']
del data_result['2018년']
data_result.head()
사용하지 않을 연도 별 병원 수는 삭제해주겠습니다.
열 삭제 명령은 del을 사용합니다.
부분 인덱스를 설정해주기
data_result.set_index('구별', inplace=True)
data_result.head()
'구별'을 기준으로 인덱스를 한 번 더 설정해 줬습니다.
상관관계 보기
np.corrcoef(data_result['고령자비율'],data_result['소계'])
고령자비율과 병원 수의 상관계수는 위와 같습니다. 음의 상관관계를 가집니다.
np.corrcoef(data_result['인구수'],data_result['소계'])
인구 수와 병원 수의 상관관계는 위와 같습니다. 양의 상관관계를 가집니다.
데이터 인덱스 정해서 정렬하기
data_result.sort_values(by='소계', ascending=False).head(5)
병원 수를 기준으로 내림차순 정렬했습니다. 강남구가 압도적으로 병원 수가 많습니다.
data_result.sort_values(by='인구수', ascending=False).head(5)
인구수를 기준으로 내림차순 정렬했습니다. 송파구가 인구가 가장 많습니다.
시각화 한글 에러 방지 설정해주기
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()
그래프를 그려주는데 종류는 가로 bar로 설정해줍니다. 격자도 넣어주고, 사이즈도 정해줍니다.
보기 좋게 정렬해주겠습니다.
data_result['소계'].sort_values().plot(kind='barh',
grid=True, figsize=(10,10))
plt.show()
많은 순서대로 위쪽부터 보이게 정렬해주었습니다.
data_result['HOS비율'] = data_result['소계'] / data_result['인구수'] * 100
data_result['HOS비율'].sort_values().plot(kind='barh',
grid=True, figsize=(10,10))
plt.show()
새롭게 인구 수 대비 병원 수 비율을 구한 다음 그래프에 반영합니다.
강남구, 중구, 종로구, 서초구가 인구 수 대비 병원 수가 4배 정도 많습니다.
산포도 그리기
plt.figure(figsize=(6,6))
plt.scatter(data_result['인구수'], data_result['소계'], s=50)
plt.xlabel('인구수')
plt.ylabel('HOSPITAL')
plt.show()
그래프 종류를 scatter로 설정합니다. s = 50은 동그라미 크기를 의미합니다.
회귀 직선 만들기
fp1 = np.polyfit(data_result['인구수'], data_result['소계'], 1)
fp1
직선을 구성하는 기울기와 절편을 구해주었습니다. 이를 위해 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()
회귀 직선까지 그래프에 표현해주었습니다. 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()
직선과 실제 데이터의 오차의 절댓값을 구하고 데이터에 추가해줬습니다.
최종 그래프
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()
좀 더 그럴듯한 그래프를 만들어줬습니다. scatter에서 c 옵션으로 마커의 색상을 오차에 따라 다르게 설정해주었습니다.
text 함수를 통해 해당 좌표에 comment를 추가했습니다.
강남구의 경우 인구 대비 병원 수가 엄청 많습니다. 서초구도 많다고 볼 수 있고
강서구, 노원구, 은평구는 인구에 비해 병원 수가 적다고 할 수 있습니다.
'Python > 데이터 분석 예제' 카테고리의 다른 글
구글 맵스 API 이용 방법 (0) | 2019.10.01 |
---|---|
서울시 구별 병원 현황 분석 - pandas로 데이터 파악 및 전처리 하기 (0) | 2019.09.24 |
서울시 구별 병원 현황 분석 - csv 데이터 변환하기 (0) | 2019.09.23 |
서울시 구별 병원 현황 분석 - 데이터 구하기 (0) | 2019.09.20 |
댓글