/
AlexShe23
/
ShestakovTableDataset
Обзор
Документация
Войти
/
AlexShe23
/
ShestakovTableDataset
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
DiagramsModified.py
181 строка
9 KB
AlexShe23
create: categorical_to_numerical.py, Diagrams.py, DiagramsModified.py, filtration.py, heatmap.py, new_categoria.py, noise.py, pyplot_visualisation.py, SeabornDiagrams.py
31 май 2026, 17:36
Верифицирован
31 май 2026, 17:36
3d651da
Код
Авторство
О чём код?
import pandas as pd import matplotlib.pyplot as plt import matplotlib.gridspec as gridspec import numpy as np # ─── Загрузка данных ─────────────────────────────────────────────────────────── df = pd.read_csv("/Users/xyander23/PycharmProjects/PythonProject/dataset_with_noise.csv") # Разделяем признаки на числовые и категориальные (исключаем ID) numerical_cols = df.select_dtypes(include=[np.number]).columns.tolist() categorical_cols = df.select_dtypes(include=["str"]).columns.tolist() categorical_cols = [c for c in categorical_cols if c != "student_id"] # Удобные русские подписи осей labels = { "age": "Возраст", "study_hours_per_day": "Часов учёбы в день", "social_media_hours": "Часов в соцсетях", "netflix_hours": "Часов Netflix", "attendance_percentage": "Посещаемость (%)", "sleep_hours": "Часов сна", "exercise_frequency": "Частота упражнений", "mental_health_rating": "Оценка психического здоровья", "exam_score": "Балл экзамена", "gender": "Пол", "part_time_job": "Подработка", "diet_quality": "Качество питания", "parental_education_level": "Образование родителей", "internet_quality": "Качество интернета", "extracurricular_participation": "Внеклассная активность", } # ─── Цветовая схема ──────────────────────────────────────────────────────────── NUM_COLOR = "#4C72B0" # синий для числовых CAT_COLORS = plt.get_cmap("Set2").colors # ══════════════════════════════════════════════════════════════════════════════ # 1. Числовые признаки — гистограммы с кривой плотности (KDE) # ══════════════════════════════════════════════════════════════════════════════ n_num = len(numerical_cols) cols = 3 rows = int(np.ceil(n_num / cols)) fig, axes = plt.subplots(rows, cols, figsize=(16, rows * 3.8)) fig.suptitle("Распределение числовых признаков", fontsize=18, fontweight="bold", y=1.01) axes = axes.flatten() for i, col in enumerate(numerical_cols): ax = axes[i] data = df[col].dropna() # Гистограмма n_bins = min(30, len(data.unique())) ax.hist(data, bins=n_bins, color=NUM_COLOR, edgecolor="white", alpha=0.85, density=True, label="гистограмма") # KDE вручную (scipy) try: from scipy.stats import gaussian_kde kde = gaussian_kde(data) x = np.linspace(data.min(), data.max(), 300) ax.plot(x, kde(x), color="#C44E52", linewidth=2, label="KDE") except Exception: pass # Вертикальные линии: среднее и медиана ax.axvline(data.mean(), color="#DD8452", linewidth=1.6, linestyle="--", label=f"среднее={data.mean():.1f}") ax.axvline(data.median(), color="#55A868", linewidth=1.6, linestyle=":", label=f"медиана={data.median():.1f}") ax.set_title(labels.get(col, col), fontsize=11, fontweight="bold") ax.set_xlabel("Значение", fontsize=9) ax.set_ylabel("Плотность", fontsize=9) ax.legend(fontsize=7, framealpha=0.7) ax.grid(axis="y", alpha=0.3) ax.spines[["top", "right"]].set_visible(False) # Скрываем лишние ячейки for j in range(i + 1, len(axes)): axes[j].set_visible(False) plt.tight_layout() plt.savefig("distributions_numerical_with_noise.png", dpi=200, bbox_inches="tight") plt.close() print("✓ distributions_numerical.png сохранён") # ══════════════════════════════════════════════════════════════════════════════ # 2. Категориальные признаки — горизонтальные столбчатые диаграммы # ══════════════════════════════════════════════════════════════════════════════ n_cat = len(categorical_cols) cols = 2 rows = int(np.ceil(n_cat / cols)) fig, axes = plt.subplots(rows, cols, figsize=(14, rows * 3.5)) fig.suptitle("Распределение категориальных признаков", fontsize=18, fontweight="bold", y=1.01) axes = axes.flatten() for i, col in enumerate(categorical_cols): ax = axes[i] vc = df[col].value_counts().sort_values(ascending=True) total = vc.sum() colors = [CAT_COLORS[k % len(CAT_COLORS)] for k in range(len(vc))] bars = ax.barh(vc.index.astype(str), vc.values, color=colors, edgecolor="white", height=0.6) # Подписи с процентами for bar, val in zip(bars, vc.values): pct = val / total * 100 ax.text(bar.get_width() + total * 0.005, bar.get_y() + bar.get_height() / 2, f"{val} ({pct:.1f}%)", va="center", ha="left", fontsize=9) ax.set_title(labels.get(col, col), fontsize=11, fontweight="bold") ax.set_xlabel("Количество студентов", fontsize=9) ax.set_xlim(0, vc.max() * 1.22) ax.grid(axis="x", alpha=0.3) ax.spines[["top", "right"]].set_visible(False) for j in range(i + 1, len(axes)): axes[j].set_visible(False) plt.tight_layout() plt.savefig("distributions_categorical_with_noise.png", dpi=200, bbox_inches="tight") plt.close() print("✓ distributions_categorical.png сохранён") # ══════════════════════════════════════════════════════════════════════════════ # 3. Сводная страница — все признаки на одном листе # ══════════════════════════════════════════════════════════════════════════════ all_cols = numerical_cols + categorical_cols total = len(all_cols) cols_g = 4 rows_g = int(np.ceil(total / cols_g)) fig = plt.figure(figsize=(22, rows_g * 4)) fig.suptitle("Распределение всех признаков датасета студентов", fontsize=20, fontweight="bold", y=1.005) gs = gridspec.GridSpec(rows_g, cols_g, figure=fig, hspace=0.55, wspace=0.35) for idx, col in enumerate(all_cols): r, c = divmod(idx, cols_g) ax = fig.add_subplot(gs[r, c]) data = df[col].dropna() if col in numerical_cols: n_bins = min(25, len(data.unique())) ax.hist(data, bins=n_bins, color=NUM_COLOR, edgecolor="white", alpha=0.85, density=True) try: from scipy.stats import gaussian_kde kde = gaussian_kde(data) x = np.linspace(data.min(), data.max(), 200) ax.plot(x, kde(x), color="#C44E52", linewidth=1.8) except Exception: pass ax.axvline(data.mean(), color="#DD8452", linewidth=1.3, linestyle="--") ax.axvline(data.median(), color="#55A868", linewidth=1.3, linestyle=":") ax.set_ylabel("Плотность", fontsize=7) ax.set_xlabel("Значение", fontsize=7) else: vc = data.value_counts().sort_values(ascending=True) colors = [CAT_COLORS[k % len(CAT_COLORS)] for k in range(len(vc))] ax.barh(vc.index.astype(str), vc.values, color=colors, edgecolor="white", height=0.6) ax.set_xlabel("Кол-во", fontsize=7) ax.set_title(labels.get(col, col), fontsize=9, fontweight="bold") ax.tick_params(labelsize=7) ax.grid(axis="y" if col in numerical_cols else "x", alpha=0.3) ax.spines[["top", "right"]].set_visible(False) plt.savefig("distributions_all_with_noise.png", dpi=200, bbox_inches="tight") plt.close() print("✓ distributions_all.png сохранён") print("\nГотово! Все три файла сохранены в текущую директорию.")