今天在做聚类分析的时候程序跑通了。但是聚类的结果显示为空(NaN)
首先检查原始数据集是否有空值
print(data.isnull().sum())
显示没有空值:
性别 0
BMI健康系数 0
饮食情况 0
外卖频率 0
饮食态度 0
肠胃情况 0
dtype: int64
接着如果使用了NumPy进行标准化,可以使用以下代码检查标准化后的数据集是否存在NaN值
import numpy as np
print(np.isnan(X_scaled).sum())
显示也不存在空值(输出为0)
接着检查代码,发现时有一列
data['gender_score'] = data['性别'].map({'男': 1, '女': 2}) # 将性别映射为得分
这里与源数据的xlsx里面的对应列的值对不上,应该改为
data['gender_score'] = data['性别'].map({1: 1, 2: 2})
至此顺利运行。
---------------------------------------------------附上源代码---------------------------------------------------------------
import pandas as pd
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
from sklearn.impute import SimpleImputer
import chardet
# 读取数据,仅选择特定列
data = pd.read_excel('ju.xlsx', usecols=['性别', 'BMI健康系数', '饮食情况', '外卖频率', '饮食态度', '肠胃情况'])
X = data[['性别', 'BMI健康系数', '饮食情况', '外卖频率', '饮食态度', '肠胃情况']]
# 检查原始数据集中的缺失值
print(data.isnull().sum())
# 使用SimpleImputer对缺失值进行填充
imputer = SimpleImputer(strategy='mean')
X_imputed = imputer.fit_transform(X)
# 数据预处理
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X_imputed)
# 根据赋分规则进行转换
# 根据新的赋分规则进行转换
data['BMI_score'] = data['BMI健康系数'].map({3: 10, 4: 6, 2: 6, 1: 2, 5: 2})
# 饮食情况
diet_mapping = {1: 10, 2: 7, 3: 4, 4: 1}
data['diet_score'] = data['饮食情况'].map(diet_mapping)
# 外卖频率
takeout_mapping = {1: 10, 2: 6, 3: 2}
data['takeout_score'] = data['外卖频率'].map(takeout_mapping)
# 饮食态度
attitude_mapping = {1: 10, 2: 7, 3: 4, 4: 1}
data['attitude_score'] = data['饮食态度'].map(attitude_mapping)
# 肠胃情况
stomach_mapping = {1: 10, 2: 5, 3: 2}
data['stomach_score'] = data['肠胃情况'].map(stomach_mapping)
# 考虑性别和年龄的赋分
data['gender_score'] = data['性别'].map({1: 1, 2: 2}) # 将性别映射为得分
# 最后计算总分(包括性别、年龄得分)
data['total_score'] = data['BMI_score'] + data['diet_score'] + data['takeout_score'] + data['attitude_score'] + data['stomach_score'] + data['gender_score']
data.dropna(inplace=True)
import numpy as np
print(np.isnan(X_scaled).sum())
# 聚类分析
kmeans = KMeans(n_clusters=3, random_state=42)
data['cluster'] = kmeans.fit_predict(X_scaled)
# 打印结果
print(data['cluster'].value_counts())
print(data.groupby('cluster').mean())