Python Notes

Python関連で残しておきたいことをメモしています。

自分のように本格的なプログラマーではないけど同じような目的(心理学実験・解析等)でPythonを学習している方のご参考になれば。。。

解説や資料等ではなく,主にWebリンクや自分の感想などをただただ貼り付けています。

ご意見やご感想,アドバイス等ございましたら最下部のコメント欄にぜひご記入ください。

[このWebページ上での公開資料のリンクは最下部に]

開発環境

Rodeo

Jupyter (ipython)

開発元ページ[https://jupyter.org/]

[memo]

・anacondaを入れておいた方がスムーズ。すでにPythonをいれている,または他のバージョンのPythonも使いたい場合などは「Preference」または「Settings」から"Python command"に使用したいPythonのディレクトリを指定。

とりあえずお決まりコード ※あくまで個人用

*** よく使うモジュールのインポート (先頭はjupyter notebookで図を表示されるおまじない) ***

%matplotlib inline

import numpy as np

import pandas as pd

import scipy.stats as st

import matplotlib.pyplot as plt

import seaborn as sns

import statsmodels.formula.api as smf

import statsmodels.api as sm

*** ディレクトリを取得して任意のデータファイルを読み込み(****にフォルダやファイル名) ***

import os

cur_dir = os.getcwd()

main_dir = os.path.split(cur_dir)[0]

[memo]

・インストールは pip install "ipython[notebook]" でもいいが,anacondaを入れれば最初から入っているのでそっちが便利かも。

・notebook内にそのまま図を出力した時は“%matplotlib inline”と書いておく必要がある。

・「Jupyter Notebook の Tips をまとめてみた」リンク

Anaconda

dat_file = os.sep.join([main_dir, 'data','******', '*****.csv'])

dat = pd.read_csv(dat_file)

開発元ページ[https://www.continuum.io/why-anaconda]

データ解析

*** 入出力まわり(上記と一部重複,日本語表記部は変更箇所) ***

csv関連

import pandas as pd

[データフレーム].to_csv('ファイルパス.csv')

pd.read_csv('ファイルパス.csv')

matlabファイル関連

from scipy import io

io.loadmat('ファイルパス.mat', squeeze_me=True)

io.savemat('ファイルパス.mat', {'変数名':データ})

#MATファイルの構造体メンバーを取り出したいとき(例:data.matの構造体Aにa,b,cがある場合)-----

matd = io.loadmat('ファイルパス.mat', squeeze_me=True)

a = matd['A']['a']

aからさらに内容をとりだしたいときはa.item()

pandas使ってデータフレームにするときは,a = pd.DataFrame(matd['A']['a'].item())でできる

※io.loadmatでsqueeze_me=Trueを指定しない場合:

matd = io.loadmat('ファイルパス.mat')

A = matd['A']

a = A[0,0]['a'] ※aの内容は上のa.item()と同じ

pyplotの関連

plt.savefig('ファイルパス.png')

plt.close()

Pickle関連

import pickle

with open('ファイルパス.pkl', 'wb') as web:

pickle.dump(データ, web)

pickle.load(open('ファイルパス.pkl', 'rb'))

*** pandasの関数で基本情報をサクッと ***

dat.head()

dat.describe()

dat.corr()

*** 意外と使うpandasのデータフレーム変換 ***

# dat(pandasのデータフレーム)を1列に変換:violinplotなどを書いたり,縦断データとして整理したいときに使う

# datの例

ID SEX V1 V2

0 F 10 6

1 M 5 8

2 F 3 9

(http://www.statsmodels.org/stable/index.html)

Rユーザーにとってはかなり使用感が似ていて使いやすいツール。

出力も見やすく基本的な解析であればこれが良いと思われる。GLMM等も特に別のものを必要とせず実施できる。

→New comment

Updateも随時行われており,基本的(よく見かけるような)な解析方法だけでなく最近流行りの解析やマニアックな方法など多くの解析がこれだけでできるようになってきた。

〔メモ〕

・Rっぽいモデル記述が良ければstatsmodels.apiではなく,statsmodels.formula.apiを使用する。

・Rと違いバイアス項が自動で入らないので,statsmodels.add_constant()関数を使って説明変数にバイアス項を追加する

Rとの連携

Web meetingで一緒に勉強させていただいている山根嵩史さん(HPはコチラ)が公開されている内容です。

Pythonを使った実験課題ソフトのひとつであるPsychopyにRを入れて実験課題と解析の一元化できる方法。

http://tyamane1969.net/?p=136

Rとの比較についてはコチラが分かりやすいです。

〔その他Blogで公開されている情報〕

https://gist.github.com/mia-0032/6378324

http://imaimamu.com/archives/1574

fMRIデータ解析

1.SPM/FSLとの連携

脳画像解析をするためのソフトウェアであるSPMやFSLをPythonから使いたい。。。と思って入手したnipypeというパッケージ。

mdat = pd.melt(dat, id_vars=['ID', 'SEX']) #id_varsは1列に取り込まない列ラベル

>>

ID SEX variable value

0 F V1 10

0 F V2 6

1 M V1 5

1 M V2 8

2 F V1 3

2 F V2 9

# 列ラベルを割り振り

mdat.columns = ['ID', 'SEX', 'times', 'score']

>>

ID SEX times score

0 F V1 10

0 F V2 6

1 M V1 5

1 M V2 8

2 F V1 3

2 F V2 9

開発元ページ[http://nipype.readthedocs.io/en/latest/#]

[memo]

・Windowsにインストールする際にはC++のコンパイラを忘れずに。

http://landinghub.visualstudio.com/visual-cpp-build-tools

・Github上にあるnipypeのspmインターフェイスを扱うスクリプト: https://github.com/nipy/nipype/tree/cf2d09314b9c388ed6bd38b271cc2b8c77e69b10/nipype/interfaces/spm

2.画像データ処理・scikit-learnとの連携

Nilearnは,fMRI画像を行列形式で読み込み,結合の計算やクラスタリング,機械学習(scikit-laarnが必要)など,数値的な計算処理がとてもやりやすいパッケージ。グラフィカルデザインもいくつかあり色々な方法で画像を表示したり,解析結果などを使って新しい画像に変換しなおしたりすることが簡単にできる。numpy配列でデータを読み込むので,scikit-learn等の他のPythonパッケージにそのまま持ち込んで適用することもできるのがかなり魅力的。

※ページ下部「Nilearnを使ったfMRIデータ処理…」参照

*** データの次元が多いときなど表示する列数を指定 (今回は50列まで) ***

pd.set_option('display.max_columns', 50)

*** figureのサイズ ***

plt.rcParams['figure.figsize'] = 8,6

*** Statsmodels.apiを使用した回帰 ***

Y = df['Y']

X = df['X']

X0 = sm.add_constant(X)

st_model = sm.OLS(Y, X0)

results = st_model.fit()

print(results.summary2())

*** warningを表示させない ***

import warnings

warnings.filterwarnings("ignore")

開発元ページ[http://nilearn.github.io/index.html]

[memo]

・画像ファイル(.nii)は4D形式に変換してから読み込む方が相性が良いようです。

・二人以上の被験者の場合は[masker].transform([filenames])だけではえらーになるので,データ格納用のリストを作っておき,for文で一人ずつappendしていく([ ]は任意の変数)

例:

#4D形式にしたniiデータを被験者分入れたフォルダを指定してファイル名を取得

import nilearn, os, glob

path = './data/*.nii'

fmri_filenames = []

fmri_filenames = glob.glob(path)

#niiファイルから任意のROIごとにデータを抽出するためのインスタンスを作成

from nilearn.input_data import NiftiLabelsMasker

atlas_filename = './ROI_Atlas.nii'

masker = NiftiLabelsMasker(labels_img=atlas_filename, standardize=True)

#被験者のファイルを1名ずつ順に読み込んでリストに追加

fmri_masked_data =[]

for fn in fmri_filenames:

data = masker.fit_transform(fn) #timepoints x regions

fmri_masked_data.append(data) #subj x [timepoints x regions]

汎用ライブラリ関係

[Webで公開されている色んなライブラリの関数cheat sheets]

Original page:

https://www.continuum.io/blog/developer-blog/learning-python-data-science-cheat-sheets

** Numpy **

** Pandas **

** Scikit-Learn **

** Matplotlib **

** Seabornhttps://seaborn.pydata.org/) **

上のcheat sheetにもあげたmatplotlibをベースにしたライブラリ。

きれいな図が結構簡単に描けるので重宝している。

pandasなどで作成したデータセットをそのまま使えるのもうれしい。

[関連リンク]

簡単に美しいグラフ描画ができるPythonライブラリSeaborn入門

pythonで美しいグラフ描画 -seabornを使えばデータ分析と可視化が捗る

seabornの細かい見た目調整をあきらめない

その他

【Pythonを使うなら知っておくべき!便利なライブラリ13選】

http://programming-study.com/technology/python-library/

ベイズ統計関連

PyStan(https://pystan.readthedocs.io/en/latest/)

StanのPythonインターフェース

Rstanとの違いはコチラ

[関連リンク]

PyStanでMCMC入門

Python(PyStan)で「StanとRでベイズ統計モデリング」の5.1節を実行する

PyMC(https://pymc-devs.github.io/pymc/index.html)

ベイズ統計用のPythonライブラリ

最近(2017.04)下記の日本語本が出たので比較的扱いやすい

『Pythonで体験するベイズ推論 PyMCによるMCMC入門』(出版社リンク

[関連リンク]

PyMCがあれば,ベイズ推定でもう泣いたりなんかしない

アプリ開発

1.wxPython

色々ある中でもwxPythonは素人的には分かりやすく比較的楽にデスクトップGUIアプリを作成できる。

Windows/Mac/Unixで可能で,C++ライブラリのwxWidgetsのラッパとして機能。

チュートリアルやwikiも充実している。

※ページ下部「アプリ開発をしたくてwxPythonを使ってみた(チュートリアル編)」参照

開発元ページ[https://www.wxpython.org/]

2.Pyinstaller

アプリ開発のためというよりはpythonで作成した様々なスクリプトをexeファイルにコンパイルするツールです。exeファイルにしておくと,pythonや必要なパッケージが入っていないPCでもそれを動かすことができるようにんなります。

関連情報:Psychopyで作った実験課題をどのPCでもできるようしたい