본문으로 바로가기
반응형


어느새 명절 연휴를 앞두고, 세 번째 전처리 시간이 되었습니다. 

지난 두 번째 전처리 시간에선 주소를 기준으로 여러 지역을 나누어보았는데요. 검토 중 한 가지 문제점을 발견하게 되었습니다. '동'을 중심으로 나누게 될 경우 지나치게 세분화 된다는 것이 문제였는데요. 


'동'으로 구분된 행정구역은 생각보다 넓습니다. 현재 국내 행정동 구분은 약 2,104개입니다. 즉, 같은 동에 위치한 카페라고 해도, 서로간에 영향을 줄 수 없을 정도로 멀리 떨어져있을 가능성이 크다는 것인데요. 따라서 조금 더 세분화된 지역 구분을 위해서, 도로명 우편번호 데이터를 활용하기로 결정하였습니다.


우체국에 따르면, 현재 국내 도로명주소에 부여된 도로명 우편번호는 34,349개라고 합니다. 행정동 구분보다 약 16배 가량 많은 수치로, 훨씬 지역을 세밀하게 구분하고 있다는 것을 알 수 있습니다. 서울시 종로구를 예시로 보면, 종로구 안에만 300개의 우편번호가 있다고 합니다. 또한, 실제 데이터에서 몇 그룹을 임의로 뽑아서 사업장명을 지도로 검색해본 결과, 모두 충분히 인접한 거리에 위치하여 있음을 알 수 있었습니다. 따라서, 3차 데이터 전처리 과정에서는 도로명 우편번호를 통해 여러 지역의 카페를 구분하는 작업을 진행하게 되었습니다.




Profile Table 함수로 확인해본 결과, 도로명 우편번호 column에는 공백으로 존재하는 결측값이 전체 데이터의 약 9.2%, 2400개인 것을 알 수 있었습니다. 결측값을 가진 2400개의 행을 모두 제거하기 위해 다음으로 Filter 함수를 사용해주었습니다.



Filter 함수에서 매우 간단한 작업으로 도로명우편번호 column에 결측값이 포함된 Row를 모두 제거 가능합니다. Filter 함수에서 Condition을 다음과 같이 입력한 후 Run합니다.

And, 도로명우편번호, Not in, ''


위 입력은 도로명우편번호 column에서 ''(따옴표 두개 => 입력 된 것이 없는 결측값) 값이 들어있지 않은 것만(Not in) 모두 선택하라는 의미입니다. 즉, 도로명우편번호 column에 값이 존재하지 않는 2400개의 Row를 제외한, 26,112개의 Row 중 23,712개의 Row만 선택됩니다. 


이어서같은 우편번호를 가진 Row들을 따로 그룹화하여 필요한 값들을 합쳐주고, 최종적으로 각 우편번호 마다 하나의 Row만 담고 있는 데이터프레임을 만들려고 합니다. 해당방법은 Python Script 함수를 사용하여 Pandas를 직접 코딩해주어 쉽게 해결이 가능합니다.



Python Script 함수는 위와 같은 모양을 가지고 있습니다. inputs[0]은 직전 함수에서 Output으로 출력되어 나오는 데이터를 의미하는데요. 따라서, df = inputs[0] 를 입력한 후, pandas library를 import하여 해당 DataFrame을 적절히 가공한 후, 최종적으로 해당 DataFrame을 Outputs에 할당해주면 끝납니다.

위 예시 이미지의 경우, 해당 Python Script로 들어간 데이터가 똑같이, Table로 그대로 출력되게 됩니다.


각 우편번호마다 데이터를 그룹화하여, 우편번호마다 하나의 Row를 가지도록 합쳐주기 이전에, 조금 수정이 필요한 부분이 또 발견되었습니다. 지난 데이터 전처리 과정에서, 해당 사업장이 프랜차이즈 카페인지 나타내어주는 작업을 한 것이, 잘못 되었음을 알게 되었는데요. 또한, 주식회사를 의미하는 '(주)'가 앞에 붙은 것 외에도, 그냥 상호만 적힌 대기업 프랜차이즈 카페가 많다는 것을 알게 되었습니다.

본 과정에서는 '프랜차이즈 카페 브랜드 평판 순위' 자료를 이용하여, 1위부터 30위까지의 기업을 개인사업자 카페 영업에 영향을 줄 수 있는 프랜차이즈 카페로 분류하고, 추가로 '(주)' 문자열을 포함한 카페도 여기에 포함시켰습니다. 



pandas를 이용하여 위와 같이 코딩하였습니다. major_cafes 리스트에 1~30위까지의 카페 이름과 '(주)' 문자열을 넣고, 만약 해당 리스트 안에 든 이름이 포함된 문자열이 인자로 들어온다면 1을, 그렇지 않다면 0을 반환하는 함수를 '사업장명' column에 적용시켜 돌렸습니다. 


분류 결과 전체 데이터의 14.11%에 해당하는 3346개의 Row가 프랜차이즈 카페로 분류되었습니다. 잘 분류 되었는지 확인해보도록 하겠습니다.



Filter 함수를 사용하여 조건문에 contains '스타벅스' 를 넣어 살펴본 결과, 487개의 스타벅스 매장 전부 프랜차이즈 기업 카페를 나타내는 1을 해당 column의 값으로 가지고 있음을 알 수 있었습니다. 


Python Script 함수를 통해 진행하게 될, 우편번호 별 그룹핑 작업은 Jupyter Notebook 환경에서 코딩을 병행하고 있는데요. 이후 작업은, 각 우편번호 별로 그룹화하고, 그 안에서 폐업/영업 상태와 개업 및 폐업일을 구분하여 폐업한 개인사업자 카페의 폐업 당시 영업중인 대기업 프랜차이즈 카페의 개수를 살펴보고, 이를 토대로 대기업 프랜차이즈 카페의 존재가 개인사업자 카페의 폐업과 상관관계가 있는지 분석을 진행할 예정입니다.


다음 4차 데이터 전처리 과정에서 이후 진행된 작업과 함께 돌아오도록 하겠습니다. 오늘도 감사합니다! :D



본 포스팅은 2020년 삼성SDS Brightics 서포터즈 1기 활동의 일환으로 작성된 포스팅입니다.

반응형