背景
现如今,社交媒体已成为各大品牌商公认的重要营销渠道。品牌商们除了在各类社交平台建立自己的营销账号外,每年还会花费数以亿计的资金与知名的媒体节目,明星,自媒体们合作。虽然相较于传统营销渠道,社交媒体透过流量的红利有着低成本高触达的优点,但高度密集的营销信息也让人们逐渐失去了互动耐心,高成本的广告投资常常仅换来社交用户几秒钟的注意力,所以如何利用好社交媒体海量的数据信息十分重要。
一般情况下,用户的行为分析主要分为三类:1. 用户数据分析与监控 2.调查问卷 3. 访谈。其中第一类和第二类是了解用户需求比较常见的方式。今天我主要想聊一聊第二类方式的目的以及知名品牌商们比较青睐的结果展现形式。
调查问卷的目的
尽管社交媒体本身具备快速获取海量数据的优点,但仅通过用户数据本身并不能百分百反应用户的真实需求。而一份调查面广,靶点清晰的用户调研问卷可以在一定程度上弥补这一缺点。例如,Dropbox在推广早期升级版本时有过一段很长时间的增长瓶颈期,数据分析师们从用户的使用数据中发现,大多数活跃用户都没有使用升级版本。他们不断推出试用版本,不断优化升级版的用户体验,但仍收效甚微。直到Dropbox引进了新的增长团队,做了一次用户调研,才发现大部分的用户根本不知道Dropbox推出了升级版本,新版本的试用引导路线也十分不明确。产品部这才意识到,增长的起点并不是升级版本身,而是升级版本需要有更加直观清晰的引导策略。
对于社交媒体营销而言,用户调研问卷也行使着相似的功能,品牌商们也可从中了解到营销广告让人过目不忘的程度,用户们的接受程度,验证营销合作对象对用户群体的实际影响价值等等。这种做法可以让产品以及市场人员对需求与业务流程建立更直观的认识并且更容易获得一些常被忽略的细节。
交叉表的使用
相较于透视表,交叉表更适合于呈现复杂且多维度的用户调研结果。同一个问题,可以在不同维度下展示。例如,我想知道,在过去的两天中,用户是否能回想起我们公司与某媒体合作的广告。除了了解整体数据,将这个问题放在多个维度下去解析会更加准确且快速地察觉到不同用户画像间的区别 —— 我可以了解到参与了营销博文互动的用户是否对广告的印象更深刻,又或是,参与了互动且能回想起营销内容的25岁以上的用户是否更喜欢我所选择的营销合作对象,等等。
以下就是一种常见的用户调研结果的展现形式。除了每个维度下的统计数据,我们还可以直接计算出问题中每个选项的横向与纵向占比。
假设检验的引入
但如何才能验证参与了营销互动的用户比未参与互动的用户对广告的印象更深刻呢?
假设检验以及卡方分析就是一种比较常见的,用来研究两个定类变量间是否独立即是否存在某种关联性的方法。例如,针对第一个问题,Null Hypothesis可以设定为:是否参与营销博文互动与广告让人过目不忘的程度之间没有关联。而我们可以引入p-value(假设检验为真的概率)来验证假设是否成立。
在计算P-value之前,我们需要设定significance level, 当P-value小于该significance level时,我们拒绝原假设,证明两者之间有关联。
利用Python生成交叉表
获得原始数据
以下是一个简单的样本数据,每一列都代表一个问题(维度)。
表格生成逻辑图
① 简单的二联表
② 稍复杂的三联表
代码示例
1. 获得原始数据
import pandas as pd
from scipy.stats import chi2_contingency
from scipy.stats import chi2
import numpy as np
import warnings
warnings.filterwarnings("ignore")
# General Purpose Crosstab Generator (GPCG)
def dataRead(File):
global data,data1,data2 #将变量设为全局变量
data = pd.read_excel(File)
# data = data[data.gender == 'Female']
data1 = data[data.engager == "No"]
data2 = data[data.engager == "Yes"]
global y
global z
y = data['recall']
z = data['engager']
dataRead("Survey.xlsx")
2. 交叉表的生成 -- ① 简单二联表
根据以上的示例图,我们将年龄表格左侧的第一个维度,是否记得营销广告作为分组的第二个维度。
## ① ##
## 建立一个简单的交叉表,且横向维度只有Yes和No
def type1(question,fix,Index):
a = pd.crosstab(question, fix, margins=True)
a['Non'] = a['No']
a['Yep'] = a['Yes']
a = a.drop('No',axis=1)
a = a.drop('Yes',axis=1)
a = a.drop('All', axis = 1)
a = a.fillna(0)
a = a.reindex(Index) #按照想要的方式排序
a.to_clipboard(excel=True)
return a
## ② ##
## 在简单的交叉表下方添加假设检验的结果
def p_val(val):
if val < 0.05:
return "<0.05"
elif val < 0.1:
return "<0.1"
elif val < 0.15:
return "<0.15"
else:
return ">0.15"
def chsq_test(question,c,Index):
chsq_rlt=[]
C=type1(question,c,Index)
C1=C.iloc[1:,[0,1]]
# remove all zeroes
try:
C1=C1[(C1.T != 0).any()]
chsq_rlt.append(p_val(chi2_contingency(C1)[1]))
# rename the column of the dataframe in order to merge p-vlue with crosstab
b = pd.DataFrame(chsq_rlt).transpose()
b["Non"] = b[0]
b["Yep"] = ""
b = b.drop([0]