pandasを利用して、ご多分に漏れずイギリスの統計学者フィッシャーが利用したとされるあやめ(iris)データの基本的な統計データを出力してみます。
以下のリンクのCSVデータ(iris.csv)を利用しました。
https://raw.github.com/pydata/pandas/master/pandas/tests/data/iris.csv
あやめの種類はsetosa(セトナ)、versicolor(バーシクル)、virginica(バージニカ)の3種類。sepalはがく片、petalは花びらでそれぞれの長さと幅が記載されています。
スポンサーリンク
開発環境
Mac(OS X EL Captin/10.11.3)
Python 3.5.1 :: Anaconda 2.5.0 (x86_64)
jupyter 4.0.6
pandas 0.18.0
numpy 1.10.4
まずはiris.csvを読み込みデータフレームを作成します。
1 2 3 4 5 6 7 8 9 10 11 |
import numpy as np import pandas as pd iris = pd.read_csv("iris.csv") #iris = pd.read_csv("iris.data",header=None,names=['SepalLength', 'SepalWidth', 'PetalLength', 'PetalWidth', 'Name']) #データフレーム df = pd.DataFrame(iris) #df = pd.DataFrame(iris, columns = ['SepalLength', 'SepalWidth', 'PetalLength', 'PetalWidth', 'Name']) df[0:10] |
結果(10行のみ表示)
SepalLength | SepalWidth | PetalLength | PetalWidth | Name | |
---|---|---|---|---|---|
0 | 5.1 | 3.5 | 1.4 | 0.2 | Iris-setosa |
1 | 4.9 | 3.0 | 1.4 | 0.2 | Iris-setosa |
2 | 4.7 | 3.2 | 1.3 | 0.2 | Iris-setosa |
3 | 4.6 | 3.1 | 1.5 | 0.2 | Iris-setosa |
4 | 5.0 | 3.6 | 1.4 | 0.2 | Iris-setosa |
5 | 5.4 | 3.9 | 1.7 | 0.4 | Iris-setosa |
6 | 4.6 | 3.4 | 1.4 | 0.3 | Iris-setosa |
7 | 5.0 | 3.4 | 1.5 | 0.2 | Iris-setosa |
8 | 4.4 | 2.9 | 1.4 | 0.2 | Iris-setosa |
9 | 4.9 | 3.1 | 1.5 | 0.1 | Iris-setosa |
iris.cvは1行目に「SepalLength」や「Name」などのヘッダが含まれていますが、もし以下のリンクにあるようなヘッダのないデータの場合は、5行目のようにnamesパラメータでヘッダを付加することができます。
https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data
9行目
ヘッダの列名をcolumnsパラメータで変更することができます。
SepalLengthが7.3よりも大きいデータを表示させます。
1 |
df[df.SepalLength > 7.3] |
結果
SepalLength | SepalWidth | PetalLength | PetalWidth | Name | |
---|---|---|---|---|---|
105 | 7.6 | 3.0 | 6.6 | 2.1 | Iris-virginica |
117 | 7.7 | 3.8 | 6.7 | 2.2 | Iris-virginica |
118 | 7.7 | 2.6 | 6.9 | 2.3 | Iris-virginica |
122 | 7.7 | 2.8 | 6.7 | 2.0 | Iris-virginica |
130 | 7.4 | 2.8 | 6.1 | 1.9 | Iris-virginica |
131 | 7.9 | 3.8 | 6.4 | 2.0 | Iris-virginica |
135 | 7.7 | 3.0 | 6.1 | 2.3 | Iris-virginica |
ピボットテーブルを作成します。
1 |
pd.pivot_table(iris, values=['SepalLength', 'SepalWidth', 'PetalLength', 'PetalWidth'], columns="Name", aggfunc=np.sum) |
結果
Name | Iris-setosa | Iris-versicolor | Iris-virginica |
---|---|---|---|
PetalLength | 73.2 | 213.0 | 277.6 |
PetalWidth | 12.2 | 66.3 | 101.3 |
SepalLength | 250.3 | 296.8 | 329.4 |
SepalWidth | 170.9 | 138.5 | 148.7 |
aggfuncパラメータで統計量を指定しています。上記では合計を表示させています。
setosa(セトナ)のデータを抜き出して、平均(mean)や標準偏差(std)などの要約統計量を表示させます。
1 2 |
setosa = df[df['Name']=='Iris-setosa'] setosa.describe() |
結果
SepalLength | SepalWidth | PetalLength | PetalWidth | |
---|---|---|---|---|
count | 50.00000 | 50.000000 | 50.000000 | 50.00000 |
mean | 5.00600 | 3.418000 | 1.464000 | 0.24400 |
std | 0.35249 | 0.381024 | 0.173511 | 0.10721 |
min | 4.30000 | 2.300000 | 1.000000 | 0.10000 |
25% | 4.80000 | 3.125000 | 1.400000 | 0.20000 |
50% | 5.00000 | 3.400000 | 1.500000 | 0.20000 |
75% | 5.20000 | 3.675000 | 1.575000 | 0.30000 |
max | 5.80000 | 4.400000 | 1.900000 | 0.60000 |
その他の統計基本量は以下のように取得できます。
1 2 3 4 5 6 7 8 9 10 11 |
setosa.sum() #合計 setosa.mean() #平均 setosa.median() #中央値 setosa.skew() #歪度 setosa.kurt() #尖度 setosa.min() #最小値 setosa.max() #最大値 setosa.corr() #相関係数 setosa.cov() #分散 setosa.std() #標準偏差 setosa.cov() #共分散 |
追記
scikit-learnライブラリのサンプルデータセットでもIrisデータを取得できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
import numpy as np import pandas as pd from sklearn import datasets #Irisデータを読み込む iris = datasets.load_iris() #データフレームの作成(columsパラメータに各特徴量の名前を設定) df = pd.DataFrame(iris.data, columns=iris.feature_names) #df = pd.DataFrame(iris.data, columns = ['SepalLength', 'SepalWidth', 'PetalLength', 'PetalWidth']) #「Name」を追加 df["Name"] = pd.Series(iris.target) #Nameにirisの種別名を適用していく df["Name"] = df["Name"].apply(lambda x: iris.target_names[x]) df[0:3] |
結果
sepal length (cm) | sepal width (cm) | petal length (cm) | petal width (cm) | Name | |
---|---|---|---|---|---|
0 | 5.1 | 3.5 | 1.4 | 0.2 | setosa |
1 | 4.9 | 3.0 | 1.4 | 0.2 | setosa |
2 | 4.7 | 3.2 | 1.3 | 0.2 | setosa |
参照文献・ページ
第4章 Pythonによる機械学習 早川敦士
Capter2 Data loading and preprocessing with pandas
biostatistics
pandas 0.18.0 documentation