멋쟁이사자처럼 그로스마케터2기

[멋쟁이사자처럼부트캠프 그로스마케팅 2기 회고] 11일차 (API,감정분석, 워드클라우드)

전젬민 2025. 6. 16. 22:27

오늘은 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 파일을 역으로 불러와서 분석할 수 있음