RaspberryPiでBluetooth通信(デバイス認証)
自宅内にBluetoothネットワーク網を作りたい。 各種センサーデータをBluetoothで飛ばして未来の家を作るのだ。
センサーデータ集約のための子機はArduino(互換)+BLEで構築したいのでBlend Microを使う予定。まだ買ってない。
親機は自宅のUbuntu Serverを使う予定。テストとしてRaspberry PiとMacbookでBluetooth通信を試す。
BlueZのインストール
BluezはLinuxベースのOS上で動くBluetoothプロトコルスタック。
Bluetoothのはなし(4)|Wireless・のおと|サイレックス・テクノロジー株式会社
こまかな仕様は上記リンク先を参考に。内容が重たいっす。。
インストール自体はパッケージマネージャから簡単にできた。
pi@raspberrypi ~ $ sudo apt-get install bluez
ドングルを差し込んでhciconfigで確認する。
pi@raspberrypi ~ $ hciconfig hci0: Type: BR/EDR Bus: USB BD Address: 00:1B:DC:09:A5:BD ACL MTU: 310:10 SCO MTU: 64:8 UP RUNNING PSCAN RX bytes:3043 acl:0 sco:0 events:83 errors:0 TX bytes:1292 acl:0 sco:0 commands:75 errors:0
UP RUNNING PSCANになっているので動いてる。 iPhoneやAndroid端末のBluetooth設定画面から、ペアリングモードにしてhcitoolを使う。
pi@raspberrypi ~ $ hcitool scan Scanning ... AC:22:0B:9C:CC:61 Nexus 7
ペアリングモードに入ってたNexus 7が見えた。
Macbook AirのBluetooth設定開いた状態で同じくコマンドを打つと。
pi@raspberrypi ~ $ hcitool scan Scanning ... AC:22:0B:9C:CC:61 Nexus 7 B8:8D:12:19:03:03 MacbookAir
これも見えた!
日々の記録
某所でデータサイエンティストに必要な要件のまとめ記事を読んだ。インフラ構築から統計の基礎知識、クラウド、機械学習などなど色んな素養がいるなあという感じ。
ワナビー欲を掻き立てて能力を伸ばしていくタイプなので、ブログにデータサイエンティストという走り書きを入れてるけど、一人前になるにはまだまだ学ぶことが多い。
プログラムを書く能力は実務で追い込まれて徐々に使いこなせるようになってきた。統計学は学んでいないのでどこかで体系立てて学ぶ必要がある(統計力学とはきっと違うよなー)。色んな勉強会で機械学習のデモを体験させてもらったので、自分で手を動かして覚えよう。
この辺りの学習は、大学で学んだ基礎知識が役立っているので大学教育要らない派閥とは話が合わないと思います。
造船業に関する個人的なまとめ
造船に関わっている知人が数人いるのでメモがてら。
船舶に関しての知識はそんなに持ち合わせてなくて、精々『コンテナ物語』で読んだ程度。この本は巨大利権との戦い方、業界基準フォーマットをめぐる戦いが描かれていて読み物としてとても面白かった。
- 作者: マルク・レビンソン,村井章子
- 出版社/メーカー: 日経BP社
- 発売日: 2007/01/18
- メディア: 単行本
- 購入: 6人 クリック: 72回
- この商品を含むブログ (41件) を見る
コンテナ物語で書かれていた内容を自分なりに咀嚼すると、船舶輸送は近代でかなり合理化されていて、運搬ルートや積載量といった工夫の余地はあまり無くなっている。こうなると船舶の絶対量を増やして輸送量の底上げを図るか、維持費を削減するところに着眼点が向かう。
後者に関する取り組みは日本郵船、三菱重工が昔から手掛けてる。
波風の抵抗を減らしつつ、太陽光発電で自活する船。これがあれば海洋生活も夢じゃ無い?
近年の船舶業界
2008年〜2014年くらいの間、船舶製造は中国・韓国が強かったらしい。おそらく船舶製造にかかる人件費が低いことと、中国・韓国が貿易の拠点として存在感を増したという点が大きな要因だったのでは。
記事中に記載があったけど価格競争の結果、船舶製造業は供給過多になっていたらしい。そんな中、コストで勝てない日本企業は業界再編と省エネ化に取り組んでた模様。
船舶のコスト
Twitterのタイムラインから引用。日本の船舶は中長期運用で見た場合コストに優れているらしい。
@HKKsNTTa24 中国製5400トン積みタンカーの年間補機類修理コストが4万ドルくらい。日本の45年もの中古船で4000〜5000ドルだそうです。
中国製海水系バルブは建造1年くらいで動かなくなります。日本船は建造時のバルブがそのまま使えます。
— 裏側 (@Terroristbuster) 2015, 3月 7
ちょっと前、中古物品を海外に輸出する企業がテレビに出ていて同じような話をしてた。
中東や東南アジアの人々がジャノメミシンや日本製エアコンを買い漁る話。 日本製は年代物でも壊れにくく、最新版より若干劣るけど運用コストが低いというメリットがあるとのこと。
ミシンやエアコンの製造業だと壊れなければ買い替えスパンが長くなってデメリットもあるけど、船舶のような耐久財だと定期メンテナンスなんかで利益を上げることができる。 コスト競争の土俵が変わってきたら日本の企業は強いのかもしれない。
短期コストを優位性とするリスク
中韓の製造が結局コスト高になるという問題は、保守費(メンテナンス費など)で稼ぐ道を閉ざしてしまう。粗製乱造が明るみになれば品質に疑問符がつき、結局長い付き合いが出来なくなって単発受注で稼ぐ手段しか残らない。消費財なら問題ないけど耐久財だと辛い。
日本船舶業の未来
雑多な感想を書いてきて思ったのは、日本の管理体系をもたせて海外の人件費で戦うのが最善手な気がする。
かつて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次元配列の特定列を指定して並び替えたりも出来るみたい。
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"メソッドを加えるとシート名が取れます。実際に呼び出すとこんな感じ。
脱線しますが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 昭和60年 1985 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 昭和60年 1985 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='各世帯ごとの所得)
とても便利!。
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で同じ環境を整えようとすると結構面倒くさい…。