#!/usr/bin/env python # coding: utf-8 # # 総合実験(1日目) # ## Jupyter Notebook を使った基本統計量の計算と可視化 # ### Jupyter Notebook (IPython Notebook) とは # * Python という名のプログラミング言語が使えるプログラミング環境。計算コードと計算結果を同じ場所に時系列で保存できるので、実験系における実験ノートのように、いつどんな処理を行って何を得たのか記録して再現するのに便利。 # * [当学の演習室での使い方](https://raw.githubusercontent.com/maskot1977/-/master/%E6%BC%94%E7%BF%92%E5%AE%A4.txt) # * [個人PCでのインストールと始め方](http://www.task-notes.com/entry/20151129/1448794509) # * [小寺研究室](https://github.com/maskot1977/-/blob/master/L1%E3%82%BC%E3%83%9F2015%E5%B0%8F%E5%AF%BA%E7%A0%94%E7%A9%B6%E5%AE%A4.pptx.pdf) では、MacOSX上で右記のようにセットアップしています。> [環境構築](https://sites.google.com/site/masaakikotera/8-python/8-1-huan-jing-gou-zhu) # ### まずは、意味が分からなくてもいいので使ってみましょう # * Python にまだ慣れてない人は、[Pythonウォーミングアップ](http://nbviewer.jupyter.org/github/maskot1977/ipython_notebook/blob/master/Python%E3%82%A6%E3%82%A9%E3%83%BC%E3%83%9F%E3%83%B3%E3%82%AF%E3%82%99%E3%82%A2%E3%83%83%E3%83%95%E3%82%9A.ipynb) に進んでください。 # # ### 本実習スタート # * 本実習ではまず、下のプログラムを順次実行してもらいます。各自の画面中の IPython Notebook のセルに順次入力して(コピペ可)、「Shift + Enter」してください。 # * 最後に、課題を解いてもらいます。課題の結果を、指定する方法で指定するメールアドレスまで送信してください。 # In[1]: # URL によるリソースへのアクセスを提供するライブラリをインポートする。 # import urllib # Python 2 の場合 import urllib.request # Python 3 の場合 # In[2]: # ウェブ上のリソースを指定する url = 'https://raw.githubusercontent.com/maskot1977/ipython_notebook/master/toydata/iris.txt' # In[3]: # 指定したURLからリソースをダウンロードし、名前をつける。 # urllib.urlretrieve(url, 'iris.txt') # Python 2 の場合 urllib.request.urlretrieve(url, 'iris.txt') # Python 3 の場合 # In[4]: # ダウンロードしたファイルの中身を確認する。 for line in open('iris.txt'): print (line) # In[5]: # ダウンロードしたファイルの中身を確認する(行番号付き) for i, line in enumerate(open('iris.txt')): print (i, line) if i > 5: break # In[6]: # ダウンロードしたファイルの中身を確認する(先頭行を無視して、空白でデータ区切りをする) for i, line in enumerate(open('iris.txt')): if i == 0: continue else: a = line.split() print (a) if i > 5: break # In[7]: # ダウンロードしたファイルから、指定した列の数字をリストに入れる。 x1 = [] for i, line in enumerate(open('iris.txt')): if i == 0: continue else: a = line.split() x1.append(float(a[1])) # In[8]: # リスト x1 の中身を確認する。 print (x1) # In[9]: # ダウンロードしたファイルから、4つの列の数字をそれぞれ4つのリストに入れる。 x1 = [] x2 = [] x3 = [] x4 = [] for i, line in enumerate(open('iris.txt')): if i == 0: continue else: a = line.split() x1.append(float(a[1])) x2.append(float(a[2])) x3.append(float(a[3])) x4.append(float(a[4])) # In[10]: # リスト x1 の中身を確認する。 print (x1) # In[11]: # リスト x2 の中身を確認する。 print (x2) # In[12]: # リスト x3 の中身を確認する。 print (x3) # In[13]: # リスト x4 の中身を確認する。 print (x4) # ### 平均値を求める関数を作る # * 同じ計算を繰り返すために、何度も同じプログラムを書くのは面倒です。関数を定義して、使いまわしましょう。 # In[14]: # 平均値を求める関数 def average(data): sum = 0.0 n = 0.0 for x in data: sum += x n += 1.0 return sum / n # In[15]: # リスト x1 の平均値を求める。 average(x1) # In[16]: # すべてのリストの平均値をそれぞれ求める。 print (average(x1)) print (average(x2)) print (average(x3)) print (average(x4)) # ### 分散を求める関数を作る # * 同じ計算を繰り返すために、何度も同じプログラムを書くのは面倒です。関数を定義して、使いまわしましょう。 # * 分散とは何か?標準偏差とは何か?忘れてしまった人は右記を参照。 http://www.cybernet.co.jp/cetol/kousa/kousa7.html # In[17]: # 分散を求める関数 def variance(data): ave = average(data) accum = 0.0 n = 0.0 for x in data: accum += (x - ave) ** 2.0 n += 1.0 return accum / n # In[18]: # すべてのリストの分散をそれぞれ求める。 print (variance(x1)) print (variance(x2)) print (variance(x3)) print (variance(x4)) # ### 標準偏差を求める関数を作る # * 同じ計算を繰り返すために、何度も同じプログラムを書くのは面倒です。関数を定義して、使いまわしましょう。 # * 分散とは何か?標準偏差とは何か?忘れてしまった人は右記を参照。 http://www.cybernet.co.jp/cetol/kousa/kousa7.html # * 1行で書ける関数は、上の「平均を求める関数」や「分散を求める関数」のような定義もできますが、下の例のように lambda というキーワードを使って関数を定義することができます。 # * 「import math」は、平方根(sqrt)などの数学関数を使うためのライブラリをインポートするために唱えます。 # In[19]: # 標準偏差を求める関数 import math standard_deviation = lambda data: math.sqrt(variance(data)) # In[20]: # すべてのリストの標準偏差をそれぞれ求める。 print (standard_deviation(x1)) print (standard_deviation(x2)) print (standard_deviation(x3)) print (standard_deviation(x4)) # ### 共分散を求める関数を作る # * 同じ計算を繰り返すために、何度も同じプログラムを書くのは面倒です。関数を定義して、使いまわしましょう。 # * 共分散とは何か?相関係数とは何か?忘れてしまった人は右記を参照。 http://kogures.com/hitoshi/webtext/stat-soukan/index.html # In[1]: # 共分散(偏差積の平均)を求める関数 def covariance(data1, data2): ave1 = average(data1) ave2 = average(data2) accum = 0.0 n = 0.0 for d1, d2 in zip(data1, data2): accum += (d1 - ave1) * (d2 - ave2) n += 1.0 return accum / n # In[22]: # すべてのリスト対の共分散をそれぞれ求める。 print (covariance(x1, x2)) print (covariance(x1, x3)) print (covariance(x1, x4)) print (covariance(x2, x3)) print (covariance(x2, x4)) print (covariance(x3, x4)) # ### 相関係数を求める関数を作る # * 同じ計算を繰り返すために、何度も同じプログラムを書くのは面倒です。関数を定義して、使いまわしましょう。 # * 共分散とは何か?相関係数とは何か?忘れてしまった人は右記を参照。 http://kogures.com/hitoshi/webtext/stat-soukan/index.html # * 1行で書ける関数は、上の「平均を求める関数」や「分散を求める関数」のような定義もできますが、下の例のように lambda というキーワードを使って関数を定義することができます。 # In[23]: # 相関係数を求める関数 correlation = lambda data1, data2: covariance(data1, data2) / (standard_deviation(data1) * standard_deviation(data2)) # In[24]: # すべてのリスト対の相関係数をそれぞれ求める。 print (correlation(x1, x2)) print (correlation(x1, x3)) print (correlation(x1, x4)) print (correlation(x2, x3)) print (correlation(x2, x4)) print (correlation(x3, x4)) # ### データを図示する # * 平均、分散、標準偏差、共分散、相関係数などの数字だけ見て満足せずに、データをヒストグラムで表したり、散布図にプロットしてデータの特徴を把握しましょう。 # In[25]: # 図やグラフを図示するためのライブラリをインポートする。 import matplotlib.pyplot as plt get_ipython().run_line_magic('matplotlib', 'inline') # __ヒストグラム__ # In[26]: # x1のヒストグラム plt.hist(x1, alpha=0.5) # In[27]: # x2のヒストグラム plt.hist(x2, alpha=0.5) # In[28]: # x3のヒストグラム plt.hist(x3, alpha=0.5) # In[29]: # x4のヒストグラム plt.hist(x4, alpha=0.5) # __散布図(scatter plot)__ # In[30]: # x1 と x2 の関係をプロットする。 plt.scatter(x1, x2, alpha=0.5) # In[31]: # x1 と x3 の関係をプロットする。 plt.scatter(x1, x3, alpha=0.5) # In[32]: # x1 と x4 の関係をプロットする。 plt.scatter(x1, x4, alpha=0.5) # In[33]: # x2 と x3 の関係をプロットする。 plt.scatter(x2, x3, alpha=0.5) # In[34]: # x2 と x4 の関係をプロットする。 plt.scatter(x2, x4, alpha=0.5) # In[35]: # x3 と x4 の関係をプロットする。 plt.scatter(x3, x4, alpha=0.5) # ### Scatter Matrix # * データの全体像を眺めたいと思った時、こういう方法も便利です。本日の実習では「こんな方法もあるんだな」と知っておく程度で十分です。 # In[36]: # 図やグラフを図示するためのライブラリをインポートする。 import matplotlib.pyplot as plt get_ipython().run_line_magic('matplotlib', 'inline') import pandas # データフレームワーク処理のライブラリをインポート from pandas.tools import plotting # 高度なプロットを行うツールのインポート df = pandas.read_csv('iris.txt', sep='\t', na_values=".") # データの読み込み plotting.scatter_matrix(df[['Sepal.Length', 'Sepal.Width', 'Petal.Length', 'Petal.Width']], figsize=(10, 10)) #データのプロット plt.show() # ------- # # 課題 # 新しいノートを開いて、以下の課題を解いてください。 # * __課題1__:下記URLからデータをダウンロードしてください。 # # * https://raw.githubusercontent.com/maskot1977/ipython_notebook/master/toydata/anscombe.txt # * __課題2__: x1, x2, x3, x4, y1, y2, y3, y4 の平均値をそれぞれ求めてください。 # * __課題3__: x1, x2, x3, x4, y1, y2, y3, y4 の分散をそれぞれ求めてください。 # * __課題4__: x1, x2, x3, x4, y1, y2, y3, y4 の標準偏差をそれぞれ求めてください。 # * __課題5__: x1とy1の共分散、x2とy2の共分散、x3とy3の共分散、x4とy4の共分散をそれぞれ求めてください。 # * __課題6__: x1とy1の相関係数、x2とy2の相関係数、x3とy3の相関係数、x4とy4の相関係数をそれぞれ求めてください。 # * __課題7__: x1とy1の関係、x2とy2の関係、x3とy3の関係、x4とy4の関係をそれぞれ散布図としてプロットしてください。 # * __課題8__:以上の結果をふまえ、平均値・標準偏差・相関係数とデータの分布の形について考察してください。また、計算結果を [自分の氏名].ipynb ファイルとして保存し、指定したアドレスまでメールしてください。メールタイトルは「総合実験1日目」とし、メール本文に学籍番号と氏名を明記のこと。 # In[ ]: # お疲れ様でした。もし時間が余ったら、[総合実験2日目](http://nbviewer.jupyter.org/github/maskot1977/ipython_notebook/blob/master/%E7%B7%8F%E5%90%88%E5%AE%9F%E9%A8%93%EF%BC%92%E6%97%A5%E7%9B%AE.ipynb)に進んでもらって結構です。