[Today I Learn]
📌 과제1. 네이버 트렌드 API 활용
1. 헤더 생성
- API 인증 정보(Client ID, Client Secret)를 변수에 저장
- 요청 헤더에 X-Naver-Client-Id, X-Naver-Client-Secret, Content-Type: application/json을 설정
2. 요청 본문 데이터 구성
- datetime.now()와 timedelta(days=365)를 사용해 현재 날짜 기준 1년 전까지의 기간을 자동 설정
- 분석할 키워드 그룹 4개를 리스트로 구성:
- 패션의류, 전자제품, 화장품뷰티, 식품구매
- 각 그룹에 관련 키워드를 여러 개 포함시킴
- timeUnit은 "week" (주간 단위)으로 설정
3. API 요청 실행
- requests.post()로 POST 요청 전송
- json.dumps(request_body)로 요청 본문을 JSON 문자열로 변환하여 전달
4. API 응답 저장 및 데이터 추출
- response.status_code == 200으로 성공 여부 확인
- 응답 JSON에서 results → title(카테고리명), data → period(날짜), ratio(검색 비율) 추출
- 딕셔너리로 정리 후 리스트에 append → pd.DataFrame으로 변환
💡 핵심 포인트
- 시계열 데이터는 반드시 pd.to_datetime()을 거쳐야 함
- 문자열 상태로 두면 matplotlib이 시간 축 간격을 논리적으로 배치하지 못함
- pd.json_normalize도 공부해볼 것
- 지금은 반복문으로 처리했지만, 실무에서 JSON 구조가 복잡해지면 중첩 구조를 한번에 펼쳐주는 pd.json_normalize가 훨씬 유용함
5. 시각화
- sns.lineplot()으로 카테고리별 검색 트렌드 시각화
- ax.set_xticks(df['date'].unique())로 모든 날짜를 눈금으로 지정
- plt.xticks(rotation=45), plt.grid(True, alpha=0.5), plt.tight_layout() 등으로 가독성 향상
과제2. 카카오맵 API - 할리스 카페 지오코딩
- 카카오 로컬 API(주소 검색)를 활용하여 할리스 카페 매장 주소 → 위도/경도 좌표 변환
- 헤더: "Authorization": f"KakaoAK {API_KEY}" / 엔드포인트: https://dapi.kakao.com/v2/local/search/address.json
- 💡 카카오맵 API 사용 시 카카오 개발자 사이트에서 카카오맵 권한도 별도로 ON 해줘야 함
데이터 전처리 (정규표현식)
- re.sub(r'\\(.*\\)', '', address) → 괄호 안 내용 제거 (e.g. (대방동))
- \\d+층.*, \\d+~+\\d+층.*, \\d+호.*, 지하.*층.* → 층/호 등 상세주소 패턴 제거
- API에 깔끔한 주소만 넘겨야 정확한 결과를 받을 수 있음
DataFrame 변환 & 합치기
- .apply(geocode_address).apply(pd.Series) → dict 반환값을 열(column)로 펼쳐서 DataFrame 변환
- pd.concat([address_df, lat_lng_df], axis=1) → 좌우 합체
🚨 concat vs merge 핵심 정리
- merge: 특정 키 기준 매칭 → 키가 조금이라도 다르면 합쳐지지 않음
- concat: 인덱스 순서 기반으로 단순 결합 → 빠르고 간결
- axis=0: 위아래로 쌓기 / axis=1: 옆으로 붙이기
🚨 concat 사용 시 주의점
- axis=1 → 두 DataFrame의 인덱스가 다르면 NaN 발생 → 합치기 전 reset_index() 필수
- axis=0 → 인덱스 꼬일 수 있으므로 ignore_index=True 습관화
지도 시각화 (folium)
- 위도/경도 평균값으로 지도 중심 설정
- NaN인 행은 제거 후 시각화
- MarkerCluster로 매장 위치 표시, 클릭 시 매장명/주소/좌표 정보 표시
'[데이터분석] 부트캠프 TIL' 카테고리의 다른 글
| 20260320 TIL (1) | 2026.03.20 |
|---|---|
| 20260318 TIL (0) | 2026.03.18 |
| 20260316 TIL (1) | 2026.03.16 |
| 20260313 TIL (0) | 2026.03.13 |
| 20260312 TIL (0) | 2026.03.12 |