大数据时代-航空公司该如何转型(二)

大数据时代-航空公司该如何转型(一)icon-default.png?t=M4ADhttp://mp.weixin.qq.com/s?__biz=MzI5NDI1Njk3Nw==&mid=2247484990&idx=1&sn=be2d3267a02ec7770982094706d5cc77&chksm=ec64ee00db1367169a32d179b07517469edb47c03d526305443f3f253852295a3b4fe18f4923&scene=21#wechat_redirect

数据探索分析

从航空公司系统内的客户基本信息、乘机信息以及积分信息等详细数据中,根据末次飞行日期(LAST_FLIGHT_DATE),以2014年3月31日为结束时间,选取宽度为两年的时间段作为分析观测窗口,抽取观测窗口2012年4月1日至2014年3月31日内有乘机记录的所有客户的详细数据形成历史数据,总共62988条记录。其中包含了如会员卡号,入会时间,性别,年龄,会员卡级别,工作地城市,工作地所在省份,工作地所在国家,观测窗口结束时间,观测窗口乘机积分,飞行公里数,飞行次数,飞行时间,乘机时间间隔,平均折扣率等44个属性,如表1所示。

表1航空公司数据属性说明

属性名称

属性说明

客户基本信息

MEMBER_NO

会员卡号

FFP_DATE

入会时间

FIRST_FLIGHT_DATE

第一次飞行日期

GENDER

性别

FFP_TIER

会员卡级别

WORK_CITY

工作地城市

WORK_PROVINCE

工作地所在省份

WORK_COUNTRY

工作地所在国家

AGE

年龄

乘机信息

FLIGHT_COUNT

观测窗口内的飞行次数

LOAD_TIME

观测窗口的结束时间

LAST_TO_END

最后一次乘机时间至观测窗口结束时长

AVG_DISCOUNT

平均折扣率

SUM_YR

观测窗口的票价收入

SEG_KM_SUM

观测窗口的总飞行公里数

LAST_FLIGHT_DATE

末次飞行日期

AVG_INTERVAL

平均乘机时间间隔

MAX_INTERVAL

最大乘机间隔

积分信息

EXCHANGE_COUNT

积分兑换次数

EP_SUM

总精英积分

PROMOPTIVE_SUM

促销积分

PARTNER_SUM

合作伙伴积分

POINTS_SUM

总累计积分

POINT_NOTFLIGHT

非乘机的积分变动次数

BP_SUM

总基本积分

*数据详见:demo/data/air_data.csv

1. 描述性统计分析

通过对原始数据观察发现数据中存在票价为空值的记录,同时存在票价最小值为0、折扣率最小值为0但总飞行公里数大于0的记录。票价为空值的数据可能是客户不存在乘机记录造成。其它的数据可能是客户乘坐0折机票或者积分兑换造成。

查找每列属性观测值中空值个数、最大值、最小值,如代码清单1所示。

代码清单1数据探索

# 对数据进行基本的探索

# 返回缺失值个数以及最大最小值

import pandas as pd

datafile= '../data/air_data.csv'  # 航空原始数据,第一行为属性标签

resultfile = '../tmp/explore.csv'  # 数据探索结果表

# 读取原始数据,指定UTF-8编码(需要用文本编辑器将数据装换为UTF-8编码)

data = pd.read_csv(datafile, encoding = 'utf-8')

# 包括对数据的基本描述,percentiles参数是指定计算多少的分位数表(如1/4分位数、中位数等)

explore = data.describe(percentiles = [], include = 'all').T

# describe()函数自动计算非空值数,需要手动计算空值数

explore['null'] = len(data)-explore['count']

explore = explore[['null', 'max', 'min']]

explore.columns = [u'空值数', u'最大值', u'最小值']  # 表头重命名

'''

这里只选取部分探索结果。

describe()函数自动计算的字段有count(非空值数)、unique(唯一值数)、top(频数最高者)、

freq(最高频数)、mean(平均值)、std(方差)、min(最小值)、50%(中位数)、max(最大值)

'''

explore.to_csv(resultfile)  # 导出结果

*代码详见:demo/code/data_explore.py。

根据代码清单 71得到的探索结果见表2。

表2数据探索分析结果表

属性名称

空值记录数

最大值

最小值

SUM_YR_1

551

239560

0

SUM_YR_2

138

234188

0

SEG_KM_SUM

0

580717

368

avg_discount

0

1.5

0

2. 分布分析

分别从客户基本信息、乘机信息、积分信息3个角度进行数据探索,寻找客户的分布规律。

(1) 客户基本信息分布分析

选取客户基本信息中入会时间、性别、会员卡级别和年龄字段进行探索分析,探索客户的基本信息分布状况,如代码清单2所示。

代码清单 2 探索客户的基本信息分布状况

# 客户信息类别

# 提取会员入会年份

from datetime import datetime

ffp = data['FFP_DATE'].apply(lambda x:datetime.strptime(x,'%Y/%m/%d'))

ffp_year = ffp.map(lambda x : x.year)

# 绘制各年份会员入会人数直方图

fig = plt.figure(figsize=(8 ,5))  # 设置画布大小

plt.rcParams['font.sans-serif'] = 'SimHei'  # 设置中文显示

plt.rcParams['axes.unicode_minus'] = False

plt.hist(ffp_year, bins='auto', color='#0504aa')

plt.xlabel('年份')

plt.ylabel('入会人数')

plt.title('各年份会员入会人数')

plt.show()

plt.close

# 提取会员不同性别人数

male = pd.value_counts(data['GENDER'])['男']

female = pd.value_counts(data['GENDER'])['女']

# 绘制会员性别比例饼图

fig = plt.figure(figsize=(7 ,4))  # 设置画布大小

plt.pie([ male, female], labels=['男','女'], colors=['lightskyblue', 'lightcoral'],

       autopct='%1.1f%%')

plt.title('会员性别比例')

plt.show()

plt.close

# 提取不同级别会员的人数

lv_four = pd.value_counts(data['FFP_TIER'])[4]

lv_five = pd.value_counts(data['FFP_TIER'])[5]

lv_six = pd.value_counts(data['FFP_TIER'])[6]

# 绘制会员各级别人数条形图

fig = plt.figure(figsize=(8 ,5))  # 设置画布大小

plt.bar(left=range(3), height=[lv_four,lv_five,lv_six], width=0.4, alpha=0.8, color='skyblue')

plt.xticks([index for index in range(3)], ['4','5','6'])

plt.xlabel('会员等级')

plt.ylabel('会员人数')

plt.title('会员各级别人数')

plt.show()

plt.close()

# 提取会员年龄

age = data['AGE'].dropna()

age = age.astype('int64')

# 绘制会员年龄分布箱型图

fig = plt.figure(figsize=(5 ,10))

plt.boxplot(age,

            patch_artist=True,

            labels = ['会员年龄'],  # 设置x轴标题

            boxprops = {'facecolor':'lightblue'})  # 设置填充颜色

plt.title('会员年龄分布箱线图')

# 显示y坐标轴的底线

plt.grid(axis='y')

plt.show()

plt.close

*代码详见:demo/code/data_distribution.py。

通过代码清单2得到各年份会员入会人数直方图,如图2所示,入会人数随年份增长而增加在2012年达到最高峰。

 图2 各年份会员入会人数

通过代码清单2得到会员性别比例饼图,如图3所示,可以看出男性会员明显比女性会员多。

图 3 会员性别比例

通过代码清单2得到会员各级别人数条形图,如图4所示,可以看出绝大部分会员为4级会员,仅有少数会员为5级和6级会员。

 图4 会员各级别人数

得到会员年龄分布箱型图,如图 5所示,可以看出大部分会员年龄集中在30~50岁之间,极少量的会员年龄小于20岁或高于60岁,且存在一个超过100岁的异常数据。

 图 5会员年龄分布

(2) 客户乘机信息分布分析
 

选取最后一次乘机至结束的时长、客户乘机信息中飞行次数、总飞行公里数进行探索分析,探索客户的乘机信息分布状况,如代码清单3所示。

代码清单3探索客户乘机信息分布状况

lte = data['LAST_TO_END']

fc = data['FLIGHT_COUNT']

sks = data['SEG_KM_SUM']

# 绘制最后乘机至结束时长箱线图

fig = plt.figure(figsize=(5 ,8))

plt.boxplot(lte,

            patch_artist=True,

            labels = ['时长'],  # 设置x轴标题

            boxprops = {'facecolor':'lightblue'})  # 设置填充颜色

plt.title('会员最后乘机至结束时长分布箱线图')

# 显示y坐标轴的底线

plt.grid(axis='y')

plt.show()

plt.close

# 绘制客户飞行次数箱线图

fig = plt.figure(figsize=(5 ,8))

plt.boxplot(fc,

            patch_artist=True,

            labels = ['飞行次数'],  # 设置x轴标题

            boxprops = {'facecolor':'lightblue'})  # 设置填充颜色

plt.title('会员飞行次数分布箱线图')

# 显示y坐标轴的底线

plt.grid(axis='y')

plt.show()

plt.close

# 绘制客户总飞行公里数箱线图

fig = plt.figure(figsize=(5 ,10))

plt.boxplot(sks,

            patch_artist=True,

            labels = ['总飞行公里数'],  # 设置x轴标题

            boxprops = {'facecolor':'lightblue'})  # 设置填充颜色

plt.title('客户总飞行公里数箱线图')

# 显示y坐标轴的底线

plt.grid(axis='y')

plt.show()

plt.close

*代码详见:demo/code/data_distribution.py。

通过代码清单3得到客户最后一次乘机至结束的时长、客户乘机信息中飞行次数、总飞行公里数的箱线图如图 6、图7所示。

 图 6客户最后一次乘机至结束的时长箱线图

图 7客户飞行次数与总飞行公里数的箱线图

如图 6所示,客户的入会时长主要分布在50~300的区间内,另外有一部分客户群体分布在600以上的区间,可分为两个群体。如图 7所示,客户的飞行次数与总飞行公里数也明显的分为两个群体,大部分客户集中在箱线图的中的下方的箱体中,少数客户分散分布在箱体上界的上方,这部分用户很可能是高价值客户,因为其飞行次数和总飞行公里数明显超过在箱体内的客户。

(3) 客户积分信息分布分析

选取积分兑换次数、总累计积分进行探索分析,探索客户的积分信息分布状况,如代码清单4所示。

代码清单4探索客户积分信息分布状况

# 积分信息类别

# 提取会员积分兑换次数

ec = data['EXCHANGE_COUNT']

# 绘制会员兑换积分次数直方图

fig = plt.figure(figsize=(8 ,5))  # 设置画布大小

plt.hist(ec, bins=5, color='#0504aa')

plt.xlabel('兑换次数')

plt.ylabel('会员人数')

plt.title('会员兑换积分次数分布直方图')

plt.show()

plt.close

# 提取会员总累计积分

ps = data['Points_Sum']

# 绘制会员总累计积分箱线图

fig = plt.figure(figsize=(5 ,8))

plt.boxplot(ps,

            patch_artist=True,

            labels = ['总累计积分'],  # 设置x轴标题

            boxprops = {'facecolor':'lightblue'})  # 设置填充颜色

plt.title('客户总累计积分箱线图')

# 显示y坐标轴的底线

plt.grid(axis='y')

plt.show()

plt.close

*代码详见:demo/code/data_distribution.py。

通过代码清单4得到客户积分兑换次数直方图和总累计积分分布箱线图,分别如图 8、图9所示。

 图8客户积分兑换次数直方图

图 9客户总累计积分

通过图 8可以看出,绝大部分客户的兑换次数在0~10的区间内,这表示大部分客户都很少进行积分兑换。通过图 9可以看出,一部分客户集中在箱体中,少部分客户分散分布在箱体上方,这部分客户的积分要明显高于箱体内的客户。

3. 相关性分析

客户信息的属性间存在相关性,选取入会时间、会员卡级别、客户年龄、飞行次数、总飞行公里数、最近一次乘机至结束时长、积分兑换次数、总累计积分属性,通过相关系数矩阵与热力图分析各属性间的相关性,如代码清单5所示。

代码清单 5相关系数矩阵与热力图

# 提取属性并合并为新数据集

data_corr = data[['FFP_TIER','FLIGHT_COUNT','LAST_TO_END',

                  'SEG_KM_SUM','EXCHANGE_COUNT','Points_Sum']]

age1 = data['AGE'].fillna(0)

data_corr['AGE'] = age1.astype('int64')

data_corr['ffp_year'] = ffp_year

# 计算相关性矩阵

dt_corr = data_corr.corr(method='pearson')

print('相关性矩阵为:\n',dt_corr)

# 绘制热力图

import seaborn as sns

plt.subplots(figsize=(10, 10)) # 设置画面大小

sns.heatmap(dt_corr, annot=True, vmax=1, square=True, cmap='Blues')

plt.show()

plt.close

*代码详见:demo/code/data_distribution.py。

通过代码清单5得到相关系数矩阵如表3所示,得到热力图如图10所示,可以看出部分属性间具有较强的相关性,如FLIGHT_COUNT(飞行次数)属性与SEG_KM_SUM(总公里数)属性;也有部分属性与其他属性的相关性都较弱,如AGE(年龄)属性与EXCHANGE_COUNT(积分兑换次数)属性。

表 3 相关系数矩阵

相关系数

FFP_TIER

FLIGHT_COUNT

LAST_TO_END

SEG_KM_SUM

EXCHANGE_COUNT

Points_Sum

AGE

ffp_year

FFP_TIER

1.000000

0.582447

-0.206313

0.522350

0.342355

0.559249

0.076245

-0.116510

FLIGHT_COUNT

0.582447

1.000000

-0.404999

0.850411

0.502501

0.747092

0.075309

-0.188181

LAST_TO_END

-0.206313

-0.404999

1.000000

-0.369509

-0.169717

-0.292027

-0.027654

0.117913

SEG_KM_SUM

0.522350

0.850411

-0.369509

1.000000

0.507819

0.853014

0.087285

-0.171508

EXCHANGE_COUNT

0.342355

0.502501

-0.169717

0.507819

1.000000

0.578581

0.032760

-0.216610

Points_Sum

0.559249

0.747092

-0.292027

0.853014

0.578581

1.000000

0.074887

-0.163431

AGE

0.076245

0.075309

-0.027654

0.087285

0.032760

0.074887

1.000000

-0.242579

ffp_year

-0.116510

-0.188181

0.117913

-0.171508

-0.216610

-0.163431

-0.242579

1.000000

图 10热力图

下一篇:大数据时代-航空公司该如何转型(三)-数据预处理

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
文件: import scrapy from demo1.items import Demo1Item import urllib from scrapy import log # BOSS直聘网站爬虫职位 class DemoSpider(scrapy.Spider): # 爬虫名, 启动爬虫时需要的参*必填 name = 'demo' # 爬取域范围,允许爬虫在这个域名下进行爬取(可选) allowed_domains = ['zhipin.com'] # 爬虫需要的url start_urls = ['https://www.zhipin.com/c101280600/h_101280600/?query=测试'] def parse(self, response): node_list = response.xpath("//div[@class='job-primary']") # 用来存储所有的item字段 # items = [] for node in node_list: item = Demo1Item() # extract() 将xpath对象转换为Unicode字符串 href = node.xpath("./div[@class='info-primary']//a/@href").extract() job_title = node.xpath("./div[@class='info-primary']//a/div[@class='job-title']/text()").extract() salary = node.xpath("./div[@class='info-primary']//a/span/text()").extract() working_place = node.xpath("./div[@class='info-primary']/p/text()").extract() company_name = node.xpath("./div[@class='info-company']//a/text()").extract() item['href'] = href[0] item['job_title'] = job_title[0] item['sa 报错: C:\Users\xieqianyun\AppData\Local\Programs\Python\Python36\python.exe "C:\Users\xieqianyun\PyCharm Community Edition 2019.2.5\helpers\pydev\pydevconsole.py" --mode=client --port=55825 import sys; print('Python %s on %s' % (sys.version, sys.platform)) sys.path.extend(['C:\\Users\\xieqianyun\\demo1', 'C:/Users/xieqianyun/demo1']) Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)] Type 'copyright', 'credits' or 'license' for more information IPython 7.10.0 -- An enhanced Interactive Python. Type '?' for help. PyDev console: using IPython 7.10.0 Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)] on win32 runfile('C:/Users/xieqianyun/demo1/demo1/begin.py', wdir='C:/Users/xieqianyun/demo1/demo1') Traceback (most recent call last): File "C:\Users\xieqianyun\AppData\Local\Programs\Python\Python36\lib\site-packages\IPython\core\interactiveshell.py", line 3319, in run_code exec(code_obj, self.user_global_ns, self.user_ns) File "<ipython-input-2-fc5979762143>", line 1, in <module> runfile('C:/Users/xieqianyun/demo1/demo1/begin.py', wdir='C:/Users/xieqianyun/demo1/demo1') File "C:\Users\xieqianyun\PyCharm Community Edition 2019.2.5\helpers\pydev\_pydev_bundle\pydev_umd.py", line 197, in runfile pydev_imports.execfile(filename, global_vars, local_vars) # execute the script File "C:\Users\xieqianyun\PyCharm Community Edition 2019.2.5\helpers\pydev\_pydev_imps\_pydev_execfile.py", line 18, in execfile exec(compile(contents+"\n", file, 'exec'), glob, loc) File "C:/Users/xieqianyun/demo1/demo1/begin.py", line 3, in <module> cmdline.execute('scrapy crawl demo'.split()) File "C:\Users\xieqianyun\AppData\Local\Programs\Python\Python36\lib\site-packages\scrapy\cmdline.py", line 145, in execute cmd.crawler_process = CrawlerProcess(settings) File "C:\Users\xieqianyun\AppData\Local\Programs\Python\Python36\lib\site-packages\scrapy\crawler.py", line 267, in __init__ super(CrawlerProcess, self).__init__(settings) File "C:\Users\xieqianyun\AppData\Local\Programs\Python\Python36\lib\site-packages\scrapy\crawler.py", line 145, in __init__ self.spider_loader = _get_spider_loader(settings) File "C:\Users\xieqianyun\AppData\Local\Programs\Python\Python36\lib\site-packages\scrapy\crawler.py", line 347, in _get_spider_loader return loader_cls.from_settings(settings.frozencopy()) File "C:\Users\xieqianyun\AppData\Local\Programs\Python\Python36\lib\site-packages\scrapy\spiderloader.py", line 61, in from_settings return cls(settings) File "C:\Users\xieqianyun\AppData\Local\Programs\Python\Python36\lib\site-packages\scrapy\spiderloader.py", line 25, in __init__ self._load_all_spiders() File "C:\Users\xieqianyun\AppData\Local\Programs\Python\Python36\lib\site-packages\scrapy\spiderloader.py", line 47, in _load_all_spiders for module in walk_modules(name): File "C:\Users\xieqianyun\AppData\Local\Programs\Python\Python36\lib\site-packages\scrapy\utils\misc.py", line 73, in walk_modules submod = import_module(fullpath) File "C:\Users\xieqianyun\AppData\Local\Programs\Python\Python36\lib\importlib\__init__.py", line 126, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "<frozen importlib._bootstrap>", line 994, in _gcd_import File "<frozen importlib._bootstrap>", line 971, in _find_and_load File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 665, in _load_unlocked File "<frozen importlib._bootstrap_external>", line 678, in exec_module File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed File "C:\Users\xieqianyun\demo1\demo1\spiders\demo.py", line 4, in <module> from scrapy import log ImportError: cannot import name 'log'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值