用Python和K-Means聚类分析生活模式:从数据采集到AI应用

发布时间:2026/8/29 6:40:01
用Python和K-Means聚类分析生活模式:从数据采集到AI应用 很多刚接触 AI 的同学都有一个困惑AI 到底能分析我们日常生活中的哪些信息每天起床、通勤、工作、休息、睡眠……这些看起来零散的行为记录如果堆积到一定规模其实是可挖掘的“时序数据”。本文就用一个完整的实战思路带大家从采集、清洗、特征工程到模型聚类把“生活模式”拆解成可量化的分析项目。我不打算只停留在概念层面而是结合 Python 工具链给出可复用的代码让大家看明白 AI 分析生活模式是怎么一步步完成的。无论你是刚入门的数据分析爱好者还是准备做智能体、AI 应用开发的工程师这套流程都能提供参考。1. AI 分析生活模式它在解决什么问题1.1 什么是生活模式生活模式指的是一个人在一段时间里重复出现的行为节奏。比如每天晚上 23:30 左右入睡早晨 07:00 前后醒来。工作日集中在 09:30 到 18:00 处于工作状态。每周运动 3 次每次持续 40 到 60 分钟。通勤路上习惯听播客周末下午常去图书馆。这些行为单独看没有明显规律但如果把时间、地点、行为类型放到一起去统计就会发现个人生活里的周期性、习惯性结构。所谓“用 AI 分析生活模式”本质上是把行为数据化再通过统计、机器学习甚至大模型来识别其中的规律。1.2 AI 在其中的角色传统的数据分析也能做统计平均数、最大值、占比、周趋势。但 AI 的参与带来三个关键能力自动聚类不靠人预先定义“你分几类习惯”而是让模型根据特征自己发现行为群组。时序挖掘识别行为的周期性和突变点例如“最近两周睡眠时间明显后移”。语义化理解结合大模型把数值结果转成可读的自然语言建议比如“你本周平均入睡时间比上周晚了 40 分钟”。这也是为什么现在大家总说“AI 应用开发”不只是调用接口而是要处理好数据、特征、模型和业务逻辑的组合。1.3 适用场景这类能力可以应用在场景具体价值个人健康管理分析睡眠、运动、久坐时长效率工具识别专注时间段和频繁打扰源智能体应用为用户生成个性化日程建议产品用户画像分析用户活跃时段与留存关系行为安全风控检测异常作息和行为突变从工程角度来看这些场景的数据结构其实非常相似一张带有时间戳的行为事件表加上若干维度字段就可以跑通一套分析流程。2. 环境准备与版本说明本文的实战代码以 Python 为主涉及的库如下Python建议 3.10 及以上版本。pandas负责数据读取、清洗和聚合。numpy负责数值计算。scikit-learn提供聚类、标准化等机器学习算法。matplotlib绘制图表观察趋势。可选openai 或其他大模型 SDK用于生成文本总结决定 AI Agent 应用层次。版本不需要刻意追求最新只要保持相互兼容即可。比如我用的是 pandas 2.0 系列scikit-learn 1.3 系列这些库的 API 比较稳定。安装命令pip install pandas numpy scikit-learn matplotlib如果你还想体验“大模型总结生活模式”可以再安装pip install openai但要注意大模型调用属于可选部分。真正决定分析质量的是前期的数据处理和特征设计不要一上来就指望大模型替我们完成所有数学计算。3. 生活数据的采集与组织方式3.1 数据从哪来很多人会卡在第一步我没有现成的数据集。事实上生活数据的来源远比你想象的丰富手机系统健康数据iOS“健康”App 可以导出睡眠、步数、心率数据Android 也有类似接口。可穿戴设备手环、手表通常支持导出 CSV 历史记录。日历与屏幕时间日历可以导出事件屏幕时间可以统计各 App 使用时长。手动记录写一个简单的打卡脚本记录起床、睡觉、运动、喝水等时间点。智能家居日志智能灯、智能门锁的开关时间也能反映起居规律。考虑到个人隐私本文示例会使用一份模拟生成的 CSV 数据。你完全可以把数据替换成自己设备导出的真实数据但要注意脱敏。3.2 数据结构设计生活模式分析基本围绕“行为事件表”展开。建议最少包含以下字段字段名类型说明timestampdatetime事件发生时间event_typestring行为类型如 sleep、work、exerciseduration_minint持续时间单位分钟locationstring地点或环境标签notestring备注可选下面是一段模拟数据样例timestamp,event_type,duration_min,location 2025-01-01 23:30:00,sleep_start,480,home 2025-01-02 07:30:00,wake_up,0,home 2025-01-02 09:00:00,work_start,120,office 2025-01-02 12:00:00,lunch,45,canteen 2025-01-02 14:00:00,work_start,150,office 2025-01-02 19:00:00,exercise,50,gym这张表是后续所有特征工程的基础。为了方便分析我们后面会把它转换成“按天聚合”的宽表。3.3 数据加载先让代码读入 CSV 文件import pandas as pd df pd.read_csv(life_events.csv, parse_dates[timestamp]) print(df.head()) print(df.dtypes)这里用parse_dates直接把timestamp列解析成 datetime 类型避免后续手动转换。4. 数据清洗与特征工程4.1 时间字段拆解拿到原始事件表后第一件事是构造“按天”的行为特征。因为生活模式分析通常以一天为最小观察单元。df[date] df[timestamp].dt.date df[hour] df[timestamp].dt.hour df[weekday] df[timestamp].dt.dayofweek # Monday0, Sunday6 # 提取事件类型完成一天的作息 daily_summary df.groupby(date).agg( first_event(timestamp, min), last_event(timestamp, max), event_count(event_type, count), ).reset_index()这里first_event和last_event是当天最早的记录和最晚的记录能估算出活跃时间跨度。4.2 行为特征计算假设我们需要分析睡眠和运动规律就需要从事件表里单独抽出对应的事件再按天计算# 睡眠时长以 sleep_start 事件为例这里简化处理 sleep_start df[df[event_type] sleep_start].set_index(date)[timestamp] wake_up df[df[event_type] wake_up].set_index(date)[timestamp] sleep_df pd.DataFrame({ sleep_time: sleep_start, wake_time: wake_up, }) sleep_df[sleep_duration_h] ( sleep_df[wake_time] - sleep_df[sleep_time] ).dt.total_seconds() / 3600 # 运动时长 exercise_df df[df[event_type] exercise].groupby(date)[duration_min].sum()实际设备导出的数据可能会有偏差比如睡眠时间跨午夜、多平台重复记录这些都需要结合具体数据源去调整清洗规则。4.3 特征表拼接把不同行为汇总到同一张按天特征表上是进入机器学习前最关键的一步feature_df daily_summary.copy() feature_df feature_df.merge( sleep_df[[sleep_time, wake_time, sleep_duration_h]], ondate, howleft ) feature_df feature_df.merge( exercise_df.rename(exercise_min), ondate, howleft ) feature_df[weekday] pd.to_datetime(feature_df[date]).dt.dayofweek feature_df[is_weekend] feature_df[weekday].apply(lambda x: 1 if x 5 else 0)这里的is_weekend是一个典型的人工特征模型可以通过它区分工作日和周末的行为差异。特征工程的本质就是把“原始事件”变成“机器学习能理解的数字”。数据越规整后面的聚类、预测越稳定。5. 从统计规则到机器学习聚类5.1 先看统计别急着上模型在调用任何 AI 模型之前先做一次描述性统计能帮助你建立对数据的直觉print(feature_df.describe())比如你会看到平均睡眠时长是多少运动时长的分布是否偏态。这阶段不需要用复杂算法却能避免后面出现“模型输出很漂亮但业务解释不了”的尴尬局面。5.2 K-Means 聚类识别行为群组当特征表构造好后一个非常典型的无监督学习任务是把人按生活模式分组。这里我们用 K-Means。为什么要聚类因为生活模式并不存在标准答案。有人是早起型有人是夜猫子有人每天运动有人集中在周末活动。聚类能让我们不预设标签让算法自己发现相似的行为样本。from sklearn.cluster import KMeans from sklearn.preprocessing import StandardScaler import numpy as np # 选择特征列 features [sleep_duration_h, exercise_min, event_count, is_weekend] X feature_df[features].fillna(0) # 标准化 scaler StandardScaler() X_scaled scaler.fit_transform(X) # 训练模型 kmeans KMeans(n_clusters3, random_state42, n_init10) feature_df[cluster] kmeans.fit_predict(X_scaled) print(feature_df.groupby(cluster)[features].mean())这里有三个细节值得注意fillna(0)是把缺失的睡眠或运动记录视为 0。实际项目中如果缺失太多建议先分析缺失原因。StandardScaler很关键因为睡眠时长和运动时长的数值量级不同不标准化会让聚类结果被大数值特征主导。n_clusters3是我们预设的类别数。更严谨的做法是用“肘部法则”或“轮廓系数”来确定合理聚类数。5.3 时序规律挖掘除了聚类生活模式还有一个重要维度周期性。比如睡眠时间是否呈现“工作日早睡、周末晚睡”的双峰结构。可以用一个简单的方式观察# 按星期几计算平均入睡时间 feature_df[sleep_time_hour] feature_df[sleep_time].dt.hour feature_df[sleep_time].dt.minute / 60 weekly_pattern feature_df.groupby(weekday)[sleep_time_hour].mean() print(weekly_pattern)如果发现周末入睡时间比工作日明显后移这就是一个可以被自动识别的生活模式信号。更复杂的时间序列分解、突变点检测可以在数据量足够后继续引入。6. 完整实战AI 分析一周作息模式接下来我们把上面的代码串联成一个可运行的完整脚本。6.1 项目结构建议按照下面的结构组织文件life-pattern-analysis/ ├── data/ │ └── life_events.csv ├── src/ │ ├── preprocess.py │ ├── train_cluster.py │ └── visualize.py ├── main.py └── requirements.txt这样可以避免后续功能多了以后文件堆在一起难以维护。6.2 数据准备为了演示我们先造一份 60 天的模拟数据。这里用随机数生成实际项目中请替换为真实导出的数据。# 文件路径src/generate_demo_data.py import pandas as pd import numpy as np np.random.seed(42) n_days 60 base pd.Timestamp(2025-01-01) records [] for i in range(n_days): day base pd.Timedelta(daysi) is_weekend day.dayofweek 5 # 工作日睡得相对规律周末偏晚 sleep_hour 23 (0.5 if is_weekend else 0) np.random.normal(0, 0.2) sleep_minute int(np.random.normal(0, 15)) sleep_time day pd.Timedelta(hoursint(sleep_hour), minutessleep_minute) # 工作日 7 点起周末 8 点起 wake_hour 7 (1 if is_weekend else 0) np.random.normal(0, 0.3) wake_minute int(np.random.normal(0, 20)) wake_time sleep_time pd.Timedelta(hours7 int(np.random.normal(0, 0.5))) records.append({ timestamp: sleep_time, event_type: sleep_start, duration_min: 0, location: home }) records.append({ timestamp: wake_time, event_type: wake_up, duration_min: 0, location: home }) # 运动随机出现在部分日期 if np.random.rand() 0.4: exercise_start wake_time pd.Timedelta(hours9) records.append({ timestamp: exercise_start, event_type: exercise, duration_min: int(np.random.normal(50, 15)), location: gym, }) df pd.DataFrame(records).sort_values(timestamp) df.to_csv(data/life_events.csv, indexFalse) print(模拟数据已生成, df.shape)这段代码生成了 60 天的睡眠、起床和运动事件文件输出到data/life_events.csv。6.3 核心分析脚本接下来是主分析脚本它完成特征工程和聚类# 文件路径main.py import pandas as pd from sklearn.cluster import KMeans from sklearn.preprocessing import StandardScaler # 1. 读取数据 df pd.read_csv(data/life_events.csv, parse_dates[timestamp]) df[date] df[timestamp].dt.date # 2. 拆分行为数据 sleep_start df[df[event_type] sleep_start].set_index(date)[timestamp] wake_up df[df[event_type] wake_up].set_index(date)[timestamp] sleep_df pd.DataFrame({ sleep_time: sleep_start, wake_time: wake_up, }) sleep_df[sleep_duration_h] ( sleep_df[wake_time] - sleep_df[sleep_time] ).dt.total_seconds() / 3600 exercise_df df[df[event_type] exercise].groupby(date)[duration_min].sum().rename(exercise_min) # 3. 合并特征表 feature_df sleep_df.merge(exercise_df, left_indexTrue, right_indexTrue, howleft) feature_df[exercise_min] feature_df[exercise_min].fillna(0).astype(int) # 添加日期属性 feature_df feature_df.reset_index() feature_df feature_df.rename(columns{index: date}) feature_df[weekday] pd.to_datetime(feature_df[date]).dt.dayofweek feature_df[is_weekend] feature_df[weekday].apply(lambda x: 1 if x 5 else 0) # 4. 特征选择与标准化 features [sleep_duration_h, exercise_min, is_weekend] X feature_df[features] scaler StandardScaler() X_scaled scaler.fit_transform(X) # 5. 聚类 kmeans KMeans(n_clusters3, random_state42, n_init10) feature_df[cluster] kmeans.fit_predict(X_scaled) # 6. 输出每类生活模式的平均特征 cluster_summary feature_df.groupby(cluster)[features].mean().round(2) print(cluster_summary) # 7. 输出最近 7 天聚类归属 recent feature_df.sort_values(date).tail(7)[[date, sleep_duration_h, exercise_min, cluster]] print(recent)运行脚本python main.py预期输出会是一个三维聚类结果例如clustersleep_duration_hexercise_minis_weekend07.20.00.1017.847.01.0027.50.00.20这说明模型自动发现了一类“规律运动型”、一类“久坐型”、还有一类“周末活跃型”。6.4 可视化辅助判断最后加一个简单的可视化用散点图看睡眠时长与运动时间的关系import matplotlib.pyplot as plt plt.figure(figsize(8, 5)) colors [#1f77b4, #ff7f0e, #2ca02c] for c in sorted(feature_df[cluster].unique()): subset feature_df[feature_df[cluster] c] plt.scatter(subset[sleep_duration_h], subset[exercise_min], labelfCluster {c}, colorcolors[c], alpha0.7) plt.xlabel(Sleep Duration (h)) plt.ylabel(Exercise Duration (min)) plt.title(Life Pattern Clusters) plt.legend() plt.tight_layout() plt.savefig(life_pattern_clusters.png, dpi150)如果聚类效果明显不同颜色的点会分布在不同的区域我们就能直观看到“生活模式”被拆成了几类。7. 将分析结果接入 AI Agent 与大模型7.1 为什么要接入大模型前面的聚类分析已经给出了“你属于哪种生活模式”但对普通用户来说直接给出一堆数字并不友好。这时可以让大模型把结果转成自然语言建议。示例思路如下# 伪代码需要根据实际环境配置 API Key def generate_life_summary(user_features): prompt f 根据以下数据总结用户的生活模式 - 平均睡眠时长{user_features[sleep_duration_h]} 小时 - 平均运动时长{user_features[exercise_min]} 分钟 - 是否周末活跃{是 if user_features[is_weekend] else 否} 请用简洁中文输出三条建议。 # response chat_model.chat(prompt) return response这种“机器学习聚类 大模型生成”的链路就是现在 AI 应用开发里常说的 Agent 模式先用确定性的算法处理数据再用语言模型提供可交互的解释。7.2 接入时的注意事项大模型不是必须的。如果你的业务目标是把模式用于推荐系统聚类结果本身就已经足够如果目标是做个人健康助手那么大模型总结会显著提升体验。关键点在于控制隐私和数据范围敏感行为数据不要上传到外部大模型。如果必须使用云端模型优先做去标识化处理。建议把数值统计结果作为 prompt 输入而不是把原始事件表整段传上去。8. 常见问题与排查思路现象可能原因解决方向timestamp 列解析失败日期格式不是标准 ISO 格式用pd.to_datetime(..., format%Y-%m-%d %H:%M:%S)指定格式睡眠时长出现负数睡眠事件跨午夜wake_time 早于 sleep_time判断上一晚的 sleep_start 与当天上午的 wake_up 配对缺失值太多部分日期没有行为记录先分析缺失原因记录缺失与行为缺失要区分聚类结果难以解释特征选择不当或聚类数太多/太少减少特征维度用轮廓系数重新选择 k运动时长为 0 被聚成一类大量无运动记录区分“真实未运动”和“数据未记录”设备导出的数据存在重复记录健康 App 与手环重复同步按 timestamp event_type 去重线上部署时内存不足数据量太大使用采样、数据库聚合或 Spark 等分布式方案排查时建议先打印数据形状和统计信息优先确认数据清洗是否正确再考虑算法调参。大部分分析结果异常根因都在数据阶段。9. 最佳实践与工程建议9.1 数据层面建立统一的事件命名规范例如sleep_start、wake_up、exercise不要用口语化的“睡午觉”“运动了一会”这种无法聚合的文本。保留原始时间戳永远不要在原始数据上覆盖加工推荐使用 CSV、Parquet 或 SQLite 存储历史版本。时间字段统一使用带时区的 UTC 或本地时间避免跨设备时区混乱。注意隐私合规采集数据前应获得用户授权删除可识别身份的信息。9.2 模型层面无监督聚类适合发现未知行为群体有监督分类适合在你已经知道标签时使用例如“早睡型/晚睡型/不规律型”。每次跑实验前固定random_state保证结果可复现。聚类前使用标准化避免特征量纲影响距离计算。不要只看聚类结果要结合业务语义判断每个类别是否真的有价值。9.3 工程层面把数据清洗、特征工程、模型训练拆成独立模块方便测试和替换数据源。记录每次实验的特征列表和参数配置推荐使用简单的 YAML 或 JSON 配置文件。日志要记录数据行数、缺失值比例、聚类分布方便事后回溯。如果需要持续分析用户变化建议做“周级别重训练”而不是每天全量跑一遍。10. 总结与学习路线本文通过一个完整的生活模式分析项目介绍了 AI 分析生活数据的核心链路先采集行为事件再做清洗和特征工程然后用 K-Means 等无监督模型识别行为群组。整个过程不依赖任何特殊硬件普通笔记本电脑就能跑通。如果接下来想继续深入可以按以下路线学习学习时间序列分析用 ARIMA、Prophet 预测睡眠时间变化趋势。学习序列挖掘分析行为事件之间的转移概率比如“运动之后是否睡眠质量更高”。学习异常检测用 Isolation Forest 检测作息突变点。学习 AI Agent 开发把聚类结果接入大模型做个性化生活建议助手。在实际项目中建议优先关注数据质量和隐私合规。很多分析项目失败不是因为模型不够高级而是数据不完整、时间配对错误、特征解释不清。先把基础的数据链路跑稳再加入更复杂的 AI 模型学习曲线会平滑很多。如果你正准备做一个生活类 AI 应用不妨先从本文的数据表结构和特征工程开始这会成为整个系统最稳定的一块地基。希望这篇教程能帮你少踩一些采集和预处理的坑。