Spaces:
Sleeping
Sleeping
File size: 6,285 Bytes
bcb314a |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 |
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
def analyze_extracted_features():
"""Анализ извлеченных признаков"""
# Загружаем извлеченные признаки
features_df = pd.read_csv('real_data_features.csv', index_col=0)
print("📊 ДЕТАЛЬНЫЙ АНАЛИЗ ИЗВЛЕЧЕННЫХ ПРИЗНАКОВ")
print("=" * 50)
print(f"Всего признаков: {len(features_df.columns)}")
print(f"Обработано строк: {len(features_df)}")
# Анализ заполненности
null_analysis = features_df.isnull().sum()
null_features = null_analysis[null_analysis > 0]
if len(null_features) > 0:
print(f"\n❌ Признаки с пропусками:")
for feature, null_count in null_features.items():
print(f" {feature}: {null_count} пропусков ({null_count / len(features_df):.1%})")
else:
print(f"\n✅ Все признаки полностью заполнены!")
# Статистика по числовым признакам
numeric_features = features_df.select_dtypes(include=[np.number])
print(f"\n📈 СТАТИСТИКА ПРИЗНАКОВ:")
stats_summary = numeric_features.agg(['mean', 'std', 'min', 'max']).T
stats_summary['cv'] = stats_summary['std'] / stats_summary['mean'] # Коэффициент вариации
# Показываем топ-10 самых информативных признаков
informative_features = stats_summary[stats_summary['std'] > 0].sort_values('cv', ascending=False)
print(f"\n🎯 ТОП-10 самых информативных признаков (по вариативности):")
for feature, row in informative_features.head(10).iterrows():
print(f" {feature:25} mean={row['mean']:6.2f} std={row['std']:6.2f} cv={row['cv']:.2f}")
# Визуализация распределения ключевых признаков
key_features = ['text_length', 'word_count', 'lexical_diversity', 'composite_quality_score']
available_features = [f for f in key_features if f in numeric_features.columns]
if available_features:
plt.figure(figsize=(15, 10))
for i, feature in enumerate(available_features, 1):
plt.subplot(2, 2, i)
plt.hist(numeric_features[feature].dropna(), bins=20, alpha=0.7, edgecolor='black')
plt.title(f'Распределение {feature}')
plt.xlabel(feature)
plt.ylabel('Частота')
plt.tight_layout()
plt.savefig('features_distribution.png', dpi=150, bbox_inches='tight')
plt.show()
print(f"\n📊 Визуализация сохранена в features_distribution.png")
# Анализ корреляций между признаками
if len(numeric_features.columns) > 5:
# Выбираем топ-15 самых вариативных признаков для корреляционной матрицы
top_features = informative_features.head(15).index.tolist()
plt.figure(figsize=(12, 10))
correlation_matrix = numeric_features[top_features].corr()
mask = np.triu(np.ones_like(correlation_matrix, dtype=bool))
sns.heatmap(correlation_matrix, mask=mask, annot=True, fmt='.2f', cmap='coolwarm',
center=0, square=True, cbar_kws={"shrink": .8})
plt.title('Корреляционная матрица признаков (топ-15)')
plt.tight_layout()
plt.savefig('features_correlation.png', dpi=150, bbox_inches='tight')
plt.show()
print(f"📈 Корреляционная матрица сохранена в features_correlation.png")
# Анализ качества композитного показателя
if 'composite_quality_score' in numeric_features.columns:
print(f"\n🎯 АНАЛИЗ КОМПОЗИТНОГО ПОКАЗАТЕЛЯ КАЧЕСТВА:")
quality_scores = numeric_features['composite_quality_score']
print(f" Среднее: {quality_scores.mean():.3f}")
print(f" Стандартное отклонение: {quality_scores.std():.3f}")
print(f" Диапазон: [{quality_scores.min():.3f}, {quality_scores.max():.3f}]")
# Распределение по квантилям
quantiles = quality_scores.quantile([0.25, 0.5, 0.75])
print(f" Квантили: 25%={quantiles[0.25]:.3f}, 50%={quantiles[0.5]:.3f}, 75%={quantiles[0.75]:.3f}")
def check_feature_correlations_with_target():
"""Проверка корреляции признаков с целевой переменной (если есть оценки)"""
features_df = pd.read_csv('real_data_features.csv', index_col=0)
# Ищем колонку с оценками в исходных данных
score_columns = [col for col in features_df.columns if 'score' in col.lower() or 'оценк' in col.lower()]
if score_columns:
target_col = score_columns[0]
print(f"\n🎯 КОРРЕЛЯЦИЯ ПРИЗНАКОВ С {target_col}:")
print("-" * 40)
correlations = features_df.corr()[target_col].abs().sort_values(ascending=False)
# Показываем топ-10 наиболее коррелирующих признаков
top_correlated = correlations.head(11) # +1 потому что target сам с собой
for feature, corr in top_correlated.items():
if feature != target_col:
actual_corr = features_df.corr()[target_col][feature]
direction = "↑" if actual_corr > 0 else "↓"
significance = "***" if abs(actual_corr) > 0.3 else "**" if abs(actual_corr) > 0.2 else "*" if abs(
actual_corr) > 0.1 else ""
print(f" {direction} {feature:25} {actual_corr:+.3f} {significance}")
else:
print(f"\nℹ️ Целевая переменная (оценки) не найдена в данных")
if __name__ == "__main__":
analyze_extracted_features()
check_feature_correlations_with_target()
|