飞机被认为是迄今为止最安全、高效的交通工具。如何在给顾客提供优质服务的同时保障利益最大化,这个间题时刻困扰着航空公司。为了解决这一问题, 可以
使用Hive 对客户进行分群,如重要保持客户、重要发展客户、重要挽留客户、一般客户和低价值客户
再针对不同的客户群体制定相应的优惠政策来实现利益最大化。
本任务通过对Hive数据分析知识的学习, 最终实现基于Hive 的航空公司客户价值数据预处理与分析。
精准化运营的基础是客户关系管理与维护,客户关系管理的核心是客户分类,对不同的客户群体开展不同的个性化服务,将有限的资源合理地分配给不同价值的客户,从而实现效益最大化。
本教程使用的数据集包含 68 828 条数据,有44个字段。主要字段如下表所示:



create database air_data;
use air_data;
create table air_table(
member_no string,
ffp_date string,
first_flight_date string,
gender string,
ffp_tier int,
work_city string,
work_province string,
work_country string,
age int,
load_time string,
flight_count int,
bp_sum bigint,
ep_sum_yr_1 int,
ep_sum_yr_2 bigint,
sum_yr_1 bigint,
sum_yr_2 bigint,
seg_km_sum bigint,
weighted_seg_km double,
last_flight_date string,
avg_flight_count double,
avg_bp_sum double,
begin_to_first int,
last_to_end int,
avg_interval float,
max_interval int,
add_points_sum_yr_1 bigint,
add_points_sum_yr_2 bigint,
exchange_count int,
avg_discount float,
p1y_flight_count int,
l1y_flight_count int,
p1y_bp_sum bigint,
1y_bp_sum bigint,
ep_sum bigint,
add_point_sum bigint,
eli_add_point_sum bigint,
l1y_eli_add_points bigint,
points_sum bigint,
l1y_points_sum float,
ration_l1y_flight_count float,
ration_p1y_flight_count float,
ration_p1y_bps float,
ration_l1y_bps float,
point_notflight int )
row format delimited fields terminated by ',';

load data local inpath '/root/hivedata/data/air_data.csv' overwrite into table air_table;
select * from air_table limit 10;

统计观测窗口内的票价收入(sum_yr_l)、观测窗口内的总飞行公里数(seg_km_sum)和平均折扣率(avg_discount)三个字段的空记录,并将结果保存到名为count_null的表中,命令如下。
create table count_null as select * from
(select count(*) as sum_yr_1_null_count from air_table where sum_yr_1 is null)
sum_yr_1,
(select count(*) as seg_km_sum_null from air_table where seg_km_sum is null)
seg_km_sum,
(select count(*) as avg_discount_null from air_table where avg_discount is null)
avg_discount;
select * from count_null;



统计出观测窗口内的票价收入(sum_yr_l)、观测窗口内的总飞行公里数(seg_km_sum)和平均折扣率(avg_discount)三个字段的最小值并保存到count_min表中,命令如下。
create table count_min as select
min(sum_yr_1) sum_yr_1,
min(seg_km_sum) seg_km_sum,
min(avg_discount) avg_discount
from air_table;
select * from count_min;


通过对数据的分析可以发现数据中存在缺失值,但缺失值占总体数据的比例较小,所以直接将缺失值过滤掉,分别过滤掉票价为空的记录,平均折扣率为0 的记录,票价为0、平均折扣率不为0、总飞行公里数大于0 的记录。
create table sum_yr_1_notnull as
select * from air_table where
sum_yr_1 is not null;

create table avg_discount_not_0 as
select *
from sum_yr_1_notnull
where
avg_discount <> 0;

create table sas_not_0 as
select * from avg_discount_not_0
where !(sum_yr_1=0 and avg_discount <> 0
and seg_km_sum > 0);

为了建立LRFMC模型,从清洗后的数据中集中选择与指标相关的六个属性:ffp_date、load_time、flight_count、seg_km_sum、 avg_discount、 last_to_end
create table flfasl as
select
ffp_date,
load_time,
flight_count,
avg_discount,
seg_km_sum,
last_to_end
from sas_not_0;

select * from flfasl limit 10;

将数据转换为适当的格式,使其能够满足挖掘任务和算法的需要构造LRFMC的五个指标
会员入会距离观测窗口结束的月数=观测窗口的结束时间-入会时间 【单位:月】L = load_time-ffp_date
会员最近一次乘坐飞机的时间距离观测窗口结束的月数=最后一次乘机至观测窗口结束时长
R=last_to_end
会员在观测窗口内乘坐飞机的次数=观测窗口内的飞行次数【单位:次】
F = flight_count
会员在观测窗口内累积的飞行距离里程=观测窗口内的总飞行公里数【单位:公里】
M=seg_km_sum
会员在观测窗口内乘坐的舱位所对应的折扣系数的平均值=平均折扣率【单位:无】
C = avg_discount
根据以上公式对规约后的数据进行计算,得到LRFMC
create table lrfmc as select
round((unix_timestamp(LOAD_TIME,'yyyy/MM/dd')-unix_timestamp(FFP_DATE,'yyyy/MM/dd'))/(30*24*60*60),2) as l,
round(last_to_end/30,2) as r,
FLIGHT_COUNT as f,
SEG_KM_SUM as m,
round(AVG_DISCOUNT,2) as c
from flfasl;

对数据进行标准化操作,公式为 标准化值=(x-min(x))/(max(x)-min(x)) 将标准化后的数据保存到名为 standardlrfmc的表中
create table standardlrfmc as
select (lrfmc.l-minlrfmc.l)/(maxlrfmc.l-minlrfmc.l) as l,
(lrfmc.r-minlrfmc.r)/(maxlrfmc.r-minlrfmc.r) as r,
(lrfmc.f-minlrfmc.f)/(maxlrfmc.f-minlrfmc.f) as f,
(lrfmc.m-minlrfmc.m)/(maxlrfmc.m-minlrfmc.m) as m,
(lrfmc.c-minlrfmc.c)/(maxlrfmc.c-minlrfmc.c) as c
from lrfmc,
(select max(l) as l,
max(r) as r,
max(f) as f,
max(m) as m,
max(c) as c from lrfmc) as maxlrfmc,
(select min(l) as l,
min(r) as r,
min(f) as f,
min(m) as m,
min(c) as c from lrfmc) as minlrfmc;

将标准化后的数据导出到本地的standardlrfmc.csv中并使用逗号作为分隔符
hive -e "insert overwrite local directory '/root/hivedata/data/standardlrfmc' row format delimited fields terminated by ',' select * from air_data.standardlrfmc;"


import pandas as pd
from sklearn.cluster import KMeans
dt=pd.read_csv("standardlrfmc.csv",encoding='UTF-8')
dt.columns=['L','R','F','M','C']
model=KMeans(n_clusters=5)
model.fit(dt)
r1=pd.Series(model.labels_).value_counts()
r2=pd.DataFrame(model.cluster_centers_)
r=pd.concat([r2,r1],axis=1)
r.columns=list(dt.columns)+['Clustercategory']
print(r)

- 根据聚类中心结果,再结合航空公司的业务逻辑,可得到如下结果
注意
命令的使用与输入
文件路径的引用
建表字段的顺序
我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
如何使用RSpec::Core::RakeTask初始化RSpecRake任务?require'rspec/core/rake_task'RSpec::Core::RakeTask.newdo|t|#whatdoIputinhere?endInitialize函数记录在http://rubydoc.info/github/rspec/rspec-core/RSpec/Core/RakeTask#initialize-instance_method没有很好的记录;它只是说:-(RakeTask)initialize(*args,&task_block)AnewinstanceofRake
有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳
我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD
本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01 客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02 数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit
文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co
我正在尝试在Rails上安装ruby,到目前为止一切都已安装,但是当我尝试使用rakedb:create创建数据库时,我收到一个奇怪的错误:dyld:lazysymbolbindingfailed:Symbolnotfound:_mysql_get_client_infoReferencedfrom:/Library/Ruby/Gems/1.8/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundleExpectedin:flatnamespacedyld:Symbolnotfound:_mysql_get_client_infoReferencedf
文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,