Derek 의 데이터 분석 성장기

[키워드 분석] KonlPy 를 활용한 실무 키워드 분석 본문

Data/데이터 분석

[키워드 분석] KonlPy 를 활용한 실무 키워드 분석

Derek Grey 2024. 3. 1. 17:24
반응형

 

 

 

1. 개요

인터넷 세상에는 수 많은 키워드가 검색되고 있습니다. 특히, 구글이나 네이버같은 포탈 사이트, 쿠팡 같은 이머커스에서는 엄청난 양의 키워드가 검색되고 있죠.

 그리고, 우리는 데이터 분석가로서 우리 서비스 유저들은 어떤 키워드를 가장 많이 검색하는가? 검색을 통해 상품 클릭이나 구매로 용이하게 전환되는지 데이터 속 인사이트를 발견해야 하는 문제들을 직면하게 됩니다.

 실무에서는 Search & Discovery (검색과 발견) 라는 도메인으로 해당 영역을 정의하며, 해당 DA&DS로서 키워드 속 인사이트를 발굴하고, 연관키워드와 추천 알고리즘을 구축하는 것은 필수라 할 수 있습니다.

 그래서, 오늘은 실무에서 검색 키워드를 분석할 때 어떤 관점과 이용 방법이 있을지 고민해보고, KonlPy를 활용해서 인사이트를 발견하는 방법에 대해서 정리해보려 합니다.

 

다양한 방법이 존재할 것 같습니다. 키워드를 가지고 Group by Count로 검색할 수도 있고요. 혹은 유저의 N회차 검색에 따라 클릭에 걸리는 평균시간이나 중위 시간등을 분석해볼 수 있습니다. 그 외에도, CTR 및 CVR 등을 파악해 볼 수도 있죠.

 

이전에 진행한, 검색 시도 N 회차별 Click 전환에 걸리는 시간

 

 

하지만, 오늘은 검색 키워드 속에서 인사이트를 발견하는데 초점을 맞춰 볼 예정인데요.

 

그 이유는, 실무에서 PM이나 담당자가 "유저들이 가장 많이 검색하고 있는 키워드가 무엇이에요?" "유저들 검색에서 인사이트를 발굴해주세요" 라는 질문을 받았을 때 해당 문제를 해결하는데 초점을 맞춰보려 합니다.

 

 사람들이 검색하는 키워드는 정말 노이즈가 많습니다. 사람들 마다 검색에 입력하는 형태는 모두 다르기 때문입니다. 누군가는 형용사와 동사를 섞어서 검색할 수도 있고, 누군가는 오타를 내기도 합니다. 이런 노이즈가 있는 데이터 속에서 키워드 속 인사이트를 발굴해야 합니다.

 정제 되지 않은 Noise가 낀 검색 키워드 Raw 데이터를 분석하는 방법으로, 오늘 저는 KonlPy 를 활용해 불필요한 키워드를 걷어내고, 유저들의 검색 키워드 속 인사이트를 발굴해볼 것 입니다!

 

2. 알고리즘

 

Konlpy? (링크)

 

Konlpy는 한국어 자연어 처리를 위한 파이썬 라이브러리인데요. 주로, 한국어 텍스트 데이터를 처리하고 분석하는 데 사용됩니다. 다양한 한국어 형태소 분석기가 포함되어 있으며, 이를 통해 한국어 문장을 형태소로 분리하거나 품사를 태깅할 수 있습니다.

 Konlpy를 사용하면 한국어 텍스트 데이터를 쉽게 전처리하고 텍스트 마이닝, 정보 검색, 감성 분석 등 다양한 자연어 처리 작업을 수행할 수 있습니다. 

위와 같은 장점이 있기 때문에, Konlpy 는 한국어로 입력되는 검색 키워드나 한국어 형태의 문서를 분석하는데 굉장히 용이한 라이브러리 입니다.

 

 

3. 실습

 

우리 사이트가 만약, 구글이라 가정해보고 아래와 같은 가상의 데이터가 있다고 가정해보겠습니다! keyword 는 유저들이 구글에서 검색한 내용들입니다!  예시 가상의 데이터를 만들어보겠습니다.

import pandas as pd
import random

# 예시 검색 키워드 데이터 생성
n_keywords = 10000  # 생성할 검색 키워드 개수

# 주제 키워드 리스트
topics = ["구글", "데이터 분석", "인공지능", "빅데이터", "머신러닝", "자연어 처리", "딥러닝", "컴퓨터 비전", "텍스트 마이닝", "웹 크롤링"]

# 동사 키워드 리스트
verbs = ["설명", "하는 방법", "코드", "알아보기", "수식 asd", "강의", "이해하기", "읽기", "학습하기", "실험하기"]

# 검색 키워드 생성
search_keywords = []
for _ in range(n_keywords):
    topic = random.choice(topics)  # 주제 키워드 랜덤 선택
    verb = random.choice(verbs)  # 동사 키워드 랜덤 선택
    keyword = f"{topic} {verb}"  # 주제와 동사 조합
    search_keywords.append(keyword)

# 데이터프레임 생성
search_df = pd.DataFrame({'keyword': search_keywords})

 

해당 코드는 '주제', '동사' 로 제가 임의로 설정한 20가지 키워드를 무작위로 추출하여 10,000개의 키워드를 데이터 프레임 형태로 만든 코드입니다.

 우리의 구글 사이트는 역시.. 빅데이터 및 머신러닝 관련된 검색량이 많은 것 같습니다! 

 * 해당 데이터는 결국 주제와 동사 리스트 안에 있는 결과물을 조합해서 만든 결과입니다. 실제 서비스에는 더 다양한 키워드가 검색되겠죠?

 

위와 같이 10,000개의 검색 데이터를 가지고 분석해보겠습니다. 간단하게는 일단 Group by Count 로 어떤 키워드가 가장 많이 검색되었는지 빠르게 볼 수 있겠죠!

 

# 키워드 별 빈도수 계산
keyword_counts = search_df['keyword'].value_counts().reset_index()
keyword_counts.columns = ['keyword', 'count']

# 빈도수 내림차순 정렬
keyword_counts = keyword_counts.sort_values(by='count', ascending=False)

# 상위 10개 결과 출력
keyword_counts.head(10)

 

해당 결과는 keyword 를 group by 로 count 했을때, 가장 많이 검색된 상위량 10개를 내림차순 한 것 입니다. 1위부터 컴퓨터 비전 실험하기, 텍스트 마이닝 읽기, 빅데이터 강의, 데이터 분석 알아보기등이 검색되었다는 것을 알 수 있는데요. 단어 리스트에서 numpy로 random 하게 선택했기 때문에 해당과 같은 118, 118, 117 count가 관측되었지만 사실상 실무 및 현실에서는 이와 같은 키워드량이 나오진 않을 것 입니다!

 

 여기서, 훌륭한 데이터 분석가라면 해당 결과를 가지고 검색 기능 담당자에게 결과를 이와 같이 전달할 것 입니다. 우리 웹 사이트 속 유저들의 니즈는 컴퓨터 비전을 실험하는 것, 텍스트 마이닝 읽기, 빅데이터 강의, 데이터분석 알아보기 등으로 검색을 하고 있다고요.

 물론, 이런 접근방식은 훌륭합니다. 유저들이 가장 많이 검색한 단어와 키워드 자체도 충분히 인사이트풀하며 액션으로 이어질 수 있는 결과물 입니다. 하지만, 조금만 더 고민해보면 해당 결과는 단순 Group by count 로서 키워드 '전처리' 가 이루어지지 않은 결과이며 명사 + 동사 형태로 묶여져 있다는 몇가지 사실을 발견할 수 있습니다. 때문에, 키워드 속 유저들의 니즈를 파악할만 한 고차원적인 결과물로서는 이어지지 못한 단계이죠.

 예를 들어, 키워드 속 숨겨져있는 유저들의 검색 행태, 또는 어떤 태깅이나 명사로 묶을 수 있는 결과물은 없는가? 에 대한 고민을 해볼 수 있습니다.

 뿐만 아니라, 아래와 같이 검색량이 적은 하단부의 키워드의 결과는 담당자에게 전달하지 않을 시, 추가적인 인사이트를 발굴할 수 없습니다.

 

 

 

그래서, KonlPy 같은 형태소 분석기 알고리즘을 활용하여, 키워드 속 고유명사나 태깅으로 묶을 수 있는 결과물을 도출하는 방식을 제안합니다.

import pandas as pd
from konlpy.tag import Okt
from collections import Counter

# 형태소 분석기 초기화
okt = Okt()

# 형태소 추출 및 빈도 계산
morph_counts = Counter()
for keyword in search_df['keyword']:
    morphs = okt.pos(keyword)
    morph_counts.update(morphs)

# 결과를 데이터프레임에 저장
morph_df = pd.DataFrame.from_dict(morph_counts, orient='index', columns=['count'])
morph_df.index.names = ['morph']
morph_df.reset_index(inplace=True)


# part 칼럼 추가
morph_df['part'] = morph_df['morph'].apply(lambda x: x[1])
morph_df['morph'] = morph_df['morph'].apply(lambda x: x[0])

# # 명사, 동사에 해당하는 행만 추출하여 새로운 데이터프레임 생성
noun_df = morph_df[morph_df['part'] == 'Noun'].sort_values(by='count', ascending=False)
verb_df = morph_df[morph_df['part'] == 'Verb'].sort_values(by='count', ascending=False)

morph_df

 

 

 

저희가 사용한 데이터는 해봤자 20개도 안되는 키워드를 가지고 반복추출하였기 때문에 KonlPy 를 활용하더라도 인사이트풀한 결과를 도출하지 못했습니다.

 하지만, 형태소 분석기로 결과를 도출시 실제 유저들이 검색하는 키워드에 대해서 '묶음' 화 혹은 '태깅' 형태로 분류할 수 있습니다.

 비록, 저희가 준비한 데이터는 비루하여 마이닝에서도 '마', '이닝' 으로 키워드를 분류하지만 실제 현실에서는 KonlPy를 활용하여 인사이트를 발견할 수 있습니다.

 유저들이 검색하는 데이터 속에서 상위 10가지 결과를 가지고 판단하는 것이 아닌, 전체 키워드 속에서 유용한 태깅 형태를 발견할 수 있습니다. 예시로, 저희가 숙박 서비스 업체라고 가정해보겠습니다.

 여수 호텔, 신라호텔, 여수 여행, 여수 숙소, 호텔, 여수 모텔, 호텔 브라운, 저렴한 호텔 등과 같은 키워드가 존재한다면 여기서 형태소 분류기는 '여수', '호텔' 과 같은 명사 키워드를 정확하게 분류할 것이며 우리에게 인사이트를 줄 수 있을 것 입니다.

 

* Tip : 해당과 같은 형태소 분류기를 활용시에는 전체 Raw Data를 넣는것이 아니라, Unique Keyword를 넣어서 키워드 속 유의미함을 발견하는 것이 좋습니다. 그 이유는 많이 검색된 키워드를 Distinct 처리하지 않을 시, 해당 키워드에서만 태깅을 뽑기 때문에 Group by Count 와 비슷한 결과를 도출합니다.

 

4. 정리

오늘은, 형태소 분류기를 활용하여 검색 데이터 속 인사이트를 발굴하는 것을 소개해보았는데요. 핵심은 검색 키워드 속 유의미한 태깅이나 인사이트를 발굴할 때 Group by Count도 좋지만, KonlPy 같은 형태소 분류기를 활용하여 유저들이 검색하는 키워드 속 고유명사만 분류하여, 해당 명사만의 묶음을 관측한다면 한단계 깊은 분석이나 인사이트를 발견할 수 있습니다.

반응형