🍡

취향과 의견을 정성껏 깎아 '데이터'로 - 정성조사의 방법들 (컨조인트 분석편)

🎶
당신은 음악 스트리밍 서비스 기획자 A. 과연 옵션들을 어떻게 구성해야 고객들이 제일 좋아할까?
야심차게 기획되는 구독형 음원 스트리밍 서비스 A가 있다고 가정해봅시다.
해당 서비스를 어떤 옵션들로 채워서 출시해야 하는지 고민이 될 수밖에 없습니다.
구독 요금 : 6천원, 8천원, 1만원
제공 서비스 유형 : 음원 스트리밍 only, mp3 파일 다운로드 only, 스트리밍 & 다운로드 모두 가능
맞춤형 음원 추천 서비스 제공 여부 : YES or NO
서비스 우선 공개 플랫폼 : iOS or Android
어떤 옵션으로 구성해야 서비스가 가장 많은 사랑을 받을 수 있을까요? 🧐
옵션의 구성은 [ 월 6천원 + 스트리밍만 + 추천 서비스 제공 + iOS ] 부터, [ 월 1만원 + 스트리밍&다운로드 + 추천 서비스 X + Andrioid ] 까지. 총 3*3*2*2 = 36가지나 됩니다.
→ 과연 36개나 되는 옵션에 대한 고객의 취향을 데이터로서 수집하고 계량할 수 있을까요?
→ 옵션들 중 어떤 옵션이 고객의 의사결정에 더 큰 영향을 주는지를 계량할 수 있을까요?
→ 계산 과정 ... 제가 직접 해야 하나요...?
이 복잡하고 추상적인 문제를 접근하는 데에는 다음과 같은 아이디어들이 도움을 줍니다. 💪
인간은 "옵션 3번이 옵션 12번보다 3배 정도 좋은데?" 라는 판단은 할 수 없지만, "그것보단 이게 더 낫다"라는 평가는 할 수 있다.
→ 옵션을 쭉 나열 해놓고 가장 좋은 순서대로 나열해 달라는 설문조사를 고객에게 의뢰할 수 있다.
옵션 중 중복되는 부분을 최대한 배제하게 잘 구성하면, 36개를 모두 비교하지 않아도 효율적으로 의견을 수집할 수 있다.
→ 약간의 통계적 기법을 활용해 옵션의 수를 최적화할 수 있다.
→ 다행히 직접 계산하지 않고 프로그램이나 패키지를 쓰면 된다.
각 옵션들이 얼마나 고객의 지지를 받았는지를 따질 수 있다면, 각 옵션들이 시장에서 어떻게 팔릴지 시뮬레이션을 돌려볼 수 있다.
→ 물론 제한적인 정보를 갖고 돌리는 시뮬레이션이지만 의사결정에 참고할 수 있다.
→ 다행히 시뮬레이션 역시 프로그램이나 패키지가 존재한다.
이럴 때는 컨조인트 분석! (Conjoint Analysis)
Conjoint 분석이란, 소비자가 제품이나 서비스의 어떤 요소에 가치를 부여하는지 분석하는 대표적인 기법입니다.
'가치', '취향', '선호도' 라는 정성적인 요소를 데이터 삼아 체계적인 분석을 진행할 수 있습니다.
그렇기 때문에 소비자 분석, 정책 기획, 마케팅 직군에서도 활발하게 사용되고 있습니다.
🚀 컨조인트 분석은 다음과 같은 절차를 밟으며 진행됩니다.
1.
옵션을 의미하는 카드(card)를 구성하기 - ex. [ 월 6천원 + 스트리밍만 + 추천 서비스 제공 + iOS ]
2.
카드 구성을 최적화하는 절차 진행하기 (통계 프로그램이나 R 패키지를 씁니다)
3.
최적화된 카드 구성을 토대로 설문조사 진행하기
4.
설문조사 결과를 토대로 각 옵션("구독료")의 중요도와 세부 옵션 ("6천원", "8천원" 등) 의 영향력을 파악
5.
파악한 영향력을 바탕으로 시장 점유율 시뮬레이션을 진행하고 의사결정에 반영
🔀 R 언어의 conjoint 패키지를 쓰되, 파이썬 환경에서 작업하는 독특한 방식을 소개합니다.
(R언어가 이미 익숙하신 분들은 R스튜디오 환경에서 코드를 따라가면서 진행하면 됩니다. 데이터 전처리 부분은 파이썬 코드이지만, 어렵지 않게 전처리할 수 있을 것입니다.)
R을 쓰는 이유는 ... 아직 R에서밖에 Conjoint 패키지가 없기 때문입니다. 😓 하지만 파이썬만 알아도 진행할 수 있도록 포스팅을 작성했으니 차근차근 주석을 읽으며 따라오시기 바랍니다.
⚠️ 본 포스팅은 주피터 노트북 환경을 기준으로 작성되었습니다.
# 파이썬 환경에서 R 언어를 돌릴 수 있는 rpy2 패키지를 사용합시다. 없다면 다운 받아 줍니다. #pip install rpy2 #conda install rpy2 # 아래 코드를 한 줄 입력해 놓습니다. %load_ext rpy2.ipython
Python
# %%R은 파이썬 주피터 노트북 환경에서, 이번 셀에 한하여 R 문법을 적용시키는 매직 커맨드입니다. %%R # R 패키지를 다운받고 실행해줍니다. 파이썬의 pip, import 메소드와 같습니다. install.pakages("conjoint") install.pakages("huxtable") library(conjoint) library(huxtable)
Python
Step 1 & 2. 옵션을 의미하는 카드(card)를 구성하고 최적화하기
위 과정은 포스팅 초입부터 제시한 사례를 통해 설명하겠습니다.
이때 주의해야할 사항이 있으니 확인하며 옵션을 구성해주세요 (클릭하여 확인 👀 )
'구독형 음원 스트리밍 서비스'의 옵션을 다음과 같이 설정했습니다.
옵션 보기 👀
구독 요금 : 6천원, 8천원, 1만원
제공 서비스 유형 : 음원 스트리밍 only, mp3 파일 다운로드 only, 스트리밍 & 다운로드 모두 가능
맞춤형 음원 추천 서비스 제공 여부 : YES or NO
서비스 우선 공개 플랫폼 : iOS or Android
이러면 총 36개의 카드 구성이 나옵니다. (3*3*2*2=36)
이를 바탕으로 소비자에게 설문조사를 해야하는데, 36개나 되는 옵션의 선호도를 한번에 줄 세워달라고 하면 굉장히 곤란하겠죠? 😓
개수를 줄이되, 보다 합리적인 방법으로 줄여야 합니다.
→ R의 패키지를 사용하되, 다음과 같은 기준을 적용하도록 합시다
만약 원하는 카드의 개수가 있다면? → 파라미터의 개수를 정해 줄 수 있습니다. cards = n
딱히 무관하다면? → type = 'orthogonal' 를 입력해줍니다.
카드 수를 산출하는 통계적인 기법(Fractional Factorial Design)의 자세한 이야기는 생략합니다. 정신 건강에 해롭습니다
아래 코드를 돌려봅시다.
%%R # 아래 price, service, recomm, platform 에 미리 정의한 옵션들을 잘 옮겨 적습니다. # 그리고 product_options 라는 변수에 해당 내용을 담습니다. product_options<-expand.grid( price = c('6000','8000','10000'), service = c('streaming_only','download_only','both'), recomm = c('yes','no'), platform = c('iOS','Android') ) # 담아둔 변수를 Conjoint 패키지의 caFactorialDesign 클래스를 사용해 옵션 수를 최적화합니다. card_design <- caFactorialDesign(data=product_options, type='orthogonal') print(card_design) #write.csv(card_design,"card_design.csv", row.names = TRUE)
Python
출력된 결과를 확인하면 알겠지만, 총 36개 중에 9개의 카드 구성으로 간추려졌음을 알 수 있습니다.
하지만 ... 결과가 표 형식이긴 한데 익숙한 데이터프레임이 아니라 print() 된 꼴입니다.
이는 가독성도 좋지 않고, 추후 다음 데이터로 쓰기에도 효과적이지 않으니, 필요하다면 csv로 따로 저장해둡니다.
그 다음은 level_n 이라는 판다스 데이터 프레임을 하나 만들어 볼 것입니다.
어려운 것은 없고, 각 옵션들을 순서대로 기입만 해주면 됩니다.
import pandas as pd level_n = pd.DataFrame({'levels': ['6000', '8000', '10000', 'streaming_only', 'download_only', 'both', 'yes', 'no', 'iOS', 'Android' ]})
Python
step 3 & 4. 각 카드에 대한 소비자의 선호도 조사 및 결과 해석
9개로 구성된 카드를 이제 소비자에게 보여 준 뒤 어떤 옵션 구성이 가장 매력적인지 평가를 받습니다.
대중적으로 사용하는 방식은 다음과 같습니다.
1.
9개의 카드를 한 화면에서 동시에 제시
2.
응답자들이 어떤 대안들이 있는지 확인
3.
각각의 카드에 선호도 점수를 부여 (가장 선호 : 8점 ~ 가장 비선호 : 0점, 즉 1등부터 꼴지까지 등수 나누기)
그렇게 해서 형성된 점수를 표로 정리해 둡니다.
우리는 예제 데이터를 만들어야 하기 때문에 다음과 같은 파이썬 코드를 돌려서 설문조사 결과를 만듭시다.
100명의 응답을 받았다고 가정해봅시다.
import random survey_dict = {} for num in range(100): survey_dict[f'survey_{num}'] = random.sample(range(9), 9) survey_df = pd.DataFrame(survey_dict).T survey_df.columns = [f'profil{num}' for num in range(9)] survey_df.index = [f'{num}' for num in range(100)]
Python
100개의 설문 응답(행 : 응답, 열 : 카드)을 만들었습니다. 카드 옵션이 어떻든 랜덤하게 등수를 주었습니다.
이렇게 만든 데이터이니, 나중에 특정 옵션의 중요도와 선호도가 지나치게 높게 나와선 안 되겠죠?
🎬 이제 분석 패키지를 돌릴 준비가 끝났습니다. 아래 코드를 돌려봅시다.
# 파이썬으로 만들어 변수로 저장한 데이터를 R에서 사용해야 하기 때문에 %Rpush로 저장한 변수명을 입력해줍니다. %Rpush level_n %Rpush survey_df
Python
%%R # card_design은 위에서 이미 r로 돌린 뒤 변수에 담아 뒀으므로 바로 쓰면 됩니다. Conjoint(y=survey_df, x=card_design, z=level_n)
Python
결과는 다음과 같이 텍스트로 출력됩니다. 각 부분의 해석은 다음과 같습니다.
총 결과 보기 👀
🧐 해석하기
1.
파란색 네모 부분 : 각 변인들의 중요도가 약 30, 30, 20, 20 으로 구성되어 고르게 산포되어 있다
→ 그럴 수밖에 없다. 실제 설문조사가 아니라 random 코딩으로 무작위하게 선호도를 입력했기 때문이다.
→ 고객들이 특정 옵션값이 달라짐에 따라 평가 등수가 크게 바뀌었다면 그 옵션이 해당되는 변인의 중요도가 커진다.
ex. 구독요금이 6천원인 카드들은 설문조사에서 높은 등수를 차지하고, 1만원인 카드들은 등수가 현저히 낮아지면 구독요금의 중요도가 올라간다.
*이때, 세부 옵션 개수가 크면(플랫폼 유형은 2개 < 구독요금 유형은 3개) 기본적으로 중요도가 커지는 경향이 존재하니 반영해서 해석하자
2.
빨간색 괄호 부분 : 해당 옵션은 얼마나 응답자의 지지를 받는지를 표현한다.
utls(utilities)가 +로 높으면 그만큼 응답자가 선호한다는 뜻이며, -로 나오면 그 반대로 해석한다.
→ 당연히 '가격' 같은 변인에서는 가격이 저렴할수록 응답자의 선호를 받을 확률이 높아진다.
최신 영화 VOD 이용자의 선호도에 대한 컨조인트 분석 (임정수, 2013) 중에서 나온 요금에 대한 고객의 효용값
→ 그러나 이번 포스팅 예제는 random 코딩을 통한 무작위 채점이었기 때문에 +0.11, -0.11, 0 으로 별 의미 없게 집계되었다.
반대로, 가격이 너무 낮아지는 경우 효용값이 낮아지는 상품들도 있습니다. 👀
Step 5. 시장 점유율 시뮬레이션을 진행하고 의사결정에 반영
각 변인들의 효용성을 파악한 뒤 이를 종합적으로 판단해 상품 구성안을 뽑아봅시다.
BEST 3를 뽑아낸 뒤 이를 시장에 출시했을 때 어떤 점유율을 가질 것인가 시뮬레이션을 돌릴 것입니다.
예제로서 아래처럼 3개를 구성했다고 치고, 데이터를 만들어 봅시다.
⚠️ 이때, 각 세부 옵션이 한번씩은 모두 들어가야합니다.
[ 6000, streaming_only, no, Android ]
[ 8000, download_only, yes, Android ]
[ 10000, both, no, iOS ]
단, 이때 데이터 구성 양식이 있으니 그에 맞춰줘야 합니다.
6000은 6000, 8000, 10000 중의 첫번째 세부 옵션이었으므로 1로 코딩합니다.
이런식으로 값이 아닌 인덱스로써 코딩을 진행한다면 ...
simul_df = pd.DataFrame({ 'price' : [1,2,3], 'service' : [1,2,3], 'recomm' : [2,1,2], 'platform' : [2,2,1] })
Python
이제, caLogit() 이라는 api를 이용해 시뮬레이션을 돌려봅니다.
%Rpush simul_df %Rpush survey_df
Python
%%R caLogit(sym = simul_df, # 시뮬레이션 돌릴 카드 디자인 (aka 프로필) y = survey_df, # 설문조사 결과 x = card_design) # 원래 카드 디자인
Python
그러면 다음과 같은 결과물이 출력됩니다
28.94392 32.33495 38.72113
시뮬레이션 용 옵션마다의 예상되는 시장 점유율
1.
[ 6000, streaming_only, no, Android ] : 28.94%
2.
[ 8000, download_only, yes, Android ] : 32.33%
3.
[ 10000, both, no, iOS ] : 38.72%
→ 이렇게 3번째 옵션이 가장 높은 점유율을 달릴 것이라 통계 프로그램은 예측하고 있습니다.
→ 이를 바탕으로 최종적인 서비스 옵션 구성의 의사결정을 진행합니다.
🤔 Conjoint 패키지는 caLogit, caMaxUtility, caBTL 총 3가지 시뮬레이션 모형을 지원합니다. 어떻게 선택해야 할까요?
→ 일반적으로 오랫동안 소비가 지속되는 내구재의 경우는 MaxUtility모형이, 일상에서 소비하는 소비재의 경우는 Logit 모형이나 BTL모형이 많이 사용됩니다 (이훈영, 연구조사방법론, 2008)
여기서 2% 부족한 것은 ...?
😓 이번 포스팅에서 제외된 내용은
Conjoint 분석 패키지 자체가 R을 통해 만들어졌기 때문에 파이썬 환경에 적합하지는 않습니다.
선호도 설문조사에 사용될 웹서비스는 따로 소개하지 않았습니다.
🚀 여기서 더 나아가려면 ...
선호도 조사 단계에서 응답자의 인구 통계학적 요소를 수집한다면, 보다 정교한 분석이 가능합니다.
ex. 구독요금이 미치는 영향 → '30대' '해외거주' '남성'에게 구독요금이 미치는 영향
각 옵션을 지지하는 정도에 따라서 응답자를 군집화해 새로운 타겟을 정의할 수 있습니다
ex. [ 높은 구독요금 + iOS ] 옵션을 지지하는, 초기 가설을 벗어난 타겟층이 지속적으로 관찰되면 이를 놓고 새로운 상품 구성을 염두에 둘 수 있음
참고하면 좋은 연구 자료 (구글링을 통해 무료 열람이 가능한 논문)
🙋‍♂️ 김문과의 데이터
직접 공부한 데이터 분석 · 활용법을 기록합니다.
포스팅에 대한 Q&A 및 다양한 논의를 기다립니다.
contact : 우하단 메신저 버튼 or e-mail
Today