1.準備

1_4 基礎知識(2019/1/25)

1)システムの基礎

人間は頭で考えますが、コンピュータは、CPUとメモリで考えます。人間は考える時に本やノートを活用しますが、コンピュータは、外部記憶装置(ハードディスク等)を活用します。IPO(Input・Process・Output)で考えると、キーボードやタッチパネル等から入力され、ハードディスク等を活用しながらメモリ上の情報をCPUで処理し、画面や印刷装置に出力するという様な動きになります。
ハードウェア的な理解では以上の通りですが、ソフトウェア的な理解が不十分です。人間は生きる上の最低限の知識と考える基本的な能力を持って生まれてきます。コンピュータは、OS(Operationg System)という基本的な能力を備えています。例えば、Windows10もOSの1つです。人間は幼少期に生まれた国や環境によって生きていく術を獲得し、成長に応じて場面に応じた応用力を身につけていきます。コンピュータもOSが備わっているだけでは何もできないのに等しい存在ですが、ブラウザやメールソフトがあればインターネットを快適に使用することができるようになり、表計算ソフトやワープロソフトを使用することで事務処理ができるようになります。
では、Pythonを使用したデータ分析はどの様に行われるのでしょうか?先ず、AnacondaからPythonのパッケージを導入しました。これは、人間でいうと統計全集という百科事典を購入した様な物で、これだけではデータ分析はできません。次に、Pythonのプログラムを実行します。これは、Pythonのプログラムがハードディスクからメモリ上に展開されてCPUが処理可能な状態になったことを意味します。これで初めて、Pythonのプログラムを入力することで、CPUがPythonの処理を進めてくれることになります。
しかし、このままではAnacondaから導入した機能が全て使える訳ではありません。Anacondaは、Windowsの世界でいうとOfficeの様な物です。違うのは、最初にPythonありきであって、Pythonを実行し、その上でその他の機能を使用することになります。OfficeでEXCELを実行する時には、EXCELをそのまま実行しますが、Anacondaのパッケージを使用するには、先ず、Pythonを実行し、その上で使用したい機能をPython上で実行していくことになります。つまり、Pythonに加えて、Anacondaの豊富な機能の中から使用したい機能を選んでメモリ上に展開することでCPUに処理させることができるようになるということです。
Python上にそれらの機能が展開されることになりますので、個々の機能の結果はPythonの結果にもなり、それぞれの結果を組み合わせた処理が可能になります。データをPython上に取込み、複数の機能を組み合わせてデータ分析し、分析した結果を出力することができるということです。

2)プログラムの基礎

本ブログのデータ分析は、Pythonによるプログラミングを前提にしていますが、Pythonの説明を本ブログでは行いません。Pythonの理解を深めたい方は、Pythonに関する書籍を購入してください。しかし、Masterにも記載しましたが、本ブログでは、書籍での勉強等を先行させるより、まず使えることを優先させます。もし、本ブログに記載されてるPythonの記載で分からないことがあれば、以下のサイトをご覧ください。Pythonの文法やPython自体の個々の機能の説明が記載されています。現時点で、英語、フランス語、日本語と韓国語での説明が用意されています。言語とバージョンを選択できるようになっています。

https://docs.python.org/ja/3/

本ブログでは、Pandasというライブラリを中心に扱います。本ブログの名前の由来にもなっています。PandasはAnacondaで提供されるライブラリであり、Officeで提供されるEXCELの様な物です。Pythonを実行する時には、Pandasも併せてメモリに常駐させておく必要があります。本ブログでのデータ分析は、データを読み込んでPandasのオブジェクトとして記憶し、Pandasの機能を用いて分析していきます。
Windowsでは、csv形式のデータをEXCELに読み込んで、EXCELの画面上でEXCELの様々な機能を活用してデータ分析をすることができます。Pandasによる分析も考え方は同じですが、画面上ではなくコマンドで処理していきます。csv形式のデータをPandasに読み込んで、Pandasの様々な機能で処理し、処理した結果をcsv形式のデータで出力するという様な事が可能です。グラフ等を使って他の分析をする場合は、Pandasのデータをグラフ等の別機能で処理することになります。
データ分析をするのであれば、Pythonの文法を覚えるより、Pandasの使い方を覚える方が手っ取り早いということが言えます。Pandasでは、表形式のデータを様々な方法でデータ分析ができますが、それらはPythonの文法に則ったPandasのコマンドで行われます。Pythonの実行する時にPandasも併せてメモリ上に常駐させることで、Pandasのコマンド群によるプログラミングが可能になるということで、これらは、Pythonのプログラムとして認識されます。つまり、Pandasを活用したPythonプログラムをエディタで作成し、Python上で実行するということであり、プログラムですので、何度でも同じ処理を実行できますし、少しプログラムを変更して実行するという様なデータ分析では欠かせない処理が可能になるということであり、データやプログラムを外部記憶装置(ハードディスク等)に格納することで、再現性が確保されることになります。
PythonやPandasについては、ネット上に多くの説明サイトがありますので検索してみてください。公式のPandasのサイトは以下になります。当該サイトは英語の説明しかありませんが、メニューの「documenteation」を選択すると全ての機能について最新の説明を確認することができます。確認したい機能について、Search機能で検索することもできますし、「API Reference」を選択することで、機能の一覧を確認することができ、そこから機能を選択することで当該機能の説明を確認することもできます。

https://pandas.pydata.org/

3)Pythonの基礎

Pythonの文法について予め学習しなくても良いようなことを記載しましたが、最低限の基礎を理解しておく必要があります。本ブログではシステム開発を目的としておらず、単純にデータ分析を手順通りにできれば良いだけですので、システムの構造化の様な事を考える必要はありませんので、細かな文法を覚える必要は無いのですが、順番に処理するだけであっても、理解しておかなければならない基礎的な文法があります。
先ず、使用するライブラリを指定する必要があります。Pandasを使用しますので、Pythonのプログラムの最初にPandasを含めて実行するということを宣言します。つまり、Pythonのプログラムの最初を見れば、どの様なライブラリを使用したプログラムなのかが分かることになります。そういう意味では、使用しないライブラリを定義することはなるべくやめた方が良いということになります。プログラミングでは、過去に作成したプログラムを活用するということがよくあります。その為、以前には使用していたが、今回は使用しなくなったライブラリがそのまま定義されているということもよくあります。自分のプログラムだから別に分からなくならないし、余分なライブラリが定義されていても大して処理には影響がないと考える人も居ますが、これは誤った考えです。システム開発でも同じですが、データ分析を長年実施していれば、過去のプログラムを活用するということは当たり前になっていきます。また、前回行ったデータ分析を入力データを変えて、同じようなことを再処理するということも日常的に行われます。仕事という観点では、とても効率の良い仕事とも言えます。しかし、1年以上前でに作ったプログラムを正確に覚えておくというのは容易なことではありません。つまり、後から見ても、第三者が見ても分かり易いようにプログラミングしておくということは、非常に重要なことになります。
Pythonのプログラムは、段落を厳密に管理します。Python以外のプログラムでは、階層構造となるグループを各種括弧により囲むことで定めます。しかし、Pythonではこの様な括弧の使い方はしません。プログラムの階層構造は、段落でのみ指定します。つまり、インデントが同じ位置の記述は、同じグループだということになります。例えば、条件文(年齢が65歳以上の場合等のような記述)があった場合は、当該条件に合致した場合の記述は、当該条件分から1つインデントが下がった位置から書くことになります。複数の処理があっても同じインデントで記載します。また、別の条件分があれば、そこから更に1つインデントが下がります。当該条件の処理が書き終わったら、1つ上のインデントに戻った位置から書き始めることになります。この様にして、インデントの位置を上下させながら、階層構造でプログラミングしなければなりません。これは、プログラムを後から解読する際、非常に見易いプログラミングになっていると言えます。
これだけ分かっていれば、後は、プログラムを順番に読んでいけば理解は可能です。細かな作法は、後から順次覚えていけば良いと割り切ってください。

4)Pandasの基礎

Pandasには、シリーズ(Series)という1次元のデータ形式と、データフレーム(DataFrame)という2次元のデータ形式があります。基本的には、2次元のデータフレーム形式のデータを使用します。データフレームで集計した結果がシリーズとして返されるということがよくありますので、シリーズというデータ形式も使用します。
データフレーム形式は、2次元のデータであり、EXCELの表形式のデータと似ています。複数の表形式のデータがあった場合、EXCELでは複数シートで管理しますが、Pandasでは、複数のデータフレームで管理します。3次元以上のデータがあった場合、Pandasのデータフレームで、3次元以上の様に2次元データを管理することができますが、可能であれば2次元で扱えるようにデータを分割する等してデータ分析した方が良いと思います。例えば、性別・年齢階層別の地区毎の平均給与という3次元データがあった場合、男性の若手層、女性の若手層、男性の熟年層、女性の若手層・・・の様な順番で、地区別のデータの場合ですが、男性のデータと女性のデータにデータフレームを分けて、男性のデータフレームでは、年齢階層別の地区別になる2次元データにしてしまう等です。なるべくシンプルに処理することを心掛けてください。
本ブログの入力データは、csv(comma-separated values)形式のファイルを使用します。csvファイルは2次元のデータですので、Pandasの機能で読み込んでデータフレームに置き換えます。データフレームに置き換えた後は、Pandasの様々な機能が使えます。
データフレームは、2次元の行列データです。列の名称は、columnsとなりますので注意してください。行の名称は、indexとなります。行と列を転置したり、並べ替えたりすることなどが自由にでき、行側と列側で同じように処理することが可能ですが、本ブログでは、列側(EXCELでいうところのA・B・C等の列、Pandasのcolumns)にデータの種類があって、行側(EXCELの1・2・3等の行、Pandasのindex)にそれぞれのデータ種類毎の観測値が配置されているということを基本原則とします。
Pandasの処理は、ブロードキャスト(broadcast)という処理方式になります。テレビやラジオの放送もブロードキャストと呼ばれ、1つの放送が全ての受信者に同じように届きます。同様に、Pandasの処理も1つの計算が行列内の全ての要素にいきわたります。もちろん、個別の要素を指定して計算を加えることも可能ですが、行や列を指定しないと全ての要素に適用されてしまいます。EXCELでは、Aの列にBの列の値を加えた結果をC列に代入するという処理を行う場合、C列の全ての行のセル上にAとBの値を加えるという指定をしなければなりませんが、Pandasでは、A列とB列の値を足し合わせてc列に代入するという指定をするだけでC列の全行に計算結果が代入されます。ビッグデータの処理においては、非常に楽になります。一般的なプログラム言語では、C=A+Bの様な計算式を行数分繰り返し処理するという処理を添え字を使って書き表しますが、Pandasであれば、1行の記載で済むということになります。つまり、ミスが少なくなりますし、処理の把握も容易になります。
Pandasでは、欠測値や異常値に対する処理も豊富です。必ず、最初にデータのチェックをしてから分析を進めるようにしてください。Pandasでは、扱っているデータに対して、整数、実数、文字列等の違いを区別して扱います。列毎にデータ形式を管理することになりますが、整数データであっても欠測値が含まれている場合は、当該列のデータは、整数として扱うことができず、文字列等と同様に、objectというデータタイプとして扱われますので注意してください。例えば、a=1とするとaには、整数の1が代入されますが、b=”1″とするとbには、文字としての1が代入されます。aとbを比較すると異なるものということになります。EXCELでも問題になりますが、前ゼロの問題があります。整数として「001」を読み込めば「1」として認識されますが、文字列として「001」を読み込めば「001」として認識されます。どういうデータ形式で管理されているかを確認することも重要になります。

5)Pythonのオブジェクト指向

Pythonはオブジェクト指向言語であり、Pandasもオブジェクト指向言語です。PandasもPythonの文法に則って記載します。
データ分析をするだけであれば、システム開発と異なり、クラスを定義するようなことはありません。オブジェクト指向による開発の様に、インスタンス(instance)、継承(inheritance)、多様性(polymorphism)等を意識することはありません。関数を定義する程度です。一般的なPythonの説明は、これらの説明から入りますので頭を悩ませることになってしまいます。
しかし、Pandasもオブジェクト指向言語であり、シリーズやデータフレームは、オブジェクトとして認識されます。データフレーム内の列も複数のデータ形式で認識されますが、オブジェクトとして扱います。つまり、オブジェクト指向で扱う対象は、全てオブジェクトだということになります。オブジェクトに対する処理は、Pythonに定められた四則演算等の一般的な処理や、自分で作成した関数を適用することも可能ですが、オブジェクトには、オブジェクト毎に扱えるメソッド(機能)が定められています。例えば、Pandasのデータフレームのオブジェクトには、データフレームを処理するためのメソッドが用意されており、シリーズのオブジェクトには、シリーズを処理するためのメソッドが用意されています。Pythonにおいて、オブジェクトのメソッドを使用する方法は、以下の様になります。
例えば、ser1というシリーズのオブジェクトに、平均値を計算するmeanというメソッドを適用して、その結果をmという変数に代入するには、以下の様に記載します。mは、実数(浮動小数点型)になります。
m = ser1.mean()
オブジェクト.メソッド()の様に記載します。メソッドによって得られる結果のデータ形式は異なります。例えば、データフレームオブジェクトのメソッド1の結果がデータフレームになり、メソッド2の結果もデータフレームの場合、データフレームにメソッド1とメソッド2の両方を適用する場合、以下の2つの方法があります。
df1 = データフレーム.メソッド1()
df2 = df1,メソッド2()
でも良いですし。以下でも良いです。
df3 = データフレーム.メソッド1().メソッド2()
df2とdf3の結果は同じデータフレームになります。
先ずは、これだけを抑えて、本ブログの説明を読み進めてください。

6)IPythonというインタープリタ

会議の通訳には、同時通訳や逐次通訳がありますが、プログラム言語の機械語への翻訳もコンパイル方式(プログラムする全てのソースコードを翻訳してから実行)とインタープリタ方式(命令毎に翻訳して実行)の2種類があります。Pythonのプログラムは人間には分かり易いですが、コンピュータには理解できないので、機械語に翻訳してから実行されるのです。
データ分析をするには、インタプリタ方式が優れていますので、本ブログでは、IPythonという対話型の実行環境を活用します。Pythonの前にInterpreterの頭文字のIを加えてIPython(アイパイソン)となっています。
IPythonの実行環境では、実行した命令を覚えていて、以前の命令をIPythonの実行環境に再表示させ、再実行させることもできます。また、今まで実行した変数の中身がどうなっているかを表示させたり、変数のデータ形式を調べることもできます。更には、実行時の処理時間を表示させることも可能です。
本ブログのデータ分析では、Pythonのプログラムは、プロジェクトごとに管理されたフォルダに格納されます。当該プログラムは、テキストエディタで記述します。そして、IPythonとテキストエディタの両方を実行している状態で、テキストエディタ上のプログラムをコピペ(コピー&ペースト)することにより、IPython上にプログラムの命令を入力することで実行していきます。この時、コピペして実行するプログラムは、1命令毎に行っても良いですが、複数の命令を一度にコピペして実行することも可能です。IPythonは、1命令ずつでも実行できますし、複数命令を一度に実行することも可能なのです。そして、実行した命令や変数の情報はすべて覚えています。
一般的なPythonによるデータ分析の進め方としては、先ず、Pythonのプログラムをある程度まで記載します。そして、1命令ずつ、IPythonにコピペして、実行します。人間は間違える生き物ですので、必ず何かしらの間違いをします。スペルミスもその一つですが、ミスをすると正常に実行されませんし、文法を間違えているとIPythonが文法の間違いを指摘します。この様にして、1命令ずつ、文法の間違いが無いか、データの型や内容に間違いが無いか、データの件数は確からしいか等確認しながら、実行記録を残しながら分析を進めます。そして、その日の作業が終了したら、テキストエディタを保存した後終了し、IPythonも終了し、パソコンもシャットダウンします。次の日、また、テキストエディタとIPythonを実行して作業を続けようとしますが、IPythonは昨日の処理を覚えていません。そこで、テキストエディタにより、プログラムの最初から昨日の処理の最後までをコピペして、一度にIPythonで実行します。これで、昨日の最後の状況と同じになりましたので、昨日の続きのデータ分析作業を続けられるようになります。
また、同日のデータ分析作業の途中で、それまでの処理に誤りがあることに気が付く場合もよくあります。この場合は、誤りがある個所の直前までコピペして再実行し、修正後のプログラムを実行するという手順になります。つまり、IPythonで一度に実行する命令は、その時々の状況に応じで変わるということです。
また、Windowsのコマンドを実行することもできます。プロジェクト毎にファルダを変更して管理しますが、Windowsのコマンドで、現在のフォルダの情報を表示させるコマンド(pwd)を実行したり、実行するフォルダの位置を変更するコマンド(cd フォルダ名)を実行したりすることができます。
本ブログでは、Pythonのプロジェクトは、全て、C:\Pythonの下にプロジェクト名のフォルダがあると考えていますが、IPythonは、最初に、Windowsのスタートメニューの「Anaconda3(64-bit)」の中の「Anaconda Prompt」(Anacondaの環境を実行する為のWindowsのコマンドプロンプト)を実行しますが、この時のカレントディレクトリは、Windows上のユーザーディレクトリに設定されてしまいます。
そこで、例えば、abcという名前のプロジェクトの中のstep1というデータ分析のPythonプログラムでは、最初に、以下を記載しておきます。
cd c:\Python\abc\step1
これで、プロプラムでは、当該フォルダ内の入力データや出力データの記述において、フォルダを気にせず記載できます。データのファイル名称だけを指定して入力処理を記述すれば、当該ファイルは、当該フォルダの中のファイルであることになります。
当該プログラムを印刷等しておいて将来において確認した場合でも、当該プログラムは、abcプロジェクトのstep1という処理で使われていたプログラムであるということが分かりますし、他のプロジェクトで再活用する場合も、最初の実行フォルダの指定だけを変更すれば良いということになります。インタープリタ上でWindowsのコマンドが実行できるということは、この様なメリットをもたらします。
さあ、基礎知識はこれで終わりです。先ずは、やってみなはれ!