[Work/Class/Python3の基礎とデータ処理]

アート系学生のためのPython3の基礎とデータ処理

この授業の目的

アート系学生が作品などにビッグデータを使いたい場合を想定して,内部計算は抜きにして「データを使う」ための,プログラム言語Pythonを使ったデータ処理の方法と統計の基礎についてを学ぶ.

「プログラムなんか書かなくても,Excelでポチポチやればいいじゃない」と思うかもしれないが,アート作品などにビッグデータを使いたい場合,そもそもデータが大量である.いちいちExcelで開いてちょこちょこ操作してというのを,1万Excelシート分も繰り返すのはとてもできない.

また,音楽の場合は,一つの音符ごとに計算をしなければならなかったりなど,本当に大量のデータを処理する必要がある.

「定型処理をまとめて繰り返す」のはプログラミングの得意技である.そこでプログラミングも一緒に学ぶ.

概要

近年PythonがそれまでのMATLABやR言語に代わって,データ処理に使われることが多くなった.また海外では教育用言語として90年代末から普及が始まり,現在様々なフレームワークが開発されているWebサーバ側をはじめとしたサーバ用途と,通常のデスクトップのスクリプト処理用途,両用のLL(Lightweight Language)として使われている.

Pythonの特徴として「Python本体はスクリプト言語だが,ライブラリをC言語で実装しPythonにAPIを用意することで,高速に実行可能」という点がある.近年ではデータ解析や機械学習などで頻繁にPythonが使われているが,これはこの「Cで書かれた高速ライブラリをPythonで実行」というスタイルに依るものである.

現在のPythonは大きく分けてVer.2.x系とVer.3系の2つが使われているが,本授業ではPython3を対象とする.(OSX標準のPythonは2.7なので,授業の下準備としてAnacondaをインストールしておくこと)

コンテンツ

  1. Pythonの基本と配列(list)の取り扱い
  2. 関数とクラスの定義
  3. 文字列の取り扱い
  4. lambda式,高階関数,内包表記
  5. HTMLParserクラスによるWebページの取得と分析
  6. Numpyと配列(array)とmatplotlib
  7. CSVの取得とPlot
  8. CSVデータからの相関係数の算出
  9. CSVデータからの単純線形回帰分析
  10. CSVデータからのt検定
  11. CSVデータからの分散分析と多重比較
  12. CSVデータからの重回帰分析と因果関係
  13. CSVデータからの主成分分析
  14. CSVデータからの線形二項分類
  15. CSVデータからの因子分析

授業の下準備

Windows

Anacondaを使う場合

Anacondaは現在標準となっているPythonのデータアナリシスディストリビューションである.こちらを使うのが一番楽.

Anacondaダウンロードページから,「64-Bit Graphical Installer」をダウンロードする.

インストール画面1

「Next」

インストール画面2

「I Agree」

インストール画面3

「All Users」の方が実は楽.管理者パスワードがわからないときには「Just Me」

インストール画面4

インストール場所に半角スペースなどが含まれているとエラーになるので,そのまま.もしくはCドライブ直下にするなど.

インストール画面5

上の方(システムパスに追加)は,システム的に混乱する可能性があるので外して置いた方がいい.

逆に下はVisual Studio等のWindowsコンパイラのみに設定を与えるもので,GPUの利用などを考えているなら,チェックを入れておく.(基本的にチェックを入れて置いて大丈夫)

インストール画面6

インストールが進む.

インストール画面7

終わったら「Next」

インストール画面8

Visual Studio Codeというエディタを追加インストールするか訊かれる.Visual Studio Communityが既に入っていたり,VS Codeを使わないなら「Skip」

インストール画面9

「Finish」

WindowsでMSYSを使う場合

CやC++のツールと連携させたい場合のみ(VSのコンパイラが必要なCUDA系は除く),Cコンパイラとセットになるこちらを使う.MSYSを使ってインストールしたPythonは文字コードがWindowsのもの縛りになるので注意.データ分析ならAnacondaの方が使い勝手は良い.

まっさらな状態からのMSYS2+GCCでWindows上にC言語とC++の環境を整えるの通りにコンパイラ環境を整える.

その後「MSYS2 MSYS」ショートカットで起動する端末エミュレータから,

$ pacman -S mingw64/mingw-w64-x86_64-python3
$ pacman -S mingw64/mingw-w64-x86_64-python3-numpy
$ pacman -S mingw64/mingw-w64-x86_64-python3-scipy
$ pacman -S mingw64/mingw-w64-x86_64-python3-matplotlib
$ pacman -S mingw64/mingw-w64-x86_64-python3-pandas

の五つのパッケージをインストールしておく.依存関係にある必要なライブラリ(主にQt関係)も全て一緒に入ってくれる.(64bit Windowsの場合)

Pythonの実行時には,MSYS2 MSYSから,

 $ /mingw64/bin/python3 MyPythonCode.py

と実行する.

OSX, macOS

OSX,macOSはPython本体とnumpy, scipy, matplotlibは標準で入っているのだが,バージョンが2.7である.HomebrewなどでPython3を入れるという方法もあるが,Homebrewでインストールを行うとシステム全体に影響を及ぼし,元々入っていたPython2.7とごちゃ混ぜになりシステムにダメージを与える可能性が高い.

そこでデータ処理に特化したPythonのパッケージであるAnacondaを「HDDのアプリケーション」以下にインストールして使う.Anacondaは/Applications/anacondaフォルダ内で独立したファイルツリーを持つ.

Python3を使いたい場合はAnacondaのPythonを明示的に実行してやる形にすれば,通常のシステムの処理に必要なPythonは元々システムに入っていた2.7がそのまま使われることになる.この方法で,システムに必要なPython2.7と,プログラミング言語として使いたいPython3系を,安全に同居させることができる.

Anacondaのダウンロードページの「Download for macOS」から「Python 3.6 version」の「Graphical Installer」をダウンロードする.

ダウンロードされた.pkgを実行して,ライセンスに同意し,「インストール先を変更」して「特定のディスク」の「アプリケーション」フォルダにインストールする.そうするとマシンの「/Applications」に「anaconda」フォルダ内にanacondaがインストールされ,Terminal.appから実行するPythonはこの中のPythonを使うように設定される.

Anaconda3のインストールパッケージ一覧の画面 Anaconda3のライセンス表示 Anaconda3のライセンス同意 Anaconda3「インストール先を変更」 Anaconda3「特定のディスクにインストール」を選択 Anaconda3メインのシステムHDDが選択されていることを確認し「フォルダを選択」 Anaconda3 フォルダを選択.ハードディスク直下の「アプリケーション」 Anaconda3 選択終了「続ける」

「このユーザがTerminal.appを開いた時はAnacondaのPythonを使う」という設定が記述されている~/.bash_profileからexport PATH=/Applications/anaconda...という行を削除しておき,Python3を実行する時は「Terminal.app」から,

 $ /Applications/anaconda/bin/python MyPythonCode.py

と「Anacondaのpython」を明示的に実行するようにしておくと,システム的に混乱が起きない.

OSXのPython2.7には,この授業の目的である基本的なデータ解析で使うnumpy, matplotlib, scipyも標準で含まれているのだが,matplotlibが使うGUI部品(システム標準はおそらくTk, Anacondaや上記WindowsのMSYS2環境ではQt5)や,リストを使ったイテレータの言語仕様などが違うため,Python2.7と3で互換性がないプログラムもある.

Anacondaの環境を作って実行環境のターミナルを開く

Pythonはライブラリがたくさんあり,衝突するものもある.Anacondaは複数の「環境environment」を作り,「環境」ごとにライブラリをインストールすることができるため,ライブラリの衝突を防ぐことができる.

ここでは授業用の環境「for_class」を作ってみる.

環境を作る

「Environment」タブにして,下の「Create」ボタン.

環境の名前をつける

環境の名前(ここでは"for_class")をつけて,「Create」.

環境が作られている

環境が作られている.

再生ボタンからOpen Terminal

環境の作成が終わったら,作成した環境の再生ボタンから「Open Terminal」.

Terminalが開いて実行できる

Terminalが開いて実行できるようになるので,プログラムが置いてあるフォルダにcdコマンドで移動して,

python 実行したいpythonプログラムファイル.py

で実行できるようになる.

Anaconda-Navigatorでの追加ライブラリのインストール

AnacondaはGUIでライブラリが追加インストールできる.ここでは例としてTwitterのAPIを使うために必要なOauth認証に必要なrequests_oauthlibをインストールする.

conda-forgeというレポジトリ(AnacondaではChannelと呼称する)がよくメンテされているようなので,それを追加して,Anacondaから使えるようにする.

まず管理者権限をもつユーザでAnaconda-Navigatorを起動する.

管理者権限を持つユーザでAnaconda-Navigatorを起動する

「Environment」(環境)を選択→「当該プロジェクトで使っているAnacondaの環境(ここではrootだが,基本的には前述の通りプロジェクトごとに環境を作る)」が選択されていることを確認→「Channels」ボタンを押す.

環境を選択しChannelを追加する

ミニウィンドウが開くので「Add」

ミニウィンドウが開く

新たなフィールドに「conda-forge」チャンネルを入力.

新たなフィールドに「conda-forge」チャンネルを入力

追加したら「Update channels」

「Update channels」

もとの画面に戻るので「Update Index」すると,下のバーでIndexをアップデートしている進行状況が表示される.

「Update Index」

一番左のプルダウンメニューから「Not Installed」(まだインストールされていないライブラリの検索)→一番右のボックスに「ライブラリの名前」(ここでは「requests-oauthlib」)を入力すると,下のフィールドに検索結果が出てくる.

「Not Installed」→「ライブラリの名前入力」→検索結果がでる

ライブラリにチェックを入れて,「Apply」

ライブラリにチェックを入れて「Apply」

進行状況のミニウィンドウが出る.

進行状況のミニウィンドウ

入れたいライブラリに必要なライブラリ(依存関係と呼称する)が全て並んで出てくるので「Apply」.

依存関係の表示

プルダウンメニューを「Installed」にして,インストールされていることを確認する.

「Installed」で確認.

以上である.Environment→rootの再生マークからターミナルを呼び出しても使えるし,root環境に入れておけば,通常のターミナルから/Applications/anaconda/bin/python3でPythonインタプリタを呼び出した時もライブラリが使える.

Anacondaで環境をたくさん作り,使用するライブラリを切り替えることもできる.


[Work/Class/Python3の基礎とデータ処理/libraries_for_data]

CSVデータからの因子分析

本項でもGoogle Colaboratoryを使用する.(もちろんファイル読み込みの部分以外はJupyter Notebookでもよいし,一気にPythonのソースコードをまとめて書いて実行しても問題はない)

今回も「気温以外のデータ」を使って,さらに線形分類の時よりも観測データを多くして,太平洋側の都市と日本海側の都市を比較してみる.

例によって,気象庁オープンデータのページから,

都市の選択

都市は,秋田県→秋田市,岩手県→宮古市,山形県→酒田市,宮城県→石巻市,の順で,それぞれ選択.

気温は選択しない

今回も「気温以外のデータ」なので,気温は選択しない.

降水量

月別の値を選択し,降水量の月合計,

日照時間

日照時間の月合計,

風速

月平均風速,

湿度

湿度/気圧の月平均蒸気圧,を選択し,

雲量

平均雲量,を選択し,

期間の選択

1977年〜2018年の「1月」のデータをダウンロードする.

表示オプション

表示オプションはデフォルト.地点の順番と,項目の順番を確認すること.

実際のCSVファイルは,この通りである

因子分析

因子分析とは,観測された変数の「原因となっている何らかの変数」が隠れて存在する(潜在変数)と考え,その変数を探す分析のことである.

因子分析の概念

例えば太平洋側の都市と日本海側の都市では冬の気候に大きな違いがあるが,観測データには何らかの「観測可能なデータの違い」があり,その観測可能なデータから「原因」である「気候の違い」を,「なるべく少ない要素」で表現できるように探すことが目的である.

「どちらか側の海」というのは根本的な原因であるダミー変数だが,ダミー変数を直接出せるほど因子分析は優れてはいないので,潜在変数はスカラ値であることがほとんどである.

次元圧縮としても使えてしまうため,主成分分析と混同されることがあるが,因子分析と主成分分析は考え方が逆である.

因子分析は「観測可能なデータから,観測データの原因となっている少数の要素(因子,潜在変数)があると仮定して,それを推測する」

主成分分析は「観測可能なデータから,少数で多くの観測データを上手く表現することができる少数の合成変数を作成する」

である.

「共通因子」と「独自因子」

実際には「共通因子」に,どのぐらい共通因子が占める割合が大きいかの「因子負荷量」を掛け,その変数の独自の要素である「独自因子」を足したものが,観測データである.

因子分析の特徴として,因子の数がいくつあるかを与えなければならない.因子分析の手法は多く提唱されており色々な組み合わせがあるが,「回転法」が直交法 - Varimax回転の時に因子数の指標となるのが「因子負荷量」である.

因子負荷量は,その仮定した因子がどのぐらい各観測変数に影響を与えているか(正確には各観測変数と各因子の相関係数,つまり連動して動いているか)を見るもので,因子負荷量が各変数において各因子間の違いが大きければ大きいほど,その仮定した因子数は適切である,と考える.(相関係数なので-1から1の間に収まる.0の時は「観測変数とその因子は全く連動していない」ということになる.)

具体的には,「各変数の各因子に対する因子負荷量を見て,一つの因子のみ1(もしくは-1)に近く,他の因子は0に近い」場合には,その因子の選定は適切である,となる.

コード例

1つ目のセル.いつもと同じくCSVをColabへ読み込む.

from google.colab import files
uploaded = files.upload()
CSVのアップロード

2つ目のセル.品質情報などの列が不要なので削除.

# CSVを整えてDataFrameにする
import numpy as np
import pandas as pd
from pandas import Series, DataFrame

df = pd.read_csv('tohoku-huge-data.csv', encoding='SHIFT-JIS', header=1)

# 抜き出す
for a_column in ['秋田', '宮古', '酒田', '石巻']:
  # それぞれ
  # 降水量の合計(mm),降水量の合計(mm),降水量の合計(mm),降水量の合計(mm),日照時間(時間),日照時間(時間),日照時間(時間),日照時間(時間),平均風速(m/s),平均風速(m/s),平均風速(m/s),平均湿度(%),平均湿度(%),平均湿度(%),平均雲量(10分比),平均雲量(10分比),平均雲量(10分比)
  # で並んでいて,一つの地点につき,
  # (空),現象なし情報,品質情報,均質番号,(空),現象なし情報,品質情報,均質番号,(空),品質情報,均質番号,(空),品質情報,均質番号,(空),品質情報,均質番号
  # の順に並んでいる
  # の(空)以外の場所が余計なので,削除
  for i in range(1, 17, 1):
    # 落とす列の列番号を指定(0~)
    if i in [1, 2, 3, 5, 6, 7, 9, 10, 12, 13, 15, 16]:
      df = df.drop(a_column + '.' + str(i), axis=1)

df = df.drop(1)

# DataFrameの中に欠損値がある場合は,0.0を代わりに入れておく
df = df.fillna(0)
df.head()

2つ目のセルの結果は以下の通り

不必要な列の削除

3つ目のセル.都市名,ダミー変数を入れて,各都市のデータの列を繋いで,一つのデータフレームにする.

# グラフ表示するためにローマ字ラベルを作っておく
#np.arrayはenumerateでは回せないので, listのままにしておく
city_label_list = (['Akita', 'Miyako', 'Sakata', 'Ishinomaki'])

# その要素の有無で0と1の2値で表現される変数を「ダミー変数」と呼ぶ
# 0, 1, 2, 3...などの状態が複数あり,かつその数字が大小の意味を持ってない場合は,カテゴリ変数と呼ぶ
# カテゴリ変数は判別問題などで扱えないので,
# カテゴリ変数で表現している内容を,要素に分けて,要素の有無で表現,つまり複数のダミー変数に直す

# 今回は太平洋側と日本海側の2値なので,ダミー変数:太平洋側が0, 日本海側が1
sea_side_label = np.array([1, 0, 1, 0])

# 選んだ都市の
# precipitation: 1月の降水量
# daylight_hours: 1月の日照時間
# average_wind_speed: 1月の平均風速
# average_humidity: 1月の平均湿度
# amounts_clouds: 1月の平均雲量

# として,それぞれ42年分*太平洋側,日本海側の2年ずつを,1つ配列としてくっつける

# 42年分のラベルを繋げておく (42年分*全部の都市)
city_label_in_repeat = np.repeat(city_label_list, 42)
sea_side_label_in_repeat = np.repeat(sea_side_label, 42)
print(sea_side_label_in_repeat.shape)

# データをつなげる
# まず最初に空の配列を作っておいて,
precipitation = np.array([], dtype=np.float)
daylight_hours = np.array([], dtype=np.float)
average_wind_speed = np.array([], dtype=np.float)
average_humidity = np.array([], dtype=np.float)
amounts_clouds = np.array([], dtype=np.float)

# 選んだ都市の,1月の平均風速,1月の日照時間,1月の平均湿度,1月の降水量を
# それぞれ1つの配列につなぐ
for i, a_city in enumerate(city_label_list): 
  precipitation = np.concatenate((precipitation, df.iloc[1:, 1+(i*5)]))
  daylight_hours = np.concatenate((daylight_hours, df.iloc[1:, 1+(i*5)+1]))
  average_wind_speed = np.concatenate((average_wind_speed, df.iloc[1:, 1+(i*5)+2]))
  average_humidity = np.concatenate((average_humidity, df.iloc[1:, 1+(i*5)+3]))
  amounts_clouds = np.concatenate((amounts_clouds, df.iloc[1:, 1+(i*5)+4]))

# vstackで重ねて,配列の次元を入れ替えて,DataFrameにしておく
df_sea_side_city = pd.DataFrame(np.vstack([city_label_in_repeat, sea_side_label_in_repeat, precipitation.astype(np.float), daylight_hours.astype(np.float), average_wind_speed.astype(np.float), average_humidity.astype(np.float), amounts_clouds.astype(np.float)]).transpose())
# DataFrameの列名をつけておく
df_sea_side_city = df_sea_side_city.rename(columns={0:'都市名', 1:'太平洋側日本海側ダミー変数', 2:'1月の降水量', 3:'1月の日照時間', 4:'1月の平均風速', 5:'1月の平均湿度', 6:'1月の平均雲量'})
# DataFrameの冒頭を確認
df_sea_side_city.head()

3つ目のセルの結果は以下の通り

都市名とダミー変数を入れる.

4つ目のセル.因子分析のパッケージをインストールする.

# 高機能因子分析パッケージ
!pip install factor-analyzer

5つ目のセル.変数の数が5つなので,とりあえず因子数4で因数分解をして,因子負荷量を算出してみる.

因子負荷量は「その因子が変数にどれだけ影響を与えているか」の値で,

# 因子分析
# 観測されたデータ(説明変数)が大量の次元を持ち,
# かつ説明変数感の相関係数が高い場合,
# 因果のルート側に数が少ない潜在変数Latent Variable(因子 Factor)が存在することにより,
# 観測データ = 説明変数が生み出されているという考え方

# 回帰や分類の前処理に使う場合の目的は,次元圧縮なので主成分分析と同じに思えるが,
# 因子分析は,観測データ(説明変数)を潜在変数の組み合わせによる合成量として捉え,その潜在変数を求める
# つまり考え方は主成分分析の逆である.

# 次元圧縮を目的としている場合,次元数を与えられるのは有利だが,
# 機械学習目的ではなく,分析目的の場合,
# 潜在変数の数,すなわち次元数を最初に与えなければならないことは,欠点でもある

# 次元圧縮した状態でグラフ等をみて,これは何の因子なのか,因子が妥当かどうか,を
# 分析者が検討しなければならい

from factor_analyzer import FactorAnalyzer
import seaborn as sns

# 何因子だと考えるか
# とりあえず最初は多めに
n_factors=4


fa_model = FactorAnalyzer(n_factors=n_factors, method='ml', rotation='varimax', impute='drop')
# method: 使用する手法
# minres (ミンレス法)
# ml (最尤法)
# principal(主因子法)

# rotation 回転法
# varimax (バリマックス回転) 直交法
# promax (プロマックス回転) 斜交法
# oblique (斜め回転)

# impute 欠損地をどうするか
# drop: 削除

# データにフィットさせる
# 都市名と太平洋側に本会話がダミー変数は使わない
fa_model.fit(df_sea_side_city.iloc[:, 2:])

# 因子負荷量はloadings_プロパティで読み出せるので,結果のDataFrameを作る
# 因子負荷量:因子と観測変数の間の関係性の強弱のこと

# わかりやすく列名を,元のデータフレームから持ってきて挿入する
# 0列目はラベルなので,1列目から
columns_name_array = df_sea_side_city.columns[2:]
# 行名(index)として,この配列を用いて,DataFrameを作る
df_result = pd.DataFrame(fa_model.loadings_, index=columns_name_array)

# 因子負荷量の行列を色分けして表示
cm = sns.light_palette('red', as_cmap=True
# セルの最後に実行すること.df.head()と同じく,printしても色分けされない
df_result.style.background_gradient(cmap=cm)

5つ目のセルの結果は以下の通り.

因子数4の因子分析の結果の因子負荷量

Varimax回転をPromax回転に変えるなどして,回転方法によって結果が変わることを確かめる.(ただしPromax回転の場合因子負荷量に意味はないので参考程度に)

とりあえず結果例ではVarimax回転を使っている.1つの観測変数(パラメータ)に対する因子負荷量が各因子間で大きく差があるので因子数の設定は悪くはないようだが,観測変数5種類に対して因子数4は多い.さらに減らしてみる.

逆に,1つのパラメータの因子負荷量が因子間で大きく違わない場合は,うまく共通因子にまとめられなかったことを示している.

6つ目のセル.Varimax回転を使っている場合,累積寄与率を出すことができる.寄与率は主成分分析の時と同じく,「設定した因子で観測データをどのぐらい説明できるか」の基準である.6つ目のセルではこの累積を算出する.

# Varimax回転の場合の因子数4での累積寄与率
factor_index = list([])
for i in range(n_factors):
  factor_index.append('因子' + str(i))
df_cumulative_variance = pd.DataFrame(fa_model.get_factor_variance()[2], index=factor_index)
df_cumulative_variance.style.background_gradient(cmap=cm)

6つ目のセルの出力結果は以下の通り

因子数4の累積寄与率

Varimax回転の場合は,累積寄与率を参照することができる.(Promax回転場合は,累積寄与率は出ても値に意味はない)

3因子で全体の74.7%,4因子で全体の77.2%を「説明することができている」

因子3の寄与率が高くないので,やはり因子数が4の設定では多すぎるように思える.

7つ目のセルでは因子数4の時の散布図を描く.因子数4次元なのでそれぞれの因子を軸にとると,3*2で6つのグラフを描くことができる.

# 因子分析の結果を使って,
# 観測された元々の説明変数の値を潜在変数の値に変換する
factors_df = pd.DataFrame(fa_model.transform(df_sea_side_city.iloc[:, 2:]))
num_of_row = df_sea_side_city.values.shape[0]

# 潜在変数の値をプロットしてみる
akita = list([])
miyako = list([])
sakata = list([])
kamaishi = list([])
for i in range(num_of_row):
  if df_sea_side_city.values[i][0] == 'Akita':
    akita.append(factors_df.iloc[i, :])
  elif df_sea_side_city.values[i][0] == 'Miyako':
    miyako.append(factors_df.iloc[i, :])
  elif df_sea_side_city.values[i][0] == 'Sakata':
    sakata.append(factors_df.iloc[i, :])
  else:
    kamaishi.append(factors_df.iloc[i, :])

df_akita = pd.DataFrame(akita)
df_miyako = pd.DataFrame(miyako)
df_sakata = pd.DataFrame(sakata)
df_kamaishi = pd.DataFrame(kamaishi)

import matplotlib.pyplot as plt

plt.scatter(df_akita.iloc[:, 0], df_akita.iloc[:, 1], label='Akita')
plt.scatter(df_sakata.iloc[:, 0], df_sakata.iloc[:, 1], label='Sakata')
plt.scatter(df_miyako.iloc[:, 0], df_miyako.iloc[:, 1], label='Miyako')
plt.scatter(df_kamaishi.iloc[:, 0], df_kamaishi.iloc[:, 1], label='Kamaishi')

plt.xlabel('Factor0')
plt.ylabel('Factor1')
plt.legend()
plt.show()

plt.scatter(df_akita.iloc[:, 0], df_akita.iloc[:, 2], label='Akita')
plt.scatter(df_sakata.iloc[:, 0], df_sakata.iloc[:, 2], label='Sakata')
plt.scatter(df_miyako.iloc[:, 0], df_miyako.iloc[:, 2], label='Miyako')
plt.scatter(df_kamaishi.iloc[:, 0], df_kamaishi.iloc[:, 2], label='Kamaishi')

plt.xlabel('Factor0')
plt.ylabel('Factor2')
plt.legend()
plt.show()

plt.scatter(df_akita.iloc[:, 0], df_akita.iloc[:, 3], label='Akita')
plt.scatter(df_sakata.iloc[:, 0], df_sakata.iloc[:, 3], label='Sakata')
plt.scatter(df_miyako.iloc[:, 0], df_miyako.iloc[:, 3], label='Miyako')
plt.scatter(df_kamaishi.iloc[:, 0], df_kamaishi.iloc[:, 3], label='Kamaishi')

plt.xlabel('Factor0')
plt.ylabel('Factor1')
plt.legend()
plt.show()

plt.scatter(df_akita.iloc[:, 1], df_akita.iloc[:, 2], label='Akita')
plt.scatter(df_sakata.iloc[:, 1], df_sakata.iloc[:, 2], label='Sakata')
plt.scatter(df_miyako.iloc[:, 1], df_miyako.iloc[:, 2], label='Miyako')
plt.scatter(df_kamaishi.iloc[:, 1], df_kamaishi.iloc[:, 2], label='Kamaishi')

plt.xlabel('Factor1')
plt.ylabel('Factor2')
plt.legend()
plt.show()

plt.scatter(df_akita.iloc[:, 1], df_akita.iloc[:, 3], label='Akita')
plt.scatter(df_sakata.iloc[:, 1], df_sakata.iloc[:, 3], label='Sakata')
plt.scatter(df_miyako.iloc[:, 1], df_miyako.iloc[:, 3], label='Miyako')
plt.scatter(df_kamaishi.iloc[:, 1], df_kamaishi.iloc[:, 3], label='Kamaishi')

plt.xlabel('Factor1')
plt.ylabel('Factor3')
plt.legend()
plt.show()

plt.scatter(df_akita.iloc[:, 2], df_akita.iloc[:, 3], label='Akita')
plt.scatter(df_sakata.iloc[:, 2], df_sakata.iloc[:, 3], label='Sakata')
plt.scatter(df_miyako.iloc[:, 2], df_miyako.iloc[:, 3], label='Miyako')
plt.scatter(df_kamaishi.iloc[:, 2], df_kamaishi.iloc[:, 3], label='Kamaishi')

plt.xlabel('Factor2')
plt.ylabel('Factor3')
plt.legend()
plt.show()
因子0と因子1を取った時の散布図 因子0と因子2を取った時の散布図 因子0と因子3を取った時の散布図 因子1と因子2を取った時の散布図 因子1と因子3を取った時の散布図 因子2と因子3を取った時の散布図

この散布図を見ると,因子1-2の散布図,因子1-3の両方で太平洋側と日本海側を直線で分けられるように見える,因子負荷量を考えると,もっと因子数が少ない方がいいかもしれない.そこで因子数3と2についてもまったく同じように行っていく.

8つ目のセル.因子数3に設定して,まったく同じように因子分析を行い,因子負荷量を出す.

# 因子数3
n_factors=3

fa_model = FactorAnalyzer(n_factors=n_factors, method='ml', rotation='varimax', impute='drop')
fa_model.fit(df_sea_side_city.iloc[:, 2:])

# わかりやすく列名を,元のデータフレームから持ってきて挿入する
# 0列目はラベルなので,1列目から
columns_name_array = df_sea_side_city.columns[2:]
# 行名(index)として,この配列を用いて,DataFrameを作る
df_result = pd.DataFrame(fa_model.loadings_, index=columns_name_array)

# 因子負荷量の行列を色分けして表示
cm = sns.light_palette('red', as_cmap=True)
# セルの最後に実行すること.df.head()と同じく,printしても色分けされない
df_result.style.background_gradient(cmap=cm)

8つ目のセルの結果は以下の通り.

因子数3に設定した時の因子負荷量

日照時間の因子負荷量の因子間の違いが,因子0と因子1間で0.07, 因子1と因子2間で0.08と,非常に小さい.これは因子数3では因子分析がうまくいかなかったことを示している.

9つ目のセルでは,一応累積寄与率も出してみる.(前述のようにVarimax回転の時に有効.Promax回転の時は無効)

# Varimax回転の時の因子数3での累積寄与率
# Varimax回転の場合は,累積寄与率を参照することができる.
factor_index = list([])
for i in range(n_factors):
  factor_index.append('因子' + str(i))
df_cumulative_variance = pd.DataFrame(fa_model.get_factor_variance()[2], index=factor_index)
df_cumulative_variance.style.background_gradient(cmap=cm)

9つ目のセルの実行結果は以下の通り.

因子数3に設定した時の累積寄与率

3因子の累積寄与率が84.9%なので,因子数3で因子分析を行った方が全体をうまく説明できていることになるが,因子負荷量の差が小さいことを考えると,総合的にはよくない.

10個目のセルは因子数2に設定して,まったく同じように,因子分析を行い,因子負荷量を出している.

# 因子数2
n_factors=2

fa_model = FactorAnalyzer(n_factors=n_factors, method='ml', rotation='varimax', impute='drop')
fa_model.fit(df_sea_side_city.iloc[:, 2:])

# わかりやすく列名を,元のデータフレームから持ってきて挿入する
# 0列目はラベルなので,1列目から
columns_name_array = df_sea_side_city.columns[2:]
# 行名(index)として,この配列を用いて,DataFrameを作る
df_result = pd.DataFrame(fa_model.loadings_, index=columns_name_array)

# 因子負荷量の行列を色分けして表示
cm = sns.light_palette('red', as_cmap=True)
# セルの最後に実行すること.df.head()と同じく,printしても色分けされない
df_result.style.background_gradient(cmap=cm)

10個目のセルの実行結果は以下の通り.

因子数2に設定した時の因子負荷量

因子数2の時,因子負荷量が因子間でそれなりに大きく離れている.降水量,日照時間,雲量は因子0に,風速と湿度は因子1にそれぞれ大きな影響を受けている.

因子数を3以下にする場合因子数2が適切っぽい.確かめるために散布図を描いてみる.

11個目のセルでは因子数2の時の散布図を描く.因子数2なので2次元グラフ1つ.

# 因子分析の結果を使って,
# 観測された元々の説明変数の値を潜在変数の値に変換する
factors_df = pd.DataFrame(fa_model.transform(df_sea_side_city.iloc[:, 2:]))
num_of_row = df_sea_side_city.values.shape[0]

# 潜在変数の値をプロットしてみる
akita = list([])
miyako = list([])
sakata = list([])
kamaishi = list([])
for i in range(num_of_row):
  if df_sea_side_city.values[i][0] == 'Akita':
    akita.append(factors_df.iloc[i, :])
  elif df_sea_side_city.values[i][0] == 'Miyako':
    miyako.append(factors_df.iloc[i, :])
  elif df_sea_side_city.values[i][0] == 'Sakata':
    sakata.append(factors_df.iloc[i, :])
  else:
    kamaishi.append(factors_df.iloc[i, :])

df_akita = pd.DataFrame(akita)
df_miyako = pd.DataFrame(miyako)
df_sakata = pd.DataFrame(sakata)
df_kamaishi = pd.DataFrame(kamaishi)

import matplotlib.pyplot as plt

plt.scatter(df_akita.iloc[:, 0], df_akita.iloc[:, 1], label='Akita')
plt.scatter(df_sakata.iloc[:, 0], df_sakata.iloc[:, 1], label='Sakata')
plt.scatter(df_miyako.iloc[:, 0], df_miyako.iloc[:, 1], label='Miyako')
plt.scatter(df_kamaishi.iloc[:, 0], df_kamaishi.iloc[:, 1], label='Kamaishi')

plt.xlabel('Factor0')
plt.ylabel('Factor1')
plt.legend()
plt.show()

11個目のセルの実行結果は以下の通り.

因子数2に設定した時の潜在変数の散布図

因子数2だと日本海側と太平洋側で直線分離できるので,とりあえずこれで因子に名前を付けることにする.

因子1は平均風速と湿度に正の大きな影響与えている.かつ風速の方が影響が大きい.これは「荒天度」ということができるだろう.

では「降水量」「日照時間」「雲量」に影響を大きく与えている因子0にはどのような名前をつければよいだろうか.日照時間は負の影響であることに注目して名前を付けてみよう.

12個目のセルは以下の通りである.因子数2の時の「共通性」,つまり各観測変数がどれだけ共通因子に影響を受けているかを出す.

# 共通性
# 共通性とは,観測可能な変数における共通因子が占める割合のこと.
# これが低くなると独自因子の割合が多くなる.
# つまり共通因子とどれだけ連動しているかの値を見ることができる
df_communalities = pd.DataFrame(fa_model.get_communalities(), index=columns_name_array)
df_communalities.style.background_gradient(cmap=cm)

12個目のセルの実行結果は以下の通り.

因子数2に設定した時の共通性

日照時間と風速の値が大きいので,日照時間は因子0の影響を降水量や雲量よりも大きく受けている,風速は因子1の影響を湿度よりも大きく受けている,と言うことができる.

逆に,降水量や雲量,湿度は,日照時間や風速に比べ「共通因子よりも,固有の独自因子の影響を多く受けている」と言うこともできる.

この共通性が非常に小さい時,その観測変数は共通因子から受ける影響が非常に少ないということであり,この観測変数を外して再度因子分析をかけるのが適切である.

13個目のセルでは,因子数2として,Promax回転の因子分析を行う.

Promax回転(斜交回転)は「因子間に相関性がある」ことを前提とした手法であり,「因子間に相関性がないなんてことは,状況的に考えてそうはない」場合にはこちらを用いる.

# 因子数2のプロマックス回転
n_factors=2

fa_model = FactorAnalyzer(n_factors=n_factors, method='ml', rotation='promax', impute='drop')
fa_model.fit(df_sea_side_city.iloc[:, 2:])

columns_name_array = df_sea_side_city.columns[2:]
df_result = pd.DataFrame(fa_model.loadings_, index=columns_name_array)

cm = sns.light_palette('red', as_cmap=True)
df_result.style.background_gradient(cmap=cm)

13個目のセルの実行結果は以下の通り.プロマックス回転では因子負荷量行列ではなく「パターン行列」と呼ぶ.

因子数2に設定したプロマックス回転のパターン行列

14個目のセルでは,バリマックス回転と全く同じように,潜在変数の散布図を描いた.

# 因子分析の結果を使って,
# 観測された元々の説明変数の値を潜在変数の値に変換する
factors_df = pd.DataFrame(fa_model.transform(df_sea_side_city.iloc[:, 2:]))
num_of_row = df_sea_side_city.values.shape[0]

# 潜在変数の値をプロットしてみる
akita = list([])
miyako = list([])
sakata = list([])
kamaishi = list([])
for i in range(num_of_row):
  if df_sea_side_city.values[i][0] == 'Akita':
    akita.append(factors_df.iloc[i, :])
  elif df_sea_side_city.values[i][0] == 'Miyako':
    miyako.append(factors_df.iloc[i, :])
  elif df_sea_side_city.values[i][0] == 'Sakata':
    sakata.append(factors_df.iloc[i, :])
  else:
    kamaishi.append(factors_df.iloc[i, :])

df_akita = pd.DataFrame(akita)
df_miyako = pd.DataFrame(miyako)
df_sakata = pd.DataFrame(sakata)
df_kamaishi = pd.DataFrame(kamaishi)

import matplotlib.pyplot as plt

plt.scatter(df_akita.iloc[:, 0], df_akita.iloc[:, 1], label='Akita')
plt.scatter(df_sakata.iloc[:, 0], df_sakata.iloc[:, 1], label='Sakata')
plt.scatter(df_miyako.iloc[:, 0], df_miyako.iloc[:, 1], label='Miyako')
plt.scatter(df_kamaishi.iloc[:, 0], df_kamaishi.iloc[:, 1], label='Kamaishi')

plt.xlabel('Factor0')
plt.ylabel('Factor1')
plt.legend()
plt.show()

14個目のセルの実行結果は以下の通り.斜交回転だと軸に沿って出力されるのがわかる.

因子数2に設定したプロマックス回転の潜在変数の散布図

プロマックス回転だと,日本海側と太平洋側がはっきり分離する.したがってこの場合「因子1は太平洋側と日本海側」だと考えることができそうだ.

また,日本海側の都市はPromax回転でも分離して見えないが,宮古と釜石は分離して見えるようになる.因子0が宮古と釜石の違いであると言えそうだ.さて因子0はなんと名前をつければいいだろうか.考えてみよう.


[Work]

Publications

Degree Thesis

Daichi Ando: "Computer Aided Composition using Interactive Evolution" Master's thesis in Art & Technology, IT University of Gothenburg. Report No. 2004-62, ISSN:1651-4769. Sept, 2004.

安藤大地 (Daichi Ando): 対話型進化論的計算による作曲支援に関する研究(A Study about Application of Interactive Evolutionary Computation in Composition-Aid System) 博士論文 東京大学大学院新領域創成科学研究科.Mar. 2009.

Journal Papers and Book Chapter (peer-reviewed)

安藤大地, Palle Dahlstedt, Mats Nordahl,伊庭斉志: "対話型GPを用いたクラシック音楽のための作曲支援システム" 芸術科学会論文誌 第4巻 第2号 pp.77-86,2005年6月.
URL: http://www.art-science.org/journal/v4n2/index.html

Daichi Ando, Palle Dahlstedt,Mats G. Nordahl and Hitoshi Iba: "Interactive GP with Tree Representation of Classical Music Pieces" in Giacobini et al. Eds: Application of Evolutionary Computing, Springer LNCS Series 4448, pp.577-584. Apr. 2007.

安藤大地: "クラブ系ループ音楽パフォーマンスのためのリアルタイムに音楽をBreedingするシステム" 情報処理学会論文誌 第53巻 第3号 pp.1030-1040, 2012年3月.

安藤大地,伊庭斉志: "音楽創作支援IECのための買い物フロー型インタフェース" 進化計算学会論文誌.第3巻 第3号 pp.73-84, 2012年12月.

Daichi Ando: "Effects of the difference in accented beat between jazz and classical music styles through sight-reading of a jazz ad-lib solo" in New Frontiers in Artificial Intelligence, Springer LNCS Series, 2019. (in Printing)

Musical / Media Art works performed Internationaly (peer-reviewed and invited)

Daichi Ando: "Wandering Finger for Tape", Music Japan Today 2007, University in Maryland, UMBC.

Daichi Ando: "Rusty Bucket for alto-saxophone and computer", International Computer Music Conference(ICMC) 2007, Copenhagen, Denmark.

Daichi Ando: "Animated Flourish for soprano-saxophone and computer", International Computer Music Conference(ICMC) 2011, Huddersfield, U.K.

Daichi Ando: "Towards to Black Plume: an improvisation work for a live interactive breeding system and a saxophonist", Asia Computer Music Project(ACMP) 2011, Tokyo, Japan.

Daichi Ando: "Opaline for tenor-saxophone and computer", Asia Computer Music Project(ACMP) 2012, Hsinchu, Taiwan.

Daichi Ando: "Softstep for baritone saxophone, electric guitar and computer", International Computer Music Conference(ICMC) 2015, Denton, Texas, U.S.A.

Daichi Ando: "Whitehearted for tenor saxophone and computer", International Computer Music Conference(ICMC) / New York City Electroacoustic Music Festival(NYCEMF) Joint Conference 2019, 2019, NewYork, U.S.A.

International Conference Paper (peer-reviewed)

Shu MATSUDA, Takayuki RAI, Chikashi Miyama, Daichi ANDO: "DIPS for Linux and Mac OS X" Proceeddings of the International Computer Music Conference 2002, Gothenburg, Sweden. Sep. 2002

Takayuki Rai, Shu Matsuda, Chikashi Miyama, Daichi Ando: "DIPS for Mac OS X and Linux" Resonaces International Convention on Technologies for Music 2002, Paris, IRCAM, Oct. 2002.

Takayuki Rai, Daichi Ando, Shu Matsuda, Chikashi Miyama: "DIPS for Linux" Resonances International Convention on Technologies for Music 2003, Paris, IRCAM, Oct. 2003.

Daichi Ando, Hitoshi Iba: "Real-time Musical Interaction between Musician and Multi-agent System" Proceedings of the 8th International Conference on Generative Art 2005, Milan, Italy. pp:93-100. Dec. 2005.

Daichi Ando, Palle Dahlstedt,Mats G. Nordahl and Hitoshi Iba: "Computer Aided Composition by means of Interactive GP" Proceedings of the International Computer Music Conference 2006, New Orleans, USA. pp:254-257. Oct. 2006.

Daichi Ando: "Improving User-Interface of Interactive EC for Composition-Aid by means of Shopping Basket Procedure",New Interface for Musical Expresssion (NIME) 2011 Jul. 2011, Oslo, Norway

Daichi Ando: "CACIE SB : Genetic Programming based Composition-Aid System by Shopping Basket Interface", International Computer Music Conference (ICMC) 2011 Aug. 2011, Huddersfield, U.K.

Daichi Ando: "Real-time breeding composition system by means of genetic programming and breeding procedure", Interanational Computer Music Conference (ICMC) - Sound And Music Computing (SMC) 2014 Joint Conference, Sep. 2014, Athene, Greece.

Daichi Ando: "Efficiency of adopting Interactive Machine Learning into Electro-Acoustic Composition", Electro-Acoustic Music Stdies 2017, Nagooya, Japan.

Daichi Ando: "A Research about Rhythm and Phrase Recgnition of Classical Music Performer Leraning Jazz Ad-lib Solo Phrases based on Score", JSAI-isAI International Workshop 2018, Sep. 2018, Yokohama, Japan.

Mamoru Takano, Daichi Ando, Kumiko Kushiyama: "Sonification method for manipulation of sound information and extending body sensation using spatial sound", International Symposium on Universal Acoustical Communication 2018 (UAC2018), October, 2018, Sendai, Japan.

講演など

安藤大地: 「人間と人工知能が協調したモノづくり - 「家族の好みを反映したレシピを提案するシステム」を例に」第15回ユニテックフーズ技術セミナー.2018年5月.

安藤大地: 「人工知能と音楽の考え方 - 「作曲家」の立場を使って「工学的」に見る」 第1回日本AI音楽学会フォーラム,2018年11月.

安藤大地: 「音楽大学における人工知能の授業の実践」 第2回日本AI音楽学会フォーラム, 2019年11月.

国内学会・研究会等 (査読有)

安藤大地,Palle Dahlstedt,Mats Nordahl,伊庭斉志:"対話型進化論的計算によるクラシック音楽作曲支援システム: CACIE" 情報処理学会インタラクション2005シンポジウム (情報処理学会シンポジウムシリーズ論文集Vol.2005, No.4) pp.185-186, 2005年2月-3月.

安藤大地,丹治信,伊庭斉志:"IECを用いた作曲支援システムCACIEのユーザインタフェース改良" 情報処理学会インタラクション2007シンポジウム, 2007年3月.

安藤大地,稲田雅彦,丹治信,伊庭斉志:"IECを用いた作曲支援のためのユーザインタフェース" 情報処理学会,インタラクション2009シンポジウム, 2005年3月.

安藤大地,馬場哲晃:"マルチタッチディスプレイを利用した電子擦弦楽器とエフェクトコントローラ" 情報処理学会インタラクション2010シンポジウム,2010年3月.

安藤 大地,笠原 信一: "フォトアルバムから音楽を生成するプログラムの対話型GPを用いた最適化" 情報処理学会インタラクション2011シンポジウム,1CR3-12, 2011年3月.

梶家彩実,安藤 大地,笠原 信一: "HEaSシステムによる新しいライフスタイルの提案" 情報処理学会インタラクション2011シンポジウム, 1CR3-17, 2011年3月.

谷澤奈津妃,笠原 信一,安藤 大地: "ゲーム感覚で楽しめるCube型3Dフォトアルバムの構築" 情報処理学会インタラクション2011シンポジウム, 1DEX-1, 2011年3月.

高 碩,清水 要,笠原 信一,安藤 大地: "裸眼立体視による注視点の動きを利用した視力回復訓練ソフトウェアの開発" 情報処理学会インタラクション2011シンポジウム, 1DEX-3, 2011年3月.

丁 慶松,笠原 信一,安藤 大地: "ARによる「紙のピアノ」の提案" 情報処理学会インタラクション2011シンポジウム, 3CR3-2, 2011年3月.

安藤大地: "地図上に投稿された現地写真からBGMをみんなで生成するシステム" 情報処理学会インタラクション2012シンポジウム, 1EXB-17, 2012年3月.

為廣 愛美,安藤 大地,笠原 信一: "ユーザーフレンドリーな対話型ヘルプキャラクターの制作と提案" 情報処理学会インタラクション2012シンポジウム, 1EXB-35, 2012年3月.

浜田 真成,安藤 大地,笠原 信一: "Idea In: プロジェクト管理を効率化するWebアプリケーション 提案と制作" 情報処理学会インタラクション2013シンポジウム, 1EXB-08, 2013年3月.

木下 夏織,安藤 大地,笠原 信一: "モールス信号を用いた新しいユーザインタフェースの提案と制作" 情報処理学会インタラクション2013シンポジウム, 1EXB-44, 2013年3月.

安藤 大地: "GPを用いたアドリブジャズギターの演奏と主観的演奏表情状態の紐付けに関する検討 ~人間の演奏表情を読み取り反応するジャムセッションシステムの構築に向けて~" 情報処理学会インタラクション2013シンポジウム, 2EXB-37, 2013年3月.

多々良 友理,笠原 信一,安藤 大地: "モザイク画像の認知に関する考察とそれに基づいたグラフィックデザイン支援プログラムの開発" 情報処理学会インタラクション2014シンポジウム, A3-8, 2014年3月.

安藤 大地: "GPS軌跡と写真から旅行記のBGMを作成して再生するWebシステム",情報処理学会インタラクション2014シンポジウム, B3-6, 2014年3月.

黒田 宙馬,笠原 信一,安藤 大地: "3Dインターフェースによるプレゼンテーションツールの可能性提案" 情報処理学会インタラクション2014シンポジウム, B4-0, 2014年3月.

浜田 真成,安藤 大地,笠原 信一: "idea in: プロジェクト管理を効率化するWebアプリケーション その2 - タスクチャート手法の提案", 情報処理学会インタラクション2014シンポジウム, B4-1, 2014年3月.

染矢 さらら,安藤 大地,笠原 信一: "メロディモーフィング手法を用いた初学者向けの作曲支援システムの研究" 情報処理学会インタラクション2014シンポジウム, B6-2, 2014年3月.

小林 央,安藤 大地,笠原 信一: "VOCALOIDでの話し言葉作成に特化したツールの制作と提案" 情報処理学会インタラクション2014シンポジウム, C3-3, 2014年3月.

有山 大地,安藤 大地,笠原 信一: "位置・時間を主軸においたWebコンテンツのストーリー形式まとめシステム" 情報処理学会インタラクション2015シンポジウム, A17, 2015年3月.

浜田 真成,安藤 大地,笠原 信一: "idea in: プロジェクト管理を効率化するWebアプリケーション その3 - タスクチャート手法によるプロジェクトの目的別可視化" 情報処理学会インタラクション2015シンポジウム, A19, 2015年3月.

三善 優紀,安藤 大地,笠原 信一: "コンピュータビジョン周辺監視による二輪車向け安全性向上システムの開発のための基礎検討" 情報処理学会インタラクション2015シンポジウム, A61, 2015年3月.

安藤大地: "ジャズ即興演奏における4ビートベースラインの2段階対話型遺伝的プログラミングによる生成" 情報処理学会インタラクション2015シンポジウム, B18, 2015年3月.

松岡 宗人, 安藤 大地, 笠原 信一: "マルチウィンドウにより情報の収集・比較を可能とするWeb検索ツールの提案" 情報処理学会インタラクション2015シンポジウム, B20, 2015年3月.

有山 大地,安藤 大地,笠原 信一: "進化論的計算を用いたエレキギターの音色再現手法の提案" 情報処理学会インタラクション2016シンポジウム, 1B24, 2016年3月.

三善 優紀,安藤 大地,笠原 信一: "周辺情報の把握による二輪車向け運転支援システムの開発" 情報処理学会インタラクションシ2016シンポジウム, 1C51, 2016年3月.

川島 絵里奈,安藤 大地,笠原 信一: "進化的アルゴリズムを用いた家族向け献立提案システムの試作" 情報処理学会インタラクション2016シンポジウム, 1C53, 2016年3月.

安藤 大地: "マルチスピーカシステムのためのパンニングモジュレーションの基礎検討" 情報処理学会インタラクション2016シンポジウム, 1C74,2016年3月.

本田 将大,安藤 大地,笠原 信一: "国際化する医療現場における医師と外国人患者とのコミュニケーション支援に関する研究" 情報処理学会インタラクション2016シンポジウム, 2B27, 2016年3月.

高野衛,安藤大地,笠原信一: "運動学習支援を目的とした動作情報における可聴化手法の提案" 情報処理学会インタラクション2017シンポジウム, 1-408-7, 2017年3月.

安藤大地: "対話型遺伝的プログラミングを用いた無調性音高配列からの和声進行の生成" 情報処理学会インタラクション2017シンポジウム, 2-403-47, 2017年3月.

三善優紀,安藤大地,笠原信一: "周辺情報の把握による二輪車向け運転支援システムの開発" 情報処理学会インタラクション2017シンポジウム, 2-410-68, 2017年3月.

宇野花梨, 安藤大地, 笠原信一: "3DCG技術を活用した2Dアニメーション制作システムの提案" 情報処理学会インタラクション2017シンポジウム, 2-510-09, 2017年3月.

磯野優夏,安藤大地,笠原信一: "シネマグラフを簡易的に作成する新手法の提案" 情報処理学会インタラクション2017シンポジウム, 3-408-78, 2017年3月.

矢追那実,安藤大地,笠原信一: "「三次元スケッチブック」の可能性" 情報処理学会インタラクション2017シンポジウム, 3-409-71, 2017年3月.

高野衛,安藤大地,串山久美子: "運動学習支援を目的とした多変数マッピングを用いた動作情報の可聴化手法" 情報処理学会インタラクション2018シンポジウム, 1B26, 2018年3月.

安藤大地: "CPPN表現とNeuro-Evoluationを用いたエレクトロニカのためのノイズ音素材" 情報処理学会インタラクション2018シンポジウム, 1B58, 2018年3月.

宇野花梨,安藤大地,笠原信一: "3DCG技術を用いた2Dアニメーションの制作の効率" 情報処理学会インタラクション2018シンポジウム, 2B44, 2018年3月.

大森 葵,向井 智彦,安藤 大地: "3次元キャラクタモーション制作履歴データ事例に対する一検討" 情報処理学会インタラクション2019シンポジウム, 1P-75, 2019年3月.

安藤大地: "EWI wind-synthesizerのためのトーキングボックス的ヴォコーダの設計とセンサのアサイン" 情報処理学会インタラクション2019シンポジウム, 2B-23, 2019年3月.

有山 大地,安藤 大地,串山 久美子: "MFCCを距離尺度に用いたGAによるエレキギターの音色再現システムの開発" 情報処理学会インタラクション2019シンポジウム, 2B-31, 2019年3月.

高野 衛,串山 久美子,安藤 大地,須田 拓也,馬場 哲晃: "ポインティング・デバイスの操作感覚に影響を与えることを目的とした音響フィードバック" 情報処理学会インタラクション2019シンポジウム, 3B-47, 2019年3月.

新井 里奈,安藤 大地,向井 智彦: "スマートフォン用の店舗利用者行動先読み型ウェブアプリケーション" 情報処理学会インタラクション2019シンポジウム, 3P-86, 2019年3月.

国内学会・研究会等 (査読無)

橋田光代,美山千香士,安藤大地: "DIPSエクスターナルオブジェクトの開発と作品創作への応用" 情報処理学会音楽情報科学研究会,IPSJ, 2000-MUS-36, Vol.2000, 2000年8月.

橋田光代,松田周,美山千香士,安藤大地: "DIPSプログラミングチュートリアル" 情報処理学会音楽情報科学研究会,IPSJ, 2000-MUS-38 Vol.2000, 2000年12月.

松田周,美山千香士,安藤大地: "DIPS for Linux and Mac OS X" 情報処理学会音楽情報科学研究会,IPSJ, 2002-MUS-48 Vol.2002, 2002年12月.

松田周,安藤大地,美山千香士,酒井由: "マルチメディアビジュアルプログラミング環境DIPS2" 情報処理学会音楽情報科学研究会,IPSJ, 2003-MUS-51 Vol.2003, 2003年8月.

安藤大地,Palle Dahlstedt,Mats Nordahl,伊庭斉志: "対話型進化論的計算による作曲支援システム: CACIE" 情報処理学会音楽情報科学研究会,IPSJ, 2005-MUS-59, Vol.2005, No.14, ISSN:0919-6072, pp:55-60, 2005年2月.

安藤大地,伊庭斉志: "人間の演奏者と音楽インタラクションを行うマルチエージェントシステムの構築" 情報処理学会音楽情報科学研究会,IPSJ, 2005-MUS-63, Vol.2005, No.129, ISSN:0919-6072, pp:43-48, 2005年12月.

安藤大地,丹治信,伊庭斉志: "ECを用いた作曲支援システムと作曲モデルの客観的評価手法" 情報処理学会音楽情報科学研究会,IPSJ, 2006-MUS-68, Vol.2006, No.133, ISSN:0919-6072, pp:29-34, 2006年12月.

丹治信,安藤大地,伊庭斉志: "GPを用いた旋律のグルーピングルール生成" 情報処理学会音楽情報科学研究会,IPSJ, 2006-MUS-68, Vol.2006, No.133, ISSN:0919-6072, pp:67-72, 2006年12月.

安藤大地、伊庭斉志: "木構造型遺伝子を用いたクラシック音楽作曲支援システム:CACIE" 人工知能学会2007年全国大会, 3C7-2, 2007年6月.

安藤大地,稲田雅彦,丹治信,伊庭斉志: "能動的音楽聴取インタフェースの作曲支援IECへの取り込み" 情報処理学会音楽情報科学研究会,IPSJ, 2007-MUS-73, Vol.2007, No.127, ISSN:0919-6072, pp:1-6, 2007年12月.

丹治信,安藤大地,伊庭斉志: "確立文脈自由文法による旋律の拍節モデル推定" 情報処理学会音楽情報科学研究会,IPSJ, 2007-MUS-73, Vol.2007, No.127, ISSN:0919-6072, pp:57-62, 2007年12月.

安藤大地,伊庭斉志: "音楽CGMのユーザをターゲットとした音楽創作支援システムの開発に向けて" 第1回同人音楽研究会, 2008年2月.

稲田雅彦,安藤大地,丹治信: "Sign Do Sound:対話型作曲支援システムの能動的音楽聴取インタフェース--インスタレーションに対するIECインタフェースの取り組み" 映像情報メディア学会技術報告 Vol.32, No.15, pp:25--28, 2008年2月.

安藤大地,丹治信,稲田雅彦,伊庭斉志: "初心者向け音楽創作IECのためのユーザアシスト機能についての検討" 情報処理学会音楽情報科学研究会, IPSJ, 2008-MUS-75, pp:123-128, 2008年5月.

丹治信,安藤大地,伊庭斉志: "PCFGの文法拡大による音列パターン解析" 情報処理学会音楽情報科学研究会, IPSJ, 2008-MUS-76, No.13, pp:69-74, 2008年8月.

中野倫靖,福島直,小川圭祐,早渕 功紀,梶原祥平,浜中雅俊,一瀬護,数森康弘,橋本祐輔,石先広海,神田竜,冨林豊,平井重行,渡辺晃生,安藤大地,竹川佳成: "デモンストレーション:音楽情報処理の研究紹介 VI", 情報処理学会音楽情報科学研究会, IPSJ, 2008-MUS-76, No.18, 2008年8月.

稲田雅彦,安藤大地,丹治信,伊庭斉志: "対話型作曲支援システムにおけるユーザ嗜好の獲得" 情報処理学会エンタテイメントコンピューティング研究会,IPSJ, 2008-EC-11, No.12, 2009年12月.

渡辺晃生,安藤大地,稲田雅彦,丹治信,伊庭斉志: "IECを用いた歌声パラメータの最適化システム" 情報処理学会音楽情報科学研究会, IPSJ, 2009-MUS-79, No.2, pp:5-10, 2009年2月.

安藤大地: "動画投稿サイトにおける音源トラックの共有を目的とした投げ銭システムの検討と提案" 情報処理学会音楽情報科学研究会, IPSJ, 2009-MUS-80, No.10, 2009年5月.

安藤大地,梶克彦,北市健太郎,草間かおり,佐藤和哉,竹川佳成,浜中雅俊,深山覚,松原正樹: "デモンストレーション:音楽情報処理の研究紹介 VII", 情報処理学会音楽情報科学研究会, IPSJ, 2009-MUS-81, No.22, 2009年7月.

安藤大地,伊庭斉志: "時系列メディアを生成対象としたアート創作支援IECのインタフェース", 進化計算シンポジウム2009, 1-08. 2009年12月.

中野倫靖,大沼翔,金泰憲,黒沢佳史,斉藤優理,斎藤佳紀,奥村健太,田中駿二,浜中雅俊,帆足啓一郎,森山剛,吉田周平,吉谷幹人,安藤大地: "デモンストレーション:音楽情報処理の研究紹介 IX", 情報処理学会音楽情報科学研究会, IPSJ, 2011-MUS-91, Vol.2010-MUS-86 No.21, 2010年7月.

馬場哲晃,有田光希,安藤大地,伊藤悠真,金井隆晴,小池宏幸,村主大輔,辰巳直也,平井重行,平井辰典,深山覚,水本直希,山本龍一: "デモンストレーション:音楽情報処理の研究紹介 X", 情報処理学会音楽情報科学研究会, IPSJ, 2011-MUS-91, Vol.2011-MUS-91 No.16, July. 2011.

安藤大地: "首都大学東京インダストリアルアートコース スタジオ・レポート" 情報処理学会音楽情報科学研究会, IPSJ, 2011-MUS-93, No.3, 2011年12月.

安藤大地,阿部ちひろ,遠藤秀行,伊藤仁,伊東直哉,三木翔太,森勢将雅,中村友彦,岡田美咲,佐々木将人,澤田真吾,橘秀幸,飛世速光,宇野愛,魚田知美,山田祐雅,山本龍一: "デモンストレーション:音楽情報処理の研究紹介 XI", 情報処理学会音楽情報科学研究会, IPSJ, 2012-MUS-96, No.18, 2012年8月.

吉村 ももこ, 笠原 信一, 安藤 大地: "レイトレーシングにおける半影表現の新しいアプローチ -ライトオブスタクルデプス-",第154回情報処理学会グラフィクスとCAD研究会, 2014年2月.

染矢さらら, 安藤大地, 笠原信一: "GTTMタイムスパン木を用いた旋律モーフィング手法の検討",第102回情報処理学会音楽情報科学研究会, 2014年2月.

高野衛,安藤大地,笠原信一: "アコースティック・ギターを素材とした音響作品 “orb” for electronics の制作", 先端芸術音楽創作学会会報vol.7, no.2, pp:7--9, 2016年3月.

有山大地,安藤大地,笠原信一: "進化論的計算を用いたエレキギターの音色再現手法の提案" 先端芸術音楽創作学会会報vol.7, no.2, pp:10--14, 2016年3月.

安藤大地: "対話型機械学習の実践的な作曲への応用" 先端芸術音楽創作学会会報vol.9, no.2, pp:1--4, 2017年9月.

高野 衛, 安藤 大地, 馬場 哲晃, 串山 久美子: "空間音響による身体イメージの変化を用いたインスタレーション “quad” sonification for hand stroke", 先端芸術音楽創作学会会報vol.10, no.2, pp.1--4. 2018年7月.

安藤大地: "クラシック演奏家のジャズ演奏コピーにおけるリズム・フレーズ把握の調査" 先端芸術音楽創作学会会報vol.10, no.2, pp:5--9. 2018年7月.

安藤大地: "クラシック音楽演奏家のジャズ音楽のフレーズ認知に関する調査と考察" 人工知能学会第26回身体知研究会,2018年9月.

高野衛,安藤大地,串山久美子: "音響情報の操作と空間音響を用いた身体イメージの変化を目的とした可聴化手法" 第10回多感覚研究会, 2018年10月.

有山大地,安藤大地,串山久美子: "MFCCを距離尺度に用いたエレキギター音色の機械学習手法に関する研究" 先端芸術音楽創作学会会報vol.10, no.3, pp:24--29. 2018年11月.

安藤大地: "クラシック演奏家のジャズ即興演奏習得過程の記録と考察" 日本音楽即興学会第10回学術大会, 2018年12月.

安藤大地: "2-5-1フレーズ練習記録の一人称研究を例にしたジャズ即興演奏生成システムのための検討" 人工知能学会2019年度全国大会, 3L4-OS-22b-02, 2019年6月.

Yibin Yan, 向井智彦,安藤大地: "フェイシャルアニメーションの非線型制御法の研究" 情報処理学会Visual Computing(VC)2019シンポジウム, 2019年7月.

安藤大地: "ジャズ単音アドリブソロにおける音高認知の調査" 先端芸術音楽創作学会会報 Vol.11, No.2. pp:16--19. 2019年7月.

馬場 哲晃, 石曽根 奏子, 高野 衛, 安藤 大地, 渡邉 英徳, 釜江 常好: "視覚障害者の屋外移動時における周辺物体検出の可聴化に関する基礎検討とプロトタイピング", 情報処理学会第10回アクセシビリティ研究会 vol.2019-AAC-10, no.6, pp:1--4. 2019年8月.

安藤 大地, 長嶋, 洋一, 落 晃子, 長山弘: "パネルディスカッション テクノロジーを用いた即興演奏・即興演奏教育の拡張" 日本音楽即興学会第11回学術大会. 2019年12月.

メディア露出など

"NHK サイエンスZERO 進化研究最前線〜ダーウィン進化論150年〜" 2008年2月7日放送.
http://www.nhk.or.jp/zero/contents/dsp236.html


[Work/Class/Python3の基礎とデータ処理/libraries_for_data]

CSVデータからの線形二項分類問題

本項でもGoogle Colaboratoryを使用する.(もちろんファイル読み込みの部分以外はJupyter Notebookでもよいし,一気にPythonのソースコードをまとめて書いて実行しても問題はない)

今回は,「気温以外のデータ」を使って,太平洋側の都市と日本海側の都市の分類器を作成してみる.

例によって,気象庁オープンデータのページから,

都市の選択

都市は,秋田県→秋田市,岩手県→宮古市,山形県→酒田市,宮城県→石巻市,新潟県→新潟市,茨城県→水戸市,千葉県→銚子市,の順で,それぞれ選択.

降水量

月別の値を選択し,降水量の月合計,

日照時間

日照時間の月合計,

風速

月平均風速,

湿度

湿度/気圧の月平均蒸気圧,を選択し,

期間の選択

1977年〜2018年の「1月」のデータをダウンロードする.

表示オプション

表示オプションはデフォルト.地点の順番と,項目の順番を確認すること.

ダウンロードしたCSV

ダウンロードしたCSVはこんな見た目になる.

実際のCSVファイルは,この通りである

線形二項分類

線形分類(Linear Classification)とは,2つのカテゴリが入っているデータの集合の真ん中に一本直線を引くことで,カテゴリ分けする境目を定め,予測したいデータが入ってきた時に,どちらかに分類する問題である.もちろん人間が一本線を引くことで行うこともできるが,これを機械学習で行う.

入力するデータが2次元,例えば「降水量,日照時間」だった場合には,カテゴリ分けする境目は「直線」になるが,「降水量,日照時間,湿度」のように3次元になると「2次元平面」になり,「降水量,日照時間,湿度,風速」のように4次元だと「3次元超平面」になる.

3次元空間上の平面ぐらいは平面に表示するグラフでなんとか表示できるものの,4次元以上は無理なので,写像をするか「4次元の線形の式」として理解するしかない.

本項では,線形Support Vector Machine(Linear SVM)と,ロジスティック回帰(Logistic Regression)による,分類器というか,つまり直線に必要な「係数」および「切片」を学習する.

ロジスティック回帰は「回帰」と名がついているが,分類問題に使う.分ける直線を学習するので「線形回帰」とも言えるので,この名前がついている.

ダミー変数とカテゴリ変数

日本海側と太平洋側の年を分類すると書いたが,SVMやロジスティック回帰で機械学習するためには,これを数字に直さなければならない.もちろん太平洋側と日本海側は大小の比較ができないなど「値」としては,意味がないわけで,ここでは太平洋側を0,日本海側を1として表すことにする.

このように,その要素の有無で0と1の2値で表現される変数,その大小や差に意味がないものを「ダミー変数」と呼ぶ.(回帰分析でもダミー変数を使うことができる.)

例えば北海道の都市のように「太平洋側,日本海側,オホーツク海側」のように3つ以上の状態があり,2値で表すことができないもの,つまり「0, 1, 2, 3...などの状態が複数あり,かつその数字が大小の意味を持ってない場合」は,カテゴリ変数と呼ぶ

カテゴリ変数は二項分類つまりここでおこなような「AとBのどっち?」の問題では扱えないので,カテゴリ変数で表現している内容を,要素に分けて,要素の有無で表現,つまり複数のダミー変数に直すなどの方法をとる.

コード例

1つ目のセル.例によってCSVをColabへ読み込む.

from google.colab import files
uploaded = files.upload()
CSVのアップロード

2つ目のセル.品質情報などの列が不要なので削除.

import numpy as np
import pandas as pd
from pandas import Series, DataFrame

df = pd.read_csv('nihonsea-side-pacificsea-side-jan.csv', encoding='SHIFT-JIS', header=1)

# 抜き出す
for a_column in ['秋田', '宮古', '酒田', '石巻', '新潟', '水戸', '銚子']:
  # それぞれ
  # 降水量の合計(mm),降水量の合計(mm),降水量の合計(mm),降水量の合計(mm), 日照時間(時間),日照時間(時間),日照時間(時間),日照時間(時間), 平均風速(m/s),平均風速(m/s),平均風速(m/s),平均蒸気圧(hPa),平均蒸気圧(hPa),平均蒸気圧(hPa),
  # で並んでいて,一つの地点につき,
  #	(空), 現象なし情報, 品質情報, 均質番号, (空), 現象なし情報, 品質情報, 均質番号, (空), 品質情報, 均質番号, (空), 品質情報, 均質番号
  # の(空)以外の場所が余計なので,削除

  # 7地点分回す
  for i in range(1, 7, 1):
    # 各地点の落とす列の列番号を指定(0~)
    if i in [1, 2, 3, 5, 6, 7, 9, 10, 12, 13]:
      df = df.drop(a_column + '.' + str(i), axis=1)

# 年月の列を落とす
df = df.drop(1)

# DataFrameの中に欠損値がある場合は,0.0を代わりに入れておく
df = df.fillna(0)
df.head()
不必要な列の削除

3つ目のセル.ダミー変数を入れて,各都市のデータの列を繋いで,一つのデータフレームにする.

# グラフ表示するためにローマ字ラベルを作っておく
#np.arrayはenumerateでは回せないので, listのままにしておく
city_label_list = (['Akita', 'Miyako', 'Sakata', 'Ishinomaki', 'Niigata', 'Mito', 'Choshi'])

# その要素の有無で0と1の2値で表現される変数を「ダミー変数」と呼ぶ
# 0, 1, 2, 3...などの状態が複数あり,かつその数字が大小の意味を持ってない場合は,カテゴリ変数と呼ぶ
# カテゴリ変数は判別問題などで扱えないので,
# カテゴリ変数で表現している内容を,要素に分けて,要素の有無で表現,つまり複数のダミー変数に直す

# 今回は太平洋側と日本海側の2値なので,ダミー変数:太平洋側が0, 日本海側が1
sea_side_label = np.array([1, 0, 1, 0, 1, 0, 0])

# 選んだ都市の
# average_wind_speed: 1月の平均風速
# daylight_hours: 1月の日照時間
# average_humidity: 1月の平均湿度
# precipitation: 1月の降水量
# として,それぞれ42年分*太平洋側,日本海側の2年ずつを,1つ配列としてくっつける

# 42年分のラベルを繋げておく (42年分*全部の都市)
city_label_in_repeat = np.repeat(city_label_list, 42)
sea_side_label_in_repeat = np.repeat(sea_side_label, 42)

# データをつなげる
# まず最初に空の配列を作っておいて,
precipitation = np.array([], dtype=np.float)
daylight_hours = np.array([], dtype=np.float)
average_wind_speed = np.array([], dtype=np.float)
average_humidity = np.array([], dtype=np.float)

# 選んだ都市の,1月の平均風速,1月の日照時間,1月の平均湿度,1月の降水量を
# それぞれ1つの配列につなぐ
for i, a_city in enumerate(city_label_list): 
  precipitation = np.concatenate((precipitation, df.iloc[1:, 1+(i*4)]))
  daylight_hours = np.concatenate((daylight_hours, df.iloc[1:, 1+(i*4)+1]))
  average_wind_speed = np.concatenate((average_wind_speed, df.iloc[1:, 1+(i*4)+2]))
  average_humidity = np.concatenate((average_humidity, df.iloc[1:, 1+(i*4)+3]))

# vstackで重ねて,配列の次元を入れ替えて,DataFrameにしておく
df_sea_side_city = pd.DataFrame(np.vstack([city_label_in_repeat, sea_side_label_in_repeat, precipitation.astype(np.float), daylight_hours.astype(np.float), average_wind_speed.astype(np.float), average_humidity.astype(np.float), ]).transpose())
# DataFrameの列名をつけておく
df_sea_side_city = df_sea_side_city.rename(columns={0:'都市名', 1:'太平洋側日本海側ダミー変数', 2:'1月の降水量', 3:'1月の日照時間', 4:'1月の平均風速', 5:'1月の平均湿度'})
# DataFrameの冒頭を確認
df_sea_side_city.head()
機械学習に喰わせるためのDataFrameの構築.ダミー変数を入れる.

4つ目のセル.訓練データとテストデータにランダムに分ける.訓練データで学習し,テストデータを正確に分類できれば,その線形分類は有用だと言える.

from sklearn.model_selection import train_test_split

# 線形分類は,Xは説明変数多数の行列,Yは0or1(この場合太平洋側か日本海側かのダミー変数)が入った1次元配列を取る
y_whole = df_sea_side_city.iloc[:, 1].values
x_whole = df_sea_side_city.iloc[:, 2:].values
# yを1次元配列にする
y_whole = np.ravel(y_whole)

# 訓練データとテストデータに分ける
# 実行する度に訓練データとテストデータに選ばれる行がランダムで変わる
x_train, x_test, y_train, y_test = train_test_split(x_whole, y_whole)

5つ目のセル.分類する線形SVMを学習する

# 線形SVMで分類するための学習
from sklearn.svm import LinearSVC
from sklearn import metrics

svm_model = LinearSVC(C=1.0)
svm_model.fit(x_train, y_train)
svm_y_predict = svm_model.predict(x_test)
svm_accuracy_score = metrics.accuracy_score(y_test, svm_y_predict)
print('svmの正答率', svm_accuracy_score)
# 係数がこの中に入っている.この係数で表される4次元空間の平面で切るとうまく分類できる,という意味
print('分離平面の係数', svm_model.coef_[0])
print('分離平面の切片', svm_model.intercept_[0])

# 分離平面の係数をもうちょっとわかりやすく表示してみる
svm_coef_df = pd.DataFrame([df_sea_side_city.columns[2:], svm_model.coef_[0]]).T
# DataFrame.Tはnumpyのtransposeに相当し,配列の次元を入れ替える
print(svm_coef_df)

5つ目のセルの結果は以下のようになる.

svmの正答率 0.9864864864864865
分離平面の係数 [ 0.04655286 -0.01708395  0.03802717 -0.03184421]
分離平面の切片 -1.2240700054688827
         0          1
0   1月の降水量  0.0465529
1  1月の日照時間 -0.0170839
2  1月の平均風速  0.0380272
3  1月の平均湿度 -0.0318442

6つ目のセル.学習に使わなかった別の地点のデータから,太平洋側,日本海側のどちらかを予測する.

# 鳥取県境(日本海側),静岡県石廊崎(太平洋側)の2018年1月のデータを入れてみて,ちゃんと分類できるか検証する.
# 境のデータ 降水量191.5(mm), 日照時間58.1(時間), 平均風速2.6(m), 平均蒸気圧6.3(hPa), 
# 石廊崎のデータ 降水量 93.5(mm), 日照時間188.6(時間), 平均風速6.8(m), 平均蒸気圧6.6(hPa)
sakaiX = np.array([[191.5, 58.1, 2.6, 6.3]], dtype=np.float)
irouzakiX = np.array([[93.5, 188.6, 6.8, 6.6]], dtype=np.float)

print('境の2018年1月のデータから予測した結果', svm_model.predict(sakaiX))
print('石廊崎の2018年1月のデータから予測した結果', svm_model.predict(irouzakiX))

6つ目のセルの結果は以下のようになる.境が1,石廊崎が0と判断されているので,学習したSVMの分類はそれなりに正しいようだ.もちろんさらに学習の制度を検証するために,他の都市,他の地点のデータを突っ込んで,確かめてみるのも良い.

境の2018年1月のデータから予測した結果 [1.]
石廊崎の2018年1月のデータから予測した結果 [0.]

7つ目のセル.今度は全く同じ訓練データとテストデータを,ロジスティック回帰で分類するために学習する

from sklearn.linear_model import LogisticRegression
# X, Yの訓練データでロジスティック回帰を学習する
log_model = LogisticRegression()
log_model.fit(x_train, y_train)

# 学習済みのモデルにXテストデータをつっこみ,Yを予測し,観測データと比較
log_y_predict = log_model.predict(x_test)
log_accuracy_score = metrics.accuracy_score(y_test, log_y_predict)
print('ロジスティック回帰の正答率:', log_accuracy_score)
# 係数がこの中に入っている.この係数で表される4次元空間の平面で切るとうまく分類できる,という意味
print('分離平面の係数', log_model.coef_[0])
print('分離平面の切片', log_model.intercept_[0])

# 同じく分離平面の係数をもうちょっとわかりやすく表示してみる
log_coef_df = pd.DataFrame([df_sea_side_city.columns[2:], log_model.coef_[0]]).T
print(log_coef_df)

7つ目のセルの結果は以下のようになる.傾き(係数)や切片は線形SVMと異なっているが,学習はちゃんとできているようだ.

ロジスティック回帰の正答率: 0.9459459459459459
分離平面の係数 [ 0.26298817 -0.18462974  0.25403575 -0.32331834]
分離平面の切片 -3.3614051554580233
         0         1
0   1月の降水量  0.262988
1  1月の日照時間  -0.18463
2  1月の平均風速  0.254036
3  1月の平均湿度 -0.323318

8つ目のセル.同じくロジスティック回帰に,鳥取県境と,静岡県石廊崎の2018年1月のデータを突っ込んで,予測させてみる.

sakaiX = np.array([[191.5, 58.1, 2.6, 6.3]], dtype=np.float)
irouzakiX = np.array([[93.5, 188.6, 6.8, 6.6]], dtype=np.float)

print('境の2018年1月のデータから予測した結果', log_model.predict(sakaiX))
print('石廊崎の2018年1月のデータから予測した結果', log_model.predict(irouzakiX))

8つ目のセルの結果は以下のようになる.前述の通り線形SVMと傾きと切片は異なるものの,ロジスティック回帰でもちゃんと分類されているようだ.

境の2018年1月のデータから予測した結果 [1.]
石廊崎の2018年1月のデータから予測した結果 [0.]

つまり,1月の降水量,1月の日照時間,1月の風速平均,1月の湿度の4つのデータは,日本海側と太平洋側を判定するのには十分であり,分ける直線の傾きや切片が多少変わっても問題ないと考えることができる.


[Work/Class/JavaScript with P5.js]

アート系学生のためのJavaScript with P5.js

この授業の目的

アート向けプログラミング環境ProcessingのJavaScript版P5.jsを題材にして,プログラミングの基礎からES2015(ES6)のクラス定義を使用したオブジェクト指向プログラミングまでを学ぶ.

P5.jsの容易に作品を作ることが出来る特徴は残しつつ,本格的なプログラミングスキルの習得を目指す.

コンテンツ

  1. 授業の下準備: GitHub, GitHub Educationへの登録とGitHub Desktopのインストール (Java版Processingと共通)
  2. P5.jsの基礎
  3. GitHubへの保存と再読み込み
  4. P5.js, JavaScriptの制御構造
  5. P5.jsのアニメーション