sage/データ処理の基礎
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
[[FrontPage]]
#contents
2015/09/13からのアクセス回数 &counter;
ここで紹介したSageワークシートは、以下のURLからダウンロー...
http://www15191ue.sakura.ne.jp:8000/home/pub/64/
また、私の公開しているSageのサーバ(http://www15191ue.sak...
にユーザIDを作成することで、ダウンロードしたワークシートを
アップロードし、実行したり、変更していろいろ動きを試すこ...
** データ処理の基礎 [#ga5e24b5]
ここでは、pythonを使ってデータを取り扱う方法をまとめます。
使用するパッケージは、以下の3つです。
- ggplot: データのグラフ化パッケージ
- pandas: pythonでRのデータフレームと同様の処理をするパッ...
- numpy: pythonで数値を処理する基本パッケージ
sageへの入力:
#pre{{
# ggplotとpandas, numpyが使えるようにインポートする
from ggplot import *
import numpy as np
import pandas as pd
}}
** なぜExcelではなく、pythonを使うのか? [#wc59528b]
自然な流れとして、「なぜExcelではなく、pythonを使うのか」...
何でもできそうなExcelにも弱点があります。その大きなものは...
大量のデータを処理するには、Excelのカラム数では不十分なの...
** データの取り込み [#ua5db7db]
pandasパッケージでは、様々なタイプのデータを取り扱うこと...
- CSVファイル: カンマで区切られたファイルで最もよく使われ...
- Excelファイル: Microsoft Excelで作られたファイル
- データベース: データベース(MySQL)のテーブルやQuery結果
最初にCSVファイルを読み込む例を示します。読み込みファイル...
ネットワークで公開されているファイルの両方を指定すること...
CSVのファイル読み込みには、read_csv関数を使用します。この...
sageへの入力:
#pre{{
# 久保本の3章のデータをネットから取り込む
d = pd.read_csv('http://hosho.ees.hokudai.ac.jp/~kubo/sta...
type(d)
}}
#pre{{
<class 'pandas.core.frame.DataFrame'>
}}
*** データの素性を知る [#l66de607]
読み込んだデータがどのような物なのかその素性をしるために...
info関数では、dには100個のレコードが入っており、x, y, fの...
xが整数、yは実数、fにはオブジェクトが入っており、欠損値(...
sageへの入力:
#pre{{
# どのようなデータが入っているか調べる
d.info()
}}
#pre{{
<class 'pandas.core.frame.DataFrame'>
Int64Index: 100 entries, 0 to 99
Data columns (total 3 columns):
y 100 non-null int64
x 100 non-null float64
f 100 non-null object
dtypes: float64(1), int64(1), object(1)
memory usage: 3.1+ KB
}}
このデータは、「データ解析のための統計モデリング入門」か...
- \(y_i\): 個体iの種子数
- \(x_i\): 個体iのサイズ
- \(f_i\): 個体iが施肥処理ならT、肥料なしならC
describe関数では、各カラム毎に個数、平均、標準偏差、最小...
sageへの入力:
#pre{{
# データのばらつきを見る
d.describe()
}}
#pre{{
y x
count 100.000000 100.000000
mean 7.830000 10.089100
std 2.624881 1.008049
min 2.000000 7.190000
25% 6.000000 9.427500
50% 8.000000 10.155000
75% 10.000000 10.685000
max 15.000000 12.400000
}}
実際にdにどのような値が入っているか調べるには、最初のn個...
sageへの入力:
#pre{{
# 最初の3個を表示してみる、最後の5個の場合には、tail(5)。...
d.head(3)
}}
#pre{{
y x f
0 6 8.31 C
1 6 9.44 C
2 6 9.50 C
}}
*** 行とカラム(列)の操作 [#b189756e]
pandasのデータフレームから特定のカラムや行を取り出す方法...
カラムの指定方法は、2通りあります。
#pre{{
データフレーム.カラム名
データフレーム['カラム名']
}}
sageへの入力:
#pre{{
# カラム(列)を取り出す方法
print d.y.head()
print d['y'].head()
}}
#pre{{
0 6
1 6
2 6
3 12
4 10
Name: y, dtype: int64
0 6
1 6
2 6
3 12
4 10
Name: y, dtype: int64
}}
特定の行を取り出す場合には、ixを使って以下の様に指定しま...
#pre{{
データフレーム.ix[行番号]
}}
sageへの入力:
#pre{{
# 行を取り出す方法
print d.ix[0]
}}
#pre{{
y 6
x 8.31
f C
Name: 0, dtype: object
}}
** データの分布を知る [#d0cd4b72]
データを可視化して、データの分布をみてみましょう。データ...
ggplotは、Rのggplot2と同様の機能をpythonで使えるようにし...
ggplotでの図化は、ggplot関数に表示したい図を足し込んでい...
以下の例では、ggplotで、データフレームとx軸要素、y軸要素...
geom_point関数で散布図を指定し、print関数で表示すると図化...
sageへの入力:
#pre{{
# データの分布を知る
# ggplotに表示したいものを足していく(直感的な図化方法)
p = ggplot(d, aes(x='x', y='y'))
p += geom_point()
print(p)
}}
#pre{{
<ggplot: (8767854380393)>
}}
ggsave関数を使って表示された図をファイルに保存します。(s...
sageへの入力:
#pre{{
# ファイルに保存して、表示(ここでは、dpi=50を指定して縮...
ggsave('fig1.png', dpi=50)
}}
#pre{{
Saving 11.0 x 8.0 in image.
}}
&ref(fig1.png);
fのタイプ(C, T)別にグラフを分けて表示するのも、facet_wr...
sageへの入力:
#pre{{
# fの値でグラフを分けて表示する例
p = ggplot(d, aes(x='x', y='y'))
p += geom_point()
p += facet_wrap('f')
print(p)
}}
#pre{{
<ggplot: (8767854380397)>
}}
sageへの入力:
#pre{{
ggsave('fig2.png', dpi=50)
}}
#pre{{
Saving 11.0 x 8.0 in image.
}}
&ref(fig2.png);
一番よく使うのは、プロットするときにf毎に色分けする方法で...
ggplotでは、aesのcolor属性に色別に使うカラム名を指定する...
sageへの入力:
#pre{{
# fの値で色を変えてプロット
p = ggplot(d, aes(x='x', y='y', color='f'))
p += geom_point()
print(p)
}}
#pre{{
<ggplot: (8767854296293)>
}}
sageへの入力:
#pre{{
ggsave('fig3.png', dpi=50)
}}
#pre{{
Saving 11.0 x 8.0 in image.
}}
&ref(fig3.png);
** データの加工 [#m3b18243]
データフレームを使うとデータの加工がとても簡単にできます...
- データの絞り込み
- SQLのgroup byと同様な集計処理
*** データの絞り込み [#ndd9a085]
データの絞り込みは、以下の形式で実行します。
#pre{{
データフレーム[絞り込み条件]
}}
例として、施肥のあるものd.fがTの物だけを取り出すには、以...
sageへの入力:
#pre{{
# データの絞り込み
# 施肥のあるもの(f=Tのもの)を取り出す
d_T = d[d.f == 'T']
d_T.head()
}}
#pre{{
y x f
50 14 10.14 T
51 6 9.05 T
52 7 9.89 T
53 9 8.76 T
54 6 12.04 T
}}
sageへの入力:
#pre{{
# 同様に肥料のなしのもの
d_C = d[d.f == 'C']
d_C.head()
}}
#pre{{
y x f
0 6 8.31 C
1 6 9.44 C
2 6 9.50 C
3 12 9.07 C
4 10 10.16 C
}}
*** 集計処理 [#b0ecbb37]
groupbyを使った集計の例として、種子数y毎の度数を計算して...
size関数を使うと、groupbyで指定されたレコードの数が返され...
sageへの入力:
#pre{{
# 肥料なしの種子数y毎の度数
d_C.groupby('y').size()
}}
#pre{{
y
2 1
3 2
4 3
5 4
6 10
7 1
8 5
9 8
10 9
11 4
12 3
dtype: int64
}}
集計結果をggplotのヒストグラムと比較してみましょう。
ヒストグラムの追加は、geom_histogram関数で行い、binwidth=...
yを幅=1で集計します。fill='grey'で塗りつぶしの色をグレイ...
sageへの入力:
#pre{{
# F別のヒストグラムを表示
p = ggplot(d, aes(x='y'))
p += geom_histogram(aes(binwidth=1), fill='grey')
p += facet_wrap('f')
print(p)
}}
#pre{{
<ggplot: (8767853573597)>
}}
sageへの入力:
#pre{{
ggsave('fig4.png', dpi=50)
}}
#pre{{
Saving 11.0 x 8.0 in image.
}}
&ref(fig4.png);
集計関数の例として、y毎の平均を出してみます。これも一行で...
sageへの入力:
#pre{{
# y毎のxの平均を知る
d_C.groupby('y').mean()
}}
#pre{{
x
y
2 9.430000
3 8.730000
4 9.273333
5 8.282500
6 9.945000
7 9.450000
8 10.596000
9 10.088750
10 9.745556
11 10.012500
12 10.730000
}}
** データの書き出し [#u9b91b22]
pandasのデータフレームでは、データを他の形式で書き出すこ...
- to_csv: CSVファイルに出力
- to_excel: Excel形式のファイルに出力
- to_sql: SQLを使ってデータベースに出力
例として、d_C_meanのデータフレームをExcel形式のファイルに...
Excelでは、Excelのブック形式のファイルに複数のシートを保...
最初にExcelWriterを作成し、このwriterを使ってd_C_meanを"m...
sageへの入力:
#pre{{
# 集計結果をExcelファイルに出力する
d_C_mean = d_C.groupby('y').mean()
writer = pd.ExcelWriter(DATA + 'test.xls')
d_C_mean.to_excel(writer, 'mean')
writer.close()
}}
sageでは、作成されたExcelファイルtest.xlsがDATAフォルダー...
dataメニューから作成されたtest.xlsをダウンロードできます。
&ref(menu.png);
ダウンロードしたtest.xlsを開くと、以下の様に表示されます。
&ref(excel.png);
** データベース連携 [#v683269b]
sageには、sqliteというデータベースが入っていますが、日付...
ここではMySQLを使ってpandasのデータベース連携機能を説明し...
このWindows版sageには、MySQLを別途インストールしてあり、
sagedbデータベース, sageユーザもセットしてあります。
MySQLをpythonから使うには、以下のインポート文が必要です。
sageへの入力:
#pre{{
# MySQLとpandaの連携
import pandas.io.sql as sql
import MySQLdb
}}
*** データベースを使うための準備 [#vaa686b7]
データベースを使うためには、データベースに接続する必要が...
また、最後には接続conのクローズも必要です。
sageへの入力:
#pre{{
# データベースを使うための準備
con = MySQLdb.connect(host='localhost', db='sagedb', user...
cur = con.cursor()
# 日本語コードのセット
cur.execute("SET NAMES utf8")
}}
#pre{{
0L
}}
*** データフレームをデータベースのテーブルに入れる [#g4d0...
先に、CSVファイルから読み込んだデータフレームdをテーブルt...
sageへの入力:
#pre{{
# データフレームdをテーブルt_dに入れる
sql.write_frame(d, con=con, name='t_d', if_exists='replac...
}}
*** クエリーの実行 [#t801f23f]
準備ができたので、テーブルt_dから種子数y毎の頻度をSQLを使...
SQL文は、以下のようにします。
#pre{{
FROM t_d
GROUP BY y;
}}
注意する点は、count(y)などの集計されたカラムに必ず名前を...
このようにすることで、結果として返されたデータフレームres...
sageへの入力:
#pre{{
# クエリーの実行
query_1 = """
SELECT y, count(y) AS cnt_y
FROM t_d
GROUP BY y;
"""
result_1 = sql.frame_query(query_1, con)
print result_1.head()
print result_1.cnt_y.head()
}}
#pre{{
y cnt_y
0 2 1
1 3 3
2 4 5
3 5 9
4 6 20
0 1
1 3
2 5
3 9
4 20
Name: cnt_y, dtype: int64
}}
sageへの入力:
#pre{{
# データベースのクローズ
con.close()
}}
** コメント [#cb36223d]
#vote(おもしろかった[2],そうでもない[0],わかりずらい[1])
皆様のご意見、ご希望をお待ちしております。
#comment_kcaptcha
終了行:
[[FrontPage]]
#contents
2015/09/13からのアクセス回数 &counter;
ここで紹介したSageワークシートは、以下のURLからダウンロー...
http://www15191ue.sakura.ne.jp:8000/home/pub/64/
また、私の公開しているSageのサーバ(http://www15191ue.sak...
にユーザIDを作成することで、ダウンロードしたワークシートを
アップロードし、実行したり、変更していろいろ動きを試すこ...
** データ処理の基礎 [#ga5e24b5]
ここでは、pythonを使ってデータを取り扱う方法をまとめます。
使用するパッケージは、以下の3つです。
- ggplot: データのグラフ化パッケージ
- pandas: pythonでRのデータフレームと同様の処理をするパッ...
- numpy: pythonで数値を処理する基本パッケージ
sageへの入力:
#pre{{
# ggplotとpandas, numpyが使えるようにインポートする
from ggplot import *
import numpy as np
import pandas as pd
}}
** なぜExcelではなく、pythonを使うのか? [#wc59528b]
自然な流れとして、「なぜExcelではなく、pythonを使うのか」...
何でもできそうなExcelにも弱点があります。その大きなものは...
大量のデータを処理するには、Excelのカラム数では不十分なの...
** データの取り込み [#ua5db7db]
pandasパッケージでは、様々なタイプのデータを取り扱うこと...
- CSVファイル: カンマで区切られたファイルで最もよく使われ...
- Excelファイル: Microsoft Excelで作られたファイル
- データベース: データベース(MySQL)のテーブルやQuery結果
最初にCSVファイルを読み込む例を示します。読み込みファイル...
ネットワークで公開されているファイルの両方を指定すること...
CSVのファイル読み込みには、read_csv関数を使用します。この...
sageへの入力:
#pre{{
# 久保本の3章のデータをネットから取り込む
d = pd.read_csv('http://hosho.ees.hokudai.ac.jp/~kubo/sta...
type(d)
}}
#pre{{
<class 'pandas.core.frame.DataFrame'>
}}
*** データの素性を知る [#l66de607]
読み込んだデータがどのような物なのかその素性をしるために...
info関数では、dには100個のレコードが入っており、x, y, fの...
xが整数、yは実数、fにはオブジェクトが入っており、欠損値(...
sageへの入力:
#pre{{
# どのようなデータが入っているか調べる
d.info()
}}
#pre{{
<class 'pandas.core.frame.DataFrame'>
Int64Index: 100 entries, 0 to 99
Data columns (total 3 columns):
y 100 non-null int64
x 100 non-null float64
f 100 non-null object
dtypes: float64(1), int64(1), object(1)
memory usage: 3.1+ KB
}}
このデータは、「データ解析のための統計モデリング入門」か...
- \(y_i\): 個体iの種子数
- \(x_i\): 個体iのサイズ
- \(f_i\): 個体iが施肥処理ならT、肥料なしならC
describe関数では、各カラム毎に個数、平均、標準偏差、最小...
sageへの入力:
#pre{{
# データのばらつきを見る
d.describe()
}}
#pre{{
y x
count 100.000000 100.000000
mean 7.830000 10.089100
std 2.624881 1.008049
min 2.000000 7.190000
25% 6.000000 9.427500
50% 8.000000 10.155000
75% 10.000000 10.685000
max 15.000000 12.400000
}}
実際にdにどのような値が入っているか調べるには、最初のn個...
sageへの入力:
#pre{{
# 最初の3個を表示してみる、最後の5個の場合には、tail(5)。...
d.head(3)
}}
#pre{{
y x f
0 6 8.31 C
1 6 9.44 C
2 6 9.50 C
}}
*** 行とカラム(列)の操作 [#b189756e]
pandasのデータフレームから特定のカラムや行を取り出す方法...
カラムの指定方法は、2通りあります。
#pre{{
データフレーム.カラム名
データフレーム['カラム名']
}}
sageへの入力:
#pre{{
# カラム(列)を取り出す方法
print d.y.head()
print d['y'].head()
}}
#pre{{
0 6
1 6
2 6
3 12
4 10
Name: y, dtype: int64
0 6
1 6
2 6
3 12
4 10
Name: y, dtype: int64
}}
特定の行を取り出す場合には、ixを使って以下の様に指定しま...
#pre{{
データフレーム.ix[行番号]
}}
sageへの入力:
#pre{{
# 行を取り出す方法
print d.ix[0]
}}
#pre{{
y 6
x 8.31
f C
Name: 0, dtype: object
}}
** データの分布を知る [#d0cd4b72]
データを可視化して、データの分布をみてみましょう。データ...
ggplotは、Rのggplot2と同様の機能をpythonで使えるようにし...
ggplotでの図化は、ggplot関数に表示したい図を足し込んでい...
以下の例では、ggplotで、データフレームとx軸要素、y軸要素...
geom_point関数で散布図を指定し、print関数で表示すると図化...
sageへの入力:
#pre{{
# データの分布を知る
# ggplotに表示したいものを足していく(直感的な図化方法)
p = ggplot(d, aes(x='x', y='y'))
p += geom_point()
print(p)
}}
#pre{{
<ggplot: (8767854380393)>
}}
ggsave関数を使って表示された図をファイルに保存します。(s...
sageへの入力:
#pre{{
# ファイルに保存して、表示(ここでは、dpi=50を指定して縮...
ggsave('fig1.png', dpi=50)
}}
#pre{{
Saving 11.0 x 8.0 in image.
}}
&ref(fig1.png);
fのタイプ(C, T)別にグラフを分けて表示するのも、facet_wr...
sageへの入力:
#pre{{
# fの値でグラフを分けて表示する例
p = ggplot(d, aes(x='x', y='y'))
p += geom_point()
p += facet_wrap('f')
print(p)
}}
#pre{{
<ggplot: (8767854380397)>
}}
sageへの入力:
#pre{{
ggsave('fig2.png', dpi=50)
}}
#pre{{
Saving 11.0 x 8.0 in image.
}}
&ref(fig2.png);
一番よく使うのは、プロットするときにf毎に色分けする方法で...
ggplotでは、aesのcolor属性に色別に使うカラム名を指定する...
sageへの入力:
#pre{{
# fの値で色を変えてプロット
p = ggplot(d, aes(x='x', y='y', color='f'))
p += geom_point()
print(p)
}}
#pre{{
<ggplot: (8767854296293)>
}}
sageへの入力:
#pre{{
ggsave('fig3.png', dpi=50)
}}
#pre{{
Saving 11.0 x 8.0 in image.
}}
&ref(fig3.png);
** データの加工 [#m3b18243]
データフレームを使うとデータの加工がとても簡単にできます...
- データの絞り込み
- SQLのgroup byと同様な集計処理
*** データの絞り込み [#ndd9a085]
データの絞り込みは、以下の形式で実行します。
#pre{{
データフレーム[絞り込み条件]
}}
例として、施肥のあるものd.fがTの物だけを取り出すには、以...
sageへの入力:
#pre{{
# データの絞り込み
# 施肥のあるもの(f=Tのもの)を取り出す
d_T = d[d.f == 'T']
d_T.head()
}}
#pre{{
y x f
50 14 10.14 T
51 6 9.05 T
52 7 9.89 T
53 9 8.76 T
54 6 12.04 T
}}
sageへの入力:
#pre{{
# 同様に肥料のなしのもの
d_C = d[d.f == 'C']
d_C.head()
}}
#pre{{
y x f
0 6 8.31 C
1 6 9.44 C
2 6 9.50 C
3 12 9.07 C
4 10 10.16 C
}}
*** 集計処理 [#b0ecbb37]
groupbyを使った集計の例として、種子数y毎の度数を計算して...
size関数を使うと、groupbyで指定されたレコードの数が返され...
sageへの入力:
#pre{{
# 肥料なしの種子数y毎の度数
d_C.groupby('y').size()
}}
#pre{{
y
2 1
3 2
4 3
5 4
6 10
7 1
8 5
9 8
10 9
11 4
12 3
dtype: int64
}}
集計結果をggplotのヒストグラムと比較してみましょう。
ヒストグラムの追加は、geom_histogram関数で行い、binwidth=...
yを幅=1で集計します。fill='grey'で塗りつぶしの色をグレイ...
sageへの入力:
#pre{{
# F別のヒストグラムを表示
p = ggplot(d, aes(x='y'))
p += geom_histogram(aes(binwidth=1), fill='grey')
p += facet_wrap('f')
print(p)
}}
#pre{{
<ggplot: (8767853573597)>
}}
sageへの入力:
#pre{{
ggsave('fig4.png', dpi=50)
}}
#pre{{
Saving 11.0 x 8.0 in image.
}}
&ref(fig4.png);
集計関数の例として、y毎の平均を出してみます。これも一行で...
sageへの入力:
#pre{{
# y毎のxの平均を知る
d_C.groupby('y').mean()
}}
#pre{{
x
y
2 9.430000
3 8.730000
4 9.273333
5 8.282500
6 9.945000
7 9.450000
8 10.596000
9 10.088750
10 9.745556
11 10.012500
12 10.730000
}}
** データの書き出し [#u9b91b22]
pandasのデータフレームでは、データを他の形式で書き出すこ...
- to_csv: CSVファイルに出力
- to_excel: Excel形式のファイルに出力
- to_sql: SQLを使ってデータベースに出力
例として、d_C_meanのデータフレームをExcel形式のファイルに...
Excelでは、Excelのブック形式のファイルに複数のシートを保...
最初にExcelWriterを作成し、このwriterを使ってd_C_meanを"m...
sageへの入力:
#pre{{
# 集計結果をExcelファイルに出力する
d_C_mean = d_C.groupby('y').mean()
writer = pd.ExcelWriter(DATA + 'test.xls')
d_C_mean.to_excel(writer, 'mean')
writer.close()
}}
sageでは、作成されたExcelファイルtest.xlsがDATAフォルダー...
dataメニューから作成されたtest.xlsをダウンロードできます。
&ref(menu.png);
ダウンロードしたtest.xlsを開くと、以下の様に表示されます。
&ref(excel.png);
** データベース連携 [#v683269b]
sageには、sqliteというデータベースが入っていますが、日付...
ここではMySQLを使ってpandasのデータベース連携機能を説明し...
このWindows版sageには、MySQLを別途インストールしてあり、
sagedbデータベース, sageユーザもセットしてあります。
MySQLをpythonから使うには、以下のインポート文が必要です。
sageへの入力:
#pre{{
# MySQLとpandaの連携
import pandas.io.sql as sql
import MySQLdb
}}
*** データベースを使うための準備 [#vaa686b7]
データベースを使うためには、データベースに接続する必要が...
また、最後には接続conのクローズも必要です。
sageへの入力:
#pre{{
# データベースを使うための準備
con = MySQLdb.connect(host='localhost', db='sagedb', user...
cur = con.cursor()
# 日本語コードのセット
cur.execute("SET NAMES utf8")
}}
#pre{{
0L
}}
*** データフレームをデータベースのテーブルに入れる [#g4d0...
先に、CSVファイルから読み込んだデータフレームdをテーブルt...
sageへの入力:
#pre{{
# データフレームdをテーブルt_dに入れる
sql.write_frame(d, con=con, name='t_d', if_exists='replac...
}}
*** クエリーの実行 [#t801f23f]
準備ができたので、テーブルt_dから種子数y毎の頻度をSQLを使...
SQL文は、以下のようにします。
#pre{{
FROM t_d
GROUP BY y;
}}
注意する点は、count(y)などの集計されたカラムに必ず名前を...
このようにすることで、結果として返されたデータフレームres...
sageへの入力:
#pre{{
# クエリーの実行
query_1 = """
SELECT y, count(y) AS cnt_y
FROM t_d
GROUP BY y;
"""
result_1 = sql.frame_query(query_1, con)
print result_1.head()
print result_1.cnt_y.head()
}}
#pre{{
y cnt_y
0 2 1
1 3 3
2 4 5
3 5 9
4 6 20
0 1
1 3
2 5
3 9
4 20
Name: cnt_y, dtype: int64
}}
sageへの入力:
#pre{{
# データベースのクローズ
con.close()
}}
** コメント [#cb36223d]
#vote(おもしろかった[2],そうでもない[0],わかりずらい[1])
皆様のご意見、ご希望をお待ちしております。
#comment_kcaptcha
ページ名:
SmartDoc