第8回 データサイエンスとPython
データサイエンス/2021|2021.11.05
AGENDA
- 以下名簿が表示されます。出欠確認・座席記録をお願いします。
出欠確認・座席記録 - 講義はこのページの内容を解説するかたちで遠隔 LIVE 配信します。
- 質問等は YouTubeLive のチャットまたは LINEの 20ASグループからどうぞ。
- 学科サイトの各自のページを更新して下さい。
学科サイト|受講生一覧
以下、LIVE動画をご覧下さい。記事に沿って解説します。
記録動画、学科サイトの特設ページ(要ログイン)に移動しました。
CONTENTS
はじめに
現代社会におけるデータサイエンスの位置付け
データサイエンス(Data Science)とは、データそのものの性質やデータを取り扱う手法を研究する科学全般を指す言葉で、統計学、機械学習、データマイニング、可視化・・など、様々な分野を包括する概念です。
数値や文字(カテゴリ)として得られるデータを統計的手法や機械学習(近年の AI の技術ベース)などを用いて分析・処理することによって、世界に潜む様々な物事の関係(モデル)を見出す科学であるとも言えます。
関連する諸分野との関係を図で表すと以下のようになります。
GoogleImage:Data Science Machine Learning AI
これが正しい・・という図を書くことはできません。作図する人の立場や説明の手順によって、それぞれの包含関係は変わるので、ざっくり位置関係を把握すれば十分ではないかと思います。
データサイエンスにできること
- 判別:情報の判断・仕分け・検索、音声・画像の認識、異常検知など
- 予測:数値予測、ニーズ・意図予測、マッチングなど
- 実行:作業の自動化、表現生成、行動の最適化など
データサイエンスの限界
データからわかるのは過去から現在までことです。データの活用は、未来の予測や目標達成のための「最適化」には効果的かもしれませんが、生物の社会のような複雑な系の未来を予測することや「創発」的なデザインには限界があります。
人は未知のものにニーズを抱くことはありません。デザインを志すみなさんには、データサイエンスの威力を感じつつも、若干引きで眺める視点が必要です。
関連事項
一般にデータサイエンスの教科書では、データを扱う人の心構えとして、以下のような事項が記載されていますが、みなさんは、すでにソーシャルデザイン演習・応用演習、また学科サイトの日常的な運用において、このあたりは学習済みなので、この演習では省略します。
- 情報倫理
- 情報セキュリティー
- 著作権 と CreativeCommons・Copyleft について
Python 言語について
第8回から第14回まで、すべての学習体験に Python というプログラミング言語を使います。データサイエンスの世界では、スプレッドシートを用いた統計処理と並んで、Python言語による統計処理が主流となっており、インターネット検索でも、様々な手法を知ることができます。
- 詳細はこちら>Python
Google Colaboratoryについて
Python言語を使うには、パソコンに開発環境をインストールする方法もありますが、ここでは Python の学習環境として様々なテキストで紹介されている Google Colaboratory を使用します。
Google Colaboratory とは、Googleの仮想マシン上で動く Jupyter Notebook*1 をベースとした開発環境です。Googleアカウントがあれば、日常的に用いているブラウザから誰でも無料で利用できます。
https://colab.research.google.com
Google にアクセスしてログイン
- https://www.google.co.jp/ にアクセスして下さい。
- 画面右上のログインをクリックして、Googleのアカウントでログインします。
Colaboratoryにアクセス
- 公式サイトにアクセス
https://colab.research.google.com
- ファイル> ノートブックを新規作成
- Untitled0.ipynb というファイル名を変更 > 例:PythonBasics.ipynb
- コードセルが1つ表示されて、プログラムが書ける状態になっています。
Jupyter Notebook の概要
Jupyter Notebookには、コード(プログラム)を書くためのコードセルと、テキスト(ノート)を書くためのテキストセルの2つがあります。この2つのセルを使うことで、見出し・解説・プログラムを文字通り「ノート」のようにまとめることができます。
- コードを追加する場合は「+コード」をクリックします。
- 新たなコードセルが追加されるので、そこにプログラムを書きます。
- コードを実行する場合は「▶」をクリックします。
- コードセルの直下に結果が表示されます(変数の値は保持されています)。
- ノートを書く場合は「+テキスト」> テキストセルが追加されます。
- Markdown記法を用いて、見出しや箇条書き等のスタイルが使えます。
- セルの上下(処理の順序)は、セルに付随して表示されるアイコン「 ↑ ↓ 」を使って変更することができます。
- ノートは GoogleDrive の Colab Notebooksというフォルダに自動保存されるので安心です。
対話処理の初期体験
- コードセル(▶のボタンのある枠内)に、以下のように書いてみて下さい。1行目は「 5 x 3 の計算結果を a に代入する」という意味で、2行目は「 a の内容を表示する」という意味です。
a = 5 * 3 a
- ▶(実行)のクリックでプログラムが実行され、処理結果が表示されます。
15
- 「+コード」でコードセルを追加して、以下のように書いてみて下さい。
b = a *2 b
- 当該セルの▶のボタンをクリックすると処理結果が表示されます。なお、前のセルで定義した変数( a:15 )は、後のセルで使用できる前提です。
30
- と、こんな感じで、対話的に作業を進めることができます。
- マイドライブを確認してみて下さい。 Colab Notebooksというフォルダにノートが保存されていることが確認できると思います。
学科サイトにリンク掲載(その1)
上記のプログラムのノートを、学科サイトの個人ページからリンクして下さい。以下、手順です。
- 1. 自分のノートを開いた状態で、右上の「共有」をクリック
- 2. 共有設定を変更して、以下のように表示される状態にします。
このリンクを知っているインターネット上の全員が閲覧できます。
- 3. 「リンクをコピー」をクリックして、そのアドレスを、以下の形式で、学科サイトの「Jupyter Notebooks」の部分に掲載して下さい。
-[[Python Basics>https://colab.research.go・・=sharing]]
- 4. 以下のようになればOKです。
このようなファイルを作っておくと、今後ちょっとしたコードの動作確認を行うためのノートとして活用することができます。
付記1
Googleアカウントがあれば、誰でも無料で利用できますが・・
- 連続使用が12時間を経過すると対話がシャットダウンされます。
- 90分間アクセスがない場合もシャットダウンされます。
- シャットダウンされた場合、変数に記憶されたデータは初期化されます(次回ノートを開いた際は、最初のコードから順に処理することになります)。
- とは言っても、ノートに書かれたコードやテキストは GoogleDrive に保存されていますので、Pythonの学習目的での利用では問題ありません。
最初のプログラミング体験
モンテカルロ法で π の値を求める
円周率(π)を近似的に求めるプログラムを通して、Google Colaboratoryの使い方とPythonプログラムの書き方を体験してみましょう。
ノートブックの新規作成
- ブラウザ上の Google Colaboratory で ファイル> ノートブックを新規作成
- Untitled0.ipynb というファイル名を変更 > MonteCarloMethod.ipynb
サンプルコード
- テキストセルを追加して、ノートの冒頭にタイトルをつけましょう。
# モンテカルロ法による円周率の導出
- コードセルに以下のコードを書いて、実行してみましょう。
# ライブラリの読み込み import math import random # 初期化 n = 1000 cnt_in = 0 cnt_out = 0 # シミュレーション for i in range(n): # 0.0 - 1.0 のランダムな「雨粒」 x = random.random() y = random.random() # 4分円の中に落ちた数をカウント r = math.sqrt(x**2 + y**2) if r <= 1.0: cnt_in += 1 else: cnt_out += 1 # 円周率の近似値 Pi = cnt_in / n * 4 # 結果の表示 print("Num:", n) print("IN:", cnt_in) print("OUT:", cnt_out) print("Pi:", Pi)
- n の初期値を大きくしていくと、結果が 3.14 に近づくことを確認しましょう。計算資源に負担をかけることがないよう、n の値はほどほどに・・
- プログラムの解説をテキストセルにマークダウン記法で記載して、ノートを完成させましょう。
手法の解説
Wikimediacommons File:Montecarlo pi2.PNG
- 一辺の長さを r とする正方形の面積を S とし、その正方形の左下頂点を中心とする 半径rの4分円の面積を Q とすると
Q = π*r*r / 4 S = r*r よって、Q / S = ( π*r*r / 4 ) / ( r*r ) = π/4
- すなわち、以下の関係式が得られます。
π = Q / S * 4
- 正方形の「枠内」に一様な乱数を使って「雨を降らせる」と
正方形全体に降る雨粒の数:4分円の中に降る雨粒の数 ≒ S:Q
となり、雨粒の数が多くなれば、S:Q の比率に一致します。
- これを利用することで
π = 4分円の中に降る雨粒の数 / 正方形全体に降る雨粒の数 * 4
というかたちで、π の近似値を求めることができます。
学科サイトにリンク掲載(その2)
「モンテカルロ法で π の値を求める」プログラムのノートを、学科サイトの個人ページからリンクして下さい。以下、手順です。
- 1. 自分のノートを開いた状態で、右上の「共有」をクリック
- 2. 共有設定を変更して、以下のように表示される状態にします。
このリンクを知っているインターネット上の全員が閲覧できます。
- 3. 「リンクをコピー」をクリックして、そのアドレスを、以下の形式で、学科サイトの「Jupyter Notebooks」の部分に掲載して下さい。
-[[MonteCarloMethod>https://colab.research.go・・=sharing]]
- 4. 以下のようになればOKです。
https://design.kyusan-u.ac.jp/socialdesign/?JohnSmith/DataScience
付記2
今日の AI技術 もデータサイエンスも「大量のデータから最適解を見出す」という点では共通しています。これまで、数理的な問題解決には、解析的な方法で数式を解いて答えを出す・・という学び方をしてきたと思いますが、コンピュータが使える今日では「力ずくで最適解に近づく」ということが可能になりました。
数学の問題は、計算によって綺麗な整数解が得られるように作られていますが、現実の問題はそうではありません。で、実際のモノ作りの現場では、実用上「ミリの単位までの数字で十分」ということがあります。
今日の数理の世界では、コンピュータの登場によって従来とは異なる発想が可能になっている・・という事実を確認しておきましょう。
Python プログラミング入門
Pythonプログラミングの文法 について説明しはじめると、それだけで長期の学習期間が必要になってしまいます。ここでは、上記の事例体験を通してその概要を把握することからはじめましょう。
import <モジュール名>
既存のライブラリプログラムを利用するための下準備です。Python には、様々な既存の機能が「ライブラリ」というかたちで用意されています。例えば、乱数を発生する機能もその一つで、みなさんがその機能を実現させるためのコードを一から書く必要はありません。
import math # 数学関数を利用する場合に読み込みます。 import random # 乱数を利用する場合に読み込みます。
変数と代入
変数の活用と、代入処理はプログラミングの基本です。
n = 1000
- この例で n はデータ(数値や文字)を入れるための「器」として機能するもので、プログラミングの世界では一般に「変数」といいます。
- =記号は「等しい」という意味ではなく、右辺の内容を左辺の変数に代入することを意味します。
- ちなみに以下の記述は同意で、現在の x に 1 を加えて x を更新します。
x = x +1 x += 1
プログラム中にある cnt_in += 1 というのは、cnt_in という変数の値を1増やすことを意味するもので、このような処理を「カウント処理」と言います。
制御文
上記のプログラムでは if 文と for 文を利用していますが、プログラムの流れを制御するには、これに while 文 を加えた3つの文の書き方がわかっていれば、大半のことは可能になります。
if 文
判断結果(true / false)によって処理を分岐します。
if r <= 1.0: cnt_in += 1 else: cnt_out += 1
この例では、r が 1.0以下の場合は、cnt_in が1つ増え、そうでない場合は、cnt_out が一つ増えます。
for 文
一定回数処理を繰り返す場合に利用するものです。
for i in range(1000): # ここに処理内容を記述
この例では i の値が 0 から 999 まで「処理」が1000回繰り返されます。
while 文
while 文は条件が真の間処理を繰り返します。
while n < 100: # ここに処理内容を記述
この例では n の値が 100未満の場合に「処理」が繰り返されます。
range関数 について
range 関数は開始値から終了値(未満)までの数値を要素として持つオブジェクトで、繰り返し処理では頻繁に利用されます。 range(start, stop[, step])
- range(5) > 0 1 2 3 4
- range(0, 5) > 0 1 2 3 4
- range(1,10) > 1 2 3 4 5 6 7 8 9
- range(0, 10, 2) > 0 2 4 6 8
インデントについて
Python ではインデント(字下げ)によってブロックを表現します。
- if 文や for 文など、同一レベルのインデントを持つ複合文(複数の文)を処理対象のブロックとして扱います。
- インデントがきちんととられていないと文法エラーになる・・という仕様によって、プログラムは必然的に視覚的に見やすいものになります。
- 他の言語では、制御ブロックの終端の明記(「 } 」 など)が必要ですが、Pythonの場合これが不要なので、コードはシンプルになります。
コメント
Python では # 記号以降はコメントとして扱われます。プログラム上で文の機能を一時的に無効にする(コメントアウト)場合にも利用可能です。
- インラインコメント
#から行末までは実行時に無視されます。#より前のコードは有効です。a = 1 # comment
- ブロックコメント(行全体)
行頭に#を書くと、行全体コメントとなり、実行時には無視されます。a = 1 # b = 2 # c = 3 d = 4
本日作成した2つのノートについては、各自の関心に応じてコードやコメントを追記してください。
APPENDIX
皆さんは、数学の世界を分類する代数 幾何 解析という用語を覚えていますか。学問領域を完全に線引きして区別することはできないのですが、それでも分類用語を知っておくことは「今、自分は何を学んでいるのか」を理解する一助となります。データサイエンスの世界も同様、様々な 関連用語 をざっくりと把握するだけでも、全体像が把握しやすくなります。
以下の区分も、知っていると世界がさらに見えやすくなります。
決定論と確率論
数理の世界には、決定論的なアプローチと、確率論的なアプローチの2つがあります。たばこの煙に例えると、たばこの先から一直線に上昇している部分の粒子の位置は、時刻 t を変数とした数式で決定論的に記述されますが、天井に拡散した粒子のふるまいは、確率論的にしか記述できません。ちなみに、その中間にある煙の「乱れそめ」の部分は「カオス理論」の対象となりあす。
- 「落下する物体の位置」のように数式で記述できる事象は決定論の対象
- 「臨床試験の結果」のように統計的に扱う事象は確率論の対象
線形と非線形
- 比例関係にあるものが「線形」
線形な漸化式の例: \( X_{n+1} = a \cdot X_n + b \) - 比例関係にないもの、例えば、一旦下がってまた上がるようなふるまい、あるいは、予測のつかないふるまいをするものが「非線形」
非線形な漸化式の例: \( X_{n+1} = a \cdot X_n(1 - X_n) \)- 0 < a < 1 のとき:一定値 X = 0 に収束
- 1 < a < 3 のとき:一定値 1 - 1 / a に収束
- 3 < a < 3.57… のとき:振動
- 3.57… < a のとき:予測不能な複雑な動き(カオス的領域)
- 実際の計算とグラフ化:JupyterNotebook
- ちなみに、生き物の成長は非線形的で最後は飽和状態