数据分析实操聚集:
1、关于房间传感器监测数据集的探索
2、EEMD-LSTM模型择时计谋 — 1.EEMD分解与LSTM模型搭建
3、EEMD-LSTM模型择时计谋 — 2. 量化回测
4、国际超市电商销售数据分析
5、基于问卷观察数据的多元统计数据分析与预测(因子分析、对应分析与逻辑回归)
6、手写文本识别
7、语音情感识别
8、电商会员门店消耗数据分析
9、糖尿病风险预测模型分析与构建
10、基于卷积神经网络(CNN)和ResNet50的水果与蔬菜图像分类系统
11、门生烦闷环境可视化分析及预测
12、人脸心情识别(GUI实时识别)
13、基于LSTM的机场天气分析及模型预测
运动能量消耗数据分析
Background:数据集包含了来自不同用户的多项体征数据,包括性别、年事、身高、体重等基本信息,以及运动持续时间、心率和体温等与身体运动相关的数据。
通过分析这些数据,探索用户在进行身体运动时的热量消耗环境,即目标变量Calories,从而为个性化健身筹划或康健管理提供数据支持。
数据分析
基础统计分析
影响因素分析
构建预测模型
总结:通过数据分析可视化,清晰直观发现 持续时间越长,燃烧的卡路里就越高。、 心率跳动与燃烧的卡路里呈正相关。、 持续时间增长会导致心率和体温增长。
Importing Libraries 导入库
- import numpy as np
- import pandas as pd
- import matplotlib.pyplot as plt
- import seaborn as sns
- from scipy.stats import shapiro, kstest, mannwhitneyu, ttest_ind, levene
- from sklearn.preprocessing import LabelEncoder
- from sklearn.model_selection import train_test_split
- from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor
- from sklearn.metrics import mean_absolute_error
复制代码 数据准备
- data = pd.read_csv("/home/mw/input/02141492/calories.csv")
- data.sample(5)
复制代码
- data.select_dtypes('object').describe()
复制代码 Data Preprocessing 数据预处理
- data.shape
- data.isnull().sum()
复制代码
- data.columns = data.columns.str.lower()
复制代码- # 删除无关特征(如 User_Id)
- # data = data.drop(columns=["User_Id"])
- del data['user_id']
复制代码- data.plot.box(subplots=True, figsize=(10,5))
- plt.tight_layout()
复制代码
身高、体重、心率和体温存在非常值。
Data Distribution 数据分布
- import seaborn as sns
- print(sns.__version__)
- !pip install -U seaborn
- import seaborn as sns
- print(sns.__version__)
复制代码 ps:由于histplot 函数是在 seaborn 0.11.0 版本中引入的; seaborn 需更新到 0.11.0 以上。
- fig, axes = plt.subplots(4,2, figsize=(10,10))
- for i, column in enumerate(data.columns):
- row = i // 2
- col = i % 2
- if column in data.select_dtypes(np.number).columns:
- sns.histplot(data[column], ax=axes[row, col])
- else:
- count_values = data[column].value_counts()
- sns.barplot(x=count_values.index, y=count_values.values, ax=axes[row,col])
- axes[row, col].set_title(f'Distribution of {column}')
- axes[row, col].set_ylabel('frequency')
- plt.tight_layout()
复制代码
Correlations Analysis 相关性分析
- sns.heatmap(data[data.select_dtypes(np.number).columns].corr(), annot=True)
复制代码
1.持续时间越长,燃烧的卡路里就越高。
2.心率越快,燃烧的卡路里就越高。
3.年事和燃烧的卡路里具有较弱的相关性。
4.持续时间增长会导致心率和体温增长。
- gender_calories = data.groupby('gender')['calories'].mean()
- sns.barplot(x=gender_calories.index, y=gender_calories.values, palette='viridis')
- plt.ylabel('average calories')
- plt.title('Average Calories per Gender')
复制代码
据观察,男性组的平均卡路里燃烧量略高于女性组。
- kstest_res = []
- kruskal_test = []
- fig, axes = plt.subplots(1,2, figsize=(10,5))
- for i, gender in enumerate(data['gender'].unique()):
- to_test = data [ data['gender'] == gender]['calories']
- stats, pvalue = kstest(to_test, 'norm')
-
- if pvalue > 0.05:
- assumption = 'normal'
- else:
- assumption = 'not normal'
- kstest_res.append([gender, pvalue, assumption])
- kruskal_test.append(to_test)
- sns.histplot(to_test, ax=axes[i], palette='viridis')
- axes[i].set_title(f'Distribution for {gender} calories')
- axes[i].set_ylabel('frequency')
-
- kstest_df = pd.DataFrame(kstest_res, columns=['gender','pvalue','assumption'])
- kstest_df
复制代码
如图男性和女性卡路里的分布不呈正态。
- stats, pvalue = mannwhitneyu(*kruskal_test, alternative='greater')
- if pvalue <= 0.05:
- assumption = 'reject H0'
- else:
- assumption = 'accept H0'
- print('Kruskal pvalue:',pvalue,'\nAssumption:',assumption)
复制代码
p值表明,男性燃烧的卡路里并不显着高于女性。
Feature Engineering 特征工程
- encoder = LabelEncoder()
- model_data = data.copy()
- model_data['gender'] = encoder.fit_transform(model_data['gender'])
- model_data.sample(5)
复制代码 Predictive Modelling 预测建模
练习和测试
- x = model_data[['gender', 'age', 'height', 'weight', 'duration', 'heart_rate',
- 'body_temp']]
- y = model_data['calories']
- x_train, x_test, y_train, y_test = train_test_split(x, y,
- train_size=0.7,
- random_state=42)
复制代码- sns.scatterplot(x=x_train['heart_rate'],
- y=y_train,
- color=sns.color_palette('viridis')[4])
- sns.scatterplot(x=x_test['heart_rate'],
- y=y_test,
- color=sns.color_palette('viridis')[2])
复制代码
Random Forest Regressor 随机森林回归
- rf_model = RandomForestRegressor(n_estimators=1000,
- max_depth=15,
- max_features=3,
- oob_score=True,
- random_state=42)
- rf_model.fit(x_train, y_train)
- rf_predicted = rf_model.predict(x_test)
- rf_score = rf_model.score(x_test, y_test)
- rf_mae = mean_absolute_error(y_test, rf_predicted)
- rf_oob = rf_model.oob_score_
- rf_df
- = pd.DataFrame({'model':['Random Forest'],
- 'r2_score':[rf_score],
- 'rf_mae':[rf_mae],
- 'oob_score':[rf_oob]})
复制代码- sns.scatterplot(x=x_test['heart_rate'],
- y=y_test,
- color=sns.color_palette('viridis')[4])
- sns.lineplot(x=x_test['heart_rate'],
- y=rf_predicted,
- color=sns.color_palette('viridis')[2])
复制代码
Key Indicators 关键指标
- import pandas as pd
- import seaborn as sns
- import matplotlib.pyplot as plt
- rf_fi = pd.DataFrame({'feature':x.columns,
- 'importances':rf_model.feature_importances_})
- # 对 DataFrame 按照 'importances' 排序
- rf_fi_sorted = rf_fi.sort_values(by='importances', ascending=False)
- # 使用 seaborn 绘制条形图
- sns.barplot(data=rf_fi_sorted, x='importances', y='feature', palette='viridis')
- # 显示图表
- plt.show()
复制代码
持续时间对预测燃烧的卡路里影响最大。
Model Performance 模型性能
- # 检查缺失值
- print(data.isnull().sum())
- # 如果有缺失值,可以选择填充或删除
- data = data.dropna() # 删除缺失值
- # 分离特征和目标变量
- X = data.drop(columns=["calories"])
- y = data["calories"]
复制代码
- # 标准化特征
- from sklearn.preprocessing import StandardScaler
- scaler = StandardScaler()
- X_scaled = scaler.fit_transform(x)
复制代码 构建 XGBoost 模型
用 XGBoost 构建预测模型,并通过交叉验证评估模型性能
- from xgboost import XGBRegressor
- from sklearn.model_selection import train_test_split, cross_val_score
- # 划分训练集和测试集
- X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42)
- # 初始化 XGBoost 模型
- model = XGBRegressor(
- n_estimators=100, # 树的数量
- learning_rate=0.1, # 学习率
- max_depth=4, # 树的最大深度
- random_state=42
- )
- # 训练模型
- model.fit(X_train, y_train)
- # 交叉验证评估
- cv_scores = cross_val_score(model, X_train, y_train, cv=5, scoring="neg_mean_squared_error")
- print("Cross-Validation RMSE:", np.sqrt(-cv_scores).mean())
复制代码
模型评估
评估模型在测试集上的性能,并绘制预测结果与实际值的对比图。
- # 预测测试集
- y_pred = model.predict(X_test)
- # 计算评估指标
- from sklearn.metrics import mean_squared_error, r2_score
- mse = mean_squared_error(y_test, y_pred)
- r2 = r2_score(y_test, y_pred)
- print("MSE:", mse)
- print("R²:", r2)
- # 绘制预测结果与实际值的对比图
- plt.scatter(y_test, y_pred, alpha=0.5)
- plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], color="red", linestyle="--")
- plt.xlabel("Actual Calories")
- plt.ylabel("Predicted Calories")
- plt.title("Actual vs Predicted Calories")
- plt.show()
复制代码
特征重要性分析
分析特征对模型预测的贡献程度,帮助明确哪些因素对热量消耗的影响最大
- # 获取特征重要性
- feature_importances = model.feature_importances_
- feature_names = x.columns
- # 绘制特征重要性条形图
- sns.barplot(x=feature_importances, y=feature_names, palette="viridis")
- plt.xlabel("Importance")
- plt.ylabel("Features")
- plt.title("Feature Importances")
- plt.show()
复制代码
持续时间对预测燃烧的卡路里影响最大。
- # 若需要完整数据集以及代码请点击以下链接
- https://mbd.pub/o/bread/mbd-aJWUlJ9u
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |