{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "GSq5k2-nQseU"
   },
   "source": [
    "# 主成分分析（PCA）による試験結果の分析\n",
    "\n",
    "このノートブックでは、50名の学生の5教科試験結果データに対して主成分分析を行い、総合学力と文系・理系傾向を抽出します。\n",
    "\n",
    "## データについて\n",
    "- 50名の架空の学生データ\n",
    "- 5教科：国語、数学、英語、理科、社会（各100点満点）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "c3qxIdeHQseW"
   },
   "source": [
    "## 1. 必要なライブラリのインポート"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "id": "LMhZ6MP6QseW",
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "executionInfo": {
     "status": "ok",
     "timestamp": 1769313652099,
     "user_tz": -540,
     "elapsed": 11339,
     "user": {
      "displayName": "dataviz-p5-py",
      "userId": "03582549047009910850"
     }
    },
    "outputId": "eee8cd62-4778-4e21-883e-703e25c776e3"
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "Collecting japanize-matplotlib\n",
      "  Downloading japanize-matplotlib-1.1.3.tar.gz (4.1 MB)\n",
      "\u001b[?25l     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m0.0/4.1 MB\u001b[0m \u001b[31m?\u001b[0m eta \u001b[36m-:--:--\u001b[0m\r\u001b[2K     \u001b[91m━━\u001b[0m\u001b[91m╸\u001b[0m\u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m0.3/4.1 MB\u001b[0m \u001b[31m8.2 MB/s\u001b[0m eta \u001b[36m0:00:01\u001b[0m\r\u001b[2K     \u001b[91m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[90m╺\u001b[0m\u001b[90m━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.1/4.1 MB\u001b[0m \u001b[31m29.7 MB/s\u001b[0m eta \u001b[36m0:00:01\u001b[0m\r\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m4.1/4.1 MB\u001b[0m \u001b[31m40.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25h  Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n",
      "Requirement already satisfied: matplotlib in /usr/local/lib/python3.12/dist-packages (from japanize-matplotlib) (3.10.0)\n",
      "Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.12/dist-packages (from matplotlib->japanize-matplotlib) (1.3.3)\n",
      "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.12/dist-packages (from matplotlib->japanize-matplotlib) (0.12.1)\n",
      "Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.12/dist-packages (from matplotlib->japanize-matplotlib) (4.61.1)\n",
      "Requirement already satisfied: kiwisolver>=1.3.1 in /usr/local/lib/python3.12/dist-packages (from matplotlib->japanize-matplotlib) (1.4.9)\n",
      "Requirement already satisfied: numpy>=1.23 in /usr/local/lib/python3.12/dist-packages (from matplotlib->japanize-matplotlib) (2.0.2)\n",
      "Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.12/dist-packages (from matplotlib->japanize-matplotlib) (25.0)\n",
      "Requirement already satisfied: pillow>=8 in /usr/local/lib/python3.12/dist-packages (from matplotlib->japanize-matplotlib) (11.3.0)\n",
      "Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.12/dist-packages (from matplotlib->japanize-matplotlib) (3.3.1)\n",
      "Requirement already satisfied: python-dateutil>=2.7 in /usr/local/lib/python3.12/dist-packages (from matplotlib->japanize-matplotlib) (2.9.0.post0)\n",
      "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.12/dist-packages (from python-dateutil>=2.7->matplotlib->japanize-matplotlib) (1.17.0)\n",
      "Building wheels for collected packages: japanize-matplotlib\n",
      "  Building wheel for japanize-matplotlib (setup.py) ... \u001b[?25l\u001b[?25hdone\n",
      "  Created wheel for japanize-matplotlib: filename=japanize_matplotlib-1.1.3-py3-none-any.whl size=4120257 sha256=36fa52256b2eb7d2a19beeb432db20035f74caf2f9fa49827b0ed2e0451bb58b\n",
      "  Stored in directory: /root/.cache/pip/wheels/c1/f7/9b/418f19a7b9340fc16e071e89efc379aca68d40238b258df53d\n",
      "Successfully built japanize-matplotlib\n",
      "Installing collected packages: japanize-matplotlib\n",
      "Successfully installed japanize-matplotlib-1.1.3\n"
     ]
    }
   ],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.decomposition import PCA # 主成分分析用のクラス\n",
    "from sklearn.preprocessing import StandardScaler # データの標準化用のクラス\n",
    "import plotly.graph_objects as go # 3Dプロット用のライブラリ\n",
    "\n",
    "# 日本語フォントの設定\n",
    "!pip install japanize-matplotlib\n",
    "import japanize_matplotlib"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "Xbo4szAoQseX"
   },
   "source": [
    "## 2. データの読み込み\n",
    "\n",
    "Google ドライブの「ホーム」をマウントし、「pca_test_scores」フォルダにある「test_score.csv」を読み込みます。\n",
    "\n",
    "Google ドライブをマウントするには、左ツールバー内の📁アイコンをクリックして、「ドライブをマウント」するか、このセルのすぐ下のセルを実行してください。\n",
    "\n",
    "マウントする際、アクセスを許可してください。"
   ]
  },
  {
   "cell_type": "code",
   "source": [
    "from google.colab import drive\n",
    "drive.mount('/content/drive')"
   ],
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "JWyXUo-BXjz0",
    "executionInfo": {
     "status": "ok",
     "timestamp": 1769313619654,
     "user_tz": -540,
     "elapsed": 30146,
     "user": {
      "displayName": "dataviz-p5-py",
      "userId": "03582549047009910850"
     }
    },
    "outputId": "b1888eb3-ea8c-47fd-89cc-87e80f10d470"
   },
   "execution_count": 1,
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "Mounted at /content/drive\n"
     ]
    }
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "id": "r8Cw44O5QseY",
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 224
    },
    "executionInfo": {
     "status": "ok",
     "timestamp": 1769313657798,
     "user_tz": -540,
     "elapsed": 2504,
     "user": {
      "displayName": "dataviz-p5-py",
      "userId": "03582549047009910850"
     }
    },
    "outputId": "67bf777e-8f33-481a-ec14-450945ad4aa1"
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "データの最初の5行：\n"
     ]
    },
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "   学籍番号  国語  数学  英語  理科  社会\n",
       "0  S001  75  68  72  65  78\n",
       "1  S002  82  88  85  90  70\n",
       "2  S003  65  72  68  75  63\n",
       "3  S004  90  65  88  62  92\n",
       "4  S005  58  45  52  48  60"
      ],
      "text/html": [
       "\n",
       "  <div id=\"df-6c43ee09-3672-49b4-89e1-227d0facc4f3\" class=\"colab-df-container\">\n",
       "    <div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>学籍番号</th>\n",
       "      <th>国語</th>\n",
       "      <th>数学</th>\n",
       "      <th>英語</th>\n",
       "      <th>理科</th>\n",
       "      <th>社会</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>S001</td>\n",
       "      <td>75</td>\n",
       "      <td>68</td>\n",
       "      <td>72</td>\n",
       "      <td>65</td>\n",
       "      <td>78</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>S002</td>\n",
       "      <td>82</td>\n",
       "      <td>88</td>\n",
       "      <td>85</td>\n",
       "      <td>90</td>\n",
       "      <td>70</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>S003</td>\n",
       "      <td>65</td>\n",
       "      <td>72</td>\n",
       "      <td>68</td>\n",
       "      <td>75</td>\n",
       "      <td>63</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>S004</td>\n",
       "      <td>90</td>\n",
       "      <td>65</td>\n",
       "      <td>88</td>\n",
       "      <td>62</td>\n",
       "      <td>92</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>S005</td>\n",
       "      <td>58</td>\n",
       "      <td>45</td>\n",
       "      <td>52</td>\n",
       "      <td>48</td>\n",
       "      <td>60</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>\n",
       "    <div class=\"colab-df-buttons\">\n",
       "\n",
       "  <div class=\"colab-df-container\">\n",
       "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-6c43ee09-3672-49b4-89e1-227d0facc4f3')\"\n",
       "            title=\"Convert this dataframe to an interactive table.\"\n",
       "            style=\"display:none;\">\n",
       "\n",
       "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
       "    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
       "  </svg>\n",
       "    </button>\n",
       "\n",
       "  <style>\n",
       "    .colab-df-container {\n",
       "      display:flex;\n",
       "      gap: 12px;\n",
       "    }\n",
       "\n",
       "    .colab-df-convert {\n",
       "      background-color: #E8F0FE;\n",
       "      border: none;\n",
       "      border-radius: 50%;\n",
       "      cursor: pointer;\n",
       "      display: none;\n",
       "      fill: #1967D2;\n",
       "      height: 32px;\n",
       "      padding: 0 0 0 0;\n",
       "      width: 32px;\n",
       "    }\n",
       "\n",
       "    .colab-df-convert:hover {\n",
       "      background-color: #E2EBFA;\n",
       "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
       "      fill: #174EA6;\n",
       "    }\n",
       "\n",
       "    .colab-df-buttons div {\n",
       "      margin-bottom: 4px;\n",
       "    }\n",
       "\n",
       "    [theme=dark] .colab-df-convert {\n",
       "      background-color: #3B4455;\n",
       "      fill: #D2E3FC;\n",
       "    }\n",
       "\n",
       "    [theme=dark] .colab-df-convert:hover {\n",
       "      background-color: #434B5C;\n",
       "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
       "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
       "      fill: #FFFFFF;\n",
       "    }\n",
       "  </style>\n",
       "\n",
       "    <script>\n",
       "      const buttonEl =\n",
       "        document.querySelector('#df-6c43ee09-3672-49b4-89e1-227d0facc4f3 button.colab-df-convert');\n",
       "      buttonEl.style.display =\n",
       "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
       "\n",
       "      async function convertToInteractive(key) {\n",
       "        const element = document.querySelector('#df-6c43ee09-3672-49b4-89e1-227d0facc4f3');\n",
       "        const dataTable =\n",
       "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
       "                                                    [key], {});\n",
       "        if (!dataTable) return;\n",
       "\n",
       "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
       "          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
       "          + ' to learn more about interactive tables.';\n",
       "        element.innerHTML = '';\n",
       "        dataTable['output_type'] = 'display_data';\n",
       "        await google.colab.output.renderOutput(dataTable, element);\n",
       "        const docLink = document.createElement('div');\n",
       "        docLink.innerHTML = docLinkHtml;\n",
       "        element.appendChild(docLink);\n",
       "      }\n",
       "    </script>\n",
       "  </div>\n",
       "\n",
       "\n",
       "    </div>\n",
       "  </div>\n"
      ],
      "application/vnd.google.colaboratory.intrinsic+json": {
       "type": "dataframe",
       "variable_name": "df",
       "summary": "{\n  \"name\": \"df\",\n  \"rows\": 50,\n  \"fields\": [\n    {\n      \"column\": \"\\u5b66\\u7c4d\\u756a\\u53f7\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 50,\n        \"samples\": [\n          \"S014\",\n          \"S040\",\n          \"S031\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"\\u56fd\\u8a9e\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 15,\n        \"min\": 42,\n        \"max\": 95,\n        \"num_unique_values\": 20,\n        \"samples\": [\n          75,\n          70,\n          48\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"\\u6570\\u5b66\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 15,\n        \"min\": 35,\n        \"max\": 98,\n        \"num_unique_values\": 23,\n        \"samples\": [\n          85,\n          95,\n          68\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"\\u82f1\\u8a9e\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 12,\n        \"min\": 45,\n        \"max\": 96,\n        \"num_unique_values\": 26,\n        \"samples\": [\n          94,\n          80,\n          72\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"\\u7406\\u79d1\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 17,\n        \"min\": 32,\n        \"max\": 99,\n        \"num_unique_values\": 28,\n        \"samples\": [\n          98,\n          50,\n          52\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"\\u793e\\u4f1a\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 13,\n        \"min\": 40,\n        \"max\": 94,\n        \"num_unique_values\": 28,\n        \"samples\": [\n          66,\n          67,\n          90\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"
      }
     },
     "metadata": {},
     "execution_count": 4
    }
   ],
   "source": [
    "# データの読み込み\n",
    "# Google ドライブのマイドライブの「pca_test_scores」にある「test_scores.csv」を読み込む。\n",
    "df = pd.read_csv('/content/drive/MyDrive/pca_test_scores/test_scores.csv')\n",
    "\n",
    "# データの最初の5行を表示\n",
    "print(\"データの最初の5行：\")\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "LrCtM-T8QseY"
   },
   "source": [
    "## 3. データの確認"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "wP6kTdUaQseZ",
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 651
    },
    "executionInfo": {
     "status": "ok",
     "timestamp": 1768442279790,
     "user_tz": -540,
     "elapsed": 60,
     "user": {
      "displayName": "dataviz-p5-py",
      "userId": "03582549047009910850"
     }
    },
    "outputId": "90c1f59c-a69d-4e1d-80e9-b0845eb2750f"
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "データの形状（行数, 列数）： (50, 6)\n",
      "\n",
      "データの詳細情報：\n",
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 50 entries, 0 to 49\n",
      "Data columns (total 6 columns):\n",
      " #   Column  Non-Null Count  Dtype \n",
      "---  ------  --------------  ----- \n",
      " 0   学籍番号    50 non-null     object\n",
      " 1   国語      50 non-null     int64 \n",
      " 2   数学      50 non-null     int64 \n",
      " 3   英語      50 non-null     int64 \n",
      " 4   理科      50 non-null     int64 \n",
      " 5   社会      50 non-null     int64 \n",
      "dtypes: int64(5), object(1)\n",
      "memory usage: 2.5+ KB\n",
      "\n",
      "統計情報：\n"
     ]
    },
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "              国語         数学         英語         理科       社会\n",
       "count  50.000000  50.000000  50.000000  50.000000  50.0000\n",
       "mean   72.560000  67.440000  72.720000  67.420000  73.0200\n",
       "std    15.172693  15.819337  12.527586  17.033089  13.4824\n",
       "min    42.000000  35.000000  45.000000  32.000000  40.0000\n",
       "25%    62.000000  55.750000  65.250000  55.000000  65.0000\n",
       "50%    75.000000  66.500000  72.000000  65.000000  73.0000\n",
       "75%    85.000000  78.000000  82.000000  80.000000  83.5000\n",
       "max    95.000000  98.000000  96.000000  99.000000  94.0000"
      ],
      "text/html": [
       "\n",
       "  <div id=\"df-9bd4d643-8e25-420e-bf7b-ef9e01d9b0d4\" class=\"colab-df-container\">\n",
       "    <div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>国語</th>\n",
       "      <th>数学</th>\n",
       "      <th>英語</th>\n",
       "      <th>理科</th>\n",
       "      <th>社会</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>50.000000</td>\n",
       "      <td>50.000000</td>\n",
       "      <td>50.000000</td>\n",
       "      <td>50.000000</td>\n",
       "      <td>50.0000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>72.560000</td>\n",
       "      <td>67.440000</td>\n",
       "      <td>72.720000</td>\n",
       "      <td>67.420000</td>\n",
       "      <td>73.0200</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>15.172693</td>\n",
       "      <td>15.819337</td>\n",
       "      <td>12.527586</td>\n",
       "      <td>17.033089</td>\n",
       "      <td>13.4824</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>42.000000</td>\n",
       "      <td>35.000000</td>\n",
       "      <td>45.000000</td>\n",
       "      <td>32.000000</td>\n",
       "      <td>40.0000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>62.000000</td>\n",
       "      <td>55.750000</td>\n",
       "      <td>65.250000</td>\n",
       "      <td>55.000000</td>\n",
       "      <td>65.0000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>75.000000</td>\n",
       "      <td>66.500000</td>\n",
       "      <td>72.000000</td>\n",
       "      <td>65.000000</td>\n",
       "      <td>73.0000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>85.000000</td>\n",
       "      <td>78.000000</td>\n",
       "      <td>82.000000</td>\n",
       "      <td>80.000000</td>\n",
       "      <td>83.5000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>95.000000</td>\n",
       "      <td>98.000000</td>\n",
       "      <td>96.000000</td>\n",
       "      <td>99.000000</td>\n",
       "      <td>94.0000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>\n",
       "    <div class=\"colab-df-buttons\">\n",
       "\n",
       "  <div class=\"colab-df-container\">\n",
       "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-9bd4d643-8e25-420e-bf7b-ef9e01d9b0d4')\"\n",
       "            title=\"Convert this dataframe to an interactive table.\"\n",
       "            style=\"display:none;\">\n",
       "\n",
       "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
       "    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
       "  </svg>\n",
       "    </button>\n",
       "\n",
       "  <style>\n",
       "    .colab-df-container {\n",
       "      display:flex;\n",
       "      gap: 12px;\n",
       "    }\n",
       "\n",
       "    .colab-df-convert {\n",
       "      background-color: #E8F0FE;\n",
       "      border: none;\n",
       "      border-radius: 50%;\n",
       "      cursor: pointer;\n",
       "      display: none;\n",
       "      fill: #1967D2;\n",
       "      height: 32px;\n",
       "      padding: 0 0 0 0;\n",
       "      width: 32px;\n",
       "    }\n",
       "\n",
       "    .colab-df-convert:hover {\n",
       "      background-color: #E2EBFA;\n",
       "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
       "      fill: #174EA6;\n",
       "    }\n",
       "\n",
       "    .colab-df-buttons div {\n",
       "      margin-bottom: 4px;\n",
       "    }\n",
       "\n",
       "    [theme=dark] .colab-df-convert {\n",
       "      background-color: #3B4455;\n",
       "      fill: #D2E3FC;\n",
       "    }\n",
       "\n",
       "    [theme=dark] .colab-df-convert:hover {\n",
       "      background-color: #434B5C;\n",
       "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
       "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
       "      fill: #FFFFFF;\n",
       "    }\n",
       "  </style>\n",
       "\n",
       "    <script>\n",
       "      const buttonEl =\n",
       "        document.querySelector('#df-9bd4d643-8e25-420e-bf7b-ef9e01d9b0d4 button.colab-df-convert');\n",
       "      buttonEl.style.display =\n",
       "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
       "\n",
       "      async function convertToInteractive(key) {\n",
       "        const element = document.querySelector('#df-9bd4d643-8e25-420e-bf7b-ef9e01d9b0d4');\n",
       "        const dataTable =\n",
       "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
       "                                                    [key], {});\n",
       "        if (!dataTable) return;\n",
       "\n",
       "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
       "          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
       "          + ' to learn more about interactive tables.';\n",
       "        element.innerHTML = '';\n",
       "        dataTable['output_type'] = 'display_data';\n",
       "        await google.colab.output.renderOutput(dataTable, element);\n",
       "        const docLink = document.createElement('div');\n",
       "        docLink.innerHTML = docLinkHtml;\n",
       "        element.appendChild(docLink);\n",
       "      }\n",
       "    </script>\n",
       "  </div>\n",
       "\n",
       "\n",
       "    </div>\n",
       "  </div>\n"
      ],
      "application/vnd.google.colaboratory.intrinsic+json": {
       "type": "dataframe",
       "summary": "{\n  \"name\": \"df\",\n  \"rows\": 8,\n  \"fields\": [\n    {\n      \"column\": \"\\u56fd\\u8a9e\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 25.73281167784816,\n        \"min\": 15.172692979326312,\n        \"max\": 95.0,\n        \"num_unique_values\": 8,\n        \"samples\": [\n          72.56,\n          75.0,\n          50.0\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"\\u6570\\u5b66\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 25.461027136592758,\n        \"min\": 15.819337172316311,\n        \"max\": 98.0,\n        \"num_unique_values\": 8,\n        \"samples\": [\n          67.44,\n          66.5,\n          50.0\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"\\u82f1\\u8a9e\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 25.80689029156894,\n        \"min\": 12.527585887283523,\n        \"max\": 96.0,\n        \"num_unique_values\": 8,\n        \"samples\": [\n          72.72,\n          72.0,\n          50.0\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"\\u7406\\u79d1\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 25.993846138876187,\n        \"min\": 17.033089046000423,\n        \"max\": 99.0,\n        \"num_unique_values\": 8,\n        \"samples\": [\n          67.42,\n          65.0,\n          50.0\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"\\u793e\\u4f1a\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 25.960547915558504,\n        \"min\": 13.482399713731095,\n        \"max\": 94.0,\n        \"num_unique_values\": 8,\n        \"samples\": [\n          73.02,\n          73.0,\n          50.0\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"
      }
     },
     "metadata": {},
     "execution_count": 4
    }
   ],
   "source": [
    "# データの基本情報\n",
    "print(\"データの形状（行数, 列数）：\", df.shape)\n",
    "print(\"\\nデータの詳細情報：\")\n",
    "df.info()\n",
    "\n",
    "print(\"\\n統計情報：\")\n",
    "df.describe()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "R28qGUhYQsea"
   },
   "source": [
    "## 4. 主成分分析の実行\n",
    "\n",
    "主成分分析の結果を`pca_df`に格納します。手順は次のとおりです。\n",
    "\n",
    "1. dfから教科の得点データのみを取り出し、`scores`に格納\n",
    "2. データを標準化（平均0、標準偏差1に変換）\n",
    "3. 主成分分析を実行（3つの主成分を抽出）\n",
    "4. 結果をpca_dfに格納"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "xBPhLXZ1Qsea",
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 206
    },
    "executionInfo": {
     "status": "ok",
     "timestamp": 1768442405526,
     "user_tz": -540,
     "elapsed": 314,
     "user": {
      "displayName": "dataviz-p5-py",
      "userId": "03582549047009910850"
     }
    },
    "outputId": "3c712bfa-be92-4935-8aee-0ef587b6aade"
   },
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "      第1主成分     第2主成分     第3主成分  学籍番号\n",
       "0  0.083634  0.271355  0.235729  S001\n",
       "1  2.027555 -0.424454 -0.748753  S002\n",
       "2 -0.150873 -1.006034 -0.461019  S003\n",
       "3  1.054068  1.899930  0.517220  S004\n",
       "4 -2.625227 -0.827262  0.675941  S005"
      ],
      "text/html": [
       "\n",
       "  <div id=\"df-2435f92e-e335-40e9-b48d-7b44d5f15675\" class=\"colab-df-container\">\n",
       "    <div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>第1主成分</th>\n",
       "      <th>第2主成分</th>\n",
       "      <th>第3主成分</th>\n",
       "      <th>学籍番号</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.083634</td>\n",
       "      <td>0.271355</td>\n",
       "      <td>0.235729</td>\n",
       "      <td>S001</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2.027555</td>\n",
       "      <td>-0.424454</td>\n",
       "      <td>-0.748753</td>\n",
       "      <td>S002</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-0.150873</td>\n",
       "      <td>-1.006034</td>\n",
       "      <td>-0.461019</td>\n",
       "      <td>S003</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1.054068</td>\n",
       "      <td>1.899930</td>\n",
       "      <td>0.517220</td>\n",
       "      <td>S004</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-2.625227</td>\n",
       "      <td>-0.827262</td>\n",
       "      <td>0.675941</td>\n",
       "      <td>S005</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>\n",
       "    <div class=\"colab-df-buttons\">\n",
       "\n",
       "  <div class=\"colab-df-container\">\n",
       "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-2435f92e-e335-40e9-b48d-7b44d5f15675')\"\n",
       "            title=\"Convert this dataframe to an interactive table.\"\n",
       "            style=\"display:none;\">\n",
       "\n",
       "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
       "    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
       "  </svg>\n",
       "    </button>\n",
       "\n",
       "  <style>\n",
       "    .colab-df-container {\n",
       "      display:flex;\n",
       "      gap: 12px;\n",
       "    }\n",
       "\n",
       "    .colab-df-convert {\n",
       "      background-color: #E8F0FE;\n",
       "      border: none;\n",
       "      border-radius: 50%;\n",
       "      cursor: pointer;\n",
       "      display: none;\n",
       "      fill: #1967D2;\n",
       "      height: 32px;\n",
       "      padding: 0 0 0 0;\n",
       "      width: 32px;\n",
       "    }\n",
       "\n",
       "    .colab-df-convert:hover {\n",
       "      background-color: #E2EBFA;\n",
       "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
       "      fill: #174EA6;\n",
       "    }\n",
       "\n",
       "    .colab-df-buttons div {\n",
       "      margin-bottom: 4px;\n",
       "    }\n",
       "\n",
       "    [theme=dark] .colab-df-convert {\n",
       "      background-color: #3B4455;\n",
       "      fill: #D2E3FC;\n",
       "    }\n",
       "\n",
       "    [theme=dark] .colab-df-convert:hover {\n",
       "      background-color: #434B5C;\n",
       "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
       "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
       "      fill: #FFFFFF;\n",
       "    }\n",
       "  </style>\n",
       "\n",
       "    <script>\n",
       "      const buttonEl =\n",
       "        document.querySelector('#df-2435f92e-e335-40e9-b48d-7b44d5f15675 button.colab-df-convert');\n",
       "      buttonEl.style.display =\n",
       "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
       "\n",
       "      async function convertToInteractive(key) {\n",
       "        const element = document.querySelector('#df-2435f92e-e335-40e9-b48d-7b44d5f15675');\n",
       "        const dataTable =\n",
       "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
       "                                                    [key], {});\n",
       "        if (!dataTable) return;\n",
       "\n",
       "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
       "          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
       "          + ' to learn more about interactive tables.';\n",
       "        element.innerHTML = '';\n",
       "        dataTable['output_type'] = 'display_data';\n",
       "        await google.colab.output.renderOutput(dataTable, element);\n",
       "        const docLink = document.createElement('div');\n",
       "        docLink.innerHTML = docLinkHtml;\n",
       "        element.appendChild(docLink);\n",
       "      }\n",
       "    </script>\n",
       "  </div>\n",
       "\n",
       "\n",
       "    </div>\n",
       "  </div>\n"
      ],
      "application/vnd.google.colaboratory.intrinsic+json": {
       "type": "dataframe",
       "variable_name": "pca_df",
       "summary": "{\n  \"name\": \"pca_df\",\n  \"rows\": 50,\n  \"fields\": [\n    {\n      \"column\": \"\\u7b2c1\\u4e3b\\u6210\\u5206\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 1.6833372631680186,\n        \"min\": -3.8175463828436076,\n        \"max\": 3.4563986998031937,\n        \"num_unique_values\": 50,\n        \"samples\": [\n          -1.2659847856282769,\n          1.538931815387559,\n          0.6671244223360269\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"\\u7b2c2\\u4e3b\\u6210\\u5206\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 1.3978420634672377,\n        \"min\": -3.049844099408255,\n        \"max\": 2.0097137705835912,\n        \"num_unique_values\": 50,\n        \"samples\": [\n          -0.5183586859385392,\n          -1.6311213154576623,\n          1.888246124839733\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"\\u7b2c3\\u4e3b\\u6210\\u5206\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.4954783392149579,\n        \"min\": -0.9972271600440042,\n        \"max\": 1.0102420032171753,\n        \"num_unique_values\": 50,\n        \"samples\": [\n          -0.02698201205275892,\n          0.15759963363800053,\n          -0.545388327880354\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"\\u5b66\\u7c4d\\u756a\\u53f7\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 50,\n        \"samples\": [\n          \"S014\",\n          \"S040\",\n          \"S031\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"
      }
     },
     "metadata": {},
     "execution_count": 7
    }
   ],
   "source": [
    "# 教科の得点データのみを取り出す\n",
    "scores = df[['国語', '数学', '英語', '理科', '社会']]\n",
    "\n",
    "# データを標準化（平均0、標準偏差1に変換）\n",
    "scaler = StandardScaler()\n",
    "scores_scaled = scaler.fit_transform(scores)\n",
    "\n",
    "# 主成分分析を実行（3つの主成分を抽出）\n",
    "pca = PCA(n_components=3)\n",
    "principal_components = pca.fit_transform(scores_scaled)\n",
    "\n",
    "# 結果をデータフレームに格納\n",
    "pca_df = pd.DataFrame(\n",
    "    principal_components,\n",
    "    columns=['第1主成分', '第2主成分', '第3主成分']\n",
    ")\n",
    "# 学籍番号列を元のデータフレームから追加\n",
    "pca_df['学籍番号'] = df['学籍番号']\n",
    "\n",
    "pca_df.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "SvfvkX2PQseb"
   },
   "source": [
    "## 5. 結果の解釈"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "vVRc04kVQsea"
   },
   "source": [
    "### 5.1 各主成分の寄与率を確認"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "yw8zwmM2Qsea",
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "executionInfo": {
     "status": "ok",
     "timestamp": 1768442445856,
     "user_tz": -540,
     "elapsed": 7,
     "user": {
      "displayName": "dataviz-p5-py",
      "userId": "03582549047009910850"
     }
    },
    "outputId": "6d52111c-5534-4ad9-9d99-e02506331719"
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "各主成分の寄与率：\n",
      "第1主成分: 55.5%\n",
      "第2主成分: 38.3%\n",
      "第3主成分: 4.8%\n",
      "\n",
      "累積寄与率: 0.986 (98.6%)\n"
     ]
    }
   ],
   "source": [
    "# 各主成分の寄与率\n",
    "explained_variance_ratio = pca.explained_variance_ratio_\n",
    "cumulative_variance_ratio = np.cumsum(explained_variance_ratio)\n",
    "\n",
    "print(\"各主成分の寄与率：\")\n",
    "for i, ratio in enumerate(explained_variance_ratio, 1):\n",
    "    print(f\"第{i}主成分: {ratio*100:.1f}%\")\n",
    "\n",
    "print(f\"\\n累積寄与率: {cumulative_variance_ratio[-1]:.3f} ({cumulative_variance_ratio[-1]*100:.1f}%)\")"
   ]
  },
  {
   "cell_type": "markdown",
   "source": [
    "### 5.2 主成分係数を確認\n",
    "\n",
    "各主成分が元の教科とどのように関連しているかを確認します。"
   ],
   "metadata": {
    "id": "KMm0cRHyF9yf"
   }
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "jG0v8tdfQseb",
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 206
    },
    "executionInfo": {
     "status": "ok",
     "timestamp": 1768442481896,
     "user_tz": -540,
     "elapsed": 150,
     "user": {
      "displayName": "dataviz-p5-py",
      "userId": "03582549047009910850"
     }
    },
    "outputId": "76a9257b-6856-473e-ceb3-1138d6c83b1a"
   },
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "       第1主成分     第2主成分     第3主成分\n",
       "国語  0.552131  0.069075  0.753414\n",
       "数学  0.540665 -0.300316 -0.195001\n",
       "英語  0.329274  0.565224 -0.535049\n",
       "理科  0.511849 -0.358688 -0.305357\n",
       "社会  0.180061  0.675947  0.121742"
      ],
      "text/html": [
       "\n",
       "  <div id=\"df-89c0d69e-d587-49a9-a8ce-778efb45db67\" class=\"colab-df-container\">\n",
       "    <div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>第1主成分</th>\n",
       "      <th>第2主成分</th>\n",
       "      <th>第3主成分</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>国語</th>\n",
       "      <td>0.552131</td>\n",
       "      <td>0.069075</td>\n",
       "      <td>0.753414</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>数学</th>\n",
       "      <td>0.540665</td>\n",
       "      <td>-0.300316</td>\n",
       "      <td>-0.195001</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>英語</th>\n",
       "      <td>0.329274</td>\n",
       "      <td>0.565224</td>\n",
       "      <td>-0.535049</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>理科</th>\n",
       "      <td>0.511849</td>\n",
       "      <td>-0.358688</td>\n",
       "      <td>-0.305357</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>社会</th>\n",
       "      <td>0.180061</td>\n",
       "      <td>0.675947</td>\n",
       "      <td>0.121742</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>\n",
       "    <div class=\"colab-df-buttons\">\n",
       "\n",
       "  <div class=\"colab-df-container\">\n",
       "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-89c0d69e-d587-49a9-a8ce-778efb45db67')\"\n",
       "            title=\"Convert this dataframe to an interactive table.\"\n",
       "            style=\"display:none;\">\n",
       "\n",
       "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
       "    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
       "  </svg>\n",
       "    </button>\n",
       "\n",
       "  <style>\n",
       "    .colab-df-container {\n",
       "      display:flex;\n",
       "      gap: 12px;\n",
       "    }\n",
       "\n",
       "    .colab-df-convert {\n",
       "      background-color: #E8F0FE;\n",
       "      border: none;\n",
       "      border-radius: 50%;\n",
       "      cursor: pointer;\n",
       "      display: none;\n",
       "      fill: #1967D2;\n",
       "      height: 32px;\n",
       "      padding: 0 0 0 0;\n",
       "      width: 32px;\n",
       "    }\n",
       "\n",
       "    .colab-df-convert:hover {\n",
       "      background-color: #E2EBFA;\n",
       "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
       "      fill: #174EA6;\n",
       "    }\n",
       "\n",
       "    .colab-df-buttons div {\n",
       "      margin-bottom: 4px;\n",
       "    }\n",
       "\n",
       "    [theme=dark] .colab-df-convert {\n",
       "      background-color: #3B4455;\n",
       "      fill: #D2E3FC;\n",
       "    }\n",
       "\n",
       "    [theme=dark] .colab-df-convert:hover {\n",
       "      background-color: #434B5C;\n",
       "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
       "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
       "      fill: #FFFFFF;\n",
       "    }\n",
       "  </style>\n",
       "\n",
       "    <script>\n",
       "      const buttonEl =\n",
       "        document.querySelector('#df-89c0d69e-d587-49a9-a8ce-778efb45db67 button.colab-df-convert');\n",
       "      buttonEl.style.display =\n",
       "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
       "\n",
       "      async function convertToInteractive(key) {\n",
       "        const element = document.querySelector('#df-89c0d69e-d587-49a9-a8ce-778efb45db67');\n",
       "        const dataTable =\n",
       "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
       "                                                    [key], {});\n",
       "        if (!dataTable) return;\n",
       "\n",
       "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
       "          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
       "          + ' to learn more about interactive tables.';\n",
       "        element.innerHTML = '';\n",
       "        dataTable['output_type'] = 'display_data';\n",
       "        await google.colab.output.renderOutput(dataTable, element);\n",
       "        const docLink = document.createElement('div');\n",
       "        docLink.innerHTML = docLinkHtml;\n",
       "        element.appendChild(docLink);\n",
       "      }\n",
       "    </script>\n",
       "  </div>\n",
       "\n",
       "\n",
       "  <div id=\"id_a73689b5-3856-4863-8289-c5ccb557705d\">\n",
       "    <style>\n",
       "      .colab-df-generate {\n",
       "        background-color: #E8F0FE;\n",
       "        border: none;\n",
       "        border-radius: 50%;\n",
       "        cursor: pointer;\n",
       "        display: none;\n",
       "        fill: #1967D2;\n",
       "        height: 32px;\n",
       "        padding: 0 0 0 0;\n",
       "        width: 32px;\n",
       "      }\n",
       "\n",
       "      .colab-df-generate:hover {\n",
       "        background-color: #E2EBFA;\n",
       "        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
       "        fill: #174EA6;\n",
       "      }\n",
       "\n",
       "      [theme=dark] .colab-df-generate {\n",
       "        background-color: #3B4455;\n",
       "        fill: #D2E3FC;\n",
       "      }\n",
       "\n",
       "      [theme=dark] .colab-df-generate:hover {\n",
       "        background-color: #434B5C;\n",
       "        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
       "        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
       "        fill: #FFFFFF;\n",
       "      }\n",
       "    </style>\n",
       "    <button class=\"colab-df-generate\" onclick=\"generateWithVariable('loadings_df')\"\n",
       "            title=\"Generate code using this dataframe.\"\n",
       "            style=\"display:none;\">\n",
       "\n",
       "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
       "       width=\"24px\">\n",
       "    <path d=\"M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z\"/>\n",
       "  </svg>\n",
       "    </button>\n",
       "    <script>\n",
       "      (() => {\n",
       "      const buttonEl =\n",
       "        document.querySelector('#id_a73689b5-3856-4863-8289-c5ccb557705d button.colab-df-generate');\n",
       "      buttonEl.style.display =\n",
       "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
       "\n",
       "      buttonEl.onclick = () => {\n",
       "        google.colab.notebook.generateWithVariable('loadings_df');\n",
       "      }\n",
       "      })();\n",
       "    </script>\n",
       "  </div>\n",
       "\n",
       "    </div>\n",
       "  </div>\n"
      ],
      "application/vnd.google.colaboratory.intrinsic+json": {
       "type": "dataframe",
       "variable_name": "loadings_df",
       "summary": "{\n  \"name\": \"loadings_df\",\n  \"rows\": 5,\n  \"fields\": [\n    {\n      \"column\": \"\\u7b2c1\\u4e3b\\u6210\\u5206\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.16295516102146917,\n        \"min\": 0.1800613271518517,\n        \"max\": 0.5521311943390497,\n        \"num_unique_values\": 5,\n        \"samples\": [\n          0.5406648254587515,\n          0.1800613271518517,\n          0.32927403293741186\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"\\u7b2c2\\u4e3b\\u6210\\u5206\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.4783243233807536,\n        \"min\": -0.35868759240665077,\n        \"max\": 0.6759466372627599,\n        \"num_unique_values\": 5,\n        \"samples\": [\n          -0.3003158295811504,\n          0.6759466372627599,\n          0.565224189268271\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"\\u7b2c3\\u4e3b\\u6210\\u5206\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.49871432677339284,\n        \"min\": -0.5350489923008255,\n        \"max\": 0.7534143741342215,\n        \"num_unique_values\": 5,\n        \"samples\": [\n          -0.19500060547686027,\n          0.12174152199204313,\n          -0.5350489923008255\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"
      }
     },
     "metadata": {},
     "execution_count": 9
    }
   ],
   "source": [
    "# 主成分係数の表示\n",
    "loadings_df = pd.DataFrame(\n",
    "    pca.components_.T,\n",
    "    columns=['第1主成分', '第2主成分', '第3主成分'],\n",
    "    index=['国語', '数学', '英語', '理科', '社会']\n",
    ")\n",
    "loadings_df"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "9kfgWpQzQseb"
   },
   "source": [
    "### 5.3 学生ごとの主成分スコアを確認"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "NmPSjXKWQseb",
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "executionInfo": {
     "status": "ok",
     "timestamp": 1768442521742,
     "user_tz": -540,
     "elapsed": 5,
     "user": {
      "displayName": "dataviz-p5-py",
      "userId": "03582549047009910850"
     }
    },
    "outputId": "57d33f52-5eb1-4258-8fc0-c940ed9774dc"
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "総合学力が高い学生（第1主成分の上位10名）：\n",
      "    学籍番号  国語  数学  英語  理科  社会     第1主成分\n",
      "34  S035  95  98  96  99  73  3.456399\n",
      "9   S010  92  95  94  98  90  3.388436\n",
      "14  S015  95  92  76  94  73  2.566460\n",
      "6   S007  88  92  70  95  65  2.072269\n",
      "49  S050  88  92  70  94  66  2.055404\n",
      "1   S002  82  88  85  90  70  2.027555\n",
      "29  S030  92  88  70  85  74  1.899072\n",
      "22  S023  85  90  68  92  63  1.721793\n",
      "45  S046  92  70  94  68  93  1.655136\n",
      "39  S040  85  88  66  90  63  1.538932\n",
      "\n",
      "文系傾向が強い学生（第2主成分の上位10名）：\n",
      "    学籍番号  国語  数学  英語  理科  社会     第2主成分\n",
      "45  S046  92  70  94  68  93  2.009714\n",
      "3   S004  90  65  88  62  92  1.899930\n",
      "25  S026  90  68  92  66  91  1.888972\n",
      "30  S031  72  68  90  65  94  1.888246\n",
      "42  S043  90  65  88  63  92  1.878658\n",
      "32  S033  88  65  86  62  90  1.698290\n",
      "23  S024  68  62  85  60  90  1.660812\n",
      "28  S029  65  58  82  55  88  1.592065\n",
      "48  S049  65  62  84  60  87  1.449506\n",
      "27  S028  82  58  80  55  84  1.376514\n",
      "\n",
      "理系傾向が強い学生（第2主成分の下位10名）：\n",
      "    学籍番号  国語  数学  英語  理科  社会     第2主成分\n",
      "33  S034  62  68  45  70  40 -3.049844\n",
      "37  S038  70  78  52  80  48 -2.693352\n",
      "43  S044  68  72  50  75  46 -2.673570\n",
      "24  S025  78  82  60  85  56 -2.069862\n",
      "16  S017  80  85  62  88  58 -1.989569\n",
      "31  S032  48  55  52  58  46 -1.986762\n",
      "47  S048  82  85  64  88  60 -1.787929\n",
      "39  S040  85  88  66  90  63 -1.631121\n",
      "22  S023  85  90  68  92  63 -1.620866\n",
      "6   S007  88  92  70  95  65 -1.516798\n"
     ]
    }
   ],
   "source": [
    "# 元の得点と主成分スコアを結合\n",
    "result_df = pd.concat([df, pca_df[['第1主成分', '第2主成分', '第3主成分']]], axis=1)\n",
    "\n",
    "# 第1主成分（総合学力）の上位10名\n",
    "print(\"総合学力が高い学生（第1主成分の上位10名）：\")\n",
    "print(result_df.nlargest(10, '第1主成分')[['学籍番号', '国語', '数学', '英語', '理科', '社会', '第1主成分']])\n",
    "\n",
    "print(\"\\n文系傾向が強い学生（第2主成分の上位10名）：\")\n",
    "print(result_df.nlargest(10, '第2主成分')[['学籍番号', '国語', '数学', '英語', '理科', '社会', '第2主成分']])\n",
    "\n",
    "print(\"\\n理系傾向が強い学生（第2主成分の下位10名）：\")\n",
    "print(result_df.nsmallest(10, '第2主成分')[['学籍番号', '国語', '数学', '英語', '理科', '社会', '第2主成分']])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "gpJ9FlvYQseb"
   },
   "source": [
    "## 6. 可視化\n",
    "\n",
    "### 6.1 2次元プロット（第1主成分 vs 第2主成分）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "Ivu63U9kQseb",
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 400
    },
    "executionInfo": {
     "status": "ok",
     "timestamp": 1768442559093,
     "user_tz": -540,
     "elapsed": 622,
     "user": {
      "displayName": "dataviz-p5-py",
      "userId": "03582549047009910850"
     }
    },
    "outputId": "0cb52aca-fb0b-4896-dfbd-91ca4469a8fb"
   },
   "outputs": [
    {
     "output_type": "display_data",
     "data": {
      "text/plain": [
       "<Figure size 1000x800 with 1 Axes>"
      ],
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA9sAAAMWCAYAAADh/5W2AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAA+ilJREFUeJzs3Xl8E3X+P/DXTDJJ2vQg9pCWFgrIJai4gIKugMuqCwguArpfheVwV1A8VhQP1vVYDy7PFd1dUXEVXQVZXQ/0p6LCelQBb6EchWrTFlpKStu0SSYzn98fYwOlV0Kbpklez8cjD+1cec8M7cx7Pp95fyQhhAARERERERERdRg50gEQERERERERxRom20REREREREQdjMk2ERERERERUQdjsk1ERERERETUwZhsExEREREREXUwJttEREREREREHYzJNhEREREREVEHY7JNRETtomka3G53pMMI2YcffhjxuDVNa3Gex+NBfX19J0bTOk3T8Mknn6C6ujrSoXSK77//HhMnTsQVV1yBw4cPRzqcDvX999+jqKgo0mEQEcU8JttERHHqiy++wPLly+H1etu1nc8//xzJycnw+/3w+/245557UFhY2OZ6BQUFuPjii+FyuQAA//73v3H++eeH9N0rVqzAQw89FPh5ypQpWLVqVVDrjh8/Hvv27Wtxvt/vx7vvvot33303pJhCsWTJEtx0003Nzrv33ntxww03tLq+ruuB497Wp71uvPFG3HPPPbDb7e3eVoMXXngB999/f4dtryNdd911ePTRRzFx4kTceeedkQ6nQ5WXl2PUqFGt/vsnIqL2Y7JNRBSnduzYgeXLl2Pw4MH43//+d9zbSU9PhxAClZWVAIAffvgBY8aMQUlJSavrPfzwwygoKEC3bt0AAL/61a/w+eefY82aNUF9b11dHZYsWQJVVQPTLrjgAixevDiQwIeioKAAL730Eu666y5MmjQJaWlpuOCCC3DNNdegqqqqzfUbjsGBAwdabbFu4Pf78eSTT2LUqFEhx9rg/PPPh6IoQX2cTudxf89LL72E//znP3j55ZdhMpmOaxsHDhxodrvNTW/JAw88AEmSgvrcddddxxVnA03TcNJJJ2Hs2LFt/luOtIEDB4a0v7/61a9w44034qKLLuqQBzFERNQ8JttERHFq1qxZ2LVrF4YPH45zzz0XzzzzTJvr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enp6o4ree/bsgdvtBgD89a9/xYEDB5rd3rJlywAAl19+eaPpBw4cwAknnNBmPF6vF3fddRdmzJgR6FLe1jZ+/etfN9vKV1VVhaKiokbd2VuiKAquu+463H777fjwww9x2WWXoXv37o3eCweMFu0xY8YgLS0N999/f6N5O3fuRF5eXuDn3/zmN3jttdfa/O7m1NXV4corr8Q///lPbNiwAbIs44477sDkyZMxdOhQPPPMM02qwofikksuwRtvvIG6urom8+666y589dVX2Lx5M/r379/qdv7yl7+gsLAQDz74YKNpuq7j0ksvxcknn4x58+Zh2rRp2LNnT6vbevPNN6HrOs4+++xWlzv55JPx9ttvtzhfCIF//vOfGDNmDPr374+33norqFcJAOMdaUmSWvwE27ujIY6G1xvmzJmDa665Juh1WzN9+vRW37d/+eWXMWzYMHYjJyIKEybbREQUlNdeew3nn38+du/ejWnTpuGaa67B7bffDgC4/vrr8cILL+C5555DfX09Zs+eDU3TsHLlSnz77bdNtvXGG2/gvvvuw8MPP9ykBfqnn35CVlZWq7FomoY5c+bA5XJhyZIlTea3tI3f//73OPXUU5tM/89//oM+ffpg8ODBrX5vg9tvvx3Dhw/Hr371K+zZswevvvoqLBYL8vPzcdddd+H000/HBRdcgIEDB+Ljjz9ulPiXlJRg586djYpfnXnmmcdVkOuVV17BKaecgqKiInzxxRfIzc0NzLvtttuwdu1aLFu2DIMHD8bTTz+NmpqakL/jwgsvxEknndQoSQaMd+uXL1+O6667DocPH2522C1VVQEYXcWXL1+OZcuWBWJctWoVHnroITz55JOBd6+XLl2K3r17Y/To0di2bVuz8ZSUlOBPf/oT5s+fD4fD0WLcmqahoqKi2eHhVFXF+vXrMXz4cMyfPx8zZszA5s2bW93esZYvX44dO3a0+Bk1alSb22iI44wzzsBNN92Eu+66C08++WSz9RM6WlVVFR544IFmu7ITEVEHCWepcyIi6jrOPvvs4xo6adWqVWLTpk3CbDYLp9PZaJsHDhwQ559/vrDZbOLNN98UQgjx2WefidTUVHH66acLWZZFeXl5YHmPxyPuvfdeYTabxc033yyEMIaKeuGFF8QXX3whNm3aJHJycsScOXNa3I/CwkIxbtw4kZKSIj777DMh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UFtby55vRETUIptiwtDe6TgtLw1e1RhH22KWYVVMUXXNa07IfdEGDx4MADj55JMD08aOHYv33nsP48aNg9Pp7LjoiIiIYlBDYZgyl7vNRPRIYZjEqCsMo6oq1q1bB1VVIx0KERF1cZIkwWYxIyXRApvFHPWJNhBCy/aePXtwxhln4NprrwUAPPnkk4EW7Keeeio80REREcWghsIwazbvQnFlLbIc9mZbuFVNR5nLHbWFYYiIiOJZ0Mn2Z599BgDIzs4OTBs5cmTHR0RERBQHGgrDrM/fi1JXHSQYw3uZZRl+XUdNvQoBINthx7RRfaKyMAwREVE8CzrZPu2005pM+/e//92hwRAREcWTWC8MAwCKokQ6BCIioog4rgJpRERE1DFiuTCM1WrF3LlzYbVaIx0KERFRp+NgnURERF1ALBaG0XUdxcXF0HU90qEQERF1OibbREREFBaqqmLDhg2sRk5ERHGJyTYRERERERFRB2tXst2zZ8+OioOIiIiIiIgoZrQr2RZCdFQcREREFGMkSYLD4YiJ98+JiIhCxW7kREREFBYWiwWXXHIJLBZLpEMhIiLqdO1Kti+55JKOioOIiIhijKZp2LFjBzRNi3QoREREna5dyfaDDz7YUXEQERFRjPH7/di8eTP8fn+kQyEiIup07EZORERERERE1MGYbBMRERERERF1MCbbREREFBaSJCEnJ4fVyImIKC4x2SYiIqKwsFgsmDhxIquRExFRXGKyTURERGHh9/uxdetWFkgjIqK4xGSbiIiIwkLTNGzbto1DfxERUVxisk1ERERERETUwZhsExEREREREXUwcygL19fX48MPP0RhYSEOHToEh8OBvn374le/+hUSEhLCFSMRERFFIVmWMXDgQMgyn+0TEVH8CerqV1ZWhnnz5uHEE0/EihUr8M0336Curg7fffcdHnjgAXTv3h3z589HWVlZuOMlIiKiKKEoCsaMGQNFUSIdChERUadrs2X7nXfewdVXX4358+ejuLgYqampTZaprq7GP/7xD5xzzjl4/PHHccEFF4QlWCIiIooeqqpi06ZN+O1vfwur1RrpcIiIiDpVm8n2fffdh08//RTdu3dvcZmUlBTcfPPNmDVrFqZPn85km4iIiKDrOgoKCqDreqRDISIi6nRtJtsffPBB0N2/TjzxRGzcuLHdQRERERERUfgIIVDv80P161DMMmyKCZIkRTosopjSZrId6ntWfC+LiIiIiKhr8qgaCg9U443vDsF5yA1dB2QZyElLwvC+GRiU44BNMUU6TKKY0K7yoDfffDO2bNkCAKirq8PixYvZVYyIiIgAACaTCcOGDYPJxBt3oq6gqLwGf3/nB3z0fSl2llbBJBst2iZZxs6SKqzZvBuPv/09isprIh0qUUwIKtnesWMHhBCNpl177bX48MMPkZeXB6/Xi0mTJmHjxo2oq6sLS6BEREQUXcxmM4YPHw6zOaSRRokoDIrKa/D8pl0orXLjhCQrctOSkJpoQVKCgtREC3LTk5DlSESpy401m3cx4SbqAEEl25dffjn27dsHXdchhMBTTz2Fbdu2YciQIcjIyMC8efPg8Xjw/vvvIykpKdwxExERURTw+Xx466234PP5Ih0KUVzzqBrW5+9FVZ0XuSckwSQ3/262YpKRm5YEl9uL9fl74VG1To6UKLYElWz36tULu3fvxgsvvICZM2di3LhxeP7553Ho0CG8++67+OKLL7BhwwYkJyeHO14iIiKKEkIIOJ3OJr3jiKhz7XC6UOqqQ5bD3mYRNEmSkOWwo9RVhwKnq5MiJIpNQSXbJ598Mnbv3o1LL70Ubrcb99xzD9LT01FVVYXzzjsPGzdubHb8bSIiIiIiihwhBLYWVkCC0XIdDMUkQwKwpbCCD8uI2iGol6j69OmDb7/9FhaLBa+88gpmzJiBpUuXoqSkBO+//z6EEPjuu+8Cy59//vlhC5iIiIiIiILjUTU4K2uRkmgJab3kBAUllW54VQ02C+suEB2PoH5z8vLysGzZMhw4cAD/+te/8MILL+AXv/gFnE4n7r///kbLSpLEZJuIiIhg/v/t3Xl8FPX9x/H37JWQC5YkHCFRBLkqihZQQAWLJ+AtWA8oitaqWK2IoHhrK4ror9arXqAVLyhW2wreCl4oR6WiXIJoLiSEDeQg2dmd+f0xTTAkIQnsZnO8no9HHrqzs7Of3UmY+XyPz9fj0fDhwymQBsSQGbJkWZLP3bg1tD0ul8pDYQVDluIbl6cD+J8GXf26du0q27bVrl07nXjiiTrttNPUuXNn5eTk6MMPP4x2jAAAoAVyu93q168fS38BMeT1uORySeFGDgcPWZbchiGf54BWCgbatAb99XTp0kWlpaWaO3eufvGLX2jBggX6+9//LkmqqKjQ9ddfr9LS0qgGCgAAWpZgMKj58+dTjRyIoXivW5mpSdpV1ri/w+LdprqlJirOS2MZsL8alGx37NhRO3fu1M6dO7Vo0SLNnz9fycnJcrvdqqio0LZt23TEEUfo22+/jXa8AACghbBtW4FAgAJLQAwZhqFBPdNlSzLDVoNeY4Yt2ZIG90yvt3o5gLo1eFxIfHy84uPjtWjRIvXp00eS88frdrv14osv6vLLL9fIkSO1du3aqAULAIg+27a1OxjSrrKgdgdDJEoA0ML1y/Qrw5+g/EBpvf+m27at/ECpMvwJ6pvpb6IIgdapwRVL7rrrLnk8Hh1xxBFV23r37l3V2nXzzTerqKhI33zzjfr16xf5SAEAUVVuhrU2J6AVmwqUU1giy5JcLikzNUmDeqarX6Zf8QwnBIAWJ97r1nlDemje0g3K3lGiQzu4pFr+OTfDlvIDpfInxmns0B78mw8coAYn29dcc02NbUuXLq32+P777z/wiAAATW7LtmItXLZZeYEyGZJSEnzyuQ2FbVvrc4u0LrdIGf4EnTekh7p3So51uGghvF6vRo8eLa/XG+tQgDave6dkjR/eWws/36QdJUUKhGwlt/PJ43IpZFkq3m3KlpThT9TYoT10cDr/1gMHKqJrcXz++ecaOnRoJA8JAIiyLduK9cKSDSoqq1BXf6K87uozjNon+GSGLeUFSjVv6QaNH96bhBsN4nK5lJWVJZeLasZAc9C9U7KuOu0wfbXue32zLaTcHWUqD4XlNgz16dZBg/83iomiaEBkNCjZfvzxx2vdfvXVV0uSrrzySv31r3/VxRdfrM2bN0cuOgBAVJWbYS1ctllFZRXKSk2qsxCO1+1SVmqSsgtLtHDZZk0e1Z/hhahXRUWF5syZo+uvv17t2rWLdTgA5Awp79E5Rcf0T5cZthUMWfJ5XIrzuimGBkRYg5qa77zzThUVFSkQCOiee+5RIBDQXXfdVfX8Bx98IEkU0QGAFmZtTkB5gTJ19SfWe5NlGIa6+hOVFyjTupxAE0WIls40zViHAKAWhmEo3udRSoJP8T4PiTYQBQ1KtlNTUzVjxgzdcsstSk9P1y233KKOHTtGOzYAQBTZtq0VmwpkSDWGjtfF63bJkLR8UwENrAAAAPvQoGHkBQUFmjZtmmzb1tatWzVt2jRt375dU6ZMkW3bVf8fCNDTAQAtRbkZVk5hiVISfI16XXI7r3ILS1VhhhXvi2jpDwAAgFajQV0Z8fHxGjRokAYOHKh27dpp4MCBiouL05FHHqkjjzxScXFxGjBggHy+xt2wAQBixwxZsizJ3cihgx6XS2HbmecH7IvX69W4ceOoRg4AaJMalGynpKTo/PPP1wUXXKD27dvr17/+tVJSUvSb3/xGEydOVHJysiZOnKjExMRoxwsAiBCvxyWXSwo3cjh4yLLkNgz5PFSYxr4ZhqGkpLoL7wEA0Jo16E5py5YtGjZsmIYOHapNmzZp6NCh+uGHH6qer5y3x8UUAFqOeK9bmalJ2lUWbNTrineb6paayNIwqFcwGNTcuXMVDDbudwwAgNagQZPt3n33XWVmZtb63E8//aSJEydKoho5ALQkhmFoUM90rcstkhm2GlQkzQxbsiUN7plOAysAAMA+NKhne8KECTr44IOrfp5//nkdfPDBkqSysjK99957kqQ5c+ZEL1IAQMT1y/Qrw5+g/EBpvQ2mtm0rP1CqDH+C+mb6myhCAACAlqlBPdu2betvf/tb1eMlS5ZUPbZtWz/88IN27typX/3qV9GJEgAQFfFet84b0kPzlm5QdmGJuvoTa+3hNsOW8gOl8ifGaezQHopnCDnQZGzbVrkZlhmy5PW4FO91M7IEAFqABq/ZsmbNmqpejx07dujrr7+ueq5v37764IMPdM4550Q+QgBAVHXvlKzxw3tr4bLNyguUyZCzvJfH5VLIslS825QtKcOfqLFDe+jg9ORYh4wWwufz6dJLL2W1kv1Uboa1NiegFZsKlFNYIsuSXC4pMzVJg3qmq1+mn4YvAGjGGpxsz5o1q+r/r7rqKj3wwANVj5cvX66XXnqJZBsAWqjunZI1eVR/rcsJaPmmAuUWlqo8FJbbMNSnWwcN/t+NPUXR0Bi2baukpISaLvthy7biag1gKQk++dyGwrat9blFWpdbpAx/gs4b0kPdO9EABgDNUYOS7ffff7/a4yeeeKLa46OOOkqpqamRiwoA0OTivW4deUiaBnRPVYUZVjBkyedxKY4hq9hPpmlqwYIFmjZtmjyeBrfvt3lbthXrhSUbVFRWUevUjvYJPplhS3mBUs1bukHjh/cm4QaAZqhBBdJ69Oixz+c9Hk+9+wAAWgbDMBTv8yglwad4n4dEG2hC5WZYC5dtVlFZhbJSk+pcJcDrdikrNUmB0gotXLZZ5Wa4iSMFANSnQck2AAAAom9tTkB5gTJ19SfW29BlGIa6+hOVFyjTupxAE0UIAGgokm0AABA1Xq831iG0GLZta8WmAhlSg9a91//2MyQt31TA3HgAaGb2K9m2LCvScQAAgFYmLi5OkyZNUlxcXKxDaRHKzbByCkuUktC46u3J7bzKLSxVBUPJAaBZ2a9ku1+/fpGOAwAAtDKWZSk7O5tG+gYyQ5YsS3I3sk6Cx+VS2LYVDPE9A0Bzsl/J9hlnnKH58+dHOhYAANCKmKapRYsWyTTNWIfSIng9LrlcUriRw8FDliW3YcjnYXYgADQn+7UOR69evfTUU09pzpw5OuaYY+R271l39fbbb49YcAAAAG1FvNetzNQkrc8tUvtGDCUv3m2qT7cOivO6698ZANBk9ivZfuWVVyRJ4XBYS5curdpuGAbJNgAAwH4wDEODeqZrXW6RzLDVoCJpZtiSLWlwz3SW6QOAZma/xht9+OGHtf588MEHkY4PAAC0UIZhyO/3kwQ2Qr9MvzL8CcoPlNZbXdy2beUHSpXhT1DfTH8TRQi0HevWrdMJJ5ygzMxM9erVSw8//HDVc08//bT69OmjjIwMXXHFFaqoqKh6LhgMatGiRTrzzDPVo0ePGse977771L59e2VmZlb9zJw5s0k+E5rWAU3u2bp1q5YtW6a8vLxIxQMAAFoJn8+n888/Xz5f46prt2XxXrfOG9JD/sQ4ZReWyAzXXvTMDFvKLiyRPzFOY4f2UDxDyIGIO++88zRhwgTl5OTo/fff1zPPPKMlS5boH//4h2bNmqUlS5bo+++/V0FBgWbMmFH1uvvuu08PP/ywMjIyai0QmZ+fr3vvvVc5OTlVPzfffHNTfjQ0kf1Ktk3T1IQJE5SRkaFhw4YpKytLF154oYLBYKTjAwAALVQ4HNbatWsVDrMkVWN075Ss8cN7K8OfqPxAmbK3l6iotEIlu00VlVYoe3uJ8gNlyvAnasKI3jo4PTnWIQOtzvbt2/Xtt9/qggsukCQddNBBWrZsmUaMGKHZs2dr6tSp6tKli+Li4jRz5kw9++yzKi8vl+TUsHr77berXru3/Px8ZWRkNNlnQezsV7I9c+ZMbd68WStXrlRpaamWL1+u3Nxc/fGPf4x0fAAAoIUKhUJaunSpQqFQrENpcbp3StbkUf01YXgv9enWQbYtlYfCsm2pT7cOmjC8l64Z1Z9EG4iSDh06KD09XTNmzNDu3bslSYmJiQoGg1q+fLlOPvnkqn379u2rlJQUrVq1qkHHzs/PV7du3aISN5qX/SqQ9tJLL+mTTz5RWlqaJOmXv/ylXnvtNQ0bNkx33313RAMEAABoi+K9bh15SJoGdE9VhRlWMGTJ53EpzutmHjwQZR6PR6+++qrOP/98vfLKK5o6daquvfZa7dixQ6ZpqkuXLtX279Kli/Lz8xt07Pz8fC1evFhXXnmliouLdc455+iee+5RXFxcND4KYmi/erZLS0urEu1KaWlpVa0+AAAAiAzDMBTv8yglwad4n4dEG1Vs29buYEi7yoLaHQzVW1QPjfOrX/1KmzZt0vXXX69Zs2Zp2LBhVdNm9/47NAyjwd9/fHy8kpKS9Mknn+iLL77QmjVrdOONN0Y8fsTefvVs9+7dWy+//LIuvPDCqm2vvvqqevbsGbHAAABAy2YYhjIzM0kOgQgrN8NamxPQik0FyikskWVJLpeUmZqkQT3T1S/TT9G8CElJSdFNN92kSZMm6fjjj9dLL70kr9errVu36pBDDqnab+vWreratWuDjrlmzZqq/09ISNBdd92lMWPG6C9/+UvE40ds7VeyPWvWLA0fPlyvvvqq+vbtqw0bNujtt9/Whx9+GOn4AABAC+Xz+TRmzBiqkQMRtGVbsRYu26y8QJkMSSkJPvnchsK2rfW5RVqXW6QMf4LOG9JD3Tsxp/9AFBYWKjU1VZLUqVMnnX766dq6datGjBihDz74QJdddpkk6YcfflBRUZEGDhzYoONaliWXa88AY4pItl77NYx84MCB+vzzz9WpUyetWrVKHTt21CeffKKjjz460vEBAIAWKhQKacWKFRRIAyJky7ZivbBkg/ICperqT1BWWpLaJ/iU1M6r9gk+ZaUlqas/QXmBUs1bukFbthXHOuQWa8OGDerbt6/ee+89SVJBQYEWLVqkE088UVdddZUeeOAB/fTTTwoGg7rxxhs1ceJExcfH13vc0tJSHXbYYXrrrbckSUVFRbrtttt08cUXR/XzIDb2q2dbko444gg99dRTkYwFAAC0IuFwWCtXrtSJJ54Y61CAFq/cDGvhss0qKqtQVmpSndMzvG6XslKTlF1YooXLNmvyqP4MKf8Z27ZVboZlhix5PS7F11FwsHfv3nrqqac0ffp05efnKyEhQZMnT9aZZ54pSdqyZYuOPvpoBYNBjRkzRvfff3+D3j8xMVFPP/20pk+frssuu0yhUEjnnXeeZs6cGdHPieZhv5NtAADQvDT0JhJAy7M2J6C8QJm6+hPr/bs2DENd/YnKC5RpXU5ARx6Sts/924L9med+zjnn6Jxzzqn1eFOmTNGUKVP2+Z4nnHCCtmzZUmP7cccdp08//XS/PwtaDpJtAABaOIolAa2bbdtasalAhpye64bwul0yJC3fVKAB3VPbdMMb89wRKyTbAAC0YM35JtLlcqlv377VCgEBaLxyM6ycwhKlJDSu2GByO69yC0tVYYYV72ubt/2V89yLyirU1Z9Yo7GifYJPZtiqmuc+fnhvEm5EDFc/AABaqOZeLMnr9WrEiBHyer1N+r5Aa2OGLFmW5G5k77TH5VLYthUMWVGKrHnbe557XaMCKue5B0ortHDZZpWbVAdHZOx3sm2aps4//3x98MEHkqRt27bpoosu0u7duyMWHACHbdvaHQxpV1lQu4Mh2bYd65AAxFhLuIk0TVNLliyRaZpN9p5Aa+T1uORySeFGXv9DliW3YcjnaZv9awcyzx2IhAaNJ1myZImOPfZYeTzO7rZt69e//rWKioo0bNgwFRUV6aSTTlL37t2r9gFw4JiHCaAuLaFYkmVZWrdunSyrbfaqAZES73UrMzVJ63OL1L4RQ8mLd5vq062D4trgvQLz3NEcNOg37/e//702b96s8vJylZeX6+GHH5Zt28rMzFR8fLwuuugiHXrooXrttdcYKgZEyJZtxXps8RrNW7pR63OL5HY5lYXdLpfW5xZp3tKNemzxGtbQBNqgA72JZHQM0LIYhqFBPdNlSzLDDWu8MsOWbEmDe6a3yaQxEvPcgQPVoCt03759tXHjRi1YsECnn366zj//fD3yyCMKBAJ6++23VVxcrFdeeYVebSBCmvs8TACxxU0k0Pb0y/Qrw5+g/EBpvQ1mtm0rP1CqDH+C+mb6myjC5oV57mgOGpRs9+vXTxs2bNCECRPUr18/TZo0SQkJCQoEAjr11FP11ltvyedr3AUfQO1awjxMALHVUm4i3W63Bg4cKLe77Q1hBSIt3uvWeUN6yJ8Yp+zCkjp7uM2wpezCEvkT4zR2aI82O92Mee5oDhrUFd2jRw998cUXsixLjzzyiKZNm6brr79eP/zwg5566qka+19xxRURDxRoK1rCPEwAsdVSbiI9Ho8GDRrUJCPfbNtWuRmWGbLk9TjTbtri0Fm0bt07JWv88N7VlvtLbueVx+VSyLJUvNuULSnDn6ixQ3vo4PS2u4QV89zRHDTo6nfwwQdrxowZ+u9//6s33nhDs2bN0pFHHqnCwkJ9/vnn1fY1DINkG9hPFPMA0BAt5SYyGAzqzTff1MUXX6z4+PiovAeFJNHWdO+UrMmj+mtdTkDLNxUot7BU5aGw3IahPt06aPD/fu/berJYOc99XW6RzLDVoPuqtj7PHZHXoGS7a9euSklJ0UknnaTjjz9exx57rAYMGKCcnBzNnTs32jECbUYk5mHG+6idALR2LeUm0rZt5eTkRK0g25ZtxdV6+FISfPK5DYVtW+tzi7Qut0gZ/gSdN6SHundquz18aH3ivW4deUiaBnRPVYUZVjBkyedxKY4RHdVUznPPC5QqKzVpn9/NnnnuiW12njsir0FdZ126dNGOHTt055136sQTT9TGjRv1zDPPSJJ27dqlc845R7m5uVENFGgLWso8TACx19aLJVFIEnAa3uJ9HqUk+BTv85Bo74V57oi1BiXb7du3V3FxsYqKivTGG2/o5Zdfltfrldvtls/nU79+/TRgwAAtWbIk2vECrVpLmYcJIPba8k0khSQBNFTlPPcMf6LyA2XK3l6iotIKlew2VVRaoeztJcoPlCnDn6gJI3q36XnuiLwGjzdNTExUXFycvvjiC3Xt2lWS05oWDod177336rDDDtOZZ56pf//73zr++OOjFjDQmrWUeZgAmofmXizJ4/Fo+PDhES+QRiFJAI3BPHfESoOvfk8//bTi4+OrEm1JOvHEE6suoBdffLGKiooUDtNqDOyvljIPE0Dz0ZxvIt1ut/r16xfRpb8oJAlgfzDPHbHQ4GT77LPPrrHtxRdfrPZ48uTJBxwQ0NZRzANAYzXXm8hgMKj58+friiuuiFg1cgpJAjgQlfPc4xv3TwiwXxo1wdM0zWjFAeB/2vI8TAAHprkVS7JtW4FAIKLVyCkkCQBoKRqVbHfr1m2fz99www1as2bNAQUEgGIeAFAXCkkCAFqKRl1x9tUyXVJSoieffFKBQOCAgwKwZx7mhOG91KdbB9m2VB4Ky7alPt06aMLwXrpmVH8SbQBtSmUhyV1lwUa9rni3qW6piRRAAgA0mUZPWvrggw80YsSIGsVO5s2bp6ysLCqRAxHUXOdhAkBDeL1ejR49Wl6vN2LHpJAkAKClaPRYqssuu0xdunTRjBkztGPHDklSKBTS7Nmzdcstt0Q8QADNbx4mADSEy+VSVlaWXK7IDt2uLCSZHyitdz74nkKSCRSSBAA0qUZd/QzD0Pfff69//OMfys3NVa9evTRv3jzNmjVLnTp10vjx46MVJwAAaGEqKio0Z84cVVRURPS4FJIEALQE9Q4jnzZtmiSnZbisrEySdNxxx+m4447Thx9+qIkTJ2rXrl1avXp1dCMFAAAtTrRWMqksJLlw2WblBcpkyFney+NyKWRZKt5typaU4U/U2KE9qG8BAGhy9SbbcXFxdT73008/KRgMKi0tTevXr9fBBx8c0eAAAADqUllIcl1OQMs3FSi3sFTlobDchqE+3TpocM909cv0UxQNABAT9Sbb99xzT9X/P/nkk5KktWvX6pZbbtHmzZv1wQcfyLIsnXnmmVq5cqX8fuZDAQCApkEhSQBAc9Xopb9Gjhyp0047TSeeeKJWrFihX/ziF+rfv7/OPvts3XTTTdGKEwAAtDBer1fjxo2LaDXyulBIEgDQ3DR66a+pU6fq1FNPrbH015QpU3TYYYfpvvvuo3cbAIAWzLZtlZthmSFLXo9L8fvZS2wYhpKSkkh8AQBtUqOSbcMwNHr06Fqfy8zM1LHHHqtnnnlGN954Y0SCAwAATafcDGttTkArNhUop7BEliW5XFJmapIG/W/+c2MqegeDQc2dO1fTpk1Tu3btohg5AADNT6OS7a5du+7z+fHjx0e8VzsnJ0f//Oc/9fTTT6t9+/b66KOPInp8AAAgbdlWXK2yd0qCTz63obBta31ukdblFinDn6DzhvRQ905U9gYAoD6NSrbrW97roosuOqBg9lZWVqbhw4frhBNOULdu3VRSUhLR4wMAACfRfmHJBhWVVairP1Fed/WSLu0TfDLDlvICpZq3dIPGD+9Nwg0AQD0aVSCtqSUkJGjz5s2aM2eOBg0aFOtwAABodcrNsBYu26yisgplpSbVSLQred0uZaUmKVBaoYXLNqvcDDdxpAAAtCz1JtsXXHCBKioqGnSw8vJyXXDBBQccFAAAaBprcwLKC5Spqz+x3kJmhmGoqz9ReYEyrcsJ1Htsn8+nSy+9VD6fL1LhAgDQYtQ7jHzEiBEaOHCg7r77bp177rl17vf3v/9dd911l37/+99HNMDGqqioqNY4sGvXLkmSZVmyLCsi72FZlmzbjtjxEDucy9aDc9l6cC6bjm3bWvHdNhmy5XUZkm3X+xqvy5AhW8u/26bDD/LvM0EPh8MqLi5WOBymInkLx99l68G5bD04l7HT0O+83mT7qquu0tFHH62bbrpJ11xzjU477TT16tVLHTt21I4dO/Tdd99p8eLFOvzww/W3v/1NRx11VIPeuKCgYJ/7TpkyRVOmTGnQsX5u5syZuuuuu2p9v/Ly8kYfrzaWZWnnzp2ybVsuV7MeiY96cC5bD85l68G5bDoVZljFRYXKTDTUzi5r8Ou6JTqvy83bKt8+qpOXl5fr73//uyZOnKj4+PhIhIwY4e+y9eBcth6cy9gpLi5u0H4NKpA2cOBAvfvuu9q4caPeeustbdq0SevWrZPf79dRRx2lGTNmqGfPno0KMD09XTk5OY16TUPcfPPN1ZL0Xbt2KSsrS+np6UpJSYnIe1iWJcMwlJ6ezi92C8e5bD04l60H57Lp7CoLKhDK/d862t4Gv65MpsrDYaX4U5WSUPcQ8d27d0tyrvks/dWy8XfZenAuWw/OZew0tAG5UdXIe/XqpV69eu1XQE0lLi5OcXFxNba7XK6I/hIahhHxYyI2OJetB+ey9eBcNo04n0cul6GwLakRw7xDli234VK8z7PPc1T5HOeydeDvsvXgXLYenMvYaOj3zVkBAKCNive6lZmapF1lwUa9rni3qW6piYrbxxDySl5vw3vMAQBoTUi2AQBoowzD0KCe6bIlmeGGFXsxw5ZsSYN7ptdb9CwuLk6TJk2qdcQZAACtXaOGkcfSnXfeGesQAABodfpl+pXhT1BeoFRZqUn7TKBt21Z+oFQZ/kT1zfTXe2zLspSdna20tDSGOAIA2hyufAAAtGHxXrfOG9JD/sQ4ZReW1NnDbYYtZReWyJ8Yp7FDeyi+AUPITdPUokWLZJpmpMMGAKDZazE92wAAIDq6d0rW+OG9tXDZZuUFymRISm7nlcflUsiyVLzblC0pw5+osUN76OD05FiHDABAs0eyDQAA1L1TsiaP6q91OQEt31Sg3MJSlYfCchuG+nTroME909Uv09+gomgAAIBkGwAA/E+8160jD0nTgO6pqjDDCoYs+TwuxXnd9RZDq41hGPL7/fv1WgAAWjqSbQAAUI1hGIr3eRTvO7Dj+Hw+nX/++fL5DvBAAAC0QPtVIM00Tb322muRjgUAALQi4XBYa9euVTgcjnUoAAA0uf1KtqdOnaoZM2aovLw80vEAAIBWIhQKaenSpQqFQrEOBQCAJtfoYeSzZs3Syy+/rDlz5qioqEjJyclKTEyMRmwAAAAAALRIDU62LcvS1KlTtXDhQi1dulSHHXaYkpOTVVxcLI/Ho7S0NHXv3l2XX365Lr300mjGDAAAAABAs9agYeQrVqzQkCFDtHbtWq1cuVJ9+/ZVx44dVVRUJNM0lZOTozfffFOjR4/WddddF+2YAQBAC2AYhjIzM6lGDgBokxqUbN9///265pprtHjxYqWlpUlS1YXT5XIpPT1dRx55pG688UbmcQMAAElONfIxY8ZQjRwA0CY1aBj5ggULGnSwn376ScnJyQcUEAAAaB1CoZBWrFihU045hYQbANDmNKhne9euXTW2bd++XX369NEFF1ygV155ReFwWImJiXr//fcjHiQAAGh5wuGwVq5cydJfAIA2qUHJ9u9+9zsNHz68WiLt9/v1wgsv6Pjjj9d9992nXr166fvvv9eRRx4ZrVgBAAAAAGgRGpRsP//885o4caImTpyo8ePHq6SkRC6XS0cffbQmT56sr776Sn/4wx900kkn6Ztvvol2zAAAAAAANGsNSrZ9Pp8uu+wyffPNN7JtW7/85S81bNiwavtce+21mjp1qiZOnBiVQAEAQMvicrnUt29fuVwNut0AAKBVadTVr3379nrxxRd19tlna926ddqxY0e152+88UZt375dGzdujGiQAACg5fF6vRoxYoS8Xm+sQwEAoMntV1PzrFmzNHLkSH3//ffVtvt8Pn399dfq1atXRIIDAAAtl2maWrJkiUzTjHUoAAA0uQYt/VWbJ554otbtLP0FAAAkybIsrVu3TpZlxToUAACaXIN7toPBoP71r3/V+lxJSYluvfVWvfzyywoEAhELDgAAAACAlqjByXZxcbFuueUWSdJbb72lsrKyqucCgYA6d+6sN954Q0cddVTkowQAAAAAoAWpN9kOhUK67rrr9Oyzz1Ztmz9/vg499FDdeeedqqioUFZWli666CLl5+frD3/4QzTjBQAALYTb7dbAgQPldrtjHQoAAE2u3mT7scce08qVK3X66adXbZszZ47+85//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PXs2iXYLZVmW/v3vf9fYzn1r80SyvR+OPPJI2bZd7adyORPbtjVv3rwYR4jG+stf/qJx48bphx9+kCRt3bpV999/f40CP2j+5s+frzVr1mjevHny+XyxDgdok6ZPn65Zs2Zpw4YNkqTXX39d77zzjq655poYRwa0XVdeeaWuvvpqjRs3Ltah4AAUFBTo8ssv11133aWKigpJTmPm22+/rTFjxsQ4OuyNYeSApGeeeUazZs3SKaecopKSEvl8Pp155pm65557Yh0aGmnx4sXKyclRz549azz3f//3f9xkAE3gwgsv1K5du3T66aerpKRE3bp107///e9a/y4BNI3Fixdr5cqVevrpp2s8x7SelqNz585atmyZbrrpJvXo0UO2batz58567rnndPLJJ8c6POyFdbYBAAAAAIgwhpEDAAAAABBhJNsAAAAAAEQYyTYAAAAAABFGsg0AAAAAQISRbAMAAAAAEGEk2wAAAAAARBjJNgCgXh999JEuv/zyats+/fRTXXTRRRE5vmmauvjii/Xoo48qHA7v1zGOO+44vffeewqFQvrzn/8s0zQjEltDPfHEEzr//PNrbH/++eeVn59f9diyLP3444+ybVv/+c9/IhqDbdvKzc2VJOXl5Wn16tVVz+Xn52vVqlUReZ9AIKAjjjgi4vHXZcWKFerfv3+D93/uuee0cuXK/X6/2bNn65prrtnv1wMAIJFsAwAa4JFHHtG//vUv9e/fX/3799eZZ56puXPn6t13363a1r9/f9144437dXyv16trr71Wzz33nIYNG6ZNmzY1+hgdO3ZUUVGRTNPUggULNGXKlDr3raio0AUXXKCioiJJ0tixY/Xll1/uV+yStHLlSj3yyCN67rnnqm3ftGmTbrrpJsXHx1dt++c//6mpU6fKsixdccUV+uijj/Z57PXr1yslJUXDhg1TRUXFPvddsmSJBg8erJKSEi1dulTjxo2rary47bbb9Oc//7nez7Ju3bpq8dbG7/frxRdf1Lhx41RWVlbvMZvao48+qp07d8Y6jGapvt8hAEDkkGwDAPbp448/1vbt25WXl6eSkhJ98sknuv/++7VkyRLl5eXpsMMO05133qk1a9bogQceqHqdaZr68MMPdcUVVygpKanepPKYY47R559/rhNPPFGbN29udJxpaWnKyclRaWmpnnrqKWVmZmr79u21Jhfz5s1TTk6OOnToIEk644wzNHnyZIVCoUa/ryRNnz5dd911lxISEqq2Pffcc5oxY4b++Mc/6oUXXtDrr78uSXrwwQd19dVXyzRNPf7445o4cWKdn7e8vFy/+c1v9Nhjj+nwww/XRRddtM9k6YQTTtChhx6qv//97xo3bpzcbrf+85//6JNPPtF7772nRx55ZL8+X20OP/xwnXTSSQ1K4Bvj9ddfV/v27as14lxyySWSVG1b//79ZRhGjXMWCoW0Zs0a/frXv1aXLl1q/Jx22mnV9r/++uvVvXv3aj8zZ87Uyy+/XGP7cccd16jPkpKSooyMDGVmZlb9TJs2rer5VatWyev1Vns+MzNT//jHP+o85plnnqnU1NRq+x9//PFVz3/22Wfq27evMjIydNNNN1V7bTAY1FlnnVXVyAQAiDIbAIB9GDBggP3FF1/Ytm3bU6dOtVeuXGn/9a9/tefMmWPbtm2///779syZM2u87o477rCHDx9u//GPf7Ql2R9++GGNfQ4//HC7ffv29f5069at2usmTpxop6Sk2J07d676SU5Otjt27Ggfdthh1X5ef/31aq8tKiqyMzIy7Lfffrtqm2VZ9imnnGL/4Q9/aPT3s379ertz5862ZVnVtt922232L37xCzs/P98+5JBD7K1bt9qPPvqoPWrUKPvNN9+0L7jgAtu2bfvJJ5+0DzroILu4uLja68vLy+3TTjvNvuqqq2zbtu1QKGRfdtll9nHHHWf/+OOPNeIYOXKkffDBB9vp6en2wQcfbB988MF2VlaWffDBB9tJSUl2SkpK1fZXXnml6nVnn3223adPn6qfQw45xJZkJyYm1vgJBoPV3vPrr7+2s7KyGv2d7cs//vEP+7zzzqu2bc2aNfapp55aY1+3222bpllt26pVq+w+ffo0+P3C4bD9ySefVD0uLi62f/GLX9jbt2+3d+7cadu2bQeDQfvVV1+tcY73ZefOnbYku6ysrM593njjDfvoo49u8DFt27aPOuooe9GiRXU+P2DAAPuTTz6xi4uL7UMPPdRetWpV1XPXXnttjb8HAED0eGKc6wMAmrl33nlHo0aNqupRXbx4sSoqKmTbth588EFJUjgc1sqVK7VgwYKq191555268847JUm33nprrcf+73//W+1xSUmJkpOTZZqmPJ59X6IefPDBavPIX375Zb3++ut69dVXJTlzo12umgO4rr76ag0fPlynnHJK1TbDMDRv3jz98pe/VJcuXTR9+vR9vvfPvfXWWzrttNNkGEa17Xfffbe2bt2qU045RdOmTVP79u21efNmPfvss/r973+vSZMm6cknn9QvfvELLViwQElJSVWvXbt2rS6++GKdeuqpuvfeeyVJbrdbzzzzjB5++GENHjxYt9xyi6644grFxcVJknJzc/Xee+/p0EMP3We8l19+uYqLi6seP/bYYwoGg1WPV69ereuvv75ab/vWrVvVtWtXeb3easeq7F1es2ZNo+ZU78thhx2m8ePH61e/+pUCgYAkqaCgQD/99JMOP/xwud1uSdJpp52me++9t+pxpbfffltDhgxp8Pvt2LFDU6ZM0XHHHaeePXvqySef1LXXXqu3335b8+fP19y5c3XxxRerc+fOOuecc2p8B3XJzc1Vamqq2rVrt899srKyGhxrQ16zYcMGDR48WD6fT4MGDdJ3332no446SgsWLJDP59NZZ53VqPcDAOw/km0AwD516tSpRrGp++67T+Xl5VXJ9FdffaU//OEPTR/czxx55JG64447qh5fdtllGjdunEaPHl21bdq0afriiy9qLRSWnp6ud955R8OHD1dubq4eeOCBqkR2XzZt2qRevXrV+lxqaqoOO+wwhUIhPfTQQ3rwwQe1fv16rV+/XqNGjdJ///tfnXzyyfr4448lST/99JNuueUWffzxxzrvvPP0t7/9TS+88EKN477zzju69dZb9fDDD2v16tVKTEyseq579+51xvrz76dSRkZGtcdfffVVjYS9vLy8ziTz0EMP1aZNmyKWbPfq1Uu9evXS2WefrVAopHfffVc333yzfve73+nTTz9VZmamxo8frxNOOKFGA4fkNH6sXr1amZmZ1bZblqVBgwbpn//8Z7XtaWlpev/99/XAAw9o3LhxWrlypT799FOtXLlSixYt0kcffaRx48bp0ksvrfa6hx56SA899JBycnJq/Rw5OTk66KCD9vlZG7LPzwWDQRUUFOzzNf369dOHH36o4447Tv/5z390yy23aOPGjXruuef0xhtvNPi9AAAHjmQbAFCvqVOnatGiRfL5fJKkbdu2ybKsqnnIu3fvVteuXZs0pttuu02zZ89WOBxWRUWFfvjhB+3cuVP5+flyuVxavHhxtTnKV155pd5//33169dPPXr0kGVZCgQCSk1Nrdpnx44dev311zV16lQNHz5cY8eOrTeOQCCgvn37Vtu2fft2DRgwQBUVFRo+fLiCwaDmzZunTp066bPPPtPxxx+vu+++W507d9Y111yjO+64Q6+88or8fr9OPfVUPfHEE/J6vVW92rX55z//qa1bt1Yl2uvWrZMkbdmypWqfYDCo+fPn6+GHH9b555+v3/zmNzWSxr198cUX6tOnT7Vt5eXl1eaj/1xqaqp27Nixz2M2VigU0rhx47R9+3Ydc8wx+ve//12VPK9cuVIPPfSQFi9erFmzZlV7nW3bSkhI0HfffVftvErSokWL6pxfXlFRoW+++Ubz5s3T7bffrhNOOEGLFy/WhRdeqD/96U+aMWOGysrKdNVVV1WNlpgyZco+i/Dl5uYqPj5ekydP1gcffCDDMHTWWWfptttuq/ouc3NzZRiGzjnnHK1evVqpqam68sorddlll9V6zLy8PMXHx+vJJ5/USy+9pJ07d2ro0KGaOXNmVQL+1FNP6corr9SOHTt0zTXXqGfPnjrrrLP03HPP1TtaBAAQWfyrCwCo15dffqm5c+fqmGOOkVSzZ3vbtm167733Gn3cpUuX6txzz62xvUuXLtUez507V2eccUbVY9M0dd9992nixInKzs7WqaeeKsMwNGbMGL3xxhv66quvqgqzVbrsssv0xz/+UWlpaZKcpHL8+PHauHFj1T4pKSkaNGiQvvrqqzqTy735/f4ayWZaWpp+/PFHud1udenSRfPnz1dmZqZOP/10XX755dq4caPOPPNMffrpp+rYsaPKy8slST6fT+PGjdMXX3yhiy++eJ/v++2339b4nvZ27rnnqkuXLnr77bfVsWPHej+LZVmaP3++5syZU217cXFxtd7zn9uxY4f8fn+9x5akcePG6fPPP5ckZWVlVf3/zx133HHVeouzs7P197//vdo+u3btkiTNnz9fF1xwge677z5JznSARYsW1freJSUltY5UeP311zV58mTdcsstKiws1NChQxUOhzV69Ggdeuihuueee/TBBx/o0ksv1eeff6558+Y16LMGg0GVlJRo/Pjx+stf/qL8/HyNHz9el112mV5++eWqeLdt26ZHH31U3bt314oVK3TWWWcpFArpd7/7XY1j7ty5U+np6eratas+++wzWZalGTNmaOTIkVUjHAYOHKjly5dXveaKK67QtGnT9NNPP+nMM8/Uzp079dvf/rZaoTYAQHSQbAMA9ikcDmv16tX6zW9+UzWUePv27bIsq0YS9MMPP+jmm29u8LGHDx+u7du3Vz2unLO9devWffbC7dq1S+3bt5ckFRUVVVUVv+SSSzRx4kR5PJ4a88EHDx5c7fHy5ct11FFHVfucle/f0ERbcoZR1zYsfc6cOVXJ8J133qm+fftWVc/+4osvNHr0aP3hD3/Q7NmzqzUKSM5IgQ4dOmjFihW1vqdhGLIsq+rxX/7ylxq9vJJznpKSkvTWW2/VeK624c9z586VYRgaPnx4te0FBQV1JuubNm1Sz549a31ubz+f01+XTz75pN59br31Vnk8nqrGHknq2bPnPpf7qqiokGmaVY0tb7zxho499lgNHjxYS5curfoMlSMmtmzZokcffVRffvmlunbtqkWLFjWqB/+KK67QFVdcUfU4MzNT999/v4YNG6ZnnnlGiYmJmjt3brXXDB48WNddd53mzp1ba7I9YMAA/fDDD9W2PfTQQ3r22Wf18ccf16i0/txzzykzM1MnnXSSBg8erPvuu09DhgzRwIEDNXr06IgN/QcA1I5kGwCwT/n5+Ro+fLj+9a9/adu2bRo/frxs29a4ceOqJTv33XdfVY9jtH333Xfq0qWLKioq9N1331XNO+7Vq5e2bt2qm266Se3atdOPP/4ov9+v5OTkaq+3bVtPP/10tUJohYWFcrvdNfatz6hRo3TvvffKtu1qc4iXL1+uUaNGSZKGDRumF198Ubt371ZOTo6effZZrV+/XsuXL9djjz0ml8tV63zqhrr22mt17bXX1th+9tlna+zYsRo/fny9x6gsjPbKK6/UmAudm5urzp0713jNt99+q1AopMMPP3y/Y6/LSSedpNzc3Koe9e3bt+vss8+ucyh4fWuzz5w5U3l5edWmFuTk5NRaTK2kpEShUKhqmsTP/d///Z/GjRvXoM+wd5G+yjXPK7ft/TtTuU9tc9HrOqZt27Isq8Zrvv76a73xxhtauHChJOmbb77R8OHD5fP59Mtf/lJr164l2QaAKGOdbQDAPmVmZuqf//yn/vWvf+mYY47RxIkTNWHChKrny8rKJDkJcG0JWaQVFhYqJydHcXFxysjI0KWXXqrx48ertLRUp59+uq666io988wz2r59u15//XXNnDmzxjEeeeQR7dy5s1rSlJubW9Xr2RiHHnqo+vfvX6OX/+uvv1aPHj0kSb/85S+1Zs0affPNN1XF1CrjP/TQQ/XEE0+otLS00e8dKf/+9781cuRI3XvvvVUF5VasWKGCggKVlpbqrbfeqrUI3KOPPqqrrroqanHNnTtXK1as0IoVK+qsaN9Qubm5NeoKZGZmKicnp8bPrbfeqksuuaTW5xqaaM+ePVunnHKK8vLyJDmNVtOmTdPFF19cVaH8jDPO0NSpU6v+hlasWKGHH35Yv/3tb2s95meffaY+ffpUDRMvLy/Xddddp8zMTJ1wwglV+5WUlOj666/X008/XZWYH3rooVq2bJkqKiq0evXqeqvWAwAOHD3bAIB9WrhwoW6//XZ17NhRr776qo4++uiqObKSdNRRR2n79u1KTExs1BDyl156SVdffXWtz9WW9M6cOVNXXXWVXnrpJY0aNUpHHXWUCgsLJTlVvE855RSdcMIJevDBB9W9e3ede+656tq1q84888yqY1RUVGj27NmaNWuW3n33Xe3atUulpaXq3LmzFi1atM9K3vty//33a8KECRozZowSEhIUDof1008/VfUcdunSRZ999pkGDhyo6667TpIz7/yrr77SRx99pNGjR2v16tUaNmxY1TG//vrr/YqnqKhIpaWlSktLUyAQqHX5s5+7+OKL9c4772ju3LnVvqtbb71V77zzjmzbVvv27fX2229Xe90333yjd999V6tXr250jA31m9/8ptqQ/sp57MFgsN4luFavXq0OHTqoS5cuKi0t1bvvvqs//elPEYutvmrk11xzjXbu3KkRI0aorKxMtm1r7Nixuv/++6v2efLJJzVjxgz16dNHwWBQ7du31+23365JkyZJ2tPzXtmbPmzYMN1666363e9+p23btqm8vFzHH3+83nnnnWrz0adPn6577rmn2t/RY489pt/+9rcqLi7WpEmTqk2hAABEScxW+AYAtAiff/65/eabb1bbNnPmTPuOO+6ISTzHHXec/cUXX1Tbdswxx9h33313tW0PPfSQnZWVZW/fvt22bdveuXOnfdBBB9lHHXWUvXr1atu2bXvVqlW23++33W63nZiYaD/99NP7HdcTTzxhjxs3rupxeXm5bdu23blz56pty5Yts23btseNG2e3b9/e9vv99quvvmpbllXtWB9++KE9cODAOt9Lkr179+5an/v222/tLl262HFxcXZGRoa9cePGfca9bNmyqu9ob6Zp2oFAwA6FQtW2BwIB+4gjjrBXrVq1z2MfiH/961/2Tz/9VG3bCSecYKelpdlJSUn2a6+9ts/XX3311XaHDh1sr9dre71e+/jjj7dLS0sb9N4PPPCAPXny5P2OPdYa+jkBANFl2LZtxzrhBwCgoUpLS2tUxi4uLm7QXOv169erd+/e+5wTCwAAEAkk2wAAAAAARBgF0gAAAAAAiDCSbQAAAAAAIoxkGwAAAACACCPZBgAAAAAgwki2AQAAAACIMJJtAAAAAAAijGQbAAAAAIAII9kGAAAAACDCSLYBAAAAAIgwkm0AAAAAACLs/wG60UlyltiIAwAAAABJRU5ErkJggg==\n"
     },
     "metadata": {}
    }
   ],
   "source": [
    "# 2次元プロット\n",
    "plt.figure(figsize=(10, 8))\n",
    "plt.scatter(pca_df['第1主成分'], pca_df['第2主成分'], alpha=0.6, s=100, c='steelblue')\n",
    "\n",
    "# いくつかの学生にラベルを表示\n",
    "for i in [0, 9, 14, 21, 34]:  # 特徴的な学生をピックアップ\n",
    "    plt.annotate(pca_df.loc[i, '学籍番号'],\n",
    "                xy=(pca_df.loc[i, '第1主成分'], pca_df.loc[i, '第2主成分']),\n",
    "                xytext=(5, 5), textcoords='offset points', fontsize=9)\n",
    "\n",
    "plt.xlabel(f'第1主成分（総合学力）- 寄与率: {explained_variance_ratio[0]:.1%}')\n",
    "plt.ylabel(f'第2主成分（文系 or 理系）- 寄与率: {explained_variance_ratio[1]:.1%}')\n",
    "plt.title('主成分分析の結果（2次元プロット）')\n",
    "plt.axhline(0, color='gray', linestyle='--', linewidth=0.8)\n",
    "plt.axvline(0, color='gray', linestyle='--', linewidth=0.8)\n",
    "plt.grid(True, alpha=0.3)\n",
    "\n",
    "# 4象限の説明を追加\n",
    "plt.text\n",
    "plt.text(2, 1.5, '総合力が高い文系寄り', fontsize=10, color='red', alpha=0.7,ha='center')\n",
    "plt.text(2, -1.5, '総合力が高い理系寄り', fontsize=10, color='red', alpha=0.7,ha='center')\n",
    "plt.text(-2, 1.5, '総合力が低い文系寄り', fontsize=10, color='red', alpha=0.7,ha='center')\n",
    "plt.text(-2, -1.5, '総合力が低い理系寄り', fontsize=10, color='red', alpha=0.7,ha='center')\n",
    "\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "C6oJVyq2Qseb"
   },
   "source": [
    "### 6.2 3次元プロット（第1〜第3主成分）\n",
    "\n",
    "Plotlyを使って、インタラクティブな3次元プロットを作成します。マウスで回転させて、様々な角度から確認できます。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "6UpcWkTOQseb",
    "collapsed": true,
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 879
    },
    "executionInfo": {
     "status": "ok",
     "timestamp": 1768442567774,
     "user_tz": -540,
     "elapsed": 2823,
     "user": {
      "displayName": "dataviz-p5-py",
      "userId": "03582549047009910850"
     }
    },
    "outputId": "668595f3-4111-44b2-9d01-a04980799ce2"
   },
   "outputs": [
    {
     "output_type": "display_data",
     "data": {
      "text/html": [
       "<html>\n",
       "<head><meta charset=\"utf-8\" /></head>\n",
       "<body>\n",
       "    <div>            <script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_SVG\"></script><script type=\"text/javascript\">if (window.MathJax && window.MathJax.Hub && window.MathJax.Hub.Config) {window.MathJax.Hub.Config({SVG: {font: \"STIX-Web\"}});}</script>                <script type=\"text/javascript\">window.PlotlyConfig = {MathJaxConfig: 'local'};</script>\n",
       "        <script charset=\"utf-8\" src=\"https://cdn.plot.ly/plotly-2.35.2.min.js\"></script>                <div id=\"d3eb03b6-ad00-4bb1-b4b6-6f9c6d65a7ce\" class=\"plotly-graph-div\" style=\"height:750px; width:900px;\"></div>            <script type=\"text/javascript\">                                    window.PLOTLYENV=window.PLOTLYENV || {};                                    if (document.getElementById(\"d3eb03b6-ad00-4bb1-b4b6-6f9c6d65a7ce\")) {                    Plotly.newPlot(                        \"d3eb03b6-ad00-4bb1-b4b6-6f9c6d65a7ce\",                        [{\"customdata\":[[75,68,72,65,78],[82,88,85,90,70],[65,72,68,75,63],[90,65,88,62,92],[58,45,52,48,60],[72,78,75,80,68],[88,92,70,95,65],[45,38,62,40,68],[78,55,72,52,80],[92,95,94,98,90],[68,75,70,78,66],[55,48,72,45,78],[85,70,82,68,88],[62,58,65,60,64],[95,92,76,94,73],[48,52,70,55,66],[80,85,62,88,58],[70,65,68,63,72],[52,60,75,62,70],[88,72,85,70,90],[75,70,52,68,77],[42,35,58,32,65],[85,90,68,92,63],[68,62,85,60,90],[78,82,60,85,56],[90,68,92,66,91],[55,62,78,65,73],[82,58,80,55,84],[65,58,82,55,88],[92,88,70,85,74],[72,68,90,65,94],[48,55,52,58,46],[88,65,86,62,90],[62,68,45,70,40],[95,98,96,99,73],[58,52,75,50,80],[80,55,78,52,82],[70,78,52,80,48],[52,48,70,45,74],[85,88,66,90,63],[75,52,74,50,77],[45,40,62,38,67],[90,65,88,63,92],[68,72,50,75,46],[78,55,76,53,80],[92,70,94,68,93],[55,58,76,60,73],[82,85,64,88,60],[65,62,84,60,87],[88,92,70,94,66]],\"hovertemplate\":\"\\u003cb\\u003e%{text}\\u003c\\u002fb\\u003e\\u003cbr\\u003ePC1: %{x:.2f}\\u003cbr\\u003ePC2: %{y:.2f}\\u003cbr\\u003ePC3: %{z:.2f}\\u003cbr\\u003e\\u003cbr\\u003e国語: %{customdata[0]}\\u003cbr\\u003e数学: %{customdata[1]}\\u003cbr\\u003e英語: %{customdata[2]}\\u003cbr\\u003e理科: %{customdata[3]}\\u003cbr\\u003e社会: %{customdata[4]}\\u003cbr\\u003e\\u003cextra\\u003e\\u003c\\u002fextra\\u003e\",\"marker\":{\"size\":3},\"mode\":\"markers\",\"text\":[\"S001\",\"S002\",\"S003\",\"S004\",\"S005\",\"S006\",\"S007\",\"S008\",\"S009\",\"S010\",\"S011\",\"S012\",\"S013\",\"S014\",\"S015\",\"S016\",\"S017\",\"S018\",\"S019\",\"S020\",\"S021\",\"S022\",\"S023\",\"S024\",\"S025\",\"S026\",\"S027\",\"S028\",\"S029\",\"S030\",\"S031\",\"S032\",\"S033\",\"S034\",\"S035\",\"S036\",\"S037\",\"S038\",\"S039\",\"S040\",\"S041\",\"S042\",\"S043\",\"S044\",\"S045\",\"S046\",\"S047\",\"S048\",\"S049\",\"S050\"],\"x\":[0.08363432093044762,2.027554782115917,-0.15087303925413553,1.0540681264755303,-2.625227321779108,0.7186748910050501,2.0722689316022747,-3.2141767884121366,-0.6225436286049739,3.3884356505376876,0.24761826888022512,-1.9491466285923473,1.0117581619137668,-1.2659847856282769,2.566459911497118,-1.9798020895832968,1.0171940812497249,-0.4515942910674044,-1.1573646968372238,1.3584295552708103,-0.3007569213937075,-3.8175463828436076,1.7217929534739302,-0.025553364449561605,0.6689528954712801,1.3717750726422573,-0.7668470747859175,-0.0144976017370377,-0.5323397146013343,1.8990724933995908,0.6671244223360269,-2.532894026975914,0.9004663496378126,-1.4719831457251575,3.4563986998031937,-1.4423602784405747,-0.36273878751548266,-0.2353287746348058,-2.1664894056459993,1.538931815387559,-0.8844765216533165,-3.2193294636486494,1.0844234773097752,-0.747854018519733,-0.48598521351895585,1.65513645544046,-1.1098231696670182,1.1707958580874431,-0.20285449758025192,2.0554044586280487],\"y\":[0.2713550237895317,-0.42445416552103626,-1.006034263861206,1.8999296990088852,-0.8272617324852326,-0.6230064934361723,-1.516797892553959,0.27828832554248034,0.9122762857217468,0.7401971511786416,-0.8704982278787589,0.9883569343306433,1.1773824570820188,-0.5183586859385392,-0.7847196268627203,-0.032149584576937416,-1.9895688950382155,-0.1377370426858197,0.11438656905406287,1.3482993480295138,-0.7929879808808582,0.1579598133954544,-1.6208662754189165,1.6608121493682597,-2.069861628732683,1.8889721259688872,0.31467586975342815,1.3765142096298304,1.5920651574041658,-0.7531741423895353,1.888246124839733,-1.9867618121465846,1.6982902325537075,-3.049844099408255,-0.09461239644902152,1.0571039262947373,1.2962214759353625,-2.6933517737295194,0.6808296786926881,-1.6311213154576623,0.9377738963548096,0.2318343253789212,1.878657621865957,-2.6735698518062057,1.0733099323372568,2.0097137705835912,0.4065907286980835,-1.7879294285830378,1.4495058115647121,-1.4448813285162325],\"z\":[0.23572949052622091,-0.7487534921104467,-0.46101883086061124,0.5172204873247521,0.6759410028272197,-0.5315523337442569,0.013395385553324165,-0.10256446982420152,0.8017477827788901,-0.6850530730978625,-0.46114469369161626,-0.15624837442797662,0.3178791838595869,-0.02698201205275892,0.19673627152453924,-0.7614390075879468,0.10733991001784905,0.17634843013894522,-0.9664098925361175,0.29604989150965977,1.0102420032171753,0.07439450550773098,0.010190713390581778,-0.4015398103040948,0.16674718654964382,0.22573318182366187,-0.9972271600440042,0.6020436750221527,-0.30047883865717206,0.5270283304864322,-0.545388327880354,-0.2589703181087327,0.48494421279868,0.3113595974317757,-0.8313870474211849,-0.25730934607489925,0.6614509515539475,0.17799613511426152,-0.2569273994219632,0.15759963363800053,0.6111912279337962,-0.10037092626290087,0.4991111753996681,0.3109776507788395,0.6110653651027913,0.19688708897782292,-0.7705865604995902,0.13961618454392133,-0.5362407749687107,0.0406260342455325],\"type\":\"scatter3d\"}],                        {\"template\":{\"data\":{\"histogram2dcontour\":[{\"type\":\"histogram2dcontour\",\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"},\"colorscale\":[[0.0,\"#0d0887\"],[0.1111111111111111,\"#46039f\"],[0.2222222222222222,\"#7201a8\"],[0.3333333333333333,\"#9c179e\"],[0.4444444444444444,\"#bd3786\"],[0.5555555555555556,\"#d8576b\"],[0.6666666666666666,\"#ed7953\"],[0.7777777777777778,\"#fb9f3a\"],[0.8888888888888888,\"#fdca26\"],[1.0,\"#f0f921\"]]}],\"choropleth\":[{\"type\":\"choropleth\",\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"}}],\"histogram2d\":[{\"type\":\"histogram2d\",\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"},\"colorscale\":[[0.0,\"#0d0887\"],[0.1111111111111111,\"#46039f\"],[0.2222222222222222,\"#7201a8\"],[0.3333333333333333,\"#9c179e\"],[0.4444444444444444,\"#bd3786\"],[0.5555555555555556,\"#d8576b\"],[0.6666666666666666,\"#ed7953\"],[0.7777777777777778,\"#fb9f3a\"],[0.8888888888888888,\"#fdca26\"],[1.0,\"#f0f921\"]]}],\"heatmap\":[{\"type\":\"heatmap\",\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"},\"colorscale\":[[0.0,\"#0d0887\"],[0.1111111111111111,\"#46039f\"],[0.2222222222222222,\"#7201a8\"],[0.3333333333333333,\"#9c179e\"],[0.4444444444444444,\"#bd3786\"],[0.5555555555555556,\"#d8576b\"],[0.6666666666666666,\"#ed7953\"],[0.7777777777777778,\"#fb9f3a\"],[0.8888888888888888,\"#fdca26\"],[1.0,\"#f0f921\"]]}],\"heatmapgl\":[{\"type\":\"heatmapgl\",\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"},\"colorscale\":[[0.0,\"#0d0887\"],[0.1111111111111111,\"#46039f\"],[0.2222222222222222,\"#7201a8\"],[0.3333333333333333,\"#9c179e\"],[0.4444444444444444,\"#bd3786\"],[0.5555555555555556,\"#d8576b\"],[0.6666666666666666,\"#ed7953\"],[0.7777777777777778,\"#fb9f3a\"],[0.8888888888888888,\"#fdca26\"],[1.0,\"#f0f921\"]]}],\"contourcarpet\":[{\"type\":\"contourcarpet\",\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"}}],\"contour\":[{\"type\":\"contour\",\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"},\"colorscale\":[[0.0,\"#0d0887\"],[0.1111111111111111,\"#46039f\"],[0.2222222222222222,\"#7201a8\"],[0.3333333333333333,\"#9c179e\"],[0.4444444444444444,\"#bd3786\"],[0.5555555555555556,\"#d8576b\"],[0.6666666666666666,\"#ed7953\"],[0.7777777777777778,\"#fb9f3a\"],[0.8888888888888888,\"#fdca26\"],[1.0,\"#f0f921\"]]}],\"surface\":[{\"type\":\"surface\",\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"},\"colorscale\":[[0.0,\"#0d0887\"],[0.1111111111111111,\"#46039f\"],[0.2222222222222222,\"#7201a8\"],[0.3333333333333333,\"#9c179e\"],[0.4444444444444444,\"#bd3786\"],[0.5555555555555556,\"#d8576b\"],[0.6666666666666666,\"#ed7953\"],[0.7777777777777778,\"#fb9f3a\"],[0.8888888888888888,\"#fdca26\"],[1.0,\"#f0f921\"]]}],\"mesh3d\":[{\"type\":\"mesh3d\",\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"}}],\"scatter\":[{\"fillpattern\":{\"fillmode\":\"overlay\",\"size\":10,\"solidity\":0.2},\"type\":\"scatter\"}],\"parcoords\":[{\"type\":\"parcoords\",\"line\":{\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"}}}],\"scatterpolargl\":[{\"type\":\"scatterpolargl\",\"marker\":{\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"}}}],\"bar\":[{\"error_x\":{\"color\":\"#2a3f5f\"},\"error_y\":{\"color\":\"#2a3f5f\"},\"marker\":{\"line\":{\"color\":\"#E5ECF6\",\"width\":0.5},\"pattern\":{\"fillmode\":\"overlay\",\"size\":10,\"solidity\":0.2}},\"type\":\"bar\"}],\"scattergeo\":[{\"type\":\"scattergeo\",\"marker\":{\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"}}}],\"scatterpolar\":[{\"type\":\"scatterpolar\",\"marker\":{\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"}}}],\"histogram\":[{\"marker\":{\"pattern\":{\"fillmode\":\"overlay\",\"size\":10,\"solidity\":0.2}},\"type\":\"histogram\"}],\"scattergl\":[{\"type\":\"scattergl\",\"marker\":{\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"}}}],\"scatter3d\":[{\"type\":\"scatter3d\",\"line\":{\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"}},\"marker\":{\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"}}}],\"scattermapbox\":[{\"type\":\"scattermapbox\",\"marker\":{\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"}}}],\"scatterternary\":[{\"type\":\"scatterternary\",\"marker\":{\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"}}}],\"scattercarpet\":[{\"type\":\"scattercarpet\",\"marker\":{\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"}}}],\"carpet\":[{\"aaxis\":{\"endlinecolor\":\"#2a3f5f\",\"gridcolor\":\"white\",\"linecolor\":\"white\",\"minorgridcolor\":\"white\",\"startlinecolor\":\"#2a3f5f\"},\"baxis\":{\"endlinecolor\":\"#2a3f5f\",\"gridcolor\":\"white\",\"linecolor\":\"white\",\"minorgridcolor\":\"white\",\"startlinecolor\":\"#2a3f5f\"},\"type\":\"carpet\"}],\"table\":[{\"cells\":{\"fill\":{\"color\":\"#EBF0F8\"},\"line\":{\"color\":\"white\"}},\"header\":{\"fill\":{\"color\":\"#C8D4E3\"},\"line\":{\"color\":\"white\"}},\"type\":\"table\"}],\"barpolar\":[{\"marker\":{\"line\":{\"color\":\"#E5ECF6\",\"width\":0.5},\"pattern\":{\"fillmode\":\"overlay\",\"size\":10,\"solidity\":0.2}},\"type\":\"barpolar\"}],\"pie\":[{\"automargin\":true,\"type\":\"pie\"}]},\"layout\":{\"autotypenumbers\":\"strict\",\"colorway\":[\"#636efa\",\"#EF553B\",\"#00cc96\",\"#ab63fa\",\"#FFA15A\",\"#19d3f3\",\"#FF6692\",\"#B6E880\",\"#FF97FF\",\"#FECB52\"],\"font\":{\"color\":\"#2a3f5f\"},\"hovermode\":\"closest\",\"hoverlabel\":{\"align\":\"left\"},\"paper_bgcolor\":\"white\",\"plot_bgcolor\":\"#E5ECF6\",\"polar\":{\"bgcolor\":\"#E5ECF6\",\"angularaxis\":{\"gridcolor\":\"white\",\"linecolor\":\"white\",\"ticks\":\"\"},\"radialaxis\":{\"gridcolor\":\"white\",\"linecolor\":\"white\",\"ticks\":\"\"}},\"ternary\":{\"bgcolor\":\"#E5ECF6\",\"aaxis\":{\"gridcolor\":\"white\",\"linecolor\":\"white\",\"ticks\":\"\"},\"baxis\":{\"gridcolor\":\"white\",\"linecolor\":\"white\",\"ticks\":\"\"},\"caxis\":{\"gridcolor\":\"white\",\"linecolor\":\"white\",\"ticks\":\"\"}},\"coloraxis\":{\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"}},\"colorscale\":{\"sequential\":[[0.0,\"#0d0887\"],[0.1111111111111111,\"#46039f\"],[0.2222222222222222,\"#7201a8\"],[0.3333333333333333,\"#9c179e\"],[0.4444444444444444,\"#bd3786\"],[0.5555555555555556,\"#d8576b\"],[0.6666666666666666,\"#ed7953\"],[0.7777777777777778,\"#fb9f3a\"],[0.8888888888888888,\"#fdca26\"],[1.0,\"#f0f921\"]],\"sequentialminus\":[[0.0,\"#0d0887\"],[0.1111111111111111,\"#46039f\"],[0.2222222222222222,\"#7201a8\"],[0.3333333333333333,\"#9c179e\"],[0.4444444444444444,\"#bd3786\"],[0.5555555555555556,\"#d8576b\"],[0.6666666666666666,\"#ed7953\"],[0.7777777777777778,\"#fb9f3a\"],[0.8888888888888888,\"#fdca26\"],[1.0,\"#f0f921\"]],\"diverging\":[[0,\"#8e0152\"],[0.1,\"#c51b7d\"],[0.2,\"#de77ae\"],[0.3,\"#f1b6da\"],[0.4,\"#fde0ef\"],[0.5,\"#f7f7f7\"],[0.6,\"#e6f5d0\"],[0.7,\"#b8e186\"],[0.8,\"#7fbc41\"],[0.9,\"#4d9221\"],[1,\"#276419\"]]},\"xaxis\":{\"gridcolor\":\"white\",\"linecolor\":\"white\",\"ticks\":\"\",\"title\":{\"standoff\":15},\"zerolinecolor\":\"white\",\"automargin\":true,\"zerolinewidth\":2},\"yaxis\":{\"gridcolor\":\"white\",\"linecolor\":\"white\",\"ticks\":\"\",\"title\":{\"standoff\":15},\"zerolinecolor\":\"white\",\"automargin\":true,\"zerolinewidth\":2},\"scene\":{\"xaxis\":{\"backgroundcolor\":\"#E5ECF6\",\"gridcolor\":\"white\",\"linecolor\":\"white\",\"showbackground\":true,\"ticks\":\"\",\"zerolinecolor\":\"white\",\"gridwidth\":2},\"yaxis\":{\"backgroundcolor\":\"#E5ECF6\",\"gridcolor\":\"white\",\"linecolor\":\"white\",\"showbackground\":true,\"ticks\":\"\",\"zerolinecolor\":\"white\",\"gridwidth\":2},\"zaxis\":{\"backgroundcolor\":\"#E5ECF6\",\"gridcolor\":\"white\",\"linecolor\":\"white\",\"showbackground\":true,\"ticks\":\"\",\"zerolinecolor\":\"white\",\"gridwidth\":2}},\"shapedefaults\":{\"line\":{\"color\":\"#2a3f5f\"}},\"annotationdefaults\":{\"arrowcolor\":\"#2a3f5f\",\"arrowhead\":0,\"arrowwidth\":1},\"geo\":{\"bgcolor\":\"white\",\"landcolor\":\"#E5ECF6\",\"subunitcolor\":\"white\",\"showland\":true,\"showlakes\":true,\"lakecolor\":\"white\"},\"title\":{\"x\":0.05},\"mapbox\":{\"style\":\"light\"}}},\"title\":{\"text\":\"PCA Results (3D Plot)\"},\"scene\":{\"xaxis\":{\"title\":{\"text\":\"PC1 (55.5%)\"}},\"yaxis\":{\"title\":{\"text\":\"PC2 (38.3%)\"}},\"zaxis\":{\"title\":{\"text\":\"PC3 (4.8%)\"}}},\"width\":900,\"height\":750},                        {\"responsive\": true}                    ).then(function(){\n",
       "                            \n",
       "var gd = document.getElementById('d3eb03b6-ad00-4bb1-b4b6-6f9c6d65a7ce');\n",
       "var x = new MutationObserver(function (mutations, observer) {{\n",
       "        var display = window.getComputedStyle(gd).display;\n",
       "        if (!display || display === 'none') {{\n",
       "            console.log([gd, 'removed!']);\n",
       "            Plotly.purge(gd);\n",
       "            observer.disconnect();\n",
       "        }}\n",
       "}});\n",
       "\n",
       "// Listen for the removal of the full notebook cells\n",
       "var notebookContainer = gd.closest('#notebook-container');\n",
       "if (notebookContainer) {{\n",
       "    x.observe(notebookContainer, {childList: true});\n",
       "}}\n",
       "\n",
       "// Listen for the clearing of the current output cell\n",
       "var outputEl = gd.closest('.output');\n",
       "if (outputEl) {{\n",
       "    x.observe(outputEl, {childList: true});\n",
       "}}\n",
       "\n",
       "                        })                };                            </script>        </div>\n",
       "</body>\n",
       "</html>"
      ]
     },
     "metadata": {}
    },
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "\n",
      "【軸の意味】\n",
      "PC1（第1主成分）: 総合学力\n",
      "PC2（第2主成分）: 文系/理系傾向（正=文系、負=理系）\n",
      "PC3（第3主成分）: 国語得意/英語得意（正=国語得意、負=英語得意）\n"
     ]
    }
   ],
   "source": [
    "# 元のデータと主成分データを結合\n",
    "pca_with_scores = pd.concat([pca_df, df[['国語', '数学', '英語', '理科', '社会']]], axis=1)\n",
    "\n",
    "# Plotlyで3次元プロットを作成\n",
    "fig = go.Figure(data=[go.Scatter3d(\n",
    "    x=pca_with_scores['第1主成分'],\n",
    "    y=pca_with_scores['第2主成分'],\n",
    "    z=pca_with_scores['第3主成分'],\n",
    "    mode='markers',\n",
    "    marker=dict(\n",
    "        size=3\n",
    "    ),\n",
    "    text=pca_with_scores['学籍番号'],\n",
    "    customdata=pca_with_scores[['国語', '数学', '英語', '理科', '社会']],\n",
    "    hovertemplate='<b>%{text}</b><br>' +\n",
    "                  'PC1: %{x:.2f}<br>' +\n",
    "                  'PC2: %{y:.2f}<br>' +\n",
    "                  'PC3: %{z:.2f}<br>' +\n",
    "                  '<br>' +\n",
    "                  '国語: %{customdata[0]}<br>' +\n",
    "                  '数学: %{customdata[1]}<br>' +\n",
    "                  '英語: %{customdata[2]}<br>' +\n",
    "                  '理科: %{customdata[3]}<br>' +\n",
    "                  '社会: %{customdata[4]}<br>' +\n",
    "                  '<extra></extra>'\n",
    ")])\n",
    "\n",
    "# 軸タイトルは英語でシンプルに（日本語の説明はマークダウンセルに記載）\n",
    "fig.update_layout(\n",
    "    title='PCA Results (3D Plot)',\n",
    "    scene=dict(\n",
    "        xaxis_title=f'PC1 ({explained_variance_ratio[0]:.1%})',\n",
    "        yaxis_title=f'PC2 ({explained_variance_ratio[1]:.1%})',\n",
    "        zaxis_title=f'PC3 ({explained_variance_ratio[2]:.1%})'\n",
    "    ),\n",
    "    width=900,\n",
    "    height=750\n",
    ")\n",
    "\n",
    "fig.show()\n",
    "\n",
    "print(\"\\n【軸の意味】\")\n",
    "print(\"PC1（第1主成分）: 総合学力\")\n",
    "print(\"PC2（第2主成分）: 文系/理系傾向（正=文系、負=理系）\")\n",
    "print(\"PC3（第3主成分）: 国語得意/英語得意（正=国語得意、負=英語得意）\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "aT166F2tQsec"
   },
   "source": [
    "## 7. 結果をエクスポート\n",
    "\n",
    "第1、第2、第3主成分付きのCSVをマイドライブの「pca_test_scores」に「pca_results.csv」に保存します。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "G2VXL7C-Qsec",
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 299
    },
    "executionInfo": {
     "status": "ok",
     "timestamp": 1768442621847,
     "user_tz": -540,
     "elapsed": 64,
     "user": {
      "displayName": "dataviz-p5-py",
      "userId": "03582549047009910850"
     }
    },
    "outputId": "308831fe-b1e0-488d-81e3-b8171a47c254"
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "分析結果を 'pca_results.csv' として保存しました。\n",
      "\n",
      "保存されたデータの最初の5行：\n"
     ]
    },
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "   学籍番号  国語  数学  英語  理科  社会     第1主成分     第2主成分     第3主成分\n",
       "0  S001  75  68  72  65  78  0.083634  0.271355  0.235729\n",
       "1  S002  82  88  85  90  70  2.027555 -0.424454 -0.748753\n",
       "2  S003  65  72  68  75  63 -0.150873 -1.006034 -0.461019\n",
       "3  S004  90  65  88  62  92  1.054068  1.899930  0.517220\n",
       "4  S005  58  45  52  48  60 -2.625227 -0.827262  0.675941"
      ],
      "text/html": [
       "\n",
       "  <div id=\"df-b6559d10-4deb-49ea-a214-8a5255eedfdd\" class=\"colab-df-container\">\n",
       "    <div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>学籍番号</th>\n",
       "      <th>国語</th>\n",
       "      <th>数学</th>\n",
       "      <th>英語</th>\n",
       "      <th>理科</th>\n",
       "      <th>社会</th>\n",
       "      <th>第1主成分</th>\n",
       "      <th>第2主成分</th>\n",
       "      <th>第3主成分</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>S001</td>\n",
       "      <td>75</td>\n",
       "      <td>68</td>\n",
       "      <td>72</td>\n",
       "      <td>65</td>\n",
       "      <td>78</td>\n",
       "      <td>0.083634</td>\n",
       "      <td>0.271355</td>\n",
       "      <td>0.235729</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>S002</td>\n",
       "      <td>82</td>\n",
       "      <td>88</td>\n",
       "      <td>85</td>\n",
       "      <td>90</td>\n",
       "      <td>70</td>\n",
       "      <td>2.027555</td>\n",
       "      <td>-0.424454</td>\n",
       "      <td>-0.748753</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>S003</td>\n",
       "      <td>65</td>\n",
       "      <td>72</td>\n",
       "      <td>68</td>\n",
       "      <td>75</td>\n",
       "      <td>63</td>\n",
       "      <td>-0.150873</td>\n",
       "      <td>-1.006034</td>\n",
       "      <td>-0.461019</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>S004</td>\n",
       "      <td>90</td>\n",
       "      <td>65</td>\n",
       "      <td>88</td>\n",
       "      <td>62</td>\n",
       "      <td>92</td>\n",
       "      <td>1.054068</td>\n",
       "      <td>1.899930</td>\n",
       "      <td>0.517220</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>S005</td>\n",
       "      <td>58</td>\n",
       "      <td>45</td>\n",
       "      <td>52</td>\n",
       "      <td>48</td>\n",
       "      <td>60</td>\n",
       "      <td>-2.625227</td>\n",
       "      <td>-0.827262</td>\n",
       "      <td>0.675941</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>\n",
       "    <div class=\"colab-df-buttons\">\n",
       "\n",
       "  <div class=\"colab-df-container\">\n",
       "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-b6559d10-4deb-49ea-a214-8a5255eedfdd')\"\n",
       "            title=\"Convert this dataframe to an interactive table.\"\n",
       "            style=\"display:none;\">\n",
       "\n",
       "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
       "    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
       "  </svg>\n",
       "    </button>\n",
       "\n",
       "  <style>\n",
       "    .colab-df-container {\n",
       "      display:flex;\n",
       "      gap: 12px;\n",
       "    }\n",
       "\n",
       "    .colab-df-convert {\n",
       "      background-color: #E8F0FE;\n",
       "      border: none;\n",
       "      border-radius: 50%;\n",
       "      cursor: pointer;\n",
       "      display: none;\n",
       "      fill: #1967D2;\n",
       "      height: 32px;\n",
       "      padding: 0 0 0 0;\n",
       "      width: 32px;\n",
       "    }\n",
       "\n",
       "    .colab-df-convert:hover {\n",
       "      background-color: #E2EBFA;\n",
       "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
       "      fill: #174EA6;\n",
       "    }\n",
       "\n",
       "    .colab-df-buttons div {\n",
       "      margin-bottom: 4px;\n",
       "    }\n",
       "\n",
       "    [theme=dark] .colab-df-convert {\n",
       "      background-color: #3B4455;\n",
       "      fill: #D2E3FC;\n",
       "    }\n",
       "\n",
       "    [theme=dark] .colab-df-convert:hover {\n",
       "      background-color: #434B5C;\n",
       "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
       "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
       "      fill: #FFFFFF;\n",
       "    }\n",
       "  </style>\n",
       "\n",
       "    <script>\n",
       "      const buttonEl =\n",
       "        document.querySelector('#df-b6559d10-4deb-49ea-a214-8a5255eedfdd button.colab-df-convert');\n",
       "      buttonEl.style.display =\n",
       "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
       "\n",
       "      async function convertToInteractive(key) {\n",
       "        const element = document.querySelector('#df-b6559d10-4deb-49ea-a214-8a5255eedfdd');\n",
       "        const dataTable =\n",
       "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
       "                                                    [key], {});\n",
       "        if (!dataTable) return;\n",
       "\n",
       "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
       "          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
       "          + ' to learn more about interactive tables.';\n",
       "        element.innerHTML = '';\n",
       "        dataTable['output_type'] = 'display_data';\n",
       "        await google.colab.output.renderOutput(dataTable, element);\n",
       "        const docLink = document.createElement('div');\n",
       "        docLink.innerHTML = docLinkHtml;\n",
       "        element.appendChild(docLink);\n",
       "      }\n",
       "    </script>\n",
       "  </div>\n",
       "\n",
       "\n",
       "    </div>\n",
       "  </div>\n"
      ],
      "application/vnd.google.colaboratory.intrinsic+json": {
       "type": "dataframe",
       "variable_name": "output_df",
       "summary": "{\n  \"name\": \"output_df\",\n  \"rows\": 50,\n  \"fields\": [\n    {\n      \"column\": \"\\u5b66\\u7c4d\\u756a\\u53f7\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 50,\n        \"samples\": [\n          \"S014\",\n          \"S040\",\n          \"S031\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"\\u56fd\\u8a9e\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 15,\n        \"min\": 42,\n        \"max\": 95,\n        \"num_unique_values\": 20,\n        \"samples\": [\n          75,\n          70,\n          48\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"\\u6570\\u5b66\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 15,\n        \"min\": 35,\n        \"max\": 98,\n        \"num_unique_values\": 23,\n        \"samples\": [\n          85,\n          95,\n          68\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"\\u82f1\\u8a9e\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 12,\n        \"min\": 45,\n        \"max\": 96,\n        \"num_unique_values\": 26,\n        \"samples\": [\n          94,\n          80,\n          72\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"\\u7406\\u79d1\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 17,\n        \"min\": 32,\n        \"max\": 99,\n        \"num_unique_values\": 28,\n        \"samples\": [\n          98,\n          50,\n          52\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"\\u793e\\u4f1a\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 13,\n        \"min\": 40,\n        \"max\": 94,\n        \"num_unique_values\": 28,\n        \"samples\": [\n          66,\n          67,\n          90\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"\\u7b2c1\\u4e3b\\u6210\\u5206\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 1.6833372631680186,\n        \"min\": -3.8175463828436076,\n        \"max\": 3.4563986998031937,\n        \"num_unique_values\": 50,\n        \"samples\": [\n          -1.2659847856282769,\n          1.538931815387559,\n          0.6671244223360269\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"\\u7b2c2\\u4e3b\\u6210\\u5206\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 1.3978420634672377,\n        \"min\": -3.049844099408255,\n        \"max\": 2.0097137705835912,\n        \"num_unique_values\": 50,\n        \"samples\": [\n          -0.5183586859385392,\n          -1.6311213154576623,\n          1.888246124839733\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"\\u7b2c3\\u4e3b\\u6210\\u5206\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.4954783392149579,\n        \"min\": -0.9972271600440042,\n        \"max\": 1.0102420032171753,\n        \"num_unique_values\": 50,\n        \"samples\": [\n          -0.02698201205275892,\n          0.15759963363800053,\n          -0.545388327880354\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"
      }
     },
     "metadata": {},
     "execution_count": 13
    }
   ],
   "source": [
    "# 元のデータと主成分スコアを結合して保存\n",
    "output_df = pd.concat([df, pca_df[['第1主成分', '第2主成分', '第3主成分']]], axis=1)\n",
    "output_df.to_csv('/content/drive/MyDrive/pca_test_scores/pca_results.csv', index=False, encoding='utf-8-sig')\n",
    "\n",
    "print(\"分析結果を 'pca_results.csv' として保存しました。\")\n",
    "print(\"\\n保存されたデータの最初の5行：\")\n",
    "output_df.head()"
   ]
  },
  {
   "cell_type": "code",
   "source": [],
   "metadata": {
    "id": "IPaHMeTnmtNb"
   },
   "execution_count": null,
   "outputs": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "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.8.0"
  },
  "colab": {
   "provenance": []
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
