赞
踩
今天在做聚类分析的时候程序跑通了。但是聚类的结果显示为空(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())
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。