웹 크롤링과 정성 데이터 전처리
목차.
1. 데이터 분석 능력의 필요성
2. 50개의 글을 스마트하게 분석해봅시다!
3. 단순 노가다 멈춰! 데이터 크롤링
4. 정성 데이터 전처리
의사결정을 위해 데이터와 친해져야 한다.
기획자나 PM/PO의 필수 능력은 '데이터 분석'이 아닐까 싶다. 물론, 지극히 개인적 생각이다. 이들 모두 프로덕트와 관련된 의사결정을 내리는 게 주 업무이고, 데이터에 기반해야 올바른 의사결정이 가능하다. 데이터가 아닌 경험에 기반해 의사결정을 내릴 수 있지만, 이는 개인의 센스에 크게 의존하고 자신도 모르게 주관적인 판단을 내릴 수 있다. 객관성과 신뢰성을 위해서 데이터에 기반한 의사결정이 필요하다.
PO 커리어를 꿈꾸고 있기에 시간이 날 때마다, 데이터 분석을 독학하고 있다. 데이터는 크게 정성 데이터와 정량 데이터로 분류된다. 정량 데이터는 숫자로 표현되기에, 데이터 분석이 용이하다. 코드 없이 엑셀의 피벗 테이블과 차트 기능을 통해 인사이트를 누구나 뽑아낼 수 있고, 더 깊은 인사이트를 위해 판다스, R, 매틀랩 등을 활용한 코딩을 활용해볼 수 있다.
너무 막막한 정성 데이터 분석
반면 정성 데이터는 숫자로 표현되지 않기에, 정량 데이터에 비해 허들이 높다. 인사이트를 얻기 위해 정성 데이터를 하나하나 뜯어보고, 각 데이터 사이의 유사성을 파악해야 한다. 이 과정에서 어쩔 수 없이 많은 시간이 소요되고, 분석하는 사람의 능력에도 크게 영향을 받는다. 어피니티 다이어그램을 해본 사람이라면, 각 정성 데이터를 살펴보고 클러스터링 하는 데 얼마나 많은 시간이 드는지 감이 올 것이다.
비개발자 혼자서 해보는 정성 데이터 분석
파이썬의 라이브러리 중 사이킷 런(scikit-learn)이란 기계 학습 라이브러리가 있다. 이 라이브러리 안에는 기계 학습을 기반으로 정성 데이터를 분석할 수 있는 코드도 존재한다. 이를 잘 활용한다면, 정성 데이터를 정량 데이터처럼 분석해서 인사이트를 뽑아낼 수 있다. 필자는 혼자서 공부하고 있는데, 조금만 배워보면 실전에서 바로 써먹을 수 있다.
어느새 브런치에 쓴 글이 곧 50개가 된다. 문득 지금까지 어떤 글을 주로 써왔는지 분석해보면 재밌지 않을까 싶다. "지금까지 어떤 주제로 글을 써왔는가?"를 알아내는 걸 목표로 데이터 분석을 진행해보기로 했다.
수집, 전처리, 벡터화 그리고 분석
정성 데이터를 기계 학습을 통해 분석하는 방법은 크게 아래와 같다. (1) 분석 목표를 설정하고 (2) 관련된 정성 데이터를 수집한다. (3) 수집한 정성 데이터를 전처리한 후에 (4) 컴퓨터가 분석할 수 있도록 정량 데이터로 벡터화하고 (5) 분석한다.
분석을 위해서 브런치에 적힌 모든 글이 필요하다. 하지만, 브런치는 ctl + C 가 안 될뿐더러, 100개의 글을 하나하나 복사하기도 힘들다. 우리는 스마트하게 데이터를 분석하고 싶으니, 데이터 수집도 스마트해야 한다. selenium과 BeautifulSoup라는 파이썬 라이브러리를 이용해 브런치에 적힌 글을 크롤링해보자. 참고로, selenium은 브라우저를 작동시키는 용도고, BeautifulSoup는 데이터를 읽어오는 용도라고 보면 된다.
아래 코드처럼 각 라이브러리를 불러오고, selenium을 이용해 브라우저를 실행한다. 실행된 브라우저에서 브런치에 접속하고, execute_script 코드를 이용해 최하단까지 스크롤을 진행한다. 스크롤을 진행하는 이유는 처음 로딩된 페이지에서 모든 글이 로딩되지 않기 때문이다. 페이지를 스크롤해야지 글이 추가적으로 불러와지므로, 모든 브런치 글을 읽기 위해서 페이지 최하단까지 스크롤해야 한다.
이제 각 글에 적힌 내용을 읽어야 한다. 모든 글이 로딩된 브라우저에서 BeautifulSoup를 사용해 각 글로 이어지는 url을 알아낸다. 이후, 해당 url에 모두 접속해서 본문 내용을 크롤링한다. 아래 코드를 실행하면, 이제 브런치에 적힌 모든 글의 제목과 본문 내용을 얻을 수 있다.
이제 수집한 정성 데이터를 전 처리할 차례다. 해당 과정을 끝내야지 정성 데이터를 정량 데이터로 변환할 수 있다. 우선 정성 데이터에서 불필요한 기호를 제거한다. 정규식 re 라이브러리를 이용해 기호 집단([^\w\d\s])을 본문에서 삭제한다.
다음으로 품사를 활용해 필요한 단어를 추출한다. 각각의 품사는 갖고 있는 정보가 다르므로, 분석 목적과 얼라인 되는 정보를 제공하는 품사를 추출해야 한다. 예를 들어, 이번 분석 목표는 '어떤 주제로 글을 쓰냐?'이다. 이때, 주제를 파악하기 위해서 형용사나 동사보다 명사에 집중해야 한다. 한국어 품사 분석을 위해 konply 라이브러리를 사용한다. 해당 라이브러리는 긴 문장을 단어 별로 쪼개고, 품사 매칭을 시켜준다.
마지막으로 분석에 전혀 필요 없는 단어인, 불용어를 제거한다. 현재 품사가 명사인 단어만 남아있는데, 이 중에서 분석 목적과 전혀 무관한 단어들이 존재한다. 예를 들어, '제목', '부제' 단어는 분석과 전혀 무관한 단어이다. 이처럼, 분석 목적과 얼라인되지 않는 단어를 직접 제거해준다. 추가적으로 한국어는 1음절에 분석 목적과 큰 의미가 없는 단어(ex. 나, 너)가 많으므로, 1음절 단어도 제거해준다.
위 과정을 거치면, 이제 분석에 필요한 단어로 구성된 리스트를 갖게 된다. 정성 데이터를 정량 데이터로 변환하기 위해서 단어 리스트가 아닌, 문장이 필요하다. 따라서, 단어 리스트를 합쳐서 문장으로 재구성한다. 이렇게 전처리된 단어로 구성된 문장을 sicikit-leran 라이브리러로 분석할 수 있다.