Pythonでの本格的なデータ分析やAI開発には、基本的な機能だけでは非効率です。そこで、高速計算の「NumPy」、表データ操作の「Pandas」、データ可視化の「Matplotlib」という3つの強力なライブラリが必須ツールとなります。これらを使いこなし、データ分析の全プロセスを効率化しましょう。
大量の数値データを高速に処理する配列(ndarray)を提供。ベクトル化演算により、forループなしで全データへの一括計算や統計量算出を瞬時に行い、AI開発の計算基盤を支えます。
Excelのような表形式データ(DataFrame)を自在に扱います。CSVファイルの読み込み、条件に基づくデータの抽出・整形など、データクレンジングや前処理に不可欠なライブラリです。
数値の羅列だけでは見えないデータの傾向やパターンを、グラフで「見える化」します。ヒストグラムや散布図など多様なグラフを作成でき、分析結果の報告や解釈に役立ちます。
はじめに:AI開発を加速する「三種の神器」
皆さん、こんにちは。これまでの講義で、私たちはPythonの基本的な文法から、関数、そしてクラスという設計図まで、プログラミングの基礎体力をしっかりと身につけてきました。データを変数に入れ、リストや辞書で整理し、if文やforループで処理の流れを制御し、関数やクラスでコードを部品化する…。ここまで来れば、もう立派なプログラミングの第一歩を踏み出せています。
しかし、実際の医療研究で扱うような、ExcelやCSVにまとめられた大規模な表形式のデータや、複雑な数値計算を、これまでの知識だけで効率的に扱うのは、まだ少し骨が折れるかもしれません。forループで一つ一つ計算するのは、データが数万、数百万件にもなると、時間がかかりすぎてしまいます。
そこで登場するのが、PythonをデータサイエンスとAI開発のための超強力なツールへと昇華させる、「三種の神器」とも呼ばれるライブラリたちです。
- NumPy (ナムパイ): 高速な数値計算を専門とする「計算エンジン」
- Pandas (パンダス): Excelのような表形式データを自在に操る「高性能な電子カルテ/実験ノート」
- Matplotlib (マットプロットリブ): データをグラフにして「目で見る」ことを可能にする「プレゼンテーションスライド作成ツール」
これらのライブラリは、世界中のデータサイエンティストやAI研究者にとって、まさに「空気」のように当たり前に使われている必須ツールです。今回の講義では、この三種の神器の基本的な使い方を、医療データを例に取りながら一気通貫で学び、皆さんの研究や分析を加速させるための武器を手に入れていきましょう。
1. NumPy (Numerical Python) – 高速な数値計算の「エンジン」
まずは、科学技術計算の土台となるNumPyです。
1.1 なぜNumPyが必要なのか?
Pythonのリストは非常に便利ですが、大量の数値データを扱う、特に数学的な計算を行う際には、処理速度が遅いという弱点があります。NumPyは、ndarray (N-dimensional array) という、高速に動作する特殊な配列を提供します。これは、内部がC言語のような高速な言語で実装されているため、Pythonのリストで行うよりも何十倍、何百倍も速く計算できるのです(1)。ディープラーニングのように膨大な行列計算を行うAI開発において、この速度は決定的に重要です。
1.2 NumPyの基本操作
NumPyの最も強力な機能の一つが、ブロードキャスティングとユニバーサル関数による、配列全体の高速な一括操作です。
Pythonコード例:NumPyで患者の体温を一括処理
# NumPyライブラリを「np」という慣例的な別名でインポートします
import numpy as np
# --- 1. Pythonのリストで患者5人の体温データを用意 ---
temperatures_list = [36.5, 37.1, 38.2, 36.8, 39.1]
print(f"元のPythonリスト: {temperatures_list}")
# --- 2. NumPy配列に変換 ---
# np.array() を使って、PythonのリストをNumPyのndarrayに変換します。
temperatures_np = np.array(temperatures_list)
print(f"NumPy配列に変換後: {temperatures_np}")
print(f"データ型: {type(temperatures_np)}")
# --- 3. 配列全体への一括計算(ブロードキャスティング) ---
# 例えば、全員の体温を2度上げたい場合、forループを使わずに、
# 配列全体に直接「+ 2」と書くだけで、全ての要素に2が足されます。
# これがNumPyの強力なベクトル化演算です。
increased_temps = temperatures_np + 2
print(f"\n全要素を2度上げた結果: {increased_temps}")
# --- 4. 基本的な統計量の計算 ---
# NumPyを使えば、平均値、標準偏差、最大値なども一瞬で計算できます。
mean_temp = np.mean(temperatures_np) # 平均値
std_temp = np.std(temperatures_np) # 標準偏差
max_temp = np.max(temperatures_np) # 最大値
print(f"\n平均体温: {mean_temp:.2f} 度")
print(f"標準偏差: {std_temp:.2f}")
print(f"最高体温: {max_temp:.2f} 度")
# === ここから下が上記のprint文による実際の出力 ===
# 元のPythonリスト: [36.5, 37.1, 38.2, 36.8, 39.1]
# NumPy配列に変換後: [36.5 37.1 38.2 36.8 39.1]
# データ型: <class 'numpy.ndarray'>
#
# 全要素を2度上げた結果: [38.5 39.1 40.2 38.8 41.1]
#
# 平均体温: 37.54 度
# 標準偏差: 0.98
# 最高体温: 39.10 度
2. Pandas – 表形式データを自在に操る「高性能スプレッドシート」
NumPyが純粋な数値計算のエンジンだとすれば、Pandasは、行と列からなる、まさにExcelのような表形式(テーブル)データを扱うための専門ライブラリです(2)。臨床研究データの多くはこの形式であり、Pandasを使いこなせるかどうかは、データ分析の効率を大きく左右します。
2.1 Pandasの基本:DataFrameとSeries
Pandasの中心的なデータ構造は DataFrame です。これは、行と列にそれぞれラベル(インデックスとカラム名)が付いた、2次元の表そのものです。そして、そのDataFrameの1つの列が Series と呼ばれます。
2.2 Pandasの基本操作
Pandasの真価は、データの読み込み、閲覧、そして柔軟なデータ抽出(フィルタリング)にあります。
Pythonコード例:Pandasで患者データCSVを扱う
# 必要なライブラリをインポートします
import pandas as pd
import io
# --- 1. ダミーの医療データ(CSV形式)を作成 ---
# Lecture 11 と同じダミーデータを使います。
csv_data_string = """patient_id,age,blood_pressure,event,memo
101,65,140,1,"発熱と咳の症状あり"
102,58,125,0,"定期健診。特に問題なし"
103,72,155,1,"胸部圧迫感を訴える"
104,45,110,0,"健康診断。良好"
105,68,130,0,"フォローアップ受診"
106,81,160,1,"意識レベルの低下が見られた"
107,55,120,0,"異常なし"
108,63,135,1,"持続的な頭痛"
"""
# 文字列をファイルのように扱います。
csv_file = io.StringIO(csv_data_string)
# --- 2. CSVデータをDataFrameとして読み込む ---
# pd.read_csv() は、CSVファイルを読み込んでDataFrameオブジェクトを生成する、非常によく使う関数です。
patient_df = pd.read_csv(csv_file)
print("--- データの最初の5行を表示 (.head()) ---")
# .head() は、データフレームの最初の数行(デフォルトは5行)を表示し、
# どんなデータが入っているかを素早く確認するのに便利です。
print(patient_df.head())
print("\n--- データの基本情報を表示 (.info()) ---")
# .info() は、各列のデータ型や欠損値の有無など、データフレームの概要を表示します。
patient_df.info()
print("\n--- 数値データの要約統計量を表示 (.describe()) ---")
# .describe() は、数値データを持つ列の基本的な統計量(件数、平均、標準偏差、最小値、最大値など)を自動で計算してくれます。
print(patient_df.describe())
# --- 3. データの抽出(これが非常に強力!) ---
print("\n--- 特定の列だけを抽出 ---")
# DataFrameから特定の列を抽出するには、['列名'] と指定します。
ages = patient_df['age']
print("年齢の列だけを取り出す:\n", ages)
print("\n--- 特定の条件を満たす行だけを抽出 ---")
# これがPandasの真骨頂です。SQLのWHERE句のように、柔軟な条件でデータを絞り込めます。
# 例えば、「年齢が65歳以上」の患者さんだけを抽出してみましょう。
high_risk_patients = patient_df[patient_df['age'] >= 65]
print("65歳以上の患者さん:\n", high_risk_patients)
# === ここから下が上記のprint文による実際の出力の一部 ===
# --- データの最初の5行を表示 (.head()) ---
# patient_id age blood_pressure event memo
# 0 101 65 140 1 発熱と咳の症状あり
# 1 102 58 125 0 定期健診。特に問題なし
# 2 103 72 155 1 胸部圧迫感を訴える
# 3 104 45 110 0 健康診断。良好
# 4 105 68 130 0 フォローアップ受診
#
# --- データの基本情報を表示 (.info()) ---
# <class 'pandas.core.frame.DataFrame'>
# RangeIndex: 8 entries, 0 to 7
# Data columns (total 5 columns):
# # Column Non-Null Count Dtype
# --- ------ -------------- -----
# 0 patient_id 8 non-null int64
# 1 age 8 non-null int64
# 2 blood_pressure 8 non-null int64
# 3 event 8 non-null int64
# 4 memo 8 non-null object
# dtypes: int64(4), object(1)
# memory usage: 448.0+ bytes
#
# (以下、.describe() や抽出結果の出力が続く)
3. Matplotlib – データを「目で見る」ための「グラフ作成ツール」
データ分析は、数値や表を眺めているだけでは終わりません。データに隠されたパターンや傾向を直感的に理解するために、可視化、つまりグラフにすることは不可欠です。Matplotlibは、Pythonでグラフを描画するための最も基本的で広く使われているライブラリです(3)。
3.1 Matplotlibの基本的な使い方
Matplotlibの pyplot モジュール(通常は plt という別名でインポートします)を使って、様々なグラフを簡単に作成できます。基本的な流れは以下の通りです。
plt.figure(): グラフを描くためのキャンバスを用意する(任意)。plt.hist(),plt.scatter()など: 描きたいグラフの種類に応じた関数を呼ぶ。plt.title(),plt.xlabel(),plt.ylabel(): グラフのタイトルや軸ラベルを追加する。plt.show(): 完成したグラフを表示する。
Pythonコード例:Matplotlibで患者の年齢分布を可視化
# 必要なライブラリをインポートします
import pandas as pd
import io
import matplotlib.pyplot as plt
import japanize_matplotlib # 日本語文字化け対策ライブラリ
# --- 1. 先ほどと同じデータを用意 ---
csv_data_string = """patient_id,age,blood_pressure,event,memo
101,65,140,1,"発熱と咳の症状あり"
102,58,125,0,"定期健診。特に問題なし"
103,72,155,1,"胸部圧迫感を訴える"
104,45,110,0,"健康診断。良好"
105,68,130,0,"フォローアップ受診"
106,81,160,1,"意識レベルの低下が見られた"
107,55,120,0,"異常なし"
108,63,135,1,"持続的な頭痛"
"""
csv_file = io.StringIO(csv_data_string)
patient_df = pd.read_csv(csv_file)
# --- 2. グラフの描画 ---
print("--- 患者の年齢分布のヒストグラムを表示します ---")
# グラフを描画するための新しい「図」を用意します。figsizeでサイズを指定できます。
plt.figure(figsize=(8, 5))
# patient_dfの'age'列のデータを使ってヒストグラムを作成します。
# binsは、データをいくつの区間(棒)に分けるかを指定します。
plt.hist(patient_df['age'], bins=5, edgecolor='black', alpha=0.7)
# グラフにタイトルやラベルを追加して、分かりやすくします。
plt.title('患者の年齢分布')
plt.xlabel('年齢 (歳)')
plt.ylabel('人数')
plt.grid(True, linestyle='--', alpha=0.6) # 見やすいようにグリッド線を追加
# グラフを画面に表示します。
plt.show()

このコードを実行すると、上記のような、患者さんの年齢がどの範囲に最も多いのかを一目で把握できるヒストグラムが表示されるはずです。
4. まとめと次のステップへ
今回は、Pythonでのデータサイエンスに欠かせない「三種の神器」、NumPy, Pandas, Matplotlibの基本的な使い方を駆け足で見てきました。
- NumPy: 高速な数値計算で、データ処理の「エンジン」となる。
- Pandas: 表形式データを自在に扱い、データの前処理や抽出を担う「高性能なカルテ」。
- Matplotlib: データをグラフにし、私たちが直感的に理解するのを助ける「可視化ツール」。
これらのツールを使いこなすことで、皆さんはご自身の研究データをプログラムで読み込み、集計し、そして可視化するという、データ分析の一連のプロセスを実行するための強力な基盤を手に入れました。
これで、Pythonの基本的なプログラミングから、データ分析ライブラリまで、AI開発に必要な準備運動はほぼ完了です。いよいよ次章からは、これまでの知識を総動員して、PyTorchという本格的なディープラーニングの「厨房」に入り、AIモデルの部品を一つ一つ学びながら、その構築を始めていきます。最初のテーマは、PyTorchがデータを扱う基本単位であり、NumPyと非常によく似た「テンソル」です。今回のNumPyの知識が直接活きてきますよ!お楽しみに!
参考文献
- Harris CR, Millman KJ, van der Walt SJ, et al. Array programming with NumPy. Nature. 2020;585(7825):357-362.
- McKinney W. Python for Data Analysis. 2nd ed. Sebastopol, CA: O’Reilly Media; 2017.
- Hunter JD. Matplotlib: A 2D graphics environment. Comput Sci Eng. 2007;9(3):90-95.
ご利用規約(免責事項)
当サイト(以下「本サイト」といいます)をご利用になる前に、本ご利用規約(以下「本規約」といいます)をよくお読みください。本サイトを利用された時点で、利用者は本規約の全ての条項に同意したものとみなします。
第1条(目的と情報の性質)
- 本サイトは、医療分野におけるAI技術に関する一般的な情報提供および技術的な学習機会の提供を唯一の目的とします。
- 本サイトで提供されるすべてのコンテンツ(文章、図表、コード、データセットの紹介等を含みますが、これらに限定されません)は、一般的な学習参考用であり、いかなる場合も医学的な助言、診断、治療、またはこれらに準ずる行為(以下「医行為等」といいます)を提供するものではありません。
- 本サイトのコンテンツは、特定の製品、技術、または治療法の有効性、安全性を保証、推奨、または広告・販売促進するものではありません。紹介する技術には研究開発段階のものが含まれており、その臨床応用には、さらなる研究と国内外の規制当局による正式な承認が別途必要です。
- 本サイトは、情報提供を目的としたものであり、特定の治療法を推奨するものではありません。健康に関するご懸念やご相談は、必ず専門の医療機関にご相談ください。
第2条(法令等の遵守)
利用者は、本サイトの利用にあたり、医師法、医薬品、医療機器等の品質、有効性及び安全性の確保等に関する法律(薬機法)、個人情報の保護に関する法律、医療法、医療広告ガイドライン、その他関連する国内外の全ての法令、条例、規則、および各省庁・学会等が定める最新のガイドライン等を、自らの責任において遵守するものとします。これらの適用判断についても、利用者が自ら関係各所に確認するものとし、本サイトは一切の責任を負いません。
第3条(医療行為における責任)
- 本サイトで紹介するAI技術・手法は、あくまで研究段階の技術的解説であり、実際の臨床現場での診断・治療を代替、補助、または推奨するものでは一切ありません。
- 医行為等に関する最終的な判断、決定、およびそれに伴う一切の責任は、必ず法律上その資格を認められた医療専門家(医師、歯科医師等)が負うものとします。AIによる出力を、資格を有する専門家による独立した検証および判断を経ずに利用することを固く禁じます。
- 本サイトの情報に基づくいかなる行為によって利用者または第三者に損害が生じた場合も、本サイト運営者は一切の責任を負いません。実際の臨床判断に際しては、必ず担当の医療専門家にご相談ください。本サイトの利用によって、利用者と本サイト運営者の間に、医師と患者の関係、またはその他いかなる専門的な関係も成立するものではありません。
第4条(情報の正確性・完全性・有用性)
- 本サイトは、掲載する情報(数値、事例、ソースコード、ライブラリのバージョン等)の正確性、完全性、網羅性、有用性、特定目的への適合性、その他一切の事項について、何ら保証するものではありません。
- 掲載情報は執筆時点のものであり、予告なく変更または削除されることがあります。また、技術の進展、ライブラリの更新等により、情報は古くなる可能性があります。利用者は、必ず自身で公式ドキュメント等の最新情報を確認し、自らの責任で情報を利用するものとします。
第5条(AI生成コンテンツに関する注意事項)
本サイトのコンテンツには、AIによる提案を基に作成された部分が含まれる場合がありますが、公開にあたっては人間による監修・編集を経ています。利用者が生成AI等を用いる際は、ハルシネーション(事実に基づかない情報の生成)やバイアスのリスクが内在することを十分に理解し、その出力を鵜呑みにすることなく、必ず専門家による検証を行うものとします。
第6条(知的財産権)
- 本サイトを構成するすべてのコンテンツに関する著作権、商標権、その他一切の知的財産権は、本サイト運営者または正当な権利を有する第三者に帰属します。
- 本サイトのコンテンツを引用、転載、複製、改変、その他の二次利用を行う場合は、著作権法その他関連法規を遵守し、必ず出典を明記するとともに、権利者の許諾を得るなど、適切な手続きを自らの責任で行うものとします。
第7条(プライバシー・倫理)
本サイトで紹介または言及されるデータセット等を利用する場合、利用者は当該データセットに付随するライセンス条件および研究倫理指針を厳格に遵守し、個人情報の匿名化や同意取得の確認など、適用される法規制に基づき必要とされるすべての措置を、自らの責任において講じるものとします。
第8条(利用環境)
本サイトで紹介するソースコードやライブラリは、執筆時点で特定のバージョンおよび実行環境(OS、ハードウェア、依存パッケージ等)を前提としています。利用者の環境における動作を保証するものではなく、互換性の問題等に起因するいかなる不利益・損害についても、本サイト運営者は責任を負いません。
第9条(免責事項)
- 本サイト運営者は、利用者が本サイトを利用したこと、または利用できなかったことによって生じる一切の損害(直接損害、間接損害、付随的損害、特別損害、懲罰的損害、逸失利益、データの消失、プログラムの毀損等を含みますが、これらに限定されません)について、その原因の如何を問わず、一切の法的責任を負わないものとします。
- 本サイトの利用は、学習および研究目的に限定されるものとし、それ以外の目的での利用はご遠慮ください。
- 本サイトの利用に関連して、利用者と第三者との間で紛争が生じた場合、利用者は自らの費用と責任においてこれを解決するものとし、本サイト運営者に一切の迷惑または損害を与えないものとします。
- 本サイト運営者は、いつでも予告なく本サイトの運営を中断、中止、または内容を変更できるものとし、これによって利用者に生じたいかなる損害についても責任を負いません。
第10条(規約の変更)
本サイト運営者は、必要と判断した場合、利用者の承諾を得ることなく、いつでも本規約を変更することができます。変更後の規約は、本サイト上に掲載された時点で効力を生じるものとし、利用者は変更後の規約に拘束されるものとします。
第11条(準拠法および合意管轄)
本規約の解釈にあたっては、日本法を準拠法とします。本サイトの利用および本規約に関連して生じる一切の紛争については、東京地方裁判所を第一審の専属的合意管轄裁判所とします。
For J³, may joy follow you.

