너는 지금부터 이커머스 비즈니스 인사이트를 도출하는 **'수석 데이터 분석가'**야.
첨부한 파일은 네이버 쇼핑에서 수집된 1,000건의 고객 리뷰 데이터야.
데이터를 로드해서 데이터를 파악해보고, 이 데이터로 어떤 분석이 가능한지 요약해줘전체 리뷰 텍스트를 분석해서 주요 주제(Topic)를 5가지 카테고리로 분류해줘.
(예: 배송, 상품 품질, 디자인, 가격, 고객응대).
그리고 각 주제별 리뷰 개수와 비율을 막대그래프로 그려줘=ai("모든 리뷰의 뉘앙스를 분석해서 '긍정', '부정', '중립' 중 하나로 감성 상태를 태깅해줘", A2)/************************************
* 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;
}
}첨부의 네이버 쇼핑몰 리뷰 파일에서
A열의 리뷰의 뉘앙스를 분석해서 '긍정', '부정', '중립' 중 하나로 감성 상태를 분석해서 C열에 태깅하는 파이썬 코드를 만들어줘.
Colab에서 돌릴거야모든 리뷰의 뉘앙스를 분석해서 '긍정', '부정', '중립' 중 하나로 감성 상태를 C열에 분류했어
**[주제별 감성 분포]를 100% 누적 막대그래프(Stacked Bar Chart)**로 시각화해줘.
(X축: 주제, Y축: 감성 비율)
마지막으로, '부정' 비율이 가장 높은 주제가 무엇인지 알려주고, 그 주제의 부정 리뷰 개수는 몇 개인지 요약해줘데이터에서 '배송' 관련 리뷰 중 감성 상태가 '부정'인 리뷰만 골라 분석해줘.
1) 각 리뷰에서 배송 관련 문장만 추출해줘.
- 문장 안에 배송, 택배, 출고, 도착, 배달, 기사, 문앞, 물류 등 배송 관련 단어가 포함된 문장만 선택해줘.
2) 추출된 배송 관련 부정 문장들을 의미적으로 유사한 것끼리 자동으로 군집화해줘.
- 의미 기준으로 자연스럽게 묶이는 그룹을 생성하고,
- 그룹 수는 미리 정하지 말고 문장 패턴을 보고 자동으로 판단해줘.
- 군집화 시 문장 내 핵심 불만 요소(지연, 누락, 훼손, 응대 문제 등)를 중심으로 의미 기반으로 묶어줘.
3) 이렇게 생성된 각 의미 그룹에 대해:
- 그룹 이름을 모델이 직접 붙여줘 (예: "배송 지연 관련 불만", "택배 기사 응대 문제", "포장 파손 문제" 등)
- 해당 그룹에 속한 문장 수와 전체 대비 비율(%)을 계산해줘.
- 그룹을 대표하는 핵심 키워드 또는 문장 패턴을 3~5개 추출해줘.
4) 의미 그룹별 비율을 표로 정리해줘.
- 그룹명 / 문장 수 / 비율 / 대표 키워드
5) 마지막으로, 의미 그룹별 비율을 시각화한 막대그래프를 만들어줘.
- X축은 자동 생성된 의미 그룹
- Y축은 비율(%)
- 한글 폰트 적용해서 글자가 깨지지 않게 해줘.
분석 목적은 ‘배송 불만이 어떤 유형으로 나뉘는지 자동으로 발견하는 것’이므로,
사전에 특정 그룹을 정하지 말고 의미적으로 자연스럽게 묶이는 패턴을 기반으로 그룹을 생성해줘.