10. 텍스트 분석

[실습 1] AI 활용 쇼핑몰 리뷰 분석

고객의 목소리를 데이터로 읽다: 1,000개 리뷰로 끝내는 텍스트 마이닝

1. 실습 개요

목표: 코딩 없이 생성형 AI(ChatGPT, Gemini 등)를 활용해 1,000건의 리뷰 데이터를 정량/정성적으로 분석함.
핵심 프로세스: 데이터 업로드 → 주제 분류(Topic Modeling) → 감성 분석(Sentiment Analysis) → 키워드 추출(Keyword Extraction) → 인사이트 도출.

2. 데이터셋 소개 및 준비

데이터 명: 네이버 쇼핑 리뷰 샘플 데이터 (1,000행).
특징:
별점(Rating)과 리뷰 본문(Text)이 혼재되어 AI 분석 실습에 최적.
실제 쇼핑몰 리뷰와 유사한 구어체, 오타, 이모티콘 포함.
'재구매', '배송', '마감', '가격' 등 다양한 주제가 혼재되어 있어 토픽 모델링 실습에 최적
데이터 구조: 평점(1~5) + 리뷰 텍스트 (약 20만 건)
데이터 출처 (GitHub): bab2min/corpus 의 sentiment 카테고리 내 naver_shopping.txt

3. 데이터 구조 (Schema)

AI에게 데이터를 이해시키기 위한 필수 정보임.
컬럼명
설명
비고
review
고객 리뷰 본문
핵심 분석 대상 (Text)
rating
별점 (1~5)
정량 지표 (Score)

Step 1. 데이터 페르소나 정의 (Data Onboarding)

목표: AI에게 데이터의 '맥락(Context)'을 주입하여 분석 준비 완료.
실습 내용:
1.
네이버 쇼핑 리뷰 엑셀 파일 업로드.
2.
AI에게 자신의 역할(마케팅 담당자)과 데이터의 배경 설명하기.
목표 결과물: 데이터 구조 (컬럼 설명 등), 분석 방향성
🔑 핵심 프롬프트:
너는 지금부터 이커머스 비즈니스 인사이트를 도출하는 **'수석 데이터 분석가'**야. 첨부한 파일은 네이버 쇼핑에서 수집된 1,000건의 고객 리뷰 데이터야. 데이터를 로드해서 데이터를 파악해보고, 이 데이터로 어떤 분석이 가능한지 요약해줘
GPT 결과
💬
GPT
데이터를 성공적으로 로드해서 기본 구조를 확인했어.
(행 999개 × 컬럼 2개:
review, ratings)

데이터 구조 요약

컬럼명
설명
데이터 타입
결측치
review
고객 리뷰 텍스트
object
0개
ratings
별점(정수 1~5)
int64
0개
텍스트 리뷰 + 별점 조합으로 구성된 매우 전형적인 감성 분석용 이커머스 리뷰 데이터셋이야.

이 데이터로 수행 가능한 분석 방향 요약

1️⃣ 기초 탐색 분석 (EDA)

별점 분포(1~5점의 리뷰 비율)
리뷰 길이 분포(불만 리뷰가 더 길어지는 패턴 등)
별점별 텍스트 특성 비교

2️⃣ 감성 분석 (Sentiment Analysis)

별점 기반으로 긍·부정 레이블 자동 생성 가능
예) 1–2점 = 부정, 4–5점 = 긍정
머신러닝 또는 BERT 기반 감성 분류 모델 학습 가능
부정 리뷰 키워드 추출 (불만 요인 파악)

3️⃣ 토픽 모델링 (Topic Modeling)

LDA 또는 BERTopic 활용하여 리뷰 주제 자동 분류
예: 배송, 품질, 가격, 사이즈, 고객 서비스 등
카테고리별 감정 스코어 분석 가능

4️⃣ 제품 개선 인사이트 도출

별점 낮은 리뷰에서 자주 등장하는 문제점 파악
예) "배송", "불량", "사이즈 작음", "포장" 등
긍정/부정 리뷰별 주요 단어 워드클라우드 생성

5️⃣ VOC(Voice of Customer) Dashboard 구성

리뷰 수 추세(시간 정보가 있다면)
감성 점수 실시간 모니터링
부정 리뷰 알림 시스템 구축 가능

6️⃣ 추천/개선 전략과 연결

"5점 리뷰에서 반복되는 구매 포인트" → 마케팅 문구 도출
"1~2점 리뷰 주요 원인" → CS/상품개선 부서에 전달

📌 다음 단계 제안 (데이터 분석가 관점)

분석을 본격적으로 진행하려면 아래 정보를 확인해야 해:
1.
텍스트 전처리가 필요한가?
(이모지, 불용어 처리, 중복 제거 등)
2.
별점 기준 감성 레이블링을 어떻게 할지?
3점은 중립으로 둘지
1–2 부정 / 4–5 긍정만 쓸지 등
3.
어떤 인사이트가 비즈니스적으로 더 중요한가?
불만 요인 파악?
마케팅 포인트 추출?
리뷰 기반 트렌드 분석?

✳️ 다음에 어떤 분석을 진행할까?

예시 옵션:
A) 별점 분포 시각화 + 리뷰 길이 분석
B) 감성 레이블 생성 및 감성 분석
C) 토픽 모델링으로 리뷰 주제 파악
D) 부정 리뷰 원인 분석
E) 전체 텍스트 전처리 파이프라인 구축
원하는 분석 방향을 말해줘.
바로 코드와 함께 단계별로 진행할게!

Step 2. 주제 분류하기 (Topic Modeling with AI)

목표: 전체 리뷰를 AI의 문해력을 활용해 주요 주제로 분류.
실습 내용:
1.
수학적 알고리즘(LDA) 대신, AI의 의미론적 이해를 바탕으로 카테고리 분류 요청.
2.
'배송', '품질', '가격', '서비스', '기타' 등 5개 대분류로 태깅.
목표 결과물: 주제별 분포 막대그래프 (Bar Chart)
🔑 핵심 프롬프트:
전체 리뷰 텍스트를 분석해서 주요 주제(Topic)를 5가지 카테고리로 분류해줘. (예: 배송, 상품 품질, 디자인, 가격, 고객응대). 그리고 각 주제별 리뷰 개수와 비율을 막대그래프로 그려줘
GPT 결과
💬
GPT
아래는 전체 리뷰 텍스트를 기반으로 LDA Topic Modeling을 수행한 결과이며,
5개 주요 토픽으로 분류 후
각 토픽별 리뷰 개수와 비율, 그리고 막대그래프 시각화까지 완료된 상태야.

1. 자동 추출된 5개 토픽별 주요 키워드

토픽 분석은 LDA 기반이며, 각 토픽 상위 10개 키워드를 근거로 의미적으로 해석했어.
(키워드 기반 해석이므로
추정임을 명확히 밝힘)
토픽 번호
상위 키워드
해석된 주제(추정)
0
많이, 너무, 좋아요, 재구매, 좋습니다…
상품 품질
1
생각보다, 가성비, 조금, 정말, 좋고…
가격/가성비
2
맘에, 엄청, 정말, 구매했는데…
만족도(긍정감정)
3
배송이, 바로, 배송, 배송은…
배송
4
사이즈, 이뻐요, 마음에, 만족합니다…
디자인/사이즈

2. 토픽별 리뷰 개수 및 비율

주제
리뷰 수
비율
상품 품질
251
25.1%
가격/가성비
189
18.9%
만족도(긍정감정)
206
20.6%
배송
204
20.4%
디자인/사이즈
149
14.9%

📊 3. 토픽별 리뷰 개수 시각화 (막대그래프)

🔍 4. 비즈니스 인사이트 요약

✔ 상품 품질(25.1%)이 가장 언급됨

→ 품질 관련 피드백이 많으므로 신제품 개발 및 품질 개선 인사이트의 핵심 지표.

✔ 가격/가성비 비중도 높은 편(18.9%)

→ 가격 민감도가 높을 가능성 → 프로모션 메시지 최적화 필요.

✔ 배송(20.4%)이 상당 비율 차지

→ 배송 속도, 포장, 오배송 문제 모니터링 필요.

✔ 디자인/사이즈(14.9%)는 의류/생활제품군에서 중요한 변수

→ 사이즈 정보 명확화 또는 상세페이지 강화 필요.

✳️ 다음 단계 추천

아래 중 원하는 분석 방향을 알려줘. 바로 코드로 이어서 해줄게.
1.
부정 리뷰만 따로 분석하여 불만 요인 추출
2.
각 토픽별 별점 차이 분석 → 어떤 주제가 고객 만족에 영향이 큰가
3.
워드클라우드 생성(긍정/부정/토픽별)
4.
감성 분석 모델링(BERT 기반 가능)
어떤 걸 좀 더 깊게 보고 싶어?

Step 3. 심층 감성 분석 (Drill-down Sentiment Analysis)

목표: 특정 주제(예: 배송)에 대한 긍정/부정 비율을 파악해 보는 실습
실습 내용:
1.
각 리뷰의 감성을 긍정/부정/중립으로 판단
2.
GPT는 텍스트 자체를 분석해서 감성분석은 가능
하지만, Python 실행 환경 안에서 감성 분류 결과를 자동 전달·반영하는 기능이 없음
즉, 파일로 전달하는 방식으로 텍스트 감성분석 불가
3.
방법은
a.
ChatGPT 대화창에 텍스트 직접 복사/붙여 넣기
500개 행 정도가 넘어가면 제한 Token량 초과로 분석 불가. 소량만 가능
b.
Gemini 유료 사용자=AI("프롬프트", 범위)
i.
Google Sheet에서 Gemini 함수 사용 =AI("프롬프트", 범위)
=ai("모든 리뷰의 뉘앙스를 분석해서 '긍정', '부정', '중립' 중 하나로 감성 상태를 태깅해줘", A2)
c.
ChatGPT 사용자
i.
확장 프로그램 사용
- gpt 로 검색 > GPT for Sheets and Docs 설치
- Enable GPT functions 를 통해서 GPT 함수를 free trial 할 수 있음
ii.
Apps Script 활용하여 ChatGPT API 호출하여 GPT 이용
Google Sheet > Apps Script에서 myGPT(ChatGPT API 호출 함수) 생성 코드
/************************************ * 0. OpenAI API 설정 (모델명 등) ************************************/ const OPENAI_MODEL = "gpt-4.1-mini"; // 필요에 따라 gpt-4.1 등으로 모델 변경 가능 /************************************ * 1. 스크립트 속성에 API 키 저장 (최초 1회만 실행) * * - Apps Script 편집기에서 이 함수를 한 번 수동 실행해서 * API 키를 저장하세요. ************************************/ function setOpenAIApiKey() { const apiKey = "여기에 개인 GPT_API_Key 입력하기"; // ← 직접 입력 PropertiesService.getScriptProperties().setProperty("OPENAI_API_KEY", apiKey); } /************************************ * 2. 시트에서 사용할 사용자 정의 함수 * * 사용 예시: * =GPT("이 텍스트를 요약해줘", A2:A10) * =GPT("아래 데이터를 분석해서 한 줄 인사이트로 말해줘", B2:D20) ************************************/ function myGPT(prompt, range) { if (!prompt) { return "프롬프트를 입력하세요."; } const apiKey = PropertiesService.getScriptProperties().getProperty("OPENAI_API_KEY"); if (!apiKey) { return "API 키가 설정되지 않았습니다. setOpenAIApiKey()를 먼저 실행하세요."; } // range가 주어졌다면, 셀들의 값을 하나의 문자열로 합치기 let rangeText = ""; if (range) { // range는 2차원 배열 형태일 수 있으므로 평탄화 후 줄바꿈으로 이어 붙임 if (Array.isArray(range)) { const flat = range.flat(); rangeText = flat.join("\n"); } else { rangeText = String(range); } } // 최종 프롬프트 구성 let finalPrompt = prompt; if (rangeText && rangeText.trim() !== "") { finalPrompt += "\n\n---\n아래는 참고할 데이터입니다:\n" + rangeText; } // OpenAI Chat Completions API 호출 const url = "https://api.openai.com/v1/chat/completions"; const payload = { model: OPENAI_MODEL, messages: [ { role: "system", content: "당신은 구글 스프레드시트 안에서 동작하는 도움이 되는 어시스턴트입니다. 가능하면 간결하게 답변하세요." }, { role: "user", content: finalPrompt } ] }; const options = { method: "post", contentType: "application/json", headers: { Authorization: "Bearer " + apiKey }, payload: JSON.stringify(payload), muteHttpExceptions: true }; try { const response = UrlFetchApp.fetch(url, options); const code = response.getResponseCode(); if (code !== 200) { return "API 오류: HTTP " + code + " - " + response.getContentText(); } const data = JSON.parse(response.getContentText()); const answer = data.choices[0].message.content; // 시트 셀에 들어갈 수 있게 문자열만 반환 return answer; } catch (e) { return "예외 발생: " + e; } }
d.
Colab : 파이썬으로 감성분석하기 (ChatGPT에게 파이썬 코드 짜달라고 하기)
첨부의 네이버 쇼핑몰 리뷰 파일에서 A열의 리뷰의 뉘앙스를 분석해서 '긍정', '부정', '중립' 중 하나로 감성 상태를 분석해서 C열에 태깅하는 파이썬 코드를 만들어줘. Colab에서 돌릴거야
🔑 핵심 프롬프트: 감성분석 완료 파일 새롭게 업로드 하고
모든 리뷰의 뉘앙스를 분석해서 '긍정', '부정', '중립' 중 하나로 감성 상태를 C열에 분류했어 **[주제별 감성 분포]를 100% 누적 막대그래프(Stacked Bar Chart)**로 시각화해줘. (X축: 주제, Y축: 감성 비율) 마지막으로, '부정' 비율이 가장 높은 주제가 무엇인지 알려주고, 그 주제의 부정 리뷰 개수는 몇 개인지 요약해줘
GPT 결과
💬
GPT
아래는 **리뷰 감성 태깅 결과(긍정/부정/중립)**를 기반으로,
LDA로 추출한
5개 주요 주제별 감성 분포 분석 + 100% 누적 막대그래프 + 부정 비율이 가장 높은 주제 요약이야.

✅ 1. 주제별 감성 분포(정량 결과)

정제된 감성 라벨(긍정, 부정, 중립)만 사용하여 계산한 결과:
주제
긍정
부정
중립
가격/가성비
73
92
15
디자인/사이즈
80
65
21
만족도
69
77
13
배송
135
102
20
상품 품질
102
109
20
비율 기준(100% 정규화):
가격/가성비 → 부정 비율 51.1%
디자인/사이즈 → 부정 비율 39.2%
만족도 → 부정 비율 48.4%
배송 → 부정 비율 39.7%
상품 품질 → 부정 비율 47.2%

📊 2. 주제별 감성 분포 (100% 누적 막대그래프)

🚨 3. 부정 비율이 가장 높은 주제 & 부정 개수

🔴 가장 부정적인 주제: 가격/가성비

부정 비율: 51.1% (가장 높음)
부정 리뷰 개수: 92건

🔎 인사이트

가격에 대한 기대 대비 불만이 많이 발생하고 있음
"가성비가 낮다", "질 대비 비싸다", "생각보다 별로" 등의 반응이 많을 가능성이 높음
프로모션 문구·가격 정책·품질 보강 중 하나가 주요 개선 포인트
필요하면 아래 추가 분석도 해줄게:

📌 선택지

1.
각 주제별 부정 리뷰 키워드 추출(WordCloud + 주요 단어 Top10)
2.
감성에 가장 영향을 준 단어 분석(SHAP/특징 중요도)
3.
주제별 감성 점수 대시보드 형태로 요약
4.
감성-토픽 매트릭스(주제×감성 교차분석)
원하는 번호만 말해줘!
Gemini 3.0 결과 : 감성분석 파일 전달 형태로 가능하지만, 일부 환각 현상 존재

Step 4. 원인 규명 및 키워드 추출 (Root Cause & Keyword Extraction)

목표: 부정적인 이유가 무엇인지 핵심 단어를 뽑아냅니다.
실습 내용:
1.
'배송'이면서 '부정'인 리뷰들에서 명사/형용사 키워드 추출.
2.
단순 단어 나열이 아닌 '의미 덩어리(N-gram)' 추출 (예: '박스' -> '박스 파손')
3.
불용어(stop words) 처리 : 분석 불필요 단어 제외
목표 결과물: 불만 키워드 워드 클라우드, 주요 불만 요인 Top 10 리스트
🔑 핵심 프롬프트: 너무 길어서 결과가 안나오면 4, 5번을 나누어 진행
데이터에서 '배송' 관련 리뷰 중 감성 상태가 '부정'인 리뷰만 골라 분석해줘. 1) 각 리뷰에서 배송 관련 문장만 추출해줘. - 문장 안에 배송, 택배, 출고, 도착, 배달, 기사, 문앞, 물류 등 배송 관련 단어가 포함된 문장만 선택해줘. 2) 추출된 배송 관련 부정 문장들을 의미적으로 유사한 것끼리 자동으로 군집화해줘. - 의미 기준으로 자연스럽게 묶이는 그룹을 생성하고, - 그룹 수는 미리 정하지 말고 문장 패턴을 보고 자동으로 판단해줘. - 군집화 시 문장 내 핵심 불만 요소(지연, 누락, 훼손, 응대 문제 등)를 중심으로 의미 기반으로 묶어줘. 3) 이렇게 생성된 각 의미 그룹에 대해: - 그룹 이름을 모델이 직접 붙여줘 (예: "배송 지연 관련 불만", "택배 기사 응대 문제", "포장 파손 문제" 등) - 해당 그룹에 속한 문장 수와 전체 대비 비율(%)을 계산해줘. - 그룹을 대표하는 핵심 키워드 또는 문장 패턴을 3~5개 추출해줘. 4) 의미 그룹별 비율을 표로 정리해줘. - 그룹명 / 문장 수 / 비율 / 대표 키워드 5) 마지막으로, 의미 그룹별 비율을 시각화한 막대그래프를 만들어줘. - X축은 자동 생성된 의미 그룹 - Y축은 비율(%) - 한글 폰트 적용해서 글자가 깨지지 않게 해줘. 분석 목적은 ‘배송 불만이 어떤 유형으로 나뉘는지 자동으로 발견하는 것’이므로, 사전에 특정 그룹을 정하지 말고 의미적으로 자연스럽게 묶이는 패턴을 기반으로 그룹을 생성해줘.
GPT 결과
💬
GPT

🚚📊 자동 의미 기반 배송 불만 그룹핑 결과 요약

54개의 배송 관련 부정 문장이 의미적으로 묶였고,
최적 클러스터 수는 silhouette score 기준 5개로 선택됨.

📌 그룹 1 — "배송 평가 불일치·기대 대비 실망" (3건)

핵심 문장 패턴

빠른 배송이라더니 실제로는 아님
배송보다 구성품/포장/상품 문제와 함께 실망 표현
"배송은 마음에 드는데…"처럼 리뷰 전반 평가 혼합

대표 문장

"빠른 배송은 마음에 드는데 사진과 다른 증정품을 주셨네요"
"물건은 좋은디 아직 모르겠고 배송은 빵점이네요"

핵심 키워드

배송은, 마음에, 사진과, 주셨네요

📌 그룹 2 — "부분적 문제 + 약한 배송 불만 패턴" (11건)

배송 자체가 주 불만은 아니나,
배송이
느리고, 색 다름, 설명서 없음, 조립 어려움, 불편함
다른 불만과 함께 섞여 있는 패턴.

대표 문장

"배송도 누락되어있었네요"
"배송이 좀 느리고 상자에 제품만 들어있네요 사용설명서가 없어요"
"배송도 한달 걸린 것 같고…"

핵심 키워드

배송도, 느리고, 색도, 한달걸린거같고
복합 불만 유형(배송 + 제품 경험 섞임)

📌 그룹 3 — "배송 문제 전반 / 서비스 불만 / 아주 광범위한 불만" (28건, 가장 큰 비중)

가장 큰 클러스터.
배송 자체가 아니라,
배송 과정에서의 전반적 불만·불친절·과도한 지연·연락 없음 등이 광범위하게 포함됨.

대표 문장

"배송기사나, 판매하는 회사나 불친절하고 불쾌합니다"
"연락도 없고 너무 늦게 와서 별로네요"
"배송 서비스 매우 안 좋음"
"배송느림"

핵심 키워드

배송느림, 배송이상하게해줌, 그냥, 하나는
배송 전반 불만 그룹(서비스/커뮤니케이션/지연 혼합)

📌 그룹 4 — "배송 지연(Delay) 핵심 그룹" (9건)

가장 '순수한 배송 지연' 그룹.
문장이 매우 명확하게
느림/너무 늦음/행사 지나감 등에 집중됨.

대표 문장

"배송이 아주 느려서 행사 다 끝나고 나서 받았네요"
"배송이 너무 느려요"
"배송이 넘 느리네요"

핵심 키워드

느려요, 느리네요, 배송이
지연 불만의 정형 패턴

📌 그룹 5 — "택배 문제(기사/투하/취급 불량)" (3건)

배송 자체보다 택배기사 혹은 전달 방식 문제에 대한 불만.

대표 문장

"택배가 엉망이네용 말도 없이 놓고 감"
"택배가 너무 느려요"
"문자 한 통 없이 택배가 오나요?"

핵심 키워드

택배가, 말도없이, 놓고가고, 너무느려요
택배 취급·응대 문제 핵심 그룹

📊 그룹별 비율 요약

자동 그룹
의미 요약
문장 수
비율
그룹 1
배송 경험 대비 실망/기대 불일치
3
5.6%
그룹 2
복합 불만(배송 + 기타 문제 동시 발생)
11
20.4%
그룹 3
배송 전반 불만·서비스 문제
28
51.9%
그룹 4
배송 지연(Delay)
9
16.7%
그룹 5
택배 취급/기사 문제
3
5.6%

🔎 종합 해석 (AI 자동 분류 기반)

📌 1) 배송 불만의 절반 이상(52%)은 "배송 전반 불만·서비스 문제"

지연, 불친절, 연락 두절, 공지 없음, 응대 문제 등
배송 체계 자체가 신뢰받지 못하는 상황

📌 2) 순수 '배송 지연'은 16.7%로 두 번째로 큰 불만 요소

"너무 느림", "행사 지나감", "기간 초과"

📌 3) '누락·오배송'은 지연보다 적지만, 그룹 2에 다수 포함된 형태로 존재

📌 4) 택배 취급 문제는 5.6%지만 강도가 높은 불만

"말도 없이 두고 감", "엉망", "문자 없음"
의미 그룹명
문장 수
👍
Contact : azureguy@empal.com / azureguy@cau.ac.kr