需求如下:
(1)已知:数据集1
规则编号 前项产品 后项产品 可信度
1 A&B C 90%
2 A D 80%
3 A C 70%
4 A E 65%
5 A F 50%
6 B A 55%
7 B C 65%
8 B D 60%
9 B E 40%
10 C D 75%
11 B&C D 80%
…… …… ……
(2)已知:数据2:
一个客户一个产品一条记录
客户ID 购买产品
1 A
1 B
2 B
2 C
2 D
…… ……
处理说明:
1、数据2的长表转变成最终结果的宽表(用0,1标识是否购买了某个产品)
2、依据数据集1的规则,在数据2的基础上给出每个客户最多3个推荐产品及相应的可信度,计算方法如下:
第一步:先根据数据2中每个客户购买的产品从数据1中找出满足条件的规则(以客户1为例,即那些前项产品被客户1购买过的规则,也就是有前向产品是A、B、A&B的规则):
规则编号 前项产品 后项产品 可信度
1 A&B C 90%
2 A D 80%
3 A C 70%
4 A E 65%
5 A F 50%
6 B A 55%
7 B C 65%
8 B D 60%
9 B E 40%
第二步:剔除掉该客户已经购买过的规则(即规则中后项产品已经被购买过的记录),如客户1已经购买过A和B产品,那么就需要剔除第6条规则。
规则编号 前项产品 后项产品 可信度
1 A&B C 90%
2 A D 80%
3 A C 70%
4 A E 65%
5 A F 50%
6 B A 55%
7 B C 65%
8 B D 60%
9 B E 40%
第三步:对剩下的规则按照可信度进行从高到底排序,如果后项产品有重复的规则只保留可信度最高的那一条。最后筛选出排名前3条的规则(如果满足条件的规则数少于3条,就筛选实际条数的规则):
规则编号 前项产品 后项产品 可信度
1 A&B C 90%
2 A D 80%
4 A E 65%
客户ID 是否购买A 是否购买B 是否购买C 是否购买D 推荐购买产品1 购买可信度1 推荐购买产品2 购买可信度2 推荐购买产品3 购买可信度3
1 1 1 0 0 C 90% D 80% E 65%作者: shiyiming 时间: 2010-9-16 23:55 标题: Re: 求助:一个比较复杂的数据处理问题 [code:1dptkipx]data a;
input r fp $ lp $ rel percent8.0;
cards;
1 A&B C 90%
2 A D 80%
3 A C 70%
4 A E 65%
5 A F 50%
6 B A 55%
7 B C 65%
8 B D 60%
9 B E 40%
10 C D 75%
11 B&C D 80%
;
data b;
input id p $;
cards;
1 A
1 B
2 B
2 C
2 D
;
run;
proc sort data=b;
by id p;
run;
data b1(drop=p);
set b;
by id p;
if first.id then do;
fa='';fb='';fc='';fd='';
retain fa fb fc fd ;
end;
if p='A' then fA=1;
else if p='B' then fB=1;
else if p='C' then fC=1;
else if p='D' then fD=1;
if last.id=1;
RUN;
proc sql;
create table a1 as
select *
from (select *,max(rel) as max_rel,(max(rel)=rel) as m_r
from a
where fp in (select p from b where id=1)
or (substr(fp,1,1) in (select p from b where substr(fp,2,1)='&' and id=1)
and substr(fp,3,1) in (select p from b where substr(fp,2,1)='&' and id=1))
group by lp)
order by max_rel desc,lp,rel desc;
quit;
data a2(drop=max_rel m_r rank); set a1; by descending max_rel lp descending rel ;
rank+m_r;
if rank<=3 and first.lp;
run;
data a3(drop=r fp lp rel); retain id 1;set a2; retain lc relc ld reld le rele;
if lp='C' then do; lc=lp; relc=rel; end;
if lp='D' then do; ld=lp; reld=rel; end;
if lp='E' then do; le=lp; rele=rel; end;
if _n_=3;
run;
proc sql;
create table final as
select b1.*,a3.*
from b1 left join a3
on b1.id=a3.id
where b1.id=a3.id;
quit;[/code:1dptkipx]