高校の情報Iでは、RやPythonの外部ライブラリのmatplotlibなどを使うことになると思いますが、これらを使うとデータを二次元配列にして使用して多変数の構造物を扱えるようになります。
こうしたデータについては、義務教育だとデータと活用のカリキュラムでデータ数が少ないものを扱いますが、このデータ数が多い状態でのデータの集計や取り扱いを行う方法を情報Iでは使用することになります。
R言語やmatplotlibは便利なんですが、この構造についてはスプレッドシートなどでも同じことが行えるわけですが、この処理がどのようなものなのかを構造的に体験しながら学習できるのが情報Iのカリキュラムになります。
スプレッドシート
スプレッドシートの名称よりも表計算ソフトのほうが馴染みがあると思いますが、このソフトウェアでは、マス目状に並んだセルの中にデータを格納して集計するためのツールになっています。
その為、集計を行う際にはデータの参照後に必要な処理を講じることによって目的の処理を行えるようになっています。
表計算ソフトだとマイクロロフトのExcelが有名ですが、現在のバージョンではパワークエリーが実装されているので、Accessで使用するクエリーのようなことがExcelだけで行えるようになっています。その為、現行版と昔のバージョンでは行えることが異なります。
商用のオフィースソフトの場合だと有償になりますが、無償で使用できるOSSのオフィースソフトのLibre Officeを使用すると同様のことが行えます。収録されているツールの 【 CLAC 】 がスプレッドシートになりますが、これを用いるとパワークエリーのような機能はないものの通常の表計算の処理を行えるようになっています。
スプレッドシートは、
のような構造になっていますが、この画面構成はどのツールも同じで、レイアウトなどにに多少の誤差はあるものの 【 行う作業が全く同じ 】 なので基本的な画面構成は同じになります。
構造と処理
スプレッドシートでは、
■ シート
■ セル
の構成になっているわけですが、シートにはマス目状にセルが配置されており、その中にデータを格納して処理をする仕組みになっています。
スプレッドシートでは、
■ セルの縦罫、横罫での集計
■ セルを参照した演算処理
が行えるようになっています。例えば
のようにセルに数値を記入した後に関数を使うと
のように横方向の合計値を出すことが出来ます。この際に
のようにSUM関数を用いることになりますが、これが高校の数学で登場する数列の総和と同じ処理になります。その為、ExcelではオートSUMには 【 ∑ 】 が用いられています。
この処理は、
のように縦でも使用できますが、ここでも
のようにセルを指定してその中に関数とセルの範囲を追加することで処理の実装が出来るようになっています。
数学では数列の総和の∑も数式を構築するための 【 部品 】 として使用するのですが、小学校で同じ処理の加算を乗算として扱うような拡張を行ったように数列も 【 数列の積 】 を出す方法があります。この時に使用するのが 【 Π 】 になりますが、大文字のπを使用することで数列の積を扱えるようになっています
こうした処理も関数で実装されているのでスプレッドシート上でしようできるようになっていますから、
のように関数を用意して範囲指定を行うと
のように結果を取得できるようになっています。こうした処理はアプリケーションなので
■ 丸め誤差
■ 桁落ち
■ 桁溢れ
などの内部処理の問題がでない条件であれば影響がないのですが、結果が正しいのかをチェックしなければ間違った値になる場合があります。その為、処理そのものはコンピューターでも出来るのですが、数学の知識がなければ計算結果の合否の判断が出来ないので間違った値を基準として処理を行うことになります。
スプレッドシートでは、
■ データの格納
■ データの集計
が行えるので用意されたデータの平均値なども算出できるのですが、データの羅列のような構造物から必要なデータを作成して使用することが出来ます。
小学校高学年の算数ではグラフを使うのでデータに触れることになりますが、この際に
■ 種類
■ 項目
■ データの数値
と言う形のものを扱うことになります。これは、特定のカテゴリーで集計をした結果の比率を比較したものになりますが、社会の輸出や輸入などを示すグラフも対比をしやすくするための物になります。
その為、上記の種類が 【 目的によって選択したカテゴリー 】 になるわけですが、そのカテゴリーには
■ 対象となる名称
■ データの値
が存在しています。例えば、 【 輸出量 】 の・ようなもので考えた場合だと
■ 国名
■ 量
になりますから、穀物の輸出の場合だとグラムのような小さな単位にすると巨大な数値になってしまうので、この場合には1000kgを1として扱う 【 t(トン) 】 を用います。
こうした単位の変化も小学校高学年で学習することになりますが、これを基準に単位変換を行って数値を割り出すことになります。これを円グラフにした場合、世界の流通量から考えた時にその国の輸出量がどの程度存在しているのか?を見ればその国がどの程度の割合を締めているのかを確認できるわけですが、この時に使用するのが 【 全体の中の構成比率 】 になります。この構成比率の高い順に範囲指定を行ってグラフ化したものが円グラフや棒グラフになります。
このような処理の方法もアナログで行う場合だと人が行えば良いのですが、膨大なデータになると人力だと無理が来るので、通常はコンピューターでの処理を行うことになります。
ただし、こうした処理を刷るアプリケーションの製造を行うのは人の作業になりますから、コードの記述を行った際の整合性を確認するためには、処理で使用しているものの知識を製作者が理解していて、実際に使用できる必要があります。そのための知識を学習する場所が学校になりますが、その機関がない場合には独学で必要な知識を身につけることになります。
データ参照
スプレッドシートで集計を行う際には範囲指定を行ってその範囲内に存在するデータを対象として処理を行うことになりますが、これは関数の引数として 【 範囲 】 を指定している状態になります。
データの参照を行う場合
■ 単体
■ 複数
の選択肢が存在するわけですが、範囲選択は数列の中のデータと同じものなのでこれは 【 複数 】 と言う条件に包含されます。その為、 【 範囲 ⊂ 複数 】 と言う条件になるわけですが、これは、一つのものを複数個選択した条件になります。
スプレッドシートでは一つのセルを参照して別のセルのデータとして使用することも出来るのですが、この際に関数を使用したセルの参照を行うことも出来ます。例えば、
のように参照元を指定して
のように処理を行うと、セル内で処理の結果を取得することが出来ます。
(t)セルの構造
このようにスプレッドシートではセル内にデータを格納して、そのデータを参照して関数を用いて処理の結果を取得できるようになっているわけですが、この構造は、プログラミング言語の
■ 変数の初期化
■ 変数の参照
■ 関数の実行
と同じ構造になっています。現在は学校でPythonに触れることになりますが、Pythonデコーディングを刷る際には
【 組み込み関数はそのまま記述するだけで実行できる 】
ので、コードをそのまま書いても動作します。この辺りはJavaScriptも同じですが、JavaScriptはスターと段階から 【 デスクトップアプリのような仕様 】 ですから、【 入出力 】 の処理を行うことを前提でコードの学習を行った場合、コンソールでは対応できないものがでてきます。その為、その部分を一旦考えないようにして 【 変数の初期化を前提とした物 】 で学習を行うと、Pythonと同様にコンソールで動作する内部処理の部分を学習できるのですが、Pythonと比較すると学習コストが高くなっています。
JavaScriptではPythonのinput関数に相当するものがないので、標準入力を使用してinput関数相当のコードを書く必要があります。これがバッファにデータを記録してEnterキーで確定させる仕組みの入力をJavaScriptで使用する際の方法になります。Pythonだと1文字入力の処理がないので、cursesを使用せずにコンソールで1文字入力を行う処理を実装する際に標準入力を使ったコードを書くことになります。これは、サーバOSのようなCUIの環境下で動作するアプリケーションでカーソルの移動を座標を指定して移動させるような場合に用いることになりますが、プログラミング言語には実装されていない機能もあるので、そういった物は自分で作る必要があります。この2つの事例もソレに該当するわけですが、基本的に 【 存在しないものをコードを書いて作る 】 のがプログラミングなので、その為の基本となる知識をつけるのがプログラミング言語の学習になります。
スプレッドシートでのセルで行える内容は、組み込み関数だけでも行えるものになっていますから、
■ 変数
■ 配列
■ 関数
を使用した処理の実装で動作するようになっています。Pythonで変数の初期化を行う場合 a=1 のような形で 【 変数名 = 値 】 と言う形で指定をします。Javaの場合だと、アクセス修飾子(これはPythonにもありますが記号で指定します。)や型の指定などを行うので 【 厳密な指定を行う 】 ことになりますが、Pythonでは、簡素な記述でコードを書けるので前述のような記述で指定を行うことが出来ます。Pythonでは型を自動で判別していますが、事前に型を指定する場合だと
■ a = int(1)
■ a = str(1)
のようにする事で整数型と文字列型を使い分けることが出来ます。スプレッドシートのセルにも表記の方法の指定が出来るのですが、これもプログラミング言語の型と同じ物になっています。この指定方法はimput関数を使用して数値の入力を行う際にも使用しますが、使用するものが数値型(整数や浮動小数点数)の場合だと入力段階で型を変換しておく必要があるので、処理を行う場所ではなく入力する変数側で方の指定を行うことになります。記述が厳密な言語だと変数自体に型の指定を行って宣言を行い、その変数に対してリテラル(変数の値)を代入するので、宣言時に方は確定しているのですが、Pythonの場合、自動判別とユーザーによる固定の選択が出来るようになっています。
その為、スプレッドシートでセルに値を入力する作業は
■ 変数宣言
■ 型の指定
■ 変数へのリテラルの代入
のと同じなので、この値をどのように使用するのか?をシート内で指定することが出来るようになっています。
セルを参照する場合ですが、単一のセルの場合
a=1
b=2
c=a+b
のような構造ですから、処理代入になっていますが、範囲を指定する場合には数列を使用することになるので、この時に使用するのは配列になります。その為、
a=[0,1,2,3,4,5,6,7,8,9]
のような構造のものを扱うことになります。これが横方向にセルの値を並べた状態になりますが、縦のセルを使う場合には、これを多次元化すればいいので
a=[
[0,1,2,3,4,5,6,7,8,9],
[0,1,2,3,4,5,6,7,8,9],
[0,1,2,3,4,5,6,7,8,9],
[0,1,2,3,4,5,6,7,8,9],
[0,1,2,3,4,5,6,7,8,9],
[0,1,2,3,4,5,6,7,8,9],
[0,1,2,3,4,5,6,7,8,9],
]
のような状態で並べることになります。そうすると、
■ n番目の配列
■ m番目の値
と言う指定ができるようになります。配列の場合、
a[0,1]
のような指定を刷ると、
■ 0番目の配列
■ 1番目の値
を取得できるのでスプレッドシートのような多変数の二次元配列の構造のデータは組み込み関数だけで作ることが出来るようになっています。
こうしたデータを取得する場合には、多次元のループで処理を行うことになりますから、等差数列のような数値の指定が出来るような仕組みのforを使う(標準ライブラリの中にはforよりも高速になる物も用意されています。)ことで複数のデータを配列内に格納することが出来ます。
その為、データの読み書きについては、ループ処理でデータの状態に変化を与えて処理を実行することになりますが、作成したデータは、前述の方法で指定できるので、この指定を行うとその場所のデータの
■ 変更
■ 参照
■ 削除
を行うことが出来ます。この処理もPythonだとリストの機能として実装されているので組み込み関数で使用できる物になります。
この内容を踏まえて考えると二次元配列のデータの場合、インデックスの指定だけでデータの行や列を固定して、インデックスの変化を与えて必要な縦と横のデータ飲みを取得できるので、
■ 横方向 : a[固定,n]
■ 横方向 : a[n,固定]
の状態で変数nを使用したループの指定を行うと縦罫、横罫のデータを取得することが出来ます。このデータの取得後に 【 目的の処理 】 を行えば求める結果になりますから、セルで実装する関数についても同様のものを組み込み関数だけで作ることが出来るようになっています。
このようにプログラミング言語を用いて配列を使用して二次元配列の構造を作り、その中のデータ管理を行うような仕組みをGUIを使って直感的に行えるようにしたものがスプレッドシートになりますが、スプレッドシートでは、この処理をセルと言う単位で管理しやすくした作りになっています。
Pythonの場合
Pythonの場合、組み込み関数だけでも二次元配列を作ってデータの管理が出来るのですが、リストの制御だと処理が遅いので、情報Iで使用するPandasやNunpyなどの外部ライブラリを使用することになります。
こうしたライブラリを使用するとPythonの実行のリソースだけで動作するので表計算ソフトのような多機能なソフトを起動するよりも
■ CPU使用率
■ メモリー使用率
を削減できます。また、スプレッドシートはソフトウェアですから、ファイルの更新を行う際には、もtのファイルを開いて作業を刷る必要がありますし、ソレ以外だと自動化を刷る必要がありますが、この際にもPythonよりも負荷が高くなってしまいます。その為、データを一定の間隔でサンプリングして更新しようと思うとコードでの制御のほうが低負荷に出来るので扱いやすくなります。
そういった理由から、スプレッドシートで行える作業をコードで行う方法を学習するわけですが、配列は視点を変えると多くのことに使用できるので、そのデータを扱うための基本の部分を情報Iで学習することになります。