一篇几年前数据仓库与商务智能的课程大作业,主要涵盖使用SQL Server BI进行数据仓库的设计和装载、多维分析。
另一作者:Katherine
分析工具:SQL Server BI 2008、Excel
关于数据仓库的理论和SQL Server BI 的使用推荐慕课网 西南财经大学李瑾坤副教授的商务智能。
原始数据:数据为浙江省温州市鹿城区2011年11月1日到20日公共自行车借还数据记录表,包括字段如下:
字段 | 示例数据 |
No. | 1 |
车号 | WZB000036 |
车号SN | 36 |
借出车站 | 区政府西 |
借出车站号 | 17 |
借车锁桩号 | 1 |
借车时刻 | 2012/11/1 5:59:38 |
归还车站 | 县前头 |
还车车站号 | 64 |
还车锁桩号 | 20 |
还车时刻 | 2012/11/1 6:03:42 |
用车时间 | 4 |
用车方式 | 会员卡借车 |
卡类型 | 普通会员卡 |
借车卡SN | 324408 |
1. 分析目标
(1)每个站点在不同时间段的借出次数、还入次数;
(2)每个时间段人们的用车频率,以小时、时段、天、月为单位;
(3)每辆车在一定时间段内的累计使用时长及总使用时长;
(4)每个桩在一定时间段内的累计使用频次及总使用次数;
(5)每个客户的用车偏好性:平均用车时间、高频用车时间点等。
2. 多维分析模型设计
设置度量值为用车时间、借车次数和还车次数,其中用车时间直接使用原始数据集中的“用车时间”属性,单位是分钟;借车次数、还车次数应用多维分析模型“事实表计数”功能实现。
维度包括站点、借车时间、还车时间、借车卡、自行车这5个维度。
维度 | 维度层次 |
站点 | 站点编号、车桩编号 |
借车时间 | 借车时刻、借车小时、借车时段、借车日期、借车月份 |
换车时间 | 还车时刻、还车小时、还车时段、还车日期、还车月份 |
借车卡 | 卡类型、卡号 |
自行车 | 自行车编号 |
注:借车时段及还车时段的划分如下:6~9时为上午,10~14时为中午,1~20时为下午,其余为夜晚。
3. 数据仓库设计
数据仓库包括一个事实表、四个维度表。
事实表:
记录编号仅作主键,不参与多维分析;自行车编号、车桩编号、借车卡号分别对应自行车、车桩、借车卡维度表;用车时间为一个度量值。
各维度表:
车桩号指的是某个站点的第几个车桩,如15表示第15号车桩;车桩编号的构成是“站点编号+车桩号”,如“100第10号”表示第100号站点第10号车桩;站点编号对应站点维度表。
表关系图:
4. 数据装载
建立名称为LoadBicycleDM的Integration Service项目,新建两个连接管理器,Localhost.Bicycle和Localhost.BicycleDM,分别对应OLEDB源和OLE DB目标。在控制流面板中插入数据流任务如下:
装载借车卡表:
图片太小看不清,OLE DB源中的数据访问模式为SQL命令:select distinct(借车卡SN),卡类型 from [Bicycle].[dbo].[Bicycle] order by 借车卡SN
装载自行车表:
SQL命令:select distinct(车号SN),车号 from [Bicycle].[dbo].[Bicycle] order by 车号SN
装载站点表:
SQL命令:select 借出车站号,借出车站,COUNT(distinct([借车锁桩号])) as 车桩数 from [Bicycle].[dbo].[Bicycle] group by 借出车站号,借出车站
装载车桩表:
数据转换:装载事实表:
运行数据装载
5. 多维分析
建立名称为BicycleAS的Analysis Service项目,新建数据源为已建好的数据仓库,名称为BicycleDM.ds。
根据数据源建立数据源视图,名称为Bicycle.dsv,并做如下修改:
(1)将记录编号的逻辑主键删除,设置借车卡号、自行车编号、车桩编号、借车时刻、还车时刻为逻辑主键;
(2)在事实表中新建命名计算:借车小时、还车小时、借车时段、还车时段、借车日期、还车日期、借车月份、还车月份。代码如下:
借车小时:
convert(int,ltrim(substring(借车时刻,(charindex(':',借车时刻,5)-2),2)))
还车小时:
convert(int,ltrim(substring(还车时刻,(charindex(':',还车时刻,5)-2),2)))
借车日期:
substring(借车时刻,6,(charindex('/',借车时刻,6)-6)) + '.' + right('0'+ rtrim(substring(借车时刻,(charindex('/',借车时刻,6)+1),2)),2)
还车日期:
substring(还车时刻,6,(charindex('/',还车时刻,6)-6)) + '.' + right('0'+ rtrim(substring(还车时刻,(charindex('/',还车时刻,6)+1),2)),2)
借车时段:
case
when convert(int,ltrim(substring(借车时刻,(charindex(':',借车时刻,5)-2),2))) between 0 and 5 then '夜晚'
when convert(int,ltrim(substring(借车时刻,(charindex(':',借车时刻,5)-2),2))) between 6 and 9 then '上午'
when convert(int,ltrim(substring(借车时刻,(charindex(':',借车时刻,5)-2),2))) between 10 and 14 then '中午'
when convert(int,ltrim(substring(借车时刻,(charindex(':',借车时刻,5)-2),2))) between 15 and 20 then '下午'
when convert(int,ltrim(substring(借车时刻,(charindex(':',借车时刻,5)-2),2))) between 21 and 23 then '夜晚'
else '无'
end
还车时段:
case
when convert(int,ltrim(substring(还车时刻,(charindex(':',还车时刻,5)-2),2))) between 0 and 5 then '夜晚'
when convert(int,ltrim(substring(还车时刻,(charindex(':',还车时刻,5)-2),2))) between 6 and 9 then '上午'
when convert(int,ltrim(substring(还车时刻,(charindex(':',还车时刻,5)-2),2))) between 10 and 14 then '中午'
when convert(int,ltrim(substring(还车时刻,(charindex(':',还车时刻,5)-2),2))) between 15 and 20 then '下午'
when convert(int,ltrim(substring(还车时刻,(charindex(':',还车时刻,5)-2),2))) between 21 and 23 then '夜晚'
else '无'
end
借车月份:
substring(借车时刻,6,(charindex('/',借车时刻,6)-6)) + '月'
还车月份:
substring(还车时刻,6,(charindex('/',还车时刻,6)-6)) + '月'
构建多维数据源视图:
使用现有表建立多维数据集,名称为BicycleDM.cube。度量值表选为事实表,度量值选择用车时间和事实表计数,现有维度选择自行车、车桩、借车卡。预览图如下:
使用现有表新建借车时间维度、还车时间维度。以建立借车时间维度为例,主表选择事实表,键列选择借车时刻,不选择任何相关表,可用属性勾选借车时刻、借车小时、借车时段、借车日期、借车月份,维度名称设置为借车时间。还车时间使用相同方法建立,两者的预览图如下:
各维度属性通用设置如下:
AttributeHierarchyVisible |
True |
OrderBy |
Name |
站点编号NameColumn |
站点名称 |
自行车编号NameColumn |
车牌号 |
其余属性NameColumn |
属性自身 |
属性之间关系类型 |
刚性 |
借车时间维度的层次结构和属性关系如下:
还车时间维度的层次结构和属性关系:
借车卡维度的层次结构和属性关系:
车桩维度的层次结构和属性关系:
自行车维度没有特殊设置。
6. Excel 数据呈现
处理多维分析模型
在SQL Server中连接Analysis Service,使用Localhost服务器,在数据库目录下发现存在名为BicycleAS的数据库(如下图),证明操作成功。
打开EXCEL2016,导入来自Analysis Service的数据,使用Localhost服务器,选择BicycleAS数据库,数据显示方式选择数据透视表。
7. 结论
在11月1日到11月20日,各站点用车次数的数据透视图和频数分布图如下:
从图中可以看出,“五马美食林”“国光大厦”等6个站点用车次数遥遥领先,均在8000以上;“市二医院”“数码广场”等55个站点用车次数在4000到8000之间,处于中等水平;“新城车站”“科技馆”等119个站点用车次数在4000以下。假定在这20天中用车次数在8000以上的为高频站点,4000到6000之间的为中频站点,4000以下的为低频站点,结合温州市鹿城区公共自行车站点分布图,可的得到如下高中低频站点分布图:
管理部门可根据各站点的分布和用车频次的相对大小,合理分配资源,提高公共自行车网络运行效率,如按实际情况增减站点的车桩个数,高频站点配备较多的车桩,低频站点配备较少的车桩。
下图为各小时借车频次分布图:
从图中可以看出,按小时分布的借车频次存在两个峰值,分别位于上午8-9时和下午17-18时,与人们上下班时间相符,交通部门可据此在这两个时段内合理指挥交通,尽量避免自行车和机动车的行驶冲突。此外,晚上21时到次日6时借车次数接近于0,管理部门可利用这个时间段对公共自行车进行检查、维修、更换、调度等工作。
从11月1日到11月20日,各量自行车用车时间统计图如下:
从图中可以看出,大部分自行车的累计使用时间在1000到3000分钟之间。高于3000分钟的车辆因为使用时间长,可能面临提前报废的风险,而低于1000分钟的车辆可能是由于自身出现问题,导致骑行功能降低甚至无法骑行。管理部门可以据此识别出这些车辆,并只对这些车辆进行检测和维修,从而有效降低运营成本。
计算每一趟单车出行的使用时长,统计得出的用车时长频数分布如上图所示。从图中可以看出,大部分单车出行的时长在10分钟到30分钟这个区间内,有少数人骑行超过2小时。共享单车行业主打绿色低碳,在提供设施的同时,配套地推出鼓励使用单车出行的优惠政策,有利于企业提升软实力。根据用车时长,企业经营者可以合理定价,鼓励人们更多地使用单车出行,比如:对于骑行超过1小时的用户,可以减免一定的使用费用,从而达到鼓励人们使用自行车,推广单车共享行业的目的。