All Rights Reserved, Copyright (C) Kosaku Nagasaka 2007

データ処理：表計算ソフトと同じことをしてみよう
Mathematicaで表計算ソフトに出来ることを任せる方法を学ぼう．

数や文字列をMathematicaに取り込んでみようü ExcelやCalcなどの表計算ソフトからデータを取り込む

表計算ソフトはとても便利なので，様々なデータを表計算ソフトのファイル形式で保存している人も多いのではないかと思います．ここでは，そのような表計算ソフトのファイルから数や文字列をMathematicaに読み込む（Mathematicaが扱えるようにする）方法について説明したいと思います．
わかりやすく，次のような実施日と測定値のデータを表計算ソフトで作成したとしま
しょう．MathematicaはMicrosoft
OfficeのExcelで保存したファイル（拡張子は「.xls」），StarSuiteやOpenOfficeのCalcで保存したファイル（拡張子は「.ods」ないしは「.sxc」）を読み込むことが出来ます．
簡単のため，実施日は1から20まで，測定値は図にあるような数式で生成したものとします．下記の説明ではファイル名を「horizontal20.xls」としていますが，必要に応じて実際のファイル名で読みかえるようにしてください．

表計算ソフト：サンプルExcelファイルの内容

M a t h e m a t i c aに 「 こ の フ ァ イ ル の デ ー タ を 読 み 込 み な さ い 」 と 指 示 を 出 す に は「Import」という命令を使います．命令の出し方は非常に簡単で，次のように読み込
みたいファイル名を文字列として指示するだけです．読み込んだデータには名前を付
けておきましょう．ファイル名を入力するのが面倒な場合は，メニューの「挿入/ファイルパス...」を使うことで，普段慣れ親しんでいるファイル選択ダイアログから選択することも可能です（お勧めです）．

All Rights Reserved, Copyright (C) Kosaku Nagasaka 2007

In[2]:=
Out[2]=

横形式の生データ = Import@"horizontal20.xls"D

999実施日, 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.,9測定値, 5.02992, 5.11066, 13.0721, 19.4117, 27.3183,
11., 12., 13., 14., 15., 16., 17., 18., 19., 20.=,

39.5797, 53.2928, 68.7363, 85.1994, 103.002,
121.295, 148.34, 172.29, 197.446, 229.292,
256.515, 291.443, 324.397, 363.773, 404.649===

Mathematicaで表計算ソフトのファイルがどのように認識されているかを確認してみましょう．「リストの構造を調べよ」という意味の「Dimensions」という命令を使う
In[3]:=
Out[3]=

DimensionsA横形式の生データE
81, 2, 21<「 81, 2, 21< 」という結果になりました．この数字の意味は「要素を21個持つリス
ト，を要素として2個持つリスト，を要素として1個持つリスト」です．表計算ソフトの用語では「シートの枚数は1つで，2行21列のデータ」となります．
このままでは扱いづらいので，リストの操作について少し勉強しましょう．Mathematicaでは，リストの直後にブラケット2つの組（「[[」と「]]」）で数字

リストの名称@@何番目を取り出すかDD
取り出し元のリスト

ブラケット２つブラケット２つ取り出したいところ

リスト操作：データの一部分だけを取り出す

例えば，横形式の生データの一番外側のリストは「シート」を表していますから，次のようにブラケット2つの組で1番目を取り出すと，1シート目のデータだけを抜き出すことが出来ます．結果のリストの構造が変わっているのに気がついたでしょうIn[4]:=
Out[4]=

最初のシート = 横形式の生データ@@1DD

99実施日, 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.,9測定値, 5.02992, 5.11066, 13.0721, 19.4117, 27.3183,
11., 12., 13., 14., 15., 16., 17., 18., 19., 20.=,

39.5797, 53.2928, 68.7363, 85.1994, 103.002,
121.295, 148.34, 172.29, 197.446, 229.292,
256.515, 291.443, 324.397, 363.773, 404.649==

All Rights Reserved, Copyright (C) Kosaku Nagasaka 2007

In[5]:=Out[5]=

DimensionsA最初のシートE
82, 21<

更に，最初のシートの1番目（即ち，1行目）を取り出すことで，実施日のデータだけを抜き出すことが出来ます．この操作は「一番最初の要素を抜き出せ」という意味のIn[6]:=
Out[6]=

実施日データ = 最初のシート@@1DD

9実施日, 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.,
11., 12., 13., 14., 15., 16., 17., 18., 19., 20.=

In[7]:=
Out[7]=FirstA最初のシートE

9実施日, 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.,
11., 12., 13., 14., 15., 16., 17., 18., 19., 20.=

çç番目の中のçç番目という指定も出来ます．例えば，次のようにカンマで区切ることで「1番目の中の2番目」を取り出せます．このデータの場合，最初のシートの2行
In[8]:=
Out[8]=

測定値データ = 横形式の生データ@@1, 2DD

9測定値, 5.02992, 5.11066, 13.0721, 19.4117,
27.3183, 39.5797, 53.2928, 68.7363, 85.1994,
103.002, 121.295, 148.34, 172.29, 197.446, 229.292,
256.515, 291.443, 324.397, 363.773, 404.649=

表計算ソフトで作ったファイルの内容が下図にあるように縦に並んでいる場合も同じように読み込むことが出来ます．下記の説明ではファイル名を「vertical20.xls」として

表計算ソフト：サンプルExcelファイルの内容

横形式のデータと同じくImportという命令に，次のように読み込みたいファイル名を文字列として指示して読み込みます．読み込んだデータには名前を付けておきましょAll Rights Reserved, Copyright (C) Kosaku Nagasaka 2007

In[9]:=
Out[9]=

縦形式の生データ = Import@"vertical20.xls"D

999実施日, 測定値=, 81., 4.77725<, 82., 5.55288<,

83., 9.32646<, 84., 19.5483<, 85., 27.6226<,
86., 40.3695<, 87., 50.6452<, 88., 67.0622<,
89., 81.9948<, 810., 102.578<, 811., 121.64<,
812., 144.626<, 813., 170.994<, 814., 198.418<,
815., 225.766<, 816., 259.499<, 817., 292.716<,
818., 328.8<, 819., 365.317<, 820., 402.559<==

表計算ソフトでデータを横に伸ばしているか，それとも縦に伸ばしているかによって，Mathematica内での表現も変化します．そこで，今回もDimensionsで構造を確認
In[10]:=
Out[10]=DimensionsA縦形式の生データE
81, 21, 2<「81, 21, 2<」という数字の順番が異なる結果になりました．この数字の意味は「要素を2個持つリスト，を要素として21個持つリスト，を要素として1個持つリスト」です．表計算ソフトの用語では「シートの枚数は1つで，21行2列のデータ」となります．
多少構造は異なりますが，先ほどと同じようにブラケット2つの組で最初のシートだけを取り出せます．この部分取り出しは，どのようなリストに対しても行うことが出来In[11]:=
Out[11]=

最初のシート = 縦形式の生データ@@1DD

99実施日, 測定値=, 81., 4.77725<, 82., 5.55288<,

83., 9.32646<, 84., 19.5483<, 85., 27.6226<,
86., 40.3695<, 87., 50.6452<, 88., 67.0622<,
89., 81.9948<, 810., 102.578<, 811., 121.64<,
812., 144.626<, 813., 170.994<, 814., 198.418<,
815., 225.766<, 816., 259.499<, 817., 292.716<,
818., 328.8<, 819., 365.317<, 820., 402.559<=

縦方向に延びているデータの場合，最初のシートの1番目を取り出すと，次のように項目名のペアになっています．なぜ，このペアが取り出されたかは，直前に問い合わせた最初のシートの1番目が項目名のペアのリストだからですね．2番目を取り出せ
In[12]:=
Out[12]=

最初のシート@@1DD
9実施日, 測定値=

All Rights Reserved, Copyright (C) Kosaku Nagasaka 2007

In[13]:=
Out[13]=

最初のシート@@2DD
81., 4.77725<

このような縦方向に延びるデータの場合に，実施日だけ，または測定値だけのリストを取り出すにはどうしたら良いでしょうか．Mathematicaには，このような場合に備えて，「全部」という意味の「All」という指示が出せるようになっています．例えば
次のような指示は「全ての要素，ただし各要素の1番目だけを取り出せ」という意味にIn[14]:=
Out[14]=

最初のシート@@All, 1DD

9実施日, 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.,
11., 12., 13., 14., 15., 16., 17., 18., 19., 20.=

In[15]:=
Out[15]=

最初のシート@@All, 2DD

9測定値, 4.77725, 5.55288, 9.32646, 19.5483,
27.6226, 40.3695, 50.6452, 67.0622, 81.9948,
102.578, 121.64, 144.626, 170.994, 198.418,
225.766, 259.499, 292.716, 328.8, 365.317, 402.559=

なお，ここでは詳細について説明はしませんが，データの行と列を入れ換える命令「Transpose」を使うことで，縦に延びるデータを横に延びるデータに，横に延びる
In[16]:=
Out[16]=

TransposeAFirstA縦形式の生データEE

99実施日, 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.,9測定値, 4.77725, 5.55288, 9.32646, 19.5483, 27.6226,
11., 12., 13., 14., 15., 16., 17., 18., 19., 20.=,40.3695, 50.6452, 67.0622, 81.9948, 102.578,
121.64, 144.626, 170.994, 198.418, 225.766,
259.499, 292.716, 328.8, 365.317, 402.559==

In[17]:=
Out[17]=FirstATransposeAFirstA縦形式の生データEEE

9実施日, 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.,
11., 12., 13., 14., 15., 16., 17., 18., 19., 20.=

【パワフルなImport】Mathematicaに表計算ソフトの情報を読み込むために利用したImportという命令は，表計算ソフトだけでなく様々なデータ形式のファイルを読み込むことが出来ます．扱える形式は「$ImportFormats」という命令で確認できまAll Rights Reserved, Copyright (C) Kosaku Nagasaka 2007

ü 実験データを直接読み込んでみよう

Mathematicaを使いはじめた理由によっては，CSV（カンマ区切り）やTSV（タブ区切り）形式で保存しているかもしれません．でも安心してください．表計算ソフトで保ここでは実験データが次のようにCSV形式とTSV形式で保存されているとしましょう．下記の説明ではファイル名を「vertical20.csv」と「vertical20.tsv」としています

実験データ：CSV形式とTSV形式

表計算ソフトのデータと同じくImportという命令に，次のように読み込みたいファイ
ル名を文字列として指示して読み込みます．読み込んだデータには名前を付けておきましょう．ファイル名を入力するのが面倒な場合は，前述の通り，メニューの「挿入In[19]:=
Out[19]=In[20]:=
Out[20]=

CSVのデータ = Import@"vertical20.csv"D

881, 1.78<, 82, 5.04<, 83, 10.35<, 84, 18.63<,
85, 29.82<, 86, 40.7<, 87, 51.98<, 88, 65.53<,
89, 83.06<, 810, 102.35<, 811, 124.69<, 812, 147.71<,
813, 171.23<, 814, 200.74<, 815, 225.5<, 816, 259.76<,
817, 289.63<, 818, 324.55<, 819, 364.03<, 820, 402.24<<
TSVのデータ = Import@"vertical20.tsv"D

881, 1.78<, 82, 5.04<, 83, 10.35<, 84, 18.63<,
85, 29.82<, 86, 40.7<, 87, 51.98<, 88, 65.53<,
89, 83.06<, 810, 102.35<, 811, 124.69<, 812, 147.71<,
813, 171.23<, 814, 200.74<, 815, 225.5<, 816, 259.76<,
817, 289.63<, 818, 324.55<, 819, 364.03<, 820, 402.24<<

Mathematicaに読み込まれたデータは，表計算ソフトのファイル形式でも，CSVやTSV形式でも同じように扱うことが出来ます．従って，同じようにブラケット2つの組を使えば好きなところを切り出すことが出来ます．例えば，10番目や12番目のデータ
In[21]:=
Out[21]=

CSVのデータ@@10DD
810, 102.35<

All Rights Reserved, Copyright (C) Kosaku Nagasaka 2007

In[22]:=
Out[22]=

CSVのデータ@@12DD
812, 147.71<

実施日に関するデータだけ，測定値に関するデータだけを取り出したい場合にも，表計算ソフトの場合と同じく「All」を使うことで次のように取り出すことが出来ま
CSVのデータ@@All, 1DD

Out[23]=81, 2, 3, 4, 5, 6, 7, 8, 9, 10,
11, 12, 13, 14, 15, 16, 17, 18, 19, 20<

In[24]:=

CSVのデータ@@All, 2DD

In[23]:=

Out[24]=81.78, 5.04, 10.35, 18.63, 29.82, 40.7, 51.98, 65.53,
83.06, 102.35, 124.69, 147.71, 171.23, 200.74,
225.5, 259.76, 289.63, 324.55, 364.03, 402.24<【数の表現の多様性】実験データにおける数の表現は，数学的な表現だけでな
く，「E」を使ったものなど様々なものがあります．MathematicaのImportは実験
データなどに含まれる多様な数の表現を自動認識するので，特に意識することなく
ü 面倒だからMathematicaの中でデータを作ってしまおう

表計算ソフトは使っていないけれど，データ処理を行いたい場合もあります．いわゆ
るシミュレーションです．Mathematicaにそのようなデータを作らせるためには，双子
今回，取り扱うデータの種類は2次元データになります．従って，それぞれのデータは対で表現されます．例えば，双子素数の際に使用した方法を模して作るとすれば，次In[25]:=
Out[25]=

Table@8i, Prime@iD<, 8i, 1, 20<D881, 2<, 82, 3<, 83, 5<, 84, 7<, 85, 11<,86, 13<, 87, 17<, 88, 19<, 89, 23<, 810, 29<,
811, 31<, 812, 37<, 813, 41<, 814, 43<, 815, 47<,
816, 53<, 817, 59<, 818, 61<, 819, 67<, 820, 71<<

前項などで扱った形式のデータ，すなわち， x座標が1, 2, 3, …となるにつれて， y座標
が x2 にランダムな誤差を加えたものをTableで作成するには次のようにします．

All Rights Reserved, Copyright (C) Kosaku Nagasaka 2007

In[26]:=
Out[26]=

Table@8i, i ^ 2 + RandomReal@80, 5<D<, 8i, 1, 20<D881, 3.44449<, 82, 8.30703<, 83, 9.16048<, 84, 18.7909<,
85, 27.4718<, 86, 36.6054<, 87, 53.8471<, 88, 66.1074<,
89, 81.3053<, 810, 104.886<, 811, 125.119<,812, 146.611<, 813, 170.026<, 814, 196.671<,
815, 225.73<, 816, 258.882<, 817, 290.286<,
818, 327.023<, 819, 362.367<, 820, 400.484<<

もしくは，より分かり易く変数に xを使うならば次のようになります．

Table@8x, x ^ 2 + RandomReal@80, 5<D<, 8x, 1, 20<D

表計算ソフトから読み込んだデータと同じではつまらないので，ここでは多少変更してデータを生成して，結果を「生成データ」としてMathematicaに覚えさせておきまIn[27]:=

生成データ = Table@8x, −x ^ 2 + 300 + RandomReal@80, 50<D<,
8x, 1, 20<D;

このデータの次元を確認すると，前項などで読み込んだデータと同じ次元になっていIn[28]:=
Out[28]=DimensionsA生成データE
820, 2<

もちろん， x軸だけの取り出しや， y軸だけの取り出し，データの行と列を入れ換えることも同様に可能です．
生成データ@@All, 1DD

Out[29]=81, 2, 3, 4, 5, 6, 7, 8, 9, 10,
11, 12, 13, 14, 15, 16, 17, 18, 19, 20<

In[30]:=

生成データ@@All, 2DD

In[29]:=

Out[30]=8335.14, 318.404, 292.545, 319.12, 315.785,
303.398, 282.894, 259.457, 251.296, 211.562,
189.721, 181.96, 150.144, 127.566, 75.2987,
92.8222, 17.4194, −19.1319, −55.5681, −74.5124<

All Rights Reserved, Copyright (C) Kosaku Nagasaka 2007

In[31]:=
Out[31]=

TransposeA生成データE

881, 2, 3, 4, 5, 6, 7, 8, 9, 10,
11, 12, 13, 14, 15, 16, 17, 18, 19, 20<,8335.14, 318.404, 292.545, 319.12, 315.785,
303.398, 282.894, 259.457, 251.296, 211.562,
189.721, 181.96, 150.144, 127.566, 75.2987,
92.8222, 17.4194, −19.1319, −55.5681, −74.5124<<

データを分析して分かり易く可視化してみようü データをとりあえず表形式で表示してみよう

Mathematica内でTableを使って生成したデータはリストのリスト，すなわち2次元リスト（2次元配列，2次元データ）になっていますので，リスト（グループ）について
In[32]:=

GridA生成データ, Frame → AllE

Out[32]=

1
335.142 318.404
3 292.545
4
319.125 315.785
6 303.398
7 282.894
8 259.457
9 251.296
10 211.562
11 189.721
12 181.96
13 150.144
14 127.566
15 75.2987
16 92.8222
17 17.4194
18 −19.1319
19 −55.5681
20 −74.5124

今回のデータは高々20組しか含まれていませんが，実際には大量のデータを扱うことが多いでしょう．そのような場合，データの1番目から4番目だけ表示したい，ということもあります．特定の 番目だけの取り出しであれば，表計算ソフトからのデータ
読み込みの際に学んだ，リストの直後にブラケット2つの組（「[[」と「]]」）で数All Rights Reserved, Copyright (C) Kosaku Nagasaka 2007

既に学んだ方法と関連する方法として，要素の削除に使ったDropとは反対に「リストの最初の要素から指定した個数分だけ取り出しなさい」という意味を持つ「Take」を使う方法があります．使いかたはDropと全く同じです．
In[33]:=
Out[33]=

TakeA生成データ, 4E

881, 335.14<, 82, 318.404<, 83, 292.545<, 84, 319.12<<

しかしながら，Mathematica 6にはより便利な方法が用意されています．それは，リス
トの直後にブラケット2つの組（「[[」と「]]」）の間に，セミコロン2つ（;;）の左
右に1番目から4番目と書く方法です．次のように指示を出すことで，データの1番目かIn[34]:=
Out[34]=

生成データ@@1 ;; 4DD

881, 335.14<, 82, 318.404<, 83, 292.545<, 84, 319.12<<

リストの名称@@始めの番号;;終わりの番号DD
取り出し元のリスト
ブラケット２つセミコロン２つブラケット２つ

リスト操作：データの一部分だけを取り出す

従って，生成データの一部分だけ（例えば，1番目から4番目，17番目から20番目など）を取り出して，それを表形式で表示するには次のように指示を出すことになりまIn[35]:=

GridA生成データ@@1 ;; 4DD, Frame → AllE

Out[35]=

1 335.14
2 318.404
3 292.545
4 319.12

In[36]:=

GridA生成データ@@17 ;; 20DD, Frame → AllE

Out[36]=17 17.4194
18 −19.1319
19 −55.5681
20 −74.5124

データの行と列を入れ換えるTransposeを使うと，横に広がる表形式で表示させることも出来ます．この場合，データの数が大いと右側の方にスクロールしないと全体像が見えなくなってしまいます．実際，「個々の要素を非常に小さく表示しなさい」とAll Rights Reserved, Copyright (C) Kosaku Nagasaka 2007

In[37]:=

GridATransposeA生成データ@@5 ;; 16DDE, Frame → All,
ItemStyle → TinyE
5

6

7

8

9

10

11

12

13

14

15

16

315.785

303.398282.894259.457251.296211.562

189.721181.96150.144127.566

75.2987

92.8222Out[37]=

なお，最初に読み込んだような表計算ソフトのデータの場合は，次のようになります．最初のデータ対が項目名になっているので，そのままで非常に見やすいものにな
In[38]:=

GridA最初のシート@@1 ;; 11DD, Frame → AllE

Out[38]=

実施日
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.

測定値
4.777255.552889.32646
19.5483
27.6226
40.3695
50.6452
67.062281.9948102.578

同様に，データの行と列を入れ換えるTransposeを使うと，横に広がる表形式で表示させることも出来ます．この場合，データの数が大いと右側の方にスクロールしないIn[39]:=

GridATransposeA最初のシート@@1 ;; 11DDE, Frame → All,
ItemStyle → TinyEOut[39]=

実施日

1.

2.

3.

4.

5.

6.

7.

8.

9.

10.

測定値

4.777255.552889.32646

19.5483

27.6226

40.3695

50.6452

67.062281.9948102.578【Takeによる部分取り出し】Mathematicaでは同じ操作を様々な方法で行えると，何度も説明しています．「リスト[[n;;m]]」という形式での部分取り出しも，違う方法で行うことも可能です．例えば，「Take[リスト,{n,m}]」や「リストü データを点グラフで表示してみよう

今度はデータをグラフで表示してみましょう．グラフで表示させるには，「次のデータを点グラフで表示しなさい」という意味の「ListPlot」という命令を使いまAll Rights Reserved, Copyright (C) Kosaku Nagasaka 2007

In[40]:=

ListPlotA生成データE

300

200

Out[40]=

100

5

10

15

20

ListPlot@データのリストD表示させたいデータのリスト

必要に応じてオプションが付く

データの可視化：データを点グラフで表示する

表計算ソフトから読み込んだ最初のシートのデータには，項目名である文字列も含まれていますが，Mathematicaは「文字列は可視化すべきデータではない」と判断して表In[41]:=

ListPlotA最初のシートE
400

300

Out[41]= 200

100

5

10

15

20

グラフの軸に名前を付けるには，「各軸にラベルを付けなさい」という意味のオプシ

All Rights Reserved, Copyright (C) Kosaku Nagasaka 2007

ョン「AxesLabel」を使います．このオプションには，次の例のようにリストで x軸に付けるラベルと y軸に付けるラベルを文字列（二重引用符で囲む）で指定します．
In[42]:=

ListPlotA生成データ, AxesLabel → 9"実施日", "測定値"=E
測定値
300

200
Out[42]=

100

5

10

15

20

実施日

点グラフだけでは若干見づらいので，「点から軸までを線で結びなさい（軸までを線で埋めなさい）」という意味のオプション「Filling → Axis」を使うことで，より
In[43]:=

ListPlotA生成データ, AxesLabel → 9"実施日", "測定値"=,
Filling → AxisE

Out[43]=【グラフのオプション】Mathematicaのグラフィックスに関連する命令には非常に多くのオプションが用意されています．余りにも多いため，本書で全てを扱ってはいません．細かい設定に興味を持った方は，各グラフの命令（今回の例で言えAll Rights Reserved, Copyright (C) Kosaku Nagasaka 2007

ü データを折れ線グラフで表示してみよう

今度はデータを折れ線グラフで表示してみましょう．折れ線グラフで表示させるには，「次のデータを折れ線グラフで表示しなさい」という意味のIn[44]:=

ListLinePlotA生成データE

300

200

Out[44]=

100

5

10

15

20

しかし，単純な折れ線では線分を確認するのが難しいので，次のように「全ての線分の区切りを表示しなさい」という意味のオプション「Mesh → All」を追加して使用

All Rights Reserved, Copyright (C) Kosaku Nagasaka 2007

In[45]:=

ListLinePlotA生成データ, Mesh → AllE

300

200

Out[45]=

100

5

10

15

20

ListLinePlot@データのリスト, Mesh→AllD
表示させたいデータのリスト

線分を分かり易くするオプション

データの可視化：データを折れ線グラフで表示する

前項で使用したListPlotと今回のListLinePlotは非常に良く似た命令なので，次のように前項のListPlotにいくつかのオプションを組み合わせることでも同じグラフを描かせることが可能です．オプションの「Joined → True」は「点と点を線でIn[46]:=

ListPlotA生成データ, Joined → True, Mesh → AllE

300

200

Out[46]=

100

5

10

15

20

前項と同じく，「線から軸までを色を塗って埋めなさい」という意味のオプション

All Rights Reserved, Copyright (C) Kosaku Nagasaka 2007

「Filling → Axis」を使うことで，より見やすくすることも出来ます．
In[47]:=

ListLinePlotA生成データ, Filling → AxisE

Out[47]=

なお，各軸にラベルを付けるには前項と同じくAxesLabelを使います．
In[48]:=

ListLinePlotA生成データ, Filling → Axis,
AxesLabel → 9"実施日", "測定値"=E

Out[48]=

ü 複数のデータを同時にグラフに表示してみよう

複数のデータ列がある場合は，同じグラフに表示させて比較検討を行いたいと思います．表計算ソフトであれば，グラフ描画の範囲指定で複数のデータ列を選択しておけ
ば，そのようなグラフを描けます．Mathematicaで複数のデータ列をプロットするには，他の命令と同じくリストを使って複数のデータ列を指定します．折れ線グラフに

All Rights Reserved, Copyright (C) Kosaku Nagasaka 2007

In[49]:=

ListPlotA9生成データ, 最初のシート=E
400

300

200
Out[49]=

100

5

10

15

20

ListPlot@8データ1のリスト,データ2のリスト,...< F
何組のデータ列もリストで与えれば描画されるデータの可視化：複数のデータ列を点グラフで表示する

複数のデータ列を指定した場合，それぞれについて点グラフにするか折れ線グラフにするかを，オプションJoinedで指示することが出来ます．次の命令では，生成データ
In[50]:=Out[50]=

ListPlotA9生成データ, 最初のシート=, Filling → Axis,
Joined → 8False, True<EAll Rights Reserved, Copyright (C) Kosaku Nagasaka 2007

「点から軸までを線で結びなさい（軸までを線で埋めなさい）」という補足指示に使用したオプションFillingを「Filling → {1 → {2}}」と指定することで，「1番目のデータから2番目のデータまでを線で結びなさい」という指示を出すことも出来ます．
In[51]:=

ListPlotA9生成データ, 最初のシート=, Filling → 81 → 82<<E

Out[51]=

このようにして複数のデータ列を扱ってグラフによる比較検討をする場合，グラフ上の点の座標値を正確に知りたくなることがあります．Mathematicaには，「グラフ上の点にマウスを重ねたら，データの詳細をツールチップで表示しなさい」という意味の
ListLinePlotATooltipA9生成データ, 最初のシート=E,
Mesh → All, Filling → AxisE

All Rights Reserved, Copyright (C) Kosaku Nagasaka 2007

【全てはリスト】Mathematicaの基本はリストです．複数のものを扱うときは必ずリス
トが出てきます．この基本を理解していれば，複数のデータ列をグラフに表示するときのリスト指定，オプションによる点グラフと折れ線グラフの切替えのリスト指定，などが自然な方法だと感じられると思います．

回帰分析やフィッティングで関係式を求めてみようü 1次式の回帰直線を求めてみよう

表計算ソフトでは統計的な処理を行うことが多いと思います．そこで，生成データの回帰直線を求めてみたいと思います．操作は非常に簡単で，Mathematicaに対して「最小二乗法で次のデータの回帰直線を求めなさい」という意味を持つ命令「Fit」で次In[52]:=

回帰直線 = FitA生成データ, 81, x<, xEOut[52]=408.561 − 21.8852 x

Fit@データのリスト, 81,x<, x< F

1次式なので0次と1次の項のリスト
回帰直線の目的変数を指定（何でも良い）
フィッティング：データの回帰直線を計算するには求まった回帰直線のグラフを描かせるには，「指定した変数の範囲で，次の関数のグラフを描きなさい」という意味の命令「Plot」を使います．実際に，データ列で与えられている目的変数 xの範囲「1 § x § 20」で描かせてみましょう．

All Rights Reserved, Copyright (C) Kosaku Nagasaka 2007

In[53]:=PlotA回帰直線, 8x, 1, 20<E

300

200
Out[53]=

100

10

15

20

Plot@関数, 8x, 1, 20< F
グラフにしたい関数

描画範囲の始点 描画範囲の終点
関数の変数（この変数についての関数のグラフ）
関数のグラフ描画：陽関数表示の2次元グラフを描く

元のデータ列と比べるために，ListPlotによる点グラフを「グラフ1」というシンボルに覚えさせておきます．Mathematicaでは，数や文字列だけでなく，グラフィックス
In[54]:=

グラフ1 = ListPlotA生成データE

300

200

Out[54]=

100

5

10

15

20

All Rights Reserved, Copyright (C) Kosaku Nagasaka 2007

同様に回帰直線のグラフも「グラフ2」というシンボルに覚えさせておきます．このとき，元のグラフと異なる色がわかりやすいので，オプション「PlotStyle→
Red」により「グラフを描くときに，指定の色（赤）を使いなさい」と指示しておきます．色としてはRedの他，青（Blue），緑（Green）なども使えます．
In[55]:=

グラフ2 = PlotA回帰直線, 8x, 1, 20<, PlotStyle → RedE

300

200
Out[55]=

100

10

15

20

複数のグラフを重ねて表示するには，「複数のグラフを同時に表示しなさい」という命令「Show」を使います．Showには既に覚えさせているグラフを複数個指定するだ
けで，それらのグラフが重なった表示されます．実際に，元のデータ列の点グラフとAll Rights Reserved, Copyright (C) Kosaku Nagasaka 2007

In[56]:=ShowAグラフ1, グラフ2, AxesLabel −> 9"実施日", "測定値"=E
測定値
400

300

200
Out[56]=

100

5

10

15

20

実施日

Show@グラフ1, グラフ2 F
１つ目のグラフ
２つ目のグラフ

必要があればオプション関数のグラフ描画：複数のグラフを重ね合わす

なお，わざわざシンボルに覚えさせるのが面倒な場合や，覚えさせる必要がない場合
は，次のように直接ShowにListPlotやPlotなどの命令を組み合わせることも出来ま
ShowAListPlotA生成データE,

PlotA回帰直線, 8x, 1, 20<, PlotStyle → RedE,
AxesLabel −> 9"実施日", "測定値"=E【グラフの重ね合わせ】Mathematica 6以前では，グラフの重ね合わせの際に特殊なオプション指定（DisplayFunction）をする必要がありましたが，Mathematica 6からグラフィックスも通常の数式と同じように扱えるため，非常にシンプルな命令だけで求めた回帰直線の式を使って，回帰直線上のデータ列を作ることも可能です．リスト
を作ることになるので，双子素数の探索などでも使ったTableを利用します．実際にAll Rights Reserved, Copyright (C) Kosaku Nagasaka 2007

In[57]:=Out[57]=

回帰データ = TableA9x, 回帰直線=, 8x, 1, 20<E881, 386.676<, 82, 364.79<, 83, 342.905<, 84, 321.02<,
85, 299.135<, 86, 277.249<, 87, 255.364<, 88, 233.479<,
89, 211.594<, 810, 189.709<, 811, 167.823<,
812, 145.938<, 813, 124.053<, 814, 102.168<,
815, 80.2824<, 816, 58.3972<, 817, 36.5119<,
818, 14.6267<, 819, −7.25855<, 820, −29.1438<<

結果，元のデータ列「生成データ」と回帰直線のデータ列「回帰データ」が準備できたので，これらを複数のデータ列をグラフ表示することで，次のようによりわかりやIn[58]:=Out[58]=

ListPlotA9生成データ, 回帰データ=, Filling → 81 → 82<<EAll Rights Reserved, Copyright (C) Kosaku Nagasaka 2007

In[59]:=

ListPlotA9生成データ, 回帰データ=, Joined → 8False, True<,
Filling → 81 → 82<<E

Out[59]=ü より高次な回帰曲線を求めてみよう「最小二乗法で次のデータの回帰直線を求めなさい」という命令「Fit」では，2次以上の項も含めて指示することで，任意の次数の曲線を使ってフィッティングを行わせることが可能です．下記の例では，結果のグラフを書くために，求めた回帰曲線をIn[60]:=

回帰曲線 = FitA生成データ, 81, x, x ^ 2<, xEOut[60]=329.274 − 0.261614 x − 1.0297 x2

Fit@データのリスト, 81,x,x^2,...<, x< F

必要な次数までの項のリスト
回帰直線の目的変数を指定（何でも良い）
フィッティング：データの回帰曲線を計算するには求まった回帰曲線は，前項と同じくPlotを使うことでグラフを描くことが出来ます．実際に，データ列で与えられている目的変数 xの範囲「1 § x § 20」で描かせてみま
しょう．

All Rights Reserved, Copyright (C) Kosaku Nagasaka 2007

In[61]:=PlotA回帰曲線, 8x, 1, 20<E
300

200

Out[61]=

100

10

15

20

元のデータ列とも，Showを使って比べてみましょう．既に覚えさせてある「グラフ1」と「グラフ2」に加えて，回帰曲線のグラフを重ね合わせています．やはり，元々In[62]:=ShowAグラフ1, グラフ2,

PlotA回帰曲線, 8x, 1, 20<, PlotStyle → OrangeE,
AxesLabel −> 9"実施日", "測定値"=E

測定値
400

300

200
Out[62]=

100

5

10

15

20

実施日

-100

同じ形のリストをたくさん作るのに適している組込み関数Tableを活用すること
で，幾つもの次数によるフィッティングを同時に作らせることも出来ます．下記では，生成データの回帰直線（1次多項式への最小二乗法による当てはめ）の他，2次から4次までの各多項式への最小二乗法による当てはめを計算させています．ここでのAll Rights Reserved, Copyright (C) Kosaku Nagasaka 2007

In[63]:=
Out[63]=

TableAFitA生成データ, x ^ Range@0, nD, xE, 8n, 1, 4<E

9408.561 − 21.8852 x, 329.274 − 0.261614 x − 1.0297 x2 ,321.559 + 3.67497 x − 1.4871 x2 + 0.0145208 x3 ,325.363 + 0.69938 x − 0.884973 x2 − 0.02933 x3 + 0.00104407 x4 =陽関数を描画するための命令であるPlotは，複数の関数をリストで指定することが出来ます．そのため，様々なフィッティングの結果を表示させようと，次のように指示
PlotATableAFitA生成データ, x ^ Range@0, nD, xE, 8n, 1, 4<E,
8x, 1, 20<E

組込み関数のPlotは指示された関数を描画するために，その関数の評価を直前まで行いません．しかしながら，今回の場合は事前に評価しておいてもらわないと逆に困ります．このような場合は，「とにかく事前に評価しなさい」という意味を持つ命令
In[64]:=

回帰曲線など =PlotAEvaluateATableAFitA生成データ, x ^ Range@0, nD, xE,
8n, 1, 4<EE, 8x, 1, 20<E

300

200
Out[64]=

100

10

15

20

これらの高次の項までを使ったフィッティングの結果を元のデータと併せて表示させてみましょう．元のデータ列を分かり易くするために，オプションで赤色を指定してAll Rights Reserved, Copyright (C) Kosaku Nagasaka 2007

In[65]:=ShowAListPlotA生成データ, PlotStyle → RedE, 回帰曲線など,
AxesLabel −> 9"実施日", "測定値"=E

測定値
400

300

200
Out[65]=

100

5

10

15

20

実施日

-100

以前に出てきたTooltipをうまく組み合わせて指示を行うことで，このような複雑な式でも，どの線が何次のフィッティングとなっているかをマウスで確認できるように
ShowAListPlotATooltipA生成データE, PlotStyle → RedE,
PlotAEvaluateATooltipA

TableAFitA生成データ, x ^ Range@0, nD, xE, 8n, 1, 4<E

EE, 8x, 1, 20<E, AxesLabel −> 9"実施日", "測定値"=E

All Rights Reserved, Copyright (C) Kosaku Nagasaka 2007

ü 複雑な非線形モデルを使った回帰曲線を求めてみよう

前項までは多項式によるデータ列の当てはめを求めさせていましたが，より複雑な式，三角関数などの初等関数や未知のパラメータが初等関数の中に含まれるような非線形モデルを使ったフィッティングを行ってみましょう．ここでもフィッティングはIn[66]:=

グラフ1 = ListPlotA生成データ, PlotStyle → RedE

300

200

Out[66]=

100

5

10

15

20

多項式への当てはめに使用した組込み関数Fitには，「 xn 」形式だけでなく目的変数の任意の式を含めることが出来ます．例えば，三角関数も含めたい場合には，次のように「Sin@xD」や「Cos@xD」を加えることで，それらの係数パラメータを最小二乗法で求めさせることも出来ます．ここで，Sin@xD は「sin(x)」を，Cos@xD はcos(x)を表しており， Mathematica への指示における三角関数は，他の組込み関数と同じく最初の文字を大文字に，変数である「 x」をブラケット（[]）で囲む必要があります．
In[67]:=

Out[67]=曲線with三角関数 =FitA生成データ, 81, x, x ^ 2, Sin@xD, Cos@xD<, xE

328.905 − 0.0661435 x − 1.04225 x2 +3.41616 Cos@xD + 0.526301 Sin@xD

前項までと同じように，組込み関数Showを使うことで重ね合わせて表示させることが出来ます．もちろん，Tableを使ってデータ列をサンプリングすることで，点グラフ

All Rights Reserved, Copyright (C) Kosaku Nagasaka 2007

In[68]:=ShowAグラフ1, PlotA曲線with三角関数, 8x, 1, 20<EE
300

200

Out[68]=

100

5

10

15

20

-100

一方，推定すべきパラメータが線形でなく複雑な場合には，組込み関数Fitを使うことが出来ません．このようなときは，「次のモデルのパラメータを指定したデータにフィットするように求めなさい」という意味を持つ組込み関数「FindFit」を使いま
下 記 で は ， 生 成 デ ー タ をF i n d F i tに よ り ， 「a x2 + b sinHc xL + d 」 な る モ デ ル（a, b, c, d は未知のパラメータ）への当てはめを行わせています．Mathematicaは結果をSolveなどと同じく置換規則で返します．
In[69]:=

FindFitA生成データ, a x ^ 2 + b Sin@c xD + d, 8a, b, c, d<,xEOut[69]=8a → −1.04175, b → −1.17478, c → 1.45104, d → 328.294<

FindFit@データのリスト, モデル, 8a,b,...<, x< F
パラメータを含むモデルの式
モデルに含まれるパラメータのリストを指定 目的変数を指定
フィッティング：任意のモデルのパラメータを推定

実際に，モデルの各パラメータに求まった値を代入し，フィッティングによる得られた関数を「曲線by非線形」というシンボルに割り当てましょう．ここでは直前にIn[70]:=

曲線by非線形 = a x ^ 2 + b Sin@c xD + d ê. %Out[70]=328.294 − 1.04175 x2 − 1.17478 Sin@1.45104 xD

前項までと同じように，組込み関数Showを使うことで重ね合わせて表示させてみます．この例では，線形でも，多項式でも，非線形でも結果は余り変わりませんAll Rights Reserved, Copyright (C) Kosaku Nagasaka 2007

が，データによってはモデルにより大きく変化します．
In[71]:=ShowAグラフ1, PlotA曲線by非線形, 8x, 1, 20<EE
300

200

Out[71]=

100

5

10

15

20

-100

【なぜ置換規則で報告するのか】Mathematicaは，指示された組込み関数により，直接求まった値（数値の場合もあれば数式の場合も）を報告してくることもあれば，今回のFindFitのように置換規則で報告してくることもあります．統一されていた方が分かり易いかもしれませんが，その指示の結果を他の操作に使う可能性の高い命令（パラメータや根を求めるなど）では置換規則の方が，そのような操作が一般に少ない場

数や文字列をMathematicaからファイルに出力しようü フィッティングの式からデータ列を作ろう

前項までにも出てきましたが，回帰直線などのフィッティングの結果から，回帰直線上などのデータ列を生成するには，組込み関数のTableを使えば良いということはわ
ここでは，次のようなFindFitによる非線形フィッティングを行って得られた関数に
In[72]:=

曲線by非線形 = a x ^ 2 + b Sin@c xD + d ê.

Out[72]=328.294 − 1.04175 x2 − 1.17478 Sin@1.45104 xD

FindFitA生成データ, a x ^ 2 + b Sin@c xD + d, 8a, b, c, d<, xE

一応，フィッティングで得られた関数をグラフにすると次のようになります．

All Rights Reserved, Copyright (C) Kosaku Nagasaka 2007

In[73]:=ShowAグラフ1, PlotA曲線by非線形, 8x, 1, 20<EE
300

200

Out[73]=

100

5

10

15

20

-100

フィッティングで得られた関数から曲線上のデータ列を得るためには，組込み関数のTableを使います．生成したいデータの形「{x, 曲線by非線形}」を最初に，目的変In[74]:=
Out[74]=曲線by非線形のデータ = TableA9x, 曲線by非線形=, 8x, 1, 20<E881, 326.086<, 82, 323.848<, 83, 320.018<, 84, 312.168<,85, 301.28<, 86, 290.018<, 87, 278.034<, 88, 262.583<,
89, 243.357<, 810, 223.025<, 811, 202.537<,
812, 179.447<, 813, 152.223<, 814, 122.944<,
815, 93.6383<, 816, 62.7124<, 817, 27.7562<,
818, −10.2113<, 819, −48.5374<, 820, −87.6069<<

このようにして作ったデータを元のデータと確認したい場合は，点グラフを描かせる

All Rights Reserved, Copyright (C) Kosaku Nagasaka 2007

In[75]:=

ListPlotA9生成データ, 曲線by非線形のデータ=E

300

200

Out[75]=

100

5

10

15

20

-100

既にフィッティングで関数が求まっているので，それを使った外挿も可能です．単純にTableで指定する目的変数の範囲を広げることで，フィッティングされた関数によIn[76]:=

In[77]:=

曲線by非線形のデータ外挿 =TableA9x, 曲線by非線形=, 8x, −10, 30<E;
ListPlotA9生成データ, 曲線by非線形のデータ外挿=E

200

-10

10

20

30

Out[77]=

-200

-400

-600

一方，内挿を行う場合には，目的変数の範囲を指定しているリストの最後に刻幅を加えます．これまでは刻幅が1だったので何も指定していませんでしたが，範囲指定の最後には刻幅を指定できます．以下の例では，刻幅を0.5にすることで内挿を行っていAll Rights Reserved, Copyright (C) Kosaku Nagasaka 2007

In[78]:=

In[79]:=

曲線by非線形のデータ内挿 =TableA9x, 曲線by非線形=, 8x, 1, 20, 0.5<E;
ListPlotA9生成データ, 曲線by非線形のデータ内挿=E

300

200

Out[79]=

100

5

10

15

20

-100

【この項の意味】Mathematicaはグラフを描くのに，データ列を必要としません．従って，本項で扱ったデータ列の作成は，グラフを描かせるためではなく，内挿や外挿を行うためであったり，その結果を次項で扱うように表計算ソフトに出力するためのもü フィッティングの結果を表計算ソフトに出力しよう

この章の冒頭でMathematicaに取り込んだ表計算ソフトのデータに対して，次のように
非線形フィッティングを行った場合を考えましょう．ここでは「」というモデルでフィッティングをFindFitで行い，結果を「最初のシートの関数」というシンボルに割In[80]:=

最初のシートの関数 =a x ^ 2 + b Sin@c xD + d ê.
FindFitADropA最初のシート, 1E, a x ^ 2 + b Sin@c xD + d,
8a, b, c, d<, xEOut[80]=2.08469 + 1.00287 x2 − 0.422091 Sin@0.961878 xD

前項の方法に基づいて，次のように内挿を行います．結果はかなり長くなるので，こ
こではセミコロンを付けて出力を抑制しています．結果は「内挿」というシンボルにIn[81]:=

内挿 = TableA9x, 最初のシートの関数=, 8x, 1, 20, 0.25<E;

このままでは数値データしかなく不便なので，最初のシートの最初の要素（これは次のようにFirstで取り出せます）をデータ列の最初に加えておきましょう．こうする

All Rights Reserved, Copyright (C) Kosaku Nagasaka 2007

In[82]:=
Out[82]=FirstA最初のシートE
9実施日, 測定値=

データ列が納められているシンボル「内挿」はリストになっているので，その項目名を最初に追加するには，「次のリストの最初に指定した要素を追加しなさい」という
In[83]:=

内挿withラベル = PrependA内挿, FirstA最初のシートEE;

Prepend@リスト, 追加したい要素< F
この最初に追加する

最初に入れたい要素

要素の追加：リストの最初に要素を追加する

このようにして内挿したデータの形式を表計算ソフトから読み込んだデータと同じ形式にしました．表計算ソフトへのデータの出力は「次のデータをファイルに適切な形式で保存しなさい」という意味の命令「Export」を使います．Exportは指定されたファイル名の拡張子によって，適切な形式でファイルにデータを保存しますので，今In[84]:=

ExportA"interpolate_vertical.xls", 内挿withラベルE

Out[84]=interpolate_vertical.xls

Export@出力先のファイル名, データ F
適切な拡張子を持つファイル名にする
ファイルに保存したいデータを指定
ファイルへの保存：表計算ソフトにMathematicaのデータを出力

表計算ソフト上で横に並ぶデータとして保存したい場合は，事前に縦と横を入れ換える命令Transposeで縦と横を入れ換えておきます．このようにすることで，下記の図In[85]:=

ExportA"interpolate_horizontal.xls",
TransposeA内挿withラベルEE

Out[85]=interpolate_horizontal.xls

All Rights Reserved, Copyright (C) Kosaku Nagasaka 2007

表計算ソフト：内挿結果を出力したExcelファイルの内容

ü グラフを画像ファイルやPDFに出力しよう

Mathematicaでは数値データだけでなく画像なども様々なファイル形式で出力することが出来ます．既に学んだように，これらは画像等を選択してファイルメニューから保存出来ますが，表計算ソフトへの出力と同じく組込み関数のExportを使っても可能です．一度に複数のグラフを出力したい場合などは，メニューを使うよりもExportで出力する方が楽です．
ここでは実際に次のようなグラフをファイルに保存することを考えましょう．ファイ
ルに保存すれば，様々なアプリケーションソフトからも利用出来るので便利です．もちろん，コピー&ペーストでも他のアプリケーションで利用できますが，画像ファイル単体にしておく方が記録上は便利と思います．
In[86]:=

内挿のグラフ = ListPlotA内挿E
400

300

Out[86]= 200

100

5

10

15

20

画像ファイルへの保存の仕方も表計算ソフトへの保存の方法と同じです．唯一異なる
点は，出力先のファイル名の拡張子が画像ファイルの拡張子となることです．次の例
では「.jpg」と拡張子を指定しているので，JPEG形式の画像ファイルとして保存され

All Rights Reserved, Copyright (C) Kosaku Nagasaka 2007

ます．この他，「.png」でPNG形式，「.bmp」でBMP形式など，多くの画像形式で保存することが出来ます．
In[87]:=

ExportA"interpolate.jpg", 内挿のグラフE

Out[87]=

interpolate.jpg

また，拡張子を「.pdf」とすることで，PDF形式でも保存できます．
In[88]:=

ExportA"interpolate.pdf", 内挿のグラフE

Out[88]=interpolate.pdf【ファイル形式】Mathematicaは実に様々なファイル形式に対応しています．この項で利用したExportという命令は，表計算ソフトや画像だけでなく様々なデータ形式のファイルとして保存することが出来ます．扱える形式は「$ExportFormats」という命令で確認できますが，100種類を超えています．