API의 개념과 API 데이터 수집
데이터를 획득할 수 있는 채널
구분 | API | CSV | DB Connect |
데이터 교환 방식 | 서버 간 요청/응답을 통해 데이터 주고받음 | 파일을 저장하고 읽어서 주고받음 | 데이터베이스에 직접 연결하여 조회 및 수정 |
데이터 형식 | JSON, XML 등 | 텍스트 파일 (CSV 형식) | 테이블 형태의 구조화된 데이터 |
실시간성 | O (실시간 데이터 요청 가능) | X (파일을 갱신해야 최신 데이터 반영) | O (DB에 직접 연결하여 실시간 조회 가능) |
자동화 및 연동 | O (시스템 간 연동 가능) | O (스크립트로 자동화 가능) | O (DB 연동을 통한 자동화 가능) |
데이터 처리방식 | API 요청 후 응답 받아 처리 | 파일을 읽고 분석하여 처리 | SQL 쿼리로 직접 처리 |
※ RESTful - API를 사용하기 위하게 해주는 도구
API ( Application Programming Interface) 란?
- 애플리케이션 간의 데이터를 주고받고 기능을 호출할 수 있도록 하는 인터페이스이다.
< API 서버 예시 1 >
1. MariaDB에서 테이블 생성
growth_marketing 테이블
CREATE TABLE IF NOT EXISTS growth_marketing (
id INT AUTO_INCREMENT PRIMARY KEY,
date DATE NOT NULL,
channel VARCHAR(50) NOT NULL,
campaign VARCHAR(100) NOT NULL,
impressions INT NOT NULL,
clicks INT NOT NULL,
conversions INT NOT NULL,
conversion_rate FLOAT NOT NULL,
revenue FLOAT NOT NULL,
cost FLOAT NOT NULL,
roi FLOAT GENERATED ALWAYS AS (revenue - cost) STORED
);
initial data
INSERT INTO growth_marketing (date, channel, campaign, impressions, clicks, conversions, conversion_rate, revenue, cost)
VALUES ('2024-01-01', 'Google Ads', 'Winter Sale', 84854, 9444, 1576, 16.69, 37754, 940);
INSERT INTO growth_marketing (date, channel, campaign, impressions, clicks, conversions, conversion_rate, revenue, cost)
VALUES ('2024-01-02', 'Facebook Ads', 'Spring Collection', 85901, 4432, 1578, 35.6, 19412, 1125);
INSERT INTO growth_marketing (date, channel, campaign, impressions, clicks, conversions, conversion_rate, revenue, cost)
VALUES ('2024-01-03', 'Instagram Ads', 'Summer Discounts', 77334, 372, 1949, 523.92, 37939, 9861);
INSERT INTO growth_marketing (date, channel, campaign, impressions, clicks, conversions, conversion_rate, revenue, cost)
VALUES ('2024-01-04', 'LinkedIn Ads', 'Holiday Special', 58947, 9007, 1740, 19.32, 18461, 13386);
INSERT INTO growth_marketing (date, channel, campaign, impressions, clicks, conversions, conversion_rate, revenue, cost)
VALUES ('2024-01-05', 'Twitter Ads', 'Back to School', 60810, 7346, 1115, 15.18, 26400, 18730);
INSERT INTO growth_marketing (date, channel, campaign, impressions, clicks, conversions, conversion_rate, revenue, cost)
VALUES ('2024-01-06', 'TikTok Ads', 'Tech Promo', 91915, 477, 959, 201.05, 22417, 8129);
INSERT INTO growth_marketing (date, channel, campaign, impressions, clicks, conversions, conversion_rate, revenue, cost)
VALUES ('2024-01-07', 'Pinterest Ads', 'New Year Promo', 12969, 7212, 599, 8.31, 21600, 2235);
INSERT INTO growth_marketing (date, channel, campaign, impressions, clicks, conversions, conversion_rate, revenue, cost)
VALUES ('2024-01-08', 'Snapchat Ads', 'Viral Marketing', 27767, 6943, 1225, 17.64, 11047, 14601);
INSERT INTO growth_marketing (date, channel, campaign, impressions, clicks, conversions, conversion_rate, revenue, cost)
VALUES ('2024-01-09', 'Bing Ads', 'B2B Outreach', 77616, 7480, 215, 2.87, 36157, 9679);
INSERT INTO growth_marketing (date, channel, campaign, impressions, clicks, conversions, conversion_rate, revenue, cost)
VALUES ('2024-01-10', 'YouTube Ads', 'Influencer Marketing', 22000, 1800, 240, 13.3, 8000, 3200);
새 연습폴더 lab11(상위폴더) - site1(하위폴더)만들고 권한 부여하기
growth_marketing 테이블을 만들고 데이터값 코드를 넣어준다.
app.py
from flask import Flask, jsonify, request
import mysql.connector
app = Flask(__name__)
# MariaDB 연결 설정
db_config = {
"host": "localhost",
"user": "gabkeun",
"password": "1234",
"database": "backend"
}
# 데이터베이스 연결 함수
def get_db_connection():
return mysql.connector.connect(**db_config)
# API: 모든 마케팅 데이터 조회
@app.route('/growth-marketing', methods=['GET']) #각 페이지로 이동하는 이동명령
def get_growth_marketing_data():
conn = get_db_connection()
cursor = conn.cursor(dictionary=True)
cursor.execute("SELECT * FROM growth_marketing")
data = cursor.fetchall()
cursor.close()
conn.close()
return jsonify(data)
# API: 특정 마케팅 채널 데이터 조회
@app.route('/growth-marketing/<channel>', methods=['GET'])
def get_marketing_by_channel(channel):
conn = get_db_connection()
cursor = conn.cursor(dictionary=True)
cursor.execute("SELECT * FROM growth_marketing WHERE channel = %s", (channel,))
data = cursor.fetchall()
cursor.close()
conn.close()
if not data:
return jsonify({"error": "해당 마케팅 채널의 데이터가 없습니다."}), 404
return jsonify(data)
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5001, debug=True)
2. app.py 파일을 만들고 파일질라를 실행하여 아까 만들어 두었던 site1 폴더에 넣기
3. 그 다음 다시 터미널로 가서 python3 app.py로 app.py 파일 실행.
4. http:// 외부IP주소:포트번호/growth-marketing으로 들어가면 JSON 형식으로 출력된 것을 볼 수 있음.
http:// 외부IP주소:포트번호/growth-marketing/google ads 로 들어갔을때 출력되는 값 확인
< API 서버 예시 2 >
웹형식으로 출력하기 위해 flask에 웹페이지를 추가
templates/index.html
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>그로스 마케팅 데이터</title>
<link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
<script>
async function fetchData() {
const response = await fetch('/growth-marketing');
const data = await response.json();
const tableBody = document.getElementById("data-table-body");
tableBody.innerHTML = "";
data.forEach(item => {
let row = `<tr>
<td>${item.date}</td>
<td>${item.channel}</td>
<td>${item.campaign}</td>
<td>${item.impressions}</td>
<td>${item.clicks}</td>
<td>${item.conversions}</td>
<td>${item.conversion_rate}%</td>
<td>${item.revenue}</td>
<td>${item.cost}</td>
<td>${item.roi}</td>
</tr>`;
tableBody.innerHTML += row;
});
}
window.onload = fetchData;
</script>
</head>
<body>
<h1>그로스 마케팅 데이터</h1>
<table>
<thead>
<tr>
<th>날짜</th>
<th>채널</th>
<th>캠페인</th>
<th>노출수</th>
<th>클릭수</th>
<th>전환수</th>
<th>전환율</th>
<th>매출</th>
<th>비용</th>
<th>ROI</th>
</tr>
</thead>
<tbody id="data-table-body"></tbody>
</table>
</body>
</html>
static/style.css
body {
font-family: Arial, sans-serif;
text-align: center;
margin: 20px;
}
h1 {
color: #333;
}
table {
width: 90%;
margin: 20px auto;
border-collapse: collapse;
}
th, td {
border: 1px solid #ddd;
padding: 10px;
text-align: center;
}
th {
background-color: #f4f4f4;
font-weight: bold;
}
tr:nth-child(even) {
background-color: #f9f9f9;
}
tr:hover {
background-color: #e2e2e2;
}
app.py - Flask 에서 HTML 파일을 렌더링하는 코드
from flask import Flask, render_template, jsonify
import mysql.connector
app = Flask(__name__)
# MariaDB 연결 설정
db_config = {
"host": "localhost",
"user": "gabkeun",
"password": "1234",
"database": "backend"
}
# 데이터베이스 연결 함수
def get_db_connection():
return mysql.connector.connect(**db_config)
# API: 모든 마케팅 데이터 조회
@app.route('/growth-marketing', methods=['GET'])
def get_growth_marketing_data():
conn = get_db_connection()
cursor = conn.cursor(dictionary=True)
cursor.execute("SELECT * FROM growth_marketing")
data = cursor.fetchall()
cursor.close()
conn.close()
return jsonify(data)
# 웹 페이지 렌더링
@app.route('/')
def index():
return render_template('index.html')
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5001, debug=True)
1. 파일생성하여 파일질라에서 업로드
상기 코드로 app.py, index.html, style.css 파일을 만든다.
터미널에서 site2 폴더를 생성하고 하위폴더로 app.py, templates, static 폴더를 만들고 권한을 부여한다.
파일질라에서 위 그림과 맞게 폴더에 파일들을 옮겨준다. site2폴더(상위폴더)에 app.py를 , templates 폴더에 index.html 을, static폴더에 style.css 파일을 넣어준다.
2. 터미널에서 python3 app.py로 파일 실행.
3. HTTP:// 외부IP주소:포트번호 입력하여 웹 인터페이스 형식으로 출력이 잘 되는지 확인.
※ 각각의 역할 담당
HTML > 웹 페이지의 구조(Structure) 만들기
CSS > HTML로 만든 웹 페이지의 스타일(Style) 만들기
JS > 받은 데이터를 뿌려줌. 동적기능수행 (동작)
※ API 데이터 수집으로는 Google Analytics를 가장 많이 씀.
Google Analytics의 주요 데이터 분석 항목과 내용
☆ 컬럼이 눈에 익어야 하고, 컬럼을 잘 뽑을 줄 알아야 한다.
1. 사용자 행동분석
분석항목 | 설명 |
Sessions (세션 수) | 사용자가 사이트를 방문한 횟수. 세션은 30분 동안 활동이 없으면 종료됨. |
Users (사용자 수) | 특정 기간 동안 웹사이트를 방문한 고유 사용자 수. |
New Users (신규 사용자 수) | 처음 방문한 사용자 수. |
Pageviews (페이지뷰 수) | 웹사이트에서 조회된 페이지의 총 수. |
Pages per Session (세션당 페이지뷰) | 방문자가 한 세션 동안 조회한 평균 페이지 수. |
분석 결론에 대한 예시
지표 | 높은 경우 | 낮은 경우 | 개선 방법 |
세션 수 증가 | 방문자 증가 | 방문자 감소 | SEO, 광고 최적화 |
페이지뷰 증가 | 콘텐츠 탐색 활발 | 콘텐츠 소비 적음 | 관련 콘텐츠 추천, UX 개선 |
신규 사용자 비율 높음 | 새로운 방문자 유입 많음 | 재방문자 위주 | 충성 고객 유지 전략 필요 |
세션당 페이지뷰 높음 | 콘텐츠 연계성 높음 | 한 페이지만 보고 이탈 | 내부 링크 최적화, UX 개선 |
2. 트래픽 소스 분석
- 사용자가 웹사이트에 어떻게 유입되었는지 분석
분석항목 | 설 |
Traffic Source (트래픽 소스) | 사용자가 웹사이트에 들어온 경로(Google, Facebook, Naver, Direct 등). |
Referral (추천 트래픽) | 다른 웹사이트에서 링크를 통해 들어온 방문자 수. |
Organic Search (유기적 검색 트래픽) | Google, Bing 등 검색엔진에서 검색을 통해 유입된 방문자 수. |
Direct (직접 트래픽) | URL을 직접 입력하거나 북마크를 통해 방문한 사용자 수. |
Social (소셜 트래픽) | Facebook, Twitter, Instagram 등 소셜 미디어에서 유입된 사용자 수. |
Paid Search (유료 검색 트래픽) | Google Ads 등 광고를 통해 유입된 방문자 수. |
분석 결과에 대한 개선방향 예시
지표 | 상태 (예시) | 개선 방향 |
Organic Search (유기적 검색) 방문자 수 및 전환율 | 방문자 수 가장 많음, 전환율도 높음(4.05%) | SEO 최적화 유지 및 콘텐츠 강화 |
Paid Search (유료 검색) 방문자 수 및 전환율 | 방문자 수 적지만 전환율 가장 높음(4.75%) | 광고 성과 분석 후 예산 최적화 |
Direct (직접 트래픽) 방문자 수 및 전환율 | 방문자 수 많음, 전환율도 높은 편(3.15%) | 브랜드 인지도 및 충성 고객 관리 강화 |
Referral (추천 트래픽) 방문자 수 및 전환율 | 방문자 수 적고 전환율 낮음(1.75%) | 제휴 마케팅 강화 및 랜딩 페이지 최적화 |
Social (소셜 트래픽) 방문자 수 및 전환율 | 방문자 수 일정하지만 전환율 낮음(2.35%) | SNS 마케팅 전략 개선 및 CTA 최적화 |
3. 전환(Conversion)분석
- 사용자가 특정 목표 (구매, 회원가입, 문의 등)를 달성하는지를 분석.
분석항목 | 설명 |
Conversion Rate (전환율) | 특정 목표를 달성한 세션의 비율(전환 수 / 방문 수 × 100). |
Goal Completions (목표 달성 수) | 사용자가 설정된 목표(예: 결제 완료, 회원가입)를 완료한 횟수. |
E-commerce Transactions (전자상거래 트랜잭션 수) | 구매가 완료된 주문 수. |
Revenue (매출) | 전자상거래 사이트에서 발생한 총 매출. |
Cart Abandonment Rate (장바구니 이탈율) | 장바구니에 상품을 담았지만 결제를 완료하지 않은 비율. |
분석 결과에 대한 개선방향 예시
지표 | 상태 (예시) | 개선방향 |
Organic Search (유기적 검색) 방문자 수 및 전환율 | 방문자 수 가장 많음, 전환율도 높음(4.05%) | SEO 최적화 유지 및 콘텐츠 강화 |
Paid Search (유료 검색) 방문자 수 및 전환율 | 방문자 수 적지만 전환율 가장 높음(4.75%) | 광고 성과 분석 후 예산 최적화 |
Direct (직접 트래픽) 방문자 수 및 전환율 | 방문자 수 많음, 전환율도 높은 편(3.15%) | 브랜드 인지도 및 충성 고객 관리 강화 |
Referral (추천 트래픽) 방문자 수 및 전환율 | 방문자 수 적고 전환율 낮음(1.75%) | 제휴 마케팅 강화 및 랜딩 페이지 최적화 |
Social (소셜 트래픽) 방문자 수 및 전환율 | 방문자 수 일정하지만 전환율 낮음(2.35%) | SNS 마케팅 전략 개선 및 CTA 최적화 |
4. 사용자 행동 흐름 분석
- 사용자가 웹사이트에서 어떻게 이동하는지 분석
분석 항목 | 설명 |
Landing Page (랜딩 페이지) | 사용자가 처음 방문한 페이지. |
Exit Page (종료 페이지) | 사용자가 사이트를 떠난 마지막 페이지. |
Bounce Rate (이탈률) | 한 페이지만 보고 사이트를 떠난 방문자의 비율. |
Average Session Duration (평균 세션 지속 시간) | 방문자가 웹사이트에서 머문 평균 시간. |
지표 예시와 개선방향 예시
지표 (예시) | 상태 (예시) | 개선 방향 |
Blog 페이지 이탈률 | 가장 높은 이탈률 (52.82%) | 콘텐츠 품질 개선 및 관련 링크 추가 |
Product Page 이탈률 | 높은 이탈률 (49.90%) | 제품 정보 강화 및 CTA(Call-To-Action) 최적화 |
평균 세션 지속 시간 | 217.33초 | 사용자 인터랙션을 유도하는 콘텐츠 추가 |
Pricing 페이지 이탈률 | 가장 낮은 이탈률 (40.13%) | 가격 페이지에서 다른 페이지로 이동 유도 |
5. 장치 및 지역 분석
- 사용자가 어떤 기기와 위치에서 웹사이트를 이용하는지 분석
분석항목 | 설명 |
Device Category (기기 유형) | 데스크톱, 모바일, 태블릿 등 방문자가 사용한 기기 유형. |
Operating System (운영 체제) | 방문자가 사용한 OS(Android, iOS, Windows 등). |
Geolocation (위치 정보) | 방문자의 국가 및 지역. |
Language (언어 설정) | 방문자의 브라우저 언어. |
지표 예시와 개선 방향 예시
지표 (예시) | 상태 (예시) | 개선방향 |
모바일 사용 비율 | 모바일과 데스크톱 사용 비율 동일 (각 12명) | 모바일 최적화 UI/UX 개선 필요 |
운영 체제 비율 | iOS 사용자가 가장 많음 (12명) | iOS 기기 대응 UX 최적화 필요 |
지역별 방문 | 여러 국가에서 균등한 방문 | 국가별 맞춤형 마케팅 전략 필요 |
언어별 방문 | 5개 언어에서 동일한 방문 수 | 다국어 지원 및 콘텐츠 최적화 필요 |
6. from Meta (Facebook)의 데이터 주요 분석 항목
6-1. Meta 광고 성과 분석
분석 항목
|
설명
|
Impressions (노출 수)
|
광고가 사용자에게 표시된 총 횟수.
|
Reach (도달 수)
|
광고를 본 고유 사용자 수.
|
CTR (클릭률, Click-Through Rate)
|
광고를 클릭한 비율(클릭 수 / 노출 수 × 100).
|
CPC (클릭당 비용, Cost Per Click)
|
한 번의 클릭을 얻기 위해 지출한 평균 비용.
|
CPM (1000회 노출당 비용, Cost Per Mille)
|
광고가 1000번 노출될 때의 평균 비용.
|
Ad Frequency (광고 빈도)
|
사용자가 같은 광고를 평균적으로 본 횟수.
|
Engagement (참여도)
|
광고 클릭, 좋아요, 댓글, 공유 등을 포함한 총 사용자 활동 수.
|
6-2. 전환(Conversion) 분석
분석 항목
|
설명
|
Conversion Rate (전환율)
|
광고를 본 후 특정 목표를 완료한 비율(전환 수 / 클릭 수 × 100).
|
Leads (리드 수)
|
광고를 통해 수집된 연락처(예: 이메일 가입, 문의 양식 제출).
|
Purchases (구매 수)
|
광고를 통해 유입된 사용자가 실제로 상품을 구매한 횟수.
|
ROAS (광고비 대비 매출, Return on Ad Spend)
|
광고 비용 대비 발생한 총 매출(매출 / 광고비).
|
Add to Cart (장바구니 추가 수)
|
사용자가 제품을 장바구니에 추가한 횟수.
|
6-3. 타겟팅 및 오디언스 분석
- 광고를 본 사용자의 특성 분석
분석 항목 | 설명 |
Demographics (연령/성별 분석) | 광고를 본 사용자의 연령대 및 성별. |
Location (지역 분석) | 광고가 노출된 사용자의 국가 및 도시. |
Device Type (기기 유형 분석) | 광고를 본 사용자의 기기 유형(모바일, 데스크톱, 태블릿 등). |
Interests (관심사 분석) | 광고 대상 그룹이 관심을 보이는 주요 주제(예: 스포츠, 여행, 금융 등). |
6-4. 페이지 및 콘텐츠 성과 분석
- facebook 페이지의 콘텐츠 성과를 분석
분석 항목
|
설명
|
Page Likes (페이지 좋아요 수)
|
특정 기간 동안 페이지를 좋아요한 사용자 수.
|
Post Engagement (게시물 참여도)
|
게시물에 대한 좋아요, 댓글, 공유 등의 총 수.
|
Video Views (동영상 조회 수)
|
3초 이상 재생된 동영상의 조회 수.
|
Avg Watch Time (평균 시청 시간)
|
동영상 콘텐츠의 평균 시청 시간.
|
Post Reach (게시물 도달 수)
|
게시물을 본 고유 사용자 수.
|
6-5. 메시징 및 커뮤니케이션 분석
- Facebook Messenger 및 댓글을 통한 사용자와의 상호작용 분석
분석 항목
|
설명
|
Messages Sent (보낸 메시지 수)
|
페이지에서 고객에게 보낸 메시지 수.
|
Messages Received (받은 메시지 수)
|
사용자가 페이지에 보낸 메시지 수.
|
Response Time (응답 시간)
|
메시지에 대한 평균 응답 시간.
|
Comment Sentiment (댓글 감성 분석)
|
댓글에서 긍정적, 중립적, 부정적 감성의 비율.
|
보고서 작성 실습
- 주어진 데이터를 분석하여 보고서로 작성할 때는 분석결과를 일목요연하게 정리하고 개선 방향 및 종합 결론을 도출하고 최종 제안까지 제시할 수 있어야 한다. 보고서 작성 실습을 해보았는데 정말 쉽지 않았다.
오늘 회고
주어진 데이터를 분석하여 보고서를 작성해보는 연습을 했는데 정말 쉽지 않았다. 우선 주제별로 데이터를 분석할 때 대표적인 컬럼들이 눈에 잘 들어오지 않았다. 먼저 컬럼이 눈에 익어야 결과를 분석하는 것에도 수월할 것이다. 이를 위해서는 많은 데이터들을 접하고 연습해보고 하나하나 뜯어서 상관관계를 살펴보는 수 밖에 없다..ㅠ
특히나 분석에 대한 결과를 작성하는 것은 데이터만 보면 되는 일이었지만 최종제안까지 제시하는 게 정말로 어려웠다. 급하게 빨리 하려고 하니 일반적이고 형식적인 해결방안밖에 기억나지 않았다..
보고서를 쓰는게 마케터의 중대한 업무이고 데이터를 분석하는 목적은 결국 분석 결과를 타인이 보기쉬운 결과물로 보여주고 설득을 해야하는 것이니 보고서 쓰는 연습도 충분히 숙달될때까지 많이 해봐야 한다......