Python数据挖掘 数据预处理案例(以航空公司数据为例)

2023-11-01

Python数据预处理

一、内容:

1、数据清洗
2、数据集成
3、数据可视化

二、实验数据

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

三、设计方案

1、数据清洗:

a.首先将数据进行统计性分析,查找每列属性观测值中的空值个数最大值、最小值。得到的分析结果表如下表3-1所示。通过对原始数据观察发现数据中存在票价为空值的记录,同时存在票价最小值为0、折扣率最小值为0但总飞行公里数大于0的记录。票价为空值的数据可能是客户不存在乘机记录造成的。其他的数据可能是客户乘坐0折机票或者积分兑换造成的。
在这里插入图片描述
b.紧接着是分别对air_data01、air_data02两个数据集进行读取,并进行重复数据筛选与删除,对绘制箱型图年龄和票价为空的记录等异常值进行发现与删除,保留清洗后的数据。

2.数据集成

这一步是将数据清洗后的air_data01、air_data02两个数据集合并存放在一个数据存储中(cleanedfile_finish.csv),目的是为了便于后续的数据挖掘工作。

3.数据可视化

使用数据集成后的新产生的多维数据集cleanedfile_finish.csv对数据进行可视化操作,并对表格中的统计数据完成直方图、饼图、条形图、箱型图、热力图的绘制。

四、实验结论

1、程序源代码

1)数据清洗

a、准备工作:

import pandas as pd
		import numpy as np
		import matplotlib.pyplot as plt

b、数据统计性分析:

datafile= 'air_data01.xlsx'  # 航空原始数据,第一行为属性标签
resultfile = 'explore.csv'  # 数据统计性分析结果表
data = pd.read_excel(datafile)
datafile2= 'air_data02.xlsx'  
resultfile2 = 'explore2.csv' 
data2 = pd.read_excel(datafile2)
explore = data.describe(percentiles = [], include = 'all').T  # T是转置
explore['null'] = len(data)-explore['count']  
explore = explore[['null', 'max', 'min']]
explore.columns = ['空值数', '最大值', '最小值']  # 表头重命名
explore.to_csv('resultfile.csv')  # 导出结果
explore2 = data2.describe(percentiles = [], include = 'all').T  # T是转置
explore2['null'] = len(data)-explore2['count']
explore2 = explore2[['null', 'max', 'min']]
explore2.columns = ['空值数', '最大值', '最小值'] 
explore2.to_csv('resultfile2.csv') 
datatemp = pd.concat([explore,explore2],axis=0)
datatemp.to_csv('data_Statistical analysis.csv') # 导出最终结果

通过对原始数据观察发现数据中存在票价为空值的记录,同时存在票价最小值为0、折扣率最小值为0但总飞行公里数大于0的记录。票价为空值的数据可能是客户不存在乘机记录造成的。其他的数据可能是客户乘坐0折机票或者积分兑换造成的。所以后面我们将对这一部分数据进行清除操作。

c、对数据集进行读取:

df1 = pd.read_excel('air_data01.xlsx')
df2 = pd.read_excel('air_data02.xlsx')
对重复数据进行删除:
def df_drop(df): #删除重复数据
  	print("yunxingle")
df_1 = df.duplicated() #进行重复判断
  	print("重复判断\n:",df_1)
  	df_2 = df[df.duplicated()]#显示重复数据sss
  	print("\n\n\n重复数据\n",df_2)
 	df_new = df.drop_duplicates() #删除重复数据
return df_new
df_drop(df1)
df_drop(df2)

d、对缺失行进行删除:

def df_kong(df):
 	df_1 = df.apply(lambda col:sum(col.isnull())/col.size)
     print('\n判断缺失情况:\n\n',df_1)
     df_2 = df.dropna(how='any')#删除所有含有缺失值的行
     print(df_2.head(10))
     return df_2
		df_kong(df1)
		df_kong(df2)

e、合并数据并保存:

data_new1 = df_kong(df_drop(df1))
data_new2 = df_kong(df_drop(df2))
data_integrated = pd.concat([data_new1,data_new2],axis=1)
data_integrated.to_csv('data_integrated.csv')  # 保存清洗后的数据

f、异常值清除:

data = pd.read_csv('data_integrated.csv')
# data = data_new1
age = data['AGE'].dropna()
age = age.astype('int64')
# 绘制会员年龄分布箱型图
plt.rcParams['font.sans-serif'] = 'SimHei'  # 设置中文显示
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()

# 箱型图显示年龄数据存在有大于100的异常值,下面予以修正
print('原始数据的形状为:',data.shape)
index = data['AGE'] > 100  # 去除年龄大于100的记录
data2 = data[~index]
print('数据清洗后数据的形状为:',data2.shape)
data2.to_csv('cleanedfile_01.csv')  # 保存清洗后的数据

age = data2['AGE'].dropna()
age = age.astype('int64')
# 绘制会员年龄分布箱型图
plt.rcParams['font.sans-serif'] = 'SimHei'  # 设置中文显示
fig2 = 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()

data3 = pd.read_csv('cleanedfile_01.csv',encoding = 'utf-8')
print('原始数据的形状为:',data3.shape)

# 去除票价为空的记录
data3_notnull = data3.loc[data3['SUM_YR_1'].notnull() &
                                   data3['SUM_YR_2'].notnull(),:]
print('删除缺失记录后数据的形状为:',data3_notnull.shape)
# data3_notnull.to_csv('data3_notnull.csv')  # 保存清洗后的数据

# 只保留票价非零的,或者平均折扣率不为0且总飞行公里数大于0的记录。
index1 = data3_notnull['SUM_YR_1'] != 0
index2 = data3_notnull['SUM_YR_2'] != 0
index3 = (data3_notnull['SEG_KM_SUM']> 0) & (data3_notnull['avg_discount'] != 0)
cleanedfile_02 = data3_notnull[(index1 | index2) & index3]
print('数据清洗后数据的形状为:',cleanedfile_02.shape)
cleanedfile_02.to_csv('cleanedfile_finish1.csv')  # 保存清洗后的数据

2)数据集成

data_new1 = df_kong(df_drop(df1))
data_new2 = df_kong(df_drop(df2))
data_integrated = pd.concat([data_new1,data_new2],axis=1)#数据集成
data_integrated.to_csv('data_integrated.csv')  # 保存清洗后的数据

3)数据可视化

a、准备工作:

import pandas as pd
import matplotlib.pyplot as plt
datafile= 'cleanedfile_finish.csv'

b、各年份会员入会人数直方图绘制:

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

c、会员性别比例饼饼图绘制:

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

d、会员各级别人数条形图绘制:

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(x=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()

e、会员年龄分布箱型图绘制:

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('会员年龄分布箱线图')
plt.grid(axis='y')
plt.show()
plt.close

f、最后乘机至结束时长箱型图绘制:

fig = plt.figure(figsize = (5 ,8))
plt.boxplot(lte,最后乘机至结束时长箱线图
            patch_artist=True,
            labels = ['时长'],  # 设置x轴标题
            boxprops = {'facecolor':'lightblue'})  
plt.title('会员最后乘机至结束时长分布箱线图')
plt.grid(axis='y')
plt.show()
plt.close

g、客户飞行次数箱型图绘制:

fig = plt.figure(figsize = (5 ,8))
plt.boxplot(fc,
            patch_artist=True,
            labels = ['飞行次数'], 
            boxprops = {'facecolor':'lightblue'}) 
plt.title('会员飞行次数分布箱线图')
# 显示y坐标轴的底线
plt.grid(axis='y')
plt.show()
plt.close

h、客户总飞行公里数箱型图绘制:

fig = plt.figure(figsize = (5 ,10))
plt.boxplot(sks,
            patch_artist=True,
            labels = ['总飞行公里数'], 
            boxprops = {'facecolor':'lightblue'})  
plt.title('客户总飞行公里数箱线图')
# 显示y坐标轴的底线
plt.grid(axis='y')
plt.show()
plt.close

i、会员兑换积分次数直方图绘制:

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

j、计算相关矩阵并绘制热力图:

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

2、程序相关结果展示

1)数据清洗

a、数据统计性分析:
数据统计性分析
通过对原始数据观察发现数据中存在票价为空值的记录,同时存在票价最小值为0、折扣率最小值为0但总飞行公里数大于0的记录。票价为空值的数据可能是客户不存在乘机记录造成的。其他的数据可能是客户乘坐0折机票或者积分兑换造成的。所以后面我们将对这一部分数据进行清除操作。

c、重复值分析:
重复值分析1
如图示,显示有重复数据,下面我们将重复数据进行展示。可以看出air_data01有71行重复数据。air_data02有1738行重复数据。
重复值分析2
重复值分析3
我们对重复数据执行删除操作。

d、缺失行进行分析:
在这里插入图片描述
在这里插入图片描述
根据观察,表格air_data01存在部分数据缺失,因为数据量较为庞大,所以我们对所有缺失的数据执行行删除操作。

e、重复数据与缺失数据删除前后数据对比:
在这里插入图片描述
f、异常值清除:

根据会员年龄分布箱型图,可以看出大部分会员年龄集中在30~50岁之间,极少量的会员年龄小于20岁或高于60岁,且存在一个超过100岁的异常数据。我们对该AGE数据中大于100的进行删除,所得结果如下图所示。
在这里插入图片描述

2)数据集成

保存数据到‘cleanedfile_finish1.csv’用于后续数据可视化。
在这里插入图片描述

3)数据可视化

a、各年份会员入会人数直方图绘制:
在这里插入图片描述
可以发现入会人数大致是随着年份的增加而增加,在2012年达到顶峰。2009年与2013年与趋势不符,有可能是采样的问题,有可能是其他类似政策的问题

b、会员性别比例饼饼图绘制:在这里插入图片描述
可以发现入会男性比例远远高于女性。

c、会员各级别人数条形图绘制:
在这里插入图片描述
可以看出绝大多数会员为4级会员,仅有少数5级或者6级会员

d、箱型图绘制
在这里插入图片描述
由会员年龄分布箱线图可以看出绝大多数年龄位于30~50岁之间
最后一次乘机时间至观测窗口时长越短,表示客户对航空公司越满意。时间间隔越短同时也表示该客户可能是高价值客户。并且还可以从这个属性中看到公司的发展问题,如果时间间隔短的客户越来越少,说明该公司的运营出现了问题,需要及时调整营销策略。
在这里插入图片描述
通过图像可以很清晰的发现:客户的飞行次数与总飞行里程数明显分为两个群体,大部分客户集中在箱型图中的箱体中,少数客户位于箱体上方,这部分客户很可能就是高价值客户。

h、会员兑换积分次数直方图绘制:
在这里插入图片描述
通过图形可以看出:绝大多数兑换次数位于0~10次之间,这表明大部分客户很少进行积分兑换。

i、计算相关矩阵并绘制热力图:
在这里插入图片描述
通过热力图可以看出:部分属性之间存在强相关性,比如总飞行公里数与票价收入,总累计积分,飞行次数。可以通过这些关联性强的属性进一步对数据进行挖掘分析。

如需要实验代码和数据,请私信,无偿提供,仅供学习交流哦~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python数据挖掘 数据预处理案例(以航空公司数据为例) 的相关文章

随机推荐

  • openwrt 常用命令

    1 进入目录 cd etc twrt 2 打开文件 vi etc twrt config 3 退出文件 ESC gt shift gt wq 3 杀死进程 kill all twrt 转载于 https www cnblogs com pp
  • Docker(一):Docker入门教程

    如今Docker的使用已经非常普遍 特别在一线互联网公司 使用Docker技术可以帮助企业快速水平扩展服务 从而到达弹性部署业务的能力 在云服务概念兴起之后 Docker的使用场景和范围进一步发展 如今在微服务架构越来越流行的情况下 微服务
  • 人工神经网络概念及组成,人工神经网络发展史

    BP神经网络的发展历史 人工神经网络早期的研究工作应追溯至上世纪40年代 下面以时间顺序 以著名的人物或某一方面突出的研究成果为线索 简要介绍人工神经网络的发展历史 1943年 心理学家W Mcculloch和数理逻辑学家W Pitts在分
  • 安装 TensorFlow GPU版(2023年)

    1 安装CUDA与cuDNN 1 1 确定所需的CUDA与cuDNN版本 查看所需的CUDA与cuDNN的版本网址 右上角语言那选English 中文的内容不全 Build from source on Windows TensorFlow
  • 基于单片机的语音风扇的设计与实现

    写在前面 因为偶尔会有人问 所以对之前做的这个小玩意进行一个小小的总结 把资料也放在这里来吧 作品展示 https www bilibili com video BV1iV411C722 spm id from 333 999 0 0 vd
  • xdp测试例子

    牛刀小试 linux内核协议栈实现了一个虚拟机 允许用户程序向内核注入二进制字节码 注入的程序 就可以做一些有趣的事情 比如 负载均衡 数据包检测 加速容器网络转发 做个网损仪 本篇 运行一个测试程序 丢弃网卡收到的icmp包 xdp dr
  • Matlab自带的数据标准化方法(mapminmax和mapstd)详细解析

    转自 http blog sina com cn s blog b3509cfd0101bt9u html Matlab神经网络工具箱自带了两个数据标准化处理命令 一个是mapminmax 另一个是mapstd 下面 分别对这两个命令进行解
  • 目录操作命令

    文章目录 目录操作命令 ls命令 命令格式 常用用法 cd命令 命令格式 常用用法 pwd 命令 命令格式 常用用法 mkdir命令 命令格式 常用用法 rmdir命令 命令格式 常用用法 tree命令 命令格式 常用用法 目录操作命令 l
  • 详细讲解插入排序(JavaScript实现)

    function insertSort alist let preindex current for let i 1 i
  • webpack打包原理解析

    文章目录 webpack打包是如何运行的 webpack对CommonJS的模块化处理 webpack对es6 Module模块化的处理 webpack文件的按需加载 按需加载输出代码分析 总结 webpack打包是如何运行的 也可以称为
  • Nacos框架服务主动下线原理及源代码讲解

    原理 Nacos没有想eureka一样 在服务端提供API供调用进行服务下线 Nacos的实现方式是通过在客户端提供方法 我们自己封装API进行调用 然后客户端会进行2个步骤 1 如果是临时服务 客户端会把自己发送续约保活心跳的缓存实例给删
  • window.open对storage有没有影响?

    首先在浏览器开发者模式打印如下信息 设置storage存值 sessionStorage setItem aaa 111 localStorage setItem bbb 222 新开一个浏览器窗口 在开发者模式打印窗口获取上一个窗口存储的
  • JAVA算法(分糖果)

    题目描述 有n个小朋友围坐成一圈 老师给每个小朋友随机发偶数个糖果 然后进行下面的游戏 每个小朋友都把自己的糖果分一半给左手边的孩子 一轮分糖后 拥有奇数颗糖的孩子由老师补给1个糖果 从而变成偶数 反复进行这个游戏 直到所有小朋友的糖果数都
  • 版本记录总结

    对构建中使用的版本进行记录
  • 【vue】this.$router.replace跳转不起作用 Router push or replace not working

    项目场景 商城APP底部导航切换对应页面 问题描述 提示 这里描述项目中遇到的问题 Just sit there clicking the home btn watching log show me home but never getti
  • Git远程库代码回退

    一 首先认识两个回退过程中很重要的命令 1 git log 显示所有提交过的版本信息 不包括已经被删除的 commit 记录和 reset 的操作 空格向下翻页 b 向上翻页 q 退出 git log pretty oneline git
  • 华为od机试 C++ 【计算最少步数】

    题目 小明计划在周末去爬山 他有一份包含山峰高度的地图 其中 0 代表平地 而 1 到 9 表示不同的山峰高度 小明可以向上 下 左或右移动一步 但是 由于他不想爬得太累 他决定只在高度差不超过 k 的地方移动 现在他站在地图的左上角 你能
  • 做好五年不跳槽的准备

    入职半年了 我觉得这里可以长久发展 其一 工作能胜任 我感觉找回自信了 甚至有些傲娇了 说明osg确实比较对口 做擅长的工作 会越做越有信心 其二 老大靠谱 老大十几年经验 并且很有耐心 工作方式也对 比如 先给你代码 在这个基础上改 并且
  • 超长整数相加

    链接 https www nowcoder com questionTerminal 5821836e0ec140c1aa29510fd05f45fc orderByHotValue 1 mutiTagIds 640 643 page 6
  • Python数据挖掘 数据预处理案例(以航空公司数据为例)

    Python数据预处理 一 内容 1 数据清洗 2 数据集成 3 数据可视化 二 实验数据 根据航空公司系统内的客户基本信息 乘机信息以及积分信息等详细数据 依据末次飞行日期 LAST FLIGHT DATE 以2014年3月31日为结束时