先日は、
■ R言語を使う : インストール ~ 簡単な操作【 プログラミング 】
■ R言語を使う(2) : 外部で作ったCSVを使う【 プログラミング 】
のようにR言語について書きましたが、Pythonでは、外部ライブラリなしでもリストを使って配列を作れるの、データの集合体を作る事ができます。これについては、
の中で触れていますが単一のリストの中に一次元の配列を作る事ができます。JavaScrioptでもArrayを使う事で同じように配列を作る事ができますが、ネスト(入れ子状にする)事で、多次元配列を作る事が出来るので、整数制御の平座標や空間座標のような物を作る事ができます。多次元の配列については、
の中で触れていますが、多次元化をすると帳票のようにデータを扱えるようになるんドエグラフにもしやすくなりますし、カテゴライズしてデータを分ける場合にも三次以上の多次元配列を扱う事になります。
実質的に、スオプレッドシートの管理などは三次元配列でこれをファイル単位で行き来できるような管理をすると4次元以上の構造になるので、リレーショナルデータベースのような小周防だっとデータの構造型地毛化する事になります
配列については、三次元までだとグラフに示す事が出来るので、データの解析に使用できますが、Pythonにもmatplotlabと言うライブラリがあります。これについては、以前、
の中でヒストグラムを使っていますが、matplotlbではそのほかのグラフも作れるので、それについて書こうかなと思います。
外 部ライブラリ : matplotlab
Pythonの学習をする場合、最初の段階で標準実装機能を使うので組み込み関数を使って処理を覚えて、その後に標準ライブラリを使う事になりますが、この時に 【 import 】 を使った標準ライブラリの読み込みを行い、関数を使う事になります。
その後、関数やクラスは自作可能で、処理の塊を関数やクラスで作成して単一のコードを小さくして借りするとメンテナンス性が高くなり機能の追加や削減が行いやすくなることも学びますが、外部ライブラリを使うと標準ライブラリでは行えない事もできるようになる事も学習します。
自作の関数については、
■ Pythonでの外部参照 【 Python 3.10.1 】
の中で実際に使っていますが、関数やクラスはどこからでも呼び出しが出来るので、外部ファイルを用意してツリー階層を合わせた状態で呼び出しを行うと、その階層からファイルを呼び出す事が出来ます。
外部から処理を呼び出すと
のような感じで処理が出来るのですが、
の中で紹介しているようにいろいろなライブラリが存在しているので、外部のライブラリを使う事で色々な事が出来るようになっています。その為、Open-GLなどを使う事もできますしGLSLを使ったシェーダーのプログラムなども外部ライブラリ参照で行う事が出来ます。(これは、Pythonだけでなく、C++も同じです。)
matlptlibのそうした外部ライブラリになりますが、グラフを作るのに特化した物になるので、解析などでも使えますが、グラフを書く場合だとR言語レベルで物凄く簡素な記述でグラフを作れる仕様になっています。
m atplotlibを使う
matlpotlibを使う場合、データを自分で書くこともできますが、外部参照もできるので、コードと同じ階層にCSVファイルを用意しておくとそれを読み込んで使用する事ができます。この辺りはR言語に似てますが、かなり簡素なコードでグラフを作れます。
■ matplotlibの記述
記述をする場合、一番最初に
matplotlib.pyplot
を読み込みます。この記述は、matplotlibの中のpyplotを呼び出しているのですが、これを呼び出す場合、外部ライブラリなので、標準ライブラリのmathやrandomなどと同じようにimportで追加する事になります。
そして、実行されるライブラリは処理の前に必ず宣言しておく必要があるので、通常は、ライッブラリのインポートはコードの先頭に記述をする事になります。そうなると、
import matplotlib.pyplot
になりますが、殆どのコードだと、この状態ではなく、
import matplotlib.pyplot as plt
のようになっていると思います。
そして、コードを見ると読み込んだはずのmatloptlib.pyplotもなくなっていると思います。なぜそうなるのか?と言うと、このas以降の記述の秘密があって、asを使うと、インポートしたライブラリの名称を短縮する事ができます。なので、コード内の関数の呼び出しの時には、
plt.関数名()
の記述が出てきます。まず、読み込みの段階で、asが使われているのですが、Pythonでコードを書く時には、関数名がひたすら長くなることがあります。その為、コードを書く時にそれを基準に関数を呼び出すとコードが見づらくなるので、asを使って関数を略称で使用できるようにしてある場合があります。この辺りは、初期段階では学習しない内容なので、基礎を学習した後にコードの最適化をする上で学習していく内容になりますが、関数名が長くなりやすい物を扱う場合だとこうした処理を行う事が出来ます。なので、自作した関数をまとめたpythonファイルを作った場合、
from ファイル inport 関数名
のような形で読み込むことになりますが、この記述についてもasを使うと略称で関数を使う事が出来るようになります。
とりあえず、通常の言語だと、先頭行に使用する機能の記述を行うので、Pythonだとimportを使った記述をしますが、C言語やC++で使用しているincludeも同じで 【 使用する機能のヘッダーやライブラリの読み込み 】 をするのに読み込むための記述になります。なので、コメントアウトされている記述ではなく、実行する記述なので、そこが欠損するとエラーが発生します。
importについては、JavaScript(ES)のように元からフロントエンドを使う物のバックエンドとして動かすための物のような仕様だと違いますが、通常の限度の場合バックエンド用の言語なので、GUIを作れる仕様の統合環境を使わない条件だと、何かしらのウィジェットを読み込んで実装する必要があります。なので、SWIFTでもUIを使う場合にimportを行いますし、どの言語でもそう言った仕様になっています。
基本的にプログラミング言語には必要最低限の物だけ用意されており、言語の機能は標準ライブラリにまとめてあるので、それを使って使用する機能を追加して行く仕様になっているので、ライブラリを使用する際にはコードの戦闘で記述をして実行する流れになっています。
■ データを追加する
データについてはコード内で用意した変数と外部参照が可能になっており、パスを指定するとその場所のCSVを読み込んで使用できます。なので、スプレッドシートのデータをCSVにして書き出しておいてそれを参照して使用することもできる仕様になっています。
データについてですが、 【 リスト型 】 なので、 [1, 2, 3] のような形になるので、
変数名 = [データ,データ, データ,...]
のような形になります。
リストの形は、別の用途でも使用できるので、色々な使い方ができます。
ここで、データを並べて行く事になりますが、GUIでの表示なので、Tkinterのように各項目の指定を個別に行って行く事になりますが、基礎的な作りとしては、
■ グラフの土台
■ グラフのタイトル
■ グラフのラベル
■ グラフの種類
を指定する事になります。
■ グラフの指定
基本的に、グラフの仕様は定型フォーマットなので、仕様を覚えるとtkinterなどと同じような感じで使えるようになります。
まず、最初にグラフを作る時に、
fig.ax
でグラフを作る事になります。最初のグラフの土台作りでは、
■ グラフの土台作り
fig.ax = plt.subplots()
で土台を作ります。ここにタイトルやラベルを用意して、データをどう言った形のグラフにするのかを指定する訳ですが、グラフのタイトルは
■ グラフのタイトル
ax.set_title('タイトル名')
で指定します。次に、ラベルですが、これは、グラフの項目になります。つまり、五教科のテストのグラフを作る場合、グラフ部分は点数になりますが、科目の表記がないとどのスコアなのか判断できません。
この科目の表記のように対象の名前を記述するのがラベルになります。ラベルの表記ですが、
■ グラフのラベル
ax.set_xticklabels('ラベル名')
になりますが、五教科のように5つも項目がある場合、ラベルを5個用意する必要があります。この場合、
ax.set_xticklabels(['国語', '数学', '理科', '社会', '英語', ])
のようにリストにまとめておくと5つのラベルを配置する事が出来るようになります。これで、何のグラフでどう言う項目があるのか?を指定できますが、そのグラフを何で示すのかを指定しなくてはなりません。ここで、グラフの設定をします。グラフの種類の設定ですが、
■ グラフの種類
ax.種類名('ラベル名')
で指定します。matplotlibでは、
■ 折れ線グラフ
■ 散布図
■ 棒グラフ
■ ヒストグラム
■ 円グラフ(パイチャート)
■ 箱ひげ図
■ バイオリンプロット
が使えますが、
■ 折れ線グラフ
pyplot.plot(データ)
■ 散布図
pyplot.scatter(x_データ, y_データ)
■ 棒グラフ
pyplot.bar(x_位置, y_高さ)
■ ヒストグラム
pyplot.hist(データ)
■ 円グラフ
pyplot.pie(データ)
■ 箱ひげ図
pyplot.boxplot(データ)
■ バイオリンプロット
pyplot.violinplot(データ)
のような表記になります。これでグラフの仕様がある程度固まったので、グラ府として出力します。この時に、
■ グラフとして出力
plt.show()
で表示をします。基本部分はこんな感じで行えるので、少ない行数で
グラフを書くことができます。その為、定型フォーマットとして
のようなひな型を用意しておくと作業がしやすくなります。
グ ラフを得る
多分、折れ線グラフやを得るだけだとラベルyタイトルが必要ないのですが、この場合だと、更にコードを短くできます。例えば、2つの折れ線グラフの比較だと、
import matplotlib.pyplot as plt
plt.plot(データ)
plt.show()
だけで済みます。また、単一のデータを円グラフのする場合も
のようにできます。棒グラフとヒストグラムも含めて、この辺りの処理だと、スプレッドシートでも簡単にできると思うのですが、
のような感じで、複数のデータから箱ひげ図を作る場合だと、スプレッドシートで行うとこんな簡単に書き出せないはずですから、matplotの方が作業負荷が軽くなる事があります。あと、文字のサイズは表示などについても、コントロールできるので、仕様を先に決めておいてその状態でグラフに落とし込むとスプレッドシートよりも少ない作業で求める結果を得る事が出来るようになります。
ちなみに、
のような定型を使った場合だと、
のような感じにできるので、
のように複数の箱ひげ図にタイトルと題目を追加する事ができます。
日本語のタイトルを入れる場合には、別のライブラリが必要になりますが、この図を見てもらうと、一つの軸に対して標本調査や全数調査をした時の結果を並べる事が出来るので、時間軸に対して一つの事象の表記ではなく、集計結果のようなデータの集合の状態を示す事が出来るようになります。故事に例では意図的に外れ値を入れていますが、箱ひげ図と外れについてもしっかりと表記できるようになっています。
こうして見てみると、matplotが入っているグラフを簡単に作れるので、箱ひげ図と平均値の折れ線グラフなどを並べて表示する際には、速いのですが、グラフを並べて表示したりサイズの変更もできるので、データがある場合だと、コードを書いた方が早い場合があります。
あと、matplotlibでは、グラフをpngなどでエクスポートできるので作ったグラフを画像ファイル解いて出力することもできるので、書面を作る上での使用する事ができます。
表示では、線の太さや分布図の表示の変更など様々な機能があるので、それについては次の機会に加工k名と思いますが、グラフを作る機能でも色々な機能を実装しています。
Anacondaなどを使うと、Numpyやmatplotlibなどは選択できるようになっているので、色々な機能を使えるようになっていますが、IDLEを使ったコーディングの場合だと、pipでインストールする必要があるので、必要なライブラリを追加して作業をする事になります。
現在の中学校のカリキュラムでは、箱ひげ図が登場しますが、データの範囲として、中央値を出して、その中央から見て上下の中央値を出したもので箱を作ります。なので、中央値と平均値は異なるのですが、数値の数で分割した物で箱を作り、そこから箱を作った物が箱ひげ図になります。この構造にすると、時間軸の中に多くのデータが分布している状態を表記できるので、折れ線グラフのように単体のデータではなく、グラフの平面の中に 【 集合の状態 】 を示す事が出来るようになります。ちなみに、matplotのデータは、 【 x, y 】 という形で表記する事が出来るので、折れ線グラフの座標などもこれで表記できますが、この座標は、リストにすると複数の座標を格納できるので、
([1, 2,3 ], [1, 2,3 ])
のような表記もできます。
知 識を付ける理由
今回はグラフにつてい描きましたが、グラフを使う時にはデータの集まりを使いますから、多次元配列の物を使う事になります。この辺りは、高校の多変数関数や4次元以上のベクトルと考え方が同じですが、多次元化したベクトルの場合、三次元を超えた場合、図示できなくなるので、 【 数ベクトル 】 を扱いますが、高校の数学で登場する多変数関数も二変数関数までだと三次元空間なので、ユークリッド空間での三次元の空間でグラフを示す事が出来るようになっていますが、4次元以上の座標軸が発生した場合、三次元を平面に見た時に発生する極限レベルの微細な層の集合体がなしている数直線が追加された状態なの、数値で扱った方が都合がいいので、多変数関数も座標軸で示す変数が増えた場合には数式と数値で考えることになります。二変数関数だとGeogebraとかを使って実際にグラフを作ってみた方が面白いと思いますが3変数関数のように四次元になる物だと数値を使う事になります。変数を扱う時に、数学では代入を行いますが、数学の解析学の分野では 【 データと活用 】 のカリキュラムのようにデータの分布を用意して集計する物も登城します。現在では、こうしたリキュラムが小学校の高学年で主行うようになっていますが、集計を行ったグラフを見てそこから判断をするようなカリキュラムも存在ています。この時に出て来るグラフが社会の授業で見かけるグラフと同じ仕様の物になりますが、そのグラフの作り方や判断をする上で必要となる数値の読み解く方法なども学習します。
グラフによるデータの集計は手作業で行いますが、そう言った状態でそれが成立しているのかを知ると集計もしやすくなりますが、膨大なデータから判断をする場合だと、コンピューターを使う事になりますから、そう言った処理はコンピューターで行えるわけですが、コードを書く上での知識として 【 数学が欠落してコードの打ち込みしか出来なくなると何も作れなくなる 】 ので 【 知識ありきでコードを書く 】 と言うのがセオリーになります。
とりあえず、何かを作る場合には、 【 無知でも出来るという妄言は信用しない方がいい】 ので、必要な能力や知識がないと動くことは出来ても酷い結果を出すかとん挫するだけなので、動いても動かなくても破綻する状態しか用意されていないので、そうならない為に知識や能力を取得する必要があります。
そうした理由から、 【 処理の構造を知る 】 必要がある訳ですが、数学の知識もそうですし、グラフの生成で必要となる知識なども欠落すると他の知識が理解できなくなるので、 【 判断自体を見誤る 】 事になります。と言うのも、数学とは二値で構成されている幾何まみれの現実の中で単一の事象を同一な指標で判断する為の方法や、その挙動を共通認識で理解でき、同じ事象を同じように扱えるようにするための発明品ですから、状況判断を適正に行うための道具になります。
幾何とは状態の有無と認知における座標の差異と言う曖昧な物になりますから、この状態だと 【 寸法 】 【 距離 】 【 時間 】 の概念がありません。この推移を適正に使用できているのは数値が存在するからですし、n進数で推移する数直線上の加算による処理が発生しているためですから、そこには推移を示す加算と言う演算の基本的な数式が存在しています。これを用いることで、状態を二値ではなく階調を持たせることで、誤差の少ない状態で認識できるようになり、推移については動きの状態を数式を用いることで判断できるようになっています。この加算尾累積が乗算ですし、この乗算の構造は単位に対して係数を付加した物になりますし、除算は逆数の乗算なので加算の応用分野ですし、ロジックを用いた場合の除算は補数を算出して加算する事で除算が出来るので、基本となるのは加算器です。ロジックが加算器と言う加算を行う回路の応用で四則演算が出来るように、計算式の応用で複雑な処理が出来るように泣ている訳ですが、乗算の累積が累乗であり、等差数列の総和のように異なる物を扱う時にΣを使うのと同じように 【 アルゴリズムの中に数式を包含する事で複雑な処理ができるようになっている 】 訳ですが、こうした推移についても、幾何と代数を組み合わせることでグラフのような座標軸を表現できるので、現実世界の差次元の状態も二変数関数のグラフの中に幾何ベクトルを配置して制御をすると方向と距離と言う形でベクトルの端を指定する事が出来るわけです。つまり、その点を特定の座標とした場合、三角関数や線形代数や行列やオイラー角などを用いて三軸の回転を与えることが出来るようになっています。直線移動と拡大については、加算と係数の付加なのでそれほど難しい物ではありませんし、むしろ、高校の幾何ベクトルや関数の加算などと同じ考え方なので、三角関数を使わなくても行えるものになりますが、回転の場合だと三角関数の知識を基本としてそこから拡張した物を使う事になります。
このように現実世界の幾何の集合体が空間座標内に存在している状態も数学を用いて判断する事が出来るわけですが、基礎が解らないと応用分野も解らないので、その基礎を固めるのが義務教育でその応用が高校以上のカリキュラムになります。また、小学校だと3年間の基礎固めの後に応用分野を高学年の3年間で学ぶ仕様になっていますが、中学校以降は1年生で学んだ内容が基礎になっているのでその基礎が出来ている前提で2年生以降のカリキュラムが進んでいきますから、基礎の理解が出来ていないと解らなくなる仕様になっています。知識の構造自体が 【 基礎とその拡張 】 で出来ていますから、基礎が欠落するとそれを使った分野の全てが理解できなくなります。
これは、 【 外部ライブラリ依存のコード 】 と考えると解りやすいのですが、外部ライブラリを使うコードがあった場合、そのライブラリがインストールされていない状態だとエラーが出て実行が出来ません。これが、知識の欠落と全く同じ状態になります。そうならない為の知識の拡張が必要になりますが、知識はあくまでも道具なので完成した物を使う時の工程と言うのは、ソフトウェアのフロントエンド部分でしかありませんから、それを見てもコードの全体の状態は解りません。と言うのもバックエンドの処理は何をしているのか解らないので、これだと処理は全く分からなくなりますが、フロントエンドの部分は使い方を覚えれば扱えるようになります。これが、エンドユーザーの操作になりますが、 【 その構造物の設計や開発 】 となると、エンドユーザーの状態だとどうにもならないので、 【 設計・開発に必要な知識 】 が必要になります。その為、 【 基本構造をなしている部分の知識 】 を身に着けることになります。これが数学や物理などの理数の分野だったり、自然言語を使う場合だと語学の分野だったりします。
基本的に自然の現象だけで物事を判断すると寸法や重量などの基本的な単位に破綻が生じるので、相当酷い事になってしまうわけですが、そうならない為の知識として紀元前から数学と言う発明品が使用されています。グラフや解析学の始まりは17世紀からですが、空間を行使のような状態で考えてその位置を元に考えることが出来るような仕様になっているので、現実世界の出来事とも親和性があり、数学の知識を用いることで 【 予測 】 をする事もできるようになっています。
人が日常で体感している物理法則はニュートン力学によるものですから、時空間上の物を認知するのに使用する物になりますから、特定の変域を設けて使用した際には殆どの辞書において当てはまりますが、顕微鏡や天体望遠鏡で見なければ見えない物を標準レンズで見て判断するというのは無理があるので、対応したツールの適応範囲外になった場合、別の知識を使う事になるので、超弦理論や相対性理論や量子力学と言う分野があります。同じカテゴリーでも演算の方法についても異なる手法を用いることがありますが、3DCGのレンダーの場合もラジオシティーのようなシェーダーを用いたレンダリングだと熱力学で光の計算を行っていますし、パストレーサーだと光の反射を元に計算しているので異なる物理法則を基準に計算結果を求めています。
その為、ニュートン力学と超原理論では、計測対象と道具が違うだけという考え方が正しい認識だと思います。
データの集計については、処理部分はコンピューターで行うのでコードでその処理wが行いやすい状態にする必要がありますが、処理のアルゴリズムを考える場合には、コードの構造を考える必要がありますし、数的な処理が発生する場合には、その処理の部分を考える必要が出てきます。そうなると臼学的な知識が必要になりますから、プログラミングの本来の意味の 【 作る 】 と言う作業には知識と言う材料が必要になるので、その材料を追加する作業として学習による知識のストックの拡張が必要になります。また、倉庫を始めても仕方がありませんし、検索エンジンのように文字だけが表示されるだけでも意味がありませんから、 【 実際に使える形で理解を深める 】 必要があります。