关于信用控制项目数据处理的过程:
1、业务方提交的是txt文本格式数据。
2、检查源数据内是否有特殊符号,我的做法是使用ue替换所有的逗号,最后使用逗号作为列的分割符
3、将处理过的源数据导入access,都使用varchar类型,避免导入时出现格式问题。
4、将access格式数据,检查没问题后,导出txt文本格式,以逗号作为分割符。
5、将导出的txt文本数据,使用sqlldr导入oracle
注意:创建控制文件,使用sqlldr命令和对应参数,不要加bad文件参数,容易出权限问题,导入oracle。
6、使用update或decode函数,对表内数据的所有汉字的名称,都替换成编号,如品牌列的神州行,替换成1等。
7、处理异常数据,如?、-等类的数据,我的处理方式是如果该列为数值列,则替换成0,如果是名称列,如品牌列,异常数据替换成一个不可能出现的编号,如99。
8、处理数据类型,使用ctas(create table as select where 1=2)sql命令,创建一个新表,将源表的结构导入,注意:这里只导结构,不导数据,因为修改列的属性时,oracle规定该列必须为空列。
9、修改列的数据类型,使用“alter talbe XX modify (xx number(2));”sql语句,修改列的数据类型,注意:这里只修改number和varchar的,日期列先不用管。
10、将源表数据导入,使用“insert into table select * from table;”sql语句,将所有数据导入处理完数据类型的表内。
11、处理日期类型数据,在该表上创建一个临时列“alter table XX add clumnXX date;”,然后使用将该表内原来的日期列的数据导入该临时列,“update tableXX set column_temp = to_date(column_old,'yyyy-mm-dd')”
12、使用ctas创建新表,将处理完数据类型的表内的所有数据导入,“create table XX as select id,column_temp from tableXX;”,注意:这里导入新表的是处理过日期类型的数据列,即上文的column_temp
13、这张新表内的数据,就是我们所需要的最终完成的表。
14、有时,我们需要对日期数据转换成距离当前日期的月数,(更好的办法是使用ctas查询出来插入一个新表内)
先在源表创建一个临时列,将源日期列计算成距离当前日期的月数,更新到到临时列
“update mobile_main_target_1 m
2 set in_net_date2 =
3 (select trunc(months_between(sysdate,in_net_date)+0.99)
4 from mobile_main_target_1
5 where user_id = m.user_id);”
15、将需要的列,插入到一个新表内,“create table XX as select column1,column_old column_new,column2 from tableXX;”
16、对源数据进行随机抽样,使用sample函数“select * from tableXX sample(10%)”,随机抽取10%的数据
17、还有可能需要将数据从oracle导出指定格式csv文件:
18、对数据取中位数,select case when call_num > median(call_mum) then 1 else 0 end "dist_call_num",call_billing_duration from tableXX group by case when call_num > median(call_num) then 1 else 0 end ,cust_status;
19、计算所有数值列(离散数据列)的数据排名,并插入一个新表中,查看其分布情况
create table XXX
as
select user_id,city_id,round(cume_dist() over (partition by 1 order by XXXX)*100) dist_XXXX
from mobile_XX
where XXXX>0;
20、如果最终数据的分布不理想的话,例如通话次数列,为0的值太多,有可能需要将0对应的排名值修改为0,不作为计算用户属性加权值来考虑。
21、21、分别计算风险group和收益group内指定列的排名,并分别统计出相应列的最大排名和最小排名,参见附件内的”风险group”sheet和“收益group”sheet。
21-1.
第一条语句跑出来的min值,是第二条语句要减的值:CUME_DIST
- 58
21-2.
表名换成你自己的
21-3.
替换:第一条语句:替换customized_service_num
--第二条语句:替换customized_service_num
和四个要减的值
/*
select
min(cume_dist),max(cume_dist)
from
(select
round(cume_dist() over(partition by 1 order by
customized_service_num)*100) cume_dist from mobile_target
);
22、根据步骤7得出的指定列的最大排名和最小排名,计算该用户的数据分档;
--假设第一条sql计算得出customized_service_num列的min=58,max=100;
*/
--
分组范围
/*
select
round((CUME_DIST - 58) / (100 - 58) * 10),
min(customized_service_num),
max(customized_service_num),
count(*)
from (select t.*,
round(CUME_DIST() OVER(PARTITION BY 1 ORDER BY
customized_service_num) * 100) CUME_DIST
from mobile_target t)
where 1 = 1
group by round((CUME_DIST - 58) / (100 - 58) * 10)
order
by 1;
*/
23、根据排名值来画boston图,划分为高收益、高风险,高收益、低风险,低收益、高风险,低收益、低风险等区间,在经过对数据分布的聚集区进行放大,逐步得到数值列的评分和分档,如入网时长在3个月以内评多少分,6个月以内评多少分等,然后根据这个计算出每个用户每项属性的得分情况(一般,这里的得分都换算成0-10之间的分值)。
24、然后根据boston图计算每项用户属性的收益加权值和风险加权值,如针对品牌,最高给予10%的加权值,例如,如果是全球通用户加权10%,动感地带用户加权4%,神州行用户加权0等。
25、根据每项用户属性的加权值,计算该用户的风险总得分和收益总得分,计算方式为:如果是正接近风险得分或收益得分的,则收益总得分或风险总得分=每项用户属性收益或风险得分*对应的加权值;如果是反接近的,则计算方式为风险总得分=(10-该项用户属性得分)*加权值;
26、根据之前的boston图,我们可以统计出多少分-多少分属于风险或收益的区间,例如风险总得分在4分以下低风险,5-7分属于高风险,5分以下属于低收益区间等等。
27、根据每个用户的风险总得分和收益总得分,将用户群体划分成多个区间,例如,统计高收益的用户数有多少,中收益用户数有多少,及高风险区间的用户数有多少等,我们根据每个用户的风险总得分和收益总得分,可以知道每个用户所属的收益和风险区间。
28、根据每个用户的收益和风险总得分,我们可以统计出针对某个用户属性的分类,例如,风险得分<=6且状态为正常的用户数占风险得分<=6的总用户数的百分比,风险得分>=4的且状态为预停机的用户数占风险得分>=4的总用户数的百分比
29、我们可以根据这些得分情况,来判断某个客户群体的收益和风险情况,进而决定哪些用户群体能是最重要的,是需要给予优惠的。