【数据挖掘实战】——家用电器用户行为分析及事件识别

项目地址:Datamining_project: 数据挖掘实战项目代码
目录
一、背景和挖掘目标
1、问题背景
2、原始数据
3、挖掘目标
二、分析方法与过程
1、初步分析
2、总体流程
第一步:数据抽取
第二步:探索分析
第三步:数据的预处理
第四步:构建专家样本
第五步: 构建用水事件行为识别模型
三、总结和思考
一、背景和挖掘目标
1、问题背景
- 智能家居是利用先进的技术,融合个性需求,将与家居生活有关的各个子系统有机地结合在一起,通过网络化综合智能控制和管理,实现“以人为本”的全新生活体验。
- 企业若能深入了解其产品在不同用户群的使用习惯,开发新功能,就能开拓新市场,实现产品的智能化。根据家居的智能化,分析客户行为,识别不同客户群的特征、加深对客户的理解等。(以热水器为例,分析客户行为)
- 针对不同的客户群提供个性化产品、改进新产品的智能化的研发和制定相应的营销策略。
2、原始数据
用户用水数据表:包括了洗浴、洗手、洗脸、洗菜、做饭等用水行为

3、挖掘目标
- 根据热水器采集到的数据,划分一次完整用水事件;
- 在划分好的一次完整用水事件中,识别出洗浴事件。
二、分析方法与过程
1、初步分析
- 热水器在状态发生改变或者有水流状态时,每2秒会采集一条流水数据。因为用户行为不仅仅只有洗浴还存在其他的用水事件:比如洗手、洗菜等,所以热水器采集的数据来自各种不同的用水事件。
- 基于热水器采集的数据,根据水流量和停顿时间间隔划分为不同大小的时间区间,每个区间是一个可理解的一次完整用水事件,并以热水器一次完整用水事件作为一个基本事件。
- 从独立的用水事件中识别出其中属于洗浴的事件。
2、总体流程

第一步:数据抽取
| 属性名称 | 属性说明 |
| 热水器编码 | 热水器出厂编号 |
| 发生时间 | 记录热水器处于某状态的时刻 |
| 开关机状态 | 热水器是否开机 |
| 即热 | 即时加热 |
| 加热中 | 热水器处于对水进行加热的状态 |
| 保温中 | 热水器处于对水进行保温的状态 |
| 有无水流 | 热水水流量大于等于10L/min为有水,否则为无 |
| 实际温度 | 热水器中热水的实际温度 |
| 热水量 | 热水器热水的含量 |
| 水流量 | 热水器热水的水流速度 单位:L/min |
| 节能模式 | 热水器的一种节能工作模式 |
| 预约洗 | 预约一个时间使用热水 |
| 即时洗 | 不预约直接使用热水器 |
| 加热剩余时间 | 加热到设定温度还需多长时间 |
| 当前设置温度 | 热水器加热时热水能够到达的最大温度 |
第二步:探索分析
为了探究用户真实用水停顿时间间隔的分布情况,统计用水停顿的时间间隔并作频率分布直方图。

停顿时间间隔为0~0.3分钟的频率很高,根据日常用水经验可以判断其为一次用水时间中的停顿;停顿时间间隔为6~13分钟的频率较低,分析其为两次用水事件之间的停顿间隔。两次用水事件的停顿时间间隔分布在3~7分钟与现场实验统计用水停顿的时间间隔近似。
第三步:数据的预处理
2、数据变换
一次完整用水事件的划分:用水状态记录中,水流量不为0表明用户正在使用热水;而水流量为0时用户用热水发生停顿或者用热水结束。水流量为0的状态记录之间的时间间隔如果超过一个阈值T,则从该段水流量为0的状态记录向前找到最后一条水流量不为0的用水记录作为上一次用水事件的结束;向后找到水流量不为0的状态记录作为下一个用水事件的开始。

#-*- coding: utf-8 -*-
#用水事件划分
import pandas as pdthreshold = pd.Timedelta('4 min') #阈值为分钟
inputfile = 'data/water_heater.xls' #输入数据路径,需要使用Excel格式
outputfile = 'tmp/dividsequence.xls' #输出数据路径,需要使用Excel格式data = pd.read_excel(inputfile)
data[u'发生时间'] = pd.to_datetime(data[u'发生时间'], format = '%Y%m%d%H%M%S')
data = data[data[u'水流量'] > 0] #只要流量大于0的记录
d = data[u'发生时间'].diff() > threshold #相邻时间作差分,比较是否大于阈值
data[u'事件编号'] = d.cumsum() + 1 #通过累积求和的方式为事件编号data.to_excel(outputfile)
用水事件阈值寻优:根据水流量和停顿时间间隔的阈值划分一次完整的用水事件。

# -*- coding: utf-8 -*-
# 阈值寻优
import numpy as np
import pandas as pdinputfile = 'data/water_heater.xls' # 输入数据路径,需要使用Excel格式
n = 4 # 使用以后四个点的平均斜率threshold = pd.Timedelta(minutes=5) # 专家阈值
data = pd.read_excel(inputfile)
data[u'发生时间'] = pd.to_datetime(data[u'发生时间'], format='%Y%m%d%H%M%S')
data = data[data[u'水流量'] > 0] # 只要流量大于0的记录def event_num(ts):d = data[u'发生时间'].diff() > ts # 相邻时间作差分,比较是否大于阈值return d.sum() + 1 # 这样直接返回事件数dt = [pd.Timedelta(minutes=i) for i in np.arange(1, 9, 0.25)]
h = pd.DataFrame(dt, columns=[u'阈值']) # 定义阈值列
h[u'事件数'] = h[u'阈值'].apply(event_num) # 计算每个阈值对应的事件数
h[u'斜率'] = h[u'事件数'].diff() / 0.25 # 计算每两个相邻点对应的斜率# df_test['col_name'].rolling(ma).mean()新版本 ---->pd.rolling_mean(df_test['col_name'], ma) 旧版本
# pd.rolling_mean(h[u'斜率'].abs(), n)
h[u'斜率指标'] = h[u'斜率'].rolling(n).mean() # 采用后n个的斜率绝对值平均作为斜率指标
ts = h[u'阈值'][h[u'斜率指标'].idxmin() - n]
# 注:用idxmin返回最小值的Index,由于rolling_mean()自动计算的是前n个斜率的绝对值平均
# 所以结果要进行平移(-n)if ts > threshold:ts = pd.Timedelta(minutes=4)print(ts)
属性构造:根据用水行为,需构造四类指标:时长指标、频率指标、用水的量化指标以及用水的波动指标。

属性解释:
候选洗浴事件:从大量的一次完整用水事件中筛选规则剔除可以明显判定不是洗浴的事件
筛选掉非常短暂的用水事件:一次完整的用水事件满足其中任意一个条件,就被判定为短暂用水事件,其筛选条件为:1、一次用水事件中总用水量(纯热水)小于y升;2、用水时长小于100秒;3、总用水时长小于120秒。
3、缺失值的处理

第四步:构建专家样本

第五步:构建用水事件行为识别模型
1、洗浴识别模型
根据建模样本数据和用户记录的包含用水的用途、用水开始时间、用水结束时间等属性的用水日志,建立BP神经网络模型识别洗浴事件。

# -*- coding: utf-8 -*-
# 建立、训练多层神经网络,并完成模型的检验
from __future__ import print_function
import pandas as pdinputfile1 = '../data/train_neural_network_data.xls' # 训练数据
inputfile2 = '../data/test_neural_network_data.xls' # 测试数据
testoutputfile = '../tmp/test_output_data.xls' # 测试数据模型输出文件
data_train = pd.read_excel(inputfile1) # 读入训练数据(由日志标记事件是否为洗浴)
data_test = pd.read_excel(inputfile2) # 读入测试数据(由日志标记事件是否为洗浴)
y_train = data_train.iloc[:, 4].as_matrix() # 训练样本标签列
x_train = data_train.iloc[:, 5:17].as_matrix() # 训练样本特征
y_test = data_test.iloc[:, 4].as_matrix() # 测试样本标签列
x_test = data_test.iloc[:, 5:17].as_matrix() # 测试样本特征from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activationmodel = Sequential() # 建立模型
model.add(Dense(11, 17)) # 添加输入层、隐藏层的连接
model.add(Activation('relu')) # 以Relu函数为激活函数
model.add(Dense(17, 10)) # 添加隐藏层、隐藏层的连接
model.add(Activation('relu')) # 以Relu函数为激活函数
model.add(Dense(10, 1)) # 添加隐藏层、输出层的连接
model.add(Activation('sigmoid')) # 以sigmoid函数为激活函数
# 编译模型,损失函数为binary_crossentropy,用adam法求解
model.compile(loss='binary_crossentropy', optimizer='adam', class_mode="binary")model.fit(x_train, y_train, nb_epoch=100, batch_size=1) # 训练模型
model.save_weights('../tmp/net.model') # 保存模型参数r = pd.DataFrame(model.predict_classes(x_test), columns=[u'预测结果'])
pd.concat([data_test.iloc[:, :5], r], axis=1).to_excel(testoutputfile)
model.predict(x_test)
2、模型检验
通过某热水器用户记录了两周的热水器用水日志,将前一周的数据作为训练数据,后一周的数据作为测试数据。根据该热水器用户提供的用水日志与多层神经网络模型识别结果的比较,总共21条检测数据,准确识别了18条数据,模型对洗浴事件的识别准确率为85.5%。

三、总结和思考
- 根据上述模型划分的结果,发现有时候会将两次(或多次)洗浴划分为一次洗浴,因为在实际情况中,存在着一个人洗完澡后,另一个人马上洗的情况,这中间过渡期间的停顿间隔小于阈值。针对两次(或多次)洗浴事件被合并为一次洗浴事件的情况,需要进行优化,对连续洗浴事件作识别,提高模型识别精确度。
- 判断连续洗浴的方法:对每次用水事件,建立一个连续洗判别指标。连续洗判别指标初始值为0,每当有一个属性超过设定的阈值,就给该指标加上相应的值,最后判别连续洗指标是否超过给定的阈值,如果超过给定的阈值,认为该次用水事件为连续洗事件。
相关文章:
【数据挖掘实战】——家用电器用户行为分析及事件识别
项目地址:Datamining_project: 数据挖掘实战项目代码 目录 一、背景和挖掘目标 1、问题背景 2、原始数据 3、挖掘目标 二、分析方法与过程 1、初步分析 2、总体流程 第一步:数据抽取 第二步:探索分析 第三步:数据的预处…...
肠道核心菌属——双歧杆菌属,了解并拥有它
双歧杆菌 双歧杆菌属(Bifidobacterium)是放线菌门严格厌氧的革兰氏阳性多形性杆状细菌。末端常常分叉,故名双歧杆菌。是人和动物肠道的重要核心菌群和有益生理菌群,也是母乳喂养婴儿中发现的第二大菌。 肥胖、糖尿病和过敏等各种疾…...
Python 之 Pandas 生成时间戳范围、Pandas 的时期函数 Period() 和时间序列 - 重采样 resample
文章目录一、生成时间戳范围1. 指定值2. 指定开始日期并设置期间数3. 频率 freq4. closed二、Pandas 的时期函数 Period()三、时间序列 - 重采样 resample在开始之前,我们先导入 numpy 和 pandas 库,同时导入 python 内置的模块。 import pandas as pd…...
利用Python和Sprak求曲线与X轴上方的面积
有n组标本(1, 2, 3, 4), 每组由m个( , , ...)元素( , )组成(m值不定), . 各组样本的分布 曲线如下图所示. 通过程序近似实现各曲线与oc, cd直线围成的⾯积. 思路 可以将图像分成若干个梯形,每个梯形的底边长为(Xn1 - Xn-1),面积为矩形的一半,…...
利用机器学习(mediapipe),进行人手的21个3D手关节坐标检测
感知手的形状和动作的能力可能是在各种技术领域和平台上改善用户体验的重要组成部分。例如,它可以构成手语理解和手势控制的基础,并且还可以在增强现实中将数字内容和信息覆盖在物理世界之上。虽然自然而然地出现在人们手中,但是强大的实时手感知力无疑是一项具有挑战性的计…...
【添砖java】谁说编程第一步是hello world
编程第一步明明是下载编译器和配置环境(小声逼逼)。 Windows下的java环境安装: java的安装包分为两类,一类是JRE(Java Runtime Environmental),是一个独立的java运行环境;一类是JDK…...
el-table大数据量渲染卡顿问题
1、场景描述 在项目开发中,遇到在表格中一次性加载完的需求,且加载数量不少,有几百几千条,并且每条都可能有自己的下拉框,输入框来做编辑功能,此时普通的el-table肯定会导致浏览器卡死,那么怎么…...
MyBatis-Plus 实现分页的几种写法
简介MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。快速开始添加依赖全新的 MyBatis-Plus 3.0 版本基于 JDK8ÿ…...
记一次Binder内存不足导致的应用被杀
每个进程的可用Binder内存大小是 1M-8KB 也就是900多KB 事情的起因的QA压测过程发生进程号变更,怀疑APP被杀掉过,于是开始看日志(实际后来模拟的时候可以发现app确实被杀掉了) APP的压测平台会上报进程号变更时间点,发…...
Zabbix4.0架构理解-zabbix的工作方式
目录 1.1、zabbix4.0架构图 1.2、zabbix的进程 1、 zabbix server 2、zabbix agent 3、 zabbix proxy 4、 java gateway 5、zabbix get 1.3、zabbix的几种工作方式 1、通过zabbix agent 2、通过zabbix proxy 3、通过 zabbix java gateway 4、其他 1.3、zabbix 数据走…...
MySQL中的一些非常实用的函数、语法
前言我最近几年用MYSQL数据库挺多的,发现了一些非常有用的小玩意,今天拿出来分享到大家,希望对你会有所帮助。1.group_concat在我们平常的工作中,使用group by进行分组的场景,是非常多的。比如想统计出用户表中&#x…...
RT-Thread移植到STM32F407
文章目录第一步:获取RT-Thread源码第二步:项目结构介绍第三步:拷贝示例代码到裸机工程第四步:删除无用文件第五步:修改工程目录结构第六步:添加工程文件路径第七步:编译第八步:修改配…...
VR全景到底有多全能?为何屡受关注?
告别两年的“冰封”时期,现在疫情放开已经有一段时间了,各个行业的市场和经济已经逐步回暖,但是疫情对广大群众造成的心理阴影还是迟迟未有退散。就拿去电影院看电影来说,以前看电影是看心情,现在看电影则是看环境&…...
剑指 Offer 30. 包含min函数的栈
摘要 剑指 Offer 30. 包含min函数的栈 一、栈解析 package Stock;import java.util.Stack;/*** Classname JZ30min函数栈* Description TODO* Date 2023/2/24 18:59* Created by xjl*/ public class JZ30min函数栈 {/*** description 最小栈的含义是每次从栈中获取的数据都是…...
stm32f407探索者开发板(二十二)——通用定时器基本原理讲解
文章目录一、三种定时器的区别二、通用定时器特点2.1 功能特点描述2.2 计数器模式三、通用定时器工作过程四、附一、三种定时器的区别 STM32F40x系列总共最多有14个定时器 三种(4)STM32定时器区别 二、通用定时器特点 2.1 功能特点描述 STM3 F4的通…...
cmake 入门三 常用变量和指令
cmake常用变量 一、cmake 变量引用的方式: 前面我们已经提到了,使用${}进行变量的引用。在IF 等语句中,是直接使用变量名而不通过${}取值 二,cmake 自定义变量的方式: 主要有隐式定义和显式定义两种,一…...
Linux基础命令-find搜索文件位置
文章目录 find 命令介绍 语法格式 命令基本参数 参考实例 1)在root/data目录下搜索*.txt的文件名 2)搜索一天以内最后修改时间的文件;并将文件删除 3)搜索777权限的文件 4)搜索一天之前变动的文件复制到test…...
获取浏览器硬件资源的媒体数据(拍照、录音、录频、屏幕共享)
目录一、window.navigator 对象包含有关访问者浏览器的信息取二、MediaDevices1.使用麦克风2.使用摄像头(和音频一样)3.拍照4.录屏三、MediaRecorder(录制,可录制音频视屏)一、window.navigator 对象包含有关访问者浏览器的信息取 <!DOCTYPE html>…...
Java入门教程||Java 日期时间||Java 正则表达式
Java 日期时间java.util包提供了Date类来封装当前的日期和时间。Date类提供两个构造函数来实例化Date对象。第一个构造函数使用当前日期和时间来初始化对象。Date( )第二个构造函数接收一个参数,该参数是从1970年1月1日起的毫秒数。Date(long millisec)Date对象创建…...
详解八大排序算法
文章目录前言排序算法插入排序直接插入排序:希尔排序(缩小增量排序)选择排序直接选择排序堆排序交换排序冒泡排序快速排序hoare版本挖坑法前后指针版本快速排序的非递归快速排序总结归并排序归并排序的非递归实现:计数排序排序算法复杂度及稳定性分析总结前言 本篇…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...
