在众多企业致力于创造成功产品的过程中,他们不能仅凭经验来猜测选择哪些最吸引消费者的属性。这时,一种名为联合分析的实证方法就显得尤为重要。本文将带了解联合分析的核心概念,学习如何准备联合设计,了解不同联合分析调查技术之间的区别,理解不同的联合分析术语,实现Python中的联合分析,并解释结果以确定产品的最佳属性组合。
联合分析是一种基于调查的统计技术,用于确定消费者如何评价构成产品或服务的不同属性(特征、功能、好处)。必须找出有限数量的产品或服务属性组合如何影响消费者的选择或决策。联合分析有多种应用,包括测试新产品设计的客户接受度、评估广告的吸引力以及在服务设计和产品定位中的应用。
企业通过使用正确的功能和合理的定价来赢得消费者。例如,智能手机制造商正在将越来越多的功能集成到这些小型设备中,数十亿美元的赌注在于他们是否能得到正确的功能和价格组合。酒店和度假村调整其设施和服务水平,以吸引特定的目标市场,如商务旅行者或豪华度假者。消费品公司调整其包装、口味和营养成分,以吸引新的客户群体并创造成功的产品线扩展。
可以将产品或服务描述为几个属性,这些属性进一步细分为几个级别。例如,手机可能具有屏幕尺寸、颜色、品牌、价格等属性,屏幕尺寸的级别可能是5英寸、5.5英寸或6英寸。属性应与管理决策相关,现实生活中应有不同的级别(至少两个级别),预期会影响偏好,定义清晰且易于沟通,且不应表现出强烈的相关性(价格和品牌是例外)。属性级别应清晰、互斥且现实。
配置文件是属性级别的独特组合。
根据调查问卷的回答类型,联合分析分为以下几类:
1. 基于排名的联合:也称为基于偏好的联合分析。受访者将配置文件从最好到最差进行排名。它类似于最佳-最差缩放,但受访者必须为中间选项分配排名。
2. 基于评分的联合:也称为基于分数的联合分析。受访者对他们展示的产品配置文件进行评分。评分可以是0到5、0到10或0到100的量表。受访者必须分配分数,使得每个问题的分数总和达到某个数字(例如,每个问题中的所有分数必须总和为100)。
3. 基于选择的联合:受访者选择购买哪个选项或以其他方式选择。基于选择的方法在理论上是最合理的、实用的和常见的实践。
1. 描述研究目标和目标产品。列出要回答的研究问题。
2. 创建组合或产品配置文件(指定属性和级别)。
3. 选择受控的“产品配置文件”或“属性和级别组合”供消费者选择。
4. 设计问卷(基于上述类型)并收集响应。
5. 执行联合分析。
6. 报告和解释结果。
以披萨为例。想了解消费者在选择或订购披萨时最和最不偏好的属性和级别的组合,以便营销团队能够以最佳组合进入市场。
第一步是定义产品的属性和级别。将采用八个不同的属性,即“品牌”、“价格”、“重量”、“外壳”、“奶酪”、“尺寸”、“配料”和“辣味”,其中品牌、价格和重量各有四个级别,其余属性有两个级别。
下一步是选择组合或配置文件的数量。在这里,总共有4*4*4*2*2*2*2*2种组合。但不会使用所有组合,因为公司可能无法生产某些组合,消费者也可能不喜欢某些组合。因此,将采用选定的16种组合及其在调查中的排名。将以适当的格式加载数据集。
import pandas as pd
df=pd.read_csv('pizza_data.csv')
print(df)
现在将使用线性回归模型估计每个属性级别的影响。
import statsmodels.api as sm
import statsmodels.formula.api as smf
model='ranking ~ C(brand,Sum)+C(price,Sum)+C(weight,Sum)
+C(crust,Sum)+C(cheese,Sum)+C(size,Sum)+C(toppings,Sum)+C(spicy,Sum)'
model_fit=smf.ols(model,data=df).fit()
print(model_fit.summary())
可以使用R平方、p值等参数来分析模型的拟合度。每个属性级别的系数定义了其对整体选择模型的影响。
现在,将创建联合属性列表。
conjoint_attributes = ['brand','price','weight','crust','cheese','size','toppings','spicy']
在继续之前,需要了解这些联合分析术语:
相对重要性:它描述了在购买时哪些属性更重要或不重要。例如,手机的相对重要性可能是品牌30%,价格30%,尺寸20%,电池寿命10%,颜色10%。
部分价值/效用值:属性级别对受访者所具有的权重。这些因素导致产品对消费者的总体价值。
接下来,将构建部分价值信息,并计算属性级别的重要性。
level_name = []
part_worth = []
part_worth_range = []
important_levels = {}
end = 1 # Initialize index for coefficient in params
for item in conjoint_attributes:
nlevels = len(list(np.unique(df[item])))
level_name.append(list(np.unique(df[item])))
begin = end
end = begin + nlevels -1
new_part_worth = list(model_fit.params[begin:end])
new_part_worth.append((-1)*sum(new_part_worth))
important_levels[item] = np.argmax(new_part_worth)
part_worth.append(new_part_worth)
print(item)
#print(part_worth)
part_worth_range.append(max(new_part_worth) - min(new_part_worth))
# next iteration
print("-------------------------------------------------------------")
print("level name:")
print(level_name)
print("npw with sum element:")
print(new_part_worth)
print("imp level:")
print(important_levels)
print("part worth:")
print(part_worth)
print("part_worth_range:")
print(part_worth_range)
print(len(part_worth))
print("important levels:")
print(important_levels)
现在,将计算每个属性的重要性。
attribute_importance = []
for i in part_worth_range:
#print(i)
attribute_importance.append(round(100*(i/sum(part_worth_range)),2))
print(attribute_importance)
现在,将计算每个属性级别的部分价值。
part_worth_dict={}
attrib_level={}
for item,i in zip(conjoint_attributes,range(0,len(conjoint_attributes))):
print("Attribute :",item)
print(" Relative importance of attribute ",attribute_importance[i])
print(" Level wise part worths: ")
for j in range(0,len(level_name[i])):
print(i)
print(j)
print(" {}:{}".format(level_name[i][j],part_worth[i][j]))
part_worth_dict[level_name[i][j]]=part_worth[i][j]
attrib_level[item]=(level_name[i])
#print(j)
part_worth_dict
在下一步中,将绘制属性的相对重要性。
plt.figure(figsize=(10,5))
sns.barplot(x=conjoint_attributes,y=attribute_importance)
plt.title('Relative importance of attributes')
plt.xlabel('Attributes')
plt.ylabel('Importance')
可以看到,重量是相对重要性最高的属性,达到51%,其次是外壳16%和配料10%。品牌、奶酪和尺寸是相对重要性最低的属性,各为2.38%。
现在,将计算每个配置文件的效用分数。
utility = []
for i in range(df.shape[0]):
score = part_worth_dict[df['brand'][i]]+part_worth_dict[df['price'][I]]
+part_worth_dict[df['weight'][i]]+part_worth_dict[df['crust'][i]]
+part_worth_dict[df['cheese'][i]]+part_worth_dict[df['size'][I]]
+part_worth_dict[df['toppings'][i]]+part_worth_dict[df['spicy'][i]]
utility.append(score)
df['utility'] = utility
utility
绘制效用分数,可以看到组合9的效用最高,其次是组合13和5。组合14是最不受欢迎的,因为它具有最负的效用分数。
现在,将找到效用最高的组合。
print("The profile that has the highest utility score :",'\n', df.iloc[np.argmax(utility)])
for i,j in zip(attrib_level.keys(),range(0,len(conjoint_attributes))):
#print(i)
#level_name[j]
print("Preferred level in {} is :: {}".format(i,level_name[j][important_levels[i]]))