1. 전처리
댓글분석을 통해 왜 특정 분류들이 구매 건수가 높은지 알아보고자 한다.
MySQL을 통해서 간단하게 리뷰가 어떻게 구조화 되어어 있는지 살펴보았다. 댓글 작성자는 fcmm과 일반 작성자 두분류료 나뉘었다. fcmm에서 작성한 댓글에는 꼭 들어가 있는 단어가 '서포터즈'와 '포토후기' 였다. 일반 작성자는 그냥 자주 보는 댓글이었다.
현재 내가 수집한 review데이터는 아래와 같은 구조를 띄고 있다.
content컬럼에는 일단 댓글을 다 넣어논 것이고, writer_option 컬럼에는 키, 몸무게, 구매 사이즈 등의 정보가 담겨있다.
그런데, content컬럼에 writer_option에 들어가야할 내용들도 포함되어있는 것들이 있다. 그게 바로 writer가 fcmm인 댓글들이었다.
이를 처리하기위한 코드를 작성하였다. 코드 내용은 writer가 fcmm 인 content 컬럼의 내용중 키, 몸무게, 사이즈 등의 내용이 있다면 writer_option으로 옮기고, 제품에 대한 내용은 남겨두는 것이다. 총 댓글이 약 10,000건 이고 writer가 fcmm인 댓글은 1,000건밖에 안되므로 이와같이 1차로 전처리한 내용을 csv파일로 저장하고 살펴보며 2차 전처리할 내용을 살펴보았다.
sql = """
SELECT * FROM REVIEW
"""
sql_col = """
SELECT COLUMN_NAME
FROM (
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE 1=1 AND TABLE_NAME='REVIEW'
) C;
"""
result = read_url(sql)
columns = read_url(sql_col)
columns = [obj[0] for obj in columns]
df = pd.DataFrame(result, columns=columns)
df.columns = map(lambda x: x.lower(), df.columns) #컬럼 소문자로
print(len(df[(df['writer']=="FCMM*")]['content']))
content_nums = df[(df['writer']=="FCMM*")]['content'].index
for num in content_nums:
if "포토후기키" in df.loc[num, 'content']:
## 제품에 대한 내용과 writer_option에 대한 내용 분리
content0 = df.loc[num, 'content'].split('포토후기')[0] #제품에 대한 내용
content1 = df.loc[num, 'content'].split('포토후기')[1].replace('cm','').replace("kg","") #writer_option에 대한 내용 & 불용어 제거
if '서포터즈' in content0:
if "쇼핑몰 추천" in content0.split('서포터즈')[0]:
df.loc[num, 'content'] = ""
else:
df.loc[num, 'content'] = content0.split('서포터즈')[0]
df.loc[num, 'writer_option'] = content1
elif "포토후기" in df.loc[num, 'content']:
content0 = df.loc[num, 'content'].split('포토후기')[0] #제품에 대한 내용
content1 = df.loc[num, 'content'].split('포토후기')[1].replace('cm','').replace("kg","") #writer_option에 대한 내용
if '서포터즈' in content0:
if "쇼핑몰 추천 리뷰" in content0.split('서포터즈')[0]: # 특정 단어가 들어가있는 댓글들이 있어서 정리
df.loc[num, 'content'] = ""
else:
df.loc[num, 'content'] = content0.split('서포터즈')[0]
df.loc[num, 'writer_option'] = content1
df.to_csv("fcmm_review_cleaning.csv", encoding='cp949')
<저장한 csv파일>
1차 전처리를 마치고보니 제품에 대한 내용이 writer_option에 들어가있는 녀석들을 발견했다. 이녀석들은 모두 '착용'이라는 단어 뒤에 내용이 들어있었다. 또한 댓글 전체의 cm, kg같은 단어를 제거해주고, 댓글 분석을 위해 숫자와 영어는 제거해 준다.
writer_options = df['writer'].index
for idx in writer_options:
#writer_option 클리닝
if '착용' in str(df.loc[idx, 'writer_option']):
df.loc[idx, 'content'] = df.loc[idx, 'writer_option'].split('착용')[1]
df.loc[idx, 'writer_option'] = df.loc[idx, 'writer_option'].split('착용')[0]
#불용어 제거
df.loc[idx, 'writer_option'] = str(df.loc[idx, 'writer_option']).replace('cm', '').replace('kg', '')
#content 숫자와 영어 제거
df.loc[idx, 'content'] = re.sub('[^가-힣]', '', str(df.loc[idx, 'content']))
2. 댓글 분석
가. 전체 단어 빈도분석
저장한 엑셀파일을 다시 불러와 진행했다.
content컬럼만 사용하여 일단 모든 단어에 대해 빈도를 기반으로 소비자들이 생각하는 fcmm의 전반적인 특성을 파악한다.
11821개의 리뷰중 null값인 499개를 제거하고 11322개의 댓글만 사용했다. 형태소 분석기는 konlpy의 Okt를 사용했다. 사용 방법 링크는 아래링크 참조.
Installation — KoNLPy 0.6.0 documentation
Ubuntu Supported: Xenial(16.04.3 LTS), Bionic(18.04.3 LTS), Disco(19.04), Eoan(19.10) Install dependencies # Install Java 1.8 or up $ sudo apt-get install g++ openjdk-8-jdk python3-dev python3-pip curl Install KoNLPy $ python3 -m pip install --upgrade pip
konlpy.org
이후 댓글 하나씩 형태소로 분리 후 글자수가 1 이상인 단어만 추렸다. collection의 Counter라이브러리를 사용하여 단어별 빈도를 확인했고 이를 데이터프레임으로 변환하여 엑셀파일로 만들었다. 엑셀파일을 가지고 불용어체크, 유사단어 체크 등의 정제 과정을 한번 더 거칠 것이다. 이를 가지고 다시 코드로 돌아와 분석을 진행하도록 할것이다.
import pandas as pd
import numpy as np
from konlpy.tag import Okt
from collections import Counter
df = pd.read_excel("fcmm_review_cleaning.xlsx", index_col=0, sheet_name="cleaning2")
print(df.shape) #(11821, 8)
review_df = df[['id', 'product_code', 'writer', 'content']] #필요 컬럼만 추출
# print(review_df.isnull().sum()) # content에 499개 null값 존재
final_df = review_df.dropna() #null row 제거
print(final_df.shape) #(11322, 4)
okt = Okt()
words_list = []
for content in final_df['content']:
words = [word for word in okt.morphs(content) if len(word)>1] #형태소로 분리 후 글자수가 1이상인 단어만
for word in words:
words_list.append(word)
word_dict = Counter(words_list)
word_count_df = pd.DataFrame.from_dict(word_dict, orient='index').reset_index() #데이터프레임으로 변환
word_count_df.rename(columns={"index": "word", 0:"freq"}, inplace=True)
word_count_df.sort_values(by=['freq'], ascending=False, inplace=True)
word_count_df.to_excel("review_word_freq.xlsx", index=False) #엑셀저장
나. writer가 fcmm의 경우와 일반의 경우 댓글 빈도 분석
다. 구매건수 많은 제품의 댓글과 적은 제품들의 댓글 분석 비교
'Data Analysis > FCMM' 카테고리의 다른 글
fcmm댓글분석2 (0) | 2023.07.27 |
---|---|
fcmm 데이터시각화2 (0) | 2023.07.20 |
fcmm 데이터 분석(중분류 NULL은 왜?) (0) | 2023.07.19 |
FCMM데이터 시각화 (0) | 2023.07.18 |
fcmm테이블 모델링 (0) | 2023.07.18 |