[내배캠] 데이터분석 6기/본캠프 기록

[본캠프 68일차] 데이터 수집

물맨두 2025. 5. 26. 23:21

 

오늘 최종 프로젝트 팀원 신청서를 제출했다. 흐아. 사실 기초 프로젝트가 끝날 무렵부터 막연히 '최종 프로젝트는 프로젝트를 하면서 만난 마음 맞는 사람들끼리 조를 꾸려서 하고 싶다'고 생각했고 심화 프로젝트를 할 때부터는 최종 프로젝트 팀을 어떻게 짜야 할지 고민이 항상 마음 한켠에 있었는데, 이번 달 초에 일찍이 좋은 분들이랑 팀을 꾸리게 돼서 너무 기쁘다. 진짜 잘해야지.

 

오늘 한 일은,

  • 데이터 수집 공부하기
  • 프로덕트 데이터분석 1회차 수강하기

 

데이터 수집 공부: 1~4회차 실습 과제 풀기

주말 동안 착실히 휴식만을 취했다고 한다.. 얼른 실습 풀러 가자!

1회차 - API를 활용한 데이터 수집

[과제 1] 네이버 트렌드 API를 활용한 데이터 수집

우선 검색어로 최근 갈까말까 고민 중인 '서울국제도서전'을 중심으로 함께 검색할 검색어들을 정해보기로 했다. 검색어의 트렌드를 분석하는 일은 작년에 마케팅팀에서 월별 캠페인을 기획할 때 많이 참고했다. 네이버 데이터랩이나 구글 트렌드, 블랙키위, 썸트렌드 등에서 이런 시기에 따른 검색어 추이를 확인해 다음달 캠페인 아이템을 발굴할 때 지금 이 소재가 적절한지를 판단하는 데 사용했다.

 

검색어 트렌드를 분석하는 데도 목적이 다양하다.

  • 해당 검색어의 관심도 추이를 파악하기 위해서
  • 비슷한 여러 검색어들을 비교하여 어떤 검색어가 통용되는지 파악하기 위해서
  • 특정한 시기에 해당 키워드의 검색량이 폭증하는 경향을 파악하기 위해서 등

연령별로도 파악하기 위해서도 볼 수 있다. 어떤 연령층이 해당 키워드에 반응하는지, 같은 것에 대해서 연령별로 반응하는 키워드가 어떻게 다른지 등을 파악할 수도 있다.

 

 

아무튼, 나는 '서울국제도서전'을 분석의 중심 키워드로 설정하고, '국제도서전', '2024 서울국제도서전', '책 전시회', '출판' 이렇게 총 5개의 검색어에 대한 트렌드를 보기로 했다.

# 검색어 '서울국제도서전'의 최근 1년간 주간 검색 트렌드 데이터 수집하기

# 라이브러리 열기
import requests
import json
from datetime import datetime, timedelta

# 기간 설정: 최근 1년간
end_date = datetime.today()
start_date = end_date - timedelta(weeks=52)
start_date_str = start_date.strftime("%Y-%m-%d")
end_date_str = end_date.strftime("%Y-%m-%d")

# API 기본 URL
base_url = "https://openapi.naver.com/v1/datalab/search"
# API 요청 헤더 설정
headers = {
    "X-Naver-Client-Id" : client_id,
    "X-Naver-Client-Secret" : client_secret,
    "Content-Type" : "application/json"
}

# 검색어 그룹 정의
data = {
    "startDate" : start_date_str,
    "endDate" : end_date_str,
    "timeUnit" : "week",
    "keywordGroups" : [
        {"groupName": "서울국제도서전", "keywords": ["서울국제도서전"]},
        {"groupName": "국제도서전", "keywords": ["국제도서전"]},
        {"groupName": "2024 서울국제도서전", "keywords": ["2024 서울국제도서전"]},
        {"groupName": "책 전시회", "keywords": ["책 전시회"]},
        {"groupName": "출판", "keywords": ["출판"]}
    ]
}

# POST 요청
response = requests.post(base_url, headers=headers, data=json.dumps(data))

# 결과 저장
if response.status_code == 200:
    result = response.json()
    with open("SeoulInternationalBookFair_trends.json", "w", encoding="utf-8") as f:
        json.dump(result, f, ensure_ascii=False, indent=4)
        print("✅ JSON 저장 완료: naver_bookfair_trends.json")
else:
    print("❌ 오류 발생:", response.status_code)
    print(response.text)

250526 한 4번의 시도 끝에 드디어 저장된 json 파일

 

# JSON 파일 불러와서 데이터 분석하기

# 라이브러리 열기
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
import matplotlib.dates as mdates
# 한글 서체 설정하기
plt.rcParams['font.family'] = 'AppleGothic'
plt.rcParams['axes.unicode_minus'] = False     # 마이너스 부호 깨짐 방지

# JSON 파일 불러오기
with open ("SeoulInternationalBookFair_trends.json", "r", encoding="utf-8") as f:
    data = json.load(f)

df_all = pd.DataFrame()
for group in data['results']:
    keyword = group['title']
    df = pd.DataFrame(group['data'])
    df['keyword'] = keyword
    df_all = pd.concat([df_all, df], ignore_index=True)
# 날짜 타입 변환
df_all['period'] = pd.to_datetime(df_all['period'])
print(f"데이터 형태: {df_all.shape}")
print("\ndf_all 확인하기:")
print(df_all.head())

json 파일을 데이터프레임에 담아서 확인하니 기간, 비율, 검색어가 담겨있는 모습을 확인해봤다.

 

# 선 그래프로 검색어 트렌드 시각화하기
plt.figure(figsize=(16,6))
for keyword in df_all['keyword'].unique():
    sub_df = df_all[df_all['keyword'] == keyword]
    plt.plot(sub_df['period'], sub_df['ratio'], label=keyword, marker='o')
# x축을 주 단위로 표시
plt.gca().xaxis.set_major_locator(mdates.WeekdayLocator(byweekday=mdates.MO, interval=1))  # 매주 월요일
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))
plt.xticks(rotation=45)
# 제목 날짜 자동 추출
start_date = df_all['period'].min().strftime("%Y-%m-%d")
end_date = df_all['period'].max().strftime("%Y-%m-%d")
plt.title(f"검색어별 검색량 추이 (기간: {start_date} ~ {end_date})")
plt.xlabel("날짜")
plt.ylabel("검색 비율")
plt.legend()
plt.grid(True)
plt.tight_layout()
plt.show()

"서울국제도서전"을 포함한 5개의 검색어들의 최근 1년간 검색어 추이를 선 그래프로 시각화해봤다.

# 키워드별 최대 검색량 시점
max_search_times = (
    df_all.loc[df_all.groupby("keyword")["ratio"].idxmax()]
    .sort_values("keyword")[["keyword", "period", "ratio"]]
)

print("키워드별 최대 검색량 기록 시점:")
print(max_search_times)

그리고 각 검색어의 최대 검색량을 기록한 시기 역시 알아보았다.

 

[과제 2] 카카오맵 API를 활용한 할리스 카페 위치 정보 수집