{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Lab 5 Malafeev PIbd-31**\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "1.Выберем бизнес цель: Сегментация клиентов для разработки персонализированных маркетинговых стратегий. Цель кластеризации: разделить клиентов на группы на основе их возраста, дохода и расходов, чтобы определить наиболее перспективные сегменты. Будем использовать Age, Income и Total_Spending с прошлой лабы"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "[encoded data, 127708 characters]",
      "text/plain": [
       "<Figure size 800x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from sklearn.decomposition import PCA\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "import pandas as pd\n",
    "\n",
    "# Загружаем данные\n",
    "data = pd.read_csv(\".//datasetlab1//marketing_campaign.csv\", sep=\"\\t\")\n",
    "# Фильтрация и выбор нужных столбцов\n",
    "data['Age'] = 2024 - data['Year_Birth'] \n",
    "data['Total_Spending'] = (data['MntWines'] + data['MntFruits'] + data['MntMeatProducts'] +\n",
    "                           data['MntFishProducts'] + data['MntSweetProducts'] + data['MntGoldProds'])\n",
    "data = data[['Age', 'Income', 'Total_Spending']].dropna()\n",
    "\n",
    "# Стандартизация данных\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "scaler = StandardScaler()\n",
    "data_scaled = scaler.fit_transform(data)\n",
    "\n",
    "# Применение PCA\n",
    "pca = PCA(n_components=2)\n",
    "data_pca = pca.fit_transform(data_scaled)\n",
    "\n",
    "# Создание DataFrame с результатами PCA\n",
    "pca_df = pd.DataFrame(data_pca, columns=['PC1', 'PC2'])\n",
    "\n",
    "# Визуализация\n",
    "plt.figure(figsize=(8, 6))\n",
    "sns.scatterplot(x='PC1', y='PC2', data=pca_df, s=50, alpha=0.7)\n",
    "plt.title('Визуализация данных после PCA', fontsize=14)\n",
    "plt.xlabel('Первая главная компонента')\n",
    "plt.ylabel('Вторая главная компонента')\n",
    "plt.grid(True)\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Это мы выполнили понижение размерности и визуализацию данных."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "3.Теперь выберем кластеры"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "[encoded data, 75924 characters]",
      "text/plain": [
       "<Figure size 1200x500 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from sklearn.cluster import KMeans\n",
    "from sklearn.metrics import silhouette_score\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# Выбираем признаки для кластеризации\n",
    "features = data[['Age', 'Income', 'Total_Spending']].dropna()\n",
    "\n",
    "# Стандартизация данных\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "scaler = StandardScaler()\n",
    "features_scaled = scaler.fit_transform(features)\n",
    "\n",
    "# Списки для хранения метрик\n",
    "inertia = []\n",
    "silhouette_scores = []\n",
    "\n",
    "# Оценка для числа кластеров от 2 до 10\n",
    "k_values = range(2, 11)\n",
    "for k in k_values:\n",
    "    kmeans = KMeans(n_clusters=k, random_state=42)\n",
    "    labels = kmeans.fit_predict(features_scaled)\n",
    "    \n",
    "    inertia.append(kmeans.inertia_)\n",
    "    silhouette_scores.append(silhouette_score(features_scaled, labels))\n",
    "\n",
    "# Визуализация инерции\n",
    "plt.figure(figsize=(12, 5))\n",
    "\n",
    "plt.subplot(1, 2, 1)\n",
    "plt.plot(k_values, inertia, marker='o')\n",
    "plt.title('Инерция для различных k', fontsize=14)\n",
    "plt.xlabel('Количество кластеров (k)')\n",
    "plt.ylabel('Инерция')\n",
    "plt.grid(True)\n",
    "\n",
    "# Визуализация коэффициента силуэта\n",
    "plt.subplot(1, 2, 2)\n",
    "plt.plot(k_values, silhouette_scores, marker='o', color='orange')\n",
    "plt.title('Коэффициент силуэта для различных k', fontsize=14)\n",
    "plt.xlabel('Количество кластеров (k)')\n",
    "plt.ylabel('Силуэт')\n",
    "plt.grid(True)\n",
    "\n",
    "plt.tight_layout()\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "По графику инерции оптимальное значение находится около k = 3 (точка изгиба \"локтя\"). <br>\n",
    "Коэффициент силуэта также максимален при k = 2, но при k = 3 он все еще достаточно высокий. Выбираем k = 3 для баланса."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "4.Выполним иерархический алгоритм и неиерархический алгоритм кластеризации."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "[encoded data, 53748 characters]",
      "text/plain": [
       "<Figure size 1000x700 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from scipy.cluster.hierarchy import dendrogram, linkage\n",
    "from sklearn.cluster import AgglomerativeClustering\n",
    "\n",
    "# Выполняем агломеративную кластеризацию иерархически\n",
    "linkage_matrix = linkage(features_scaled, method='ward')\n",
    "plt.figure(figsize=(10, 7))\n",
    "dendrogram(linkage_matrix)\n",
    "plt.title('Дендрограмма')\n",
    "plt.xlabel('Объекты')\n",
    "plt.ylabel('Евклидово расстояние')\n",
    "plt.show()\n",
    "hierarchical = AgglomerativeClustering(n_clusters=3)\n",
    "data['Cluster_Hierarchical'] = hierarchical.fit_predict(features_scaled)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "[encoded data, 87396 characters]",
      "text/plain": [
       "<Figure size 800x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "kmeans = KMeans(n_clusters=3, random_state=42)\n",
    "data['Cluster_KMeans'] = kmeans.fit_predict(features_scaled)\n",
    "\n",
    "# Визуализация кластеров неиерархически\n",
    "plt.figure(figsize=(8, 6))\n",
    "sns.scatterplot(x='Age', y='Income', hue='Cluster_KMeans', data=data, palette='viridis', s=50)\n",
    "plt.title('Кластеры (K-Means)', fontsize=14)\n",
    "plt.xlabel('Age')\n",
    "plt.ylabel('Income')\n",
    "plt.legend(title='Кластер')\n",
    "plt.grid(True)\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "5.Оценим качество"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Коэффициент силуэта (K-Means): 0.374\n",
      "Коэффициент силуэта (Иерархическая кластеризация): 0.339\n"
     ]
    }
   ],
   "source": [
    "silhouette_kmeans = silhouette_score(features_scaled, data['Cluster_KMeans'])\n",
    "\n",
    "silhouette_hierarchical = silhouette_score(features_scaled, data['Cluster_Hierarchical'])\n",
    "\n",
    "print(f\"Коэффициент силуэта (K-Means): {silhouette_kmeans:.3f}\")\n",
    "print(f\"Коэффициент силуэта (Иерархическая кластеризация): {silhouette_hierarchical:.3f}\")\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "miivenv",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
