# 导入必要的库
import pandas as pd
import numpy as np
# 1. 数据加载与初步探索
# 读取企鹅数据集,注意解析日期列(虽然这个数据集没有日期列,但展示parse_dates参数的用法)
penguins = pd.read_csv('data/penguins.csv')
print("数据集前5行:")
display(penguins.head())
print("\n数据集信息:")
display(penguins.info())
# 2. 数据清洗
# 检查缺失值
print("\n每列的缺失值数量:")
print(penguins.isnull().sum())
# 处理缺失值 - 删除含有缺失值的行
penguins_clean = penguins.dropna()
print("\n清洗后数据集形状:", penguins_clean.shape)
# 3. 数据转换与特征工程
# 将性别列转换为类别类型
penguins_clean['sex'] = penguins_clean['sex'].astype('category')
print("\n性别列数据类型:", penguins_clean['sex'].dtype)
# 创建新特征:喙长与喙深的比值
penguins_clean['bill_ratio'] = penguins_clean['bill_length_mm'] / penguins_clean['bill_depth_mm']
# 4. 数据分析
# 按物种分组计算平均特征值
species_stats = penguins_clean.groupby('species').agg({
'bill_length_mm': 'mean',
'bill_depth_mm': 'mean',
'flipper_length_mm': 'mean',
'body_mass_g': 'mean',
'bill_ratio': 'mean'
}).round(2)
print("\n不同物种的平均特征值:")
display(species_stats)
# 5. 数据分箱 - 将体重分为低、中、高三个等级
labels = ['低', '中', '高']
penguins_clean['mass_category'] = pd.cut(penguins_clean['body_mass_g'], bins=3, labels=labels)
print("\n体重分箱结果:")
display(penguins_clean['mass_category'].value_counts())
# 6. 按岛屿和性别分组分析
island_sex_stats = penguins_clean.groupby(['sex']).agg({
'body_mass_g': ['mean', 'count']
})
print("\n按性别分组的统计数据:")
print(island_sex_stats)
# 导入必要的库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# 设置可视化风格
plt.style.use('seaborn')
sns.set_palette("husl")
# 1. 数据加载与初步探索
# 读取睡眠数据集
sleep_data = pd.read_csv('sleep.csv')
# 显示前5行数据
print("数据集前5行:")
print(sleep_data.head())
# 显示数据集基本信息
print("\n数据集信息:")
print(sleep_data.info())
# 2. 数据清洗与预处理
# 检查缺失值
print("\n每列的缺失值数量:")
print(sleep_data.isnull().sum())
# 如果有缺失值,可以删除或填充
# 这里假设数据已经完整,直接复制
sleep_clean = sleep_data.copy()
# 3. 数据转换与特征工程
# 将性别列转换为类别类型
sleep_clean['gender'] = sleep_clean['gender'].astype('category')
# 分离血压为收缩压和舒张压
sleep_clean[['systolic_bp', 'diastolic_bp']] = sleep_clean['blood_pressure'].str.split('/', expand=True).astype(int)
# 创建睡眠质量分类列
bins = [0, 4, 7, 10]
labels = ['差', '中', '优']
sleep_clean['sleep_quality_category'] = pd.cut(sleep_clean['sleep_quality'], bins=bins, labels=labels)
# 创建年龄分段列
age_bins = [0, 30, 45, 60, 100]
age_labels = ['18-30', '31-45', '46-60', '60+']
sleep_clean['age_group'] = pd.cut(sleep_clean['age'], bins=age_bins, labels=age_labels)
# 4. 基本统计分析
# 描述性统计
print("\n数值变量的描述性统计:")
print(sleep_clean.describe())
# 分类变量统计
print("\n分类变量统计:")
print(sleep_clean['gender'].value_counts())
print("\nBMI类别分布:")
print(sleep_clean['bmi_category'].value_counts())
print("\n睡眠障碍分布:")
print(sleep_clean['sleep_disorder'].value_counts())
# 5. 睡眠质量分析
# 按性别分析平均睡眠时间和质量
gender_stats = sleep_clean.groupby('gender').agg({
'sleep_duration': 'mean',
'sleep_quality': 'mean',
'stress_level': 'mean'
}).round(2)
print("\n按性别分组的睡眠统计:")
print(gender_stats)
# 按BMI类别分析
bmi_stats = sleep_clean.groupby('bmi_category').agg({
'sleep_duration': 'mean',
'sleep_quality': 'mean',
'physical_activity_level': 'mean'
}).round(2)
print("\n按BMI类别分组的睡眠统计:")
print(bmi_stats)
# 6. 睡眠障碍分析
# 有睡眠障碍和无睡眠障碍的比较
disorder_stats = sleep_clean.groupby('sleep_disorder').agg({
'sleep_duration': ['mean', 'count'],
'sleep_quality': 'mean',
'age': 'mean',
'stress_level': 'mean'
}).round(2)
print("\n按睡眠障碍分组的统计:")
print(disorder_stats)
# 7. 相关性分析
# 计算数值变量之间的相关性
correlation = sleep_clean[['sleep_duration', 'sleep_quality', 'age', 'physical_activity_level',
'stress_level', 'heart_rate', 'daily_steps', 'systolic_bp', 'diastolic_bp']].corr()
print("\n变量间相关性矩阵:")
print(correlation)
# 8. 高级分析 - 多因素分组
# 按性别和年龄组分析
gender_age_stats = sleep_clean.groupby(['gender', 'age_group']).agg({
'sleep_duration': 'mean',
'sleep_quality': 'mean',
'stress_level': 'mean'
}).round(2)
print("\n按性别和年龄组分组的统计:")
print(gender_age_stats)
# 按职业和BMI类别分析
occupation_bmi_stats = sleep_clean.groupby(['occupation', 'bmi_category']).agg({
'sleep_duration': 'mean',
'sleep_quality': 'mean'
}).round(2)
print("\n按职业和BMI类别分组的统计:")
print(occupation_bmi_stats)
# 9. 数据可视化
# 设置图形大小
plt.figure(figsize=(15, 10))
# 睡眠质量分布
plt.subplot(2, 2, 1)
sns.histplot(sleep_clean['sleep_quality'], bins=10, kde=True)
plt.title('睡眠质量分布')
plt.xlabel('睡眠质量评分')
plt.ylabel('人数')
# 睡眠持续时间分布
plt.subplot(2, 2, 2)
sns.histplot(sleep_clean['sleep_duration'], bins=10, kde=True)
plt.title('睡眠持续时间分布')
plt.xlabel('睡眠时间(小时)')
plt.ylabel('人数')
# 睡眠质量与压力水平的关系
plt.subplot(2, 2, 3)
sns.scatterplot(x='stress_level', y='sleep_quality', hue='gender', data=sleep_clean)
plt.title('睡眠质量与压力水平的关系')
plt.xlabel('压力水平')
plt.ylabel('睡眠质量')
# 不同BMI类别的平均睡眠质量
plt.subplot(2, 2, 4)
sns.barplot(x='bmi_category', y='sleep_quality', data=sleep_clean, ci=None)
plt.title('不同BMI类别的平均睡眠质量')
plt.xlabel('BMI类别')
plt.ylabel('平均睡眠质量')
plt.tight_layout()
plt.show()
# 10. 更多可视化
plt.figure(figsize=(15, 5))
# 按年龄组的睡眠质量
plt.subplot(1, 2, 1)
sns.boxplot(x='age_group', y='sleep_quality', hue='gender', data=sleep_clean)
plt.title('不同年龄组的睡眠质量')
plt.xlabel('年龄组')
plt.ylabel('睡眠质量')
# 睡眠障碍与睡眠质量的关系
plt.subplot(1, 2, 2)
sns.boxplot(x='sleep_disorder', y='sleep_quality', data=sleep_clean)
plt.title('睡眠障碍与睡眠质量的关系')
plt.xlabel('睡眠障碍类型')
plt.ylabel('睡眠质量')
plt.tight_layout()
plt.show()
# 11. 保存处理后的数据
sleep_clean.to_csv('cleaned_sleep_data.csv', index=False)
print("\n处理后的数据已保存为 cleaned_sleep_data.csv")
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END











请登录后查看评论内容