Growth Marketing/GM4

[TIL-260414] 멋쟁이사자처럼 그로스마케팅 4기 - 데이터분석 개론 day24 | API & MCP

pamsyra 2026. 4. 14. 16:25
▼오늘 배운 사항들
1. 유튜브 API 댓글 실습
2. MCP 연동하기

Part 1. 유튜브 API 

  • json.dumps() : 데이터의 구조 확인을 위한 코드 - 파이썬 딕셔너리 형태를 json형태의 문자열로 바꿔줘~
    - ensure_ascii = 한국어 안깨지게 하는 코드
    - ex.경쟁사 유튜브 댓글 확인, 내용 확인할 때 사용
#유튜브 API 데이터 확인
response = youtube.videos().list(
                   part="snippet, statistics",
                   id= VIDEO_ID
            ).execute() # eexecute하면 알아서 파이썬 딕셔너리 상태로 나옴 -> type(response) 하면 확인 가능
            
#indent 들여쓰기(계층구조 확인)      
import json 
print(json.dumps(response, indent=5, ensure_ascii=False))

응답구조 확인을 위한 코드

 

  • 딕셔너리 꺼내보기
    - 위에서 추출한 데이터 위아래로 슥슥 훑어보면서 뽑을 정보명 확인
  • statisitcs / snippet 값 확인할 때 : keys값 넣어서 리스트 뽑아보기 **▶ 엄청 유용하다
#채널명
video['snippet']['channelTitle'] #값 확인

#영상이름
title = video['snippet']['title']
#채널명
channel = video['snippet']['channelTitle']
#조회수
views = video['statistics']['viewCount']
#좋아요 수
likes = video['statistics']['likeCount']
#댓글 개수 
n_comm = video['statistics']['commentCount']


print(f"제목: {title}")
print(f"채널명: {channel}")
print(f"조회수: {int(views):,}")
print(f"좋아요수: {int(likes):,}")
print(f"댓글수: {int(n_comm):,}")

#찾고자하는게 snippet에 있는지 statistics에 있는지 확인할 때
print(response['items'][0]['snippet'].keys())
print(response['items'][0]['statistics'].keys())

 

  • 댓글 확인 : commentThreads()
    - commentThreads()라는 함수에 정보담아서 response_comment에 담기
#유튜브 댓글 가져오기
#commentThreads()라는 함수에 정보담아서 response_comment에 담기
response_comment = youtube.commentThreads().list(
                            part="snippet",
                            videoId=VIDEO_ID,
                            maxResults = 3
                        ).execute() #execute는 보낸다

#보기좋게 json.dump사용해서 계층구조 시각화
print(json.dumps(response_comment, indent=5, ensure_ascii=False))

 

  • 데이터 찾아서 뽑는법
    1. textDisplay 찾아내기 : items안에 snippet -> snippet 안에 channel id, videoid → topLevelcomment ...등

 

  • 댓글에서 필요한 값 꺼내기
    - response만들고, 변수지정해서 넣기
    - 필요한 값들도 변수 지정해서 출력하기
    - 오답노트) 변수지정안하고 바로 키값 넣어서 출력했는데 반복문하기에는 비효율적

response도 두번으로 나눠서 설정
변수지정해서 효율적으로 작업하기

 

  • 유튜브 댓글 수집 : 댓글 여러개를 DataFrame에 넣기
    1. 반복문 사용 - response_comment 정보들 넣기
    2. append() 함수 사용 - 필요항목만 필터링 및 카테고리 설정
    3. pandas 사용해서 새로운 pd.DataFrame 생성
#반복문 -> 꺼내서 -> 담기

rows = [] #담을곳 필요하니 빈 상자 만들고

for item in response_comment['items']:
  #print(item) - 아이템 뽑아냈고
  comment = item['snippet']['topLevelComment']['snippet']
  # print(comment)  #아이템에서 코멘트 뽑아냈고 - 우리가 보고 싶은 내용만 나눠서 출력됨

#필요한 항목만 넣는 함수 : rows.append()
  rows.append({
        'author' : comment['authorDisplayName'],
        'text' : comment['textDisplay'],
        'likes' : comment['likeCount'],
        'date' : comment['publishedAt'][:10]
        })

textDisplay만도 뽑을수잇쥐~

  • 데이터 전처리
    - yt에 html 태그 <br>같은 것들이 남아있어서 깨끗하게 처리해주기

#데이터 전처리
#<br>같은 html 태그가 있어서 데이터 전처리하기

yt['text_clean'] = yt['text'].str.replace('<br>', ' ')

#str.strip = 앞뒤 공백을 제거한다.
yt['text_clean'] = yt['text_clean'].str.strip()

#댓글 길이 추가
yt['text_len'] = yt['text_clean'].str.len()

yt[ yt['text_len'] <=5 ]

yt_filtered = yt[yt['text_len'] > 5].copy() #filtered라는 새로운 df만들어서 필요없는 데이터 삭제하기
yt_filtered

html 태그 삭제~완

  • 왜 추출하고 있는가? ▶ 월별로 나눠서 월단위 데이터를 보기 위해 ▶  
  • 문자타입을 날짜타입으로 변경 : object → date로 바꾸기 : 날짜별로 댓글 분류groupby하기 쉽도록
  • 연/월로 분리 : year 컬럼 추가하기
yt_filtered.info() #date가 object라 날짜추출이 어려우니 날짜로 바꿔보기

yt_filtered['date'] = pd.to_datetime(yt_filtered['date'])

yt_filtered['year'] = yt_filtered['date'].dt.year #date중에 연으로 되어있는거 바로 추출, ytfiltered에 새컬럼으로 넣어두기

# 월별로 댓글 수 확인하기 - groupby 사용
yt_filtered.groupby('month')['text'].count() #month별로 text컬럼에 있는것만 카운트

 

[이탈/전환 패턴 분석]

1. 이탈 키워드

- 이탈/전환 패턴을 분석하고 싶거나 리스트업하고 싶을 때 활용

#특정 단어가 들어가면 이탈한 것으로 생각하게 필터링하는 이탈키워드
#이탈/전환 패턴 분석

churn_keywords = '옮겼|갔다|넘어|바꿨|관뒀|갈아탔'

#text clean 문자에 churnkeywords가 포함되어있다면 변수에 넣어라
df_churn = yt_filtered[yt_filtered['text_clean'].str.contains(churn_keywords, na=False)] 
df_churn

* text clean 안보이는거 csv로 저장해서 볼 수 있음~

df_churn.to_csv('youtube_churn.csv', encoding='utf-8-sig')

 

[감성분류]

  • 키워드 지정 후 컬럼 추가
  • loc 사용해서 컬럼에 값 지정
  • 컬럼 값 보고 text clean 크로스체크하기
  • 두가지 키워드가 공존하면 부정으로 찍힐 수 있음 → 나중엔 머신러닝으로 처리함
    - 부정키워드를 마지막에 입력해서 부정으로 인식됨
positive_kw = '좋아|최고|추천|편리|개꿀|짱'
negative_kw = '불편|별로|극혐|짜증|없는|막혀|관뒀'

yt_filtered['sentiment'] = '중립'

yt_filtered.loc[yt_filtered['text_clean'].str.contains(positive_kw, na=False), 'sentiment'] = '긍정'
yt_filtered.loc[yt_filtered['text_clean'].str.contains(negative_kw, na=False), 'sentiment'] = '부정'

 

  • yt_filtered['sentiment'].unique()  #yt filtered의 sentiment안의 고유값 알고싶을 때 unique!


[MCP]

  • uv/uvx : python 실행 환경 관리로 MCP 서버를 실행하는 런처
  • claude desktop : mcp host 앱
  • mcp서버(mysql) : 외부 db 연결 브릿지 - 자연어 → sql 번역기
더보기
※ 기존 방식MCP + Claude 방식 차이

 

1. 마케터가 궁금한 것이 생김 1. 마케터가 궁금한 것이 생김
2. 데이터팀에 슬랙/지라로 요청 2. Claude에게 자연어로 바로 질문
3. 2~5일 대기 (다른 업무 우선순위) 3. 30초~2분 내 결과 + 인사이트
4. 결과물 받음 → 맥락이 이미 사라짐 4. 바로 드릴다운 추가 질문
5. 추가 드릴다운 필요 → 다시 요청 5. 실시간 가설 검증 가능
6. 의사결정 지연, 기회비용 발생 6. 즉각적인 의사결정 가능

 

[프롬프트 엔지니어링]

  • AI에게 원하는 결과를 정확하게 얻기 위한 입력(질문/지식)을 설계하는 기술
  • 4가지 핵심 구성 요소 : 역할 / 맥락 / 작업 / 형식

[MCP 연동하기]

1. uv, uvx 설치 : 관리자 명령프롬프트에 명령 입력 및 version 설치 확인

2. db변환 : 디비버 - sqlite 생성 후 데이터 내보내기

3. 클로드 다운로드 및 개발자 구성편집 : claude_desktop_config.json 메모장으로 열고 설정파일&beatwave경로 복사해서 저장

sqlite 생성

데이터내보내기

생성한 sqlite 선택

proceed

 

더보기

와 mcp연동해서 클로드로 말하는거 조금 충격인데

엄청 많은 db를 이러쿵저러쿵 생각생각생각대로 뽑을 수 있겠네 와 좋다

클로드한테 그냥 물어봤는데 나온다 개쩐다