본문으로 바로가기
반응형




3차 전처리 과정에서 진행한 것은, 도로명 우편번호를 기준으로 분류하기 위한 전처리 및 프랜차이즈 카페를 분류하는 Column을 추가하는 작업이었습니다. 도로명 우편번호가 포함되지 않은 약 9%의 Row를 모두 제거하고, Python Script 함수를 사용하여 프랜차이즈 카페 평판 순위 30위 권에 들어있는 카페를 1, 그렇지 않은 카페를 0으로 분류하였는데요. 


오늘은 한단계 더 나아가서, 도로명 우편번호를 기준으로 그룹핑 하도록 하겠습니다. 일정상 데이터 모델링 단계에 진입해야 하나, 생각보다 전처리 작업에 시간이 많이 소요되어, 전처리 과정을 조금 더 진행하면서 병행할 예정에 있습니다.


그룹핑에는 어떤 방법이 효율적일지 여러가지로 고민을 해보았는데요. Brightics에 내장된 함수를 사용하여 작업하는 것도 고려 하였으나, 오히려 작업이 복잡해질 우려가 있어 Python Script를 조금 더 이용하기로 결정했습니다.


2차원 List 등의 자료구조를 사용한 그룹화도 고려했으나, 최종적으로Python의 Dictionary 자료구조를 사용하여 도로명 우편번호를 Key 값으로 활용하고, 동일한 우편번호(Key)를 가진 Row를 모두 해당 Key의 Value화 하였습니다. 그 결과는 다음과 같습니다.


우선 '상세영업상태명', '도로명우편번호', 두 개의 Column으로 groupby를 진행하였는데요. 우편번호의 경우 당연히 groupby가 필요하며, 해당 주소지의 폐업 카페와 영업 카페를 구분하여 분석을 진행하여야 하기 때문에, 이 역시 구분해줄 필요가 있습니다. 

즉, 해당 for문에서 temp Dictionary 자료형 안에 특정 우편번호 A가 Key로 존재하지 않은 경우, A를 Key로 추가하고, 이후 temp[우편번호][영업상태명] 인덱싱으로 해당 우편번호의 영업 또는 폐업 Key의 Value로 해당 row 값들을 추가해줍니다.


temp Dictionary의 Keys를 조회하면 위와 같습니다. 우편번호로 Key들이 분류되어 있으며, 갯수는 4261개로 확인됩니다. 23712/4261 = 5.5648908707 로, 한 우편번호에 평균 5.5개의 카페가 속한다고 보면 될 것 같습니다.




예시로 우편번호 3180에 해당하는 지역 카페를 살펴보겠습니다. 우편번호 뒤에 '영업', '폐업' key를 추가하여 위와 같이 조회가 가능합니다. 이제 각 우편번호마다 고유의 Row를 하나씩 가지게 DataFrame을 구성해줄 차례인데요. 영업/폐업 날짜 등 고려할 부분이 더 있지만, 일단 Python Script에서 DataFrame을 Output으로 내보내어 Brightics Studio에서 Table로 표출하는 코드까지 먼저 작성하였습니다.



꽤 많은 시간을 들인 끝에, 위와 같은 형태로 코드를 작성하였습니다. Dictionary 구조를 조금 복잡하게 구성한 탓에, 문법 에러가 발생하여 상당 부분 수정이 필요했습니다. 이번 전처리 작업에서는 대부분 시간을 여기에 소요한 것 같습니다. ㅠㅠ



위와 같이 작성하였습니다. 처음에 코드 작성 후 실행 과정에서 

"inconsistent use of tabs and spaces in indentation" 에러가 지속적으로 발생하여, 원인을 찾아보니, Tab과 Space 키를 혼용하여 들여쓰기를 한 것이 문제가 되었습니다. 

Python Script 함수에서 여러 줄을 드래그 한 후 Tab을 누르는 것과, 코드 내에 커서를 위치시키고 Tab을 누르는 것이 각각 2칸, 4칸 공백으로 다르게 작동하는데요. 이 때문에 들여쓰기를 할때 다소 신경을 많이 써줄 필요가 있을 것 같습니다.


Data 전체를 돌면서 작업하는 반복문으로 구성되어 있어, 소요시간이 상당했습니다. 완료에 35초 가량 걸리네요. 여러 오류를 해결하며, 마침내 성공적으로 새 DataFrame을 Brightics에 로드시켰습니다!



Python Script 함수를 통해, 평소에 자주 사용하던 Python을 자유자재로 Brightics에서 사용할 수 있게 되니, 정말 든든한 지원군을 얻은 것 같은 기분이었습니다. 간단한 조작으로 다양한 작업을 할 수 있는 Brightics의 효용성을 한층 극대화 할 수 있는 부분이었는데요. 

Python에서 많은 코드를 작성해야 하는 케이스를 Brightics에선 클릭 몇 번으로 쉽게 해결이 가능하고, 반대로 Brightics에서 다양한 함수 조합으로 복잡한 작업이 필요한 경우에는 Python을 이용하여 한번에 해결이 가능한 것입니다. 



Brightics Studio에서 출력된 Table의 Column명을 눌러서 하나씩 내림차순 정렬을 하여 살펴봤습니다. (개인적으로 무척 유용하게 사용중인 Brightics Studio 기능 중 하나입니다!)

이상한 부분이 보이네요. 도로명 우편번호 6164는 강남구 삼성동으로 확인됩니다. 이상치이거나, 삼성동이 우후죽순으로 폐업이 발생하는 카페의 무덤(?)이거나, 둘 중 하나인데요.

본 데이터는 서울시의 모든 카페를 완벽하게 전수조사한 데이터는 아닙니다. 따라서, 해당 수치를 완전히 신뢰하기는 어렵다는 생각이 듭니다. 또한, 폐업 일반 카페, 폐업 프랜차이즈 카페 모두 높은 수치를 보이는 해당 Row 데이터는 두 수치가 모두 평균에서 굉장히 벗어나있어, 분석 결과를 편향적으로 만들 수 있으므로, 제거 후 모델링을 계속하도록 하겠습니다.


이제 점점 본격적인 분석에 가까워지고 있는 것 같은데요. 생각보다 작업의 진척도가 느린 것 같다는 생각도 들지만, 한편으로는 Brightics 덕분에 한결 쉽게 전처리 작업을 진행할 수 있었던 것 같습니다. 막바지 전처리 작업과 함께, 모델링 작업도 힘내서 마무리하도록 하겠습니다. 읽어주셔서 감사합니다! :)



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

반응형