您好,我想将下面的交易数据转换成矩阵来计算客户在不同日期下订单的频率。
我基本上是想根据 2 年的交易数据弄清楚。 客户 ID 购买了多少天。
例如,客户 ID 17850 有频率下面数据集中的 1(它在当天购买了不同的物品,如您在交易数据中所见)。
我正在尝试 TABULATE,但不确定如何得出单个 customerID 的行和频率(基于唯一日期)。
制表结果示例(基于唯一日期,而不是行!):
PS:我附上了带有交易数据的excel
| 发票号码 | 股票代号 | 描述 | 数量 | 发票日期 | 单价 | 客户ID | 国家 |
| 536365 | 85123A | 白色挂心T型灯座 | 6个 | 1/12/2010 8:26 | 2.55 | 17850 | 英国 |
| 536365 | 71053 | 白色金属灯笼 | 6个 | 1/12/2010 8:26 | 3.39 | 17850 | 英国 |
| 536365 | 84406B | 奶油色丘比特之心衣架 | 8个 | 1/12/2010 8:26 | 2.75 | 17850 | 英国 |
| 536365 | 84029G | 针织联盟旗帜热水瓶 | 6个 | 1/12/2010 8:26 | 3.39 | 17850 | 英国 |
| 536365 | 84029E | 红色 WOOLLY HOTTIE 白色心形。 | 6个 | 1/12/2010 8:26 | 3.39 | 17850 | 英国 |
| 536365 | 22752 | 7 件套巴布什卡巢箱 | 2个 | 1/12/2010 8:26 | 7.65 | 17850 | 英国 |
| 536365 | 21730 | 玻璃星星磨砂 T 型灯座 | 6个 | 1/12/2010 8:26 | 4.25 | 17850 | 英国 |
| 536366 | 22633 | 暖手器联盟杰克 | 6个 | 1/12/2010 8:28 | 1.85 | 17850 | 英国 |
| 536366 | 22632 | 暖手器红色圆点 | 6个 | 1/12/2010 8:28 | 1.85 | 17850 | 英国 |
| 536367 | 84879 | 各种颜色的小鸟装饰品 | 32 | 1/12/2010 8:34 | 1.69 | 13047 | 英国 |
| 536367 | 22745 | 波比的剧场卧室 | 6个 | 1/12/2010 8:34 | 2.1 | 13047 | 英国 |
| 536367 | 22748 | 波比的剧场厨房 | 6个 | 1/12/2010 8:34 | 2.1 | 13047 | 英国 |
| 536367 | 22749 | FELTCRAFT 夏洛特公主娃娃 | 8个 | 1/12/2010 8:34 | 3.75 | 13047 | 英国 |
| 536367 | 22310 | 象牙色针织马克杯 COSY | 6个 | 1/12/2010 8:34 | 1.65 | 13047 | 英国 |
| 536367 | 84969 | 一盒 6 种不同颜色的茶匙 | 6个 | 1/12/2010 8:34 | 4.25 | 13047 | 英国 |
| 536367 | 22623 | 一盒复古拼图积木 | 3个 | 1/12/2010 8:34 | 4.95 | 13047 | 英国 |
| 536367 | 22622 | 一盒复古字母积木 | 2个 | 1/12/2010 8:34 | 9.95 | 13047 | 英国 |
| 536367 | 21754 | 家庭积木词 | 3个 | 1/12/2010 8:34 | 5.95 | 13047 | 英国 |
| 536367 | 21755 | 爱积木词 | 3个 | 1/12/2010 8:34 | 5.95 | 13047 | 英国 |
| 536367 | 21777 | 金属心形食谱盒 | 4个 | 1/12/2010 8:34 | 7.95 | 13047 | 英国 |
| 536367 | 48187 | 门垫新英格兰 | 4个 | 1/12/2010 8:34 | 7.95 | 13047 | 英国 |
| 536368 | 22960 | 带罐子的果酱制作套装 | 6个 | 1/12/2010 8:34 | 4.25 | 13047 | 英国 |
| 536368 | 22913 | 红色衣架巴黎时尚 | 3个 | 1/12/2010 8:34 | 4.95 | 13047 | 英国 |
| 536368 | 22912 | 黄色衣架巴黎时尚 | 3个 | 1/12/2010 8:34 | 4.95 | 13047 | 英国 |
| 536368 | 22914 | 蓝色衣架巴黎时尚 | 3个 | 1/12/2010 8:34 | 4.95 | 13047 | 英国 |
| 536369 | 21756 | 浴室积木词 | 3个 | 1/12/2010 8:35 | 5.95 | 13047 | 英国 |
| 536370 | 22728 | 闹钟烘焙粉红色 | 24 | 1/12/2010 8:45 | 3.75 | 12583 | 法国 |
| 536370 | 22727 | 闹钟烘焙红 | 24 | 1/12/2010 8:45 | 3.75 | 12583 | 法国 |
| 536370 | 22726 | 绿色闹钟 | 12 | 1/12/2010 8:45 | 3.75 | 12583 | 法国 |
| 536370 | 21724 | 熊猫和兔子贴纸 | 12 | 1/12/2010 8:45 | 0.85 | 12583 | 法国 |
| 536370 | 21883 | 星星礼品胶带 | 24 | 1/12/2010 8:45 | 0.65 | 12583 | 法国 |
另一种方法来做到这一点。首先,正如 Jim 所说,更改客户 ID(更改为 Nominal 或 Ordinal)。通过将当前 InvoiceDate 更改为 Character Nominal 变量来创建新的日期列。使用 Left (Invoice Date,10) 创建一个新的日期列 - 这会去掉时间。然后使用 Tabulate,客户 ID 后跟新的日期列(均为行)。在红色箭头处,制作成数据表。
然后,使用公式 Column Number (date, by Customer ID) 创建一个新列。这给出了每个客户下订单的不同天数。
您的问题的解决方案非常简单。您可以轻松地以交互方式或作为脚本执行此操作。 这些步骤都可以在介绍性 JMP 文档中找到,我建议您花时间阅读这些文档。它会让您对可用的不同组件有一个很好的了解。
帮助==>书籍==>使用JMP
交互的:
1. 从 JMP 打开 Excel 文件
文件==>打开
2. CustomerID 作为数字/连续列打开。它需要是一个序数值。
3. InvoiceDate 列的格式设置为同时显示时间部分。您希望将 InvoiceDate 作为单独的几天处理,而不是几天内的时间,因此更改打开该列的列信息并将格式更改为“d/m/y”
4. 要将每个 CustomerID/InvoiceDate 的数据汇总到一行,请运行
表格==>总结
将 CustomerID 和 InvoiceDate 都放入组选择中,然后单击确定
5. 现在要将每个 CustomerID 汇总到一行,针对新创建的表再次运行汇总平台
表格==>总结
将 CustomerID 列放入组选择中,然后单击确定
结果表将包含您请求的值
下面的脚本基本上是通过交互式运行上述步骤生成的,然后将每个步骤的脚本保存到脚本窗口中。我只写了下面代码的一小部分。JMP 生成了它。
names default to here(1);
// Open the Excel file
dt=Open(
// Change the below to the path to the Excel File
"<PATH to="" folder="">\Online Retail.xlsx");
// The CustomerID should not be treated as a continuous,
// analytical column of data, so
// Change CustomerID to an Ordinal Modeling Type
dt:CustomerID<<MODELING type="">Tabulate
// which will allow for the Calculation of the
// counts of the number of different InvoiceDates
dtSum1 << Tabulate(
Show Control Panel( 0 ),
Include missing for grouping columns( 1 ),
Add Table(
Column Table( Analysis Columns( :InvoiceDate ), Statistics( N ) ),
Row Table( Grouping Columns( :CustomerID ) )
)
);
// Or
// Run the Summary Platform again, but this time run it on
// the current Summarized data table to count the number of
// rows for each CustomerID
dtSum2 = dtSum1 << Summary(
Group( :CustomerID ),
Freq( "None" ),
Weight( "None" ),
Link to original data table( 0 )
);
// Now Clean up the N Rows name to # of Invoiced Days
dtSum2:N Rows << set name("# of Invoiced Days");</MODELING></PATH>