[4/6] 파이썬 고객 리뷰 분석: 배달앱 데이터로 배우는 텍스트 마이닝

맛집 리뷰 데이터 분석
맛집 리뷰 데이터 분석
맛집 리뷰 데이터 분석

특정 단어가 반복 되는 것만 보고선 맥락을 파악할 수 있을까요?

해당 산업에 도메인 지식이 매우 풍부한 사람이 아니라면, 맥락 해석은 쉽지 않을 겁니다.


인공지능(AI, 머신러닝 등)을 활용하면 맥락 해석을 보다 쉽게 할 수 있습니다.

이번 글에서는 파이썬 머신러닝 라이브러리인 scikit-learn을 이용해 고객 리뷰 분석을 수행해 보겠습니다. 이 방법은 앱 리뷰 분석에 효과적입니다.

특정 단어가 반복 되는 것만 보고선 맥락을 파악할 수 있을까요?

해당 산업에 도메인 지식이 매우 풍부한 사람이 아니라면, 맥락 해석은 쉽지 않을 겁니다.


인공지능(AI, 머신러닝 등)을 활용하면 맥락 해석을 보다 쉽게 할 수 있습니다.

이번 글에서는 파이썬 머신러닝 라이브러리인 scikit-learn을 이용해 고객 리뷰 분석을 수행해 보겠습니다. 이 방법은 앱 리뷰 분석에 효과적입니다.

리뷰 텍스트에는 어떤 단어가 가장 많이 나왔을까?


1. 데이터 불러오기 및 확인하기

먼저 판다스(pandas)라는 도구를 사용해 데이터를 불러옵니다.

판다스는 엑셀 시트처럼 데이터를 다룰 수 있게 해주는 강력한 도구입니다.


import pandas as pd

df = pd.read_excel('92년생김치찜.xlsx')

df.head()


이 코드는 '92년생김치찜.xlsx' 파일을 읽어와 df라는 변수에 저장합니다.

df.head()는 데이터의 첫 5행을 보여줍니다. 이는 마치 책의 첫 페이지를 훑어보는 것과 같습니다.


2. 결측치 확인 및 제거하기

결측치는 비어있는 데이터를 말합니다. 이는 분석 결과를 왜곡시킬 수 있으므로 처리해야 합니다.


# 결측치 확인

print(df.isnull().sum())

# 결측치 제거

df = df.dropna()


첫 번째 줄은 각 열의 결측치 개수를 보여줍니다.

두 번째 줄은 모든 결측치를 제거합니다. 이는 마치 퍼즐을 맞출 때 빈 조각을 제거하는 것과 같습니다.

3. 불필요한 열 제거하기

분석에 필요 없는 정보는 제거하여 데이터를 간소화합니다.


df = df.drop(['URL', 'created_at'], axis=1)

df.head()


이 코드는 'URL'과 'created_at' 열을 제거합니다. 그대로 두어도 되지만, 개인적으로 데이터분석 시 필요 없는 데이터는 제거하는 편입니다.


4. 파이썬을 이용해 리뷰 텍스트 벡터화하기

텍스트 백터화란 '컴퓨터가 텍스트를 이해할 수 있게 텍스트 데이터를 숫자로 변환 하는 과정'이라고 생각하면 됩니다.

백터화는 AI인 skit-learn을 이용할 것이고, skit-learn에 있는 위해 CountVectorizer를 사용합니다.


from sklearn.feature_extraction.text import CountVectorizer

cvect = CountVectorizer()

X = cvect.fit_transform(df['CONTENT'])

dtm = pd.DataFrame(X.toarray(), columns=cvect.get_feature_names_out())

dtm


'fit_transform'은 '학습 후 변환'이라고 생각하면 됩니다. AI를 이용하면 특정 데이터를 학습 시키고, 예측하게 할 수 있습니다.

다만 이번 데이터분석에는 예측 과정이 생략 되어 있습니다. 지금 상황에서는 fit_transform 소괄호 안에 데이터를 넣으면, 백터화가 진행 된다고 이해하면 됩니다.


'.toarray()' 숫자 데이터를 배열 형태로 변환해 주는 매서드입니다.

배열 개념에 관해서는 이해하기가 어려울 수도 있으니, 현 상황에서는 '데이터프레임에 숫자 데이터를 적절한 형태로 담기 위한 작업'정도로만 이해하면 됩니다.

'.get_feature_names_out()'를 이용하면 숫자로 되어 있는 열에 텍스트를 표기할 수 있습니다. 해당 코드를 작성함으로써 각 텍스트가 어느 정도 수준으로 반복 되었는지 확인 가능합니다.

5. 맥락을 고려한 고객 리뷰 분석: 파이썬 AI 활용

'(3-1) Konlpy OKt를 활용한 분석'에서는 단어만 추출해 볼 수 있었습니다. 유의미한 정보를 얻긴 했지만, 맥락을 이해하기는 어려웠습니다.


그래서 이번에는 맥락을 이해할 수 있게끔 단어를 묶어 보는 작업을 할 겁니다. 단어를 묶기 위해서는 'ngram_range'이라는 인자를 사용해야 합니다.


import seaborn as sns

import matplotlib.pyplot as plt

import koreanize_matplotlib

stop_words = ['맛있게', '맛있어요', '먹었습니다', '잘먹었습니다', '2개리뷰', '너무 맛있었어요']

cvect = CountVectorizer(ngram_range=(2, 6), min_df=2, max_df=0.8, max_features=30, stop_words=stop_words)

X = cvect.fit_transform(df['CONTENT'])

dtm = pd.DataFrame(X.toarray(), columns=cvect.get_feature_names_out())

dtm.style.background_gradient()


시각화에 필요한 라이브러리를 설치해 줍니다.

이후 불용어(stop_words)를 지정해 줍니다. 불용어를 지정해 줌으로써 해당 단어는 텍스트분석에서 나오지 않도록 하게 할 수 있습니다.

  • 'ngram_range=(2, 6)'은 '단어를 2개 이상 6개 이하로 묶어줘'라고 말하는 것과 같습니다.

  • 'min_df=2'는 '2번 이상 등장한 단어만 보여줘'라는 거라고 이해하면 좋습니다.

  • 'max_df=0.8'는 '80% 이상 등장한 단어는 제외해줘'라고 이해하면 됩니다.

  • 'max_features=30'는 결과 30개만 보여지게 합니다.

  • 'stop_words=stop_words'는 앞서 지정한 불용어를 CountVectorizer에 적용하는 역할을 합니다.


6. 함수 만들어서 편의성 높이기

마지막으로 위 과정을 쉽게 반복할 수 있는 함수를 만들어 보겠습니다.


def display_transform_dtm(cvect, corpus):

    X = cvect.fit_transform(corpus)

    dtm = X.toarray()

    df_dtm = pd.DataFrame(dtm, columns=cvect.get_feature_names_out()).style.background_gradient()

    return df_dtm

display_transform_dtm(cvect, df['CONTENT'])


위 함수는 'display_transform_dtm'라는 이름을 가진 함수이며, 이 함수를 이용하면 앞서 수행한 과정을 쉽게 반복할 수 있습니다.

사용자는 cvect안에 있는 값(ngram_range 등)을 변경 해서 사용 하면 됩니다.

7. 파이썬을 활용한 앱 리뷰 분석 결론

2번 이상 등장하는 단어끼리 묶어서 의미를 더 깊게 파악할 수 있었습니다. 머신러닝을 이용해서 추출한 문장은 다음과 같습니다.


추출한 문장

  1. '1인분인데 양도'

  2. '고기도 많고'

  3. '배달도 빠르고'

  4. '부드럽고 김치도'

  5. '양도 많고'

'Konlpy OKt'로 명사만 추출할 때는 맥락을 파악하기가 어려웠습니다. 그러나 AI를 이용해서 리뷰 텍스트의 맥락을 파악할 수 있었습니다.


이번 분석에서는 AI의 세부 값을 조절(단어 개수, 빈도 정도 등)하여 리뷰 텍스트를 진행했습니다. 그 결과, 리뷰 텍스트에서 맥락을 이해할 수 있을 만큼 의미 있는 문장을 추출할 수 있었습니다.

정봉준

Jung Bong Jun

mgz.less@gamil.com

© Copyright 2024

정봉준

Jung Bong Jun

mgz.less@gamil.com

© Copyright 2024

정봉준

Jung Bong Jun

mgz.less@gamil.com

© Copyright 2024