我将帮您创建一个完整的Python分析脚本,用于将1399期数据进行自动分组并输出详细的特征表格。基于参考资料中提到的数据处理和特征工程技术,我将采用多种分组策略并提供全面的分析。
```python
import pandas as pd
import numpy as np
from sklearn.cluster import KMeans, DBSCAN
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.metrics import silhouette_score
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats
import warnings
warnings.filterwarnings('ignore')
class DataAutoGrouping:
def __init__(self, data_path=None, data_frame=None):
"""
初始化数据自动分组分析器
Parameters:
data_path: 数据文件路径
data_frame: 直接传入的DataFrame数据
"""
if data_path:
self.data = pd.read_csv(data_path)
elif data_frame is not None:
self.data = data_frame.copy()
else:
# 示例数据生成(实际使用时请替换为您的数据)
np.random.seed(42)
n_samples = 1399
self.data = pd.DataFrame({
'feature1': np.random.normal(0, 1, n_samples),
'feature2': np.random.normal(5, 2, n_samples),
'feature3': np.random.exponential(2, n_samples),
'feature4': np.random.uniform(-1, 1, n_samples),
'feature5': np.random.poisson(3, n_samples),
'target': np.random.choice([0, 1], n_samples, p=[0.7, 0.3])
})
self.scaler = StandardScaler()
self.grouping_results = {}
def data_preprocessing(self):
"""数据预处理和清洗"""
print("开始数据预处理...")
# 1. 处理缺失值
missing_info = self.data.isnull().sum()
print(f"缺失值统计:\n{missing_info[missing_info > 0]}")
# 数值型列用中位数填充
numeric_cols = self.data.select_dtypes(include=[np.number]).columns
self.data[numeric_cols] = self.data[numeric_cols].fillna(self.data[numeric_cols].median())
# 2. 异常值处理(使用IQR方法)
for col in numeric_cols:
Q1 = self.data[col].quantile(0.25)
Q3 = self.data[col].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
# 将异常值替换为边界值
self.data[col] = np.where(self.data[col] < lower_bound, lower_bound, self.data[col])
self.data[col] = np.where(self.data[col] > upper_bound, upper_bound, self.data[col])
# 3. 数据标准化
self.data_scaled = self.scaler.fit_transform(self.data[numeric_cols])
self.data_scaled = pd.DataFrame(self.data_scaled, columns=numeric_cols, index=self.data.index)
print("数据预处理完成!")
return self.data_scaled
def feature_importance_analysis(self):
"""特征重要性分析"""
print("\n开始特征重要性分析...")
# 使用相关系数分析
correlation_matrix = self.data.corr()
# 可视化相关性热力图
plt.figure(figsize=(12, 8))
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', center=0)
plt.title('特征相关性热力图')
plt.tight_layout()
plt.show()
# 计算与目标变量的相关性(如果有目标变量)
if 'target' in self.data.columns:
target_corr = correlation_matrix['target'].abs().sort_values(ascending=False)
print(f"特征与目标变量的相关性排序:\n{target_corr}")
return correlation_matrix
def kmeans_grouping(self, n_clusters_range=range(2, 8)):
"""K-means聚类分组"""
print("\n开始K-means聚类分析...")
best_score = -1
best_kmeans = None
best_n_clusters = 2
# 寻找最优聚类数
silhouette_scores = []
for n_clusters in n_clusters_range:
kmeans = KMeans(n_clusters=n_clusters, random_state=42, n_init=10)
cluster_labels = kmeans.fit_predict(self.data_scaled)
score = silhouette_score(self.data_scaled, cluster_labels)
silhouette_scores.append(score)
if score > best_score:
best_score = score
best_kmeans = kmeans
best_n_clusters = n_clusters
# 使用最优聚类数进行最终聚类
final_kmeans = KMeans(n_clusters=best_n_clusters, random_state=42, n_init=10)
kmeans_labels = final_kmeans.fit_predict(self.data_scaled)
self.data['kmeans_group'] = kmeans_labels
self.grouping_results['kmeans'] = {
'labels': kmeans_labels,
'model': final_kmeans,
'n_clusters': best_n_clusters,
'silhouette_score': best_score
}
print(f"K-means最优聚类数: {best_n_clusters}, 轮廓系数: {best_score:.4f}")
# 绘制轮廓系数图
plt.figure(figsize=(10, 6))
plt.plot(list(n_clusters_range), silhouette_scores, 'bo-')
plt.xlabel('聚类数量')
plt.ylabel('轮廓系数')
plt.title('K-means聚类轮廓系数分析')
plt.grid(True)
plt.show()
return kmeans_labels
def pca_grouping(self, n_components=2):
"""PCA降维分组"""
print("\n开始PCA降维分析...")
pca = PCA(n_components=n_components, random_state=42)
pca_result = pca.fit_transform(self.data_scaled)
# 将PCA结果作为新特征
for i in range(n_components):
self.data[f'pca_component_{i+1}'] = pca_result[:, i]
# 对PCA结果进行聚类
pca_kmeans = KMeans(n_clusters=3, random_state=42, n_init=10)
pca_labels = pca_kmeans.fit_predict(pca_result)
self.data['pca_group'] = pca_labels
self.grouping_results['pca'] = {
'pca_model': pca,
'explained_variance': pca.explained_variance_ratio_,
'labels': pca_labels
}
print(f"PCA解释方差比例: {pca.explained_variance_ratio_}")
print(f"累计解释方差: {sum(pca.explained_variance_ratio_):.4f}")
# 可视化PCA结果
if n_components >= 2:
plt.figure(figsize=(10, 8))
scatter = plt.scatter(pca_result[:, 0], pca_result[:, 1], c=pca_labels, cmap='viridis', alpha=0.7)
plt.colorbar(scatter)
plt.xlabel(f'PC1 ({pca.explained_variance_ratio_[0]:.2%})')
plt.ylabel(f'PC2 ({pca.explained_variance_ratio_[1]:.2%})')
plt.title('PCA降维可视化')
plt.grid(True, alpha=0.3)
plt.show()
return pca_labels
def quantile_grouping(self, n_groups=4):
"""基于分位数的分组"""
print(f"\n开始分位数分组({n_groups}组)...")
quantile_labels = {}
numeric_cols = self.data.select_dtypes(include=[np.number]).columns
for col in numeric_cols:
if col not in ['target', 'kmeans_group', 'pca_group']:
# 创建分位数分组
quantile_col = f'{col}_quantile_group'
self.data[quantile_col] = pd.qcut(self.data[col], n_groups, labels=False, duplicates='drop')
quantile_labels[col] = self.data[quantile_col].value_counts().sort_index()
self.grouping_results['quantile'] = quantile_labels
return quantile_labels
def generate_group_statistics(self):
"""生成详细的组统计信息"""
print("\n生成分组统计信息...")
grouping_methods = ['kmeans_group', 'pca_group']
statistics_tables = {}
for method in grouping_methods:
if method in self.data.columns:
# 计算每个组的统计特征
group_stats = self.data.groupby(method).agg({
col: ['count', 'mean', 'std', 'min', 'max', 'median']
for col in self.data.select_dtypes(include=[np.number]).columns
if col not in grouping_methods
})
statistics_tables[method] = group_stats
print(f"\n{method} 分组统计:")
print("=" * 50)
# 简化显示主要统计信息
simplified_stats = self.data.groupby(method).mean()
print(simplified_stats.round(4))
return statistics_tables
def export_detailed_tables(self, output_path='grouping_analysis_results.xlsx'):
"""导出详细的分析表格"""
print(f"\n导出分析结果到: {output_path}")
with pd.ExcelWriter(output_path, engine='openpyxl') as writer:
# 1. 原始数据(带分组标签)
self.data.to_excel(writer, sheet_name='原始数据与分组', index=False)
# 2. K-means分组详细统计
if 'kmeans_group' in self.data.columns:
kmeans_stats = self.data.groupby('kmeans_group').describe()
kmeans_stats.to_excel(writer, sheet_name='K-means分组统计')
# 每组特征均值对比
kmeans_means = self.data.groupby('kmeans_group').mean()
kmeans_means.to_excel(writer, sheet_name='K-means组特征均值')
# 3. PCA分组详细统计
if 'pca_group' in self.data.columns:
pca_stats = self.data.groupby('pca_group').describe()
pca_stats.to_excel(writer, sheet_name='PCA分组统计')
pca_means = self.data.groupby('pca_group').mean()
pca_means.to_excel(writer, sheet_name='PCA组特征均值')
# 4. 分组对比分析
comparison_data = []
for method in ['kmeans_group', 'pca_group']:
if method in self.data.columns:
for group in sorted(self.data[method].unique()):
group_data = self.data[self.data[method] == group]
comparison_data.append({
'分组方法': method,
'组别': group,
'样本数量': len(group_data),
'平均特征1': group_data.iloc[:, 0].mean() if len(group_data) > 0 else 0,
'平均特征2': group_data.iloc[:, 1].mean() if len(group_data) > 0 else 0,
})
if comparison_data:
comparison_df = pd.DataFrame(comparison_data)
comparison_df.to_excel(writer, sheet_name='分组对比', index=False)
print("表格导出完成!")
def comprehensive_analysis_report(self):
"""生成综合分析报告"""
print("\n" + "="*60)
print(" 数据自动分组分析报告")
print("="*60)
print(f"数据集大小: {len(self.data)} 行 × {len(self.data.columns)} 列")
print(f"数值型特征数量: {len(self.data.select_dtypes(include=[np.number]).columns)}")
# 分组方法总结
print("\n应用的分组方法:")
grouping_methods = [col for col in self.data.columns if 'group' in col]
for method in grouping_methods:
group_counts = self.data[method].value_counts().sort_index()
print(f"- {method}: {len(group_counts)} 个组")
print(f" 组分布: {dict(group_counts)}")
# 特征重要性总结
if 'target' in self.data.columns:
corr_with_target = self.data.corr()['target'].abs().sort_values(ascending=False)
top_features = corr_with_target.head(5)
print(f"\n与目标变量最相关的5个特征:")
for feature, corr in top_features.items():
if feature != 'target':
print(f" {feature}: {corr:.4f}")
def run_complete_analysis(self):
"""运行完整的分析流程"""
print("开始1399期数据自动分组分析...")
# 1. 数据预处理
self.data_preprocessing()
# 2. 特征分析
self.feature_importance_analysis()
# 3. 多种分组方法
self.kmeans_grouping()
self.pca_grouping()
self.quantile_grouping()
# 4. 统计分析和结果导出
self.generate_group_statistics()
self.export_detailed_tables()
# 5. 综合报告
self.comprehensive_analysis_report()
print("\n分析完成!")
return self.data
# 使用示例
if __name__ == "__main__":
# 方法1: 从文件加载数据
# analyzer = DataAutoGrouping(data_path='your_data.csv')
# 方法2: 使用示例数据
analyzer = DataAutoGrouping()
# 运行完整分析
result_data = analyzer.run_complete_analysis()
# 显示最终数据的前几行
print("\n最终数据前5行预览:")
print(result_data.head())
```
这个完整的Python分析脚本提供了以下核心功能:
## 主要特性
| 功能模块 | 实现方法 | 输出结果 |
|---------|---------|----------|
| **数据预处理** | 缺失值处理、异常值检测、数据标准化 | 清洗后的标准化数据 |
| **特征分析** | 相关性分析、热力图可视化 | 特征重要性排序 |
| **K-means聚类** | 自动确定最优聚类数、轮廓系数评估 | 基于数据分布的智能分组 |
| **PCA降维分组** | 主成分分析、降维可视化 | 基于主要特征的简化分组 |
| **分位数分组** | 基于特征值的分位数切割 | 等量样本分组 |
## 输出表格内容
1. **原始数据与分组标签** - 包含所有原始特征和分组结果
2. **K-means分组统计** - 每组的详细统计描述(计数、均值、标准差等)
3. **PCA分组统计** - 基于主成分的分组统计分析
4. **分组对比表** - 不同分组方法的横向对比
## 技术特点
- **自动优化**:K-means自动选择最优聚类数量[ref_1]
- **多方法对比**:提供多种分组策略的对比分析[ref_4]
- **完整可视化**:包含相关性热力图、PCA散点图、轮廓系数图等
- **详细统计**:为每个分组提供全面的特征统计信息[ref_3]
## 使用说明
1. **数据准备**:将您的1399期数据保存为CSV文件或直接传入DataFrame
2. **运行分析**:执行`run_complete_analysis()`方法
3. **结果获取**:分析结果将保存为Excel文件,包含多个详细表格
该脚本结合了特征工程[ref_1]、数据预处理[ref_4]和机器学习聚类技术[ref_3],能够对1399期数据进行全面自动化的分组分析,并输出专业级的分析报告和统计表格。