KaleidoxプログラムではTableオブジェクトとRecordオブジェクトを中心に演算を行っていきます。
このためTableオブジェクトとRecordオブジェクトを操作するための機能を多数サポートする予定にしています。
今回はそういった便利な機能の中で、Tableオブジェクトのチャート表示と単回帰分析機能について説明します。
データ
単回帰分析を行う対象のデータをCSVファイルcity.csvとして用意しました。このデータでは日本の都市の緯度経度と平均気温、降水量を記述しています。
都市,緯度,経度,平均気温,降水量 札幌,43.055248,141.345505,8.0,1158 仙台,38.254162,140.891403,11.9,1219 東京,35.680909,139.767372,15.3,1460 名古屋,35.154919,136.920593,14.9,1575 大阪,34.702509,135.496505,16.2,1400 広島,34.377560,132.444794,15.0,1603 福岡,33.579788,130.402405,16.0,1690 那覇,26.204830,127.692398,22.4,2128
データの読み込み
KaleidoxのREPLからURIリテラルで上記CSVファイル名を投入すると、データを読み込んだTableオブジェクトが生成されます。
kaleidox> file:city.csv Table[5x8] kaleidox> :show:print ┏━━━━━━┯━━━━━━━━━┯━━━━━━━━━━┯━━━━━━━━┯━━━━━━┓ ┃都市 │緯度 │経度 │平均気温│降水量┃ ┣━━━━━━┿━━━━━━━━━┿━━━━━━━━━━┿━━━━━━━━┿━━━━━━┫ ┃札幌 │43.055248│141.345505│8.0 │1158 ┃ ┃仙台 │38.254162│140.891403│11.9 │1219 ┃ ┃東京 │35.680909│139.767372│15.3 │1460 ┃ ┃名古屋│35.154919│136.920593│14.9 │1575 ┃ ┃大阪 │34.702509│135.496505│16.2 │1400 ┃ ┃広島 │34.377560│132.444794│15.0 │1603 ┃ ┃福岡 │33.579788│130.402405│16.0 │1690 ┃ ┃那覇 │26.204830│127.692398│22.4 │2128 ┃ ┗━━━━━━┷━━━━━━━━━┷━━━━━━━━━━┷━━━━━━━━┷━━━━━━┛
table-chart関数
データを読み込んだ直後にtable-chart関数を投入すると、以下に示すようにTableオブジェクトから必要な情報を取得して散布図を表示します。
kaleidox> table-chart
デフォルトでは表の第1列を項目名、第2列をX軸、第3列をY軸と解釈して自動でデータを読み込みます。
Kaleidoxは関数の投入結果をスタックとヒストリに保存しています。table-chart関数を引数なしで起動するとスタックの先頭にあるオブジェクトを引数として使用するのでこのようなことが可能になっています。
historyコマンドで確認するとCSVファイルをローディングした結果のTableオブジェクトは6番目に格納されていました。今後はヒストリの6番目のTableオブジェクトを使用します。
kaleidox> :history 1: nil 2: Table[3x10] 3: Matrix[1x10] 4: Matrix[2x10] 5: Matrix[1x2] 6: Table[5x8] 7: Window
行列
回帰分析のような数値演算を行う場合、通常はTableオブジェクトを行列に変換してから行列に対して線形代数の演算を行っていきます。
Kaleidoxの場合はtable-matrix関数でTableオブジェクトから行列を抽出することができます。
kaleidox> table-matrix #6 Matrix[4x8] kaleidox> :show Matrix[4x8] ┌ ┐ │43.055248 141.345505 8.0 1158.0│ │38.254162 140.891403 11.9 1219.0│ │35.680909 139.767372 15.3 1460.0│ │35.154919 136.920593 14.9 1575.0│ │34.702509 135.496505 16.2 1400.0│ │34.37756 132.444794 15.0 1603.0│ │33.579788 130.402405 16.0 1690.0│ │26.20483 127.692398 22.4 2128.0│ └ ┘
この例から分かるように、Tableオブジェクトの持つ表データのヘッダ行と数値以外の情報が入っている列を取り除いた情報を行列に再構築してくれます。
ただし今回は行列は使用しません。
table-select関数
回帰分析のような数値演算を行う場合、通常はMatrixオブジェクトを使用しますが、単回帰分析のような定番の分析手法は表に対して直接使用できるようになっています。
この記事の先頭でtable-chart関数によってTableオブジェクトの内容から自動抽出した情報を散布図として表示する操作を行いました。
この散布図に回帰分析の結果を重ねて表示してみることにします。
file.csvのデータをそのまま使ってもよいのですが、都市の緯度と経度に対して単回帰分析を行っても面白くないので、都市の緯度と平均気温に対して単回帰分析を行ってみます。
まずTableデータの第1列に都市名、第2列に緯度、第3列に平均気温を取るTableオブジェクトを生成します。これはtable-chart関数が散布図を描く時に、デフォルトでは第1列に項目名、第2列にX軸の値、第3列にY軸の値を想定しているためです。
この変換はtable-select関数で行うことができます。以下の例ではtable-select関数の引数に範囲オブジェクト「0,1,3」を指定しています。この結果オリジナルの表の第1列、第2列、第4列の内容をこの順番で並べたTableオブジェクトが生成されます。なお範囲オブジェクトの添字は0ベース、表の表現では添字は1ベースで表現しています。
kaleidox> table-select 0,1,3 #6 Table[3x8] kaleidox> :show:print Table[3x8] ┏━━━━━━┯━━━━━━━━━┯━━━━━━━━┓ ┃都市 │緯度 │平均気温┃ ┣━━━━━━┿━━━━━━━━━┿━━━━━━━━┫ ┃札幌 │43.055248│8.0 ┃ ┃仙台 │38.254162│11.9 ┃ ┃東京 │35.680909│15.3 ┃ ┃名古屋│35.154919│14.9 ┃ ┃大阪 │34.702509│16.2 ┃ ┃広島 │34.377560│15.0 ┃ ┃福岡 │33.579788│16.0 ┃ ┃那覇 │26.204830│22.4 ┃ ┗━━━━━━┷━━━━━━━━━┷━━━━━━━━┛
このTableオブジェクトに対してtable-chart関数を適用すると以下の散布図が表示されました。
kaleidox> table-chart
単回帰分析
単回帰分析を行った結果をチャート上に表示する場合はanalyzeオプションにsimple-regressionを指定します。
先程作成したTableオブジェクトのヒストリを確認します。
:history 1: nil 2: Table[3x10] 3: Matrix[1x10] 4: Matrix[2x10] 5: Matrix[1x2] 6: Table[5x8] 7: Window 8: Table[3x8]
8番目にあることが分かったので「#8」でアクセスすることができます。
単回帰分析の結果を散布図上に表示するためにはanalyzeオプションにsimple-regressionを指定します。
kaleidox> table-chart :analyze 'simple-regression #8
上記のtable-chart関数の結果、以下の単回帰分析付きの散布図が表示されました。
まとめ
CSVファイルから読み込んだTableオブジェクトに対して、table-selection関数による簡単な加工のみで散布図の表示、単回帰分析の結果表示を行うことができました。
通常のプログラミング言語でこの処理を行うとCSVファイルの読み込み、チャート機能の利用、数値演算処理による単回帰分析など案外大変なコーディングが必要になりますが、Kaleidoxではあっさりと実現できました。
このようなことが可能になるのは、Kaleidoxで汎用データ構造であるTableオブジェクトを言語の中軸機能と位置付け、Tableオブジェクトを対象にさまざまな関数を用意しているからです。
Kaleidoxはアクション言語として設計していますが、PIM(Platform Independent Model)的な抽象処理のみが記述できるだけだと実用性に乏しくなります。そういった抽象的な機能と同時に今回のTableデータ処理のような地味な実用機能もサポートし、シームレスに連携できることが必要だと考えています。
諸元
- Kaleidox : 0.1.10