문제 : 

'경제' 카테고리에 속하는 도서들의 도서 ID(BOOK_ID), 저자명(AUTHOR_NAME), 출판일(PUBLISHED_DATE) 리스트를 출력하는 SQL문을 작성해주세요.
결과는 출판일을 기준으로 오름차순 정렬해주세요.

 

해결 방식 : 

-- LEFT JOIN 
-- 경제 카테고리에 속하는 도서 >> CATEGORY = '경제'
-- 도서 ID(BOOK_ID), 저자명(AUTHOR_NAME), 출판일(PUBLISHED_DATE)
-- 결과는 출판일 기준으로 오름차순 정렬 >> PUBLISHED_DATE ASC 

 

결과 : 정답

 

답안 : 

SELECT B.BOOK_ID, A.AUTHOR_NAME, DATE_FORMAT(B.PUBLISHED_DATE, '%Y-%m-%d')
FROM BOOK B LEFT JOIN AUTHOR A ON A.AUTHOR_ID = B.AUTHOR_ID
WHERE B.CATEGORY = '경제'
ORDER BY B.PUBLISHED_DATE ASC

 

 

다른 풀이법 : 

DATE 함수 사용법

문제 :

다음은 어느 자동차 대여 회사에서 대여중인 자동차들의 정보를 담은 CAR_RENTAL_COMPANY_CAR 테이블입니다. CAR_RENTAL_COMPANY_CAR 테이블은 아래와 같은 구조로 되어있으며, CAR_ID, CAR_TYPE, DAILY_FEE, OPTIONS 는 각각 자동차 ID, 자동차 종류, 일일 대여 요금(원), 자동차 옵션 리스트를 나타냅니다.

Column nameTypeNullable
CAR_ID INTEGER FALSE
CAR_TYPE VARCHAR(255) FALSE
DAILY_FEE INTEGER FALSE
OPTIONS VARCHAR(255) FALSE

자동차 종류는 '세단', 'SUV', '승합차', '트럭', '리무진' 이 있습니다. 자동차 옵션 리스트는 콤마(',')로 구분된 키워드 리스트(옵션 리스트 값 예시: '열선시트', '스마트키', '주차감지센서')로 되어있으며, 키워드 종류는 '주차감지센서', '스마트키', '네비게이션', '통풍시트', '열선시트', '후방카메라', '가죽시트' 가 있습니다.


문제

CAR_RENTAL_COMPANY_CAR 테이블에서 '통풍시트', '열선시트', '가죽시트' 중 하나 이상의 옵션이 포함된 자동차가 자동차 종류 별로 몇 대인지 출력하는 SQL문을 작성해주세요. 이때 자동차 수에 대한 컬럼명은 CARS로 지정하고, 결과는 자동차 종류를 기준으로 오름차순 정렬해주세요.

 

해결 방식 : 

-- 통풍시트, 열선시트, 가죽시트 중 하나 이상 옵션 > IN >> LIKE 변
-- 자통차 종류 별로 몇 대 >> GROUP BY, COUNT 
-- 자동차 수에 대한 컬럼 CARS 
-- 종류를 기준으로 오름차순 ASC 

 

결과 :  틀림

 

답안 : 

SELECT CRCC.CAR_TYPE, COUNT(CRCC.CAR_ID) AS CARS
FROM CAR_RENTAL_COMPANY_CAR AS CRCC
WHERE CRCC.OPTIONS LIKE ('%통풍시트%') OR ('%열선시트%') OR ('%가죽시트%')
GROUP BY 1
ORDER BY 1 ASC

 

결과 : 

 

해설 :

(like [option]) or ([option]) or ([option])
(like [option]) or (like [option]) or (like [option])

 

like 함수 적용 범위

 

다른 풀이법 : 

LIKE 활용

SELECT CRCC.CAR_TYPE, COUNT(CRCC.CAR_ID) AS CARS
FROM CAR_RENTAL_COMPANY_CAR AS CRCC
WHERE CRCC.OPTIONS LIKE ('%통풍시트%') OR 
CRCC.OPTIONS LIKE ('%열선시트%') OR 
CRCC.OPTIONS LIKE ('%가죽시트%')
GROUP BY 1
ORDER BY 1 ASC

 

INSTR 활용 

SELECT CAR_TYPE, COUNT(*) CARS
FROM CAR_RENTAL_COMPANY_CAR
WHERE 
INSTR(OPTIONS, '통풍시트') > 0 OR
INSTR(OPTIONS, '열선시트') > 0 OR
INSTR(OPTIONS, '가죽시트') > 0 
GROUP BY CAR_TYPE
ORDER BY CAR_TYPE ASC

 

REGEXP 활용 

SELECT CAR_TYPE, COUNT(*) CARS
FROM CAR_RENTAL_COMPANY_CAR
WHERE 
OPTIONS REGEXP '통풍시트|열선시트|가죽시트'
GROUP BY CAR_TYPE
ORDER BY CAR_TYPE ASC

문제 : 

보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 09:00부터 19:59까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다

 

해결 방식 : 

 

결과 : 정답

 

답안 : 

SELECT hour(datetime), count(animal_id)
from ANIMAL_OUTS
where hour(datetime) between 9 and 19
group by 1
order by 1

 

다른 풀이법 : 

1교시

데이터 전처리

 

파이썬만으로 시각화는 불가능 시각화 툴인 판다스를 활용해야한다.  

데이터 처리, 가공에서는 판다스를 가장 많이 쓴다.

판다스에서 db에 저장하거나 가공해서 sql에서 사용 

#파일 불러오기 
import pandas as pd

kbo = pd.read_csv("./kbo_국내.csv")

kbo.shape

 

EDA(Exploratory Data Analysis / 탐색적 데이터 분석)

* 전처리 전 단계 (먼저 데이터를 파악하는 단계이다, 데이터가 싱싱한지 결측치 이상치 등을 파악)

 

이상치 / 결측치 파악

kbo.isnull().sum()

>> 특정 컬럼에 결측치가 많다면 바로 확인 필요

 

# 데이터 종류

양적데이터 : 숫자 (회사 지출비용, 순이익, 연봉 등)

질적데이터(범주형데이터) : 등급, 포지션 등 

       ㄴ 범주형 데이터 분류 : 1.순서가 없는 데이터(혈액형 등) 2.순서가 있는 데이터(등급, 고과 등)

 

데이터 타입에 따라서 적용할 수 있는 함수가 다르다. 

 

kbo.describe()

 

kbo['연봉']

>> 연봉이지만 데이터 타입이 텍스트(object) 로 되어 있다. >> 데이터 타입을 바꿔야함.

 

#'만원'을 우선 없애기
kbo['연봉'].apply(lambda x : x.replace("만원",""))

>> 다만 아직도 object 이다 >> int 로 변경할 필요가 있음

 

#int로 만들고 그걸 ['연봉']에 덮어서 변환 하겠다. 
kbo['연봉'] = kbo['연봉'].apply(lambda x : int(x.replace("만원","")))

 

kbo['연봉'].describe()

count = 연봉 갯수

mean = 평균

std = 표준편차

min = 최솟값

50% = 중앙값 (데이터 정렬 후 딱 중앙에 있는 사람을 뽑았을때) 

max = 최대값

 

* 박스 플롯 그리기 (설치 필요)

#프로그램 설치
import matplotlib.pyplot as plt

다만, 이뻐서 잘 안쓴다.

#맷플롯에서 추가 기능이 있는 프로그램
#초반에 맷플롯이 깔려 있지 않다면 오류
pip install seaborn

import seaborn as sns
sns.boxplot(data=kbo, x = '연봉')

 

#한글 폰트가 안 보인다면, 맥은 다른 방법으로 다운 필요
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'Malgun Gothic'
#sns.set_style("ggplot")
sns.boxplot(data=kbo, x = '연봉', y='team')
plt.show()

 

 

이상치(outlier)

 

a = kbo[kbo['team']=='상무']['연봉']
b = a.values
b_mean = b.mean()
b_mean
import numpy as np
np.sqrt(np.mean((b - b_mean) **2))

 

#자유도 0 / 1 은 다르다.
a.std(ddof=0)

 

help(a.std)

> 결과 

 

 

 

 

 

*띄어쓰기 없애기 

 

#띄어쓰기 없어짐
'상무 '.strip()
kbo['team'] = kbo['team'].apply(lambda x : x.strip())

 

 

* 팀이 상무인 선수만 추출

kbo[kbo['team']=='상무']

 

 

 

#연봉을 팀별로 보고 싶다. 
#시리즈 형태 
kbo.groupby(['team'])[['연봉']].mean()

 

 

* 데이터 솔팅

#데이터 프레임 형태, #특정 함수를 솔팅하고 싶다면 sort_values
kbo.groupby(['team'])[['연봉']].mean().sort_values(by=['연봉'], ascending=False)

 

 

#평균 말고 다른 것도 보고싶다. 여러개 보고 집계를 하고 싶어.
kbo.groupby(['team'])[['연봉']].agg(['mean','count','std','median'])

 

 

#포지션도 같이 보고싶어
kbo.groupby(['team','포지션'])[['연봉']].agg(['mean','count','std','median'])

 

 

 

#팀, 포지션 별로 연봉
kbo_agg = kbo.groupby(['team','포지션'])[['연봉']].mean().sort_values(by=['연봉'],ascending=False )

 

 

 

kbo_agg.index

 

 

 

#인덱스를 컬럼으로 하고 싶다면(인덱스에 있는 데이터가 컬럼으로 넘어왔따)
kbo_agg.reset_index()

 

 

#끝났다 싶으면 inplace
kbo_agg.reset_index(inplace=True)
#팀은 내림차순, 포지션은 오름차순
kbo_agg.sort_values(by=['team','포지션'], ascending = [False, True])

 

#문자열로 집어넣어, 숫자에 콤마를 찍어라!
kbo_agg2['연봉2'] = kbo_agg2['연봉'].apply(lambda x : "{:,}".format(round(x)))

 

#선수를 가장 많이 배출한 초등학교 구하기 
#- 기준으로 자르고 싶다.
kbo['경력'].str.split("-",expand=True)

 

 

 

학부 = kbo['경력'].str.split("-",expand=True)
#고등학교 까지만 보고싶어
#iloc> 번호 갖고 위치를 얘기한다. ,오른쪽은 행 / ,왼쪽은 컬럼 / :표시는 전체를 의미한다. / 3 치면 2까지 보여준다.
학부.iloc[ : , :3]

 

 

학부 = 학부.iloc[ : , :3].copy()
#컬럼에 이름 붙이기
학부.columns = ['초','중','고']

 

#각 값을 카운트 해줘 = value_counts()
학부['초'].value_counts()

 

#비율을 알고 싶다면
학부['초'].value_counts(normalize=True)

 

 

 

#컬럼명 바꾸기
학부.rename(columns={'초':'초등학교','중':'중학교','고':'고등학교'})

 

 

#이상이 없는것을 확있했다면 바로  적용 필요
학부.rename(columns={'초':'초등학교','중':'중학교','고':'고등학교'}, inplace=True)

 

#이름으로 적용된다. *숫자는 인덱스
학부.loc[ : , ['초등학교','중학교',]]

 

 

#행을 구분하자면 #이름이다.
학부.loc[ 0:2 , ['초등학교','중학교',]]

 

 

학부.iloc[ 0:2 ,[0,1]]

 

#concat 으로 데이터 합침, axis 1은 가로로, axis 0 은 세로로 붙인다 
pd.concat([kbo,학부],axis=1)

 

#전제조건 raw 값이 같아야해, 인덱스 같은 정보가 있어야해 
kbo2 =  pd.concat([kbo, 학부], axis=1)
#부산수영초 뽑기
kbo2[kbo2['초등학교'] == '부산수영초'].groupby(['team'])[['초등학교']].count().sort_values(by=['초등학교'],ascending=False)
#team 은 인덱스로 들어갔어

 

#인덱스를 컬럼으로 변경하고 싶을때 #(/는 다음 줄도 같은 행에 있다는 것을 알려주는 것
kbo2[kbo2['초등학교'] =='부산수영초'].groupby(\
    ['team'], as_index=False)[['초등학교']].count().sort_values(by=['초등학교'], ascending=False)

 

#수영초가 들어간 팀
a= kbo2[kbo2['초등학교'] =='부산수영초'].groupby(\
    ['team'], as_index=False)[['초등학교']].count().sort_values(by=['초등학교'], ascending=False)['team'].tolist()

b = kbo2.team.unique().tolist()

 

 

#a와 b 차 집합을 하면 수영초가 없는 팀이 나온다. 
set(b)- set(a)

 

 

#각 팀별로 연봉 많이 받는 사람 한명 확인
kbo2.sort_values(by=['연봉'], ascending=False).groupby(['team']).first()

 

#bmi가 높은 사람 뽑아보기
#기존 변수에서 새로운 변수 만들었음 >> 파생변수
#신장 파생변수 만들기
kbo2['신장'] = kbo2['신장/체중'].apply(lambda x : int(x.split("/")[0].replace("cm","")))
#bmi
kbo2['체중'] / (kbo2['신장']/100) **2
#체중 파생변수 만들기
kbo2['체중'] = kbo2['신장/체중'].apply(lambda x : int(x.split("/")[1].replace("kg","")))

 

kbo2['bmi'] = kbo2['체중'] / (kbo2['신장']/100) **2
#팀별로 bmi 가장 높은 사람 뽑아보기
kbo2.sort_values(by=['bmi'], ascending=False).groupby(['team']).first()

 

 

 

#axis = 1 은 컬럼이라는 뜻 #inplace를 해야 적용
kbo2.drop(['신장/체중','경력'], axis =1, inplace=True)

 

#컬럼 위치를 바꾸고 싶어 
kbo2.columns

> 칼럼을 먼저 뽑고 복사

 

kbo2 = kbo2[['team','선수명', '등번호', '생년월일', '포지션', '입단 계약금', '연봉', '지명순위', '입단년도',
     '초등학교', '중학교','고등학교', '신장', '체중', 'bmi']].copy()

 

kbo2[kbo2['team'] == 'KIA 타이거즈']

 

 

*바차트

kbo2[kbo2['team'] == 'KIA 타이거즈']['bmi'].plot(kind='bar')

 

 

sns.barplot(x = kbo2[kbo2['team'] == 'KIA 타이거즈']['선수명'], y =   kbo2[kbo2['team'] == 'KIA 타이거즈']['bmi'])

 

#그림을 키우고 싶다면? 
plt.figure(figsize=(20,5))
sns.barplot(x = kbo2[kbo2['team'] == 'KIA 타이거즈']['선수명'], y =   kbo2[kbo2['team'] == 'KIA 타이거즈']['bmi'])

 

#차트에다가 이름을 45도로 꺽어서 넣음
plt.figure(figsize=(20,5))
chart = sns.barplot(x = kbo2[kbo2['team'] == 'KIA 타이거즈']['선수명'], y =   kbo2[kbo2['team'] == 'KIA 타이거즈']['bmi'])
chart.set_xticklabels(chart.get_xticklabels(), rotation=45)

 

 

웹을 제어 하고 싶다면? #셀레니움 

#웹드라이버매니저 설치해야 함 
#회사에서 쓰게되면 파이썬 버전이 여러개 나눠짐. 
#크롬을 제어할 있는 것 셀레니움
#이것을 악용하게 되면 매크로, 봇 이 된다.
#셀레니움 자동화 테스트 하다가 용도가 변경 된 것

pip install selenium
pip install webdriver_manager

#virtualenv >> 파이썬 친해지고 그러면 프라이버시 모드로 활용 가능

 

#크롬 버전 바꿔야함
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service
driver = webdriver.Chrome(service=Service(ChromeDriverManager(driver_version="131.0.6778.109").install()))
# 그럼 data; 창이 뜬다 >> 창이 팝업 된 뒤에 뒤에 것들이 실행 된다. 
#get 은 내가 chrome을 통해서 네이버 카페로 이동 하겠다. 
driver.get("http://cafe.naver.com")

 

driver.get("https://www.koreabaseball.com/Record/Player/HitterBasic/BasicOld.aspx")
from selenium.webdriver.common.by import By
driver.find_element(By.CSS_SELECTOR, "#contents > div.sub-content > div.tab-depth2 > ul > li:nth-child(2) > a").click()

>> 위의 # contents  찾는 법은 아래 참고

 

driver.get("https://www.koreabaseball.com/Record/Player/HitterBasic/BasicOld.aspx")

 

 

 

 

 

 

 

 

from bs4 import BeautifulSoup
import io
pd.read_html(io.StringIO(driver.page_source))[0]
driver.find_element(By.CSS_SELECTOR,
            "#cphContents_cphContents_cphContents_ucPager_btnNo2").click()
pg1 = pd.read_html(io.StringIO(driver.page_source))[0]
driver.find_element(By.CSS_SELECTOR,
            "#cphContents_cphContents_cphContents_ucPager_btnNo2").click()
#데이터 로딩이 된 후 가져와야 한다. 
import time
time.sleep(2)
pg2 = pd.read_html(io.StringIO(driver.page_source))[0]
타자 = pd.concat([pg1],[pg2] )
타자 = pd.concat([pg1,pg2], ignore_index=True)
타자.columns
#corr 만 쓰면 상관 관계가 나온다. 
타자[[ 'AVG', 'G', 'PA', 'AB', 'R', 'H', '2B', '3B', 'HR',
       'TB', 'RBI', 'SAC', 'SF']].corr()
#시각화 -> 히트맵
#상관관계를 볼때는 데이터 자체가 int 여야 한다. 
sns.heatmap(타자[[ 'AVG', 'G', 'PA', 'AB', 'R', 'H', '2B', '3B', 'HR',
       'TB', 'RBI', 'SAC', 'SF']].corr())

 

 

#타자 기준으로 kbo 데이터를 합치고 싶다. 
#팀, 이름으로 조인을 해야하지만 중복되어서 데이터가 이상해 질수 있어
#팀을 처리를 해줘야해
kbo2['팀명'] = kbo2['team'].apply(lambda x : x.split()[0])
kbo2['팀명'].unique()
타자['팀명'].unique()

 

#merge 를 한다
#합칠떄 기준을 먼저 왼쪽에 적는다.
#how 에는 inner, right, outer 도 쓸 수 있음
타자2 = pd.merge(타자, kbo2, left_on=['팀명', '선수명'], right_on=['팀명','선수명'], how='inner')

 

타자2[['AVG','연봉']].corr()

 

 

#히스토그램

kbo2['포지션'].hist()

 

1교시 

퍼포먼스 마케터의 역량

ㄴ ROAS 등 결과적인 수치에 역량 평가가 좌지우지 되면 안된다.

ㄴ 직면한 문제를 어떻게 파악하고 돌파를 하는가가 퍼포먼스 마케터의 필수 역량

 

온라인 퍼포먼스 마케팅 3STEP 

1. USP

2. PERSONA

3. MESSAGE

 

USP (우리 제품 및 서비스의 가장 큰 강점은 무엇인가?)

수없이 많은 경쟁 제품 중 우리 제품을 선택해야 하는 확고한 이유?

시장이 성장되면 경쟁자들이 많아진다. 이 수 없이 많은 경쟁 제품 중 우리 제품을 선택해야 하는 확고한 이유를 찾아야 한다.  

 

★ POINT ★

USP 공급자 시선이 아닌 수요자의 시선에서 설정

 >> 인하우스 마케터들은 제품 기획, 제조, 마케팅 등 전반적인 단계를 담당하기 대문에 제품에 대한 객관적인 시선을 잃기 쉽다. 

 

1. 수치적 혹은 사회적 근거가 포함 되어 있는가?

2. 기능만 강조하는 게 아닌 가치가 강조되는가? >> 소비자 시선에서 확인 필요

      ex) 기능(300만 화소 카메라) vs 가치(직접적으로 얻을 수 있는 것) 

3. 소비자의 욕구와 상황을 고려 했는가? >> 우리 제품은 소비자 생활에서 어떤 걸 해소 시켜 줄 수 있나?

4. 우리만이 할 수 있는 말인가?

 

USP 도출 프로세스 

1. 신뢰도 강화 도구 리스트업 : 수치적 사회적 근거 수집 ex) 개발 히스토리, 테스트, 전문가, 수상 경력, 모델 등

2. 제품 기능 나열  : 제품의 기능적 특성 정의 ex) 성분, 함량, 용량, 사이즈, 포장, 공법, 용기, 제조 공정 등

3. 제품 기능과 가치를 연결 : 소비자 베네핏 정의 ex) 소비자가 얻을 수 있는 가치 

4. 우리만의 usp 완성 : 경쟁사와 차별되는

 ex) 후기 살펴봄 > 향이 좋음 > 원물 확인 조향사 

      명품향수 조양사가 만들어 7시간 동안 베이비 파우더 향이 유지되는 바디 워시

 

 

페르소나 (우리 제품이 가장 절실하게 필요한 고객)

★ POINT ★

페르소나란 특정 사람을 규명하는 것이 아닌 그 사람이 처한 상황과 욕망을 특정  

어떤 욕구 어떤 상황에 처햐져 있을까만 판단 하면 돼 > 5단계 욕구 확인 필요 

>> 리뷰 참고를 많이 해야함

 

TIP

우리 페르소나 들이 한정적인 모수에서 고여간다 라는 느낌이 들 때?

1. 리타겟팅 집중 하거나 타겟 cpc가 높아져 간다라는 걸 느낄 때

     >  타겟 확장 필요 > 타겟의 다른 관심사를 알아야해 > 커뮤니티 등에서 확인해서 > 어떤 언어를 사용하는지 확인 필요

  >> 이런식으로 kpi 힌트를 발견 할 수 있다. 

 

페르소나 특정 후 깊이 파고 들어야 한다. 

1. 자주 이용하는 플랫폼? : 주로 이용하는 플랫폼을 찾아서 마케팅 믹스에 적극적으로 활용

2. 주로 구매하는 제품군? : 타겟 세그먼트 외에 주로 구매하는 제품군을 파악해야 타겟 확장 및 서브 타겟 발굴의 타율을 높인다. 

3. 자주 사용하는 언어? : 커뮤니티, 취매생활 등 실생활에 쓰는 언어를 파악해 타겟 페르소나의 스토리와 일치성을 높여야 한다. 

4. 가장 많이 검색하는 키워드? : 어떤 플랫폼에서 어떤 목적으로 검색하는지 파악해야 한다. 

 

 

메시지  - 페르소나와의 접점을 만들고, 원하는 액션을 유도하는 장치

★ POINT ★

아무리 좋은 내용을 담고 있어도 페르소나가 이해(공감) 하지 못하면 실패한 메시지

 

1. 명확성과 일관성을 지키는가?

2. 별도의 추가 설명이 필요하진 않은가?

3. 소비자의 경험하기에 불편함은 없는가?

4. 페르소나의 언어를 사용하는가? 

 

메시지 일관성

컨텐츠에서 던지는 메시지 > 상세페이지 메시지 > 리뷰에 증명 

이렇게 일관성이 있어야지 메시지가 강화되어짐

 

메시지 방해 요소 

  1. 가독성 저하 

  2. 브랜드 경험간 불필요 요소 : 구매 퍼널, 리뷰 작성, 검색 유입 등 이탈요소 저반적인 소비자 경험을 지속적으로 체크 

  3. 페르소나에 대한 관심사 이해 : 페르소나의 상황과 그에 따른 일상 속 욕구 및 관심에 대한 이해를 기반으로 메시지 기획 필요 (ex) 18홀 

 

메시지 확장

타겟이 여러명이더라도 동일한 usp 뿌리 안에서 가지처럼 메시지가 뻗어 나가야함 

 


 

2교시 : 퍼포먼스 마케팅의 콘텐츠

 

AISAS 모델( 인지 > 관심 > 검색 > 구매 > 공유 ) 

 

과거 광고가 성숙되기 전에는 광고에 대한 거부감이 적어서,   랜딩 페이지나 광고 소재만 좋아도 효율이 잘 나왔다. 

다만, 경쟁도 과도해지고 광고에 대한 근본적 거부감이 생기면서 광고만 한다고 효율이 나오는 시대는 아니다. 

>> 결국 타겟의 여정에서 브랜드가 유기적으로 연결되어야하는 것이 퍼포먼스 마케팅에서 가장 중요 

 

attention - 우리 브랜드와의 첫 조우, 인지 단계의 소비자에게 우리 브랜드 알림

                - push 마케팅, da 광고를 포함 paid 광고가 이 단계에 속할 수 있다.  

                - 소비자에게 떠먹여주는 단계 : 단순 이미지로는 어려워서 명확하게 전달 하는 것이 필요 

 

interest - 확신을 주는 단계

              - 소비자가 씹어 삼키게 도와주는 단계

              - [의심 > 호기심 > 신뢰 > 확신]

 

search - 바이럴 칼럼 seo 최적화 등이 이 단계에 포함 될 수 있다. 

             - 소비자의 주변을 둘러싸는 단계 

             - 장소의 특성을 인식 ( 네이버 / 구글 / 유튜브 / 쿠팡 )

                 정보성 목적 [ 유튜브 > 구글 > 네이버 > 쿠팡 ] 구매 목적 

            - 소비자가 검색했을때 실질적으로 노출되는 콘텐츠 확인하고 우리의 전략을 세워야 한다. 

 

action - 결제 퍼널 최적화, 프로모션 등이 이 단계에 포함될 수 있다. 

            - 포인트 : 여기까지 끌고온 사람들은 절대 놓치면 안된다 라는 마인드로 점검 필요

            - 소비자의 방해물을 다 제거 해야함 (구매 동선에서 불편한 점이 없는지 점검) > 화면 녹화 해서 캡쳐 후 엑셀 저장 등 

            - 모바일 환경으로 집중적으로 점검 필요 > 1등 경쟁사하고 비교 한번 해보자

           

share - 소비자를 스피커로 활용 할 때 깊은 신뢰도를 얻을 수 있다.  

           - 특정 리액션을 유도하기 > 우리의 usp를 확고 하게 해서 리뷰에서도 언급될 수 있게 해야한다. 

 

 

상세페이지 기획

상세페이지 기획 시 마음가짐 

구매 전환율을 1% 에서 2%로 올려야 해! > 유입 모수 100명 중 1명만 더 구매하게 만들면 돼! > 그 1명은 어떤 메시지가 듣고 싶을까?

 

배너의 역할

초반부 3개 4개 배너 는 상세페이지를 조회하는 목적을 더 가져가야 한다. 

배너 광고로 이렇게 좋은 제품이니까 봐볼래? 가 되어야 한다!

 

제안구성

1. 상세페이지 봐라

    - 제품력 강조 : 상세페이지 최상단 제품력 강조(판매량, 와디즈)를 통한 소비자 호기심 증대

                           N차 완판 키워드로 지속적인 화제성 강조

   

광고 콘텐츠 활용 

  N차 완판 키워드로 지속적인 화제성 강조

 

리뷰 솔루션??? 

수기로 작성 > 어뷰징의 위험이 있어

유료 서비스 중에 vwo??? 잇음

테스트 할때 동일한 기간 및 조건으로 솔팅 필요

 

등등

 

3교시 액션을 만드는 데이터 리딩 

선행지표(직접 통제가 가능한 영역) vs 후행지표(직접 통제가 불가한 영역)

kpi 설정 후 선행 지표를 통제하며, 후행 지표를 개선하는 과정이 유기적으로 진행 되어야 한다.

 

선행지표와 후행지표 인과 관계를 잘못 알면 안된다. 

 

광고 데이터 리딩 흐름

광고 데이터 관측(집행 데이터 나열) > kpi와 실 데이터 비교(차이 확인) > 우선순위 별 액션 수립(핵심 문제 도출) > 실행 및 복기

 

데이터 시뮬레이션 중요

cpc가 싸야 좋다 > 저렴한 비용으로 모객을 하는 거기 때문에 (비용 활용 측면에서 최적화 가능)

cpc / 구매전환율 / 객단가 / 목표ROAS 가 어떻게 유기적으로 움직이느냐 파악하는 것이 중요

 

cpc 최적화

- cpc를 무조건 낮추기 위해 타겟팅을 변경 하는 것은 안됨

- 기존 타겟에게 동일한 조건으로 노출 된다는 가정하에 최적화 필요하다. 

- 같은 노출량 대비 클릭율을 개선하여 모객 비용을 감소 시켜야 한다.

 

>> 집행 데이터를 볼 때 와이(why)에 집중 필요 , 메타와 gfa는 왜 데이터가 다르지?

> 실제로 노출되는 지면을 경험 해야함

> 우리 제품이 노출되는 지면 파악 필요

> 로직 트리를 세워야 한다!

 

* 어디까지 확인 가능? 화이트 모드/다크모드 일때 주목되는 색상은 무엇일까? 등

* 결국 ctR이 높아져야지 cpc가 낮아지는 경향이 많다.

* 레퍼런스를 많이 봐야한다 > 마케팅에 제일 중요한게 레퍼런스 수집이다!

 

구매전환율 최적화

>> 이런이런 명분으로 너에게 베네핏을 주는거야 라는 것이 명시되는게 중요 

>>  왜 이런 쿠폰을 주고 할인 혜택을 주는지 명확해야함!

>> 검색 유입 전환 / 구매 여정 동선 설계하는게 중요하다. 

 

SEO 구축 어떻게 해요?

>> 보통 가장 많이 하는게 파워링크 

>> 바이럴 콘텐츠는 필수적 ( 고객과의 접점을 확장할 수 있다. / 블로그를 통한 정보 수집이 늘고 있다 / 배너 소스로 활용 가능 )

 

객단가 상승

> 업셀링 과 크로스셀링을 시키자

 

사이트 데이터 리딩 흐름

1. 기간별 데이터 확인

   - 호스팅사, 스토어 센터 등 사이트에 쌓인 데이터를 기간 별로 나누어 확인  

 2. 베스트 데이터와 비교

   - 데이터가 좀 튈 때가 있는데 이 때는 훨씬 더 다양한 시각에서 수치를 분석 해야한다.

   - 효율이 잘 나왔던 기간 데이터 vs 문제 기간 데이터 

3. 요소 별 개선 사항 수립 

   - 핵심 문제 도출

   - 가장 먼저 개선해야할 데이터와 개선 방안을 수립하는 단계

4. 실행 및 복기

   - 액션 별 실행과 결과 복기

   - 일정에 맞게 순차적 액션 실행 

 

사이트 데이터 컨디션 체크  

> 구글 애널리틱스 : 데이터의 정확성을 담보해 주는 툴은 아니야. 얼만큰 데이터 흐름을 볼 수 잇냐? 전략을 설정 할 수 잇나?

    카페 24 나 스마트스토어센터 퍼스트 파티 데이터를 활용하는게 좋음, 어디를 개선하면 될지 인사이트 잘 뽑을 수 있어!

> 북마크 매출 추이 확인 필요 ? > 오가닉 매출 추이가 얼만큼 변했냐? 기여도를 측정 하는 것이 좋다.

 

스케쥴링 체계화 중요!

   1주차 2주차 3주차 로 스케쥴링을 체계적으로 움직이는 것이 중요

   기록을 잘 하는것 / 1차 kpi 2차 kpi 로 단계를 정해서 체계적으로 하자

 

TIP

광고와 로하스로만 소통하고 의사결정만 한다면 내가 디딜 땅이 좁아진다.

이게 어떻게 기여를 하고 있는지 계속 파악을 하는게 중요하다. 

당장의 상황을 보고 커트커트 하면 손상을 입을 수 있다...

 

* 데이터 관측 시 주의 사항

 1. 미련이 남는 광고 운영 

 2. 측정 기준의 오류

 3. OKR 과 KPI의 이해 미흡

 4. 주관적인 판단  

>> 데이터 쇼핑? 내가 보고싶은 데이터만 보는거다.

>>  광고 매체 자체가 생명체 처럼 느껴질 떄가 있다(유기체) 

>>  나만 아는 무언가의 강점이 있는데.. 말로 설명할 수 없고... 이런 오류를 발생 시킬 수 있어

       사소한 이유로 미련을 남는 경우가 있지만 객관 적인 시각 필요 

>> 측정 기준의 오류 :  데이터를 측정하는 기준 자체가 잘못 되어있어 있다면?

> 데이터 양도 굉장히 중요하다. > 데이터 신뢰도가 높아지며, 인사이트 깊이가 달라진다.

 

* 뚜렷한 판단을 하는 법

 > 고냐 스탑이냐를 판단할 때 / 도달 모수, 7일 14일 전환수 등 잣대를 많이 꽂아보쟈!

> 부정적인 데이터 / 긍정적인 데이터 확인 필요

 ㄴ 타겟 학습이 가능한 매체로 옮겨 놓음, 전환 캠페인으로 전환!

 

질문 :

질문. 1
페이스북 컨설팅? >> 타겟을 넓혀라 > 얘네는 머신러닝이 잘 학습되는 매체임 (매체에 대한 성격 확인 필요)

gfa 가장 큰 장점은 머신러닝의 영향을 덜 받는다.

메타 머신러닝이 굉장히 중요한 매체 학습해서 찾아내는 소재임

페이스북은 계정 단으로 학습을 한다. 

 

1. 네이버 gfa

  질문 :  페이스북 역시 계정단으로 머신러닝이 학습된다고 말씀 주셨는데 네이버 gfa 역시 계정단으로 머신러닝 학습이 되나??

  답변 : 계정단의 학습이 없는건 아닌거 같아.      

 

   질문 : 담당하는 브랜드 자체가 프로모션 단으로 광고를 운영해서 캠페인 운영 주기가 짧다.

            전환 목적으로 운영시 학습 기간이 조금 짧은거 같은 느낌이 있어서 어떻게 해야할지 모르겟따.

   답변 : 할인 내용을 다 뺴고 제품의 USP를 강조한 상시 소재를 운영하는 광고를 하나 만들거 같다. 

            할인 내용을 배제한 상시 소재를 두고 시즌 운영 소재를 따로 뺴는 것을 추천 드린다. 

   

질문 2 간접적인 매출이 발생할 수 이는데 ? 어떤 지표로 보는지?   

1. 디에이 목적을 키워드 쿼리수 측정으로 파악하자? >> 사실 로하스 측면으로 보는거 보다는 로이 측면으로 보는게 맞을수도 있다.

2. 상세 페이지를 아예 못바꾼다면 > 다른 da 로?

 

 

 

느낌점 

문제 : 

SUBWAY_DISTANCE 테이블에서 노선별로 노선, 총 누계 거리, 평균 역 사이 거리를 노선별로 조회하는 SQL문을 작성해주세요.

총 누계거리는 테이블 내 존재하는 역들의 역 사이 거리의 총 합을 뜻합니다. 총 누계 거리와 평균 역 사이 거리의 컬럼명은 각각 TOTAL_DISTANCE, AVERAGE_DISTANCE로 해주시고, 총 누계거리는 소수 둘째자리에서, 평균 역 사이 거리는 소수 셋째 자리에서 반올림 한 뒤 단위(km)를 함께 출력해주세요.
결과는 총 누계 거리를 기준으로 내림차순 정렬해주세요.

 

해결 방식 : 

-- 코드를 작성해주세요
-- select route, sum(d_cumulative), avg(d.between_dist)
-- 누계거리 소수 둘째 / 평균 역사 소수 셋째 >> round 함수
-- km 함께 출력 >> concat
-- 누계거리 desc 

 

결과 : 틀림 

         concat 함수를 사용해서 텍스트(Km) 넣어야 함 

 

답안 : 

select route, concat(round(sum(d_between_dist),3),"km") as TOTAL_DISTANCE, concat(round(avg(d_between_dist), 4),"km") as AVERAGE_DISTANCE
from subway_distance
group by 1
order by 2 desc

 

주의할 점 : 

  1. 정렬 기준 
    • 'TOTAL_DISTANCE'를 기준으로 하면 안된다. 해당 칼럼은 concat() 함수로 인해 더이상 숫자가 아니다. 문자열이다. 따라서 이 컬럼을 기준으로 정렬 시 문자열(사전식) 정렬기준에 따라 정렬되는 버그가 발생한다.
  2. 반올림 함수 인자 설정
    • round(숫자, 반올림할 자릿수)
    • 반올림할 자릿수하는 말이 좀 헷갈림의 여지가 있다고 느껴지는데, 예를 들어 '소수 둘째 자리에서 반올림한다'고 가정하면 반올림할 자릿수라는 매개변수에는 1이 들어가야 한다.
    • 즉, 반올림 연산 수행 후에 유효한 자릿수가 매개변수로 사용되는 것이다.
SELECT p.product_code, sum(p.price*os.sales_amount) as sales
from product p
    inner join offline_sale os on p.product_id = os.product_id
group by 1
order by 2 desc, 1 asc

문제 : 

PRODUCT 테이블과 OFFLINE_SALE 테이블에서 상품코드 별 매출액(판매가 * 판매량) 합계를 출력하는 SQL문을 작성해주세요. 결과는 매출액을 기준으로 내림차순 정렬해주시고 매출액이 같다면 상품코드를 기준으로 오름차순 정렬해주세요.

 

해결 방식 : 

-- join product / offline_sale 테이블
-- 상품코드 별 매출액(판매가 * 판매액)
-- 매출액 desc, 상품코드 asc

 

결과 :  정답

 

답안 : 

SELECT p.product_code, sum(p.price*os.sales_amount) as sales
from product p
    inner join offline_sale os on p.product_id = os.product_id
group by 1
order by 2 desc, 1 asc

 

다른 풀이법 : 

 

 

1. 서비스, 비즈니스 파악 - 서비스의 목표, 기획서

2. 문제 정의 - 핵심 문제, 목표 정의 - 핵심 이벤트 

3. 사용 주기 파악 - 고객은 문제를 어떤 빈도로 겪을까? 실제와 예상의 차이 파악 - Daily/Weekly/Monthly 결정

4. 리텐션 커브 분석 - PMF 도달 여부 확인 - 평평해지는 시점 확인 ( * PMF = Product Market Fit ) 

5. 추가 분석 - 코호트, 유저 행동 등  

 

- 핵심 이벤트 정의 필요

 

문제 : 

APPOINTMENT 테이블에서 2022년 5월에 예약한 환자 수를 진료과코드 별로 조회하는 SQL문을 작성해주세요. 이때, 컬럼명은 '진료과 코드', '5월예약건수'로 지정해주시고 결과는 진료과별 예약한 환자 수를 기준으로 오름차순 정렬하고, 예약한 환자 수가 같다면 진료과 코드를 기준으로 오름차순 정렬해주세요.

 

해결 방식 : 

-- WHERE 2022년 5월 
-- COUNT(예약 환자 수) '5월예약건수'
-- GROUP BY 진료과 코드 AS '진료과 코드'
-- 진료과별 예약 환자수 ASC / 진료과 코드 기준 

 

결과 : 정답

 

답안 : 

SELECT MCDP_CD AS'진료과 코드' , COUNT(*) AS '5월예약건수'
FROM APPOINTMENT
WHERE APNT_YMD LIKE '2022-05%'
GROUP BY 1
ORDER BY 2 ASC, 1 ASC

 

다른 풀이법 (참고) : 

 DATE_FORMAT 날짜와 시간 값을 지정된 형식의 문자열로 변환하는 데 사용됩니다. 기본 구문은 다음과 같습니다.

  • date: 형식을 지정할 날짜 또는 날짜시간 값
  • format: 원하는 출력 형식을 지정하는 문자열

 여기에서 format 부분을 잘 확인하고 사용해야합니다. 대문자인지 소문자인지에 따라 바뀌기 때문에 조금만 실수해도 값을 가져오지 못합니다.

  • %Y: 4자리 연도 (예: 2023)
  • %y: 2자리 연도 (예: 23)
  • %m: 2자리 월 (01-12)
  • %d: 2자리 일 (01-31)
  • %H: 24시간 형식의 시간 (00-23)
  • %i: 분 (00-59)
  • %s: 초 (00-59)
  • %W: 요일 이름 (Sunday-Saturday)
  • %M: 월 이름 (January-December)

 

+ Recent posts