www.boostcourse.org/ds112/joinLectures/28586
1 공공데이터 상권정보 분석 ( 의료기관)¶
- https://www.data.go.kr/data/15012005/fileData.do#layer_data_infomation
- 국가중점데이터인 상권정보 살펴보기.
1.1 필요한 라이브러리¶
In [1]:
import pandas as pd
import numpy as np
import seaborn as sns
1.2 시각화를 위한 폰트 설정¶
In [2]:
import matplotlib.pyplot as plt
# 윈도우의 한글 폰트 설정
plt.rc('font', family = 'Malgun Gothic')
# 시각화 그래프가 노트북 안에 보이게 하기
%matplotlib inline
In [3]:
from IPython.display import set_matplotlib_formats
set_matplotlib_formats('retina')
1.3 데이터 로드하기¶
In [4]:
df = pd.read_csv('./소상공인시장진흥공단_상가업소정보_의료기관_201909.csv',low_memory = False)
df.shape
Out[4]:
In [5]:
# 위에서 5개 출력
df.head()
Out[5]:
In [6]:
# tail : 뒤에 있는 5개 데이터 출력
df.tail()
Out[6]:
In [7]:
# info로 데이터 요약( 컬럼명 출력, 개수, d-type) 결측치 확인할 수 있음
df.info()
1.5.2 컬럼명 보기¶
In [8]:
# 컬럼명만 출력
df.columns
Out[8]:
1.5.3 데이터 타입¶
In [9]:
# 데이터 타입만 출력
df.dtypes
Out[9]:
1.6 결측치¶
In [10]:
#각 컬럼의 결측치 개수 합
null_count = df.isnull().sum()
In [11]:
# 위에서 구한 결측치를 .plot.bar를 통해 막대그래프로 표현.
# null_count.plot()
#null_count.plot.bar()
# 글씨 회전
#rot = null_count.plot.bar(rot = 60)
# x, y축 전환, 사이즈 조절
inv = null_count.plot.barh(figsize=(5,7))
In [12]:
# 위에서 계산한 결측치 수를 reset_index를 통해 데이터 프레임으로 만들기
# df_null_count 변수에 결과를 담아서 head로 미리보기
df_null_count = null_count.reset_index()
df_null_count.head()
Out[12]:
1.7 컬럼명 변경하기¶
In [13]:
# df_null_count 변수에 담겨있는 컬럼의 이름을 '컬럼명', '결측치 수'로 변경하기.
df_null_count.columns = ['컬럼명', '결측치 수']
df_null_count.head()
Out[13]:
1.8 정렬하기¶
In [14]:
# df_null_count 데이터프레임에 있는 결측치 수 컬럼을 sort_values를 통해 정렬
# 결측치 수가 적은 순으로 출력
# df_null_count.sort_values(by='결측치 수')
# 결측 수가 많은 순으로 출력
df_null_count_top = df_null_count.sort_values(by='결측치 수', ascending=False).head(10)
1.9 특정 컬럼만 불러오기¶
In [15]:
# 지점명 컬럼을 불러오기
# nan == Not a Number 의 약자로 결측치 의미
df['지점명'].head()
Out[15]:
In [16]:
# '컬럼명'이라는 컬럼의 값만 가져와서 drop_columns라는 변수에 담기
# 왜냐하면 결측치가 너무 많기 때문에
drop_columns = df_null_count_top['컬럼명'].tolist()
In [17]:
# drop_columns 변수로 해당 컬럼 정보만 데이터프레임에서 가져오기
df[drop_columns].head()
Out[17]:
1.10 제거하기¶
In [18]:
# axis 0: 행 , 1:열 // 열 기준으로 제거
print(df.shape)
df = df.drop(drop_columns, axis= 1)
print(df.shape)
In [19]:
# 제거 결과를 info로 확인한다.
df.info()
1.11 기초 통계값 보기¶
1. 11. 1 기초 통계 수치¶
In [20]:
# 자료값
df.dtypes
Out[20]:
In [21]:
# 특정 컬럼(위도)의 평균값
df['위도'].mean()
Out[21]:
In [22]:
# 특정 컬럼(위도)의 평균값
df['위도'].median()
Out[22]:
In [23]:
# 특정 컬럼(위도)의 최댓값
df['위도'].max()
Out[23]:
In [24]:
# 특정 컬럼(위도)의 최솟값
df['위도'].min()
Out[24]:
In [25]:
# 개수
df['위도'].count()
Out[25]:
1.11.2 기초통계값 요약하기 - describe¶
- describe를 사용하면, 데이터를 요약해 볼 수 있다.
- 기본적으로 수치형 데이터를 요약해서 보여준다.
- 데이터 개수, 평균, 표준편차, 최솟값, 제 1사분위수 부터 제3사분위수, 최댓값을 볼 수 있다.
In [26]:
# 위도를 describe로 요약
df['위도'].describe()
Out[26]:
In [27]:
# 2게의 컬럼을 describe로 요약하기.
# 2개의 컬럼을 불러올때는, 리스트 형태로 불러오기.
df[['위도','경도']]
df[['위도','경도']].describe()
Out[27]:
In [28]:
# describe로 수치형(number) 데이터타입의 요약보기
df.describe(include='number')
Out[28]:
In [29]:
# describe로 문자열(object) 데이터타입의 요약보기 ( 결측치 제거 후 )
df.describe(include='object')
# unique : 서로 다른 값의 개수, top: 제일 많이 나온 문자열이고, freq: top의 문자열 등장 횟수이다.
Out[29]:
In [30]:
df.describe(include='all')
Out[30]:
1.11.2 기초통계값 요약하기 - describe¶
- unique로 중복을 제거한 값을 보고 nunique로 개수를 세기
In [31]:
# '상권업종대분류명'
df['상권업종대분류명'].unique()
Out[31]:
In [32]:
# unique의 개수
df['상권업종대분류명'].nunique()
Out[32]:
In [33]:
# '상권업종중분류명'
df['상권업종중분류명'].unique()
Out[33]:
In [34]:
df['상권업종중분류명'].nunique()
Out[34]:
In [35]:
# '상권업종소분류명'
df['상권업종소분류명'].unique()
Out[35]:
In [36]:
# df['상권업종소분류명'].nunique()
len(df['상권업종소분류명'].unique())
Out[36]:
1.11.4 그룹화된 요약 값 보기 : Value_counts¶
- value_counts를 사용하면 카테고리 형태의 데이터 개수를 세어볼 수 있다.
In [37]:
# value_counts를 사용하면 카테고리 형태의 데이터 개수를 세어볼 수 있다.
# 시도명을 세어보기
city = df['시도명'].value_counts()
city
Out[37]:
In [38]:
# normalize=True 옵션을 사용하면 df에서의 비율을 구할 수 있다.
city_normalize = df['시도명'].value_counts(normalize=True)
city_normalize
Out[38]:
In [39]:
# pandas에는 plot 기능을 내장하고 있다.
# 위에서 분석한 시도명 수를 막대그래프로 표현하기.
# city.plot.area()
# city.plot.bar()
city.plot.barh()
# city.plot.box()
Out[39]:
In [40]:
# 판다스의 plot.pie()를 사용해서 파이그래이프로 그리기.
city_normalize.plot.pie(figsize=(7,7))
Out[40]:
- 데이터 요약하기 - seaborn 으로 빈도수 시각화 하기
In [41]:
# seaborn의 countplot으로 그리기
sns.countplot(data=df , y='시도명')
Out[41]:
In [42]:
# '상권업종대분류명'으로 개수를 세어보기.
df['상권업종대분류명'].value_counts()
Out[42]:
In [43]:
# '상권업종중분류명'으로 개수를 세어보기.
c = df['상권업종중분류명'].value_counts()
c
Out[43]:
In [44]:
# normalize=True를 사용해 비율 구하기.
n = df['상권업종중분류명'].value_counts(normalize= True)
n
Out[44]:
In [45]:
# 판다스의 plot.bar()를 사용해서 막대그래프 그리기.
c.plot.bar(rot=0)
# n.plot()
Out[45]:
In [46]:
# 판다스의 plot.pie()를 사용해서 파이 그래프 그리기.
n.plot.pie()
Out[46]:
In [47]:
# '상권업종소분류명'에 대한 그룹화 된 값을 카운트하기.
k = df['상권업종소분류명'].value_counts()
k
Out[47]:
In [48]:
# '상권업종 소분류명'으로 개수를 세어보기.
# 판다스의 plot.ba()를 사용해서 막대그래프 그리기.
k.plot.barh(figsize=(6, 8),grid=True)
Out[48]:
1.12 데이터 색인하기¶
- 특정 데이터만 모아서 따로 보기.
In [49]:
# '상권업종중분류명'이 '약국/한약방'인 데이터만 가져온다.
# df_medical 이라는 변수에 담는다.
# head()를 통해 미리보기를 한다.
df['상권업종중분류명'] == '약국/한약방' # 불리언 인덱싱 (True/ False)
df_medical = df[df['상권업종중분류명'] == '약국/한약방'].copy() # 약국/한약방 data만 가져오기. (원본에 영향 없도록 copy)
df_medical.head()
Out[49]:
In [50]:
# '상권업종대분류명'에서 '의료'데이터만 가져온다.
# df.loc를 사용하면 행, 열을 함게 가져올 수 있다.
# 이 기능을 통해 '상권업종준분류명'만 가져온다.
# 가져온 결과를 value_counts를 통해 중분류의 개수를 세어본다.
'''
m = df['상권업종대분류명']=='의료'
df.loc[m,'상권업종중분류명'].value_counts()
'''
# 위와 똑같은 기능을 수행하는 코드를 아래와 같이 한 줄에 표현할 수도 있다.
df.loc[df['상권업종대분류명']=='의료','상권업종중분류명'].value_counts()
Out[50]:
In [51]:
# 유사의료업만 따로 모으기
# 유사의료업만 df_medi 변수에 담기
df_medi = df[df['상권업종중분류명']=='유사의료업']
df_medi
Out[51]:
In [52]:
# 상호명을 그룹화해서 개수 세기.
# value_counts0를 사용해서 상위 10개 출력
df['상호명'].value_counts().head()
Out[52]:
In [53]:
# df_medi 변수에서 상호명으로 개수 세기
# 가장 많은 상호 상위 10개 출력
df_medi['상호명'].value_counts().head(10)
Out[53]:
1.12.1 여러 조건으로 색인하기¶
In [54]:
# '상권업종소분류명'이 '약국'인 것과 '시도명'이 '서울특별시'인 데이터 가져오기.
df['상권업종소분류명'] == '약국'
df['시도명'] =='서울특별시'
# 한번에 표현하기 (서울에 있는 약국)
df_seoul_drug= df[(df['상권업종소분류명'] == '약국' )& (df['시도명'] =='서울특별시')]
df_seoul_drug.shape
Out[54]:
1.12.2 구별로 보기¶
In [55]:
# 위에서 색인한 데이터로 '시군구명'으로 그룹화 개수 세어보기.
# 구별로 약국이 몇개가 있는지 확인
c = df_seoul_drug['시군구명'].value_counts()
c.head()
Out[55]:
In [56]:
# normalize = True를 통해 비율을 구하기.
n = df_seoul_drug['시군구명'].value_counts(normalize = True)
n.head()
Out[56]:
In [57]:
# 위에서구한 결과를 판다스의 plot.bar()를 활용해 막대그래프로 그리기
c.plot.bar(rot= 60)
Out[57]:
In [58]:
# '상권업종소분류명'이 '종합병원'인 것과
# '시도명'이 '서울특별시'인 데이터만 가져오기.
# 결과를 df_seoul_hospital에 할당해서 재사용.
df_seoul_hospital = df[(df['상권업종소분류명']=='종합병원' ) & (df['시도명']=='서울특별시')].copy()
# df_seoul_hospital
In [59]:
# '시군구명'으로 그룹화해서 구별로 종합병원의 수를 세어보기.
df_seoul_hospital['시군구명'].value_counts()
Out[59]:
1.12.3 텍스트 데이터 색인하기¶
In [60]:
# 색인하기 전에 상호명 중에 종합병원이 아닌 데이터를 찾아봅니다.
df_seoul_hospital.loc[~df_seoul_hospital['상호명'].str.contains('종합병원'),'상호명'].unique()
Out[60]:
In [61]:
# 특정 단어가 들어가는 데이터만 가져옵니다. -의료기
df_seoul_hospital[df_seoul_hospital['상호명'].str.contains('의료기')]
Out[61]:
In [62]:
# '꽃배달|의료기|장례식장|상담소|어린이집'은 종합병원과 무관하기 때문에 전처리를 위해 해당 텍스트를 한 번에 검색
# 제거할 데이터의 인덱스만 drop_row에 담아주고 list 형태로 변환한다.
drop_row = df_seoul_hospital[df_seoul_hospital['상호명'].str.contains('꽃배달|의료기|장례식장|상담소|어린이집')].index
drop_row = drop_row.tolist()
drop_row
Out[62]:
In [63]:
# 의원으로 끝나는 데이터도 종합병원으로 볼 수 없기 때문에 인덱스를 찾아서
# drop_row2에 담아주고 list 형태로 변환합니다.
# endswith : 마지막에 특정 스트링으로 끝나는 문자열
drop_row2 = df_seoul_hospital[df_seoul_hospital['상호명'].str.endswith('의원')].index
drop_row2 = drop_row2.tolist()
drop_row2
Out[63]:
In [64]:
# 삭제할 행을 drop_row에 합쳐준다.
drop_row = drop_row + drop_row2
len(drop_row)
Out[64]:
In [65]:
# 해당 셀을 삭제하고 삭제 전과 후의 행의 개수 비교하기
print(df_seoul_hospital.shape)
df_seoul_hospital = df_seoul_hospital.drop(drop_row, axis=0)
print(df_seoul_hospital.shape)
In [66]:
# 시군구명에 따라 종합병원의 숫자를 count.plot으로 표현하기.
df_seoul_hospital['시군구명'].value_counts().plot.barh()
Out[66]:
In [67]:
plt.figure(figsize=(18,4))
sns.countplot(data=df_seoul_hospital, x='시군구명',
order=df_seoul_hospital['시군구명'].value_counts().index)
Out[67]:
In [68]:
df_seoul_hospital['상호명'].unique()
Out[68]:
1.12.4 특정 지역만 보기¶
In [69]:
# 서울에 있는 데이터의 위도와 경도를 봅니다.
# 결과를 df_seoul 이라는 데이터프레임에 저장합니다.
# 새로운 변수에 데이터프레임을 저장식 copy()를 사용합니다.
df_seoul = df[df['시도명'] == '서울특별시'].copy()
df_seoul.shape
Out[69]:
In [70]:
# matplit의 plot(bar)을 사용해서 위에서 만든 df_seoul 데이터프레임의 시군구명을 시각화 합니다.
df_seoul['시군구명'].value_counts().plot.bar(figsize=(10,4),rot=45)
Out[70]:
In [71]:
# seaborn의 countplot을 사용해서 위에서 만든 df_seoul 데이터프레임의 시군구명을 시각화 합니다.
plt.figure(figsize=(20,4))
sns.countplot(data=df_seoul, x ='시군구명')
Out[71]:
In [72]:
# pandas의 plot.scatter를 통해 경도와 위도를 표시
df_seoul[['경도','위도','시군구명']].plot.scatter(x='경도',y='위도',figsize=(8,7),grid=True)
Out[72]:
In [73]:
# seaborn의 scatterplot을 통해 경도와 위도를 표시합니다.
plt.figure(figsize=(9,8))
sns.scatterplot(data=df_seoul, x='경도',y='위도',hue='시군구명')
Out[73]:
In [74]:
# seaborn의 scatterplot을 통해 '상권업종중분류명'의 경도와 위도를 표시합니다.
plt.figure(figsize=(9,8))
sns.scatterplot(data=df_seoul, x='경도',y='위도',hue='상권업종중분류명')
Out[74]:
In [75]:
# seaborn의 scatterplot을 통해 데이터(df)로 구별 경도와 위도를 표시합니다.
plt.figure(figsize=(9,8))
sns.scatterplot(data=df, x='경도',y='위도',hue='시도명')
Out[75]:
In [76]:
# seaborn의 scatterplot을 통해 데이터(df)로 구별 경도와 위도를 표시합니다.
plt.figure(figsize=(16,12))
sns.scatterplot(data=df, x='경도',y='위도',hue='상권업종중분류명')
Out[76]:
1.13 Folium으로 지도 활용하기¶
In [77]:
import folium
folium.Map()
In [78]:
random_map = folium.Map(location=[37.5236,127.660])
random_map
In [79]:
# 지도의 중심을 지정하기 위해 위도와 경도의 평균 구하기.
df_seoul_hospital['위도'].mean()
df_seoul_hospital['경도'].mean()
Out[79]:
In [80]:
folium.Map(location=[df_seoul_hospital['위도'].mean(),df_seoul_hospital['경도'].mean()])
In [81]:
#zoom_start : 확대
map = folium.Map(location=[df_seoul_hospital['위도'].mean(),df_seoul_hospital['경도'].mean()],zoom_start=12)
map
In [82]:
# 임의의 병원 지도 위에 마커 표시하기
for n in df_seoul_hospital.index:
name =df_seoul_hospital.loc[n,'상호명']
address = df_seoul_hospital.loc[n,'도로명주소']
popup = f"{name}-{address}"
location = [df_seoul_hospital.loc[n,'위도'],df_seoul_hospital.loc[n,'경도']]
folium.Marker(location = location, popup = popup).add_to(map)
map
# print(popup
In [83]:
map.save('index.html')
'Make the Learning Curve > 부스트코스' 카테고리의 다른 글
[부스트코스] 파이썬으로 시작하는 데이터 사이언스 Quiz3 - 건강검진 데이터로 가설검정하기 (0) | 2021.02.15 |
---|---|
[부스트코스] Hello, 데이터 사이언스! / 수강 (0) | 2021.02.15 |
[부스트코스] 파이썬으로 시작하는 데이터 사이언스_Quiz 2 (0) | 2021.01.25 |
[부스트코스] 파이썬으로 시작하는 데이터 사이언스 / Quiz 1 (0) | 2021.01.18 |
[부스트코스] 프로젝트로 배우는 데이터사이언스 / 사이킷-런(scikit-learn) - Machine Learning in Python (0) | 2021.01.18 |
댓글