🖥️데이터 전처리 - 데이터과학의 불편한 진실
데이터 분석을 하려면....
"데이터에 대한 오류를 검증이 꼭 필요하다"고 말했던 걸 뼈져리게 느꼈다😭😭😭😭😭😭
몇 시간의 노력이 물거품이 되었기때문!!🌪️
현실세계의 데이터는 오류 투성이임을 인식하라고 엄청엄청 수업시간에 강조하셨는데....
공공데이터포털에서 다운 받은 거니까 엄청 신뢰하고 있었는데 ㅠㅠ
힝.... 이게 모야
최근 읽었던 '빅데이터 분석과 활용' 책 중에 데이터 전처리에 대해 강조한 파트가 있었다.
데이터 사이언티스트 카밀 바르토차(Kamil Bartocha)는
저서 <데이터 과학의 불편한 진실(The Inconvenient Truth About Data Science)>에
아래처럼 데이터의 성질을 11가지로 정리하였다.
The Inconvenient Truth About Data Science
1. Data is never clean. 데이터는 절대 깨끗하지 않다.
2. You will spend most of your time cleaning and preparing data. 분석의 대부분 시간을 전처리 단계에서 보내게 될 것이다.
3. 95% of tasks do not require deep learning. 95%의 일은 딥러닝이 필요 없다
4. In 90% of cases generalized linear regression will do the trick. 분석의 90%는 일반화 선형 모형으로 해결된다.
5. Big Data is just a tool. 빅데이터는 단지 도구일 뿐이다
6. You should embrace the Bayesian approach. 베이지안 접근을 포용해야 한다.
7. No one cares how you did it. 당신이 어떤 방법을 사용했는가는 사용자 입장에서는 중요하지 않다.
8. Academia and business are two different worlds. 학계와 산업계는 서로 다른 세계다
9. Presentation is key - be a master of Power Point. 프리젠테이션이 핵심이다. 파워포인트의 마스터가 되어라!10. All models are false, but some are useful. 모든 모델은 틀렸다. 하지만 몇몇은 유용하다.
11. There is no fully automated Data Science. You need to get your hands dirty. 완전 자동화된 데이터 과학 같은 것은 없다. 인간이 개입되어야 할 부분이 있다.
그래도... 일단 주피터노트로 전처리한 과정을 첨부해본다.
🖥️Jupyter notebook 데이터 전처리 코드
데이터 불러오기&파악하기¶
import pandas as pd
df= pd.read_csv("hospital.csv", encoding="CP949")
df
상가업소번호 | 상호명 | 지점명 | 상권업종대분류코드 | 상권업종대분류명 | 상권업종중분류코드 | 상권업종중분류명 | 상권업종소분류코드 | 상권업종소분류명 | 표준산업분류코드 | ... | 건물관리번호 | 건물명 | 도로명주소 | 구우편번호 | 신우편번호 | 동정보 | 층정보 | 호정보 | 경도 | 위도 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 19956873 | 하나산부인과 | NaN | S | 의료 | S01 | 병원 | S01B10 | 산부인과 | Q86201 | ... | 4.130000e+24 | 산호한양아파트 | 경기도 안산시 단원구 달미로 10 | 425764.0 | 15236.0 | NaN | NaN | NaN | 126.814295 | 37.336344 |
1 | 20024149 | 타워광명내과의원 | NaN | S | 의료 | S01 | 병원 | S01B07 | 내과/외과 | Q86201 | ... | 1.170000e+24 | NaN | 서울특별시 강남구 언주로30길 39 | 135270.0 | 6292.0 | NaN | 4.0 | NaN | 127.053198 | 37.488742 |
2 | 20152277 | 조정현신경외과의원 | NaN | S | 의료 | S01 | 병원 | S01B15 | 신경외과 | Q86201 | ... | 4.140000e+24 | 한라프라자 | 경기도 시흥시 중심상가로 178 | 429450.0 | 15066.0 | NaN | NaN | NaN | 126.734841 | 37.344955 |
3 | 20350610 | 한귀원정신과의원 | NaN | S | 의료 | S01 | 병원 | S01B99 | 기타병원 | NaN | ... | 2.650000e+24 | NaN | 부산광역시 수영구 수영로 688 | 613100.0 | 48266.0 | NaN | 5.0 | NaN | 129.115438 | 35.166872 |
4 | 20364049 | 더블유스토어수지점 | 수지점 | S | 의료 | S02 | 약국/한약방 | S02A01 | 약국 | G47811 | ... | 4.150000e+24 | NaN | 경기도 용인시 수지구 문정로 32 | 448170.0 | 16837.0 | NaN | 1.0 | NaN | 127.095522 | 37.323528 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
91330 | 16196725 | 온누리약국 | 베스트 | S | 의료 | S02 | 약국/한약방 | S02A01 | 약국 | G47811 | ... | 3.020000e+24 | NaN | 대전광역시 서구 문예로 67 | 302831.0 | 35240.0 | NaN | NaN | NaN | 127.389865 | 36.352728 |
91331 | 16192180 | 리원 | 봄산후조 | S | 의료 | S07 | 의료관련서비스업 | S07A07 | 산후조리원 | S96993 | ... | 4.130000e+24 | 청한프라자 | 경기도 고양시 덕양구 성신로 14 | 412827.0 | 10503.0 | NaN | NaN | NaN | 126.830144 | 37.627530 |
91332 | 16127538 | 참좋은요양병원 | NaN | S | 의료 | S01 | 병원 | S01B17 | 노인/치매병원 | Q86102 | ... | 2.640000e+24 | 한신시티빌 | 부산광역시 금정구 금강로 209 | 609841.0 | 46294.0 | NaN | 2.0 | NaN | 129.082790 | 35.227138 |
91333 | 16108681 | 경희중앙한의원 | NaN | S | 의료 | S01 | 병원 | S01B06 | 한의원 | Q86203 | ... | 1.170000e+24 | NaN | 서울특별시 강동구 천중로 213 | 134811.0 | 5303.0 | NaN | NaN | NaN | 127.143958 | 37.540993 |
91334 | 16109073 | 천안김안과천안역본점의원 | NaN | S | 의료 | S01 | 병원 | S01B13 | 안과의원 | Q86201 | ... | 4.410000e+24 | 김안과 | 충청남도 천안시 동남구 중앙로 92 | 330952.0 | 31127.0 | NaN | NaN | NaN | 127.152651 | 36.806640 |
91335 rows × 39 columns
df.columns
Index(['상가업소번호', '상호명', '지점명', '상권업종대분류코드', '상권업종대분류명', '상권업종중분류코드',
'상권업종중분류명', '상권업종소분류코드', '상권업종소분류명', '표준산업분류코드', '표준산업분류명', '시도코드',
'시도명', '시군구코드', '시군구명', '행정동코드', '행정동명', '법정동코드', '법정동명', '지번코드',
'대지구분코드', '대지구분명', '지번본번지', '지번부번지', '지번주소', '도로명코드', '도로명', '건물본번지',
'건물부번지', '건물관리번호', '건물명', '도로명주소', '구우편번호', '신우편번호', '동정보', '층정보',
'호정보', '경도', '위도'],
dtype='object')
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 float64
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 float64
26 도로명 91335 non-null object
27 건물본번지 91335 non-null int64
28 건물부번지 10604 non-null float64
29 건물관리번호 91335 non-null float64
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 층정보 43989 non-null float64
36 호정보 15437 non-null float64
37 경도 91335 non-null float64
38 위도 91335 non-null float64
dtypes: float64(14), int64(5), object(20)
memory usage: 27.2+ MB
df.shape
(91335, 39)
결측치 파악하기¶
null_sum=df.isnull().sum()
null_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
층정보 47346
호정보 75898
경도 0
위도 0
dtype: int64
#결측치 데이터프레임
null_df = null_sum.reset_index()
null_df
index | 0 | |
---|---|---|
0 | 상가업소번호 | 0 |
1 | 상호명 | 0 |
2 | 지점명 | 89989 |
3 | 상권업종대분류코드 | 0 |
4 | 상권업종대분류명 | 0 |
5 | 상권업종중분류코드 | 0 |
6 | 상권업종중분류명 | 0 |
7 | 상권업종소분류코드 | 0 |
8 | 상권업종소분류명 | 0 |
9 | 표준산업분류코드 | 4922 |
10 | 표준산업분류명 | 4922 |
11 | 시도코드 | 379 |
12 | 시도명 | 379 |
13 | 시군구코드 | 379 |
14 | 시군구명 | 379 |
15 | 행정동코드 | 0 |
16 | 행정동명 | 379 |
17 | 법정동코드 | 55 |
18 | 법정동명 | 55 |
19 | 지번코드 | 0 |
20 | 대지구분코드 | 0 |
21 | 대지구분명 | 0 |
22 | 지번본번지 | 0 |
23 | 지번부번지 | 19256 |
24 | 지번주소 | 0 |
25 | 도로명코드 | 0 |
26 | 도로명 | 0 |
27 | 건물본번지 | 0 |
28 | 건물부번지 | 80731 |
29 | 건물관리번호 | 0 |
30 | 건물명 | 44882 |
31 | 도로명주소 | 0 |
32 | 구우편번호 | 12 |
33 | 신우편번호 | 2 |
34 | 동정보 | 83929 |
35 | 층정보 | 47346 |
36 | 호정보 | 75898 |
37 | 경도 | 0 |
38 | 위도 | 0 |
null_df.columns=["컬럼명","null개수"]
null_df
컬럼명 | null개수 | |
---|---|---|
0 | 상가업소번호 | 0 |
1 | 상호명 | 0 |
2 | 지점명 | 89989 |
3 | 상권업종대분류코드 | 0 |
4 | 상권업종대분류명 | 0 |
5 | 상권업종중분류코드 | 0 |
6 | 상권업종중분류명 | 0 |
7 | 상권업종소분류코드 | 0 |
8 | 상권업종소분류명 | 0 |
9 | 표준산업분류코드 | 4922 |
10 | 표준산업분류명 | 4922 |
11 | 시도코드 | 379 |
12 | 시도명 | 379 |
13 | 시군구코드 | 379 |
14 | 시군구명 | 379 |
15 | 행정동코드 | 0 |
16 | 행정동명 | 379 |
17 | 법정동코드 | 55 |
18 | 법정동명 | 55 |
19 | 지번코드 | 0 |
20 | 대지구분코드 | 0 |
21 | 대지구분명 | 0 |
22 | 지번본번지 | 0 |
23 | 지번부번지 | 19256 |
24 | 지번주소 | 0 |
25 | 도로명코드 | 0 |
26 | 도로명 | 0 |
27 | 건물본번지 | 0 |
28 | 건물부번지 | 80731 |
29 | 건물관리번호 | 0 |
30 | 건물명 | 44882 |
31 | 도로명주소 | 0 |
32 | 구우편번호 | 12 |
33 | 신우편번호 | 2 |
34 | 동정보 | 83929 |
35 | 층정보 | 47346 |
36 | 호정보 | 75898 |
37 | 경도 | 0 |
38 | 위도 | 0 |
null_df_sort=null_df.sort_values(by="null개수", ascending=False)
null_df_sort
컬럼명 | null개수 | |
---|---|---|
2 | 지점명 | 89989 |
34 | 동정보 | 83929 |
28 | 건물부번지 | 80731 |
36 | 호정보 | 75898 |
35 | 층정보 | 47346 |
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 |
# top11까지는 drop시키기
null_df_sort=null_df_sort.head(11)
null_df_sort
컬럼명 | null개수 | |
---|---|---|
2 | 지점명 | 89989 |
34 | 동정보 | 83929 |
28 | 건물부번지 | 80731 |
36 | 호정보 | 75898 |
35 | 층정보 | 47346 |
30 | 건물명 | 44882 |
23 | 지번부번지 | 19256 |
9 | 표준산업분류코드 | 4922 |
10 | 표준산업분류명 | 4922 |
11 | 시도코드 | 379 |
13 | 시군구코드 | 379 |
null_top11 = null_df_sort["컬럼명"].tolist()
null_top11
['지점명',
'동정보',
'건물부번지',
'호정보',
'층정보',
'건물명',
'지번부번지',
'표준산업분류코드',
'표준산업분류명',
'시도코드',
'시군구코드']
#결측치 top11 제거하기
df = df.drop(columns=null_top11, axis=1)
df
상가업소번호 | 상호명 | 상권업종대분류코드 | 상권업종대분류명 | 상권업종중분류코드 | 상권업종중분류명 | 상권업종소분류코드 | 상권업종소분류명 | 시도명 | 시군구명 | ... | 지번주소 | 도로명코드 | 도로명 | 건물본번지 | 건물관리번호 | 도로명주소 | 구우편번호 | 신우편번호 | 경도 | 위도 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 19956873 | 하나산부인과 | S | 의료 | S01 | 병원 | S01B10 | 산부인과 | 경기도 | 안산시 단원구 | ... | 경기도 안산시 단원구 선부동 1081 | 4.130000e+11 | 경기도 안산시 단원구 달미로 | 10 | 4.130000e+24 | 경기도 안산시 단원구 달미로 10 | 425764.0 | 15236.0 | 126.814295 | 37.336344 |
1 | 20024149 | 타워광명내과의원 | S | 의료 | S01 | 병원 | S01B07 | 내과/외과 | 서울특별시 | 강남구 | ... | 서울특별시 강남구 도곡동 467-14 | 1.170000e+11 | 서울특별시 강남구 언주로30길 | 39 | 1.170000e+24 | 서울특별시 강남구 언주로30길 39 | 135270.0 | 6292.0 | 127.053198 | 37.488742 |
2 | 20152277 | 조정현신경외과의원 | S | 의료 | S01 | 병원 | S01B15 | 신경외과 | 경기도 | 시흥시 | ... | 경기도 시흥시 정왕동 1740-1 | 4.140000e+11 | 경기도 시흥시 중심상가로 | 178 | 4.140000e+24 | 경기도 시흥시 중심상가로 178 | 429450.0 | 15066.0 | 126.734841 | 37.344955 |
3 | 20350610 | 한귀원정신과의원 | S | 의료 | S01 | 병원 | S01B99 | 기타병원 | 부산광역시 | 수영구 | ... | 부산광역시 수영구 광안동 74-1 | 2.650000e+11 | 부산광역시 수영구 수영로 | 688 | 2.650000e+24 | 부산광역시 수영구 수영로 688 | 613100.0 | 48266.0 | 129.115438 | 35.166872 |
4 | 20364049 | 더블유스토어수지점 | S | 의료 | S02 | 약국/한약방 | S02A01 | 약국 | 경기도 | 용인시 수지구 | ... | 경기도 용인시 수지구 풍덕천동 712-2 | 4.150000e+11 | 경기도 용인시 수지구 문정로 | 32 | 4.150000e+24 | 경기도 용인시 수지구 문정로 32 | 448170.0 | 16837.0 | 127.095522 | 37.323528 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
91330 | 16196725 | 온누리약국 | S | 의료 | S02 | 약국/한약방 | S02A01 | 약국 | 대전광역시 | 서구 | ... | 대전광역시 서구 둔산동 1507 | 3.020000e+11 | 대전광역시 서구 문예로 | 67 | 3.020000e+24 | 대전광역시 서구 문예로 67 | 302831.0 | 35240.0 | 127.389865 | 36.352728 |
91331 | 16192180 | 리원 | S | 의료 | S07 | 의료관련서비스업 | S07A07 | 산후조리원 | 경기도 | 고양시 덕양구 | ... | 경기도 고양시 덕양구 화정동 1146 | 4.130000e+11 | 경기도 고양시 덕양구 성신로 | 14 | 4.130000e+24 | 경기도 고양시 덕양구 성신로 14 | 412827.0 | 10503.0 | 126.830144 | 37.627530 |
91332 | 16127538 | 참좋은요양병원 | S | 의료 | S01 | 병원 | S01B17 | 노인/치매병원 | 부산광역시 | 금정구 | ... | 부산광역시 금정구 장전동 538-1 | 2.640000e+11 | 부산광역시 금정구 금강로 | 209 | 2.640000e+24 | 부산광역시 금정구 금강로 209 | 609841.0 | 46294.0 | 129.082790 | 35.227138 |
91333 | 16108681 | 경희중앙한의원 | S | 의료 | S01 | 병원 | S01B06 | 한의원 | 서울특별시 | 강동구 | ... | 서울특별시 강동구 길동 345-9 | 1.170000e+11 | 서울특별시 강동구 천중로 | 213 | 1.170000e+24 | 서울특별시 강동구 천중로 213 | 134811.0 | 5303.0 | 127.143958 | 37.540993 |
91334 | 16109073 | 천안김안과천안역본점의원 | S | 의료 | S01 | 병원 | S01B13 | 안과의원 | 충청남도 | 천안시 동남구 | ... | 충청남도 천안시 동남구 원성동 266-17 | 4.410000e+11 | 충청남도 천안시 동남구 중앙로 | 92 | 4.410000e+24 | 충청남도 천안시 동남구 중앙로 92 | 330952.0 | 31127.0 | 127.152651 | 36.806640 |
91335 rows × 28 columns
df.shape
(91335, 28)
# In[5]와 In[14]를 비교하면 11개 빠져있음 (91335,39) -> (91335,28)
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 91335 entries, 0 to 91334
Data columns (total 28 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 상가업소번호 91335 non-null int64
1 상호명 91335 non-null object
2 상권업종대분류코드 91335 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 시도명 90956 non-null object
9 시군구명 90956 non-null object
10 행정동코드 91335 non-null int64
11 행정동명 90956 non-null object
12 법정동코드 91280 non-null float64
13 법정동명 91280 non-null object
14 지번코드 91335 non-null float64
15 대지구분코드 91335 non-null int64
16 대지구분명 91335 non-null object
17 지번본번지 91335 non-null int64
18 지번주소 91335 non-null object
19 도로명코드 91335 non-null float64
20 도로명 91335 non-null object
21 건물본번지 91335 non-null int64
22 건물관리번호 91335 non-null float64
23 도로명주소 91335 non-null object
24 구우편번호 91323 non-null float64
25 신우편번호 91333 non-null float64
26 경도 91335 non-null float64
27 위도 91335 non-null float64
dtypes: float64(8), int64(5), object(15)
memory usage: 19.5+ MB
%matplotlib inline
import matplotlib as mpl
import matplotlib.pyplot as plt
from matplotlib import font_manager, rc
path = "c:/Windows/Fonts/malgun.ttf"
font_name = font_manager.FontProperties(fname=path).get_name()
plt.rc('font', family=font_name)
import seaborn as sns
unique 값알기¶
df["상권업종대분류명"].unique()
array(['의료'], dtype=object)
df["상권업종대분류명"].nunique()
1
df["상권업종중분류명"].unique()
array(['병원', '약국/한약방', '수의업', '유사의료업', '의료관련서비스업'], dtype=object)
df["상권업종중분류명"].nunique()
5
df["상권업종소분류명"].unique()
array(['산부인과', '내과/외과', '신경외과', '기타병원', '약국', '동물병원', '한약방', '탕제원',
'정형/성형외과', '소아과', '이비인후과의원', '노인/치매병원', '언어치료', '수의업-종합', '한의원',
'치과의원', '침구원', '일반병원', '안과의원', '조산원', '한방병원', '종합병원', '유사의료업기타',
'응급구조대', '혈액원', '치과병원', '척추교정치료', '피부과', '비뇨기과', '치과기공소', '산후조리원',
'접골원', '수의업-기타', '제대혈'], dtype=object)
df["상권업종소분류명"].nunique()
34
df["시도명"].unique()
array(['경기도', '서울특별시', '부산광역시', '강원도', '충청북도', '경상남도', '전라남도', '경상북도',
'광주광역시', '대구광역시', '충청남도', '인천광역시', '전라북도', '대전광역시', '울산광역시',
'제주특별자치도', '세종특별자치시', nan], dtype=object)
df["시도명"].nunique()
17
df["시군구명"].unique()
array(['안산시 단원구', '강남구', '시흥시', '수영구', '용인시 수지구', '고양시 덕양구', '춘천시',
'청주시 상당구', '합천군', '고양시 일산서구', '목포시', '영암군', '화성시', '경주시',
'안양시 동안구', '서구', '남양주시', '북구', '금정구', '안동시', '담양군', '남구',
'창원시 성산구', '달성군', '성남시 수정구', '강동구', '동두천시', '평택시', '영천시', '영주시',
'의정부시', '성남시 분당구', '노원구', '성남시 중원구', '서초구', '포항시 남구', '여수시', '장흥군',
'계룡시', '연수구', '전주시 완산구', '김포시', '서대문구', '부천시', '광양시', '정읍시', '포천시',
'보령시', '익산시', '고양시 일산동구', '화순군', '순천시', '가평군', '전주시 덕진구', '달서구',
'경산시', '함평군', '창원시 의창구', '원주시', '제천시', '부산진구', '동구', '영등포구', '괴산군',
'중구', '영도구', '관악구', '안산시 상록구', '대덕구', '서천군', '수원시 권선구', '상주시',
'청주시 서원구', '종로구', '군산시', '강릉시', '수성구', '당진시', '홍성군', '속초시', '청양군',
'충주시', '중랑구', '아산시', '성동구', '횡성군', '용산구', '청주시 청원구', '동대문구', '옥천군',
'광진구', '동래구', '해운대구', '공주시', '사하구', '광명시', '구리시', '강서구', '예천군',
'청주시 흥덕구', '제주시', '계양구', '부평구', '안양시 만안구', '무안군', '광산구', '마포구',
'금천구', '세종특별자치시', '김해시', nan, '의성군', '김천시', '함양군', '여주시', '송파구',
'하남시', '완주군', '광주시', '고령군', '남해군', '삼척시', '문경시', '강진군', '해남군',
'영광군', '파주시', '구미시', '동작구', '군포시', '용인시 기흥구', '창원시 마산회원구',
'수원시 영통구', '부여군', '창원시 진해구', '영월군', '과천시', '사상구', '양천구', '울주군',
'도봉구', '은평구', '오산시', '금산군', '이천시', '거제시', '밀양시', '포항시 북구', '양주시',
'양산시', '수원시 팔달구', '남동구', '유성구', '강북구', '울진군', '영덕군', '영양군', '청송군',
'연제구', '진주시', '수원시 장안구', '성북구', '성주군', '양평군', '거창군', '기장군', '창녕군',
'사천시', '의령군', '나주시', '의왕시', '창원시 마산합포구', '고성군', '구례군', '산청군',
'고흥군', '보성군', '칠곡군', '완도군', '장성군', '신안군', '진도군', '용인시 처인구', '봉화군',
'연천군', '안성시', '장수군', '진안군', '남원시', '임실군', '고창군', '부안군', '옹진군',
'예산군', '강화군', '무주군', '김제시', '정선군', '순창군', '서귀포시', '구로구', '통영시',
'천안시 동남구', '동해시', '천안시 서북구', '태백시', '홍천군', '논산시', '서산시', '화천군',
'태안군', '철원군', '평창군', '진천군', '증평군', '단양군', '청도군', '함안군', '음성군',
'보은군', '하동군', '곡성군', '양양군', '양구군', '영동군', '인제군', '군위군', '울릉군',
'미추홀구'], dtype=object)
경기도 수원 종합병원¶
#경기도 수원시 종합병원
suwon_general_hospital= df[(df["시도명"]=="경기도")&
(df["상권업종소분류명"] == "종합병원")&
(df["시군구명"].str.contains("수원시",case=False))]
suwon_general_hospital
상가업소번호 | 상호명 | 상권업종대분류코드 | 상권업종대분류명 | 상권업종중분류코드 | 상권업종중분류명 | 상권업종소분류코드 | 상권업종소분류명 | 시도명 | 시군구명 | ... | 지번주소 | 도로명코드 | 도로명 | 건물본번지 | 건물관리번호 | 도로명주소 | 구우편번호 | 신우편번호 | 경도 | 위도 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
6693 | 25560409 | 베데스다병원 | S | 의료 | S01 | 병원 | S01B01 | 종합병원 | 경기도 | 수원시 영통구 | ... | 경기도 수원시 영통구 영통동 958-1 | 4.110000e+11 | 경기도 수원시 영통구 봉영로 | 1623 | 4.110000e+24 | 경기도 수원시 영통구 봉영로 1623 | 443470.0 | 16703.0 | 127.074720 | 37.255930 |
9056 | 20779039 | 수원한독병원 | S | 의료 | S01 | 병원 | S01B01 | 종합병원 | 경기도 | 수원시 팔달구 | ... | 경기도 수원시 팔달구 인계동 966 | 4.110000e+11 | 경기도 수원시 팔달구 경수대로479번길 | 10 | 4.110000e+24 | 경기도 수원시 팔달구 경수대로479번길 10-26 | 442832.0 | 16481.0 | 127.027178 | 37.270237 |
17072 | 24499189 | 한국병원 | S | 의료 | S01 | 병원 | S01B01 | 종합병원 | 경기도 | 수원시 장안구 | ... | 경기도 수원시 장안구 송죽동 495-4 | 4.110000e+11 | 경기도 수원시 장안구 경수대로 | 969 | 4.110000e+24 | 경기도 수원시 장안구 경수대로 969 | 440805.0 | 16304.0 | 127.004726 | 37.303931 |
17641 | 24436834 | 우석연무아주의원 | S | 의료 | S01 | 병원 | S01B01 | 종합병원 | 경기도 | 수원시 장안구 | ... | 경기도 수원시 장안구 연무동 249 | 4.110000e+11 | 경기도 수원시 장안구 월드컵로428번길 | 10 | 4.110000e+24 | 경기도 수원시 장안구 월드컵로428번길 10 | 440814.0 | 16220.0 | 127.025959 | 37.293952 |
18493 | 22013020 | 가톨릭대학교성빈센트병원장례식장 | S | 의료 | S01 | 병원 | S01B01 | 종합병원 | 경기도 | 수원시 팔달구 | ... | 경기도 수원시 팔달구 지동 93-6 | 4.110000e+11 | 경기도 수원시 팔달구 중부대로 | 93 | 4.110000e+24 | 경기도 수원시 팔달구 중부대로 93 | 442836.0 | 16247.0 | 127.027440 | 37.277916 |
21051 | 26222515 | 삼성의료재단강북삼성수원의원 | S | 의료 | S01 | 병원 | S01B01 | 종합병원 | 경기도 | 수원시 영통구 | ... | 경기도 수원시 영통구 매탄동 416 | 4.110000e+11 | 경기도 수원시 영통구 삼성로 | 129 | 4.110000e+24 | 경기도 수원시 영통구 삼성로 129 | 443742.0 | 16677.0 | 127.053122 | 37.257633 |
23419 | 8810915 | 동서의원 | S | 의료 | S01 | 병원 | S01B01 | 종합병원 | 경기도 | 수원시 팔달구 | ... | 경기도 수원시 팔달구 구천동 10-44 | 4.110000e+11 | 경기도 수원시 팔달구 중부대로 | 16 | 4.110000e+24 | 경기도 수원시 팔달구 중부대로 16 | 442140.0 | 16263.0 | 127.018389 | 37.275039 |
39592 | 22025001 | 인구보건복지협회 | S | 의료 | S01 | 병원 | S01B01 | 종합병원 | 경기도 | 수원시 팔달구 | ... | 경기도 수원시 팔달구 매산로3가 126-12 | 4.110000e+11 | 경기도 수원시 팔달구 고화로14번길 | 11 | 4.110000e+24 | 경기도 수원시 팔달구 고화로14번길 11 | 442852.0 | 16456.0 | 127.008292 | 37.271089 |
44805 | 24439488 | 김명원마취과의원 | S | 의료 | S01 | 병원 | S01B01 | 종합병원 | 경기도 | 수원시 장안구 | ... | 경기도 수원시 장안구 조원동 894 | 4.110000e+11 | 경기도 수원시 장안구 경수대로 | 940 | 4.110000e+24 | 경기도 수원시 장안구 경수대로 940 | 440200.0 | 16295.0 | 127.008041 | 37.303139 |
9 rows × 28 columns
suwon_general_hospital.describe(include="object")
상호명 | 상권업종대분류코드 | 상권업종대분류명 | 상권업종중분류코드 | 상권업종중분류명 | 상권업종소분류코드 | 상권업종소분류명 | 시도명 | 시군구명 | 행정동명 | 법정동명 | 대지구분명 | 지번주소 | 도로명 | 도로명주소 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
count | 9 | 9 | 9 | 9 | 9 | 9 | 9 | 9 | 9 | 9 | 9 | 9 | 9 | 9 | 9 |
unique | 9 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 3 | 9 | 9 | 1 | 9 | 7 | 9 |
top | 베데스다병원 | S | 의료 | S01 | 병원 | S01B01 | 종합병원 | 경기도 | 수원시 팔달구 | 영통2동 | 영통동 | 대지 | 경기도 수원시 영통구 영통동 958-1 | 경기도 수원시 장안구 경수대로 | 경기도 수원시 영통구 봉영로 1623 |
freq | 1 | 9 | 9 | 9 | 9 | 9 | 9 | 9 | 4 | 1 | 1 | 9 | 1 | 2 | 1 |
# 수원시 구별 count 그래프
sns.countplot(data=suwon_general_hospital, y="시군구명")
<AxesSubplot:xlabel='count', ylabel='시군구명'>
# 경도, 위도로 찍기 ==> 실패. 데이터가 적음 ==> folium 이용
suwon_general_hospital[["경도", "위도", "시군구명"]].plot.scatter(
x="경도", y="위도", figsize=(5,5), grid=True)
<AxesSubplot:xlabel='경도', ylabel='위도'>
folium 사용하기¶
!pip install folium
Collecting folium
Downloading folium-0.12.1.post1-py2.py3-none-any.whl (95 kB)
Collecting branca>=0.3.0
Downloading branca-0.4.2-py3-none-any.whl (24 kB)
Requirement already satisfied: numpy in c:\users\light\anaconda3\lib\site-packages (from folium) (1.20.3)
Requirement already satisfied: jinja2>=2.9 in c:\users\light\anaconda3\lib\site-packages (from folium) (2.11.3)
Requirement already satisfied: requests in c:\users\light\anaconda3\lib\site-packages (from folium) (2.26.0)
Requirement already satisfied: MarkupSafe>=0.23 in c:\users\light\anaconda3\lib\site-packages (from jinja2>=2.9->folium) (2.0.1)
Requirement already satisfied: urllib3<1.27,>=1.21.1 in c:\users\light\anaconda3\lib\site-packages (from requests->folium) (1.26.7)
Requirement already satisfied: certifi>=2017.4.17 in c:\users\light\anaconda3\lib\site-packages (from requests->folium) (2021.10.8)
Requirement already satisfied: charset-normalizer~=2.0.0 in c:\users\light\anaconda3\lib\site-packages (from requests->folium) (2.0.4)
Requirement already satisfied: idna<4,>=2.5 in c:\users\light\anaconda3\lib\site-packages (from requests->folium) (3.2)
Installing collected packages: branca, folium
Successfully installed branca-0.4.2 folium-0.12.1.post1
import folium
map_df = suwon_general_hospital.copy()
map_image= folium.Map(location=[map_df["위도"].mean(), map_df["경도"].mean()],
zoom_start=12)
for i in map_df.index:
popup_name = map_df.loc[i, '상호명'] + ' - ' + map_df.loc[i, '도로명주소']
folium.Marker(
location=[map_df.loc[i,'위도'], map_df.loc[i, '경도']],
popup=popup_name
).add_to(map_image)
map_image
csv로 저장하기¶
suwon_general_hospital.to_csv("suwon_general_hospital.csv")
🍋위에 Out[121]에서의 지도는 안뜨는 것 같아서 캡쳐본을 첨부했다
🖥️ 원본 데이터 오류 발견
Out[99] 에서 나오는 데이터 프레임을 보면... 느꼈겠지만 ㅠㅠㅠ
1. 종합병원 분류라지만 실제 병원 데이터만 있는 게 아니다.
장례식장부터 의원까지... 종합병원 결과가 아니었다.
참고로 종합병원은 전제조건은 100병상이상이고, 그 이상이 어느정도이냐에 따라서 둬야하는 진료과목들이 있다.
2. 대학병원의 경우 기타병원에 들어가 있거나, 응급실이름으로 상호명이 들어가있다.
ex) 명의 이국종교수님이 계시는 유명한 아주대병원이 응급실로만 검색되는걸 알 수있다
🖥️ 마무리 하면서...
데이터의 품질과 전처리에서 대부분의 시간을 소비한다고 한다.....
데이터가 우리에게 원하는 대로 있지 않으니까말이다.
아주 지저분하고 아주 더티더티한 자료일테니까🥲🥲🥲🥲
그래서 된통 당했다.
데이터에 대한 오류는 항상 존재한다는 생각으로 접근해보자..
데이터에 대한 오류를 수정하지 않고 무턱대고 판다스를 통해 전처리를 해버리면, 분석 결과가 정확하지 않을 수 있다.
암튼 화이팅 !
'😎 프로젝트 만들기 > - EDA(kaggle,etc)' 카테고리의 다른 글
[kaggle] 🤨시작하기 전 - 성인 인구조사 소득 예측 대회 (0) | 2022.03.07 |
---|---|
[pandas] 재도전! 수원시 종합병원데이터 전처리-1 (feat경기도데이터드림이 짱) (0) | 2022.01.30 |
[ELK] ELK활용 미니프로젝트 - 마무리하면서 느낀 점 (0) | 2021.12.24 |
[ELK] ELK활용 미니프로젝트 - 시각화 및 대시보드 만들기 (0) | 2021.12.23 |
[ELK] ELK활용 미니프로젝트 - ELK 하나씩 구성해가기 (0) | 2021.12.23 |