오늘은 API, 감정분석과 워드클라우드에 대해서 배웠다. 워드클라우드로 시각화 시키는 부분은 꽤 재미있었다. 옛날부터 뉴스레터를 보면 항상 마케터들이 멋있게, 단어들이 나열된 이미지로 트렌드에 대해서 알려주는걸 보고 나도 하고 싶다 생각했는데, 내가 하고 있다니 ! 라는 생각에 설레기도했다.
API
API 란 무엇인가?
: API 는 애플리케이션 간의 데이터를 주고받고 기능을 호출할 수 있도록 하는 인터페이스이다. 이를 통해 기업은 외부 서비스와 연동하여 데이터를 수집하고, 마케팅 자동화를 구현하며 맞춤형 고객 경험을 제공할 수 있다.
API의 역할과 중요성 in 그로스마케팅
: 그로스 마케팅은 데이터 기반으로 고객 유입, 전환, 유지 전략을 최적화하는 방식이다. API를 활용하면 다양한 마케팅 채널에서 데이터를 수집하고 분석하여 신속한 의사 결정을 내릴 수 있다. 주요 역할은
- 데이터 통합 및 분석: 여러 마케팅 채널(Facebook Ads, Google Analytics, CRM 등)에서 데이터를 수집하여 분석
- 개인화 마케팅: 고객 행동 데이터를 기반으로 맞춤형 이메일, 푸시 알림, 광고 캠페인 실행
- 마케팅 자동화: API를 활용한 캠페인 자동화, 고객 세그먼트 분류 및 리타겟팅 전략 적용
- A/B 테스트 최적화: API를 통해 다양한 버전의 콘텐츠를 동적으로 제공하고 성과 분석
그로스 마케팅에서 활용 가능한 API 유형
API를 통해 마케팅을 자동화하고 확장성을 높일 수 있다. 대표적인 API 유형과 활용 사례는 다음과 같음
1) 광고 API : google Ads API / Facebook Marketing API
2) 분석 및 트래킹 API : Google Analytics API
3) CRM 및 고객 데이터 API : HubSpot API / Salesforce API
4) 이메일 & 메시징 API : Twilio API / SendGrid API
5) 소셜 미디어 API : Twitter API / Instagram Graph API
API 데이터 수집 및 분석
1. 데이터 생성 및 CSV 저장 코드
import pandas as pd
# 하드코딩된 Google Analytics 사용자 행동 데이터 (30일)
data = {
"Date": pd.date_range(start="2024-01-01", periods=30, freq="D"),
"Sessions": [
1000, 1200, 1100, 1300, 1150, 1400, 1250, 1500, 1350, 1600,
1700, 1800, 1750, 1900, 1850, 1950, 2000, 2100, 2200, 2300,
2250, 2400, 2500, 2600, 2700, 2800, 2900, 3000, 3100, 3200
],
"Users": [
800, 950, 870, 1000, 920, 1100, 980, 1200, 1050, 1300,
1400, 1450, 1350, 1500, 1400, 1550, 1600, 1700, 1750, 1850,
1800, 1950, 2000, 2100, 2200, 2300, 2350, 2450, 2500, 2600
],
"New_Users": [
300, 400, 350, 450, 380, 500, 420, 550, 460, 600,
620, 650, 640, 700, 680, 720, 750, 800, 850, 900,
870, 950, 1000, 1050, 1100, 1150, 1200, 1250, 1300, 1350
],
"Pageviews": [
4000, 4500, 4200, 4800, 4300, 5000, 4600, 5200, 4800, 5500,
6000, 6500, 6200, 7000, 6800, 7200, 7500, 7800, 8000, 8200,
8500, 8700, 9000, 9500, 9800, 10000, 10500, 11000, 11500, 12000
],
"Pages_per_Session": [
4.0, 3.8, 3.9, 3.7, 3.8, 3.6, 3.7, 3.5, 3.6, 3.4,
3.9, 4.0, 3.8, 4.1, 4.2, 4.0, 4.3, 4.5, 4.4, 4.6,
4.2, 4.1, 4.3, 4.5, 4.6, 4.7, 4.8, 4.9, 5.0, 5.1
]
}
# 데이터프레임 생성
google_analytics_data = pd.DataFrame(data)
# CSV 파일로 저장
csv_filename = "google_analytics_data.csv"
google_analytics_data.to_csv(csv_filename, index=False)
print(f"CSV 파일 '{csv_filename}' 저장 완료!")
2. CSV 로드 및 데이터 분석, 시각화 코드
import matplotlib.pyplot as plt
# CSV 파일 로드
csv_filename = "google_analytics_data.csv"
google_analytics_data = pd.read_csv(csv_filename)
# 주요 지표 계산
total_sessions = google_analytics_data["Sessions"].sum()
total_users = google_analytics_data["Users"].sum()
total_new_users = google_analytics_data["New_Users"].sum()
total_pageviews = google_analytics_data["Pageviews"].sum()
avg_pages_per_session = round(google_analytics_data["Pages_per_Session"].mean(), 2)
# 신규 사용자 비율 계산
new_user_ratio = round((total_new_users / total_users) * 100, 2)
# 데이터 시각화: 세션 수 및 페이지뷰 수
plt.figure(figsize=(10, 5))
plt.plot(google_analytics_data["Date"], google_analytics_data["Sessions"], label="Sessions", marker='o', linestyle='-')
plt.plot(google_analytics_data["Date"], google_analytics_data["Pageviews"], label="Pageviews", marker='s', linestyle='--')
plt.xlabel("Date")
plt.ylabel("Count")
plt.title("Daily Sessions and Pageviews")
plt.legend()
plt.xticks(rotation=45)
plt.grid()
plt.show()
# 데이터 시각화: 신규 사용자 비율
plt.figure(figsize=(8, 5))
plt.bar(["New Users", "Returning Users"], [total_new_users, total_users - total_new_users], color=['blue', 'gray'])
plt.xlabel("User Type")
plt.ylabel("Count")
plt.title(f"New Users vs Returning Users (New User Ratio: {new_user_ratio}%)")
plt.grid(axis='y')
plt.show()
# 데이터 시각화: 세션당 페이지뷰 평균
plt.figure(figsize=(8, 5))
plt.bar(["Average Pages per Session"], [avg_pages_per_session], color='green')
plt.ylabel("Pages per Session")
plt.title("Average Pages per Session Over Time")
plt.ylim(0, max(google_analytics_data["Pages_per_Session"]) + 1)
plt.grid(axis='y')
plt.show()
# 주요 지표 출력
summary_metrics = {
"Total Sessions": total_sessions,
"Total Users": total_users,
"Total New Users": total_new_users,
"New User Ratio (%)": new_user_ratio,
"Total Pageviews": total_pageviews,
"Average Pages per Session": avg_pages_per_session,
}
# 데이터프레임 생성 및 출력
summary_df = pd.DataFrame(summary_metrics, index=[0])
print(summary_df)
그로스마케팅 과정
1. 위와 같이 API 를 이용해 데이터를 생성 후
2. 데이터를 분석하고 시각화 시키는 것
3. 시각화된 데이터를 가지고 보고서를 작성하는 것
감정 분석
# 툴 다운 받기
!pip install -q sentence-transformers scikit-learn openpyxl pandas
from sentence_transformers import SentenceTransformer
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
# ✅ 감정 단계별 키워드 정의
level_keywords = {
0: ['끔찍하다', '역겹다', '최악이다', '형편없다', '엉망이다', '재앙이다'],
1: ['별로다', '지루하다', '나쁘다', '불쾌하다', '실망이다', '아쉽다'],
2: ['그저 그렇다', '보통이다', '평범하다', '무난하다', '익숙하다', '기대 이하'],
3: ['좋다', '괜찮다', '재밌다', '잘 만들었다', '훌륭하다', '추천한다'],
4: ['최고다', '감동이다', '너무 좋다', '역대급이다', '완벽하다', '최애다']
}
# ✅ 감정 문장 템플릿 정의
templates = [
"이 영화는 정말 {}.",
"{} 영화는 처음이다.",
"내용이 {}.",
"배우 연기가 {}.",
"{} 장면이 인상 깊다.",
"연출이 정말 {}.",
"스토리가 {}.",
"보는 내내 {} 느낌이었다.",
"영화 전체가 {}.",
"마지막 장면이 특히 {}."
]
# ✅ 문장과 레이블 생성
sentences = []
labels = []
for level, words in level_keywords.items():
for word in words:
for template in templates:
sentence = template.format(word)
sentences.append(sentence)
labels.append(level)
print(f"총 생성된 문장 수: {len(sentences)}") # 확인용
# ✅ BERT 임베딩
model = SentenceTransformer('snunlp/KR-SBERT-V40K-klueNLI-augSTS')
embeddings = model.encode(sentences)
# ✅ 분류기 학습
X_train, X_test, y_train, y_test = train_test_split(
embeddings, labels, test_size=0.2, random_state=42
)
clf = LogisticRegression(max_iter=1000)
clf.fit(X_train, y_train)
# ✅ 평가
# print(classification_report(
# y_test,
# clf.predict(X_test),
# labels=[0, 1, 2, 3, 4],
# target_names=["매우 부정", "부정", "중립", "긍정", "매우 긍정"],
# zero_division=0
# ))
이후에 문장 직접 입력해서 감정 분석하기
# ✅ 감정 예측 함수
def predict_sentiment_level(sentence):
emb = model.encode([sentence])
pred = clf.predict(emb)[0]
proba = clf.predict_proba(emb)[0][pred]
level_map = {
0: "매우 부정",
1: "부정",
2: "중립",
3: "긍정",
4: "매우 긍정"
}
return level_map[pred], proba
# ✅ 사용자 입력 테스트
text = input("감정 분석할 문장을 입력하세요: ")
label, confidence = predict_sentiment_level(text)
print(f"예측 감정: {label} (신뢰도: {confidence:.2f})")
하면 입력한 문장을 위에서 학습한 감정 데이터를 기준으로 감정상태를 나누게 된다.
너무 코드만 많이 나오고, 내가 개발자인지 그로스마케터인지 혼동이 와서 앞으로는 코드는 그만 올리고 조금씩 결과물만 올릴게요
이건 내 첫 워드클라우드 시각화로 만든 댓글 감정 분석표이다 !
오늘의 레벨업 :
1. 감정분석할 수 있음
2. 워드클라우드 쓸 수 있음
3. 데이터로 CSV 파일 만들고, CSV 파일을 역으로 불러와서 분석할 수 있음
'멋쟁이사자처럼 그로스마케터2기' 카테고리의 다른 글
[멋쟁이사자처럼부트캠프 그로스마케팅 2기 회고] 13일차 (Matplotlib 시각화, 보고서 작성) (0) | 2025.06.18 |
---|---|
[멋쟁이사자처럼부트캠프 그로스마케팅 2기 회고] 12일차 (AARRR, 보고서 작성) (0) | 2025.06.18 |
[멋쟁이사자처럼부트캠프 그로스마케팅 2기 회고] 10일차 (MongoDB, Python&SQL 연동) (0) | 2025.06.13 |
[멋쟁이 사자처럼 그로스마케팅 2기 회고] 9일차 (JOIN, UNION, mongoDB) (0) | 2025.06.13 |
[멋쟁이 사자처럼 그로스마케팅 2기 회고] 8일차 (SQL, 테이블 다루기) (0) | 2025.06.12 |