根据客户对营销调查问题的回答创建差异矩阵

2024-07-05 12:10:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前有一个数据集,其中包含了对每个购买了产品a、b、c和d的客户的调查响应。我的目标是在从1到7的不同产品整数之间开发一个差异矩阵,目标是创建产品的感知图。作为一个起点,我用了一个问题“当你购买时,你最认真考虑的产品是什么?”然后我发现在购买产品A、B、C和D.时,考虑其他产品的顾客的百分比

注意:这些数字不必为每种产品相加,因为客户可以指定其他产品,如e。但是,只有b、c和d是产品a的竞争对手,因此其余部分被忽略(但作为计算百分比总数的一部分)。换句话说,如果选择产品a的10个客户中有3个最认真地考虑b作为替代品,那么a行和b列对应的单元格将为0.3

为了通用化,可以使用以下代码创建此结果的示例:

import random
import pandas as pd

# Create column and row names for each product
abcd = ['a', 'b', 'c', 'd']

# Create dissimilarity dataframe
df_expl = pd.DataFrame(columns = abcd, index= abcd)

random.seed(21)

# Generate random floats between 0.01 and 0.25 for each cell
for i in range(len(df_expl)):
    for j in range(len(df_expl.columns)):
        df_expl.iloc[i,j] = random.uniform(0.01, 0.25)

df_expl

|    |         a |         b |         c |         d |
|:---|----------:|----------:|----------:|----------:|
| a  | 0.0495879 | 0.175544  | 0.1624    | 0.124984  |
| b  | 0.0618434 | 0.200232  | 0.203885  | 0.132989  |
| c  | 0.13122   | 0.0666535 | 0.0107634 | 0.0990512 |
| d  | 0.150487  | 0.0266235 | 0.2005    | 0.0657407 |

现在,我忽略对角线中的值,因为它们在最终的相异矩阵(相异矩阵的一个属性)中为零。接下来的两个步骤是我真正使用输入的关键步骤

步骤1:MinMaxScaler 我需要将这些百分比缩放到1到7的范围,最终我决定使用MinMaxScaler。老实说,我不知道这是否是缩放数据的最佳方式

# Set new boundaries from 1 to 7
old_min = 0
old_max = np.max(np.array(df_expl))
new_min = 1
new_max = 7

# Scale data to 1 to 7 range using MinMaxScaler
scaler = MinMaxScaler(feature_range=(new_min,new_max))
scaler.fit(np.array(df_expl))

# Create scaled dissimilarity matrix containing data in 1 to 7 range
df_expl_scaled = pd.DataFrame(scaler.transform(df_expl), index = df_expl.index, columns=df_expl.columns)

# Set diagonal values to 0
for i in range(len(df_expl_scaled)):
    df_expl_scaled.iloc[i,i] = 0

df_expl_scaled

|    |       a |       b |       c |       d |
|:---|--------:|--------:|--------:|--------:|
| a  | 0       | 3.93778 | 5.78271 | 6.64288 |
| b  | 3.93778 | 0       | 4.69173 | 4       |
| c  | 5.78271 | 4.69173 | 0       | 5.43342 |
| d  | 6.64288 | 4       | 5.43342 | 0       |

步骤2:在对角线上创建对称性 由于我需要相异矩阵,我循环遍历矩阵,找到单元格[I,j]和[j,I]的平均值,然后将这些值中的每一个设置为平均值。这确保了在对角线上反映的单元格值与该单元格值相同。然后,我将对角线值重置为0,并将数字四舍五入到最接近的整数

row_arr = [0,1,2,3]

for row in row_arr:
  
    for j in range(len(df_expl_scaled)):
        # Because the similarity matrix needs to be symmetrical over the diagonal,
        # This if-loop iterates over one side of the diagonal, finds the mean between 
        # that cell and its "mirror" then sets both the cell and its "mirror" to this mean value
        if (j > row):
            mean = np.mean([df_expl_scaled.iloc[row,j], df_expl_scaled.iloc[j,row]])
            df_expl_scaled.iloc[row,j] = mean
            df_expl_scaled.iloc[j,row] = mean

for i in range(len(df_expl_scaled)):
    df_expl_scaled.iloc[i,i] = 0

|    |       a |       b |       c |       d |
|:---|--------:|--------:|--------:|--------:|
| a  | 0       | 3.93778 | 5.78271 | 6.64288 |
| b  | 3.93778 | 0       | 4.69173 | 4       |
| c  | 5.78271 | 4.69173 | 0       | 5.43342 |
| d  | 6.64288 | 4       | 5.43342 | 0       |

# Round each value to integer between 1 and 7
df_expl_mat = df_expl_scaled.astype(int)

# Display dissimilarity matrix - It turned out that I needed to "flip flop" 
# the numbers to align with a DISsimilarity matrix rather than a similarity matrix
df_expl_mat = (df_expl_mat-8)*-1


for i in range(len(df_expl_mat)):
    df_expl_mat.iloc[i,i] = 0
    
df_expl_mat

|    |   a |   b |   c |   d |
|:---|----:|----:|----:|----:|
| a  |   0 |   5 |   3 |   2 |
| b  |   5 |   0 |   4 |   4 |
| c  |   3 |   4 |   0 |   3 |
| d  |   2 |   4 |   3 |   0 |

瞧!我知道这是对我的方法的详尽描述,但这是我第一次根据调查数据构建差异矩阵。我主要关注的是上面强调的两个步骤,以及以下问题:

  • 是否有更好的方法将数据缩放到整数范围
  • 与使用两个镜像单元的简单平均值相比,是否有更好的方法使矩阵在对角线上对称
  • 我怎样才能用调查中不止一个问题的答案来做同样的事情呢
  • 如有任何其他反馈,我们将不胜感激

Tags: thetoindfforlen产品range