필요한 라이브러리¶
numpy
넘파이(Numpy)는 Python에서 벡터, 행렬 등 수치 연산을 수행하는 선형대수(Linear algebra) 라이브러리
선형대수 관련 수치 연산을 지원하고 내부적으로는 C로 구현되어 있어 연산이 빠른 속도로 수행
seaborn
Matplotlib을 기반으로 다양한 색상 테마와 통계용 차트 등의 기능을 추가한 시각화 패키지
seaborn을 더 선호하는 이유
- seaborn에서만 제공되는 통계 기반 plot
- 특별하게 꾸미지 않아도 깔끔하게 구현되는 기본 color
- 더 아름답게 그래프 구현이 가능한 palette 기능
- pandas 데이터프레임과 높은 호환성 : hue 옵션으로 bar 구분이 가능하며, xtick, ytick, xlabel, ylabel, legend 등이 추가적인 코딩 작업없이 자동으로 세팅된다.
matplotlib.pyplot
MATLAB과 비슷하게 명령어 스타일로 동작하는 함수의 모음
pyplot 모듈의 각각의 함수를 사용해서 그래프를 만들고 변화를 줄 수 있음
https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.html
from IPython.core.display import display, HTML
display(HTML("<style>.container { width:90% !important; }</style>"))
#창 맞추기위함
import pandas as pd #판다스 불러오기
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
#window의 한글 폰트 설정
plt.rc('font',family='Malgun Gothic')
#한글 폰트 이용할 경우 minus 폰트 깨지는 문제 발생
#따라서 minus 폰트 깨짐 방지 해야함
plt.rc('axes', unicode_minus=False)
#그래프 안에서 문자가 또렷하게 보이기 위해서 retina 설정
from IPython.display import set_matplotlib_formats
set_matplotlib_formats('retina')
데이터 로드하기¶
#read_csv로 데이터 읽어오기
pd.read_csv("data/소상공인시장진흥공단_상가업소정보_의료기관_201909.csv")
C:\anaconda3\lib\site-packages\IPython\core\interactiveshell.py:3146: DtypeWarning: Columns (35) have mixed types.Specify dtype option on import or set low_memory=False. has_raised = await self.run_ast_nodes(code_ast.body, cell_name,
상가업소번호 | 상호명 | 지점명 | 상권업종대분류코드 | 상권업종대분류명 | 상권업종중분류코드 | 상권업종중분류명 | 상권업종소분류코드 | 상권업종소분류명 | 표준산업분류코드 | ... | 건물관리번호 | 건물명 | 도로명주소 | 구우편번호 | 신우편번호 | 동정보 | 층정보 | 호정보 | 경도 | 위도 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 19956873 | 하나산부인과 | NaN | S | 의료 | S01 | 병원 | S01B10 | 산부인과 | Q86201 | ... | 4127310900110810000010857 | 산호한양아파트 | 경기도 안산시 단원구 달미로 10 | 425764.0 | 15236.0 | NaN | NaN | NaN | 126.814295 | 37.336344 |
1 | 20024149 | 타워광명내과의원 | NaN | S | 의료 | S01 | 병원 | S01B07 | 내과/외과 | Q86201 | ... | 1168011800104670014000001 | NaN | 서울특별시 강남구 언주로30길 39 | 135270.0 | 6292.0 | NaN | 4 | NaN | 127.053198 | 37.488742 |
2 | 20152277 | 조정현신경외과의원 | NaN | S | 의료 | S01 | 병원 | S01B15 | 신경외과 | Q86201 | ... | 4139013200117400001017064 | 한라프라자 | 경기도 시흥시 중심상가로 178 | 429450.0 | 15066.0 | NaN | NaN | NaN | 126.734841 | 37.344955 |
3 | 20350610 | 한귀원정신과의원 | NaN | S | 의료 | S01 | 병원 | S01B99 | 기타병원 | NaN | ... | 2650010400100740001009932 | NaN | 부산광역시 수영구 수영로 688 | 613100.0 | 48266.0 | NaN | 5 | NaN | 129.115438 | 35.166872 |
4 | 20364049 | 더블유스토어수지점 | 수지점 | S | 의료 | S02 | 약국/한약방 | S02A01 | 약국 | G47811 | ... | 4146510100107120002026238 | NaN | 경기도 용인시 수지구 문정로 32 | 448170.0 | 16837.0 | NaN | 1 | NaN | 127.095522 | 37.323528 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
91330 | 16196725 | 온누리약국 | 베스트 | S | 의료 | S02 | 약국/한약방 | S02A01 | 약국 | G47811 | ... | 3017011200115070000021096 | NaN | 대전광역시 서구 문예로 67 | 302831.0 | 35240.0 | NaN | NaN | NaN | 127.389865 | 36.352728 |
91331 | 16192180 | 리원 | 봄산후조 | S | 의료 | S07 | 의료관련서비스업 | S07A07 | 산후조리원 | S96993 | ... | 4128112300111460000011715 | 청한프라자 | 경기도 고양시 덕양구 성신로 14 | 412827.0 | 10503.0 | NaN | NaN | NaN | 126.830144 | 37.627530 |
91332 | 16127538 | 참좋은요양병원 | NaN | S | 의료 | S01 | 병원 | S01B17 | 노인/치매병원 | Q86102 | ... | 2641010800105380001005572 | 한신시티빌 | 부산광역시 금정구 금강로 209 | 609841.0 | 46294.0 | NaN | 2 | NaN | 129.082790 | 35.227138 |
91333 | 16108681 | 경희중앙한의원 | NaN | S | 의료 | S01 | 병원 | S01B06 | 한의원 | Q86203 | ... | 1174010500103450009002392 | NaN | 서울특별시 강동구 천중로 213 | 134811.0 | 5303.0 | NaN | NaN | NaN | 127.143958 | 37.540993 |
91334 | 16109073 | 천안김안과천안역본점의원 | NaN | S | 의료 | S01 | 병원 | S01B13 | 안과의원 | Q86201 | ... | 4413110700102660017016314 | 김안과 | 충청남도 천안시 동남구 중앙로 92 | 330952.0 | 31127.0 | NaN | NaN | NaN | 127.152651 | 36.806640 |
91335 rows × 39 columns
#타입이 섞여있기 때문에 low_memory=False로 옵션을 설정해줘야한다.
#그리고 df에 담는다.
df = pd.read_csv("data/소상공인시장진흥공단_상가업소정보_의료기관_201909.csv", low_memory=False)
#shape를 통해 데이터의 개수를 출력할수 있다. 결과는 (행, 열) 순으로 출력된다.
#데이터프레임명.shape 형태로 사용이 된다.
#df에 읽어온 데이터프레임을 저장했기 때문에 df.shape로 사용한다.
df.shape
(91335, 39)
데이터 미리보기¶
shift+tab을 이용하여 docstring을 볼 수 있다.
# head를 통해 앞에서부터 5행(기본) 출력
# df.head()
# 괄호안에 숫자에 따라 출력되는 개수가 달라진다.
df.head(1)
상가업소번호 | 상호명 | 지점명 | 상권업종대분류코드 | 상권업종대분류명 | 상권업종중분류코드 | 상권업종중분류명 | 상권업종소분류코드 | 상권업종소분류명 | 표준산업분류코드 | ... | 건물관리번호 | 건물명 | 도로명주소 | 구우편번호 | 신우편번호 | 동정보 | 층정보 | 호정보 | 경도 | 위도 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 19956873 | 하나산부인과 | NaN | S | 의료 | S01 | 병원 | S01B10 | 산부인과 | Q86201 | ... | 4127310900110810000010857 | 산호한양아파트 | 경기도 안산시 단원구 달미로 10 | 425764.0 | 15236.0 | NaN | NaN | NaN | 126.814295 | 37.336344 |
1 rows × 39 columns
# tail은 뒤에서부터 5행(기본) 출력한다.
# df.tail()
df.tail(1)
상가업소번호 | 상호명 | 지점명 | 상권업종대분류코드 | 상권업종대분류명 | 상권업종중분류코드 | 상권업종중분류명 | 상권업종소분류코드 | 상권업종소분류명 | 표준산업분류코드 | ... | 건물관리번호 | 건물명 | 도로명주소 | 구우편번호 | 신우편번호 | 동정보 | 층정보 | 호정보 | 경도 | 위도 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
91334 | 16109073 | 천안김안과천안역본점의원 | NaN | S | 의료 | S01 | 병원 | S01B13 | 안과의원 | Q86201 | ... | 4413110700102660017016314 | 김안과 | 충청남도 천안시 동남구 중앙로 92 | 330952.0 | 31127.0 | NaN | NaN | NaN | 127.152651 | 36.80664 |
1 rows × 39 columns
데이터 요약하기¶
요약정보¶
#데이터의 요약 보기
df.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 91335 entries, 0 to 91334 Data columns (total 39 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 상가업소번호 91335 non-null int64 1 상호명 91335 non-null object 2 지점명 1346 non-null object 3 상권업종대분류코드 91335 non-null object 4 상권업종대분류명 91335 non-null object 5 상권업종중분류코드 91335 non-null object 6 상권업종중분류명 91335 non-null object 7 상권업종소분류코드 91335 non-null object 8 상권업종소분류명 91335 non-null object 9 표준산업분류코드 86413 non-null object 10 표준산업분류명 86413 non-null object 11 시도코드 90956 non-null float64 12 시도명 90956 non-null object 13 시군구코드 90956 non-null float64 14 시군구명 90956 non-null object 15 행정동코드 91335 non-null int64 16 행정동명 90956 non-null object 17 법정동코드 91280 non-null float64 18 법정동명 91280 non-null object 19 지번코드 91335 non-null int64 20 대지구분코드 91335 non-null int64 21 대지구분명 91335 non-null object 22 지번본번지 91335 non-null int64 23 지번부번지 72079 non-null float64 24 지번주소 91335 non-null object 25 도로명코드 91335 non-null int64 26 도로명 91335 non-null object 27 건물본번지 91335 non-null int64 28 건물부번지 10604 non-null float64 29 건물관리번호 91335 non-null object 30 건물명 46453 non-null object 31 도로명주소 91335 non-null object 32 구우편번호 91323 non-null float64 33 신우편번호 91333 non-null float64 34 동정보 7406 non-null object 35 층정보 44044 non-null object 36 호정보 15551 non-null object 37 경도 91335 non-null float64 38 위도 91335 non-null float64 dtypes: float64(9), int64(7), object(23) memory usage: 27.2+ MB
#데이터의 크기를 알수 있음 : 27mb
#데이터 타입도 알 수 있음
#중간의 숫자가 차이가 있는데 이는 결측치가 있다는 뜻
컬럼명 출력¶
df.columns
Index(['상가업소번호', '상호명', '지점명', '상권업종대분류코드', '상권업종대분류명', '상권업종중분류코드', '상권업종중분류명', '상권업종소분류코드', '상권업종소분류명', '표준산업분류코드', '표준산업분류명', '시도코드', '시도명', '시군구코드', '시군구명', '행정동코드', '행정동명', '법정동코드', '법정동명', '지번코드', '대지구분코드', '대지구분명', '지번본번지', '지번부번지', '지번주소', '도로명코드', '도로명', '건물본번지', '건물부번지', '건물관리번호', '건물명', '도로명주소', '구우편번호', '신우편번호', '동정보', '층정보', '호정보', '경도', '위도'], dtype='object')
데이터 타입¶
df.dtypes
상가업소번호 int64 상호명 object 지점명 object 상권업종대분류코드 object 상권업종대분류명 object 상권업종중분류코드 object 상권업종중분류명 object 상권업종소분류코드 object 상권업종소분류명 object 표준산업분류코드 object 표준산업분류명 object 시도코드 float64 시도명 object 시군구코드 float64 시군구명 object 행정동코드 int64 행정동명 object 법정동코드 float64 법정동명 object 지번코드 int64 대지구분코드 int64 대지구분명 object 지번본번지 int64 지번부번지 float64 지번주소 object 도로명코드 int64 도로명 object 건물본번지 int64 건물부번지 float64 건물관리번호 object 건물명 object 도로명주소 object 구우편번호 float64 신우편번호 float64 동정보 object 층정보 object 호정보 object 경도 float64 위도 float64 dtype: object
결측치¶
결측치(Missing Value)는 말 그대로 데이터에 값이 없는 것. 줄여서 'NA' 또는 NULL 이라 표현.
결측치는 다음과 같은 문제를 야기한다
결측치를 다 제거할 경우, 막대한 데이터 손실을 불러일으킬 수 있다.
결측치를 잘못 대체할 경우, 데이터에서 편향(bias)이 생길 수가 있다.
결측치를 처리하는 데에 있어 분석가의 견해가 가장 많이 반영되며, 이 때문에 잘못될 경우 분석결과가 매우 틀어질 수 있다.
결측치를 자세히 처리하기 위해서는 시간이 많이 투자되어야 하며, 무엇보다, 데이터에 기반한 결측치 처리가 진행되어야 분석을 정확하게 진행할 수 있다.
df.isnull()
#데이터 값이 null인지 아닌지 true/false 값으로 표시
#데이터 값이 null이면 true, 아니면 false로 표시
상가업소번호 | 상호명 | 지점명 | 상권업종대분류코드 | 상권업종대분류명 | 상권업종중분류코드 | 상권업종중분류명 | 상권업종소분류코드 | 상권업종소분류명 | 표준산업분류코드 | ... | 건물관리번호 | 건물명 | 도로명주소 | 구우편번호 | 신우편번호 | 동정보 | 층정보 | 호정보 | 경도 | 위도 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | False | False | True | False | False | False | False | False | False | False | ... | False | False | False | False | False | True | True | True | False | False |
1 | False | False | True | False | False | False | False | False | False | False | ... | False | True | False | False | False | True | False | True | False | False |
2 | False | False | True | False | False | False | False | False | False | False | ... | False | False | False | False | False | True | True | True | False | False |
3 | False | False | True | False | False | False | False | False | False | True | ... | False | True | False | False | False | True | False | True | False | False |
4 | False | False | False | False | False | False | False | False | False | False | ... | False | True | False | False | False | True | False | True | False | False |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
91330 | False | False | False | False | False | False | False | False | False | False | ... | False | True | False | False | False | True | True | True | False | False |
91331 | False | False | False | False | False | False | False | False | False | False | ... | False | False | False | False | False | True | True | True | False | False |
91332 | False | False | True | False | False | False | False | False | False | False | ... | False | False | False | False | False | True | False | True | False | False |
91333 | False | False | True | False | False | False | False | False | False | False | ... | False | True | False | False | False | True | True | True | False | False |
91334 | False | False | True | False | False | False | False | False | False | False | ... | False | False | False | False | False | True | True | True | False | False |
91335 rows × 39 columns
#python에서 true == 1이다. 따라서 다음과 같이 결측치가 몇개가 있는지를 알아볼 수 있다.
df.isnull().sum()
# 숫자가 크면 클수록 결측치가 많이 있다는 뜻
상가업소번호 0 상호명 0 지점명 89989 상권업종대분류코드 0 상권업종대분류명 0 상권업종중분류코드 0 상권업종중분류명 0 상권업종소분류코드 0 상권업종소분류명 0 표준산업분류코드 4922 표준산업분류명 4922 시도코드 379 시도명 379 시군구코드 379 시군구명 379 행정동코드 0 행정동명 379 법정동코드 55 법정동명 55 지번코드 0 대지구분코드 0 대지구분명 0 지번본번지 0 지번부번지 19256 지번주소 0 도로명코드 0 도로명 0 건물본번지 0 건물부번지 80731 건물관리번호 0 건물명 44882 도로명주소 0 구우편번호 12 신우편번호 2 동정보 83929 층정보 47291 호정보 75784 경도 0 위도 0 dtype: int64
# 이를 변수에 담아서 사용
null_count = df.isnull().sum()
# plot()을 이용하여 line 그래프로 나타낼 수 있음
null_count.plot()
<AxesSubplot:>
#선 그래프로 나타내기에는 부적합하므로 bar 그래프로 나타냄
#null_count.plot.bar()
#위와 같이 나타내면 글자가 안보이기 때문에 글자를 기울여서 나타내줌
null_count.plot.bar(rot=60)
<AxesSubplot:>
# barh()로 세로 막대형 그래프를 그리면 글씨를 볼때 좋음.
#figsize=(5,7)로 사이즈도 지정해줌
null_count.plot.barh(figsize=(5,7))
<AxesSubplot:>
#null_count가 data frame 형태가 아니었다는 것을 위에서 봤을때 알 수 있음
#따라서 reset_index()를 이용하여 data frame 형태로 만들어줌
df_null_count = null_count.reset_index()
df_null_count.head()
index | 0 | |
---|---|---|
0 | 상가업소번호 | 0 |
1 | 상호명 | 0 |
2 | 지점명 | 89989 |
3 | 상권업종대분류코드 | 0 |
4 | 상권업종대분류명 | 0 |
컬럼명 바꾸기¶
#다음과 같이 data frame의 column 명을 바꿀 수 있다.
df_null_count.columns = ["컬럼명", "결측치수"]
df_null_count.head()
컬럼명 | 결측치수 | |
---|---|---|
0 | 상가업소번호 | 0 |
1 | 상호명 | 0 |
2 | 지점명 | 89989 |
3 | 상권업종대분류코드 | 0 |
4 | 상권업종대분류명 | 0 |
정렬하기¶
#sort_values를 통해 정렬할 수 있다.
#이때 by="결측치수"를 통해 "결측치수"를 기준으로 정렬한다.
#ascending이 False이면 내림차수로 True면 오름차수로 정렬된다. 기본값은 True이다.
df_null_count.sort_values(by="결측치수", ascending=False)
컬럼명 | 결측치수 | |
---|---|---|
2 | 지점명 | 89989 |
34 | 동정보 | 83929 |
28 | 건물부번지 | 80731 |
36 | 호정보 | 75784 |
35 | 층정보 | 47291 |
30 | 건물명 | 44882 |
23 | 지번부번지 | 19256 |
9 | 표준산업분류코드 | 4922 |
10 | 표준산업분류명 | 4922 |
11 | 시도코드 | 379 |
13 | 시군구코드 | 379 |
14 | 시군구명 | 379 |
16 | 행정동명 | 379 |
12 | 시도명 | 379 |
17 | 법정동코드 | 55 |
18 | 법정동명 | 55 |
32 | 구우편번호 | 12 |
33 | 신우편번호 | 2 |
29 | 건물관리번호 | 0 |
27 | 건물본번지 | 0 |
0 | 상가업소번호 | 0 |
31 | 도로명주소 | 0 |
25 | 도로명코드 | 0 |
37 | 경도 | 0 |
26 | 도로명 | 0 |
19 | 지번코드 | 0 |
24 | 지번주소 | 0 |
22 | 지번본번지 | 0 |
21 | 대지구분명 | 0 |
20 | 대지구분코드 | 0 |
1 | 상호명 | 0 |
15 | 행정동코드 | 0 |
8 | 상권업종소분류명 | 0 |
7 | 상권업종소분류코드 | 0 |
6 | 상권업종중분류명 | 0 |
5 | 상권업종중분류코드 | 0 |
4 | 상권업종대분류명 | 0 |
3 | 상권업종대분류코드 | 0 |
38 | 위도 | 0 |
#상위 10개를 저장한다.
df_null_count_top = df_null_count.sort_values(by="결측치수", ascending=False).head(10)
특정 컬럼만 불러오기¶
#지점명 컬럼 불러오기
df["지점명"].head()
#NaN : Not a Number의 약자로 결측치 의미
#결측치 상황 확인 가능
0 NaN 1 NaN 2 NaN 3 NaN 4 수지점 Name: 지점명, dtype: object
#위에서 만들었던 데이터 프레임 df_null_count_top에서 "컬럼명"의 컬럼만 가져와서 tolist()를 이용하여
#리스트 형태로 drop_columns에 저장한다.
drop_columns = df_null_count_top["컬럼명"].tolist()
drop_columns
['지점명', '동정보', '건물부번지', '호정보', '층정보', '건물명', '지번부번지', '표준산업분류코드', '표준산업분류명', '시도코드']
#drop_columns로 해당 컬럼 정보만 데이터 프레임에서 가져온다.
#drop_colums는 리스트 형태이기 때문에 대괄호가 두번 사용이 되고 따라서 data frame형태로 나타난다.
#column을 기준으로 값을 가져올때는 대괄호를 한번사용하면 series 형태로, 두번 사용하면 data frame 형태로 값을 가져온다.
#2개 이상의 column을 기준으로 가져올때는 대괄호 두개 사용해야 한다.
df[drop_columns]
지점명 | 동정보 | 건물부번지 | 호정보 | 층정보 | 건물명 | 지번부번지 | 표준산업분류코드 | 표준산업분류명 | 시도코드 | |
---|---|---|---|---|---|---|---|---|---|---|
0 | NaN | NaN | NaN | NaN | NaN | 산호한양아파트 | NaN | Q86201 | 일반 의원 | 41.0 |
1 | NaN | NaN | NaN | NaN | 4 | NaN | 14.0 | Q86201 | 일반 의원 | 11.0 |
2 | NaN | NaN | NaN | NaN | NaN | 한라프라자 | 1.0 | Q86201 | 일반 의원 | 41.0 |
3 | NaN | NaN | NaN | NaN | 5 | NaN | 1.0 | NaN | NaN | 26.0 |
4 | 수지점 | NaN | NaN | NaN | 1 | NaN | 2.0 | G47811 | 의약품 및 의료용품 소매업 | 41.0 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
91330 | 베스트 | NaN | NaN | NaN | NaN | NaN | NaN | G47811 | 의약품 및 의료용품 소매업 | 30.0 |
91331 | 봄산후조 | NaN | NaN | NaN | NaN | 청한프라자 | NaN | S96993 | 개인 간병인 및 유사 서비스업 | 41.0 |
91332 | NaN | NaN | NaN | NaN | 2 | 한신시티빌 | 1.0 | Q86102 | 일반 병원 | 26.0 |
91333 | NaN | NaN | NaN | NaN | NaN | NaN | 9.0 | Q86203 | 한의원 | 11.0 |
91334 | NaN | NaN | NaN | NaN | NaN | 김안과 | 17.0 | Q86201 | 일반 의원 | 44.0 |
91335 rows × 10 columns
제거하기¶
#drop()안에 drop할 column을 적어준다.
#기본적으로 axis 값이 0이지만 column을 drop하는 것이기 때문에 axis 값을 1로 설정한다.
print(df.shape)
df=df.drop(drop_columns, axis=1)
print(df.shape)
(91335, 39) (91335, 29)
#평균값 => mean()으로 구하기
df["위도"].mean()
36.62471119236673
#중앙값 = > median() 으로 구하기
df["위도"].median()
37.23465231770329
#최댓값 => max()
df["위도"].max()
38.499658570559795
#최솟값 => min()
df["위도"].min()
33.2192896688307
#갯수 => count()
df["위도"].count()
91335
기초통계값 요약하기 - describe¶
describe()를 이용하여 수치할 데이터를 요약하여 볼 수 있음
결측치는 빼고 보여줌
데이터 갯수, 평균, 표준편차, 최소값, 25%(1사분위수), 50%(중앙값, 2사분위수), 75%(3사분위수), 최대값을 보여줌
#위도 describe로 요약
df["위도"].describe()
count 91335.000000 mean 36.624711 std 1.041361 min 33.219290 25% 35.811830 50% 37.234652 75% 37.507463 max 38.499659 Name: 위도, dtype: float64
#2개의 column describe로 요약
#2개이상의 컬럼이므로 리스트 형태 자료구조 사용
#data frame 형태로 출력
df[["위도", "경도"]].describe()
위도 | 경도 | |
---|---|---|
count | 91335.000000 | 91335.000000 |
mean | 36.624711 | 127.487524 |
std | 1.041361 | 0.842877 |
min | 33.219290 | 124.717632 |
25% | 35.811830 | 126.914297 |
50% | 37.234652 | 127.084550 |
75% | 37.507463 | 128.108919 |
max | 38.499659 | 130.909912 |
특정 데이터타입 요약¶
include = "number" => 수치형 데이터만
include = "object" => 문자열 데이터만
include = "all" => 모든 데이터
#괄호 안에 옵션으로 include="number" => 수치형 데이터만 요약
df.describe(include="number")
상가업소번호 | 시군구코드 | 행정동코드 | 법정동코드 | 지번코드 | 대지구분코드 | 지번본번지 | 도로명코드 | 건물본번지 | 구우편번호 | 신우편번호 | 경도 | 위도 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
count | 9.133500e+04 | 90956.000000 | 9.133500e+04 | 9.128000e+04 | 9.133500e+04 | 91335.000000 | 91335.000000 | 9.133500e+04 | 91335.000000 | 91323.000000 | 91333.00000 | 91335.000000 | 91335.000000 |
mean | 2.121818e+07 | 32898.381877 | 3.293232e+09 | 3.293385e+09 | 3.293191e+18 | 1.001336 | 587.534549 | 3.293207e+11 | 251.200482 | 428432.911085 | 28085.47698 | 127.487524 | 36.624711 |
std | 5.042828e+06 | 12985.393171 | 1.297387e+09 | 1.297706e+09 | 1.297393e+18 | 0.036524 | 582.519364 | 1.297391e+11 | 477.456487 | 193292.339066 | 18909.01455 | 0.842877 | 1.041361 |
min | 2.901108e+06 | 11110.000000 | 1.111052e+09 | 1.111010e+09 | 1.111010e+18 | 1.000000 | 1.000000 | 1.111020e+11 | 0.000000 | 100011.000000 | 1000.00000 | 124.717632 | 33.219290 |
25% | 2.001931e+07 | 26350.000000 | 2.635065e+09 | 2.635011e+09 | 2.635011e+18 | 1.000000 | 162.000000 | 2.635042e+11 | 29.000000 | 302120.000000 | 11681.00000 | 126.914297 | 35.811830 |
50% | 2.211900e+07 | 41117.000000 | 4.111758e+09 | 4.111710e+09 | 4.111711e+18 | 1.000000 | 462.000000 | 4.111743e+11 | 92.000000 | 440300.000000 | 24353.00000 | 127.084550 | 37.234652 |
75% | 2.480984e+07 | 43113.000000 | 4.311370e+09 | 4.311311e+09 | 4.311311e+18 | 1.000000 | 858.000000 | 4.311332e+11 | 257.000000 | 602811.000000 | 46044.00000 | 128.108919 | 37.507463 |
max | 2.852470e+07 | 50130.000000 | 5.013061e+09 | 5.013032e+09 | 5.013061e+18 | 2.000000 | 7338.000000 | 5.013049e+11 | 8795.000000 | 799801.000000 | 63643.00000 | 130.909912 | 38.499659 |
#include="object" => 문자열 데이터만 요약
#문자데이터이기 때문에 평균, 사분위수를 결정못함
#top => 가장 많이 등장한것, 가장 높은 빈도로 저장된 데이터
#freq => 가장 많이 등장한 데이터의 빈도수
df.describe(include="object")
상호명 | 상권업종대분류코드 | 상권업종대분류명 | 상권업종중분류코드 | 상권업종중분류명 | 상권업종소분류코드 | 상권업종소분류명 | 시도명 | 시군구명 | 행정동명 | 법정동명 | 대지구분명 | 지번주소 | 도로명 | 건물관리번호 | 도로명주소 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
count | 91335 | 91335 | 91335 | 91335 | 91335 | 91335 | 91335 | 90956 | 90956 | 90956 | 91280 | 91335 | 91335 | 91335 | 91335 | 91335 |
unique | 56910 | 1 | 1 | 5 | 5 | 34 | 34 | 17 | 228 | 2791 | 2822 | 2 | 53118 | 16610 | 54142 | 54031 |
top | 리원 | S | 의료 | S01 | 병원 | S02A01 | 약국 | 경기도 | 서구 | 중앙동 | 중동 | 대지 | 서울특별시 동대문구 제기동 965-1 | 서울특별시 강남구 강남대로 | 1123010300109650001031604 | 서울특별시 동대문구 약령중앙로8길 10 |
freq | 152 | 91335 | 91335 | 60774 | 60774 | 18964 | 18964 | 21374 | 3165 | 1856 | 874 | 91213 | 198 | 326 | 198 | 198 |
중복제거한 값 보기¶
unique()는 중복되는 것들을 제거하고 각각에 대해서만 보여줌
nunique()는 값의 종류가 몇 개인지를 보여줌
len(df["상권업종대분류명"].unique()) 과 nunique() 의 결과가 같음
문자형 데이터 값으로 요약했을때 unique 값이 나온다.
#상권업종대분류명
df["상권업종대분류명"].unique()
# 상권업종대분류명 은 unique 값으로 봤을때 의료 만 있다는 것을 알 수 있음
array(['의료'], dtype=object)
df["상권업종대분류명"].nunique()
1
#상권업종중분류명
df["상권업종중분류명"].unique()
array(['병원', '약국/한약방', '수의업', '유사의료업', '의료관련서비스업'], dtype=object)
df["상권업종중분류명"].nunique()
5
#상권업종소분류명
df["상권업종소분류명"].unique()
array(['산부인과', '내과/외과', '신경외과', '기타병원', '약국', '동물병원', '한약방', '탕제원', '정형/성형외과', '소아과', '이비인후과의원', '노인/치매병원', '언어치료', '수의업-종합', '한의원', '치과의원', '침구원', '일반병원', '안과의원', '조산원', '한방병원', '종합병원', '유사의료업기타', '응급구조대', '혈액원', '치과병원', '척추교정치료', '피부과', '비뇨기과', '치과기공소', '산후조리원', '접골원', '수의업-기타', '제대혈'], dtype=object)
df["상권업종소분류명"].nunique()
34
len(df["상권업종소분류명"].unique())
34
그룹화된 요약값 보기¶
value_counts() 를 사용하면 카테고리 형태의 데이터 개수를 세어볼 수 있음
#시도코드 세어보기
#위에서 시도코드를 제거함(제거하기 부분에 있음)
#따라서 시도명으로 세어보기
city = df["시도명"].value_counts()
city
#각각의 빈도수를 알 수 있음
경기도 21374 서울특별시 18943 부산광역시 6473 경상남도 4973 인천광역시 4722 대구광역시 4597 경상북도 4141 전라북도 3894 충청남도 3578 전라남도 3224 광주광역시 3214 대전광역시 3067 충청북도 2677 강원도 2634 울산광역시 1997 제주특별자치도 1095 세종특별자치시 353 Name: 시도명, dtype: int64
#normalize=True 옵션을 사용하면 비율을 구할 수 있음
city_normalize = df["시도명"].value_counts(normalize=True)
city_normalize
경기도 0.234993 서울특별시 0.208266 부산광역시 0.071166 경상남도 0.054675 인천광역시 0.051915 대구광역시 0.050541 경상북도 0.045528 전라북도 0.042812 충청남도 0.039338 전라남도 0.035446 광주광역시 0.035336 대전광역시 0.033720 충청북도 0.029432 강원도 0.028959 울산광역시 0.021956 제주특별자치도 0.012039 세종특별자치시 0.003881 Name: 시도명, dtype: float64
#plot.barh()을 이용하여 막대그래프로 나타내기
city.plot.barh()
<AxesSubplot:>
#plot.pie()로 파이차트 그리기
city_normalize.plot.pie(figsize=(7, 7), normalize=True )
<AxesSubplot:ylabel='시도명'>
# 시각화 할때 파이차트보다 막대그래프가 더 보기 좋기 때문에 막대 그래프 사용이 더 좋음
#seaborn으로 countplot 그리기
sns.countplot(data=df,y="시도명")
#counterplot은 x나 y 중 하나만 써줌
<AxesSubplot:xlabel='count', ylabel='시도명'>
#상권업종대분류명 으로 개수 세기
df["상권업종대분류명"].value_counts()
의료 91335 Name: 상권업종대분류명, dtype: int64
#상권업종중분류명 으로 개수 세기
c=df["상권업종중분류명"].value_counts()
c
병원 60774 약국/한약방 20923 수의업 5323 유사의료업 3774 의료관련서비스업 541 Name: 상권업종중분류명, dtype: int64
#normalize=True로 비율 구하기
n=df["상권업종중분류명"].value_counts(normalize=True)
n
병원 0.665397 약국/한약방 0.229080 수의업 0.058280 유사의료업 0.041320 의료관련서비스업 0.005923 Name: 상권업종중분류명, dtype: float64
#plot.bar()로 막대그래프 그리기
c.plot.bar(rot=0)
#rot=0 옵션을 하게 되면 글씨가 가로로 됨
<AxesSubplot:>
#plot.pie()로 파이차트 그리기
n.plot.pie()
<AxesSubplot:ylabel='상권업종중분류명'>
#상권업종소분류명 으로 개수 세기
c=df["상권업종소분류명"].value_counts()
c
약국 18964 치과의원 13731 한의원 13211 내과/외과 11374 기타병원 4922 일반병원 3385 동물병원 3098 정형/성형외과 2562 소아과 2472 수의업-종합 2216 치과기공소 1724 이비인후과의원 1486 한약방 1442 피부과 1273 산부인과 1116 노인/치매병원 1055 안과의원 1042 비뇨기과 809 종합병원 762 치과병원 756 언어치료 664 유사의료업기타 629 탕제원 517 산후조리원 511 신경외과 421 한방병원 397 척추교정치료 338 침구원 154 혈액원 130 응급구조대 125 조산원 30 접골원 9 수의업-기타 9 제대혈 1 Name: 상권업종소분류명, dtype: int64
#plot.barh()로 그래프 그리기
c.plot.barh(figsize=(7,8), grid=True)
#grie=True 옵션으로 그리드 표시
<AxesSubplot:>
데이터 색인하기¶
#상권업종중분류명이 약국/한약방 인 데이터만 가져오기
df["상권업종중분류명"] == "약국/한약방"
#boolean indexing을 하게됨(true=> 약국/한약방)
0 False 1 False 2 False 3 False 4 True ... 91330 True 91331 False 91332 False 91333 False 91334 False Name: 상권업종중분류명, Length: 91335, dtype: bool
df[df["상권업종중분류명"] == "약국/한약방"]
# df[]을 덮어쓰면 해당 조건에 True인 데이터만 가져옴
# 다른 목적으로 사용한다면 copy()를 해야 warning이 뜨지 않거나 원본에 영향을 미치지 않음
df_medical = df[df["상권업종중분류명"] == "약국/한약방"].copy()
df_medical.head()
상가업소번호 | 상호명 | 상권업종대분류코드 | 상권업종대분류명 | 상권업종중분류코드 | 상권업종중분류명 | 상권업종소분류코드 | 상권업종소분류명 | 시도명 | 시군구코드 | ... | 지번주소 | 도로명코드 | 도로명 | 건물본번지 | 건물관리번호 | 도로명주소 | 구우편번호 | 신우편번호 | 경도 | 위도 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
4 | 20364049 | 더블유스토어수지점 | S | 의료 | S02 | 약국/한약방 | S02A01 | 약국 | 경기도 | 41465.0 | ... | 경기도 용인시 수지구 풍덕천동 712-2 | 414653205024 | 경기도 용인시 수지구 문정로 | 32 | 4146510100107120002026238 | 경기도 용인시 수지구 문정로 32 | 448170.0 | 16837.0 | 127.095522 | 37.323528 |
6 | 20733252 | 춘산한약방 | S | 의료 | S02 | 약국/한약방 | S02A02 | 한약방 | 강원도 | 42110.0 | ... | 강원도 춘천시 중앙로2가 99 | 421104454113 | 강원도 춘천시 낙원길 | 50 | 4211010500101000000023668 | 강원도 춘천시 낙원길 50 | 200042.0 | 24273.0 | 127.726905 | 37.880504 |
7 | 20582210 | 부부탕제원 | S | 의료 | S02 | 약국/한약방 | S02A03 | 탕제원 | 충청북도 | 43111.0 | ... | 충청북도 청주시 상당구 금천동 187-17 | 431114508623 | 충청북도 청주시 상당구 중고개로337번길 | 134 | 4311112000101870017042942 | 충청북도 청주시 상당구 중고개로337번길 134 | 360802.0 | 28726.0 | 127.499206 | 36.625355 |
10 | 21057519 | 민생약국 | S | 의료 | S02 | 약국/한약방 | S02A01 | 약국 | 경상남도 | 48890.0 | ... | 경상남도 합천군 용주면 월평리 78-2 | 488904844473 | 경상남도 합천군 용주면 월평길 | 149 | 4889046030200780002048274 | 경상남도 합천군 용주면 월평길 149-35 | 678912.0 | 50212.0 | 128.118615 | 35.575962 |
13 | 21217689 | 제중당한약방 | S | 의료 | S02 | 약국/한약방 | S02A02 | 한약방 | 전라남도 | 46830.0 | ... | 전라남도 영암군 도포면 덕화리 296 | 468304685396 | 전라남도 영암군 도포면 인덕길 | 75 | 4683035023102960000000001 | 전라남도 영암군 도포면 인덕길 75-10 | 526832.0 | 58429.0 | 126.630348 | 34.834080 |
5 rows × 29 columns
#상권업종대분류명이 의료인 데이터를 불러오기
#df.loc를 이용하면 행과 열을 함께 가져올 수 있음
#df.loc[df["상권업종대분류명"] == "의료"]["상권업종중분류명"]
# 상권업종대분류명이 의료인 데이터의 상권업종중분류명을 가져오고 싶을 때 loc를 함께 사용
#밑과 같이 쓰는것을 더 권장
# df.loc[df["상권업종대분류명"] == "의료", "상권업종중분류명"]
df.loc[df["상권업종대분류명"] == "의료", "상권업종중분류명"].value_counts()
병원 60774 약국/한약방 20923 수의업 5323 유사의료업 3774 의료관련서비스업 541 Name: 상권업종중분류명, dtype: int64
#위와 같은 코드
m = df["상권업종대분류명"] == "의료"
df.loc[m, "상권업종중분류명"].value_counts()
병원 60774 약국/한약방 20923 수의업 5323 유사의료업 3774 의료관련서비스업 541 Name: 상권업종중분류명, dtype: int64
#유사의료업만 색인
df_medi = df[df["상권업종중분류명"] == "유사의료업"]
df_medi
상가업소번호 | 상호명 | 상권업종대분류코드 | 상권업종대분류명 | 상권업종중분류코드 | 상권업종중분류명 | 상권업종소분류코드 | 상권업종소분류명 | 시도명 | 시군구코드 | ... | 지번주소 | 도로명코드 | 도로명 | 건물본번지 | 건물관리번호 | 도로명주소 | 구우편번호 | 신우편번호 | 경도 | 위도 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
22 | 21013731 | 세종언어치료센터 | S | 의료 | S03 | 유사의료업 | S03B07 | 언어치료 | 부산광역시 | 26410.0 | ... | 부산광역시 금정구 구서동 84-1 | 264102000010 | 부산광역시 금정구 중앙대로 | 1817 | 2641010700100840001017686 | 부산광역시 금정구 중앙대로 1817-11 | 609310.0 | 46273.0 | 129.091662 | 35.246528 |
40 | 20933900 | 고려수지침학회 | S | 의료 | S03 | 유사의료업 | S03B03 | 침구원 | 경상남도 | 48123.0 | ... | 경상남도 창원시 성산구 상남동 5-2 | 481234784088 | 경상남도 창원시 성산구 마디미로4번길 | 9 | 4812312700100050002026799 | 경상남도 창원시 성산구 마디미로4번길 9 | 642832.0 | 51495.0 | 128.684678 | 35.224113 |
97 | 21717820 | 청명원 | S | 의료 | S03 | 유사의료업 | S03B09 | 유사의료업기타 | 충청북도 | 43760.0 | ... | 충청북도 괴산군 청안면 금신리 241 | 437604538132 | 충청북도 괴산군 청안면 금신로1길 | 93 | 4376037022102410000007293 | 충청북도 괴산군 청안면 금신로1길 93 | 367831.0 | 28050.0 | 127.635740 | 36.768935 |
102 | 21865854 | 응급환자이송센터 | S | 의료 | S03 | 유사의료업 | S03B01 | 응급구조대 | 대전광역시 | 30140.0 | ... | 대전광역시 중구 대사동 248-237 | 301404295026 | 대전광역시 중구 계룡로921번길 | 40 | 3014011000102480237013097 | 대전광역시 중구 계룡로921번길 40 | 301846.0 | 34946.0 | 127.417693 | 36.321801 |
108 | 21914637 | 태화아동발달지원센터 | S | 의료 | S03 | 유사의료업 | S03B07 | 언어치료 | 대전광역시 | 30140.0 | ... | 대전광역시 중구 문화동 27 | 301404295402 | 대전광역시 중구 보문산로333번길 | 29 | 3014011600100270000008172 | 대전광역시 중구 보문산로333번길 29 | 301130.0 | 35020.0 | 127.412725 | 36.312953 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
91300 | 16131218 | 으뜸치과기공소 | S | 의료 | S03 | 유사의료업 | S03B06 | 치과기공소 | 경상남도 | 48170.0 | ... | 경상남도 진주시 수정동 39-11 | 481704797625 | 경상남도 진주시 향교로18번길 | 8 | 4817011600100390011004490 | 경상남도 진주시 향교로18번길 8 | 660180.0 | 52753.0 | 128.084600 | 35.197029 |
91310 | 16199325 | 보령치과기공소 | S | 의료 | S03 | 유사의료업 | S03B06 | 치과기공소 | 서울특별시 | 11290.0 | ... | 서울특별시 성북구 동소문동4가 103-11 | 112903107003 | 서울특별시 성북구 동소문로 | 47 | 1129010700101030014050661 | 서울특별시 성북구 동소문로 47-15 | 136821.0 | 2832.0 | 127.010602 | 37.591455 |
91311 | 16199088 | 점프셈교실 | S | 의료 | S03 | 유사의료업 | S03B09 | 유사의료업기타 | 경상북도 | 47130.0 | ... | 경상북도 경주시 황성동 446 | 471304715895 | 경상북도 경주시 용담로104번길 | 16 | 4713012400104460000024894 | 경상북도 경주시 용담로104번길 16 | 780954.0 | 38084.0 | 129.211755 | 35.865600 |
91319 | 16108560 | 씨앤디자인치과기공소 | S | 의료 | S03 | 유사의료업 | S03B06 | 치과기공소 | 서울특별시 | 11545.0 | ... | 서울특별시 금천구 가산동 60-25 | 115453116013 | 서울특별시 금천구 벚꽃로 | 234 | 1154510100100600025000001 | 서울특별시 금천구 벚꽃로 234 | 153798.0 | 8513.0 | 126.886122 | 37.475986 |
91327 | 16190388 | 오피스알파 | S | 의료 | S03 | 유사의료업 | S03B06 | 치과기공소 | 경기도 | 41173.0 | ... | 경기도 안양시 동안구 호계동 970-24 | 411734349013 | 경기도 안양시 동안구 경수대로507번길 | 28 | 4117310400109700024005182 | 경기도 안양시 동안구 경수대로507번길 28 | 431849.0 | 14120.0 | 126.956365 | 37.367779 |
3774 rows × 29 columns
#상호명 그룹화 해서 개수 세기
df["상호명"].value_counts().head()
리원 152 온누리약국 149 경희한의원 141 우리약국 119 중앙약국 111 Name: 상호명, dtype: int64
#df_medi에서 상호명 분류
df_medi["상호명"].value_counts().head()
리원 32 고려수지침 22 대한적십자사 17 헌혈의집 12 고려수지침학회 10 Name: 상호명, dtype: int64
여러 조건으로 색인하기¶
# 상권업종소분류명이 약국인것과 시도명이 서울특별시인것 불러오기
df["상권업종소분류명"]=="약국"
df["시도명"]=="서울특별시"
#주피터 노트북은 맨마지막것만 돌아감
#같이 보고싶을때는 and나 or 이용
df_seoul_drug = df[(df["상권업종소분류명"] == "약국") & (df["시도명"] == "서울특별시")]
print(df_seoul_drug.shape) #print 이용해서 중간에 있는 것도 출력
df_seoul_drug
(3579, 29)
상가업소번호 | 상호명 | 상권업종대분류코드 | 상권업종대분류명 | 상권업종중분류코드 | 상권업종중분류명 | 상권업종소분류코드 | 상권업종소분류명 | 시도명 | 시군구코드 | ... | 지번주소 | 도로명코드 | 도로명 | 건물본번지 | 건물관리번호 | 도로명주소 | 구우편번호 | 신우편번호 | 경도 | 위도 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
33 | 20816709 | 이즈타워약 | S | 의료 | S02 | 약국/한약방 | S02A01 | 약국 | 서울특별시 | 11680.0 | ... | 서울특별시 강남구 역삼동 821 | 116803122010 | 서울특별시 강남구 테헤란로 | 101 | 1168010100108210001000001 | 서울특별시 강남구 테헤란로 101 | 135080.0 | 6134.0 | 127.028023 | 37.498656 |
51 | 20855710 | 진흥약국 | S | 의료 | S02 | 약국/한약방 | S02A01 | 약국 | 서울특별시 | 11740.0 | ... | 서울특별시 강동구 둔촌동 630 | 117403124002 | 서울특별시 강동구 명일로 | 172 | 1174010600106090000000001 | 서울특별시 강동구 명일로 172 | 134767.0 | 5360.0 | 127.145055 | 37.534135 |
130 | 21589838 | 신세계약국 | S | 의료 | S02 | 약국/한약방 | S02A01 | 약국 | 서울특별시 | 11260.0 | ... | 서울특별시 중랑구 신내동 646 | 112603106007 | 서울특별시 중랑구 신내로 | 211 | 1126010600106460000000300 | 서울특별시 중랑구 신내로 211 | 131130.0 | 2024.0 | 127.092597 | 37.616424 |
136 | 22388303 | 메디팜한솔약국 | S | 의료 | S02 | 약국/한약방 | S02A01 | 약국 | 서울특별시 | 11200.0 | ... | 서울특별시 성동구 행당동 346 | 112003103006 | 서울특별시 성동구 행당로 | 82 | 1120010700103460012016935 | 서울특별시 성동구 행당로 82 | 133777.0 | 4717.0 | 127.027513 | 37.556238 |
141 | 22412563 | 명약국 | S | 의료 | S02 | 약국/한약방 | S02A01 | 약국 | 서울특별시 | 11230.0 | ... | 서울특별시 동대문구 휘경동 286-121 | 112304115120 | 서울특별시 동대문구 망우로18나길 | 3 | 1123010900102860121007257 | 서울특별시 동대문구 망우로18나길 3 | 130090.0 | 2498.0 | 127.060556 | 37.587349 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
91239 | 16131547 | 우리이웃약국 | S | 의료 | S02 | 약국/한약방 | S02A01 | 약국 | 서울특별시 | 11290.0 | ... | 서울특별시 성북구 종암동 34-3 | 112904121682 | 서울특별시 성북구 종암로5길 | 26 | 1129013500100340003022753 | 서울특별시 성북구 종암로5길 26 | 136769.0 | 2811.0 | 127.033908 | 37.594792 |
91275 | 16195709 | 더블유스토어 | S | 의료 | S02 | 약국/한약방 | S02A01 | 약국 | 서울특별시 | 11530.0 | ... | 서울특별시 구로구 구로동 501 | 115303116005 | 서울특별시 구로구 구로중앙로 | 134 | 1153010200105010000000001 | 서울특별시 구로구 구로중앙로 134 | 152731.0 | 8293.0 | 126.884285 | 37.499936 |
91288 | 16131839 | 종각팜약국 | S | 의료 | S02 | 약국/한약방 | S02A01 | 약국 | 서울특별시 | 11110.0 | ... | 서울특별시 종로구 종로2가 84-8 | 111103100013 | 서울특별시 종로구 종로 | 68 | 1111013800100160006014311 | 서울특별시 종로구 종로 68 | 110122.0 | 3189.0 | 126.984930 | 37.569882 |
91301 | 16188650 | 온누리약국 | S | 의료 | S02 | 약국/한약방 | S02A01 | 약국 | 서울특별시 | 11530.0 | ... | 서울특별시 구로구 구로동 798-30 | 115304148329 | 서울특별시 구로구 디지털로27길 | 116 | 1153010200107980032000001 | 서울특별시 구로구 디지털로27길 116 | 152875.0 | 8374.0 | 126.888070 | 37.484897 |
91322 | 16091491 | 설연화한복감성약방 | S | 의료 | S02 | 약국/한약방 | S02A01 | 약국 | 서울특별시 | 11260.0 | ... | 서울특별시 중랑구 묵동 174-1 | 112603005050 | 서울특별시 중랑구 공릉로 | 28 | 1126010400101740001009985 | 서울특별시 중랑구 공릉로 28 | 131848.0 | 2034.0 | 127.078082 | 37.613194 |
3579 rows × 29 columns
구별로 보기¶
#위에서 색인한 데이터로 시군구명으로 그룹화해서 개수 세기
c = df_seoul_drug["시군구명"].value_counts()
c.head()
강남구 374 동대문구 261 광진구 212 서초구 191 송파구 188 Name: 시군구명, dtype: int64
#normalize=True 이용하여 비율구하기
n = df_seoul_drug["시군구명"].value_counts(normalize=True)
n.head()
강남구 0.104498 동대문구 0.072925 광진구 0.059234 서초구 0.053367 송파구 0.052529 Name: 시군구명, dtype: float64
#막대그래프
c.plot.bar(rot=60)
<AxesSubplot:>
#상권업종소분류명이 종합병원인것과 시도명이 서울특별시인 데이터 가져오기
df_seoul_hospital=df[(df["상권업종소분류명"]=="종합병원")&(df["시도명"]=="서울특별시")].copy()
df_seoul_hospital
상가업소번호 | 상호명 | 상권업종대분류코드 | 상권업종대분류명 | 상권업종중분류코드 | 상권업종중분류명 | 상권업종소분류코드 | 상권업종소분류명 | 시도명 | 시군구코드 | ... | 지번주소 | 도로명코드 | 도로명 | 건물본번지 | 건물관리번호 | 도로명주소 | 구우편번호 | 신우편번호 | 경도 | 위도 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
305 | 25155642 | 대진의료재단 | S | 의료 | S01 | 병원 | S01B01 | 종합병원 | 서울특별시 | 11215.0 | ... | 서울특별시 광진구 중곡동 58-25 | 112153104006 | 서울특별시 광진구 긴고랑로 | 119 | 1121510100100580025000733 | 서울특별시 광진구 긴고랑로 119 | 143220.0 | 4944.0 | 127.088279 | 37.559048 |
353 | 20471487 | 홍익병원별관 | S | 의료 | S01 | 병원 | S01B01 | 종합병원 | 서울특별시 | 11470.0 | ... | 서울특별시 양천구 신정동 897-13 | 114702005008 | 서울특별시 양천구 국회대로 | 250 | 1147010100108970013001044 | 서울특별시 양천구 국회대로 250 | 158070.0 | 7937.0 | 126.862805 | 37.529213 |
385 | 20737057 | SNUH | S | 의료 | S01 | 병원 | S01B01 | 종합병원 | 서울특별시 | 11680.0 | ... | 서울특별시 강남구 역삼동 736-55 | 116804166727 | 서울특별시 강남구 테헤란로26길 | 10 | 1168010100107360055027688 | 서울특별시 강남구 테헤란로26길 10 | 135080.0 | 6236.0 | 127.035825 | 37.499630 |
1917 | 23210677 | 평화드림여의도성모병원의료기매장 | S | 의료 | S01 | 병원 | S01B01 | 종합병원 | 서울특별시 | 11560.0 | ... | 서울특별시 영등포구 여의도동 62 | 115603118001 | 서울특별시 영등포구 63로 | 10 | 1156011000100620000031477 | 서울특별시 영등포구 63로 10 | 150713.0 | 7345.0 | 126.936693 | 37.518296 |
2461 | 20024045 | 한양 | S | 의료 | S01 | 병원 | S01B01 | 종합병원 | 서울특별시 | 11200.0 | ... | 서울특별시 성동구 행당동 15-1 | 112003103002 | 서울특별시 성동구 마조로 | 22 | 1120010700100150001019623 | 서울특별시 성동구 마조로 22-2 | 133070.0 | 4763.0 | 127.041325 | 37.559469 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
71991 | 28505952 | 서울성모병원응급의료센터 | S | 의료 | S01 | 병원 | S01B01 | 종합병원 | 서울특별시 | 11650.0 | ... | 서울특별시 서초구 반포동 505 | 116502121003 | 서울특별시 서초구 반포대로 | 222 | 1165010700101230000017226 | 서울특별시 서초구 반포대로 222 | 137701.0 | 6591.0 | 127.005841 | 37.502382 |
76508 | 12292992 | 라마르의원 | S | 의료 | S01 | 병원 | S01B01 | 종합병원 | 서울특별시 | 11740.0 | ... | 서울특별시 강동구 천호동 453-8 | 117404172367 | 서울특별시 강동구 천호대로157길 | 18 | 1174010900104530021010314 | 서울특별시 강동구 천호대로157길 18 | 134864.0 | 5335.0 | 127.127466 | 37.538485 |
90492 | 16031909 | 가톨릭대학교여의도성모병원 | S | 의료 | S01 | 병원 | S01B01 | 종합병원 | 서울특별시 | 11140.0 | ... | 서울특별시 중구 명동2가 1-1 | 111404103165 | 서울특별시 중구 명동길 | 74 | 1114012700100010001019574 | 서울특별시 중구 명동길 74 | 100809.0 | 4537.0 | 126.986758 | 37.563662 |
90581 | 16332576 | 씨엠병원 | S | 의료 | S01 | 병원 | S01B01 | 종합병원 | 서울특별시 | 11560.0 | ... | 서울특별시 영등포구 영등포동4가 90 | 115604154717 | 서울특별시 영등포구 영등포로36길 | 13 | 1156010500100900000035097 | 서울특별시 영등포구 영등포로36길 13 | 150030.0 | 7301.0 | 126.903857 | 37.518807 |
90788 | 16162338 | 성베드로병원 | S | 의료 | S01 | 병원 | S01B01 | 종합병원 | 서울특별시 | 11680.0 | ... | 서울특별시 강남구 도곡동 910-27 | 116802000003 | 서울특별시 강남구 남부순환로 | 2649 | 1168011800109100027000895 | 서울특별시 강남구 남부순환로 2649 | 135859.0 | 6271.0 | 127.039567 | 37.485604 |
91 rows × 29 columns
#시군구명으로 그룹화해서 세기
df_seoul_hospital["시군구명"].value_counts()
강남구 15 영등포구 8 광진구 6 서초구 6 송파구 5 중구 5 강동구 5 서대문구 4 양천구 4 강북구 4 도봉구 4 성북구 3 강서구 2 동대문구 2 구로구 2 중랑구 2 금천구 2 노원구 2 관악구 2 종로구 2 성동구 2 동작구 1 용산구 1 마포구 1 은평구 1 Name: 시군구명, dtype: int64
텍스트 데이터 색인하기¶
str.contains()
str.endswith()
# 색인 전 상호명이 종합병원이 아닌 데이터 찾기
df_seoul_hospital[~df_seoul_hospital["상호명"].str.contains("종합병원")]
#종합병원이 아닌것들만 가져오게 됨
상가업소번호 | 상호명 | 상권업종대분류코드 | 상권업종대분류명 | 상권업종중분류코드 | 상권업종중분류명 | 상권업종소분류코드 | 상권업종소분류명 | 시도명 | 시군구코드 | ... | 지번주소 | 도로명코드 | 도로명 | 건물본번지 | 건물관리번호 | 도로명주소 | 구우편번호 | 신우편번호 | 경도 | 위도 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
305 | 25155642 | 대진의료재단 | S | 의료 | S01 | 병원 | S01B01 | 종합병원 | 서울특별시 | 11215.0 | ... | 서울특별시 광진구 중곡동 58-25 | 112153104006 | 서울특별시 광진구 긴고랑로 | 119 | 1121510100100580025000733 | 서울특별시 광진구 긴고랑로 119 | 143220.0 | 4944.0 | 127.088279 | 37.559048 |
353 | 20471487 | 홍익병원별관 | S | 의료 | S01 | 병원 | S01B01 | 종합병원 | 서울특별시 | 11470.0 | ... | 서울특별시 양천구 신정동 897-13 | 114702005008 | 서울특별시 양천구 국회대로 | 250 | 1147010100108970013001044 | 서울특별시 양천구 국회대로 250 | 158070.0 | 7937.0 | 126.862805 | 37.529213 |
385 | 20737057 | SNUH | S | 의료 | S01 | 병원 | S01B01 | 종합병원 | 서울특별시 | 11680.0 | ... | 서울특별시 강남구 역삼동 736-55 | 116804166727 | 서울특별시 강남구 테헤란로26길 | 10 | 1168010100107360055027688 | 서울특별시 강남구 테헤란로26길 10 | 135080.0 | 6236.0 | 127.035825 | 37.499630 |
1917 | 23210677 | 평화드림여의도성모병원의료기매장 | S | 의료 | S01 | 병원 | S01B01 | 종합병원 | 서울특별시 | 11560.0 | ... | 서울특별시 영등포구 여의도동 62 | 115603118001 | 서울특별시 영등포구 63로 | 10 | 1156011000100620000031477 | 서울특별시 영등포구 63로 10 | 150713.0 | 7345.0 | 126.936693 | 37.518296 |
2461 | 20024045 | 한양 | S | 의료 | S01 | 병원 | S01B01 | 종합병원 | 서울특별시 | 11200.0 | ... | 서울특별시 성동구 행당동 15-1 | 112003103002 | 서울특별시 성동구 마조로 | 22 | 1120010700100150001019623 | 서울특별시 성동구 마조로 22-2 | 133070.0 | 4763.0 | 127.041325 | 37.559469 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
71991 | 28505952 | 서울성모병원응급의료센터 | S | 의료 | S01 | 병원 | S01B01 | 종합병원 | 서울특별시 | 11650.0 | ... | 서울특별시 서초구 반포동 505 | 116502121003 | 서울특별시 서초구 반포대로 | 222 | 1165010700101230000017226 | 서울특별시 서초구 반포대로 222 | 137701.0 | 6591.0 | 127.005841 | 37.502382 |
76508 | 12292992 | 라마르의원 | S | 의료 | S01 | 병원 | S01B01 | 종합병원 | 서울특별시 | 11740.0 | ... | 서울특별시 강동구 천호동 453-8 | 117404172367 | 서울특별시 강동구 천호대로157길 | 18 | 1174010900104530021010314 | 서울특별시 강동구 천호대로157길 18 | 134864.0 | 5335.0 | 127.127466 | 37.538485 |
90492 | 16031909 | 가톨릭대학교여의도성모병원 | S | 의료 | S01 | 병원 | S01B01 | 종합병원 | 서울특별시 | 11140.0 | ... | 서울특별시 중구 명동2가 1-1 | 111404103165 | 서울특별시 중구 명동길 | 74 | 1114012700100010001019574 | 서울특별시 중구 명동길 74 | 100809.0 | 4537.0 | 126.986758 | 37.563662 |
90581 | 16332576 | 씨엠병원 | S | 의료 | S01 | 병원 | S01B01 | 종합병원 | 서울특별시 | 11560.0 | ... | 서울특별시 영등포구 영등포동4가 90 | 115604154717 | 서울특별시 영등포구 영등포로36길 | 13 | 1156010500100900000035097 | 서울특별시 영등포구 영등포로36길 13 | 150030.0 | 7301.0 | 126.903857 | 37.518807 |
90788 | 16162338 | 성베드로병원 | S | 의료 | S01 | 병원 | S01B01 | 종합병원 | 서울특별시 | 11680.0 | ... | 서울특별시 강남구 도곡동 910-27 | 116802000003 | 서울특별시 강남구 남부순환로 | 2649 | 1168011800109100027000895 | 서울특별시 강남구 남부순환로 2649 | 135859.0 | 6271.0 | 127.039567 | 37.485604 |
91 rows × 29 columns
#상호명만 보고 싶을땐 loc 이용
df_seoul_hospital.loc[~df_seoul_hospital["상호명"].str.contains("종합병원"), "상호명"].unique()
array(['대진의료재단', '홍익병원별관', 'SNUH', '평화드림여의도성모병원의료기매장', '한양', '백산의료재단친구병원', '서울보훈병원', '서울성모병원장례식장꽃배달', '서울대학교병원', '알콜중독및정신질환상담소', '강남성모병원장례식장꽃배달', '제일병원', '이랜드클리닉', '사랑나눔의료재단', '우울증센터', '성심의료재단', '다나의료재단', '서울아산병원신관', '원자력병원장례식장', '국민의원', '고려대학교구로병원', '학교법인일송학원', '삼성의료원장례식장', '희명스포츠의학센터인공신장실', '연세대학교의과대학강남세브란스', '국립정신병원', '코아클리닉', '수서제일의원', '사랑의의원', '한국전력공사부속한일병원', '신촌연세병원', '창동제일의원', '영동세브란스병원', '제일성심의원', '삼성의료재단강북삼성태', '서울시립보라매병원', '서울이의원', '서울대학교병원비상계획외래', '평화드림서울성모병원의료', '홍익병원', '사랑나눔의료재단서', '독일의원', '서울연합의원', '우신향병원', '동부제일병원', '아산재단금강병원', '명곡안연구소', '아산재단서울중앙병원', '메디힐특수여객', '삼성생명공익재단삼성서', '성광의료재단차병원', '한국건강관리협회서울특', '정해복지부설한신메디피아', '성베드로병원', '성애의료재단', '실로암의원', 'Y&T성모마취과', '광진성모의원', '서울현대의원', '이노신경과의원', '송정훼밀리의원', '서울중앙의원', '영남의료재단', '인제대학교서울백병원', '한국필의료재단', '세브란스의원', '가톨릭대학교성바오로병원장례식장', '서울연세의원', '사랑의병원', '성삼의료재단미즈메디병원', '씨엠충무병원', '성신의원', '원진재단부설녹색병원', '송파제일의원', '카톨릭성모의원', '한양성심의원', '관악성모의원', '강남센트럴병원', '우이한솔의원', '우리들병원', '서울성모병원어린이집', '건국대학교병원', '서울적십자병원', '북부성모의원', '한림대학교부속한강성심병원장례식장', '서울성모병원응급의료센터', '라마르의원', '가톨릭대학교여의도성모병원', '씨엠병원'], dtype=object)
#상호명에서 특정 단어 들어간거 찾기 - 꽃배달
df_seoul_hospital[df_seoul_hospital["상호명"].str.contains("꽃배달")]
상가업소번호 | 상호명 | 상권업종대분류코드 | 상권업종대분류명 | 상권업종중분류코드 | 상권업종중분류명 | 상권업종소분류코드 | 상권업종소분류명 | 시도명 | 시군구코드 | ... | 지번주소 | 도로명코드 | 도로명 | 건물본번지 | 건물관리번호 | 도로명주소 | 구우편번호 | 신우편번호 | 경도 | 위도 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
2803 | 20895655 | 서울성모병원장례식장꽃배달 | S | 의료 | S01 | 병원 | S01B01 | 종합병원 | 서울특별시 | 11650.0 | ... | 서울특별시 서초구 반포동 551 | 116504163330 | 서울특별시 서초구 사평대로28길 | 55 | 1165010700105510000017194 | 서울특별시 서초구 사평대로28길 55 | 137040.0 | 6578.0 | 127.000682 | 37.498257 |
4644 | 22020310 | 강남성모병원장례식장꽃배달 | S | 의료 | S01 | 병원 | S01B01 | 종합병원 | 서울특별시 | 11650.0 | ... | 서울특별시 서초구 반포동 547-6 | 116504163242 | 서울특별시 서초구 반포대로39길 | 56 | 1165010700105470006016762 | 서울특별시 서초구 반포대로39길 56-24 | 137040.0 | 6578.0 | 127.001756 | 37.499095 |
2 rows × 29 columns
#상호명에서 특정 단어 들어간거 찾기 - 의료기
df_seoul_hospital[df_seoul_hospital["상호명"].str.contains("의료기")]
상가업소번호 | 상호명 | 상권업종대분류코드 | 상권업종대분류명 | 상권업종중분류코드 | 상권업종중분류명 | 상권업종소분류코드 | 상권업종소분류명 | 시도명 | 시군구코드 | ... | 지번주소 | 도로명코드 | 도로명 | 건물본번지 | 건물관리번호 | 도로명주소 | 구우편번호 | 신우편번호 | 경도 | 위도 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1917 | 23210677 | 평화드림여의도성모병원의료기매장 | S | 의료 | S01 | 병원 | S01B01 | 종합병원 | 서울특별시 | 11560.0 | ... | 서울특별시 영등포구 여의도동 62 | 115603118001 | 서울특별시 영등포구 63로 | 10 | 1156011000100620000031477 | 서울특별시 영등포구 63로 10 | 150713.0 | 7345.0 | 126.936693 | 37.518296 |
1 rows × 29 columns
# 꽃배달, 의료기, 장례식장, 상담소, 어린이집 -> 전처리를 위해 한번에 검색하기
#제거할 데이터의 인덱스 알아내기
#drop_row에 리스트 저장
drop_row= df_seoul_hospital[df_seoul_hospital["상호명"].str.contains("꽃배달|의료기|장례식장|상담소|어린이집")].index
drop_row = drop_row.tolist()
drop_row
[1917, 2803, 4431, 4644, 7938, 10283, 47008, 60645, 70177]
# 의원으로 끝나는 데이터도 찾기
#endswith() 이용
drop_row2= df_seoul_hospital[df_seoul_hospital["상호명"].str.endswith("의원")].index
drop_row2 = drop_row2.tolist()
drop_row2
[8479, 12854, 13715, 14966, 16091, 18047, 20200, 20415, 30706, 32889, 34459, 34720, 35696, 37251, 45120, 49626, 51575, 55133, 56320, 56404, 56688, 57551, 62113, 76508]
#drop_row에 삭제할 index들 다 합쳐주기
drop_row=drop_row+drop_row2
#해당 index들 삭제
#삭제할때 drop 사용
#위에서의 제거하기와 다르게 행을 기준으로 삭제하기 때문에 axis=0으로 해줌
print(df_seoul_hospital.shape)
df_seoul_hospital = df_seoul_hospital.drop(drop_row, axis=0)
print(df_seoul_hospital.shape)
(91, 29) (58, 29)
#종합병원 막대그래프로 그리기
df_seoul_hospital["시군구명"].value_counts().plot.bar()
<AxesSubplot:>
#seaborn countplot그리기
plt.figure(figsize=(15,4))
sns.countplot(data=df_seoul_hospital, x="시군구명")
<AxesSubplot:xlabel='시군구명', ylabel='count'>
#정렬을 하고싶다면 order에 value_counts에서 index를 뽑아내어 나타냄
plt.figure(figsize=(15,4))
sns.countplot(data=df_seoul_hospital, x="시군구명",
order=df_seoul_hospital["시군구명"].value_counts().index)
<AxesSubplot:xlabel='시군구명', ylabel='count'>
특정지역만 보기¶
# 서울 데이터만 받아오기
# 새로운 변수에 데이터프레임을 저장할때는 copy()사용
df_seoul = df[df["시도명"]=="서울특별시"].copy()
df_seoul.shape
(18943, 29)
#seaborn을 이용하여 시군구명을 기준으로 시각화
plt.figure(figsize=(15,4))
sns.countplot(data=df_seoul, x="시군구명")
<AxesSubplot:xlabel='시군구명', ylabel='count'>
#plot.bar()로 시각화
df_seoul["시군구명"].value_counts().plot.bar()
<AxesSubplot:>
#pandas의 plot.scatter() 를 이용하여 위도, 경도 표시
#scatter는 x, y축 데이터가 꼭들어가야함
df_seoul[["경도", "위도","시군구명"]].plot.scatter(x="경도",y="위도", figsize=(8,8), grid=True)
<AxesSubplot:xlabel='경도', ylabel='위도'>
#seaborn의 scatterplot 이용하여 그리기
plt.figure(figsize=(9, 8))
sns.scatterplot(data=df_seoul, x="경도", y="위도", hue="시군구명")
#hue 옵션은 색상임. 시군구별로 색이 다르게 표시
<AxesSubplot:xlabel='경도', ylabel='위도'>
#seaborn의 scatterplot 이용하여 그리기. 상권업종분류명을 기준으로 색표시
plt.figure(figsize=(9, 8))
sns.scatterplot(data=df_seoul, x="경도", y="위도", hue="상권업종중분류명")
<AxesSubplot:xlabel='경도', ylabel='위도'>
#전국 데이터(df)에서 그리기. 시도 기준으로 색표시
plt.figure(figsize=(9, 8))
sns.scatterplot(data=df, x="경도", y="위도", hue="시도명")
<AxesSubplot:xlabel='경도', ylabel='위도'>
import folium
folium.Map()
#지도 중심을 구하기 위해 위도, 경도의 mean값 구하기
df_seoul_hospital["위도"].mean()
df_seoul_hospital["경도"].mean()
126.9963589356625
#location값을 리스트 형태로 넣기
#지도의 중심 잡아줌
map = folium.Map(location = [df_seoul_hospital["위도"].mean(),df_seoul_hospital["경도"].mean()], zoom_start=12)
#for문을 이용하여 df_seoul_hospital의 값을 하나씩 출력
for n in df_seoul_hospital.index:
name = df_seoul_hospital.loc[n, "상호명"] #n번째 행에 들어있는 값을 loc를 이용하여 행으로 가져옴. 이때 상호명만 가져옴
address = df_seoul_hospital.loc[n, "도로명"]
popup = f"{name}-{address}" #문자열 포멧팅을 하여 name과 address 연결
location = [df_seoul_hospital.loc[n, "위도"],df_seoul_hospital.loc[n, "경도"]]
folium.Marker(
location=location,
popup=popup,
).add_to(map)
map