pythonによるデータ分析入門 - fc2mcobaya.web.fc2.com/advanced/python-pd-basic.pdf · 2017....

70
Python によるデータ分析入門 December 3, 2017 1 入手とインストール 1.1 ソフトウェアについて Python は無料でいくつかのサイトからダウンロード可能だが、配布元により付属ファイルが違 う。この講義では最初にあげる WinPython の使用を前提とする。このパッケージには Python 本体に加えて、きわめて多くの機能拡張用の module(pandas, numpy ) が一緒にパッケージさ れているので、パッケージを追加ダウンロードする必要がなく便利である。ダウンロードは次 のサイト http://winpython.github.io/から行う。 1.1.1 version について Python には一部命令体系のことなった第 2 版があり、それに沿った教科書もあるが、最近は第 3 版が普及しており、こちらを使うほうがよい 1.1.2 Python の主要なダウンロードサイト 1. WinPython https://winpython.github.io/ この解説ではこの WinPython を利用する。この解 説を作成段階 (2017 3 月)では、最新の 3.6 版の WinPython 付属のエディタは IDLEX ではなく、機能に制限のある idle だけが付属しており、3.5 WinPython 3.5.3.1Qt5 利用したほうがよい。 2. anaconda https://www.continuum.io/Downloads これは高性能の PC を所有するならば、インス トール可能である。anaconda がインストール可能な程度の高性能の PC 上で利用するの なら Spyder というエディタが便利である。 3. Python の公式サイト https://www.python.org/ これは original python の本体だけなので、付属 module は少ない。Python 本体についてくる idle というアプリは機能が限定されている。 1.2 インストール手順 1. インストール場所の決定 WinPython のインストール時に、Python 本体と同じフォルダー内に notebook という フォルダーが作成され、そこが外部データを読み書きする場所となる (default working directory)。この notebook を探しやすくするために、c:ドライブの頭に WinPython をイ ンストールすることを推奨する。インストール途中でどこにインストールするかきいて くるので、C:\を指定すること。 1

Upload: others

Post on 01-Jan-2021

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

Pythonによるデータ分析入門

December 3, 2017

1 入手とインストール

1.1 ソフトウェアについてPythonは無料でいくつかのサイトからダウンロード可能だが、配布元により付属ファイルが違う。この講義では最初にあげるWinPythonの使用を前提とする。このパッケージにはPython本体に加えて、きわめて多くの機能拡張用のmodule(pandas, numpy等)が一緒にパッケージされているので、パッケージを追加ダウンロードする必要がなく便利である。ダウンロードは次のサイト http://winpython.github.io/から行う。

1.1.1 versionについて

Pythonには一部命令体系のことなった第 2版があり、それに沿った教科書もあるが、最近は第3版が普及しており、こちらを使うほうがよい

1.1.2 Pythonの主要なダウンロードサイト

1. WinPython  https://winpython.github.io/ この解説ではこのWinPythonを利用する。この解説を作成段階 (2017年 3月)では、最新の 3.6版のWinPython付属のエディタは IDLEXではなく、機能に制限のある idleだけが付属しており、3.5版 WinPython 3.5.3.1Qt5を利用したほうがよい。

2. anacondahttps://www.continuum.io/Downloads これは高性能のPCを所有するならば、インストール可能である。anacondaがインストール可能な程度の高性能の PC上で利用するのなら Spyderというエディタが便利である。

3. Pythonの公式サイトhttps://www.python.org/  これは originalの pythonの本体だけなので、付属moduleは少ない。Python本体についてくる idleというアプリは機能が限定されている。

1.2 インストール手順1. インストール場所の決定

WinPythonのインストール時に、Python本体と同じフォルダー内に notebookというフォルダーが作成され、そこが外部データを読み書きする場所となる (default workingdirectory)。この notebookを探しやすくするために、c:ドライブの頭にWinPythonをインストールすることを推奨する。インストール途中でどこにインストールするかきいてくるので、C:\を指定すること。

1

Page 2: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

2. Pythonのインストール ダウンロードしたファイルを実行し、通常のインストール作業を行う。そのとき、「AddPython to environment variables」にチェックをすると、その後の機能拡張時に手間が省ける。

3. もしも動かなかったら。Visual C++ 再頒布可能パッケージ のダウンロードとインストールこの作業はWindows 10で動くPCでは必要ありませんが、多くのPCでは第一段階が終わった段階で IDLEXを起動しようとすると、「api-ms-win-crt-runtime-l1-1-0.dllがない」 というエラーメッセージが出現し、起動しない。そのときはmicrosoftのサイトからVisual Studio 2015 の Visual C++ 再頒布可能パッケージ ((64ビット版Windowsでは vc_redist.x64.exe、32ビット版Windowsでは vc_redist.x86.exe)をhttps://www.microsoft.com/ja-JP/download/details.aspx?id=48145からダウンロードし、PCにインストールすると動くようになる。

4.  WinPythonの folderを移動(必要な場合だけ)pathの設定を行わなければ、インストール後、フォルダーごと移動しても起動可能である。私はC:ドライブの頭に置くことを好む。アンインストールにはフォルダーごと削除するだけである。USBメモリー等への移動も可能だが、移動にはかなりの時間がかかる。

1.3 moduleの読み込み (os, numpyとpandas)

Python自体はデータ分析機能は限定されており、目的に合致したmoduleを起動後に読み込んで使用する。データ分析でよく用いられるmoduleは数値計算用のライブラリ numpyとデータ処理用のライブラリー pandasである。本稿では、pandasの説明を行い、その他のmoduleについては最低限にとどめる。

1.4 教科書と参考書MacKinney,W. 著『Pythonによるデータ分析入門』(オライリージャパン)を教科書として解説を行う。使っている Pythonが version 2系列なので一部、仕様がことなるので、注意が必要。

Python一般についての定評のある参考書、たとえば柴田淳『みんなのPython』(SBクリエイティブ出版)を手元においておくのがよい。 

2 いちばんやさしいPython

2.1 IDLEXの対話モードと編集モードPythonの実行には、1)命令入力直後に実行がおこなわれる対話モード (Shell Window)2)命令を fileとして保存後、一括して実行する編集モード (Editor Window)の二つの方法がある。

WinPythonではこの二つの方法のいずれも付属の IDLEXというソフトを通しておこなう。 IDLEXを起動するとまず対話モードでPythonが利用可能になる。最初は、対話モードでPythondを説明する。以下、optionalという印がついている項目は最初に Pythonを学ぶときには省略してもよい。

2.1.1 対話モードでの実行

1. 対話モード (shell window)の画面にあらわれる>>>はプロンプトと呼ばれるものでこの後に命令を入力し、enterを押す。

2

Page 3: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

2. Pythonの計算中のときはプロンプトは消えているので、このプロンプトの出現により計算終了がわかる。

3. 例題において>>>は入力しないこと。

4. 対話モードで入力を途中で中止するには cntl+Cを押す。新しくプロンプトが表示される。

2.1.2 編集モードでの実行

1. menuの/file/new fileを選択すると、Editor Windowが開く。

2. 原則、一行に一命令だが、セミコロン (;)で命令の区切りを示せば、一行に複数の命令をかける。

3. Pyhonでは一連の命令を scriptと呼ぶ。

4. 命令の入力は左詰めが原則。

5. 入力が終わったら、menuの/file/saveを選択し名前を付け保存。拡張子pyがつけられる。

6. コメントは #で始める。#より後は実行されない。

7. F5を押すか、menuの/Run/Run Moduleの選択で、script全体を実行

8. F9を押すか/Run/Run Selection or Lineの選択することで、カーソルのある行か選択範囲を実行。

Figure 1: ファイルの作成

   

3

Page 4: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

Figure 2: スクリプトの入力

2.2 値と変数と関数2.2.1 文字と数値

Pythonが扱う値には文字と数値と真偽値がある。真偽値は真理値、論理値とも呼ぶ。半角の引用符 (’か”)にはさまれたものが文字である。Pythonは大文字と小文字を厳密に区別するので入力間違いをしないように。例題:次を実行してその結果を確認。>>>は画面に現れる入力促進記号なので、入力しないように。

>>>1>>>’abc’>>>print(1)>>>print(’abc’)

対話モードでの数値や文字だけの入力は「入力したものを表示せよ」という関数 print()の実行と同じことである。

2.2.2 編集モードでの行の継続 (\) と命令の区切り (;)

• Pythonでは行末が命令文の終りを示す。

• カッコが閉じていない場合は、Pyrhonは行末は改行があると判断し、実行はされない。

• セミコロンも命令文の終りを示すので、一行に複数の命令文を書くには、二つの命令文の間にセミコロンを置けばよい。

• 行頭に空白には意味(これは後で示す)があるので、今の段階では置かないようにする。行頭の空白の数は if や loop命令のブロックのレベルを示す。

• #はコメントの開始を示し、そこから行末までは実行されない。

• 引用符のつかない変数には、を用いて、数値か文字を代入することができる。Pythonにおける等号は「左辺に代入」という命令を示す。

• 行末にバックスラッシュ(\)置くと、次の行に命令を続けて書くことができる。(...), [...], {...}中のカンマ (,)の後ろはバックスラッシュ(\)を省略することができる。

練習:次を実行してその結果を確認せよ。>>>は画面に現れる入力促進記号なので、入力しないように。

>>>a=1>>>a>>>b=’abc’;b>>>c=1.23>>>c

4

Page 5: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

>>> a= \222

>>>a出力:222>>> d=1 # 行頭の空白に注意。SyntaxError: unexpected indent

>>> y=(1+2 #enterを押しても)が入力されるまでは実行されないことを確認する。

2.2.3 関数

関数の後には”()”をつけ、”()”がついていれば変数でなく関数であるということがわかる。()の中が空のこともある。変数だけをみると、それが文字なのか数値なのかわからないので、type( )という関数を使い、確認する。練習:次を実行してその結果を確認しよう。

>>>a=1;b=1.23;c="a">>>type(a);type(b);type(c)

intは整数、floatは実数、strは文字を示する。

2.2.4 型の変換

数字は文字として扱うときも整数や実数して扱うこともあるので、関数 str()で数から文字に変換し、関数 int()で文字から整数に変換する。次の命令を実行して結果を比べよ。

>>>str(1)+str(2)>>>int(’1’)+int(’2’)

2.2.5 予約語

Pythonの中で関数などに使われている文字列を変数につかうとエラーが出る。このような文字列は「予約語」と呼ばれる。次は推奨しない操作だが、確認のため実行してその結果を確認。

>>>type=1.234>>>type(a)

typeという関数が使えなくなった。不便なので、関数 delをつかい、変数 typeを削除する。次の命令を実行して結果をみよ。

>>>del(type)>>>type(a)

2.3 演算と判断そもそもプログラミングの言語を用いる目的は、演算と判断を行うことである。

2.3.1 演算

Python本体は数値に対して基本的な四則演算を行うことができる。実数と整数を混在させることができる。べき乗は**をつかう。次の命令を実行して結果をみよ。

>>>3+3.141592>>>3^2>>>3**2>>>a+c>>>d=a+c-4>>>d

5

Page 6: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

Python本体では、指数関数や対数関数、三角関数などの計算は不可能である。次の命令を実行して結果をみよ。

>>>exp(1)出力:NameError: name ’exp’ is not defined

複雑な計算には別のmoduleを追加する必要がある。その話は後で行う。文字列に加算を行うと文字列が連結される。次の命令を実行して結果をみよう。

>>>’ab’+’cde’

2.3.2 判断

• 基本的な判断には「一致する==」「一致しない!=」「より大きい>」「より小さい<」「同じかより大きい>=」などがある。

• 結果は成立すればTrue, 不成立なら False。

• どちらかが成立 or |、両方とも成立 and &、否定 notがあり、これらを組み合わせてより複雑な判断を行う。

• 判断結果を変数に代入することも可能。TRUEは 1、FALSEは 0に対応するものだが、厳密には真偽値とよばれる型で数値とは扱いが異なる。

• 論理演算には次の記号を用いる。

& and| or~ not== 一致

次を実行してみよう。>>>a=1>>>c=2>>>a==c>>>a!=c>>>(a==c) & (a!=c)>>>(a==c) & (a!=1)>>>(a==c) | not(a!=1)>>>1+(1==2)>>>1+(1==1)

2.3.3 for loop

loopでは indent(字下げ)とコロン (:)の利用に注意。編集モードでは一度の enterで字下げ(indent)がおこなわれるので、enterを二度押すと命令が実行される。次の命令を実行して結果をみよう。

>>> list1 = [1, 2, 3]>>> for a in list1: #list1をループ      print(a)出力:123

6

Page 7: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

(optional)次のように for loopの同時実行も可能実行は、listの短いほうに合わせる。次の命令を実行して結果をみよう。

>>> list1 = [1, 2, 3]>>> list2 = [4, 5]>>> for (a, b) in zip(list1, list2): #list1,list2を同時にループ       print( a,b)出力:1 42 5

2.4 ifの使い方if の後に判定する命題をおき、コロンで終了字下げで実行範囲を指定する。else と elifも if と同じレベルの字下げを行う。

次の命令を実行して結果をみよう。enterを一度押して字下げが行われたときは、もう一度enterをオスロと実行が始まる。>>>a="1">>>if (type(a) == int) :>>> print (’integer’)>>>else:>>> print(’not interger’)

次の命令を実行して結果をみよう。>>>a="1">>>if not (type(a) == int) :>>> print (’integer’)>>>else:>>> print(’not interger’)

2.5 リストデータ分析では多くの数値や文字を一度に扱う必要がある。その基本的な手段がリスト listである。[ ]角かっこ(カクカッコ)の中に数値や文字を並べて、listを作る。

• listの要素の listを含めることも可能である。[[1,2],[3,4]]

• リストでは出現順番や出現回数が意味を持つ。

• 2番目の要素を呼び出すときは、最初の要素を0番とするPythonのルールにしたがいa[1]とする。これは慣れよ。

2.6 set(optional)

これに対して、要素を中かっこ {}のの中にならべたものを集合 setといい、順番が意味を持たず、重複したものは1つ考える。listほどの重要性はないが、listの中から重複を抜き出すのに用いる。

>>>a=[1,2,1]>>>b=[1,2]>>>y=[1,2,3,4,5]

7

Page 8: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

>>>c={1,2}>>>d={2,1,1,1,2}>>>c==d>>>e=list(set([1,2,3,2,1]))

文字列をリストに変換することもできる。知っていると役に立つ。

>>>list("abc")[’a’, ’b’, ’c’]

2.6.1 リスト中の値の指定(重要だがわかりにくい)

1. リストの要素の値をよみだすには、y[0]や y[4]のように [ ]に中に番号を入れる。原点から値を並べる考え方を採用しているので、0が最初の値であることに注意。

2. listの一定の範囲の番号の値を抜き出してリストにするには、y[1:2]にようにコロンを使って指定する。この操作をスライスと呼ぶ。番号1以上 2未満の値を示す。結果として番号1だけを含むリストが出てくる。二番目の番号の要素を含まないことに注意する。

3. slice は次のように理解する。三つの要素を持つリスト x=[”a”,”b”,”c”] に対し、”a”の左、”a”と”b”の間、”b”と”c”の間、”c”の右、と 4つの切れ目を作り、切れ目に 0,1,2,3,4と番号をつける。x[0:1]は切れ目 0と切れ目 1の間の”a”を含むリスト。x[1]は切れ目 1のすぐ右の要素を示す。x[-1]は最後の切れ目の一つ前の切れ目の直後の要素、すなわち最後の要素を示す。

4. y[1:2]は要素がひとつだけのリストだが、y[1]は値なので、操作に違いが出てくる。値は加算ができるが、リストには加算はできない。

リストはデータ分析に適さないので、次に pandas紹介する pandasというmoduleを用いるほうがよいが、要素の番号づけの規則は pandasに引き継がれるので要注意。

練習:# 以降はコメントなので入力不要。次の命令を実行して結果をみよう。>>>y=["a","b","c","d","e"]>>>y[0:3]>>>y[:3]# 番号3未満の値の list>>>y[3:] # 番号3以上の値の list>>>y[-1]# 最後の値>>>y[-4] #最後から 4番目の値>>>a="abc">>>print(a[0])#最初の文字

2.6.2 listの要素の追加と削除

リストに要素を追加するために、リストと要素をならべて新しいリストをつくると、リストを要素として含むリストができるだけで、目的は達成できない。appendというメッソド (method)を用いる。methodは変数等の後にピリオドと命令を示す文字と ()をつけたもの。Pythonの持つ機能ではもっとも重要なものなので、あとで詳しく説明を行うが、徐々に使い方に慣れていくとよい。

>>> a=[1,2,3]>>> c=[a,4]>>> c出力:[[1, 2, 3], 4]>>>a.append(4)>>>a

8

Page 9: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

2.6.3 setによる重複の削除 (optional)

「set=集合」であり、順序や重複の情報は無視されるので、listを一度 setになおし、もう一度listにすると重複した要素を削除する便利な小技。

>>>a=[1,2,3,3,2,1]>>>a=list(set(a))>>>print(a)

3 基本のnumpy  (教科書第4章に対応)

3.1 データ解析でのnumpy

numpy(ナンパイと発音)は数値処理のためのmoduleで、データ処理のために覚えておく必要があるのは主に次の機能である。

1. 欠測値を示す np.nan (これがもっとも重要)

2. 配列や行列を示す array関数

3. 乱数発生の submoduleである random

4. 数列を発生させる arange()関数

5. 対数、指数、三角関数などの数学関数

3.2 module の読み込み>>>import numpy as np>>>np.exp(1)>>>import pandas as pd

1. 最初の命令では (1) numpyをmoduleとしてよみこみ、さらに (2) numpyは npと省略して引用することを指定している。

2. numpyは npと省略することは習慣である。pandas は pdと省略して引用することが習慣である。

3. このように指定した後、numpyの関数を引用するときは np.exp()とする。

4. 省略をおこなわず、import numpyという形で importしたら、numpy.exp(1)と省略せずに引用すれば動作可能である。

3.2.1 行列

>>>m=numpy.array([[1,2],[3,4]])>>>array([[1, 2],

[3, 4]])>>>m.sum(axis=1)array([3, 7])>>>m.sum(axis=0)array([4, 6])>>>m.sum()10

9

Page 10: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

arrayの作り方からわかるようにPythonでは listを行 (横)ベクトルとして扱う。これは多くのデータ分析言語と異なるので間違えやすい。

x.sum()のようににピリオドを挟んで操作を示すものをメッソドという。このmethodでは()の中によこ方向への演算を axis=1、縦方向への演算を axis=0として指定する。

3.2.2 数列の作成 (optional)

>>>numpy.arange(1,6,2)array([1, 3, 5])>>>numpy.arange(1,6)array([1, 2, 3, 4, 5])>>>numpy.arange(6,)array([0, 1, 2, 3, 4, 5])>>>numpy.arange(6,1,-2)array([6, 4, 2])

3.2.3 乱数発生

numpyの中の randomというmoduleの中の randnという関数をよびだすときには、

>>> numpy.random.normal(size=(4,4))array([[-1.75459897, -1.65339072, 1.18304292, -0.46410681],

[-0.02418022, -2.78871604, -0.40031708, -0.72745952],[-1.21227992, 0.06876193, 0.48312578, 0.81866381],[ 1.62696914, -0.92474168, -1.87046408, 0.69429358]])

3.2.4 そのほかでよく使われる関数

>>>numpy.unique([1,2,3,4,4,4,1])は重複した要素を除く関数

4 pandasで使うDataFrameとSeries(重要)

データ分析moduleのpandasはDataFrameとSeriesの二つのデータ形式を使う。Seriesが一変数のデータ、DataFrameは多変数のデータを表すのに用いる。pd.read_csvやで pd.read_excelで読み込んだデータは data frame形式となる。

4.1 Series p.128

>>>from pandas import Series, DataFrame#pdをつけなくても DataFrameを使える。>>>import pandas as pd

系列を作る関数 Seriesと配列を作る関数DataFrameは何度も何度もつかうので、上の第一行の命令を実行し、pdをつけなくてもDataFrameを使えるようにすると便利である(本稿では pd.をつける)

4.1.1 Seriesは indexを持つリスト

>>>y=pd.Series([10,20,30,40])>>>y出力:0 10

10

Page 11: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

1 202 303 40dtype: int64

一番左の列は yの行を位置を示す数値や文字がはいり、これは indexと呼ばれる。特に指定しなければ、indexには 0から始める整数 (0,1,2,3,...)が入る。この indexの利用方法をマスターすることが重要。本章では、以後、yはここで定義したものを用いる。

4.1.2 property

Seriesは単なる数値よりも複雑な構造を持っている。Series名の後に periodをつけ、その後にpropertyと呼ばれる指示を記述することにより、その構成要素を示すことができる。

>>>y.index

値を表示するには、

>>>y.values

ピリオドの後が property(属性)と呼ばれるものである。回帰分析の結果から係数などを取り出すときにも使う。メッソド似ているが ()が付いていないことに注意。

4.1.3 メソッド

関数操作には ()がつき、メッソドと呼ばれる。

>>>y.mean()

関数mean()は一つでも欠損値があると欠損値を返すが、pandasのメソッドのmean()は欠損値を無視して平均を計算するので、データ分析に適している。

4.1.4 利用者が指定する index label

前の例では特別な指示をおこなわなかったので、index numberは行番号 (0から始まる整数)になった。index は利用者が listで指定することができ、これを index labelという。

1. 文字にすることも可能。

2. 属性を書き換えれば、index labelを書き換えることができる。

3. listを使えば複数の値を呼び出せる。

4. reset_indexで index labelを削除できる。

>>>y.index=[’A’,’B’,’C’,’D’]>>>y[’A’]>>>y[[’A’,’B’]] # listの使用に注意

4.1.5 index numberによる値の呼び出し (optinal)

index labelをつけても、範囲指定を使えば index numberによって値を呼び出すことは可能。

>>> y[1:2]#番号が 1以上 2未満の要素を示す。>>> y[1:]#番号 1以上最後までの要素を示す。>>> y[1:1]#空のリストが答え。>>> y[1]#番号1の値 (二番目の値)を示す。。

11

Page 12: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

4.1.6 演算は index labelが一致したものに行う。

>>> s=pd.Series([1,2,3],index=[’a’,’b’,’c’])>>> t=pd.Series([1,2,3],index=[’a’,’c’,’b’])>>> s+t出力:a 2b 5c 5

これデータ分析には大変便利な機能であり、データの並べ方の違いによる誤りを防止することができる。

4.2 DataFrame

複数の変数を並べたものがDataFrameである。

4.2.1 listからデータフレームを作る

いきなり listからDataFrameを作ることが可能だが、listが横ベクトルとして扱われるので注意が必要である。DataFrameの列に番号 column numberがつくが、column labelをつけることもできる。

>>>x=pd.DataFrame([[1,2,3],[2,3,4]])>>>type(x)

これは、もともと Pythonでは listは列ではなく行として設計されていることによるものである。pandasによるデータ分析では変数は縦ベクトルとしてあつかうので混乱しやすく、注意が必要である。以後、本章ではここで定義した xを例に用いる。後からカラム labelや index labelをつけることができる。行番号や列番号による要素の指

定は面倒なばかりでなく、間違いもおこしやすいので、行ラベルや列ラベルによる指定が望ましい。

>>>x.index=[’A’,’B’]>>>x.columns=[’a’,’b’,’c’]>>>x出力:

a b cA 1 2 3B 4 5 6

4.2.2 DataFrameから listを作る (optional)

z=x.values.tolist()とするとDataFrameである xから listである zに変換が行われる。fileに保存したデータはDataFrameなので、そこから listを作りたいときに用いる。

4.2.3 列名の表示の簡便法

x["a"]という列を表示するのに、x.aとすることができる。これは一列だけの表示なら簡便であるが新規作成に使えないので注意。

4.2.4 SeriesからDataFrameを作る (optional)

>>>a=pd.Series([1,2,3,4,5])>>>b=pd.Series([10,20,30,40,50,60])>>>ab=pd.concat([a,b], axis=1) #axis=1は横に接続することを示す。axis=0なら縦に接続することを示す。axisを指定しないと縦。

12

Page 13: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

4.2.5 列の追加と削除

>>>s=pd.Series([1,2,3,4,5])>>>ss=pd.DataFrame()# 空の DataFrameを作る。>>>ss["a"]=s #aの column名を持つ列が追加される>>>ss["b"]=s>>> ss.drop(’b’,axis=1)#axisを入れないと行の削除になる>>>ss出力:0 11 22 33 44 5

4.2.6 データフレームの演算

列の平均、行の平均、転置。numpyの arrayと違い、何も指定しなければ列単位の演算をおこなう。axis=1で行の演算を行う。関数の sumは欠損値があると機能しないが、methodの sumは欠損値は無視して計算を行う。

>>>x.sum()出力:a 3b 5c 7dtype: int64>>>x.sum(axis=1)出力:A 6B 9dtype: int64>>>xt=x.T#転置 transposeを行う

>>>xt出力:

A Ba 1 2b 2 3c 3 4

4.2.7 index名と column名による処理の利点

番号によるDataFrameの操作は可能ではあるが、データ分析には不便なところがあり、indexと columnsで内容の操作を行うほうが安全。番号に基づいてデータ処理を行う場合、調査されない個体の存在や並び順の不一致があると、致命的なミスになるが、indexや columnsに基づいて処理を行うと、間違いにくくなる。

>>>x1=pd.DataFrame([[10,20,30],[40,50,60]],index=[’A’,’C’],columns=["a","b","c"])>>>x+x1出力:

a b cA 11.0 22.0 33.0C NaN NaN NaNB NaN NaN NaN

13

Page 14: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

最後の結果にあらわれた NaNはNot A Numberの省略で欠損値ばかりでなく、0で割った場合などを表する。

4.2.8 カラム名を propertyにした列指定

x.aにより x[”a”]を表示することができる。代入もできるが、列の新設は不可能。

4.2.9 列はカラム名で呼び出し、行は真偽値で呼び出す (重要)

pythonでは文字と数値のほかに真偽値という型があり、DataFrameでの行指定に用いる。

>>>x[’a’]出力A 1B 2>>>x[’a’]<1 #’a’列において「要素が 1より小さい」という命題に対し真偽値を返す>>>x[[True,False]]#Trueに対応する「行」を抽出出力

a b cA 1 2 3>>>x[ x[’a’]<1 ]# 判断の結果と真偽値による行抽出を組み合わせる>>>x[[’a’,’b’]]#複数列を抽出するには、カラム名をリストに列挙する。

4.2.10 ixを用いたデータフレームからの「行」の取り出しと挿入、編集、削除

DataFrameでは列 (縦)のほうを行 (横)よりも優先した作りになっているが、index labelを使用して「行」を指定して抜き出すには、次に述べる x.ixを用いる。

例:>>>x=pd.DataFrame([[1,2,3],[4,5,6]], index=["A","B"])>>>x.ix[’A’]#行’A’を選ぶ>>>x.ix[1,1:2]#xの行 1、列 1,2を選択(第 2行目の第 2,3列目)番号は 0から始まる

4.2.11 行や列の追加

新しい indexや columnsを使って代入をすると、列や行が追加される。

>>>x[’d’]=[40,50]>>>x出力

a b c dA 1 2 3 40B 2 3 4 50>>>x[’d’]=pd.Series([40,50],index=[’B’,’A’])>>>x出力

a b c dA 1 2 3 50B 2 3 4 40>>>del(x[’d’])#d列削除。dropは表示のみで、対象に変更をくわえないので、内容変更には再代入が必要。>>>x.drop("d",axis=1)>>>x.ix[’C’]=[10,20,30]>>>x

14

Page 15: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

出力a b c

A 1 2 3B 2 3 4C 10 20 30>>>x=x.drop("C")

4.2.12 行や列の削除 (optional)

pandasのmethodである dropは使いにくいので、むしろ「それ以外のものを抽出する」という方針のほうが良い時が多い。

>>>w=pd.DataFrame([[1,2],[3,4]],index=["a","b"],columns=["c","d"])>>>w出力

c da 1 2b 3 4>>>w.drop(1)## 行を削除したいときは drop methodを用いる。#dropメッソドは表示だけで本体に変化は#与えない。関数 delは列が default

>>>w.drop("a")#行を削除したものを表示。出力

c db 3 4>>>w出力

c da 1 2b 3 4>>>w.drop("c",axis=1)#列を削除出力

da 2b 4>>>w #dropは表示だけで、対象には変化を残さない。出力

c da 1 2b 3 4

4.2.13 行と列を使って選択、抜き出し、代入

列名や行名の指定は一列まるごともしくは一行まるごと抜き出すには便利だが、行と列の一部分を選択するというような細かい操作には ixが向いている。

>>>x.ix[’A’,"b"]

というように真偽と列名 (行名)を併用した表示や代入も可能。

15

Page 16: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

4.2.14 データフレームの copyは linkを作成するだけ(例外措置で注意)

>>>x1=x*10;z=x1#丸ごと複写>>>z出力

a b cA 10 20 30B 40 50 60>>>z.ix[0,0]=100>>>z出力

a b cA 100 20 30B 40 50 60>>>x1#zでの値を変えることにより複写元の x1の値も変わっていることに注意。出力

a b cA 100 20 30B 40 50 60

このように制約をかけているのは、元データの内容を保護するため。同一の元データで異なった indexを持つような事態を防ぐためと思われる。

linkではなく backupのために複写するときには.copy()というメッソドを用いる。

>>>xx=x.copy()>>>xx.ix[0,0]=100>>>xx>>> x

a b cA 1 2 3B 4 5 6

4.2.15 multiple index(optional)

>>>a=pd.DataFrame([[1,2],[3,4],[5,6],[7,8],[9,10]])0 1

0 1 21 3 42 5 63 7 84 9 10>>> a.index=[[0,0,0,1,1],[10,20,30,10,20]]>>> a出力

0 10 10 1 2

20 3 430 5 6

1 10 7 820 9 10

>>>>>> a.ix[0]出力

16

Page 17: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

0 110 1 220 3 430 5 6>>> a.ix[0,10]出力0 11 2

4.2.16 行や列の抽出のまとめ

(1)列は列名で、行は論理式 (真偽値)で選択が原則。(2)行を行名や行番号で選択したいときや、行と列の両方を指定したいときは ixを用いる。(3)locも同じ目的に用いられるが、混乱しやすいので、ixが自然かつ汎用性が高い。行の選択はpandasの version 2と大きく異なるところなので、古い blogや教科書を調べるときには注意。

4.2.17 リスト外の要素を抜き出す。optional

isinという便利なmethodを用いる。

>>>a=pd.DataFrame([[1,2],[3,4],[5,6],[7,8]])>>>a出力

0 10 1 21 3 42 5 63 7 8>>>a.isin([1,2,3,4,5])出力

0 10 True True1 True True2 True False3 False False>>>a[~a.isin([1,2,3,4,5])]出力

0 10 NaN NaN1 NaN NaN2 NaN 6.03 7.0 8.0

 

5 データの読み込みと書き込みデータ分析で一番手間がかかるのは、外部からのデータを読み込むことである。注意することが三つある。それは

(1) 作業ディレクトリの場所  (2) ファイルの形式  (3) ファイルの漢字コード 

17

Page 18: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

5.1 作業ディレクトリ5.1.1 作業ディレクトリの場所の確認

作業場所を確認するためには import osを実行し、osモジュール読み込みのうえ、関数 getcwd()を実行すると、作業ディレクトリーが表示される。getcwd()の spellは覚えにくい。

>>>import os>>>os.getcwd()Out[4]: ’C:\\python-3.5.3.amd64\\notebooks’

次に説明する chdir()を実行しない限り、このディレクトリ (フォルダー)からデータが読み込まれ、このディレクトリーにデータを書き込みに行く。デフォールト (特に指定しない限り)ではwinPythonに下の notebooksというフォルダーが作業ディレクトリーであるので、ここを使うように習慣づけるのもよい。

5.1.2 作業ディレクトリの場所の変更 (optional)

作業場所を確認するためには osモジュール読み込みのうえ、chdir(’変更先のフォルダー’) を実行すると、作業ディレクトリーが変更される。

>>>import os>>>os.chdir( ’C:\\python-3.5.3.amd64\\notebooks’)>>>os.getcwd()

getcwdと chdirの二つの関数は重要だが忘れやすいので、わかりやすいところにメモしておくとよい。以下の三つの注意が必要。

• アドレス名に引用符をつけることと

• \\マーク二つでフォルダーの区切りとすることに注意。

• 非日本語のソフトでは円マークはバックスラッシュ\マークで表示される。

長いアドレス名は入力しにくいので、windows エクスプローラーを開いたのち、右クリックでアドレスをコピーし、Pythonの editorに張り付けるとよい。 

5.1.3 作業ディレクトリの場所の確認と変更(Anacondaの場合)

1. spyderrから作業ディレクトリーを変更するには メニューから「実行」「設定」を選択し、「作業ディレクトリー」の欄でファイルを置くディレクトリーを指定すればよい。

2. 起動時に作業ディレクトリーを自動的に指定するにはメニューから「ツール」「設定」「グローバルディレクトリー」を指定する。

5.2 ファイル形式: CSV形式かXLS形式かファイルが CSV形式かXLS形式かを知るには、ファイルの拡張子 (.csvか.xlsか)をエクスプローラで表示する必要がある。Windwos 7ではエクスプローラ-かフォルダーオプションの「表示」タブの「詳細設定」の 中の「登録されている拡張子は表示しない」のチェックをはずします.これはWindows PCを使いこなすためには必須の作業である。

18

Page 19: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

5.2.1 CSVファイルとはコンマで区切ったファイル

csvはComma Separated Valueの略で、Comma(カンマ)で Separated(区切った)Value(値)のテキストファイルであり、構造が極めて単純である。そのため、異なったソフト間のデータの移動にはCSVを用いるのが一番一般的である。

5.2.2 CSVファイルは notepadメモ帳かEXCEL で作る

windowアクセサリーのメモ帳 notepadで csvファイルを作成、保存するときには、”abc.csv”のように二重引用符をつけるようにする。一重引用符では期待する結果は得られず、’abc.csv’.txtという名前がつき、引用符をつけないと abc.csv.txtという不都合な名前で保存されてしまう。Excelのワークシートを保存するときに、csv形式で保存するように指定すれば csv形式で保存される。csvファイルでは、ワークシート一枚だけが保存できることと、式ではなく、値だけが保存される。ただし、漢字コードは utf-8を指定することができるのは、Microsoft OFFICE16からで、それ以前のOFFICEにはいっている EXCELでは自動的に Shift-JISにの形で保存される。

5.2.3 CSVファイルのメリット

csvで保存することのメリットは、以下の三点であろう。(1) text fileなので windowsアクセサリーのメモ帳 (notepad.exe)などのエディタで編集 (特に文字コード変換等)が簡単であることと(2) ほとんどのソフトで読み書きができること(3) EXCELでの操作が困難な巨大なデータでも処理できること

5.2.4 CSVファイルの読み書き(重要)

読み込みには読み込み対象のファイルを作業ディレクトリーにおき、>>>xyz=pd.read_csv(’sample.csv’)を実行。xyzは自動的にDataFrame形式になる。その確認には

19

Page 20: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

>>>type(xyz)書き出すときには、SeriesもしくはDataFrameである xyzにたいして>>>xyz.to_csv(’def.csv’)と実行すれば、csvファイルで保存される。

5.2.5 Excelファイル (xlsx)の読み込み (optional)

pandasでは EXCEL(xlsx)のファイルを読み込むことができる。>>>xyz=pd.read_excel(’sample.xlsx’)ただ、excelで csv形式で保存すると商品 codeのような桁数の多い数値では有効桁数を書き換えるので、有効数字の桁数が多いとき EXCELでは csvファイルで書き出さないほうが安全。>>>pd.read_excel(’sample.xls’)

5.2.6 データの書き出し

EXCELの xlsx形式で書き出したいときには>>>x.to_excel(’a.xlsx’)CSV形式で書き出したいときには>>>x.to_csv(’a.csv’)とする。

5.2.7 csvファイルからDataFrameを作る。

この方法がDataFrame作成によく用いられる方法である。まず、作業ディレクトリーにsample_UTF8.csvをおき、これを読みだそう。

x=pd.read_excel(’sample.xlsx’)y=pd.read_csv(’sample.csv’)x.shapey.shapetype(x)x.valuesx.columns

5.3 漢字コード:UTF-8 かSHIFT-JISか cp932か (optional)

かな、漢字などアルファベット以外の文字を表すのには複数のコードがあり、他のソフトで作成したファイルがカナや漢字を読めないことがある。よく使われるコードには S-JIS、UTF-8, UTF-16がある。

1. UTFは日本語を含めた世界各国の文字を含むコードである。海外で開発されたソフトではUTF-8 を利用するものがおおく、当然Pythonもデフォールト文字体系はUTF-8を指定している。

2. Shift-JISは日本国内で定められたコードで、日本語のみを対象とする。

3. cp932は SHIFT-JISの拡張版で、NECや IBMが独自に設定し記号コードを SHIFT-JISにMicrosoftが追加したものである。したがって、cp932を指定するほうがよい。

20

Page 21: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

5.3.1 Shift-JISを用いたデータの読み込み

日本のデータ (例:posデータ)は S-JISの文字を含むことが多く、そのようなファイルを読み込みには次の二つの方法がある。

1. file1=pd.read_csv(’a3.csv’,encoding="SHIFT-JIS")と指定する。

2. 代替的な手段として、Windowsについている notepadで一旦読み込み、UTF-8で保存すれば、”SHIFT-JIS”で書いたファイルをUTF-8に変換することができる。不正確な呼称であるが、日本語Windowsでは SHIFT-JISのことをANSIと呼ぶので、メモ帳では保存形式にANSIを指定すれば、S-JISで保存される。

5.4 データの結合5.4.1 concatでDataFrameの結合

columnや indexで結合する場合には concatが便利。defaultは縦方向なので、横方向は axis=1を指定。outerで結合すると合併集合、innerでは共通集合。ただし、DataFrame同志で結合するので、Seriesは使えない注意。もとのDataFrameの index label や column labelがマッチするように結合するので、index

の機能のありがたみがわかる。ignore_index=Trueで indexのつけなおしをおこなう。

>>> x10 1 2 3

0 1 2 3 51 4 5 6 7>>> x2

0 1 20 1 2 31 4 5 62 6 7 8>>> pd.concat([x1,x2],axis=1)

0 1 2 3 0 1 20 1.0 2.0 3.0 5.0 1 2 31 4.0 5.0 6.0 7.0 4 5 62 NaN NaN NaN NaN 6 7 8>>> pd.concat([x1,x2])

0 1 2 30 1 2 3 5.01 4 5 6 7.00 1 2 3 NaN1 4 5 6 NaN2 6 7 8 NaN# indexの付け直し。>>> pd.concat([x1,x2], ignore_index=True)

0 1 2 30 1 2 3 5.01 4 5 6 7.02 1 2 3 NaN3 4 5 6 NaN4 6 7 8 NaN>>> x2.columns=[4,3,2]>>> pd.concat([x1,x2], ignore_index=True)

0 1 2 3 4

21

Page 22: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

0 1.0 2.0 3 5 NaN1 4.0 5.0 6 7 NaN2 NaN NaN 3 2 1.03 NaN NaN 6 5 4.04 NaN NaN 8 7 6.0

5.4.2 mergeでDataFrameの結合。concatよりも高難度

concatと同様に二つのデータフレームを結合のマッチングであるが、key変数を使うところが特徴。注意するのは、何を keyにするかということと、マッチングのない行があるばあい、 左側だけを残す’how=”left”,右側を残す how=’right’、両方を除く’how=”inner”と両方とも含める’how=”outer”の区別である。defaultは’inner’である。

a=pd.DataFrame()a[’Name’]=["john","hanako","taro"]a[’loc’]=[1,2,3]a

Name branch0 john 11 hanako 22 taro 3b=pd.DataFrame()b[’Name’]=[’hanako’,’taro’,’taro’]b

Name0 hanako1 taro2 tarob[’volume’]=[1,10,20]pd.merge(a,b)

Name branch volume0 hanako 2 11 taro 3 102 taro 3 20pd.merge(b,a)

Name volume branch0 hanako 1 21 taro 10 32 taro 20 3pd.merge(a,b,how="outer")

Name branch volume0 john 1 NaN1 hanako 2 1.02 taro 3 10.03 taro 3 20.0

左右のDataFrameでkeyになる変数名が異なっている場合は、left_on="branch",right_on="distance"と指定する。

c=pd.DataFrame()c[’loc’]=[’Tokyo’,’Yokohama’,’Kyoto’]c[’distance’]=[1,3,2]

loc distance0 Tokyo 1

22

Page 23: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

1 Yokohama 32 Kyoto 2

pd.merge(a,c,left_on="branch",right_on="distance")Name branch loc distance

0 john 1 Tokyo 11 hanako 2 Kyoto 22 taro 3 Yokohama 3

right_index=Trueとすれば indexを keyにして結合することもできる。

6 グラフ簡単なグラフ作成機能は Pythonでは主なグラフ機能はmatplotlibというmoduleに備わっている。

>>>import pandas as pd>>>import matplotlib.pyplot as plt>>>from numpy import *  #このように numpyを読み込むと、#sin や cosなどの numpyの関数が npを付加しなくても利用可能>>>a1=pd.Series([1,2,3,4,5])>>>a2=pd.Series(sin([1,2,3,4,5]))>>>a1.plot()>>>a2.plot()>>>plt.savefig("graph2.png")>>>plt.show()>>>a3=cos(a1)>>>a3.plot()>>>x = arange(-3, 3, 0.1)>>>y = sin(x)>>>plt.plot(x, y)>>>plt.show()

注意:WinPythonにおいては plt.show()でグラフ表示する。グラフWindowを閉じないと次の命令が実行されない。

anacondaにおいてグラフの表示には plt.show()は必要ないが、plt.show()の実行により、いったんグラフは消去される。一度に実行すると plotは重ね書きされる。アナコンダの F9は一行ずつ実行し、その都度グラフが表示されるが、この場合は重ね書きされない。

7 時間と時刻の処理長期のデータ一部分だけ取り出すこと、ファイナンスやマーケッティングでは売り上げや価格変動を様々な時間単位で再集計することが必要がある。pandasでは時間情報を timestampという型で扱い、時間に基づくデータ処理を容易にしている。

7.1 pandasの to datetime関数でDataFrameやSeriesを日付データ型への変換

Excelなどでは文字として日付が格納されている。これを pandasの timestampに変換する必要がある。日時、時間の入力はたいていの形式は理解可能である。pandasはこの分野で効率的である。

23

Page 24: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

>> import pandas as pd>>>pd.to_datetime("2016-7-30 10:10")#  Seriesや DataFrameでなくとも変換可能出力  Timestamp(’2016-07-30 10:10:00’)>>>a=pd.DataFrame([10,20,30],index=["2001-1-1","2001-1-2","2001-3-2"])>>>a.columns=["vol"]>>>a.index=pd.to_datetime(a.index)

7.1.1 resample

下の例では resampleの結果、データのないところにはNaNが挿入された。datetime型の indexのメリットは時間ごと、日ごとの集計が簡単になること。

>>>a.resample("A",how="sum")#年毎に集計出力 vol2001-12-31 60>>> a.resample("M",how="sum")#月毎に集計出力

vol2001-01-31 30.02001-02-28 NaN2001-03-31 30.0>>>a.resample("M",how="mean",foffset="15D")

7.1.2 pivot tableを用いてメーカーごとにカップめんの毎日の売り上げを集計

>>>import pandas as pd>>>import matplotlib.pyplot as plt>>>a=pd.read_excel("https://mcobaya.web.fc2.com/office2.xlsx")#Web Siteからデータをとる>>>a["timestamp"]=pd.to_datetime(a["datetime"])#indexを datetime型にする>>>ramen=a[a.分類コード==137001] #カップラーメンのコード 137001>>>q_men=pd.pivot_table(data=ramen,values=’個数’, index=[’timestamp’],columns=[’メーカー名’], fill_value = 0, aggfunc="sum")#欠損値には 0を入れる。# 毎日の値に再集計>>>plt.plot(q_men.resample(’D’, how=’sum’))>>>plt.show()

練習:購入者性別フラグ、購入者年齢フラグを使い、性別、年齢別の毎日の購入数をグラフ化する。

7.1.3 重複した index(optional)

>>>dates=[datetime(2011,3,31), datetime(2011,4,1),datetime(2011,4,2),datetime(2011, 4, 2, 0, 0)]>>>ts=pd.Series(randn(4),index=dates);ts出力2011-03-31 0.7916592011-04-01 -0.9246912011-04-02 -1.0307932011-04-02 0.365477dtype: float64#日付が重複していると、系列として取り出される。

>>>ts[’2011/4/2’]2011-04-02 -1.0307932011-04-02 0.365477dtype: float64

24

Page 25: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

>>>ts[’2011/4/2’]

#等間隔に直すことも可能。>>>ts.resample(’D’,how=’mean’)出力2011-03-31 0.1345122011-04-01 0.3137822011-04-02 -0.0138472011-04-03 NaN2011-04-04 -0.935617Freq: D, dtype: float64

7.1.4 一定間隔の日付系列の作成

>>>pd.date_range(’2017/4/1’, ’2018/4/1’)#次のような系列が作成される。出力DatetimeIndex([’2017-04-01’, ’2017-04-02’, ’2017-04-03’, ’2017-04-04’,

’2017-04-05’, ’2017-04-06’, ’2017-04-07’, ’2017-04-08’,’2017-04-09’, ’2017-04-10’,...’2018-03-23’, ’2018-03-24’, ’2018-03-25’, ’2018-03-26’,’2018-03-27’, ’2018-03-28’, ’2018-03-29’, ’2018-03-30’,’2018-03-31’, ’2018-04-01’],

dtype=’datetime64[ns]’, length=366, freq=’D’)a=pd.date_range(’2017/6/1’,’2017/6/5’, freq=’8H’)

#8時間ごとの時間間隔の作成DatetimeIndex([’2017-06-01 00:00:00’, ’2017-06-01 08:00:00’,

’2017-06-01 16:00:00’, ’2017-06-02 00:00:00’,’2017-06-02 08:00:00’, ’2017-06-02 16:00:00’,’2017-06-03 00:00:00’, ’2017-06-03 08:00:00’,’2017-06-03 16:00:00’, ’2017-06-04 00:00:00’,’2017-06-04 08:00:00’, ’2017-06-04 16:00:00’,’2017-06-05 00:00:00’],

dtype=’datetime64[ns]’, freq=’8H’)

7.1.5 日付オフセットを取り込むと時間操作が容易

>>>from pandas.tseries.offsets imort Hour, Minutes, Day>>>ts.index=ts.index+Day(2)>>>ts2011-04-02 0.1345122011-04-03 0.3137822011-04-04 -0.0138472011-04-06 -0.935617dtype: float64

8 データクリーニング

8.1 欠測値データ分析で避けられないのが欠測値の処理である。Python本体では十分な処理は困難で、pandasは欠測値の処理を容易にするために開発されたという面もある。したがって、できるだけ SeriesかDataFrameの中で一括して処理をするのが賢明で、要素ごとに処理を行うのは賢明

25

Page 26: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

ではない。どうしてもスカラーとして処理する必要があるときは、9999などのような別の数値に置き換えるのがよい

8.1.1 欠測値の代入

Python本体のNoneか numpyの np.nanを代入する。SeriesやDataFrameのなかで欠損値をしめすのは、NaNであるが、これは表示記号であって、実際に各要素として欠損値を指定するにはPython本体のNoneか numpyの np.nanを代入することで行う。Noneをつかっても pandasのなかでは numpyの nanに変換される。

>>> a=pd.DataFrame([[1,2],[3,4]])>>> a

0 10 1 21 3 4>>> a.ix[1,1]=None>>> a

0 10 1 2.01 3 NaN>>> a.ix[1,1]nan>>> type(a.ix[1,1])<class ’numpy.float64’>

8.1.2 欠測値の判定

その判定には、numpyの isnan()という関数かpandasの isnull()もしくはnotnull()というmethodを用いる。

import numpy as npimport pandas as pda=pd.Series([1,2,3,4])a[a>2]=Nonea

0 1.01 2.02 NaN3 NaNdtype: float64np.isnan(a)

0 False1 False2 True3 Truedtype: bool>>> a.isnull()0 False1 False2 True3 Truedtype: bool

26

Page 27: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

8.1.3 欠損値を含む真偽値処理(よくやる間違い)

欠損値を対象とする論理式はかならず偽になる。二つの選択肢の問題の場合、欠損値の存在を失念すると大きな失敗につながる。最善の方法はまだ思いつかないが次の方法が考えられる。真偽値によってダミーを作成し,

その結果に欠測値を重ねる。原系列 aでNaNのときには a− aはNaNであり、それ以外場合は0がはいるので、この a− aを加えると、原系列でNaNのときダミー変数もNaNとなる。

>>> a0 1.01 2.02 NaN3 NaNdtype: float64>>> b=1*(a==1)>>> b0 11 02 03 0>>> b=b+(a-a)>>> b0 1.01 0.02 NaN3 NaN

8.1.4 複数列のNAの判定 (optional)

前項の any, allの応用として、一行のどこかに nanが入っているか(はいっていたら削除)の判定を行う。不完全回答の回答者をみつける。一行もしくは一列において「すべて成立」「ある要素で成立」の判定は all,anyを用いる。 defaultもしくは axis=0なら一列の要素を判定。axis=0は default(列ごと) の判断に対応。

a=pd.DataFrame()a[1]=[1,2,np.nan,1]a[0]=[1,2,np.nan,np.nan]a

0 10 1.0 1.01 2.0 2.02 NaN NaN3 NaN 1.0a.isnull().any(axis=0)

0 True1 Truea.isnull().any(axis=1)

0 False1 False2 True3 Truea.isnull().all(axis=0)

0 False1 Falsea.isnull().all(axis=1)

27

Page 28: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

0 False1 False2 True3 False#False と Trueを入れかえるには~(tilde)を前置する。~a.isnull().all(axis=1)

8.1.5 replaceによる一括してNaNを代入

データベースの中で欠損値にはしばしば-9999等特定の数値を用いる。DataFrameの要素 0をnp.nanに一度ににおきかえるには、一般的は置き換えのメッソド replaceを使う。

b=pd.Series([1,2,3,-1,0])0 11 22 33 -14 0dtype: int64b.replace(’0’,np.nan)

0 1.01 2.02 3.03 -1.04 NaNdtype: float64d=b.replace(0,np.nan)

0 1.01 2.02 3.03 -1.04 NaN

8.1.6 NaNに別の値を代入 (前項と逆の操作)

これには既出の replaceメッソドを用いる

b.replace(np.nan, 0)#nanを 0に置き換える逆の操作

というものと、 pandaのメッソド fillnaを使う方法がある。

d0 1.01 2.02 3.03 NaNdtype: float64d.fillna(-1)

0 1.01 2.02 3.03 -1.0dtype: float64

28

Page 29: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

8.1.7 whereによる選択と置き換え

論理値を使う選択との違いに注意する。whereによる選択では、選択されない要素はNaNか指示された代替値として表示されるが、論理値による選択では、条件を満たさない行や列は表示されない。

# 置換対象.where(残す条件, 代替値)a

0 1 2 30 1 -7 -7 41 -1 2 3 -5a.where(a[1]>0)

0 1 2 30 NaN NaN NaN NaN1 -1.0 2.0 3.0 -5.0a[a[1]>0]

0 1 2 31 -1 2 3 -5a.where(a>0)# これは whereを使わなくても同じ。

0 1 2 30 1.0 NaN NaN 4.01 NaN 2.0 3.0 NaN

#NaNのかわりに代替値を代入可能。>>> a.where(a[1]>0)

0 1 2 30 NaN NaN NaN NaN1 -1.0 2.0 3.0 -5.0>>> a.where(a[1]>0,1)

0 1 2 30 1 1 1 11 -1 2 3 -5>>> >>> b

0 1 2 30 199 -1393 -1393 7961 -199 398 597 -995>>> a.where(a[1]>0,b)

0 1 2 30 199 -1393 -1393 7961 -1 2 3 -5>>>

8.2 文字と数字と空白文字の混在の処理 (optional)

8.2.1 問題とエラーメッセージ

SeriesやDataFrameの中には数字と文字が混在していると sumなどの関数を実行できないTypeError: unsupported operand type(s) for +: ’int’ and ’str’というエラーメッ

セージがあらわれ、文字と数字の混在がうたがわれる。原因解明する必要があれば、文字型になおしてしまう。そのうえで、np.uniqueで列挙する。型が混在すると uniqueが使えない。

>>>b=pd.Series([1,2,’3’])# 文字型と数字型の混在>>>b主力0 1

29

Page 30: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

1 22 3dtype: objectsum(b)Traceback (most recent call last):

File "<pyshell#49>", line 1, in <module>sum(b)

TypeError: unsupported operand type(s) for +: ’int’ and ’str’f=b.astype(’str’)np.unique(f)

8.2.2 読み取り時に半角スペースをNaNに変換

数値と文字の混在で最も多いのが半角のスペース文字が紛れ込んでしまうこと。SPSSのデータを書き込むときに起きる。read_csv(’a.csv’,na_values=’ ’) とすると NANに変換して読み込むことができる。これは習慣にしておくといい。

8.2.3 一つ一つ判定

型の判定。typeは objectの型を教えてくれるが、守備範囲が広いので注意。

a="1"if (type(a) == int) :

print (’integer’)else:

print(’not interger’)

どうしても、列ごとに型の変更ができない場合は forや if と次の関数を用いて変更を行う。

8.2.4 convert objectsメッソドで columnsごと数値に変換

読み取り後の修正は convert_objects(convert_numeric=True)によって変換可能なものは数値(実数)に、変換不可能なものはNanに変換する。

a=pd.Series([1,2,’3’,’d’])>>> a==a.astype(str) #文字型の判定0 False1 False2 True3 True>>>a.astype(’int’)#"d"は変換できず、命令自体がエラーd=a.convert_objects(convert_numeric=True)

0 1.01 2.02 3.03 NaN

8.2.5 astypeメッソドによる変換

astypeメッソドでも

a=pd.Series([1,2,’3’])sum(a.astype(’int’))6

数字とアルファベットが混在しているときは、数字型への変換は不可能なので、astypeよりもconvert_objects(convert_numeric=True)のほうが便利

30

Page 31: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

8.2.6 NaNを csvに書き出すと

nanを to csvメッソドで保存すると、NaNのところには何も入らない。

>>> e0 1

0 1 21 NaN NaN>>> e.to_csv("a.csv"),0,10,1,21,,

8.2.7 行番号と indexの区別 (optional)

データフレームを新しく作ったときには indexと行番号は一致で一致しているの混乱は発生しないのだが、indexを代入すると、行番号と indexが異なった値をとる。特に indexが整数のときは、ixプロパティは indexを当然優先。混乱しやすいので、indexには整数番号をつけないほうがいい。

a.index=[3,2,1]a

0 13 1 22 3 41 5 6a.ix[1,1]

6

9 プログラムの流れ (optional)

9.1 applyによる iteration

DataFrameや Seriesのmethodは複数の要素に一度に操作ができるので、便利であるが、できることに限りがある。Python本体の機能は Series全体を一括操作できない。forでの繰り返しは面倒である。applyを使うとSeriesやDataFrameの全部の要素に一度に関数を適用できる。

>>> a=pd.Series([1,"a","1"])>>> a0 11 a2 1dtype: object>>> a.apply(type)0 <class ’int’>1 <class ’str’>2 <class ’str’>dtype: object

31

Page 32: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

9.2 defを使った関数の定義関数の定義には defを使う方法と lambdaを使う方法の二つがる。後のほうは無名関数と呼ばれる。

def f(x):y=x*2return y

f(10)

fは関数名、xは引数(ひきすう)とよばれ、yは戻り値(もどりち)と呼ばれる。defで始まる行の最後のコロンとインデント (indent)、すなわち左端からの開始位置が重要。無名関数は関数名をつけずに使うことができる。lambdaで始まり、コロンの左が引数、コ

ロンの右が戻り値。

(lambda x:x*2)(10)20#名前を付けて使うこともできる。g=(lambda x:x*2)g(2)4

この無名関数はDataFrameやSeriesの要素に iterationをおこなうときに便利である。DataFrameや Seriesのmethodは複数の要素に一度に操作ができるので、便利であるが、できることに限りがある。

9.3 classの作成複数の戻し値集合体(instanceと呼ぶ)を作る「関数」を classという。戻し値をひきだすにはmethodを用いる。instanceを作るには次の二つを指定する。SeriesやDataFrameも一つのinstanceである。(1) instance の作り方、引数を指定する。(2) 戻し値の取り出し方 (method)の定義。

class Test:def __init__(self,num):

self.num=num; #このクラスが持つ「num」変数に引数を格納。セミコロンに注意# def __init__(self,num=1.0):と置けば初期値 1.0の指定

def print_num(self):print(self.num)

a=Test(10) # instance ができた。これは a=pd.DataFrame( ...) に相応。a.print_num()# methodで戻し値を呼び出す。a.sum()に相応。

10

(1)の仕事は constructorという部分で行い、これは最初の defから次の defの直前の部分。defでの引数の最初に出現する selfは必須。この classの引数は num。

(2)の仕事は二番目のdef以下で行い、ここで print numという名前のmethodを定義する。ここでは引数に selfが現れるが、関数print_numには実際の引数は存在しないので、print_num()という引数を持たないmethodが定義される。関数は戻し値は一つだが、一つの instanceで複数のmethodを指定できるので、違うmethod

を指定すれば、違う戻し値が得られる。

32

Page 33: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

9.4 大学進学希望の地域格差、男女格差のPISA2003を用いた分析

9.5 問題のありか9.5.1 Research Questions:「進学格差」はあるのか。どこに格差の原因があるのか。

2003年の PISAでは生徒に希望進学レベルを訪ねている。「進学格差」は成績から予想される進学希望よりも高い進学希望により定義し、進学格差を規定する要因を探る。多喜弘文氏の論文を参考にする。データが入手可能であるかどうかと統計手法が使いこなせるものであるかの二点に注意。目的があっていれば、より単純な統計手法に替えるもよい。多喜弘文 著「日本の高校トラックと社会階層の関連構造」――PISAデータを用いて, ソシ

オロジ (170) 37-52 2011年

9.5.2 いくつかの論点

• 男女の学歴期待の差と比較 (国際比較と 2003年と 2015年の比較)

• 文化的な格差による学歴期待の差と比較 (国際比較と 2003年と 2015年の比較)

• 短大と四年制大学への進学率の変化

• 学校や教師の影響はどのくらいあるか。

• 職業的威信 ISEIの影響

• 授業方法の影響

• 交差項の解釈(社会的)

• 進学と成績の地域格差 『同じ学力、文化環境でも進学しにくいか。男女別』

9.6 データのダウンロードと読み込み9.6.1 練習用データ

PISAのデータは巨大であるので、PISA2003の日本データの一部をWeb siteにおく。これはpandasの read_csvを使ってwebsiteから直接読み込むことができる。

>>> import pandas as pd>>> x=pd.read_csv("https://mcobaya.web.fc2.com/pisa2003jpn_ex.csv")>>> print(x.columns)>>> x.shape #45変数、4707人

9.6.2 OECDサイトからのダウンロード (optional)

• PISAのデータファイルはOECDのサイトhttps://www.oecd.org/pisa/pisaproducts/から text形式のものをダウンロードできる。このデータは、固定長フィールド形式で保存され、何桁目から何桁目にどの変数の値を書き込むかが決まっており、変数と位置の対応情報は別ファイルで提供される。これに対して、よく使われる csv形式はカンマで値と値との区切りを示しており、Excelに直接読み込むことができ、扱いが容易であるが、サイズが大きくなる欠点がある。

• http://www.oecd.org//pisaproducts/database-pisa2003.htmからdownloadする。変数コードは StQ_CodeBook_2003.pdfに記載。

33

Page 34: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

9.6.3 SPSSを通した読み込み (optional)

• SPSSデータの日本の部分を抜き出したものをjpn2003_jpn.savとしていったん保存し、それをCSV、GRETL用に変換したものを pisa2003stu_jpn.csv, pisa2003sch_jpn.csvとして保存。gretlで読み込み、変数の labelを付加した。

SASと SPSSの scriptがOECDのサイトで準備してあるので、PISAのデータは SASかSPSSファイルとして読み込んでから、csvに保存するのが容易。

• 以下は SPSSが利用可能な場合のデータ変換の方法である。近年、SPSSの互換ソフトPSPPが開発されたので、PISAのデータ読み込みにも利用可能と予想される。

• PISAのサイトからダウンロードしたコントロールコードファイル (PISA2012_SPSS_school.txt等)の拡張子 txtを spsに変更後、SPSSを使って読み込む。SPSファイルが SPSSを既定のプログラムに設定されていれば、spsファイルをダブルクリックすれば、SPSSが起動し、コードを読み込む。

• フォルダー名 xxxxを二か所、実際のもの(d:等の別ドライブが確実)に変更し、メニューの上で、「実行」を「すべて」に対してする。保存先ファイル名も同時に変更。

• メニュ上、「データ」「ケース選択」を行い、必要な国のケースを条件 (CNT=”JPN”)により選択し、別のデータベースに出力し、csvと savで保存。

9.6.4 変数

• STRATUM 学校類型PISAの日本調査では私立公立と普通科・職業科の分類をSTRATUMという変数でおこない、高校、短大、大学などの学歴を ISCEDの分類を生徒の教育期待SISCEDで用いている。 学校類型 (普通科A,B,Cと職業科) 普通科は数学の得点によりらランク付け私学と公立、普通科とそれ以外の区別はSTRATUMで行う。 Code bookよりSTRATUM変数は文字型

"390201" "JPN - stratum 01 : 01: Public and Academic"公立普通科"390202" "JPN - stratum 02 : 02: Public and Practical" 公立職業科"390203" "JPN - stratum 03 : 03: Private and Academic"私立普通科"390204" "JPN - stratum 04 : 04: Private and Practica" 私立職業科

• SISCED教育期待

SISCED (246) Expected educational level of student (ISCED)Format: F1 Columns: 474-4740 ISCED 11 ISCED 22 ISCED 3B, C 職業課程3 ISCED 3A, ISCED 4 普通課程4 ISCED 5B 短大5 ISCED 5A,  4年制大学 と大学院

わかりにくいのは3A:大学(レベル 5A)への進学準備課程3B:職業志向教育(レベル 5B)への進学準備課程。工業科や商業科など。3C:就職準備、またはレベル 4への進学準備

日本の教育システムと ISCEDの体系は次のように対応している。

34

Page 35: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

3A 全日制-本科普通課程3A 定時制-本科普通課程3A 通信制-普通課程3A 全日制-本科総合課程3A 定時制-本科総合課程3C 全日制-本科専門課程 ()3C 定時制-本科課程3C 通信制-専門課程3C 全日制-定時制別科(普通/総合/専門)ほぼ廃止4 全日制/定時制-専攻科(普通/総合/専門) 看護科や水産科。PISA2003にはない高等専門学校 1,2,3学年は Level-3B、高等専門学校 4,5学年および専攻科は Level-5B工業高等学校は ISCED-3Cレベルに分類されるISCED-5B - 専修学校の専門課程(専門学校)ISCED-5B - 短期大学、高等専門学校(高専)ISCED-5A - 大学の学部ISCED-6 - 大学院(修士課程、 博士課程、専門職学位課程)

MISCED,FISCEDは母親、父親の学歴を示す。SISCEDは 2003年と 2015年でしか調査されていないが、MISCED,FISCED はどの年度でも調査が行われている。

• 男女  ST03Q01 これは1が女性で2が男性

• 数学得点 PV1MATH-PV5MATH 練習用ファイルではこれらの平均をmathで作成済み

• 社会的地位  ESCS 世界のデータを平均 0、標準偏差1に調整している。父親の職業(最初の桁の 1- 5がWhite Collar, 6-9がBlue Collar)

– high skilled white collar (ISCO codes 1,2 and 3) includes legislators, senior officialsand managers, professionals and technicians and associate professionals;

– low skilled white collar (ISCO codes 4 and 5) includes clerks and service workers andshop and market sales workers;

– high skilled blue collar (ISCO codes 6 and 7) includes skilled agricultural and fisheryworkers and craft and related trades workers;

– low skilled blue collar (ISCO codes 8 and 9) includes plant and machine operatorsand assemblers and elementary occupations.

FSECATEG (233) Father White collar/Blue collar classificationFormat: F1 Columns: 434-4341 White Collar high skilled2 White Collar low skilled3 Blue Collar high skilled4 Blue Collar low skilled9 Missing

• 数学得点と ESCSの学校平均 これは後述の作業がいる。

• 学校がわの調査データSC01Q01には学校のある地域(大都市から村まで)の情報がある。

SC01Q01 (5) School location Q1Format: F1 Columns: 17-171 Village (less 3 000)2 Small town (3 000 to 15 000)3 Town (15 000 to 100 000)

35

Page 36: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

4 City (100 000 to 1 000 000)5 Large city (more 1 000 000)7 N/A8 Invalid9 Miss

9.7 分析手法• pivot table: 考えられる要因:学校レベル(学校の平均席蹟)、男子校女子高、男女、地域、学校タイプ、階層、およびその交互作用(高い階層の生徒が低い学校に入った場合)

•  一次式の回帰分析による分析: 同じ学力にもかかわらず、より高い学歴をめざす生徒とそうでない生徒がいる。男女、地域、学校タイプ、階層 (ESCS)などの要因の影響の大きさを探る。注意:変数を説明変数として使うことは、男女、成績、学校タイプに関係なく、階層 (ESCS) は同じ係数をもっていることを仮定する。

• 用いた変数の学校平均を追加する (平均成績、平均ESCS)と、同じ学力, 社会階層、性別でも在学する学校の影響により進学希望が変化することが示される。これは他の生徒の影響か

• 交差項: 階層(ESCS)と成績のほかに階層×成績 などの交差項を説明変数にいれると、より深い解釈ができる。階層×成績の係数がプラスであると、高い階層ほど成績の係数(影響)が大きい、もしくは、階層の効果は成績が高いほど大きい。 また職業科ダミー×階層の効果がプラスならば、階層の影響は普通科よりも職業科のほうがおおきい。

• 層化: データを男性と女性や学校タイプなどに分けて回帰分析を行う。ESCSの影響が性別によってことなるなどの深い分析ができるが、有意性は示せない。

• Oaxaca decomposition: 2015年データの 2003年の進学率の差を係数の差と説明変数の差の影響の二つの項に分解することができる。詳しくは後述。

• 標準化係数: 説明変数と被説明変数を標準化した場合の回帰係数の推定量

y = a+ b× x, y = a+ b× x,

の推定の場合はy =

y√V (y)

=y√V (y)

= a+ bx√V (x)

によって標準化係数 bを定義すると、

b = b

√V (x)√V (y)

すなわち普通の回帰係数を被説明変数の標準偏差で割り、説明偏差の標準偏差をかけたもの。説明変数が標準偏差一つ変化したとき、被説明変数が標準偏差でかぞえていくつ変化するかを示すもの。

 

9.8 分析結果とその解釈ここでは代表的な合計分析手法として pivot tableと回帰分析を説明する。より高度な手法については pandasよりも統計分析専門のソフトウェアの使用が望ましい。

36

Page 37: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

9.8.1 pivot table

まず、各変数の平均や値の頻度を求め、データの概要をつかむ必要がある。これにはpivot tableがよい。ダミー変数を用いた単回帰とおなじことである。結果はDataFrame形式になっている。まず、男子のほうが大学進学希望 (期待)が高いことに注目、数学の得点も高い。地域差も

ある。大学への進学希望率の性別と地域差に注目しよう。

• 性別 男子のほうが 5パーセントほど大学進学率が高い。

x["daigaku"]=x.kitai==16aa1=pd.pivot_table(data=x,values=[’daigaku’,’math’,"ESCS"],\

index=["male"], aggfunc="mean")print(aa1)

ESCS daigaku mathmale0.0 50.452168 0.469192 49.7563821.0 49.526630 0.515191 50.265485

• 地域差

aa1=pd.pivot_table(data=x,values=[’daigaku’,’math’,’kitai’,"ESCS"],\index=["area"], aggfunc="mean")

ESCS daigaku kitai matharea2.0 46.024760 0.280156 19.724696 46.6056293.0 48.810166 0.421652 20.219796 48.7134014.0 51.321313 0.557399 20.666061 51.423578#都市圏5.0 49.764085 0.498721 20.434211 49.383360#大都市

x["danshiko"]=1*(x.mmale==1)x["joshiko"]=1*(x.mmale==0)x["betsugaku"]=2*(x.mmale==1)+1*(x.mmale==0)x["betsugaku"]=x["betsugaku"].replace(2,"danshiko")#結果をみやすくするためにx["betsugaku"]=x["betsugaku"].replace(1,"joshiko")x["betsugaku"]=x["betsugaku"].replace(0,"kyogaku")

ESCS daigaku kitai mathtoshi0 48.385391 0.401770 20.155985 48.4115831 50.914512 0.542165 20.606552 50.893880print(aa1)d=aa1.ix[1]-aa1.ix[0];print(d)#ESCS 2.529121#daigaku 0.140395#kitai 0.450566#math 2.482297

都市部とそれ以外では14パーセントの大学進学率の差がある。この差は成績の差、社会的階層の差で説明できるであろうか。それは次の回帰分析で考える。

• 学校の類型普通科と職業科では進学率が大きく異なる。

37

Page 38: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

aa1=pd.pivot_table(data=x,values=[’daigaku’,’math’,’kitai’,"ESCS"],\index=["type"], aggfunc="mean")

ESCS daigaku kitai mathtypepriv_f 53.256399 0.631103 20.845096 49.152333priv_s 48.303484 0.197044 19.673469 47.039293pub_f 50.432469 0.591656 20.817406 52.040785pub_s 45.817481 0.167805 19.268293 46.776351

• 男女共学か別学か

aa1=pd.pivot_table(data=x,values=[’daigaku’,’math’,’kitai’,"ESCS"],\index=["betsugaku"], aggfunc="mean"

ESCS daigaku kitai mathbetsugakudanshiko 47.880478 0.321970 19.683794 47.502442joshiko 52.833616 0.586735 20.849741 48.677964kyogaku 49.861229 0.493458 20.454225 50.290692

• まとめ: 当然、普通科のほうが進学率が高くなる。進学率の要因を調べるのであれば、普通科に限定すべきであろう。女子高の高い進学率は興味深い。非都市圏よりも都市圏のほうが大学進学率が高く、都市部では女子の進学希望が高くなることがみえるが、これは成績が都市部のほうが高いから進学率が高いだけのことかもしれない。成績が同じでも非都市圏は進学しにくいのか。層化を細かくしても、不明。回帰分析を行う。

9.8.2 回帰分析の係数の分解(1) 線形式における係数の間接的関連と直接的関連の分解

基本的な回帰分析被説明変数は Seriesを指定し、説明変数はDataFrameで設定する。単回帰の係数 β0と重回帰の係数 b0, b1, · · · , bkの間には

β = b1 +k∑

i=2

bic1,i

という関連がある。b1は変数 x1と yの直接的な関連をしめし、bia1,iは変数 xiを通した間接的な関連を示す。

y = α + βx1, y = a+ b1x1 + b2x2 + . . .+ bkxk

xi = ai + cix1

x1がダミー変数のときには、βは yの平均の差をしめすので、

•  都市圏と非都市圏での進学率の差 0.140395を説明する。

aa1=pd.pivot_table(data=x,values=[’daigaku’,’math’,"ESCS","male"],\index=["toshi"], aggfunc="mean")

ESCS daigaku male mathtoshi0 48.385391 0.401770 0.547493 48.4115831 50.914512 0.542165 0.456991 50.893880

d=aa1.ix[1]-aa1.ix[0]#行の選択には ixを用いる。

38

Page 39: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

y_data=x[’daigaku’]x_data=x[["toshi","male","ESCS","math"]]model=pd.ols(y=y_data, x=x_data, intercept=True)#切片 interceptを入れる。print(model)-----------------------Summary of Estimated Coefficients-------------

Variable Coef Std Err t-stat p-value CI 2.5% CI 97.5%-------------------------------------------------------------------

toshi 0.0626 0.0129 4.86 0.0000 0.0373 0.0878male 0.0536 0.0123 4.37 0.0000 0.0295 0.0776ESCS 0.0133 0.0007 20.24 0.0000 0.0120 0.0145math 0.0194 0.0007 29.43 0.0000 0.0181 0.0207

intercept -1.2071 0.0383 -31.48 0.0000 -1.2823 -1.1320---------------------------------End of Summary------------------b=model.beta# 回帰係数indirct=b*d#対応する indexごとに掛け算を実行する。

間接的な要因の大きさ#ESCS 0.033527#male -0.004850#math 0.048138

14パーセントのうち、約5パーセントは学力(数学)の差、約 3パーセントは社会的文化的環境の差、男女比率の影響は小さい。残りの約 7パーセントがこれらで説明のつかない部分。

• 大学進学率の男女差を説明

ESCS daigaku mathmale0.0 0.452168 0.469192 -0.2436181.0 -0.473370 0.515191 0.265485

-----------------------Summary of Estimated Coefficients------------------------Variable Coef Std Err t-stat p-value CI 2.5% CI 97.5%

--------------------------------------------------------------------------------male 0.0518 <- 0.0123 4.21 0.0000 0.0277 0.0760

ESCS 0.0131 0.0007 20.00 0.0000 0.0119 0.0144math 0.0194 0.0007 29.40 0.0000 0.0181 0.0207toshi 0.0640 0.0130 4.94 0.0000 0.0387 0.0894

itercept 0.4247 0.0123 34.51 0.0000 0.4006 0.4488---------------------------------End of Summary---------------------------------[ESCS -0.012167daigaku NaNintercept NaNmale NaNmath 0.009889toshi -0.005301

以上の結果から、男女の大学進学 (期待)率の差 0.046 = 0.515− 0.469は男女差の直接効果 0.0485男女の数学成績の差の影響 0.0098男女の経済社会階層の差の影響 -0.012の総和としてあらわされる。進学率の 1パーセントの差は学力の差では説明できるが、そ

39

Page 40: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

れは社会的経済的階層の差で 1.2パーセントだけ女子生徒が有利になり、ほぼ相殺される。したがって、5パーセントの大学進学率の差はこれらの要因では説明できない。

9.8.3 公立普通科に限定した男女差

xv03=v03[(v03.type=="公立普通")]# 公立普通科x_data=xv03[["male"]]y_data=xv03[’daigaku’]model03=pd.ols(y=y_data, x=x_data, intercept=True)print(model03)

xv15=v15[(v15.type=="公立普通")]# 公立普通科x_data=xv15[["male"]]y_data=xv15[’daigaku’]model15=pd.ols(y=y_data, x=x_data, intercept=True)print(model15)4年生大学の男女格差は 3年から 15年で 12パーセントから 10パーセントに縮小。

-----------------------Summary of Estimated Coefficients------------------------Variable Coef Std Err t-stat p-value CI 2.5% CI 97.5%

--------------------------------------------------------------------------------male 0.1206<- 0.0201 6.01 0.0000 0.0813 0.1600

intercept 0.5347 0.0138 38.78 0.0000 0.5077 0.5617-----------------------Summary of Estimated Coefficients------------------------

Variable Coef Std Err t-stat p-value CI 2.5% CI 97.5%--------------------------------------------------------------------------------

male 0.1042 0.0167 6.24 0.0000 0.0714 0.1369intercept 0.6159 0.0116 53.18 0.0000 0.5932 0.6385

9.8.4 係数ダミーを用いた係数の違いの検定

#2003年y_data=v03[’daigaku’]v03["male_math"]=v03.male*v03.mathv03["male_ESCS"]=v03.male*v03.ESCSx_data=v03["male","ESCS","math","male_math","male_ESCS"]]model=pd.ols(y=y_data, x=x_data, intercept=True)#切片 interceptを入れる。print(model)-----------------------Summary of Estimated Coefficients------------------------

Variable Coef Std Err t-stat p-value CI 2.5% CI 97.5%--------------------------------------------------------------------------------

male 0.0484 0.0122 3.95 0.0001 0.0244 0.0724ESCS 0.0145 0.0009 15.70 0.0000 0.0127 0.0163math 0.0208 0.0010 21.36 0.0000 0.0188 0.0227

male_math -0.0019 0.0013 -1.44 0.1510 -0.0045 0.0007male_ESCS -0.0020 0.0013 -1.52 0.1296 -0.0045 0.0006

--------------------------------------------------------------------------------intercept 0.4676 0.0086 54.62 0.0000 0.4508 0.4844

有意なのはmaleの係数であり、male * mathと male * ESCSの係数は有意でない。したがって、切片以外の係数の違いは認められない。 これに対して、2015年度においては数学の係数の男女差が有意に異なり、女性のほうが

係数が大きい(女子の進学率のほうが成績に敏感に反応する。)

40

Page 41: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

-----------------------Summary of Estimated Coefficients------------------------Variable Coef Std Err t-stat p-value CI 2.5% CI 97.5%

--------------------------------------------------------------------------------male 0.0740 0.0105 7.05 0.0000 0.0534 0.0945ESCS 0.0100 0.0008 12.48 0.0000 0.0084 0.0115math 0.0224 0.0008 26.99 0.0000 0.0208 0.0240

male_math -0.0055 0.0011 -4.82 0.0000 -0.0077 -0.0033male_ESCS -0.0001 0.0011 -0.10 0.9234 -0.0023 0.0021

--------------------------------------------------------------------------------intercept 0.5452 0.0074 73.54 0.0000 0.5307 0.5597

9.9 Oaxaca分解Oaxaca分解による平均の差12パーセントの分解は次のように示される。

Xcity,i = acity + bcityXcity,i + error

Xvillage,i = avillage + bvillageXvillage,i + error

より

Xcity − Xvillage = acity − avillage + bcityXcity − bvillageXvillage

= acity − avillage + bcity(Xcity − Xvillage) + (bcity − bvillage)Xvillage

のように平均の差が係数の差と変数の平均の差を使って分解できる。第二項において city、villageのどちらの係数を用いるかで結果が異なるという難点があるが、直感的にわかりやすいのでよく使われる。

olsの推定結果から係数の推定値を抜き出す作業が必要である。推定結果を modelというobjectに保存したら、傾きの推定値はmodel.betaとして取り出すことができる。利用可能な変数の propertyの一覧は dir関数により listとして表示される。

9.9.1 2003年の男女差の分解別分析 (Oaxaca)

 地域変数は無視し、2003年の 4年生大学進学率の差を分解する。

xxv03=xv03[(xv03.male==1)]# 男子x_data=xxv03[["math","ESCS"]]y_data=xxv03[’daigaku’]model_m=pd.ols(y=y_data, x=x_data, intercept=True)print(model_m)x_m=x_data.mean()

xxv03=xv03[(xv03.male==0)]# 女子生徒x_data=xxv03[["math","ESCS"]]y_data=xxv03[’daigaku’]model_f=pd.ols(y=y_data, x=x_data, intercept=True)print(model_f)

-----------------------Summary of Estimated Coefficients------------------------Variable Coef Std Err t-stat p-value CI 2.5% CI 97.5%

--------------------------------------------------------------------------------math 0.0214 0.0013 16.39 0.0000 0.0189 0.0240ESCS 0.0103 0.0013 7.82 0.0000 0.0077 0.0129

intercept 0.5922 0.0123 48.13 0.0000 0.5681 0.6163

41

Page 42: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

-----------------------Summary of Estimated Coefficients------------------------Variable Coef Std Err t-stat p-value CI 2.5% CI 97.5%

--------------------------------------------------------------------------------math 0.0240 0.0013 18.25 0.0000 0.0215 0.0266ESCS 0.0110 0.0013 8.58 0.0000 0.0085 0.0135

intercept 0.4955 0.0118 41.99 0.0000 0.4724 0.5187

x_f=x_data.mean()dx=x_m-x_fprint(dx)説明変数の平均値はmath 1.280552 数学は男子が高いESCS -0.075678 文化環境変数はやや女が高い。dtype: float64#数学の係数も ESCSの係数も女子生徒のほうがわずかに高い。dbeta=model_m.beta-model_f.betaprint(dbeta)math -0.002599ESCS -0.000677intercept 0.096693 切片は男子が(4年生進学率)10パーセント高い男女の進学率の差は係数の差か、説明変数の差か

x_f["intercept"]=1#定数項を追加x_m["intercept"]=1keisu=dbeta*x_f # 係数の差に由来する違いhensu=model_m.beta*dx #変数の平均値の差に由来する違いprint(keisu.sum())print(hensu.sum())#もう一つの分解でもほぼ同じような結果。keisu=dbeta*x_mhensu=model_f.beta*dxprint(keisu.sum())print(hensu.sum()

係数の差に由来するのは  0.09264変数の差に由来するのは  0.02666

係数(定数項)の差に全体 76パーセントとESCSの差よりも係数の差のほうが大きく貢献している。ほとんどは定数項の違い。同じ分析を 2015年のデータで行ったが、係数の差に由来するのは 0.072 ,変数の差に由来す

るのは 0.0317とほぼ同様の割合で分解される。

9.9.2 その他の変数

1. 父母の職業:2003年では父母の職業をホワイトカラーとブルカラー、スキルの高低で分類して調査している。

MSECATEG (232) Mother White collar/Blue collar classificationFormat: F1 Columns: 433-4331 White Collar high skilled2 White Collar low skilled3 Blue Collar high skilled4 Blue Collar low skilled

42

Page 43: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

9 Missing

FSECATEG (233) Father White collar/Blue collar classificationFormat: F1 Columns: 434-4341 White Collar high skilled2 White Collar low skilled3 Blue Collar high skilled4 Blue Collar low skilled9 Missing

2. 生徒が移民であるかどうかの調査

IMMIG (243) Country of birthFormat: F1 Columns: 466-4661 Native students2 First-Generation students3 Non-native students9 Missing

43

Page 44: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

9.10 期待教育年数の男女格差 (optional)

以下のコードは ILDEXの Editorを開き、file/openを選択し、file名に

"https://mcobaya.web.fc2.com/pisa2003male.py"

を選択するとダウンロードされる。

from pandas import * #pdなどを付加しないで module利用可能import pandas as pd #moduleないの命令を pd.csv_read()などのように pdを頭につけて実行する。from numpy import *import numpy as npimport osx=pd.read_csv("https://mcobaya.web.fc2.com/pisa2003jpn_ex.csv")# x=pd.read_csv(’pisa2003stu_JPN.csv’)#生徒変数の読み込み#sch=pd.read_csv(’pisa2003sch_JPN.csv’)#学校変数の読み込み#sch_loc=sch[["SCHOOLID","SC01Q01"]]#x=pd.merge(x,sch_loc,on="SCHOOLID")#x["math"]=x[["PV1MATH","PV2MATH","PV3MATH","PV4MATH","PV5MATH"]].mean(axis=1)#x=pd.read_csv("https://mcobaya.web.fc2.com/pisa2003jpn_ex.csv")x["math"]=50+10*(x.math-x.math.mean())/sqrt(x.math.var())# 偏差値にすx["ESCS"]=50+10*(x.ESCS-x.ESCS.mean())/sqrt(x.ESCS.var())# 偏差値にする

x.math.isnull().sum() #欠損値の数を数える。x.math.describe() #基礎統計量を記述。この methodの実行は習慣にするとよい。x["male"]=1*(x["ST03Q01"]==1)+2*(x["ST03Q01"]==2)x["male"]=x["male"].replace(0,np.nan)-1print((x.male==0).sum())

print(x.SISCED.isnull().sum())#92人不記入

x["kitai"]=(x.SISCED==5)*16+(x.SISCED==4)*14+(x.SISCED==3)*12+(x.SISCED==2)*12x["kitai"]=x["kitai"].replace(0,np.nan)#replaceは置換した値を表示する。置換はしない。

x["type"]=x.STRATUMx["type"]=x.type.replace(39201,"pub_f")x["type"]=x.type.replace(39202,"pub_s")x["type"]=x.type.replace(39203,"priv_f")x["type"]=x.type.replace(39204,"priv_s")

sc=unique(x.SCHOOLID)#重複を削除。for i in sc:

a=x.ix[x.SCHOOLID==i,"math"]a2=x.ix[x.SCHOOLID==i,"male"]a3=x.ix[x.SCHOOLID==i,"ESCS"]m_a=a.mean()male_a=a2.mean()#学校平均を求める。ESCS_a=a3.mean()x.ix[x.SCHOOLID==i, "mmath"]=m_ax.ix[x.SCHOOLID==i, "mmale"]=male_a#男子比率x.ix[x.SCHOOLID==i, "mESCS"]=ESCS_a #学校平均 ESCS

x["daigaku"]=x.kitai==22aa1=pd.pivot_table(data=x,values=[’daigaku’,’male’,’math’,’kitai’,"ESCS"],\

index=["type"], aggfunc="mean")

44

Page 45: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

print(aa1)# ESCS daigaku kitai male math#STRATUM#39201 -0.053072 0.591656 20.817406 0.471976 553.249627#39202 -0.391893 0.167805 19.268293 0.550781 502.339244#39203 0.154255 0.631103 20.845096 0.445750 525.316484#39204 -0.209377 0.197044 19.673469 0.625616 504.882058#>>>

y_data=x[’math’]x_data=x[["mESCS","male","ESCS"]]model=pd.ols(y=y_data, x=x_data, intercept=True)print(model)x["danshiko"]=1*(x.mmale==1)x["joshiko"]=1*(x.mmale==0)

y_data=x[’math’]x_data=x[["mESCS","male","ESCS","joshiko","danshiko"]]model=pd.ols(y=y_data, x=x_data, intercept=True)print(model)

y_data=x[’kitai’]x_data=x[["math","mmath","mESCS","male","ESCS","joshiko","danshiko"]]model=pd.ols(y=y_data, x=x_data, intercept=True)print(model)

xx=x[x.type==’priv_f’]y_data=xx[’math’]x_data=xx[["mESCS","male","ESCS"]]model=pd.ols(y=y_data, x=x_data, intercept=True)print(model)

9.11 付録:Gretをもちいた分析9.11.1 data の構築

documents folderに 1) データ読み込み

pisa2003stu_JPN.csvpisa2003sch_JPN.csv

をおく。。ファイル/データを読み込む/ユーザ/Documents/カンマ区切りテキストファイルに変更パネルデータとして読み込むかきいてくるがNo と答える。2)ファイル/名前をつけて保存を選択。3)スクリプトファイル/スクリプトファイルを新規作成

#変数作成  #はコメントmath=(PV1MATH+PV2MATH+PV3MATH+PV4MATH+PV5MATH)/5male=ST03Q01-1 #もとの変数は2男子、1女子

45

Page 46: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

kitai=16*(SISCED==5)+14*(SISCED==4)+12*(SISCED==3)+12*(SISCED==2)scalar k=max(SCHOOLID)loop i=1..k

smpl ( SCHOOLID == i) --restrict --replace#series math_ms=mean(maths)series math_m=mean(math)#series read_m=mean(read)series ESCS_m=mean(ESCS)series male_m=mean(male)#series SCMAT_m=mean(SCMAT)#series MATHEFF_m=mean(MATHEFF)series math_m=mean(math)

endloopsmpl fullsummary ESCS male# daigaku shingakuritsudaigaku=kitai==16

9.11.2 男女差

# danjo-sa

ols ESCS 0 male # 社会的地位の男女差ols daigaku 0 male #大学進学率の男女差ols math 0 male #数学得点の男女差ols chii 0 male

4) カーソルをその行に合わせ MENUの歯車アイコンをクリックで実行。5)学校のデータを merge。

9.11.3 地域差

データを追加  csv pisa2003sch_jpn選択  開く (join) advancedを選択  filterの欄をクリックし空白にする。keyは school ID, import する変数は SC01Q01(学校所在地の地域特性)

gretlは pivot Tableは持っていないが、2変数ごとの集計ではメニューの表示に cross集計という機能がある。

9.11.4 その他の特性

学校類型 (公立普通科、公立職業科、私立普通科、私立職業科)は STRATUMという変数に含まれる。これをクロス集計で分類。

9.11.5 回帰分析

都市圏(SC01Q01の 4,5で定義)すると、進学率に差がある。これはなぜか、数学の成績、ESCSで説明してみよう。回帰分析で進学率の差を説明するには二つの方法がある。一つは単回帰と重回帰の関係。もうひとつはOaxaca分解(1)単回帰と重回帰の関係

SC01Q01==9に欠損値処理をおこなう。city=1*(SC01Q01==4)+1*(SC01Q01==5)  これで cityは都市圏を示すダミー。

46

Page 47: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

daigaku(大学進学率)を首都圏ダミーで説明する。ols daigaku 0 city これは短回帰 都市にある学校の生徒は数学であろう。その成果もしれない。ols daigaku 0 city male ESCS mathsmathsは平均 0、分散1に変換した数学成績ols daigaku 0 city mathsolsq maths 0 city

都市圏の学校のほうが 0.25数学の成績がよい。数学の成績が1よいと進学率は 24パーセント上昇するので都市圏の学校の高い進学率は 6パーセント(24 × 0.25)であり、都市圏固有の部分は約 8パーセントさらに ESCSも説明変数に加えて。

ols daigaku 0 city ESCS mathsols maths 0 cityols ESCS 0 city

10 PISA2015の分析2003年と大幅にコードが変更されているので注意。また、PISA2015は調査結果が公表されたばかりなのでデータクリーニングが不十分であり、同一列に数値型と文字型のデータが混在していることがあり、処理に注意が必要。

10.1 変数Plausible Valueが 2012年までは 5通りの推定値なのが、PV1MATHから PV10MATHまでの 10通りの推定値になっている。

STRATUM 私立公立の別、普通科と職業科の別JPN0101 JPN - stratum 01: Public\Academic 3158JPN0202 JPN - stratum 02: Public\Practical 1378JPN0203 JPN - stratum 03: Private\Academic 1817JPN0204 JPN - stratum 04: Private\Practical 294fileには"JPN0"が付加されているので文字列として読み込まれる。

ST004D01T 1 female, 2: male これは従前通り。ST111Q01TA Which of the following do you expect to complete?これが SISCEDに対応するもので、生徒が期待する進学レベルを示す。父母はの実際の学歴は FISCEDと MISCEDが示す。

ISCEDによる学校のレベル1 <ISCED level 2>2 <ISCED level 3B or C> 専門 (職業)科高校3 <ISCED level 3A> 普通科高校4 <ISCED level 4> 日本ではほとんど存在しない。5 <ISCED level 5B> 短大6 <ISCED level 5A or 6>  4年生大学、大学院97 / .N Not Applicable98 / .I Invalid99 / .M No ResponseSYSTEM MISSING Missing2003年とは番号の対応が異なる。

47

Page 48: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

学校の所在地のコード: SC001Q01TAthe community in which your school is located?基準は 2003と変わらない。1 A village, hamlet or rural area (fewer than 3 000 people)2 A small town (3 000 to about 15 000 people)3 A town (15 000 to about 100 000 people)4 A city (100 000 to about 1 000 000 people)5 A large city (with over 1 000 000 people)98 / .I Invalid99 / .M No ResponseSYSTEM MISSING Missing

ESCS(  Economic, Social, and Cultural Status)も同じ基準で得られている。

10.1.1 その他の変数

父母の職業 (OCOD1, OCOD2)も ISCOコードで調査しており、そこからホワイトカラーかブルカラーがわかる。

ISCO-08 Occupation code - Mother ISCO-08

1 White-collar high-skilled2 White-collar high-skilled3 White-collar high-skilled4 White-collarlow-skilled5 White-collarlow-skilled6 Blue-collar high-skilled7 Blue-collar high-skilled8 Blue-collar low-skilled9 Blue-collar low-skilledただし、9704以上は記入漏れ等なので NaNに変換する。最初の 999までには軍人などがはいっているが、これは NaNと処理する。

10.1.2 回帰分析(2) 学校特性 (男子校、女子校、共学)と学校レベル (成績と社会階層)

y_data=x[’daigaku’]x_data=x[["mESCS","male","ESCS","joshiko","danshiko","math","mmath"]]model=pd.ols(y=y_data, x=x_data, intercept=True)print(mod-----------------------Summary of Estimated Coefficients------------------------

Variable Coef Std Err t-stat p-value CI 2.5% CI 97.5%--------------------------------------------------------------------------------

mESCS 0.0321 0.0021 15.55 0.0000 0.0280 0.0361male 0.1089 0.0125 8.70 0.0000 0.0844 0.1334ESCS 0.0065 0.0007 9.49 0.0000 0.0052 0.0078

joshiko 0.0545 0.0231 2.36 0.0182 0.0093 0.0998danshiko -0.1106 0.0260 -4.26 0.0000 -0.1616 -0.0597

--------------------------------------------------------------------------------math 0.0091 0.0009 10.13 0.0000 0.0073 0.0108

mmath 0.0038 0.0016 2.31 0.0212 0.0006 0.0070intercept -2.1319 0.0563 -37.86 0.0000 -2.2422 -2.0215

48

Page 49: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

他の条件が一定であると、男性であることは大学進学率を 10パーセント上昇させる。男子校にいくと 11パーセント以上、進学率が低くなる。数学が 1偏差値上昇すると、1.29パーセント進学率が上昇することのうちわけは、0.91パーセントがは本人の影響であり、のこりの 0.38パーセントは学校のレベル上昇の影響であり、本人の影響が大きい。

-----------------------Summary of Estimated Coefficients------------------------Variable Coef Std Err t-stat p-value CI 2.5% CI 97.5%

--------------------------------------------------------------------------------mESCS 0.0210 0.0026 8.18 0.0000 0.0160 0.0260male 0.1137 0.0123 9.27 0.0000 0.0896 0.1377ESCS 0.0065 0.0007 9.74 0.0000 0.0052 0.0078

joshiko 0.0977 0.0240 4.08 0.0000 0.0507 0.1446danshiko -0.0211 0.0265 -0.80 0.4264 -0.0730 0.0309

--------------------------------------------------------------------------------math 0.0090 0.0009 10.34 0.0000 0.0073 0.0107

mmath 0.0072 0.0018 3.94 0.0001 0.0036 0.0108priv_f 0.2864 0.0316 9.05 0.0000 0.2244 0.3484pub_f 0.2964 0.0308 9.62 0.0000 0.2360 0.3568pub_s 0.0801 0.0318 2.52 0.0119 0.0177 0.1425

--------------------------------------------------------------------------------intercept -1.9931 0.0715 -27.89 0.0000 -2.1332 -1.8531

男子校の影響は職業科などの高校の類型をいれることにより有意ではなくなるので、工業高校などの大学進学率の学校の多くが男子校であることを反映しているにすぎないと思われる。これに対して、女子高はいぜんとして大学進学率に対して、プラスの相関を持っている。男子校ダミーを除いた推定を示す。

-----------------------Summary of Estimated Coefficients------------------------Variable Coef Std Err t-stat p-value CI 2.5% CI 97.5%

--------------------------------------------------------------------------------mESCS 0.0211 0.0026 8.22 0.0000 0.0161 0.0261male 0.1117 0.0120 9.29 0.0000 0.0882 0.1353ESCS 0.0065 0.0007 9.74 0.0000 0.0052 0.0078

joshiko 0.0993 0.0239 4.16 0.0000 0.0525 0.1460math 0.0090 0.0009 10.36 0.0000 0.0073 0.0108

--------------------------------------------------------------------------------mmath 0.0072 0.0018 3.91 0.0001 0.0036 0.0108

priv_f 0.2916 0.0309 9.43 0.0000 0.2310 0.3523pub_f 0.3034 0.0295 10.27 0.0000 0.2455 0.3613pub_s 0.0857 0.0311 2.76 0.0058 0.0248 0.1466

intercept -2.0016 0.0707 -28.33 0.0000 -2.1401 -1.8631

10.1.3 高校の類型別の分析

私立普通科、公立普通科、私立職業科、公立職業科の4類型に高校を層化、それぞれの係数を比較する。

--Summary of Estimated Coefficients------------------------Variable Coef Std Err t-stat p-value CI 2.5% CI 97.5%

-------------------------------------------------------------male 0.0911 0.0167 5.45 0.0000 0.0583 0.1239ESCS 0.0106 0.0009 11.58 0.0000 0.0088 0.0124math 0.0228 0.0009 24.50 0.0000 0.0209 0.0246

intercept -1.1717 0.0540 -21.72 0.0000 -1.2775 -1.0660

------Summary of Estimated Coefficients------------------------

49

Page 50: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

Variable Coef Std Err t-stat p-value CI 2.5% CI 97.5%----------------------------------------------------------

male 0.0228 0.0244 0.94 0.3493 -0.0249 0.0706ESCS 0.0126 0.0013 9.63 0.0000 0.0101 0.0152math 0.0176 0.0012 14.32 0.0000 0.0152 0.0200

intercept -0.9145 0.0729 -12.55 0.0000 -1.0573 -0.7717

--Summary of Estimated Coefficients------------------------Variable Coef Std Err t-stat p-value CI 2.5% CI 97.5%

-------------------------------------------------male 0.0241 0.0228 1.06 0.2913 -0.0206 0.0687ESCS 0.0075 0.0013 5.81 0.0000 0.0050 0.0100math 0.0078 0.0014 5.67 0.0000 0.0051 0.0105

intercept -0.5534 0.0823 -6.73 0.0000 -0.7146 -0.3921

------Summary of Estimated Coefficients------------------------Variable Coef Std Err t-stat p-value CI 2.5% CI 97.5%

------------------------------------------------------male 0.2613 0.0528 4.95 0.0000 0.1578 0.3648ESCS 0.0072 0.0028 2.61 0.0098 0.0018 0.0127math 0.0101 0.0027 3.78 0.0002 0.0049 0.0153

intercept -0.7905 0.1552 -5.09 0.0000 -1.0947 -0.4862--End of Summary---------------------------------

11 読み込むときの文字型と数値の混在の処理数値データのはずでも、未整理のデータには文字(”a”, ”1”や空白文字等)と数値 (1,2,3等)が混在していると、それ以後の統計処理ができないが、従来、その対処に大変な労力と時間を必要としてきた。pandasはこの作業を画期的に簡単にする。

11.0.1 文字型の検出

まず文字型のデータがはいっているか検出しよう。おぼえておくとよい技。

b=pd.Series([1,"2","a"," "])b==b.astype(str)b[b==b.astype(str)]#文字を抽出b[b!=b.astype(str)]#数値を抽出

文字型を検出するときに使ったのは、数値を文字にするmethodastype(str)。欠測値は”nan”という文字列に変換されるので、文字列だけが変換前後で一致する。

11.0.2 convert objects(convert numeric=True)による文字型の数値への変換

文字型にも、”2”のような数値として解釈可能な文字列と空白文字” ”や”a”のような数値として解釈できない文字列の二種類がある。文字でも”2”などは数値 1のつもりで入力したのが、何らかのミスで文字になってしまっているので、これは数値として扱いたい。

b.convert_objects(convert_numeric=True)0 1.01 2.02 NaN

50

Page 51: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

convert_objects(convert_numeric=True)は数値に変換できるもの (文字型の”1”など)は数値に変換し、それ以外はNanに変換する。覚えにくいし、warningがでるが、大変便利。これにたいして、to_numericや astype(int)数値に変換できないもの (”a”や空白文字があると、エラーを起こし、他の文字の変換もできないので、データクリーニングには不向き。

pd.to_numeric(pd.Series([1,2,"3"]))b.astype(int)pd.Series([1,2,"3"]).to_numeric()

11.0.3 astype(numeric)による数値型への変換

メッソド astypeだけは全角の数字を数値型に変換できるので、全角数値の混入があるときは利用可能である。漢数字はいずれの方法でも変換できず、停止する。文字列などを数値にするメッソッド b.astype(numeric)は”a”のような数値に解釈できない文字列で、エラーをおこし、停止する。文字はいつも数値にできるとは限らないのがやっかい。

a=pd.Series([1,"1"])a.astype(int)0 11 1.a.astype(float)0 1.01 1.0

11.0.4 メッソド astype()による数値型の文字型への変換

文字型にするのは単純。数値型や文字型が混在したSeriesを文字型にするにはメッソドastype(str)を用いるのがよい。to_string()メッソドは、Seriesを単一を文字列に変換するので、多くの場合目的に合致しない

a.astype(str)0 11 1a.to_string()’0 1\n1 1’

11.0.5 欠損値の処理

• 欠損値は、999などの特別な値であらわす場合がある。この場合、

x["kitai"]=x.kitai.replace(999,np.nan)

999を欠損値を表すコードNaNにまず変換する。

•  変数が欠損値を含むか確認する。

print(x["ESCS"].isnull().sum())#36人欠損

•  変数の基礎統計量(とくに最大と最小)を確認する。

x.ESCS.describe()

51

Page 52: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

11.0.6 結合の練習

日本の学生のデータである jpn.csvを読み込みこれを学校のデータである schjpn.csvと schoolidを keyにしてmergeする。

os.chdir("C:/Users/mc/Dropbox/0python/2017zemi")schjpn=pd.read_csv("sch_jpn.csv")stujpn=pd.read_csv("jpn.csv")stujpn.tail()

jpn_all=pd.merge(stujpn,schjpn,how="left", on="SCHOOLID")jpn_all.head()

これを使って、クラス規模と成績、学校の規模と成績の相関係数をもとめてみる。

a=jpn_all[[’math’,’CLSIZE’]]

[6351 rows x 2 columns]a=jpn_all[[’math’,’CLSIZE’]]a.corr()

math CLSIZEmath 1.000000 0.289723CLSIZE 0.289723 1.000000b=jpn_all[[’math’,’SCHSIZE’]]b.corr()

変数名に重複がなく、indexで結合する場合には joinを使う。学生の経済社会的な状態を計測した変数 ESCSだけが jpn_escs.csvに格納されている。メッソド joinでこれを追加し、経済状況と成績の関連を見る。

jpn_escs=pd.read_csv(’jpn_escs’)jpn=jpn_all.join(jpn_escs)jpn.head()jpn[[’ESCS’,’math’,’read’,’scie’]].corr()

ESCS math read sciESCS 1.000000 0.013780 0.016745 0.011616math 0.013780 1.000000 0.898612 0.923699read 0.016745 0.898612 1.000000 0.918372sci 0.011616 0.923699 0.918372 1.000000

12 データの集約import pandas as pdjpn=read_csv(’jpn.csv’)import numpy as npimport statsmodels.api as smimport matplotlib.pyplot as pltjpn.columns

前の章に引き続き jpn.csvを読み込んで用いる。

52

Page 53: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

12.0.1 4年生大学進学率の分析

ESCS daigaku kitai male mathtype公普 50.128194 0.665928 20.797973 0.480684 1.581740公職 46.253151 0.237300 19.100145 0.521771 -3.299853私普 53.189892 0.742983 20.959824 0.542102 0.717870私職 46.241118 0.197279 19.102041 0.394558 -5.960233

12.1 groupbyによる分析:両親の学歴と子供の成績大学か大学院を高学歴と定義すると、どちらかが 1であるものを高学歴と定義する。

jpn[’母高学歴’]=(jpn[’母院’]==1)|(jpn[’母大学]==1)jpn[’父高学歴’]=(jpn[’父院’]==1)|(jpn[’父大学]==1)

真偽値では系列の要素ごとの「いずれかが真」の操作は|で行い、要素ごとの「いずれも真」の操作は&でおこなう。生徒の男女別、両親の学歴ごとに数学の平均得点を求める。

jpn.groupby(’female1’)[’math’].mean()female11 525.7293322 545.175055jpn.groupby(’female1’).mean()jpn.groupby([’female1’,’母高学歴’,’父高学歴’])[’math’].mean()

female1 母高学歴 父高学歴1 False False 504.401942

True 549.683984True False 523.950199

True 570.4095362 False False 522.863550

True 571.616850True False 537.250004

True 582.340268

このようにすると、注意:もとのファイルでは「母親が大学院をでているか」という質問にたいする回答は

ST14Q01「母親が大学院卒か」の解答  yes=1, no=2, その他の数字は無回答、無効ST14Q02「母親が大学卒か」ST18Q01:「父親が大学院卒か」ST18Q02:「父親が大学卒か」。

12.1.1 国公立と私立、普通科と職業科

Stratum 変数の内容JPN0101” ”JPN - stratum 01 : 01: Public and Academic” ”JPN0202” ”JPN - stratum 02 : 02:Public and Practical””JPN0203” ”JPN - stratum 03 : 03: Private and Academic””JPN0204” ”JPN - stratum 04 : 04: Private and Practical”

12.1.2 データの分類

数学の成績を標準偏差一つ分で分割しよう。

53

Page 54: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

jpn.math.describe()jpn.math.describe()

count 6351.000000mean 535.925248std 91.421613min 220.91446025% 474.57548050% 537.94206075% 602.632800max 797.561900Name: math, dtype: float64m=jpn.math.describe()m[1]# Pythonでは index番号は 0から数えるので、二つ目の要素である meanを表示するには m[1]535.92524754526823m[1]+m[2]

627.34686070217901m[1]-m[2]

444.50363438835745bin=[0,m[1]-m[2],m[1]+m[2],1000]label=list(’LMH’)#これは便利な文字列の操作label

[’L’, ’M’, ’H’]pd.cut(jpn.math,bin,labels=label)

Categories (3, object): [L < M < H]jpn[’labes’]=pd.cut(jpn.math,bin,labels=label)pd.cut(jpn.math,bin,labels=label).value_counts()

M 4240H 1065L 1046pd.qcut(jpn.math,10).value_counts()  #10等分してその件数を報告

Name: math, dtype: int64jpn.groupby(’key’).mean()#各々の区間の平均を求める。

12.2 回帰分析jpn.csvを用いる。Pythonの回帰分析は statsmodels.apiを importして行う。はpytyonを installした folderの下の notebookが default directoryなのでそこのデータファイルをおくとよい。

12.2.1 ヒストグラムと散布図

まずはヒストグラムと散布図を描く。

import matplotlib.pyplot as pltplt.scatter(jpn.math,jpn.read)plt.show()jpn.math.hist(bins=50)plt.show()

12.2.2 pivot table

前に用いたDataFrameである jpnをそのまま用いる。長い命令は backslash(\か円マーク)を行末につけると継続行となる。

54

Page 55: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

jpn[’hescs’]=1*(jpn.ESCS>1.0)pd.pivot_table(data=jpn,values=’math’,index=[’female1’,’hescs’], \

aggfunc=’mean’)female1 hescs1 False 522.253167

True 577.8166422 False 541.945183

True 595.190101Name: math, dtype: float64pd.pivot_table(data=jpn,values=’math’,columns=[’hescs’],index=[’female1’], \

aggfunc=’mean’)hescs False Truefemale11 522.253167 577.8166422 541.945183 595.190101

pd.pivot_table(data=jpn,values=’math’,columns=[’hescs’],index=[’female1’], \aggfunc=’count’,margins=True)hescs False True Allfemale11 2832.0 189.0 3021.02 3128.0 202.0 3330.0All 5960.0 391.0 6351.0

12.2.3 statsmodelsでの回帰分析

import statsmodels.api as smimport matplotlib.pyplot as pltjpn.columns# Fit and summarize OLS modelX=jpn.readmodel=sm.OLS(y,X)results=model.fit()print(results.summary())

データには欠測値がないことが前提なので、

df.dropna()df.dropna(subset=["a"])

欠損値を含む列Columnを除く重回帰分析を行う。数学の得点を ESCSで説明する。

X=jpn[[’female1’,’ESCS]] #かぎかっこは二重にすることが必要a=jpn.ESCS>-999 # 欠測値でないものy=jpn.mathmodel=sm.OLS(y[a],X[a])results=model.fit()print(results.summary())

OLS Regression Results==============================================================================Dep. Variable: math R-squared: 0.996Model: OLS Adj. R-squared: 0.996

55

Page 56: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

Method: Least Squares F-statistic: 8.396e+05Date: Tue, 06 Jun 2017 Prob (F-statistic): 0.00Time: 11:53:33 Log-Likelihood: -31288.No. Observations: 6351 AIC: 6.258e+04Df Residuals: 6349 BIC: 6.259e+04Df Model: 2Covariance Type: nonrobust==============================================================================

coef std err t P>|t| [0.025 0.975]------------------------------------------------------------------------------read 0.3216 0.011 28.928 0.000 0.300 0.343sci 0.6629 0.011 60.520 0.000 0.641 0.684==============================================================================Omnibus: 1.059 Durbin-Watson: 1.533Prob(Omnibus): 0.589 Jarque-Bera (JB): 1.017Skew: 0.027 Prob(JB): 0.601Kurtosis: 3.030 Cond. No. 29.0==============================================================================

Warnings:[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.

12.3 性別ごとの科目の集計平均をとる操作は関数としてもmethodとしても用意されている。メソッドは属性の一種類だが、関数なので()を最後につける。まず全体の平均、次は男性の平均

np.mean(jpn.math)535.9252475452682jpn.math.mean()

535.9252475452682jpnm=jpn[ ’female1’]==2#まず真偽値の Seriesを作る。男性は 2という値をとる。jpnf=jpn[ ’female1’]==1#jpnmdf=jpn[jpnm]#男性だけのデータフレームを作る。jpnfdf=jpn[jpnf]#女性だけのデータフレームを作る。jpnfdf.index # 最初のデータフレーム jpnの indexが保持され、indexに欠番が発生する。np.mean(jpnmdf.math)#男性だけの平均。np.mean(jpnfdf.math)#女性だけの平均jpnmdf.math.describe() #主要な統計量を算出

その他の国でもやってみよう。

12.4 データ読み込みと データクリーニングここから順番に実行していく。

12.4.1 別ファイルのデータとの結合(merge)

pythonの folder()の下の notebookが pythondの default directoryである。ここに

pisa2003stu_JPN.csvpisa2003sch_JPN.csv

を置く。次のようのmoduleを読み込む。

56

Page 57: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

from pandas import * #pdなどを付加しないで module利用可能import pandas as pd #moduleないの命令を pd.csv_read()などのように pdを頭につけて実行する。from numpy import *import numpy as npimport os

学校側が提出した学校についての情報が別ファイルにある。たとえば学校所在地が大都市か村、町なのか等。これを使って地域格差の存在の検出と比較に使う。  次の例ではSCHOOLIDをKeyとして、学校の立地情報をmergeさせている。

12.5 Pythonによる欠損値の一括変換(上級)

12.5.1 テキスト fileの読み込み

MISSING VALUESCARINFO CARPREP CULTPOSS ENVAWARE ENVOPT ENVPERC GENSCIEHEDRES HIGHCONF HOMEPOS INSTSCIE INTCONF INTSCIE INTUSE JOYSCIEPERSCIE PRGUSE RESPDEV SCAPPLY SCHANDS SCIEACT SCIEEFF SCIEFUTSCINTACT SCINVEST SCSCIE WEALTH (997,999).

MISSING VALUES PV1READ PV2READ PV3READ PV4READ PV5READ (9997).

とあるファイル (PISA2006.txtを、欠損値処理に便利なように、listに変換する。

12.5.2 変換

ダウンロードしたコントロールコードファイルには欠損値コードが記されているので、pythonで欠損値コードを持つデータをPythonの欠損値コード np.nanに変換することができる。コントロールコードファイルでは大文字とあるべきところが小文字で記されていることもあり、注意して訂正が必要。

import pandas as pdimport numpy as npx=pd.read_csv("JPN2006ST.csv")MV=[’ST13Q15’,’ST13Q16’,’ST13Q17’]A=[999997,999998,999999]for i in MV:temp_var=x[i]x[i]=temp_var.replace(A,np.nan)

12.5.3 Pythonのモジュール pandasを用いた読み込み(上級)

SPSSが利用できない環境では、コントロールコードファイルに含まれているカラム情報を利用し、pythonの pandas moduleに含まれる read_fwfという命令や gretlの open命令を用いて読み取ることができる。ただし、pythonのカラムの数え方は特殊であり、注意が必要。temp.txtという名前から、1桁から 3桁目を第一列の値、4桁から 6桁を第 2列の値に格納するときは

012345ab cdA B次の行実行すると、文字列としてデータが保存される。>>>import pandas as pd>>>n=pd.read_fwf("temp.txt",colspecs=([0,3],[3,6]),header=None)

0 1

57

Page 58: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

0 012 3451 ab cd2 A B NaNこれらは必要に応じて後で数値型等に変換可能。文字列の途中の空白は保持されるが、最初と最後の空白は削除される。

12.6 変数の作成前節の継続として、pandasの中で分析を行う。

• 加減乗除で変数を作成する場合には、欠損値は無視されるので、あまり注意する点はない。

x["math"]=x[["PV1MATH","PV2MATH","PV3MATH","PV4MATH","PV5MATH"]].mean(axis=1)x.math.isnull().sum() #欠損値の数を数える。x.math.describe() #基礎統計量を記述。この methodの実行は習慣にするとよい。x["math"]=50+10*(x.math-x.math.mean())/sqrt(x.math.var())# 偏差値にする。

• 論理式を用いた変数作成は注意。pandasでは欠損値が紛れ込むと論理式の値が Falseになるので、意図しない結果が起きやすい。たとえば、

x["male"]=1*(x["ST03Q01"]==1)

とすると、0の値をとるのはmaleと NaNである。0の値をとるのはmaleと判断すると誤った結果を引き起こす。Nanの場合は 0、それ以外は正の値をとるようにしておき、0の値をNanに置換すると間違いがない。欠損値は 999のようなありえない値をとるか本当に欠損しているかの二つの表示方法がある。

print(x.ST03Q01.isnull().sum())# 一人だけ記入なしが存在。x["male"]=1*(x["ST03Q01"]==1)+2*(x["ST03Q01"]==2)

x["male"]=x["male"].replace(0,np.nan)-1# ダミー変数は 0か 1の値にする。

x["kitai"]=(x.SISCED==5)*16+(x.SISCED==4)*14+(x.SISCED==3)*12+(x.SISCED==2)*12#教育年数x["kitai"]=x["kitai"].replace(0,np.nan)#欠損値は 0なので nanに入れ替えるx["type"]=x.STRATUMx["type"]=x.type.replace(39201,"pub_f")x["type"]=x.type.replace(39202,"pub_s")x["type"]=x.type.replace(39203,"priv_f")x["type"]=x.type.replace(390204,"priv_s")

•  学校ごとの男子比率や平均成績などを求めるには forを用いるのが自然。

sc=unique(x.SCHOOLID)#重複を削除。for i in sc:

a=x.ix[x.SCHOOLID==i,"math"]a2=x.ix[x.SCHOOLID==i,"male"]a3=x.ix[x.SCHOOLID==i,"ESCS"]m_a=a.mean()male_a=a2.mean()#学校平均を求める。

  ESCS_a=a3.mean()x.ix[x.SCHOOLID==i, "mmath"]=m_ax.ix[x.SCHOOLID==i, "mmale"]=male_a#男子比率x.ix[x.SCHOOLID==i, "mESCS"]=ESCS_a #学校平均 ESCS

58

Page 59: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

行と列の双方を指定する代入と抽出では.ixを用いる。最初に行を指定し、次に列を指定する。

• 地域情報を含む SC01Q01の xの中での存在を確認。変数 list x.columnsの最後のほうにあるはずなので、最後から 30番目から最後までを表示。

verb|x.columns[-30:]|print( unique(x.SC01Q01))#2,3,4,5 9のうち、9は無解答を示す。x["area"]=x.SC01Q01.replace(9,nan)y=get_dummies(x.area)y[x.area.isnull()}=np.nany.columns=["S town","town","city","L city"]y.drop("DUM")x=concat([x,y],axis=1)#データを横へ合併

欠測値は 0となるので、y[x.area.isnull()]=np.nanでNaNを残す。

• NaNを含むデータを処理できない統計手法では、事前にNaNを含む観測対象 (行)を次のようにして除去しておかないと、計算が中断する。pandasの統計手法ではNaNは自動的に除いて計算継続する。

yx=yx.dropna()

13 コンビニでのラーメン売り上げデータ

13.1 読み取り練習としてPOSデータの処理をおこなう。毎月の関東地方のコンビニのレシートをデータ化したものである。まず、読み込みから。注意すべきは、コードが SHIFT-JISに含まれていない文字記号があるため、そのままでは読み取りエラーがおきる。SHIFT-JIS外の記号や文字が含まれていなる可能性がある。そのときは SHIFT-JISの拡張版である cp932を指定する。

import pandas as pdimport numpy as npimport osfrom pandas import Series, DataFrame

os.chdir(’pos’) # 作業フォルダーを変更os.listdir() #ファイルの存在を確認。a11=pd.read_csv(’即席カップめん_201511.csv’,encoding=’cp932’)a12=pd.read_csv(’即席カップめん_201512.csv’,encoding=’cp932’)a11.head()a12.head() # head()で先頭の五行を表示し、読み取れたことを確認する

13.1.1 日時、時間を pandasのデータに変換

#a=pd.concat([a11,a12]) #concatでデータを合併。縦に結合することに注意。( )の中はリスト#日付を文字型に変更。by=a12.YYYY.astype(’str’)bm=a12.MM.astype(’str’)bd=a12.DD.astype(’str’)bhh=a12.hh.astype(’str’)bmm=a12.mm.astype(’str’)

59

Page 60: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

bss=a12.ss.astype(’str’)b=by+’-’+bm+’-’+bd+’ ’+bhh+’:’+bmm+’:’+bss # 文字列の加算は文字の結合from datetime import datetimebd=pd.to_datetime(b)#文字列を date timeに変換a12.index=bd # indexを日付に変更a12[’2015-12-01 01:30’:’2015-12-01 01’:39] #1:30から 1:39までのデータcode=(a12.分類コード >=137001)&(a12.分類コード<=137005)cupmen=a12[code]cupmen.個数.resample(’D’,how=’sum’)cupmen.値段.resample(’H’,how=’sum’)import matplotlib.pyplot as plt #ヒストグラムを描くcupmen.単価.hist(bins=50)plt.show()

\subsubsection{ 時間別にカップめんの売れ行きを集計する}まず 1時から 2:00までの売れ行きをみる。\begin{verbatim}cupmen.index.hourcupmen.index.minutes1=cupmen[ (cupmen.index.hour==1)]

13.2 loopを使った作業の効率化の練習(optional) 

13.2.1 合併時の indexの付け替え

fdf=pd.concat([fdf,df], ignore_index=True)  indexが重複しないように、indexを新しく付与しなおす。これをしないと、ことなったDataFrameの同じ indexが存続し、indexが重複してする。

13.2.2 文字の一部抜出し

x=’abcdef’x[0] # Pythonでは系列、文字列中の位置は0から始まる。これは ax[1]# これは b

13.2.3 loop

for k in [’08’, ’09’,’10’,’11’,’12’]:\\namefull=name1+k+’.csv’ # for の後の繰り返しの範囲は開始行下げをそろえる。

13.2.4 apply

pandasは SeriesやDataFrameという複数の要素からなる objectに一度に処理できる toolを多くもっているが、限りがある。applyは要素に対する操作を SeriesやDataFrameに適応する

>>> aa0 11 22 3>>> bb=aa.apply(lambda x: (aa==x))>>> bb

60

Page 61: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

0 1 20 True False False1 False True False2 False False True>>> bb=aa.apply(lambda x: 1*(aa==x))>>> bb

0 1 20 1 0 01 0 1 02 0 0 1

13.3 複数のファイルの合併複数のファイルの読み込みなどを for loopを用いて効率的に実行可能。ファイル名や列名などを listにして、loopの中で順番に代入していく。

import osimport pandas as pdimport numpy as npimport matplotlib.pyplot as pltfrom pandas import Series, DataFrameimport datetimeos.chdir(’C:\\Users\\mc\\Dropbox\\pos’)

fdf=pd.DataFrame()for k in [’08’, ’09’,’10’,’11’,’12’]:

namefull=name1+k+’.csv’ # for の後の繰り返しの範囲は開始行下げをそろえる。print(namefull)df=pd.read_csv(namefull, encoding=’cp932’)#cp932は Shift-JISの拡張fdf=pd.concat([fdf,df],ignore_index=True)

# indexを新しく付与しなおす。name2=’即席カップめん_2016’ #ファイル名を作成するには stringの処理が必須

#すべての月のデータを合併して、fdfとする。for k in [’01’, ’02’,’03’,’04’,’05’,’06’,’07’]:

namefull=name2+k+’.csv’#同じ行から始まる命令をブロックとして反復print(namefull)df=pd.read_csv(namefull, encoding=’cp932’)fdf=pd.concat([fdf,df], ignore_index=True)# indexが重複しないように、indexを

新しく付与しなおす。

13.3.1 pickleによる保存

fdf.to_pickle(’full_pos’)# to_pickeは高速保存を行う。qq=pd.read_pickle(’full_pos’)# to_pickeで保存された objectを読み取る

13.3.2 立地による分類

a=np.unique(fdf.店舗立地)print(a)

aindex=fdf.index

61

Page 62: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

ritti=fdf.店舗立地newloc=pd.Series(index=fdf.index)#空っぽの系列を作成for i in aindex:

temp=ritti[i]temp=temp[0] # Pythonでは indexは 0から開始 (これは重要)なので、最初の1文字を

取り出す。newloc[i]=temp # 文字を元の場所に戻す。

fdf[’newloc’]=newloc #列をもとの DataFrameにもどす。

q=pd.pivot_table(data=fdf,values=’値段’, index=[’レシート番号’], columns=[’newloc’, ’購入者性別フラグ’], fill_value = 0,aggfunc="count")#, fill_value = 0は該当なしを 0と置く指定q=q>0# 購入件数を複数購入も一件とみなすように変換qsum=q.sum()

plt.bar(height=qsum, left=np.arange(1,9) );plt.pause(0.00)loc=pd.DataFrame(index=np.unique(newloc),columns=[’tabako’,’kashi’,’sake’])#たばこ 681 【たばこ・喫煙関連用品】681001 たばこfdf[’tabako’]=1*(fdf.分類コード==681001)fdf[’kashi’]=1*((fdf.分類コード>191000) &(fdf.分類コード<200000))fdf[’sake’]=1*((fdf.分類コード>211000) &(fdf.分類コード<=223003))

for j in [’tabako’,’kashi’,’sake’]:

q=pd.pivot_table(data=fdf,values=’値段’, index=[’レシート番号’], columns=[’newloc’,j], fill_value = 0,aggfunc="count")q=(q>0)# 煙草等の購入の有無でカップ麺の購入者を分類。print(j)for k in [’オ’,’ロ’,’住’,’駅’]:

tcount=q[k]#n行 2列tsum=tcount.sum()print(k)print( tsum[1]/( tsum[1]+tsum[0]))loc[j][k]=tsum[1]/( tsum[1]+tsum[0])

print(loc)merc=[’tabako’,’kashi’,’sake’]

13.3.3 棒グラフ

plt.bar(height=loc[merc[0]], left=[1,2,3,4],tick_label=[’off’,’roa’,’res’,’sta’] );plt.pause(0.001)plt.bar(height=loc[merc[1]], left=[1.3,2.3,3.3,4.3],tick_label=[’off’,’roa’,’res’,’sta’] );plt.pause(0.0001)plt.bar(height=loc[merc[2]], left=[1.6,2.6,3.6,4.6],tick_label=[’off’,’roa’,’res’,’sta’] );plt.pause(0.001)

13.3.4 読み込んだ objectの保存

fulldf.to_pickle(’full_pos’)# to_pickeは高速保存を行う。qq=pd.read_pickle(’full_pos’)# to_pickeで保存された objectを読み取る

Pythonによる loopは実数や整数ばかりでなく、文字列も使えるので、応用範囲が広い。

62

Page 63: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

13.4 カテゴリー別、性別の売り上げ集計以前にもちいた、pivottableを用う。

q=pd.pivot_table(data=cupmen,values=’値段’,columns=[’製品コード’], index=’購入者性別フラグ’, aggfunc="sum")type(q) # pivot table の結果は DataFrameに収納第一行目と第二行目の比率(製品別別男女比率を求める。

13.4.1 なにと一緒に購入するか。

# 菓子等fulldf[’kashi’]=1*((fulldf.分類コード>191000) &(fulldf.分類コード<200000))qkashi=pd.pivot_table(data=fulldf,values=’購入者性別フラグ’, index=[’レシート番号’], columns=[’kashi’], aggfunc="count")sum(qkashi[1]>0)/len(qkashi[1])#ラーメン購入のうち、菓子類をかっていくのは 15%以上fulldf[’tabako’]=1*(fulldf.分類コード==681001)qtabako=pd.pivot_table(data=fulldf,values=’購入者性別フラグ’, index=[’レシート番号’], columns=[’tabako’], aggfunc="count")print( sum(qtabako[1]>0)/len(qtabako[1]))

男性と女性で分割してみよう。さらにコンビニの立地

qtabako=pd.pivot_table(data=fulldf,values=’値段’, index=[’レシート番号’], columns=[’tabako’,’購入者性別フラグ’], ¥fill_value = 0,aggfunc="count")# nanを 0で埋める。print( sum(qtabako[1]>0)/len(qtabako[1]))sum(qtabako[1][2]>0)/(sum(qtabako[0][2]>0)+sum(qtabako[1][2]>0))

0.15716777282251174sum(qtabako[1][1]>0)/(sum(qtabako[0][1]>0)+sum(qtabako[1][1]>0))

0.16368422609364369

13.5 立地による同時購入品目の差立地 で駅前、オフィス街、住宅地、郊外幹線道路の4分類で分析。データベースではオフィス街1、オフィス街2と店番号と立地が一緒に記入されているので、最初の一文字だけを取り出し、新しく newlocという列をつくり、そこに収める。

a=np.unique(fdf.店舗立地)print(a)aindex=fdf.indexritti=fdf.店舗立地newloc=pd.Series(index=fdf.index)#空っぽの系列を作成for i in aindex:

temp=ritti[i]temp=temp[0] # Pythonでは indexは 0から開始 (これは重要)なので、最初の1文字を

取り出す。newloc[i]=temp

fdf[’newloc’]=newloc

63

Page 64: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

13.5.1 立地別売り上げ比較

#立地分析q=pd.pivot_table(data=fdf,values=’値段’, index=[’レシート番号’], columns=[’newloc’], fill_value = 0,aggfunc="count")q=q>0# 複数購入も一件とみなすqsum=q.sum()

plt.bar(height=qsum, left=np.arange(1,5),tick_label=[’off’,’roa’,’res’,’sta’] );plt.pause(0.01)

13.5.2 同時購入項目

行数が立地の種類、列数が同時購入品目の種類と同じDataFrameを作る。

loc=pd.DataFrame(index=np.unique(newloc),columns=[’tabako’,’kashi’,’sake’])#たばこ 681 【たばこ・喫煙関連用品】681001 たばこfdf[’tabako’]=1*(fdf.分類コード==681001)fdf[’kashi’]=1*((fdf.分類コード>191000) &(fdf.分類コード<200000))fdf[’sake’]=1*((fdf.分類コード>211000) &(fdf.分類コード<=223003))

for j in [’tabako’,’kashi’,’sake’]:

q=pd.pivot_table(data=fdf,values=’値段’, index=[’レシート番号’], columns=[’newloc’,j], \fill_value = 0,aggfunc="count")

q=(q>0)# 煙草(菓子、酒)の購入の有無でカップ麺の購入者を分類。print(j)for k in [’オ’,’ロ’,’住’,’駅’]:

tcount=q[k]#n行 2列tsum=tcount.sum()print(k)print( tsum[1]/( tsum[1]+tsum[0]))loc[j][k]=tsum[1]/( tsum[1]+tsum[0])#j列の k行に代入

print(loc)merc=[’tabako’,’kashi’,’sake’]

plt.bar(height=loc[merc[0]], left=[1,2,3,4], \tick_label=[’off’,’roa’,’res’,’sta’] );plt.pause(0.001)plt.bar(height=loc[merc[1]], left=[1.3,2.3,3.3,4.3], \tick_label=[’off’,’roa’,’res’,’sta’] );plt.pause(0.0001)plt.bar(height=loc[merc[2]], left=[1.6,2.6,3.6,4.6], \tick_label=[’off’,’roa’,’res’,’sta’] );plt.pause(0.001)

14 PythonからRを使う方法 (上級編)

PypeRというmoduleを用いるのが最も一般的だが、Windwos PCではインストールに手間がかかる。

1. windowsのコントロールパネルで次のように pythonに pathを設定する。ただし、versionなどは適宜変更する。

system->詳細設定->環境変数->path->新規C:\WinPython-64\scripts

64

Page 65: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

C:\WinPython-64C:\Program Files\R\R-3.3.2\bin  

次を参考にする。//mimumimu.net/blog/2014/05/09/windows-%E3%81%A7-easy_install-%E3%81%A8-pip///www.pythonweb.jp/install/setup/index1.html

2. https://bootstrap.pypa.io/ez_setup.pyをダウンロードし、右クリックで実行。もしくは command prompt (DOS窓)の中で python ez_setup.pyを実行。

3. command prompt (DOS窓)の中で easy_install pip

4. command prompt (DOS窓)の中で pip install pyperを実行

5. pythonを起動

いかが、データをRにわたし、Rコマンドを使って計算を行い、その結果を Pythonで受け取る手順の Python コード

import pyperr = pyper.R(use_pandas=’True’)xx=[1,2,3,4,5,6]r.assign("x",xx)#データ xxを xとして Rにわたすには、r.assign()を用いるr("y<-x*100")r("y<-matrix(y,3,2)")r("source(file=’scatter.R’)")# Rスクリプトである scatter.Rを実行r.get("y")array([100, 200, 300, 400, 500])

15 ネットからの金融情報のダウンロード (教科書 p.160の情報は古く、若干の変更あり)

yahooからのダウンロードが不調なので、google financeから download.Yahooは adjusted closeがあるので、便利なのであるが。

15.1 Yahoo、google financeからダウンロードimport pandas as pdfrom pandas import DataFrame, Seriesimport pandas_datareader as webibm=web.get_data_google(’IBM’,’1/1/2016’,’1/1/2017’)goog=web.get_data_google(’GOOG’,’1/1/2016’,’1/1/2017’)ibm.head()gc=goog[’Close’]ic=ibm[’Close’]

ir=ic.pct_change()# 変化率の導出gr=gc.pct_change()a=pd.DataFrame( index=ic.index)#  indexだけの空の DataFrameを作る。a[’ibm’]=ir# 列を追加  a.ibmで列は追加されない。a[’goog’]=gra.head()a.corr() #

ibm google

65

Page 66: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

ibm 1.000000 0.339863google 0.339863 1.000000入手可能なデータRemote Data AccessYahoo! FinanceGoogle FinanceEnigmaFREDFama/FrenchWorld BankOECDEurostatEDGAR IndexTSP Fund DataOanda currency historical rateNasdaq Trader Symbol Definitions

15.1.1 データのダウンロードと結合

import pandas as pdfrom pandas import DataFrame, Seriesimport pandas_datareader as web

#  indexや columnで結合するときは concatがよい。defaultは縦。axis=1で横。# defaultでは outerで結合するので、欠損値が発生し、nanで表示。# 別の DataFrameの同じ columns名が結合後でも保持されるので、後で訂正する必要がある。

#import pandas as pdfrom pandas import DataFrame, Seriesimport pandas_datareader as webaapl=web.get_data_google(’AAPL’,’1/1/2011’,’1/1/2017’)msft=web.get_data_google(’MSFT’,’1/1/2011’,’1/1/2017’)xom=web.get_data_google(’XOM’,’1/1/2011’,’1/1/2017’)px=pd.concat([aapl.Close,msft.Close,xom.Close],axis=1)px.columns=[’aapl’,’msft’,’xom’]vol=pd.concat([aapl.Volume,msft.Volume,xom.Volume],axis=1)vol.columns=[’aapl’,’msft’,’xom’]px.aapl.plot()import matplotlib.pyplot as pltplt.show()#これを入力しないと描画しない。#plotを消さないと次へ進めない。px.ix[’2011’].plot() #2011年のデータだけを plotplt.show()px.ix[’2011-04’:’2012-04’].plot() #2011年のデータだけを plotplt.show()

15.2 resample

pxm=px.resample(’M’).mean()’# 月次データに変換する px.resample(’M’)は使わない。pxm.plot()plt.show()pxjan=px.ix[’2011-1’]q=pxjan.resample(’D’).mean()#欠損値発生

66

Page 67: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

15.3 World Bank

世界銀行で各国のデータをダウンロードできる。国は ISO 3166-1による 3文字か 2文字。日本は JPか JPN。https://en.wikipedia.org/wiki/ISO_3166-1

indicatorは世界銀行のサイト http://data.worldbank.org/indicator にある。次のようなシステムをとている。For example: DT.DIS.PRVT.CD would read ”External debt disburse-ments by private creditors in current US dollars

Topic (2 digits)General Subject (3 digits)Specific Subject (4 digits)Extensions (2 digits each)

サイトのアドレス自体が codeになっている。downloadした excelに表示があるhttp://data.worldbank.org/indicator/SL.UEM.TOTL.MA.ZS

from pandas_datareader import wbf = wb.download(indicator=’SP.POP.TOTL’, country=[’JP’, ’US’], start=1960, end=2014)>>> f.shape(110, 1

multiindexなので大変使いにくい。まず、国ごとに別の列に分ける。次に

a=f.unstack(level=0) # indexの最初のレベルごとに別の列にするa.columns=[’JP,’US’]

67

Page 68: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

16 地図情報の読み込み

16.1 shapefile

地図情報は拡張子.shpのついた shapefileというフォーマットが手中。これを扱う moduleはanacondaにもWinPythonにもないので、shapefile.py を downloadし、python本体の下の Libフォルダに配置、python起動後、

import shapefile

と importする

16.1.1 Basemap

地図情報とその編集機能をもつライブラリーだが、PCへの負担は大きい。インストールにはwindowsのシステムツールのコマンドプロンプト (通称DOS窓)を開いて

conda install -c conda-forge basemap=1.0.8.dev0

Anacondaではインストール成功したが、WinPythonでは、WinPythonの中の comman.com(通称DOS窓) を開いて、

16.2 参考:Rでの shapefileの描画Shapefileは PythonよりもRのほうが容易に処理できる。

library(maptools)library(RColorBrewer) # 統計グラフで使える便利なカラーパレット

# 経度と緯度を設定するxlim <- c(128, 146)ylim <- c(30, 46)

# まずはシンプルに JPN_adm1.shp を表示してみるpng("image.png", width = 480, height = 480, pointsize = 12, bg = "white", res = NA)jpn <- readShapePoly("JPN_adm1.shp")plot(jpn, xlim=xlim, ylim=ylim)dev.off() #ここで初めて pngに出力

17 金融データの入手pandasは金融データをいきなり入手可能である。従来使われていた pandas.ioは削除(remove)され、 pandas datareaderモジュール を インストール

import実行時は、pandas-datareader(ハイフン)ではなく、pandas datareader(アンダースコア) になる

17.1 インストールWinPythonにはすでに含まれているので installの必要はない。IDLEXエディタ起動後、import pandas-datareader as wbを実行

Anacondaには含まれていない(ような)ので、次のようにして installする。DOS窓から

conda install pandas-datareader

を実行し、pandas-datareaderを install

68

Page 69: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

17.2 実行Pythonを起動し、

import pandas_datareader.data as webimport datetime as dt

start = dt.datetime(2010,1,1)end = dt.datetime(2015,4,1)

f = web.DataReader("F", ’yahoo’, start, end)

import typesprint(type(f))

<class ’pandas.core.frame.DataFrame’>

print(f.columns)Index([’Open’, ’High’, ’Low’, ’Close’, ’Volume’, ’Adj Close’], dtype=’object’)

print(f.ix[’2010-01-04’])Open 10.170000High 10.280000Low 10.050000Close 10.280000Volume 60855800.000000Adj Close 8.852526Name: 2010-01-04 00:00:00, dtype: float64

17.2.1 利用可能データの種類

https://pandas-datareader.readthedocs.io/en/latest/Remote Data AccessYahoo! FinanceGoogle FinanceEnigmaFREDFama/FrenchWorld BankOECDEurostatEDGAR IndexTSP Fund DataOanda currency historical rateNasdaq Trader Symbol Definitions

69

Page 70: Pythonによるデータ分析入門 - FC2mcobaya.web.fc2.com/advanced/Python-pd-basic.pdf · 2017. 12. 3. · Pythonによるデータ分析入門 December 3, 2017 1 入手とインストール

18 機械学習教科書:Sebastian Raschka著、福島真太朗監訳『Python機械学習プログラミング』インプレス社この教科書のコードは

https://github.com/rasbt/python-machine-learning-book/tree/master/code

にあり、ダウンロードできる。

18.1 第3章18.1.1 graphbiz

https://graphviz.gitlab.io/_pages/Download/Download_windows.html

から graphviz-2.38.zipをダウンロードし、適当なところに解凍する。(p.85)WinPython Command Prompt.exeを起動し、そこから release\binというフォルダーに移

動し、dot.exeが存在することを確認し、dot -Tpng tree.dot -o tree.pngを実行する。

18.1.2 第三章の実行

IDLEXの editorを起動し、file/openを選択し、ファイル名に

https://mcobaya.web.fc2.com/advanced/chap3.py

を入れる。すると第三章のコードがダウンロードされる。

70