关于房间传感器监测数据集的探索

1,背景描述

在建筑物中,供暖、通风和空调系统的能源消耗占据了很大比例。根据居住情况以需求为导向优化这些系统的使用,是一种提升能效的方法。
本数据集包含了某一房间 4 天内多个异构传感器测量的数据信息,如二氧化碳、温度、照明、声音和运动数据信息。基于这些数据,可以利用机器学习模型来预测估计房间内的居住者人数。
资料来源

2,数据说明

字段 说明
Date 日期,格式为日-月-年(DD-MM-YYYY)
Time 时间,格式为小时:分钟:秒(HH:MM:SS)
Temperature 温度,单位为摄氏度(°C)
Light 光照强度,单位为勒克斯(Lux)
Sound 声音电压,从放大器输出读取并由ADC(模数转换器)测量,单位为伏特(V)
CO2 二氧化碳浓度,单位为ppm(每百万份)
CO2 Slope 在滑动窗口中获取的CO2值的斜率
PIR 被动红外传感器的二进制值,表示是否检测到运动
Room_Occupancy_Count 房间占用计数(目标值),真实情况下的房间占用人数(Target)
S1-S7 代表不同的传感器序号

3,数据来源

https://www.semanticscholar.org/paper/Machine-Learning-Based-Occupancy-Estimation-Using-Singh-Jain/e631ea26f0fd88541f42b4e049d63d6b52d6d3ac
https://www.kaggle.com/datasets/ruchikakumbhar/room-occupancy-estimation

4,问题描述

二分类分析
回归分析
时间序列分析
特征重要性分析

5,数据读取与预处理

import pandas as pd
file_path = '/home/mw/input/02072495/room occupancy.csv'
data = pd.read_csv(file_path)

data.head()

在这里插入图片描述

data.shape

在这里插入图片描述

data.info()

在这里插入图片描述

data.isnull().sum()

在这里插入图片描述

# 查看重复值
data.duplicated().sum()
# 描述性统计
data.describe()

在这里插入图片描述

# 合并日期和时间为单一的时间戳列
data['Datetime'] = pd.to_datetime(data['Date'] + ' ' + data['Time'], format='%d-%m-%Y %H:%M:%S')
data.drop(['Date', 'Time'], axis=1, inplace=True)
from scipy.stats import spearmanr
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

def plot_spearmanr(data, features, title, wide, height):
    # 计算Spearman相关矩阵和p值矩阵
    spearman_corr_matrix = data[features].corr(method='spearman')
    pvals = data[features].corr(method=lambda x, y: spearmanr(x, y)[1]) - np.eye(len(data[features].columns))

    # 将p值转换为星号
    def convert_pvalue_to_asterisks(pvalue):
        if pvalue <= 0.001:
            return "***"
        elif pvalue <= 0.01:
            return "**"
        elif pvalue <= 0.05:
            return "*"
        return ""

    # 应用转换函数
    pval_star = pvals.applymap(convert_pvalue_to_asterisks)

    # 转换为numpy类型
    corr_star_annot = pval_star.to_numpy()

    # 定制 labels
    corr_labels = spearman_corr_matrix.to_numpy()
    p_labels = corr_star_annot
    shape = corr_labels.shape

    # 合并 labels
    labels = (np.asarray(["{0:.2f}\n{1}".format(data, p) for data, p in zip(corr_labels.flatten(), p_labels.flatten())])).reshape(shape)

    # 绘制热力图
    fig, ax = plt.subplots(figsize=(height, wide), dpi=100, facecolor="w")
    sns.heatmap(spearman_corr_matrix, annot=labels, fmt='', cmap='coolwarm',
                vmin=-1, vmax=1, annot_kws={
   
   "size":10, "fontweight":"bold"},
                linecolor="k", linewidths=.2, cbar_kws={
   
   "aspect":13}, ax=ax)

    ax.tick_params(bottom=False, labelbottom=True, labeltop=False,
                left=False, pad=1, labelsize=12)
    ax.yaxis.set_tick_params(labelrotation=0)

    # 自定义 colorbar 标签格式
    cbar = ax.collections[0].colorbar
    cbar.ax.tick_params(direction="in", width=.5, labelsize=10)
    cbar.set_ticks([-1, -0.5, 0, 0.5, 1])
    cbar.set_ticklabels(["-1.00", "-0.50", "0.00", "0.50", "1.00"])
    cbar.outline.set_visible(True)
    cbar.outline.set_linewidth(.5)

    plt.title(title)
    plt.show()

#删除不是float的类型
features = data.drop(['Datetime'],axis=1).columns.tolist()
plot_spearmanr(data, features, 'Spearman correlation coefficient heat map between variables', 10, 13)

在这里插入图片描述
温度 (Temp) 相关性:

S1_Temp, S2_Temp, S3_Temp, S4_Temp 四个传感器的温度数据之间的相关性非常高(大部分在0.80以上),这表明这些特征之间有冗余。因此,可以考虑将它们合成一个新的特征,例如它们的均值或最大值,以减少冗余并保留有用的信息。
特别是S1_Temp和S2_Temp与目标变量(Room_Occupancy_Count)有比较强的正相关(接近0.6),所以温度可以作为一个重要特征保留。
光照强度 (Light):

光照数据(S1_Light, S2_Light, S3_Light, S4_Light)与目标变量的相关性较强(约0.7-0.8),而这些传感器的光照数据之间的相关性也很高。因此,类似温度,我们可以将它们合成一个特征,如光照的平均值或最大值。
声音电压 (Sound):

S1_Sound, S2_Sound, S3_Sound, S4_Sound 的相关性比较弱(大多数都小于0.5),它们与目标变量的相关性也较弱。你可以考虑将声音电压的均值作为一个新特征,但这可能不是最重要的特征,取决于你对声音与占用人数之间的关系是否重视。
二氧化碳浓度 (CO2) 和二氧化碳斜率 (CO2_Slope):

S5_CO2与目标变量的相关性较强(约0.65),且它和S5_C02_Slope的相关性也比较强。这两个特征很可能提供了关于房间占用人数的重要信息,建议保持这两个特征,或将S5_CO2和S5_CO2_Slope的加权平均作为一个新特征。
运动 (PIR):

S6_PIR 和 S7_PIR 的相关性较强(接近0.6),且这两个特征与目标变量有较强的正相关性(接近0.6)。运动检测器与房间占用人数的相关性表明,运动数据应该是非常重要的特征。

# 计算不同传感器的温度均值
data['Temp_Avg'] = data[['S1_Temp', 'S2_Temp', 'S3_Temp', 'S4_Temp']].mean(axis=1)

# 计算不同传感器的光照强度均值
data['Light_Avg'] = data[['S1_Light', 'S2_Light', 'S3_Light', 'S4_Light']].mean(axis=1)

# 计算不同传感器的声音电压均值
data['Sound_Avg'] = data[['S1_Sound', 'S2_Sound', 'S3_Sound', 'S4_Sound']].mean(axis=1)

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, confusion_matrix
# 分别训练两个模型,选择效果更好的那个
X = data[['Temp_Avg', 'Light_Avg', 'Sound_Avg', 'S5_CO2', 'S5_CO2_Slope']]

# 用第一个传感器的数据
y1 =
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值