数据挖掘实战—餐饮行业的数据挖掘之数据预处理

article/2025/10/30 14:53:12

文章目录

    • 引言
    • 一、数据清洗
      • 1.缺失值处理
        • 1.1 拉格朗日插值法
        • 1.2牛顿差值法
      • 2.异常值的处理
    • 二、数据集成
      • 1.实体识别
      • 2.冗余属性识别
      • 3.数据变换
        • 3.1 简单函数变换
        • 3.2 规范化
          • 3.2.1 最小-最大规范化
          • 3.2.2 零-均值规范化(标准化)
          • 3.2.3 小数定标规范化
        • 3.3 连续属性离散化
          • 3.3.1 离散化方法
      • 4.属性构造
      • 5.小波变换
        • 5.1 基于小波变换的特征提取方法
        • 5.2 基于小波变换的多尺度空间能量分布特征提取方法
    • 三、数据归约
      • 1.属性归约
        • 1.1 前向挑选、后向挑选、双向挑选
        • 1.2 主成分分析
      • 2.数值归约
        • 2.1 直方图
        • 2.2 聚类
        • 2.3 抽样
        • 2.4 参数回归


  • 本文参考《python数据分析与挖掘实战》
  • 数据集链接,密码1234
  • 《python数据分析与挖掘实战》pdf链接,密码1234
  • 数据挖掘实战—餐饮行业的数据挖掘之数据探索(EDA)

引言

  数据挖掘过程中,海量的数据中存在缺失、异常、不一致的数据,数据的质量决定模型的质量,所以进行数据清洗非常重要。数据预处理包括数据清洗、数据集成、数据变换和数据归约

一、数据清洗

  数据清洗主要是删除原始数据中的无关数据、重复数据、平滑噪声数据,删选掉与挖掘主题无关的数据,处理缺失值、异常值等

1.缺失值处理

  处理缺失值的方法可分为3类:删除记录、数据插补和不处理。其中常用的数据插补方法有
在这里插入图片描述

删除记录: 如果简单删除小部分记录就可以达到既定目标,那么这种方法是最有效的,但容易造成资源的浪费,丢失掉大量隐藏在这些记录中的信息,尤其是数据很少的情况下
不处理: XGBoost模型可以直接对缺失值进行处理
数据插补: 重点介绍拉格朗日插值法和牛顿差值法,在进行插值前需要对数据的异常值进行检测,根据业务逻辑将全部异常值或者部分异常值定义为空缺值,然后进行插补

1.1 拉格朗日插值法

  拉格朗日插值法当插值节点增减时,插值多项式会发生变化。牛顿差值法改进了它的缺点。以销量数据为例,运用拉格朗日插值法补充缺失值

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.interpolate import lagrangecat_sale = pd.read_excel('data/catering_sale.xls')
cat_sale.drop('日期', axis=1, inplace=True)# 过滤异常值,并置为空值
cat_sale['销量'][(cat_sale['销量'] < 400) | (cat_sale['销量'] > 5000)] = np.NAN# 自定义列向量插值函数
def ployinterp_columns(s, n, k=4):if n < k:y = s[list(range(0, n)) + list(range(n + 1, n + k + 1))]elif n > len(s) - k - 1:y = s[list(range(n - k, n)) + list(range(n + 1, len(s)))]else:y = s[list(range(n - k, n)) + list(range(n + 1, n + k + 1))]  # 取空值处的前后3个数y = y[y.notnull()]  # 剔除空值return lagrange(y.index, list(y))(n)  # 插值并返回插值结果# 逐个判断元素是否需要插值
for i in cat_sale.columns:for j in range(len(cat_sale)):if (cat_sale[i].isnull())[j]:  # 如果为空则插值print(ployinterp_columns(cat_sale[i], j))cat_sale[i][j] = ployinterp_columns(cat_sale[i], j)cat_sale.to_csv('sales.csv')  # 输出结果,写入文件

在这里插入图片描述

1.2牛顿差值法

  牛顿插值法与拉格朗日插值法相比,具有承袭性和易于变动节点的特点

import numpy as np
import pandas as pdcat_sale = pd.read_excel('data/catering_sale.xls')
cat_sale.drop('日期', axis=1, inplace=True)# 过滤异常值,并置为空值
cat_sale['销量'][(cat_sale['销量'] < 400) | (cat_sale['销量'] > 5000)] = np.NAN# 分别定义求插商与求w的函数
def cal_f(x, y):"""计算插商"""f0 = np.zeros((len(x), len(y)))  # 定义一个存储插商的数组for k in range(len(y) + 1):  # 遍历列for i in range(k, len(x)):  # 遍历行if k == 0:f0[i, k] = y[i]else:f0[i, k] = (f0[i, k - 1] - f0[i - 1, k - 1]) / (x[i] - x[i - 1])print('差商表', '\n', f0)return f0def newton(x, y, x_j):"""牛顿差值多项式"""f0 = cal_f(x, y)  # 计算插商f0 = f0.diagonal()# 与w相乘f1 = 0for i in range(len(f0)):s = 1k = 0while k < i:s = s * (x_j - x[k])k += 1f1 = f1 + f0[i] * sreturn f1# 自定义列向量插值函数
def ployinterp_columns(s, n, x_j, k=2):if n < k:y = s[list(range(0, n)) + list(range(n + 1, n + k + 1))]elif n > len(s) - k - 1:y = s[list(range(n - k, n)) + list(range(n + 1, len(s)))]else:y = s[list(range(n - k, n)) + list(range(n + 1, n + k + 1))]  # 取空值处的前后5个数y = y[y.notnull()]  # 剔除空值return newton(y.index, list(y), x_j)  # 插值并返回插值结果for i in cat_sale.columns:for j in range(len(cat_sale)):if (cat_sale[i].isnull())[j]:x_j = cat_sale.index[j]print(ployinterp_columns(cat_sale[i], j, x_j))cat_sale[i][j] = ployinterp_columns(cat_sale[i], j, x_j)cat_sale.to_excel('saless.xls')

在这里插入图片描述

2.异常值的处理

  数据预处理中,异常值是否剔除需要视情况而定,因为有些异常值可能蕴含着有用的信息。
在这里插入图片描述
  很多情况下,要先分析异常值出现的可能原因,在判断异常值是否应该舍弃。如果是正确的数据,可以直接在具有异常值的数据集上进行挖掘建模。

二、数据集成

  数据挖掘需要的数据往往分布在不同的数据源中,数据集成就是将多个数据源合并存放在一个一致的数据存储位置中的过程。数据集成时,多个数据源的现实世界实体表达形式时有可能是不匹配的,常出现实体识别问题和属性冗余问题,从而将源数据在最底层上加以转换、提炼和集成。

1.实体识别

在这里插入图片描述

2.冗余属性识别

在这里插入图片描述

3.数据变换

  数据变换主要是对数据进行规范化处理,将数据转换成“适当的”形式,以适用于挖掘任务及算法的需要

3.1 简单函数变换

  简单函数变换是对原始数据进行某些数学函数变换,如:平方、开方、取对数、差分运算。简单的函数变换常用于将不具有正态分布的数据变换成具有正态分布的数据;在时间序列分析中,有时,简单的对数变换或者差分运算就可以将非平稳序列变换为平稳序列。在数据挖掘中,如个人年收入是10万到10亿元,这是一个很大的区间,可以使用对数变换来对区间进行压缩
在这里插入图片描述

3.2 规范化

  不同评价指标往往具有不同的量纲,数值间的差别很大,不进行处理可能会影响数据分析的结果。为了消除指标之间量纲和取值范围的影响,需要进行标准化处理。将数据按照比例进行缩放,使之落入一个特定区域。数据规范化对基于距离的挖掘算法尤为重要。

3.2.1 最小-最大规范化

在这里插入图片描述

3.2.2 零-均值规范化(标准化)

在这里插入图片描述
在这里插入图片描述

3.2.3 小数定标规范化

在这里插入图片描述

3.3 连续属性离散化

  一些数据挖掘算法,特别是某些分类算法,如ID3算法,要求数据是分类属性形式。这样就需要将连续属性变换为分类属性
  连续属性离散化指的是在数据取值范围内设定若干个离散的划分点,将取值范围划分为一些离散化的区间,最后用不同的符号或整数值代表落在每个子区间中的数据值。离散化涉及两个任务:

  1. 确定分类数
  2. 如何将连续属性值映射到这些分类值
3.3.1 离散化方法

  常用的离散化方法有等宽法、等频法和(一维)聚类
等宽法

含义:将属性的值域分成具有相同宽度的区间,区间的个数由数据本身的特点决定或者用户指定
缺点:等宽法由于对离群点比较敏感,倾向于不均匀的把属性值分布在各个区间。有些区间包含很多数据,而另外一些区间的数据极少,这样会严重损坏建立的决策模型。
pandas中的cut函数实现了等距分箱

等频法

含义:将相同数量的记录放进每个区间里
缺点:虽然避免了数据不均匀,但是却有可能将相同的数据值分在不同的区间内,以满足每个区间中有相同的数据个数。

基于聚类分析的方法

含义:首先将连续属性的值用聚类算法(如K-means算法)进行聚类,然后将聚类得到的簇进行处理,合并到一个簇的连续属性值做同一标记。簇的个数可以用户指定,或者是使用轮廓系数silhouette_score来寻找最佳的簇的个数。

#!usr/bin/env python
# -*- coding:utf-8 -*-
"""
@author: admin
@file: 连续属性离散化.py
@time: 2021/03/30
@desc:
"""
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.cluster import KMeansdata = pd.read_excel('data/discretization_data.xls')
# data = data['肝气郁结证型系数'].copy()
k = 4  # 4分箱
"""
1.等宽离散化
"""
d1 = pd.cut(data['肝气郁结证型系数'], k, labels=range(k))
# data['等宽'] = d1"""
2.等频离散化
"""
d2 = pd.qcut(data['肝气郁结证型系数'], k, labels=range(k))
# data['等频'] = d2"""
3.聚类法
"""
kmodel = KMeans(n_clusters=k)
kmodel.fit(np.array(data['肝气郁结证型系数']).reshape(len(data), 1))
# 聚类中心并排序
c = pd.DataFrame(kmodel.cluster_centers_).sort_values(by=0)
# 相邻聚类中心两项求中点,作为边界点
w = c.rolling(2).mean()
# 取出NaN
w = w.dropna()
# 添加首尾边界点
w = [0] + list(w[0]) + [data.max()]
# 分箱
d3 = pd.cut(data['肝气郁结证型系数'], k, labels=range(k))
# data['聚类'] = d3"""
自定义作图函数显示连续离散化(分箱)结果
"""
def bin_plot(d, k):plt.rcParams['font.sans-serif'] = ['SimHei']plt.rcParams['axes.unicode_minus'] = Falseplt.figure(figsize=(8, 3))colors = ['ko', 'ro', 'yo', 'bo']for i in range(k):plt.plot(np.array(data[d == i]).flatten(), [i for j in d[d == i]], colors[i])plt.ylim(-0.5, k-0.5)return pltbin_plot(d1, k).show()
bin_plot(d2, k).show()
bin_plot(d3, k).show()

等距
在这里插入图片描述
等频
在这里插入图片描述
聚类
在这里插入图片描述

4.属性构造

  在数据挖掘中,为了帮助用户提取更有用的信息,挖掘更深层次的模式,提高挖掘结果的精度,需要利用已有的属性集构造出新的属性,并加入到现有的属性集合中
在这里插入图片描述
在这里插入图片描述

5.小波变换

  小波变换具有多分辨率的特点,在时域频域都具有表征信号局部特征的能力,通过伸缩和平移等运算过程对信号进行多尺度聚焦分析,提供一种非平稳信号时频分析手段,可以由粗及细地逐步观察信号,从中提取有用信息。
  能够刻画某个问题的特征量往往隐含在一个信号中的某个或者某些分量中,小波变换可以将非平稳信号分解为不同层次、不同频带信息的数据序列,即小波系数,选择适当的小波系数,即完成了信号的特征提取分析。

5.1 基于小波变换的特征提取方法

在这里插入图片描述
在这里插入图片描述

5.2 基于小波变换的多尺度空间能量分布特征提取方法

在这里插入图片描述
  使用PyWavelets库进行小波变换,提取特征
在这里插入图片描述

三、数据归约

  数据归约产生更小且保持原始数据完整性的新数据集,提高效率。

  • 可以降低无效、错误数据对建模的影响
  • 少量且具有代表性的数据将大幅度缩短数据挖掘的时间
  • 降低存储数据的成本

1.属性归约

  属性归约的目标是寻找最小的属性子集并确保新数据子集的概率分布尽可能接近原来数据集的概率分布。属性归约的常用方法如下:
在这里插入图片描述
在这里插入图片描述

1.1 前向挑选、后向挑选、双向挑选

我之前实现过,可以查看链接数据预处理—3.变量选择之逐步挑选—向前挑选、向后挑选、双向挑选python实现

1.2 主成分分析

数据

from sklearn.decomposition import PCA
import pandas as pddata = pd.read_excel('data/principal_component.xls',header=None)
pca = PCA()
pca.fit(data)
print(pca.components_)    # 返回各模型的特征向量
print(pca.explained_variance_ratio_.cumsum())  # 返回各个成分各自的方差占比# 发现选取前3个累计贡献率就达到了97%
pca1 = PCA(n_components=3,copy=True,whiten=False)
pca1.fit(data)
low_data = pca1.transform(data)    # 降维后的数据
pd.DataFrame(low_data).to_excel('low_data.xls')pca1.inverse_transform(low_data)    # 可以使用inverse_transform函数复原数据

  原始数据从8维降到3维,同时这三维数据占了原始数据95%以上的信息。

2.数值归约

  数值归约通过选择替代的、较小的数据来减小数据量,包括有参数方法和无参数方法。有参数方法是使用一个模型来评估数据,只需存放参数,而不需要存放实际数据。无参数方法是需要存放实际数据的,例如直方图、聚类、抽样。

2.1 直方图

  直方图使用分箱来近似数据分布。属性A的直方图将A的数据分布划分为不相交的子集或桶。如果某个桶只代表单个属性值/频率对,则成为单桶。

2.2 聚类

在这里插入图片描述

2.3 抽样

在这里插入图片描述

2.4 参数回归

  简单线性模型和对数线性模型可以用来近似给定数据。用简单线性模型对数据建模,使之拟合一条直线。对数线性模型用来描述期望频数与协变量之间的关系
在这里插入图片描述


如果对您有帮助,麻烦点赞关注,这真的对我很重要!!!如果需要互关,请评论留言!
在这里插入图片描述



http://chatgpt.dhexx.cn/article/RdZFUbGW.shtml

相关文章

数据挖掘案例:建立客户流失模型

随着市场竞争的加剧&#xff0c;中国电信面临的压力越来越大&#xff0c;客户流失也日益增大。从统计数据看&#xff0c;今年固话小灵通的销户数已经超过了开户数。面对如此严峻的市场形式&#xff0c;当务之急就是要尽全力减少客户的流失。因此&#xff0c;利用数据挖掘方法&a…

数据挖掘实战案例——客户细分

我们首先来看看原始数据 具体代码与原始数据可以在我的GitHub中git clone一下学习 代码与数据github地址 共26663条数据 此次分析是想对根据客户的购买情况对客户进行细分 分析用户的购买消费行为 首先读取csv import pandas as pd #import numpy as np trad_flow pd.read_…

浅谈数据挖掘

一、数据挖掘起源 人们迫切希望能对海量数据进行深入分析&#xff0c;发现并提取隐藏在其中的信息&#xff0c;以更好地利用这些数据。但仅以数据库系统的录入、查询、统计等功能&#xff0c;无法发现数据中存在的关系和规则&#xff0c;无法根据现有的数据预测未来的发展趋势…

Python数据分析挖掘案例:Python爬虫助力疫情数据追踪

通过学习Python数据分析挖掘案例&#xff0c;可以掌握通过Python爬虫获取的数据进行处理以及可视化分析的主要方法和技能&#xff0c;并为后续相关课程学习及将来从事数据分析工作奠定基础。 新冠病毒疫情在武汉突然爆发&#xff0c;确诊病例、疑似病例、死亡病例等数据牵动着每…

【数据挖掘案例】财政收入影响因素分析及预测模型

案例来源自《Python 数据分析与挖掘实战》第 13 章&#xff1a;财政收入影响因素分析及预测模型 案例目的&#xff1a;预测财政收入 1 数据的基本描述性分析 数据 字段含义 社会从业人数(x1 )、 在岗职工工资总额&#xff08;x2&#xff09;、社会消费品零售总额(x3)、城镇…

python数据挖掘案例系列教程——python实现搜索引擎

全栈工程师开发手册 &#xff08;作者&#xff1a;栾鹏&#xff09; python数据挖掘系列教程 今天我们使用python实现一个网站搜索引擎。主要包含两个部分。网站数据库的生成、搜索引擎。其中搜索引擎部分我们使用单词频度算法、单词距离算法、外部回值算法、链接文本算法、pag…

工业数据挖掘实例

智能的基础是智能决策&#xff0c;所有的决策都来自于分析。所以简单说所有的智能都是做好两件事&#xff1a;收集数据&#xff0c;使用数据。数据挖掘技术根据业务数据不同有不同的应用场景。在我以往工作中主要在以下领域有应用尝试&#xff1a; 市场营销&#xff1a;用数据…

[数据挖掘案例]逻辑回归LR模型实现电商商品个性化推荐

目录 一、问题描述 二、数据摸底 三、数据清洗和特征筛选 3.1 数据抽取和清洗 3.2 特征筛选&#xff1a;决策树 3.3 特征分布转换 3.4 特征共线性检查 四、模型搭建 4.1 数据集 4.2 模型训练 4.3 模型验证 五、模型上线效果跟踪 一、问题描述 在电商平台中&#xff…

数据挖掘案例(2):用户画像

内容分为两个部分&#xff1a;     第一部分&#xff1a;用户画像概述     第二部分&#xff1a;用户画像案例 数据和源码 移步到Github &#xff1a; https://github.com/Stormzudi/Data-Mining-Case 邮箱&#xff1a;442395572qq.com 目录 第一部分&#xff1a;1…

数据挖掘案例实战:利用LDA主题模型提取京东评论数据(一)

泰迪智能科技&#xff08;数据挖掘平台&#xff1a;TipDM数据挖掘平台&#xff09;最新推出的数据挖掘实战专栏 专栏将数据挖掘理论与项目案例实践相结合&#xff0c;可以让大家获得真实的数据挖掘学习与实践环境&#xff0c;更快、更好的学习数据挖掘知识与积累职业经验 专栏…

数据挖掘案例实战:利用LDA主题模型提取京东评论数据(二)

泰迪智能科技&#xff08;数据挖掘平台&#xff1a;TipDM数据挖掘平台&#xff09;最新推出的数据挖掘实战专栏 专栏将数据挖掘理论与项目案例实践相结合&#xff0c;可以让大家获得真实的数据挖掘学习与实践环境&#xff0c;更快、更好的学习数据挖掘知识与积累职业经验 专栏…

数据挖掘学习(四)——常见案例总结

笔者是一个痴迷于挖掘数据中的价值的学习人&#xff0c;希望在平日的工作学习中&#xff0c;挖掘数据的价值&#xff0c;找寻数据的秘密&#xff0c;笔者认为&#xff0c;数据的价值不仅仅只体现在企业中&#xff0c;个人也可以体会到数据的魅力&#xff0c;用技术力量探索行为…

数据挖掘实例1:亲和性分析示例(代码、注释、运行结果)

前言 本实例采用python3环境&#xff0c;编辑器采用Jupyter Notebook&#xff0c;安装使用方法请参考&#xff0c;本实例中所用到的附件内容放在文末&#xff0c;如果想要自行运行一下代码&#xff0c;可以尝试一下。 Jupyter Notebook介绍、安装及使用教程 亲和性分析示例 …

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

Python数据预处理 一、内容&#xff1a; 1、数据清洗 2、数据集成 3、数据可视化 二、实验数据 根据航空公司系统内的客户基本信息、乘机信息以及积分信息等详细数据&#xff0c;依据末次飞行日期( LAST_FLIGHT_DATE)&#xff0c;以2014年3月31日为结束时间&#xff0c;选取…

Axure 9.0.0.3712 授权码

更新日志 2020年8月4日&#xff0c;Axure 更新了最新的版本&#xff0c;本次的版本号为 Axure RP 9.0.0.3712&#xff0c;具体更新内容如下&#xff1a; 自从Axure发布了9.0版本以后&#xff0c;很多小伙伴之前使用的注册码已经失效了&#xff0c;为了不影响想体验的小伙伴&am…

axure8.1 授权码

Licensee: University of Science and Technology of China (CLASSROOM) Key: DTXRAnPn1P65Rt0xB4eTQ4bF5IUF0gu0X9XBEUhM4QxY0DRFJxYEmgh4nyh7RtL 原文链接&#xff1a;http://blog.csdn.net/quanqinyang/article/details/78217464

关于Axure RP 的授权,我猜你还想知道......

Axure RP发展到今天&#xff0c;已经出到9的版本&#xff0c;当然破解授权码层出不穷。 有条件的朋友建议使用正版&#xff0c;可以避免以后可能出现的一些问题。 关于Axure授权码&#xff0c;有几点给大家说明一下。 一个Axure RP 的授权码是否可以多个人使用&#xff1f; 一…

2019年最新最全香港5大银行开户条件及攻略

跑去香港开户的同学,大概都了解,现在香港银行开户已经越来越严格了。银行工作人员要么就以资料要审核委婉拒绝,要么就要求客户存入几百万的存款才肯开户。2019年货币贬值加速,港币美元升值。户开开与各大行银行经理联合给大家总结了香港的5大最常见银行,汇丰、渣打、中银、…

2019年香港银行开户条件有哪些?个人账户申请被拒绝后该怎么处理比较好!!!

网上关于香港银行开户的攻略很多,但是由于政策跟银行系统不断升级的问题,银行已经全面出新政策了,为此,小编这次专门跑了一圈香港,整理了最新的一份开户大全,有评星,有体验。历史上关于香港各大银行开户的攻略都在这里了。各位有需要的小伙伴看这里,关于香港各大银行开…

一定要收藏!!!2019取消管理费最新最全香港开户攻略

自2019年8月1日起,很多香港银行相继取消多个账户管理费,香港开户难度也再度提升,还流传汇丰银行对于内地旅客来香港开户不能获批的消息,但多位在香港的中资和外资银行人士在接受媒体采访时表示暂无收到相关通知。不管怎么样!卡君还是提醒有需要开港卡的尽早开户!!!防范…