1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Pythonを書かずにデータ分析:GitHub Copilot + Jupyter MCPで始める自然言語データサイエンス

1
Last updated at Posted at 2026-06-01

はじめに

「AI for Science に取り組みたい。でも、プログラムが書けない。」

大学で研究をしていると、データ分析の必要性に迫られる場面は数多くあります。実験データの可視化、統計解析、機械学習モデルの構築——これらはすべて、現代の研究において不可欠なスキルです。しかし、研究の本質は仮説を立て、検証し、新しい知見を生み出すことであり、Pythonのコードを書くことではありません。

筆者自身、GitHub Copilot と Jupyter MCP を組み合わせた自然言語によるデータ分析環境を導入してから、研究の生産性が劇的に向上しました。「このデータの欠損値を確認して」「目的変数との相関を可視化して」——日本語で指示するだけで、AIがPythonコードを生成・実行し、結果をリアルタイムで返してくれます。

プログラムを書くところはAIに任せ、研究の本質を人間がやっていく。

これが、この記事で提案する新しい研究スタイルです。

この記事で分かること

  • GitHub Copilot + Jupyter MCP の環境構築手順(Ubuntu)
  • VS Code Agent ModeCopilot CLI の2つの使い方
  • 自然言語だけでデータの読み込み・可視化・統計分析を行う方法
  • 機械学習モデルの構築と評価を自然言語で行う方法
  • 査読論文に使えるクオリティのグラフを生成する方法

想定読者:大学の研究者・大学院生で、データサイエンスの基礎知識はあるがPythonは書けない方

🎯 この記事が対象とする人・しない人

本記事は、データサイエンティストを目指す方のための記事ではありません

研究の過程でデータ分析が必要になったが、Python を体系的に学ぶ時間がない——そんな研究者のための実用的な手段を紹介するものです。データサイエンスを専門にしたい方は、Python・統計学・機械学習の基礎をしっかり学ぶことを強く推奨します。

ただし、「コードを書かない」=「データサイエンスの知識が不要」ではありません。 AIはコードを生成してくれますが、「どの分析手法が適切か」「結果が統計的に妥当か」「この可視化は何を意味するか」を判断するのは研究者自身です。本記事のアプローチはプログラミングの壁を取り除くものであり、分析手法の理解や統計リテラシーの重要性は変わりません。

📖 所要時間:環境構築 約30分 + 分析実践 約60分
🎯 難易度:初級(プログラミング経験不要)
💻 環境:Ubuntu 26.04 LTS

⚠️ 重要:AIは分析の補助者であり、判断者ではありません
Copilot が生成したコードや分析結果は、そのまま論文やレポートに使わず、前提条件・データの意味・統計的妥当性を必ず研究者自身が確認してください。AIは道具であり、研究の責任は常にあなたにあります。

検証環境

本記事の手順は、以下の環境で動作確認済みです。

ソフトウェア バージョン
Ubuntu 26.04 LTS
Python 3.14.4
VS Code 最新版
GitHub Copilot Chat 拡張機能 最新版
GitHub Copilot CLI 最新版
JupyterLab 4.5.7
jupyter-collaboration 4.4.0
jupyter-mcp-tools 0.1.6
jupyter-mcp-server 1.27.2
uv 0.11.17

1. 全体像:何が起きるのか

まず、この仕組みの全体像を理解しましょう。

GitHub Copilot と Jupyter MCP の接続方法は2つあります。

方法 特徴 おすすめの人
VS Code Agent Mode GUI で操作、グラフをその場で確認可能 GUIが好みの方、初心者
Copilot CLI ターミナルで完結、SSH先でも使える CUI好み、リモートサーバーで作業する方

どちらの方法でも、以下の流れは同じです。

  1. あなたが日本語で指示を出す
  2. GitHub Copilot が指示を理解し、Pythonコードを自動生成
  3. Jupyter MCP Server 経由で JupyterLab にコードを送信・実行
  4. 実行結果(表、グラフ、統計値)がリアルタイムで返ってくる
  5. 結果を見て、次の指示を出す——この繰り返し

あなたがやること:日本語で「何をしたいか」を伝えるだけ。
AIがやること:Pythonコードの生成・実行・結果の返却。


2. 環境構築

2.1 VS Code のインストール

💡 すでに VS Code をインストール済みの方は、このセクションをスキップしてください。

ターミナルを開き、以下のコマンドを順番に実行します。

# 必要なパッケージのインストール
sudo apt update
sudo apt install -y wget gpg apt-transport-https

# Microsoft GPG キーの追加
wget -qO- https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor | sudo tee /usr/share/keyrings/packages.microsoft.gpg > /dev/null

# VS Code リポジトリの追加
echo "deb [arch=amd64,arm64,armhf signed-by=/usr/share/keyrings/packages.microsoft.gpg] https://packages.microsoft.com/repos/code stable main" | sudo tee /etc/apt/sources.list.d/vscode.list

# VS Code のインストール
sudo apt update
sudo apt install -y code

インストール完了後、code コマンドで VS Code が起動することを確認してください。

📖 参考:VS Code 公式 Linux インストールガイド

2.2 GitHub Copilot のセットアップ

GitHub Copilot は VS Code Agent ModeCopilot CLI の2通りで利用できます。どちらか一方、または両方をセットアップしてください。

💡 GitHub Copilot のプランについて

GitHub Copilot には以下のプランがあります。

プラン 料金 Agent Mode / CLI 主な対象
Copilot Free 無料 ✅(月間制限あり) 個人開発者
Copilot Pro $10/月 ✅(制限緩和) 個人開発者
Copilot Pro+ $39/月 ✅(フル機能) ヘビーユーザー
Copilot Student 無料 ✅(Pro相当) 学生・教員

大学の研究者・学生の方は、通常であれば GitHub EducationGitHub Student Developer Pack を通じて Copilot Student(Pro 相当)を無料で利用できます。Student Developer Pack には Copilot 以外にも多数の開発ツールが含まれており、研究活動に非常に有用です。

🚨 2026年5月末時点:GitHub Copilot 個人プランおよび GitHub Education の新規申し込みに制限あり

2026年4月20日より、GitHub Copilot の個人向けプラン(Pro / Pro+ / Student)の新規申し込みが一時停止されています。エージェント型AIワークフローの需要急増によるインフラ負荷増大が理由です。

また、GitHub Education(Student Developer Pack)自体の新規申請についても、公式には全面停止とは発表されていませんが、主要特典である Copilot Student の新規登録が停止中のため、実質的に Copilot 目的での新規申請は通らない状況です。コミュニティでは審査の大幅な遅延も多数報告されています。

  • 既存ユーザー(すでに認証済み)は引き続き利用可能です
  • Copilot Free プランは新規登録可能です(月間リクエスト数に制限あり)
  • 再開時期は未定です

本記事の手順は Copilot Free プランでも実行可能です。 ただし、月間のリクエスト数に制限があるため、制限に達した場合は翌月まで待つか、有料プランの再開を待つ必要があります。

📖 参考:GitHub Copilot プラン変更のお知らせ窓の杜:GitHub Copilotの新規申し込みが一時停止

方法A:VS Code Agent Mode(GUI)

💡 GitHub Copilot の利用には、GitHub アカウントと Copilot のサブスクリプション(Free プラン含む)が必要です。

  1. VS Code を起動
  2. 拡張機能パネルを開く(Ctrl+Shift+X
  3. GitHub Copilot」で検索し、インストール
  4. GitHub Copilot Chat」も同様にインストール
  5. コマンドパレット(Ctrl+Shift+P)で「GitHub: Sign in」を実行し、GitHub アカウントでサインイン

📖 参考:GitHub Copilot 公式ドキュメント

方法B:Copilot CLI(ターミナル)

ターミナルだけで完結したい場合や、SSH 経由のリモートサーバーで作業する場合は Copilot CLI が便利です。

⚠️ 「GitHub CLI の Copilot 拡張」と「GitHub Copilot CLI」は別物です

  • GitHub CLI の Copilot 拡張gh extension install github/gh-copilot):gh copilot suggest / gh copilot explain コマンドを提供する従来の拡張です。MCP サーバー接続には対応していません。
  • GitHub Copilot CLIgh copilot、対話型エージェント):MCP サーバーに接続し、本記事で紹介する自然言語データ分析が可能な対話型 CLI です。

本記事では後者の対話型 GitHub Copilot CLI を使用します。

# GitHub CLI のインストール(未インストールの場合)
sudo apt install -y gh

# GitHub にログイン
gh auth login

# Copilot CLI 拡張のインストール
gh extension install github/gh-copilot

インストール後、対話型モードで起動できることを確認します。

# 対話型 Copilot CLI を起動
gh copilot

プロンプト(> マーク)が表示されれば成功です。/help と入力するとコマンド一覧が表示されます。Ctrl+C で終了できます。

📖 参考:GitHub Copilot CLI ドキュメント

2.3 Python 環境の準備

Ubuntu には Python がプリインストールされていますが、pip と venv が必要です。

💡 Ubuntu 26.04 LTS では Python 3.14 がデフォルトです。venv パッケージ名は python3.14-venv となります。お使いの Python バージョンに合わせて読み替えてください。

# Python バージョン確認
python3 --version

# pip と venv のインストール
sudo apt install -y python3-pip python3.14-venv

# 作業用の仮想環境を作成(推奨)
mkdir -p ~/jupyter-workspace
cd ~/jupyter-workspace
python3 -m venv .venv
source .venv/bin/activate

⚠️ 仮想環境の有効化(source .venv/bin/activate)は、ターミナルを開くたびに実行する必要があります。プロンプトの先頭に (.venv) と表示されていることを確認してください。

2.4 JupyterLab のインストール

Jupyter MCP Server を使うには、JupyterLab とリアルタイムコラボレーション機能が必要です。

# 仮想環境が有効であることを確認
# (.venv) が表示されていること

pip install jupyterlab jupyter-collaboration jupyter-mcp-tools ipykernel pycrdt

データ分析に必要なライブラリもインストール

pip install pandas matplotlib seaborn scikit-learn openpyxl

💡 日本語フォントについて

matplotlib でグラフのタイトルや軸ラベルに日本語を表示するには、日本語対応フォントが必要です。Ubuntu 26.04 LTS では Noto Sans CJK JP がプリインストールされています。matplotlib で日本語を使う場合は、以下のように設定してください。

import matplotlib
matplotlib.rcParams['font.family'] = 'Noto Sans CJK JP'

デフォルトの DejaVu Sans は日本語に対応していないため、設定なしでは日本語が □□□ と表示されます。

JupyterLab の起動確認

jupyter lab --port 8888 --IdentityProvider.token MY_TOKEN

ブラウザで http://localhost:8888 にアクセスし、JupyterLab が表示されることを確認してください。ターミナルのログに以下のように表示されていれば、MCP 関連の拡張機能が正常にロードされています。

[I ServerApp] jupyter_mcp_tools | extension was successfully loaded.
[I ServerApp] jupyter_server_ydoc | extension was successfully loaded.

確認できたら Ctrl+C で一度停止します。

💡 MY_TOKEN はあなたが自由に決められるトークン文字列です。後の MCP 設定で同じ値を使います。セキュリティのため、本番環境では十分に長いランダム文字列を使用してください。

⚠️ リモートサーバーで使う場合

上記コマンドはローカルホスト(127.0.0.1)のみで待ち受けます。SSH 経由のリモートサーバーで使う場合は、--ip 0.0.0.0使わず、SSH ポートフォワーディングを推奨します。

# ローカル PC から SSH 接続する際にポートフォワーディングを設定
ssh -L 8888:127.0.0.1:8888 user@server

これにより、リモートサーバーの JupyterLab にローカルの http://localhost:8888 からアクセスできます。

2.5 Jupyter MCP Server の設定

これが最も重要なステップです。GitHub Copilot と JupyterLab を**MCP(Model Context Protocol)**で接続します。

uv のインストール

pip install uv
uv --version
# 0.6.14 以上であることを確認

方法A:VS Code Agent Mode の MCP 設定

VS Code で作業フォルダを開き、.vscode/mcp.json ファイルを作成します。

cd ~/jupyter-workspace
mkdir -p .vscode

.vscode/mcp.json に以下の内容を記述します。

jupyter-workspace/.vscode/mcp.json
{
  "servers": {
    "DatalayerJupyter": {
      "command": "uvx",
      "args": ["jupyter-mcp-server@latest"],
      "env": {
        "JUPYTER_URL": "http://localhost:8888",
        "JUPYTER_TOKEN": "MY_TOKEN",
        "ALLOW_IMG_OUTPUT": "true"
      }
    }
  }
}

⚠️ サーバー名は DatalayerJupyter にしてください。VS Code には組込みの Jupyter MCP サーバーが存在するため、名前の衝突を避ける必要があります。

方法B:Copilot CLI の MCP 設定

Copilot CLI の場合は、~/.copilot/mcp-config.json(ユーザーグローバル設定)または .copilot/mcp-config.json(プロジェクト設定)に記述します。

mkdir -p ~/.copilot
~/.copilot/mcp-config.json
{
  "mcpServers": {
    "jupyter": {
      "command": "uvx",
      "args": ["jupyter-mcp-server@latest"],
      "env": {
        "JUPYTER_URL": "http://localhost:8888",
        "JUPYTER_TOKEN": "MY_TOKEN",
        "ALLOW_IMG_OUTPUT": "true"
      }
    }
  }
}

⚠️ VS Code と Copilot CLI では設定ファイルの形式が異なります

  • VS Code:トップレベルのキーは "servers"、ファイルは .vscode/mcp.json
  • Copilot CLI:トップレベルのキーは "mcpServers"、ファイルは ~/.copilot/mcp-config.json

💡 JUPYTER_TOKEN の値は、JupyterLab 起動時に指定した --IdentityProvider.token の値と一致させてください。

📦 Docker を使う場合(上級者向け)

Linux 環境では --network=host を指定します。

jupyter-workspace/.vscode/mcp.json
{
  "servers": {
    "DatalayerJupyter": {
      "command": "docker",
      "args": [
        "run", "-i", "--rm",
        "-e", "JUPYTER_URL",
        "-e", "JUPYTER_TOKEN",
        "-e", "ALLOW_IMG_OUTPUT",
        "--network=host",
        "datalayer/jupyter-mcp-server:latest"
      ],
      "env": {
        "JUPYTER_URL": "http://localhost:8888",
        "JUPYTER_TOKEN": "MY_TOKEN",
        "ALLOW_IMG_OUTPUT": "true"
      }
    }
  }
}

事前に Docker をインストールしておく必要があります。

sudo apt install -y docker.io
sudo usermod -aG docker $USER
# ログアウトして再ログイン

2.6 動作確認

すべてが正しく設定できたか確認しましょう。

Step 1: JupyterLab を起動

ターミナルで仮想環境を有効化し、JupyterLab を起動します。

cd ~/jupyter-workspace
source .venv/bin/activate
jupyter lab --port 8888 --IdentityProvider.token MY_TOKEN

⚠️ JupyterLab は、Copilot を使っている間、常に起動したままにしておく必要があります。別のターミナルウィンドウで起動しておきましょう。

Step 2A: VS Code Agent Mode で接続確認

  1. 別のターミナルまたはファイルマネージャーから、VS Code でワークスペースを開く:
    code ~/jupyter-workspace
    
  2. Copilot Chat を開く(Ctrl+Alt+I
  3. チャットモードを Agent に切り替える(ドロップダウンメニューから選択)
  4. ⚙️ Tools アイコンをクリックし、DatalayerJupyter のツールが表示されることを確認
  5. 以下のように入力してテスト:

Jupyter に接続して、1+1 を計算してください。

Copilot がツールの使用許可を求めてきたら「Allow」をクリックします。2 という結果が返ってくれば成功です🎉

Step 2B: Copilot CLI で接続確認

別のターミナルを開き、ワークスペースに移動して Copilot CLI を起動します。

cd ~/jupyter-workspace
gh copilot

Copilot CLI のプロンプトが表示されたら、以下のように入力します。

Jupyter に接続して、1+1 を計算してください。

ツールの使用許可を求められたら承認します。2 という結果が返ってくれば成功です🎉

💡 Copilot CLI の便利なコマンド

  • /mcp — 接続中の MCP サーバーを確認
  • /mcp add — MCP サーバーを対話的に追加

3. Step 1:はじめてのデータ分析(Iris データセット)

まずは、最もシンプルなデータセットで「自然言語データ分析」の流れを体験しましょう。

Iris(アヤメ)データセットは、3種類のアヤメの花びら・がくの大きさを記録した、データサイエンスの定番データです。Python の seaborn ライブラリに内蔵されているので、ファイルのダウンロードは不要です。

3.1 データの読み込みと確認

Copilot に以下のように入力します。

💡 以降の手順は VS Code Agent Mode でも Copilot CLI でも同じプロンプトで実行できます。お好みの方法でお試しください。

seaborn に内蔵されている Iris データセットを読み込んで、最初の5行と基本統計量を表示してください。

🔍 Copilot が実行したコード
import seaborn as sns
import pandas as pd

# Iris データセットの読み込み
df = sns.load_dataset('iris')

# 最初の5行
print(df.head())

# 基本統計量
print(df.describe())

Copilot から、以下のようなデータの先頭行と統計量が返ってきます。

   sepal_length  sepal_width  petal_length  petal_width species
0           5.1          3.5           1.4          0.2  setosa
1           4.9          3.0           1.4          0.2  setosa
2           4.7          3.2           1.3          0.2  setosa
3           4.6          3.1           1.5          0.2  setosa
4           5.0          3.6           1.4          0.2  setosa

       sepal_length  sepal_width  petal_length  petal_width
count        150.00       150.00        150.00       150.00
mean           5.84         3.06          3.76         1.20
std            0.83         0.44          1.77         0.76
min            4.30         2.00          1.00         0.10
25%            5.10         2.80          1.60         0.30
50%            5.80         3.00          4.35         1.30
75%            6.40         3.30          5.10         1.80
max            7.90         4.40          6.90         2.50

このデータには150個のサンプルがあり、4つの数値特徴量(sepal_length, sepal_width, petal_length, petal_width)と1つのカテゴリ変数(species)が含まれています。

3.2 データの可視化

次に、データの分布を視覚的に確認してみましょう。

Iris データの 4つの数値特徴量のヒストグラムを、種類(species)ごとに色分けして表示してください。

🔍 Copilot が実行したコード
import matplotlib.pyplot as plt

fig, axes = plt.subplots(2, 2, figsize=(12, 10))
features = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width']

for ax, feature in zip(axes.flatten(), features):
    for species in df['species'].unique():
        subset = df[df['species'] == species]
        ax.hist(subset[feature], alpha=0.6, label=species, bins=15)
    ax.set_title(feature)
    ax.legend()

plt.tight_layout()
plt.show()

4つのヒストグラムが表示されます。petal_lengthpetal_width で種類ごとの分布がはっきり分かれていることが見て取れるはずです。

Iris ヒストグラム

3.3 散布図行列で関係性を見る

Iris データの散布図行列(ペアプロット)を、種類ごとに色分けして描画してください。

🔍 Copilot が実行したコード
sns.pairplot(df, hue='species', diag_kind='kde')
plt.show()

この1枚のグラフで、4つの特徴量のすべての組み合わせにおける散布図と、各特徴量の分布(対角線上のカーネル密度推定)を同時に確認できます。

Iris ペアプロット

3.4 相関行列

Iris データの数値特徴量の相関行列をヒートマップで表示してください。相関係数の数値もセル内に表示してください。

🔍 Copilot が実行したコード
correlation = df.select_dtypes(include='number').corr()
sns.heatmap(correlation, annot=True, cmap='coolwarm', center=0, fmt='.2f')
plt.title('Correlation Matrix')
plt.show()

petal_lengthpetal_width の相関が非常に高い(0.96程度)ことがわかります。研究データを分析する際も、このように相関行列を最初に確認することで、変数間の関係を素早く把握できます。

Iris 相関行列

💡 ここまでのポイント:4つのプロンプト(自然言語の指示)だけで、データの読み込み・基本統計量の確認・ヒストグラム・散布図行列・相関行列の可視化まで完了しました。Pythonのコードは一切書いていません。


4. Step 2:実践的なデータ探索(Titanic データセット)

Iris で基本を掴んだら、次は実世界のデータに挑戦します。Titanic データセットは、欠損値やカテゴリ変数を含む実践的なデータで、データの前処理を学ぶのに最適です。

4.1 データの取得

Titanic データセットも seaborn に内蔵されています。

seaborn に内蔵されている Titanic データセットを読み込んで、データの概要(行数・列数・各列のデータ型・欠損値の数と割合)を表形式でまとめてください。

🔍 Copilot が実行したコード
df_titanic = sns.load_dataset('titanic')

# データ概要
info_df = pd.DataFrame({
    'データ型': df_titanic.dtypes,
    '非欠損数': df_titanic.count(),
    '欠損数': df_titanic.isnull().sum(),
    '欠損率(%)': (df_titanic.isnull().sum() / len(df_titanic) * 100).round(1)
})
print(f"行数: {len(df_titanic)}, 列数: {len(df_titanic.columns)}")
print(info_df)

age(年齢)や deck(客室デッキ)に欠損値があることが確認できます。実際の研究データでも欠損値は頻繁に発生するため、ここで対処法を学ぶことは非常に有益です。

行数: 891, 列数: 15

                 データ型  非欠損数  欠損数  欠損率(%)
survived        int64   891    0     0.0
pclass          int64   891    0     0.0
sex               str   891    0     0.0
age           float64   714  177    19.9
sibsp           int64   891    0     0.0
parch           int64   891    0     0.0
fare          float64   891    0     0.0
embarked          str   889    2     0.2
class        category   891    0     0.0
who               str   891    0     0.0
adult_male       bool   891    0     0.0
deck         category   203  688    77.2
embark_town       str   889    2     0.2
alive             str   891    0     0.0
alone            bool   891    0     0.0

4.2 データの可視化による探索

ここからが「自然言語データ分析」の真価を発揮する場面です。研究者として「何を知りたいか」を日本語で伝えるだけで、適切な可視化が得られます。

Titanic データで、性別(sex)ごとの生存率と、客室クラス(pclass)ごとの生存率を、それぞれ棒グラフで比較してください。グラフのタイトルと軸ラベルは日本語にしてください。

🔍 Copilot が実行したコード
import matplotlib

# 日本語フォントの設定(Ubuntu の Noto Sans CJK JP を使用)
matplotlib.rcParams['font.family'] = 'Noto Sans CJK JP'

fig, axes = plt.subplots(1, 2, figsize=(14, 5))

# 性別ごとの生存率
df_titanic.groupby('sex')['survived'].mean().plot(kind='bar', ax=axes[0], color=['#4C72B0', '#DD8452'])
axes[0].set_title('性別ごとの生存率', fontsize=14)
axes[0].set_ylabel('生存率')
axes[0].set_xticklabels(['女性', '男性'], rotation=0)

# 客室クラスごとの生存率
df_titanic.groupby('pclass')['survived'].mean().plot(kind='bar', ax=axes[1], color=['#55A868', '#C44E52', '#8172B3'])
axes[1].set_title('客室クラスごとの生存率', fontsize=14)
axes[1].set_ylabel('生存率')
axes[1].set_xlabel('客室クラス')

plt.tight_layout()
plt.show()

女性の方が男性より大幅に生存率が高く、1等客室の乗客の生存率が最も高いことが一目でわかります。

Titanic 生存率

良いプロンプトの書き方

ここで、プロンプトの書き方について重要なポイントを押さえておきましょう。

❌ 悪いプロンプト ✅ 良いプロンプト
データを分析して 生存率を性別と客室クラスごとに棒グラフで比較して
グラフを作って 年齢の分布を生存・非生存に分けてヒストグラムで表示し、軸ラベルを日本語にして
何かわかることある? 欠損値の数と割合を表で表示し、欠損率が10%を超える列をハイライトして

ポイント

  • 何を(どの変数を使うか)
  • どのように(グラフの種類、集計方法)
  • どう見せるか(日本語ラベル、色、レイアウト)

を具体的に伝えると、期待通りの結果が得られます。

4.3 年齢分布と生存の関係

Titanic データで、生存者と非生存者の年齢分布を重ねたヒストグラムで表示してください。半透明にして両方の分布が見えるようにし、凡例を付けてください。

🔍 Copilot が実行したコード
fig, ax = plt.subplots(figsize=(10, 6))

df_titanic[df_titanic['survived'] == 1]['age'].hist(
    alpha=0.6, bins=30, label='生存', color='#55A868', ax=ax
)
df_titanic[df_titanic['survived'] == 0]['age'].hist(
    alpha=0.6, bins=30, label='非生存', color='#C44E52', ax=ax
)

ax.set_title('年齢分布と生存の関係', fontsize=14)
ax.set_xlabel('年齢')
ax.set_ylabel('人数')
ax.legend(fontsize=12)
plt.show()

幼い子供(0-5歳)の生存率が比較的高いことが視覚的にわかります。

Titanic 年齢分布と生存

4.4 欠損値の処理

Titanic データの age 列の欠損値を中央値で補完してください。また、embarked 列の欠損値は最頻値で補完してください。処理前後の欠損値数を比較する表を表示してください。

🔍 Copilot が実行したコード
# 処理前
before = df_titanic.isnull().sum()

# 欠損値補完(pandas 2.0+ 対応の書き方)
df_titanic['age'] = df_titanic['age'].fillna(df_titanic['age'].median())
df_titanic['embarked'] = df_titanic['embarked'].fillna(df_titanic['embarked'].mode()[0])

# 処理後
after = df_titanic.isnull().sum()

comparison = pd.DataFrame({'処理前': before, '処理後': after})
print(comparison[comparison['処理前'] > 0])

age の欠損値177件が0件に、embarked の欠損値2件が0件に補完されたことが確認できます。deckembark_town の欠損が残っていますが、後の機械学習では使用しないため、ここでは補完していません。

             処理前  処理後
age          177    0
embarked       2    0
deck         688  688
embark_town    2    2

⚠️ 研究での注意点:欠損値の補完方法は、データの性質と研究の目的に応じて慎重に選択してください。中央値補完は簡便ですが、データの分布を歪める可能性があります。論文では、採用した補完方法とその根拠を明記しましょう。

pandas 2.0+ をお使いの方fillna(inplace=True) は Copy-on-Write の導入により正しく動作しなくなっています。上記のように df['col'] = df['col'].fillna(value) の形式で記述してください。


5. Step 3:機械学習モデルの構築

ここからは、自然言語で機械学習モデルを構築する方法を学びます。Titanic データを使い、「乗客が生存したかどうか」を予測する分類モデルを作ります。

5.1 特徴量の選択とデータ準備

Titanic データを使って生存予測の機械学習モデルを作りたいです。まず、特徴量として pclass, sex, age, fare, embarked を選び、sex と embarked をダミー変数に変換してください。そのうえで、訓練データとテストデータに 8:2 で分割してください。ランダムシードは 42 に固定してください。

🔍 Copilot が実行したコード
from sklearn.model_selection import train_test_split

# 特徴量選択
features = ['pclass', 'sex', 'age', 'fare', 'embarked']
X = df_titanic[features].copy()
y = df_titanic['survived']

# ダミー変数化
X = pd.get_dummies(X, columns=['sex', 'embarked'], drop_first=True)

# 訓練・テスト分割
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)
print(f"訓練データ: {X_train.shape[0]}件, テストデータ: {X_test.shape[0]}")
print(f"特徴量: {list(X_train.columns)}")
訓練データ: 712件, テストデータ: 179件
特徴量: ['pclass', 'age', 'fare', 'sex_male', 'embarked_Q', 'embarked_S']

💡 ランダムシードの固定は再現性のために重要です。論文やレポートで結果を報告する際、同じシード値を使えば、誰でも同じ結果を再現できます。

5.2 ロジスティック回帰モデル

ロジスティック回帰で生存予測モデルを訓練し、テストデータで評価してください。正解率、適合率、再現率、F1スコアを表示してください。また、混同行列をヒートマップで可視化してください。

🔍 Copilot が実行したコード
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report, confusion_matrix

# モデル訓練
model_lr = LogisticRegression(max_iter=1000, random_state=42)
model_lr.fit(X_train, y_train)

# 予測と評価
y_pred = model_lr.predict(X_test)
print(classification_report(y_test, y_pred, target_names=['非生存', '生存']))

# 混同行列
cm = confusion_matrix(y_test, y_pred)
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues',
            xticklabels=['非生存', '生存'],
            yticklabels=['非生存', '生存'])
plt.title('混同行列(ロジスティック回帰)')
plt.ylabel('実際')
plt.xlabel('予測')
plt.show()

ロジスティック回帰の評価結果は以下のようになります。正解率(accuracy)は約80%です。

              precision    recall  f1-score   support

         非生存       0.82      0.84      0.83       105
          生存       0.76      0.74      0.75        74

    accuracy                           0.80       179
   macro avg       0.79      0.79      0.79       179
weighted avg       0.80      0.80      0.80       179

混同行列

5.3 ランダムフォレストモデル

同じデータでランダムフォレスト分類器も訓練してください。ハイパーパラメータは n_estimators=100, max_depth=5 にしてください。ロジスティック回帰と性能を比較する表を作ってください。また、特徴量の重要度を棒グラフで可視化してください。

🔍 Copilot が実行したコード
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score

# ランダムフォレスト
model_rf = RandomForestClassifier(n_estimators=100, max_depth=5, random_state=42)
model_rf.fit(X_train, y_train)
y_pred_rf = model_rf.predict(X_test)

# 比較表
y_pred_lr = model_lr.predict(X_test)
comparison = pd.DataFrame({
    'ロジスティック回帰': [
        accuracy_score(y_test, y_pred_lr),
        precision_score(y_test, y_pred_lr),
        recall_score(y_test, y_pred_lr),
        f1_score(y_test, y_pred_lr)
    ],
    'ランダムフォレスト': [
        accuracy_score(y_test, y_pred_rf),
        precision_score(y_test, y_pred_rf),
        recall_score(y_test, y_pred_rf),
        f1_score(y_test, y_pred_rf)
    ]
}, index=['正解率', '適合率', '再現率', 'F1スコア'])
print(comparison.round(3))

# 特徴量重要度
importances = pd.Series(model_rf.feature_importances_, index=X_train.columns)
importances.sort_values().plot(kind='barh', figsize=(8, 5), color='#4C72B0')
plt.title('特徴量の重要度(ランダムフォレスト)')
plt.xlabel('重要度')
plt.show()

特徴量の重要度を確認することで、どの変数が予測に最も寄与しているかを把握できます。研究では、この情報がドメイン知識と整合するかを確認することが重要です。

2つのモデルの比較結果は以下の通りです。

       ロジスティック回帰  ランダムフォレスト
正解率        0.799      0.816
適合率        0.764      0.836
再現率        0.743      0.689
F1スコア      0.753      0.756

特徴量の重要度

⚠️ 機械学習モデルの注意点

  • 過学習(訓練データへの過度な適合)に注意してください。訓練データとテストデータの性能差が大きい場合は、過学習の可能性があります。
  • モデルの解釈性も重要です。論文では、なぜそのモデルを選んだのか、結果をどう解釈するかを明記しましょう。

6. Step 4:論文品質の可視化

最後に、査読論文に使えるクオリティのグラフを生成する方法を学びます。Kaggle の House Prices データセットを使って、回帰分析と高品質な可視化を行います。

6.1 Kaggle からデータを取得

  1. Kaggle の House Prices ページにアクセス
  2. Kaggle アカウントでログイン(未登録の場合は無料で作成)
  3. Competition Rules に同意する(初回のみ。Rules ページで「I Understand and Accept」をクリック)
  4. 「Download All」ボタンでデータをダウンロード
  5. ダウンロードした zip ファイルを解凍し、train.csv~/jupyter-workspace/ に配置
📦 Kaggle CLI でダウンロードする場合(上級者向け)

⚠️ CLI でダウンロードする場合も、事前に Kaggle の Web サイトで Competition Rules に同意しておく必要があります。同意していないと 403 Forbidden エラーになります。

pip install kaggle
# ~/.kaggle/kaggle.json に API トークンを配置(Kaggle のアカウント設定から取得)
kaggle competitions download -c house-prices-advanced-regression-techniques
unzip house-prices-advanced-regression-techniques.zip -d ~/jupyter-workspace/

6.2 データの読み込みと概要把握

~/jupyter-workspace/train.csv を読み込んで、データの行数・列数・目的変数 SalePrice の基本統計量を表示してください。また、SalePrice の分布をヒストグラムと箱ひげ図で並べて表示してください。

🔍 Copilot が実行したコード
df_house = pd.read_csv('train.csv')
print(f"行数: {len(df_house)}, 列数: {len(df_house.columns)}")
print(df_house['SalePrice'].describe())

fig, axes = plt.subplots(1, 2, figsize=(14, 5))

df_house['SalePrice'].hist(bins=50, ax=axes[0], color='#4C72B0', edgecolor='black')
axes[0].set_title('SalePrice の分布')
axes[0].set_xlabel('販売価格 ($)')
axes[0].set_ylabel('頻度')

df_house.boxplot(column='SalePrice', ax=axes[1])
axes[1].set_title('SalePrice の箱ひげ図')

plt.tight_layout()
plt.show()

データは1460行×81列で、SalePrice の基本統計量は以下の通りです。

行数: 1460, 列数: 81

count      1460.000000
mean     180921.195890
std       79442.502883
min       34900.000000
25%      129975.000000
50%      163000.000000
75%      214000.000000
max      755000.000000

SalePrice 分布

6.3 相関分析

House Prices データの数値特徴量のうち、SalePrice との相関係数の絶対値が高い上位10個を抽出し、相関係数を棒グラフで表示してください。また、上位5つの特徴量と SalePrice の散布図を 1行5列で並べてください。

🔍 Copilot が実行したコード
# 相関上位10
correlations = df_house.select_dtypes(include='number').corr()['SalePrice'].drop('SalePrice')
top10 = correlations.abs().sort_values(ascending=False).head(10)

fig, ax = plt.subplots(figsize=(10, 5))
top10.plot(kind='barh', ax=ax, color='#4C72B0')
ax.set_title('SalePrice との相関係数(上位10)')
ax.set_xlabel('相関係数(絶対値)')
plt.tight_layout()
plt.show()

# 散布図
top5_features = top10.index[:5]
fig, axes = plt.subplots(1, 5, figsize=(25, 5))
for ax, feature in zip(axes, top5_features):
    ax.scatter(df_house[feature], df_house['SalePrice'], alpha=0.3, s=10)
    ax.set_xlabel(feature)
    ax.set_ylabel('SalePrice')
    ax.set_title(f'{feature} vs SalePrice')
plt.tight_layout()
plt.show()

OverallQual(品質評価)や GrLivArea(居住面積)が販売価格と強い相関を持つことがわかります。

相関係数上位10

上位5特徴量の散布図

6.4 論文品質のグラフを作成する

ここが本記事のクライマックスです。査読論文に掲載できるクオリティのグラフを、自然言語で作成します。

⚠️ Times New Roman フォントのインストールが必要です

Ubuntu には Times New Roman がデフォルトでインストールされていません。論文品質のグラフを作成する前に、以下のコマンドでインストールしてください。

# multiverse リポジトリの有効化(必要な場合)
sudo add-apt-repository multiverse
sudo apt update

# Microsoft コアフォントのインストール(EULA への同意が求められます)
sudo apt install -y ttf-mscorefonts-installer

インストール後、JupyterLab のカーネルを再起動してください(メニューの Kernel → Restart Kernel)。

代替案:Times New Roman をインストールしたくない場合は、Linux にプリインストールされている Liberation Serif(Times New Roman 互換のオープンソースフォント)を使うこともできます。その場合、コード内の 'Times New Roman''Liberation Serif' に置き換えてください。

以下の条件で論文掲載用のグラフを作成してください:

  • グラフの種類:GrLivArea(居住面積)と SalePrice の散布図に、回帰直線を重ねる
  • フォント:Times New Roman, サイズ12
  • 解像度:300 DPI
  • サイズ:幅8インチ × 高さ6インチ
  • 軸ラベル:英語で、フォントサイズ14、太字
  • タイトル:なし(論文ではキャプションを使うため)
  • グリッド:薄いグレーの点線
  • データポイント:半透明の青色、サイズ小
  • 回帰直線:赤色、太さ2
  • R²値:グラフ内の右下に表示
  • 余白:適切に調整
  • 保存:PNG と PDF の両方で保存
🔍 Copilot が実行したコード
from scipy import stats
import numpy as np

# 論文用のスタイル設定
plt.rcParams.update({
    'font.family': 'serif',
    'font.serif': ['Times New Roman'],
    'font.size': 12,
    'axes.labelsize': 14,
    'axes.labelweight': 'bold',
    'figure.dpi': 300,
})

fig, ax = plt.subplots(figsize=(8, 6))

# 散布図
x = df_house['GrLivArea']
y = df_house['SalePrice']
ax.scatter(x, y, alpha=0.3, s=15, color='#4C72B0', edgecolors='none')

# 回帰直線
slope, intercept, r_value, p_value, std_err = stats.linregress(x, y)
x_line = np.linspace(x.min(), x.max(), 100)
ax.plot(x_line, slope * x_line + intercept, color='red', linewidth=2)

# R²値の表示
ax.text(0.95, 0.05, f'$R^2 = {r_value**2:.3f}$',
        transform=ax.transAxes, fontsize=14,
        verticalalignment='bottom', horizontalalignment='right',
        bbox=dict(boxstyle='round', facecolor='white', alpha=0.8))

# グリッド
ax.grid(True, linestyle=':', color='gray', alpha=0.5)

# 軸ラベル
ax.set_xlabel('Living Area (sq ft)')
ax.set_ylabel('Sale Price ($)')

plt.tight_layout()
plt.savefig('figure_livarea_vs_price.png', dpi=300, bbox_inches='tight')
plt.savefig('figure_livarea_vs_price.pdf', bbox_inches='tight')
plt.show()
print("保存完了: figure_livarea_vs_price.png / .pdf")

これで、査読論文に直接掲載できるクオリティのグラフが生成されました。PNG(発表資料用)と PDF(論文投稿用)の両方が保存されています。

論文品質の散布図

6.5 複数パネルの論文用図表

以下の4パネル構成の図を作成してください(2×2レイアウト):

  • (a) SalePrice の分布(ヒストグラム + カーネル密度推定)
  • (b) OverallQual ごとの SalePrice(箱ひげ図)
  • (c) GrLivArea vs SalePrice(散布図 + 回帰直線)
  • (d) 上位5特徴量の相関ヒートマップ

各パネルに (a), (b), (c), (d) のラベルを左上に付けてください。論文品質(Times New Roman, 300DPI)で作成し、figure_composite.pdf として保存してください。

🔍 Copilot が実行したコード
fig, axes = plt.subplots(2, 2, figsize=(14, 12))

# (a) SalePrice 分布
ax = axes[0, 0]
df_house['SalePrice'].hist(bins=50, density=True, alpha=0.7, ax=ax, color='#4C72B0')
df_house['SalePrice'].plot.kde(ax=ax, color='red', linewidth=2)
ax.set_xlabel('Sale Price ($)')
ax.set_ylabel('Density')
ax.text(0.02, 0.95, '(a)', transform=ax.transAxes, fontsize=16, fontweight='bold', va='top')

# (b) OverallQual vs SalePrice
ax = axes[0, 1]
df_house.boxplot(column='SalePrice', by='OverallQual', ax=ax)
ax.set_xlabel('Overall Quality')
ax.set_ylabel('Sale Price ($)')
ax.set_title('')
fig.suptitle('')
ax.text(0.02, 0.95, '(b)', transform=ax.transAxes, fontsize=16, fontweight='bold', va='top')

# (c) GrLivArea vs SalePrice
ax = axes[1, 0]
ax.scatter(df_house['GrLivArea'], df_house['SalePrice'], alpha=0.3, s=10, color='#4C72B0')
slope, intercept, r, p, se = stats.linregress(df_house['GrLivArea'], df_house['SalePrice'])
x_line = np.linspace(df_house['GrLivArea'].min(), df_house['GrLivArea'].max(), 100)
ax.plot(x_line, slope * x_line + intercept, 'r-', linewidth=2)
ax.set_xlabel('Living Area (sq ft)')
ax.set_ylabel('Sale Price ($)')
ax.text(0.02, 0.95, '(c)', transform=ax.transAxes, fontsize=16, fontweight='bold', va='top')

# (d) 相関ヒートマップ(上位5)
ax = axes[1, 1]
top5 = ['OverallQual', 'GrLivArea', 'GarageCars', 'GarageArea', 'TotalBsmtSF', 'SalePrice']
corr_top5 = df_house[top5].corr()
sns.heatmap(corr_top5, annot=True, fmt='.2f', cmap='coolwarm', center=0, ax=ax)
ax.text(0.02, 0.95, '(d)', transform=ax.transAxes, fontsize=16, fontweight='bold', va='top')

plt.tight_layout()
plt.savefig('figure_composite.pdf', bbox_inches='tight')
plt.savefig('figure_composite.png', dpi=300, bbox_inches='tight')
plt.show()

この複数パネル構成の図は、論文の結果セクションでよく使われるフォーマットです。自然言語の指示1回で、このクオリティの図表が生成できる——これが GitHub Copilot + Jupyter MCP の真価です。

複合パネル図


7. 効果的な使い方のコツ

プロンプトのテンプレート

研究データ分析でよく使うプロンプトをまとめました。コピーして使ってください。

データ概要把握

[データ名] を読み込んで、行数・列数・各列のデータ型・欠損値の数と割合を表形式で表示してください。

探索的データ分析

[目的変数] と [説明変数] の関係を [グラフの種類] で可視化してください。グループ変数は [カテゴリ変数] で色分けしてください。

統計検定

[グループ変数] のグループ間で [数値変数] に統計的な有意差があるかを、t検定(2群)またはANOVA(3群以上)で検定してください。p値と効果量を表示してください。

論文用グラフ

論文掲載用に、[グラフの内容] を作成してください。フォントは Times New Roman サイズ12、解像度300DPI、軸ラベルは英語で太字にしてください。PDF と PNG の両方で保存してください。


まとめ

本記事では、GitHub Copilot + Jupyter MCP を使い、Pythonを一行も書かずに以下のデータ分析を実行しました。

ステップ 内容 使用データ
Step 1 基本統計量、ヒストグラム、散布図行列、相関行列 Iris
Step 2 欠損値分析、探索的データ分析、前処理 Titanic
Step 3 機械学習モデルの構築と評価 Titanic
Step 4 論文品質のグラフ作成、複合図表 House Prices

AI for Science の時代において、プログラミングはもはや研究の障壁ではありません。 研究者に求められるのは、

  1. 良い問いを立てること(何を知りたいのか)
  2. 適切な分析手法を選ぶこと(どう分析するのか)
  3. 結果を正しく解釈すること(何がわかったのか)

であり、これらはまさに研究者の専門性そのものです。コードを書く作業はAIに任せ、研究の本質に集中する——そんな新しい研究スタイルを、ぜひ試してみてください。

次のステップ

  • 🔬 自分の研究データで試す:CSV や Excel ファイルを ~/jupyter-workspace/ に配置し、Copilot に分析を依頼してみましょう
  • 📊 高度な統計分析:主成分分析(PCA)、クラスタリング、時系列分析なども自然言語で実行できます
  • 🤖 深層学習:画像認識やテキスト分析など、より高度な機械学習にも挑戦できます
  • 📝 自動レポート生成:分析結果を自動的にレポート形式にまとめることも可能です

💡 Tip:うまくいかないときは、プロンプトをより具体的にしてみてください。「何を」「どのように」「どう表示するか」を明確にするほど、Copilot は正確なコードを生成します。

参考資料

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?