日々の記録

某所でデータサイエンティストに必要な要件のまとめ記事を読んだ。インフラ構築から統計の基礎知識、クラウド機械学習などなど色んな素養がいるなあという感じ。

ワナビー欲を掻き立てて能力を伸ばしていくタイプなので、ブログにデータサイエンティストという走り書きを入れてるけど、一人前になるにはまだまだ学ぶことが多い。

プログラムを書く能力は実務で追い込まれて徐々に使いこなせるようになってきた。統計学は学んでいないのでどこかで体系立てて学ぶ必要がある(統計力学とはきっと違うよなー)。色んな勉強会で機械学習のデモを体験させてもらったので、自分で手を動かして覚えよう。

この辺りの学習は、大学で学んだ基礎知識が役立っているので大学教育要らない派閥とは話が合わないと思います。

大学で得た「今、もっとも役立ってること」って何? - Chikirinの日記

造船業に関する個人的なまとめ

造船に関わっている知人が数人いるのでメモがてら。

船舶に関しての知識はそんなに持ち合わせてなくて、精々『コンテナ物語』で読んだ程度。この本は巨大利権との戦い方、業界基準フォーマットをめぐる戦いが描かれていて読み物としてとても面白かった。

コンテナ物語―世界を変えたのは「箱」の発明だった

コンテナ物語―世界を変えたのは「箱」の発明だった

コンテナ物語で書かれていた内容を自分なりに咀嚼すると、船舶輸送は近代でかなり合理化されていて、運搬ルートや積載量といった工夫の余地はあまり無くなっている。こうなると船舶の絶対量を増やして輸送量の底上げを図るか、維持費を削減するところに着眼点が向かう。

後者に関する取り組みは日本郵船三菱重工が昔から手掛けてる。

【広告】日本郵船 環境特命プロジェクト その1:エコ船

波風の抵抗を減らしつつ、太陽光発電で自活する船。これがあれば海洋生活も夢じゃ無い?

近年の船舶業界

2008年〜2014年くらいの間、船舶製造は中国・韓国が強かったらしい。おそらく船舶製造にかかる人件費が低いことと、中国・韓国が貿易の拠点として存在感を増したという点が大きな要因だったのでは。

記事中に記載があったけど価格競争の結果、船舶製造業は供給過多になっていたらしい。そんな中、コストで勝てない日本企業は業界再編と省エネ化に取り組んでた模様。

船舶のコスト

Twitterのタイムラインから引用。日本の船舶は中長期運用で見た場合コストに優れているらしい。

ちょっと前、中古物品を海外に輸出する企業がテレビに出ていて同じような話をしてた。

中東や東南アジアの人々がジャノメミシンや日本製エアコンを買い漁る話。 日本製は年代物でも壊れにくく、最新版より若干劣るけど運用コストが低いというメリットがあるとのこと。

ミシンやエアコンの製造業だと壊れなければ買い替えスパンが長くなってデメリットもあるけど、船舶のような耐久財だと定期メンテナンスなんかで利益を上げることができる。 コスト競争の土俵が変わってきたら日本の企業は強いのかもしれない。

短期コストを優位性とするリスク

中韓の製造が結局コスト高になるという問題は、保守費(メンテナンス費など)で稼ぐ道を閉ざしてしまう。粗製乱造が明るみになれば品質に疑問符がつき、結局長い付き合いが出来なくなって単発受注で稼ぐ手段しか残らない。消費財なら問題ないけど耐久財だと辛い。

日本船舶業の未来

雑多な感想を書いてきて思ったのは、日本の管理体系をもたせて海外の人件費で戦うのが最善手な気がする。

かつてHONDAが海外に工場を作ったのは、現地に産業を置くという理由とされている。 当時の経済環境を深堀してないので断定できないけど、HONDAの件も保守費等経済的な理由を鑑みて、最終的な判断を下したのかも。何事も一側面だけで断定できるほど世の中単純ではないですね。

Pythonで生成したリストの並び替え

取り扱う対象は1次元のリスト。リストは昇順・降順に並び替えたり、長さ順に並び替えたりすることが多い。以下のようなリストに変更を加えていく。個人名は適当に生成してます。

Ipython使ってるので入出力の接頭文字が付いてます。

NameList  = ['佐藤一','小林武彦','渡辺浩二','麻生信雄','西川ともこ','池田宏','国貞真一郎','佐藤ひとみ']

昇順・降順の並び替え

これを昇順に並び替えるにはsortメソッドを使う。

NameList.sort()

In [16]: NameList
Out[16]: ['佐藤ひとみ', '佐藤一', '国貞真一郎', '小林武彦', '池田宏', '渡辺浩二', '西川ともこ', '麻生信雄']

Pythonのsortメソッドは破壊的メソッドの一種なので、上記の変更をかけた場合、"NameList"は昇順に書き換わってしまう。 昇順を降順に切り替えたいのであれば、"reverseメソッド"を使えば良い。

NameList.reverse()

In [18]: NameList
Out[18]: ['麻生信雄', '西川ともこ', '渡辺浩二', '池田宏', '小林武彦', '国貞真一郎', '佐藤一', '佐藤ひとみ']

長さ順の並び替え

sortメソッドのカッコ内に引数を与えることで長さ順に並び替える事ができる。

NameList.sort(key=len)

In [20]: NameList
Out[20]: ['池田宏', '佐藤一', '麻生信雄', '渡辺浩二', '小林武彦', '西川ともこ', '国貞真一郎', '佐藤ひとみ']

逆順にしたい場合は前項と同じくreverseを使うと良い。

sort系は2次元配列の特定列を指定して並び替えたりも出来るみたい。

ソート HOW TO — Python 2.7.13 ドキュメント

Pythonの配列(リスト)とその操作

Pythonでは文字列、リスト、タプル等のデータ型がある。リストは多次元配列(1次元含む)を扱うことができる。

基本的なこと

1次元配列の例。

List1 = [1,2,3,4,5]

2次元配列。

List2 = [[1,2,3],[4,5,6]]

上の"List1"で要素にアクセスしたい時には角カッコで括って場所を指す。一番はじめの要素にアクセスしたい時には"0"を使うことに注意。

List1[2]
3

2次元配列の場合には一つ目で行の要素、二個目で列要素を指定する。

List2[1][2]
6

CSVデータの取り扱い

csvを取り扱う場合にはcsvモジュールを読み込んで、一行ごとに配列に組み込んでいく。 Python3だとインストール時点でCSVモジュールが使えるはず。

import csv

ファイルの読み込みはこのへんを見ると良い。

CsvFile = csv.reader(open('sample.csv'),delimiter=','))

csvと言いながら、TSVや半角スペース等で区切られたデータも呼び出すことができる。delimiterで指定しているところを¥tなんかに書き換えてやると良い。

配列に格納するため、空のリストを用意する。for 文で一行ごとの要素をリストに加えていく。

CsvList = []
for i in CsvFile:
    CsvList.append(i)

一行で書く方法もあるけどそれは別途。

Pythonで厚生労働省が公開する世帯所得データを解析する

事前準備

作業内容は表題の通り。環境はPython3を基本にして以下を使用します。事前にライブラリのインストールが必要です。

  • ipython
  • pandas
  • numpy
  • matplotlib

元データは厚生労働省が公開している”平成25年 国民生活基礎調査の概況”を利用します。

調査の概要|厚生労働省

所得に関するデータはページの下段にExcel形式で公開してあります。以下にリンク先を記載します。人類は皆Excelが大好きです。

http://www.mhlw.go.jp/toukei/saikin/hw/k-tyosa/k-tyosa13/xls/10.xls

PythonではPandasを使ってExcelファイルを直接読み込むことができます。素のPythonを使っても良いですが、iPythonの方が補完が聞いて楽です。

MacOSならコンソール、WindowsならターミナルかPowerShell ISEを使ってipythonを起動。ダウンロードしたファイルを作業環境に移動させて起動させると大変はかどります。

matplotlibを使いたいので、ipython起動時にpylabオプションを付けましょう。

ipython --pylab

pylabオプションでipythonを読み込めば、matplotlibのGUIをバックエンドで起動した状態で作業が出来ます。大抵一発スクリプトどーんで目的のグラフを作ることはできないので、データ処理と可視化を分離しておきましょう。叩いて確認、また叩いて確認の繰り返しです。

ただ、GUI関連のライブラリが足りないことでエラーが起きるかもしれません。これはエラーメッセージから必要なライブラリを読み取って、別途pipで落としてきましょう。TkとかPyQtとかが引っかかることが多いです。

Excelファイルの読み込み

まずは必要なライブラリをインポート。

import pandas as pd
import numpy as np

pandas を使ってデータを読みます。

Mhlw_syotoku_excel = pd.ExcelFile('syotoku.xls')

ファイルの容量によって読み込みまでに時間がかかりますが、最近のPCで上記のファイルだと数秒程度です。ムーアの法則最高。

ご存知の通り、Excelファイルはシートが複数に存在します。困ったことにシート名は担当者の意思に依存しますので、何枚あるかもわかんない。読み出したファイルからExcelのシートを確認してみましょう。

Mhlw_syotoku_excel.sheet_names

読み込んだ変数に"sheet_names"メソッドを加えるとシート名が取れます。実際に呼び出すとこんな感じ。

f:id:kazutaka83:20150221132754p:plain

脱線しますがExcelの空白シートを残してる人はなんだかなーという感じがするので、無駄なシートは削除しとくと良いですね。 Excelの設定で起動時のシート数を制御できるので、新入社員の皆さんは1枚にしとくと良いでしょう。

ExcelファイルをPythonで呼び出す

データを解析するためにExcelの各シートを行列の形に読み込む。

Mhlw_syotoku_sheet1 = Mhlw_syotoku_excel.parse('Ⅱ -図13データ')

これでシート名"Ⅱ -図13データ"を変数に格納することができました。このやり方ではシート名を直接指定する必要があり、名前わからないと指定できません。この状況は微妙すぎるので、せっかくだから数値(シートのシーケンシャル番号)で指定しましょう。

Mhlw_syotoku_sheet1 = Mhlw_syotoku_excel.parse(Mhlw_syotoku_excel.sheet_names[2])

sheet_namesはリストのような形式なので、引数を与えることで格納された文字列を返すことが出来ます。便利。

じゃあこれで解析できるようになるかというと、駄目なんですね。呼び出してみると変なNaNデータがたくさんあります。

Mhlw_syotoku_sheet1
13データ 1世帯当たり平均所得金額の年次推移  Unnamed: 1 Unnamed: 2 Unnamed: 3 Unnamed: 4
NaN                       NaN         NaN        NaN        NaN        NaN
NaN                       NaN         NaN        全世帯      高齢者世帯    児童のいる世帯
NaN                     昭和601985      493.3      210.6      539.8
NaN                       61           86      505.6      235.4      557.2
NaN                       62           87      513.2      233.5      562.6
NaN                       63           88      545.3      244.4      603.5
NaN                      平成元年          89      566.7      248.3      626.4
NaN                        2           90      596.6      263.9      670.4
NaN                        3           91      628.8      273.7      710.6
NaN                        4           92      647.8        296      727.5
NaN                        5           93      657.5      292.8      745.6
NaN                        6           94      664.2        305      758.6
NaN                        7           95      659.6      316.9      737.2
NaN                        8           96      661.2        316      781.6
NaN                        9           97      657.7      323.1      767.1
NaN                       10           98      655.2      335.5      747.4
NaN                       11           99        626      328.9      721.4
NaN                       12         2000      616.9      319.5      725.8
NaN                       13            1        602      304.6      727.2
NaN                       14            2      589.3      304.6      702.7
NaN                       15            3      579.7      290.9      702.6
NaN                       16            4      580.4      296.1      714.9
NaN                       17            5      563.8      301.9        718
NaN                       18            6      566.8      306.3      701.2
NaN                       19            7      556.2      298.9      691.4
NaN                       20            8      547.5        297      688.5
NaN                       21            9      549.6      307.9      697.3
NaN                       NaN         NaN        NaN        NaN        NaN
NaN  注:平成6年の数値は、兵庫県を除いたものである。         NaN        NaN        NaN        NaN

元のデータを見たらわかりますが、上の方の行に無駄なものがあります。左の列も無駄。下も、、無駄か。

データを成形する

pandasで必要ない行と列を消せます。行を上から消す場合には"skiprows"、下から消す場合は"skip_footer"を使いましょう。

Mhlw_syotoku_sheet1 = Mhlw_syotoku_excel.parse(Mhlw_syotoku_excel.sheet_names[2]),skiprows=2

これで先頭の3行が消えます。末尾も消したい場合には以下のように書きましょう。

Mhlw_syotoku_sheet1 = Mhlw_syotoku_excel.parse(Mhlw_syotoku_excel.sheet_names[2]),skiprows=2,skip_footer=2

下のコマンドで表を成形するとこんな感じ。

    Unnamed: 0 Unnamed: 1  Unnamed: 2    全世帯  高齢者世帯  児童のいる世帯
0          NaN      昭和601985  493.3  210.6    539.8
1          NaN        61           86  505.6  235.4    557.2
2          NaN        62           87  513.2  233.5    562.6
3          NaN        63           88  545.3  244.4    603.5
4          NaN       平成元年          89  566.7  248.3    626.4
5          NaN         2           90  596.6  263.9    670.4
6          NaN         3           91  628.8  273.7    710.6
7          NaN         4           92  647.8  296.0    727.5
8          NaN         5           93  657.5  292.8    745.6
9          NaN         6           94  664.2  305.0    758.6
10         NaN         7           95  659.6  316.9    737.2
11         NaN         8           96  661.2  316.0    781.6
12         NaN         9           97  657.7  323.1    767.1
13         NaN        10           98  655.2  335.5    747.4
14         NaN        11           99  626.0  328.9    721.4
15         NaN        12         2000  616.9  319.5    725.8
16         NaN        13            1  602.0  304.6    727.2
17         NaN        14            2  589.3  304.6    702.7
18         NaN        15            3  579.7  290.9    702.6
19         NaN        16            4  580.4  296.1    714.9
20         NaN        17            5  563.8  301.9    718.0
21         NaN        18            6  566.8  306.3    701.2
22         NaN        19            7  556.2  298.9    691.4
23         NaN        20            8  547.5  297.0    688.5
24         NaN        21            9  549.6  307.9    697.3

行列のように考えて表を呼び出すことができます。全世帯の所得を見たいのであればこういう風に。

In [29]: Mhlw_syotoku_sheet1['全世帯']
Out[29]: 
0     493.3
1     505.6
2     513.2
3     545.3
4     566.7
5     596.6
6     628.8
7     647.8
8     657.5
9     664.2
10    659.6
11    661.2
12    657.7
13    655.2
14    626.0
15    616.9
16    602.0
17    589.3
18    579.7
19    580.4
20    563.8
21    566.8
22    556.2
23    547.5
24    549.6
Name: 全世帯, dtype: float64

世帯別所得のグラフ化

格納されている"全世帯"、"高齢者世帯"、"児童のいる世帯"の折れ線グラフを作ってみましょう。pandasで作成した行列の複数の特定要素を取り出すには以下のコマンドを叩きます。

Mhlw_syotoku_sheet1[['全世帯','高齢者世帯','児童のいる世帯']]

ipythonの起動時にpylabを読み込んでるので、plotメソッドを呼ぶことでグラフが起動します。

Mhlw_syotoku_sheet1[['全世帯','高齢者世帯','児童のいる世帯']].plot(title='各世帯ごとの所得)

f:id:kazutaka83:20150221143754p:plain

とても便利!。

MacOSとPythonで始めるデータサイエンス

環境を整えます。必要なのは以下。

  • pip
  • Ipython
  • pandas
  • numpy
  • matplotlib
  • scipy

canopyを使うのも良さそうだけど、後からパス通すとかめんどくさそうなので今回は見送り。

Python Distribution and Integrated Analysis Environment | Enthought Canopy

pipのインストール

デフォルトでPythonが入ってるので以下のリンク先を参考にして、pipインストール用スクリプトをダウンロード。Pythonで叩く。

pipの使い方 (2014/1バージョン) — そこはかとなく書くよん。

叩くときに管理者権限が必要なことがある(自分の環境だと必要なかった)

python get-pip.py

ダメだったら

sudo python get-pip.py

ipython以下のインストール

先ほど導入したpipを使う。Python2系と3系、どちらを使うかで少し導入方法が違う。個人的にはPython3系を使う方を進めます。

pip3 install ipython
pip3 install pandas
pip3 install numpy
pip3 install matplotlib
pip3 install scipy

この辺を読むと"pyreadline"のインストールが必要と書いてあったけど、インストールログ読んでるとipythonインストール時にpyreadlineがなければ勝手に解消してくれてるっぽいですね。

-- Windowsで同じ環境を整えようとすると結構面倒くさい…。

Arduinoはじめました

電子工作熱が高まった結果Arduinoを買った。基盤むき出しで見た目はとっつきにくい子、でも触り始めると中々可愛い。

f:id:kazutaka83:20150124232842j:plain

LEDをチカチカさせる通称「Lチカ」で感動したあと、センサー類を買い集めて自宅の温度・湿度・照度などを諸々数値化して遊んでる。

いまのところブレッドボードに差し込んで、どこまでセンサー積み込めるかとか定期的にWebに情報上げるには…とか検証をしているけど、最終系は小型化したいところ。

何もわかんないとこからArduinoに触れる場合は、スイッチサイエンスから発売されている「arduinoをはじめようキット」がおすすめです。

Arduinoをはじめようキット

Arduinoをはじめようキット


スポンサード リンク