技術をかじる猫

適当に気になった技術や言語、思ったこと考えた事など。

Compass から勉強会情報を拾う

Compass から勉強会名と参加率を拾ってみる

まず何がしたかったかというと、勉強会のタイトルを形態素解析して、その募集人数と参加者(+参加待ち)の統計とったら、勉強会界隈のトレンドが追いやすくなるんじゃね?と思ったのが始まり。
で、その為の第一歩として、Compass から勉強会情報を拾ってくる処理をまずは考えた。

まずは requests でAPIを叩いてみる

COMPASSAPI仕様 が公開されているので、そこから拾ってみる。

import requests

パラメータ組み立てて

compass_rest_api = 'https://connpass.com/api/v1/event/'
params = {"ym":"201904", "count":100, "order":3,"start":1}  # 4 月、100 件(max)、着信順、先頭から

query = '&'.join([f'{key}={params[key]}' for key in params.keys()])

投げてみる。

r_get = requests.get(compass_rest_api + '?' + query)
r_get.status_code

200

OKOK
中身を拾うと

r_get.json()

応答が

    {'results_returned': 100,
     'events': [{'event_url': 'https://aaa.connpass.com/event/124784/',
       'event_type': 'participation',
       'owner_nickname': 'Wakamatz',
       'series': {'url': 'https://aaa.connpass.com/',
        'id': 1886,
        'title': 'Mathematik und Programmierung'},
       'updated_at': '2019-03-19T00:04:09+09:00',
       'lat': '34.775820300000',
       'started_at': '2019-04-14T13:30:00+09:00',
       'hash_tag': 'functional_programming, data_structures',
       'title': '純粋関数型データ構造読書会 第23回',
       'event_id': 124784,
       'lon': '135.544884900000',
       /* 中略 */
       'accepted': 4,
       'ended_at': '2019-04-14T18:00:00+09:00',
       'place': 'FG-Space'}],
     'results_start': 1,
     'results_available': 511}

一度に 100 件縛りがあるので、そこだけが問題だろうか?
とりあえず 100 件でリクエストしてみて、100 件未満になるまでループしてリクエストしてみる。

実際に勉強会データ(名前と参加者数)を拾ってみた

尚、やってみてわかったのだけど、ソート順がデフォルト以外だと、タイムアウトでコケるようだ。
多分インデックスが不足してるか何かしてるんだろうなーと思いつつ。
(いや、それ以外はそこそこ高速で返ってくる事を考えれば、RDB じゃなくて Mongo とか Cassandra とか使ってそう)

class ClassRoom:
    def __init__(self, title, limit, accepted, waiting):
        def or_zero(v):
            if isinstance(v, int):
                return v
            return 0
        self.title = title
        self.limit = or_zero(limit)
        self.joins = or_zero(accepted) + or_zero(waiting)
        self.score = self.joins / self.limit if self.limit != 0 else 1
        
    def __str__(self):
        return f'ClassRoom({self.title}, {self.limit}, {self.joins}, {self.score})'

def convert(event):
    return ClassRoom(event['title'], event['limit'], event['accepted'], event['waiting'])


def request_to_compass(start):
    params = {"ym":"201904", "count":WANT_EVENT, "order":1,"start":start}
    query = '&'.join([f'{key}={params[key]}' for key in params.keys()])
    return requests.get(compass_rest_api + '?' + query)


WANT_EVENT = 100
getted = WANT_EVENT
current_start = 1
class_rooms = []

while getted == WANT_EVENT:
    r_get = request_to_compass(current_start)
    respond_json = r_get.json()

    getted = respond_json['results_returned']
    current_start += WANT_EVENT
    print(f'{getted}, {current_start}')

    for ev in respond_json['events']:
        class_rooms.append(convert(ev))

# least 100
r_get = r_get = request_to_compass(current_start)
respond_json = r_get.json()
for ev in respond_json['events']:
    class_rooms.append(convert(ev))
100, 101
100, 201
100, 301
100, 401
100, 501
14, 601
[str(s) for s in class_rooms]
続きを読む

教師あり学習アルゴリズム

pandas とか matplotlib とか色々弄っていく。
インプットはコレ

Pythonではじめる機械学習 ―scikit-learnで学ぶ特徴量エンジニアリングと機械学習の基礎

Pythonではじめる機械学習 ―scikit-learnで学ぶ特徴量エンジニアリングと機械学習の基礎

全部は書かない。

先ずは必要なライブラリのインポート

Python で始める機械学習 という本の第二章先頭なのだけど、いきなり暗黙 import じみた事やってて初見殺しにも程があんだろ(汗

%matplotlib inline
from IPython.display import set_matplotlib_formats, display
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import mglearn

データの種類別散布図

で、改めてデータロード

X, y = mglearn.datasets.make_forge()
print(f"X.shape: {X.shape}")
X.shape: (26, 2)

そしてグラフ化
ちなみに、mglearn.discrete_scatter は、どうも pyplot の scartter を第3引数のデータごとに記号を変えて呼び出してくれるものらしい。

参考: テラテイルでの質問

mglearn.discrete_scatter(X[:, 0], X[:, 1], y)

plt.legend(["Class 0", "Class 1"], loc=4)
plt.xlabel("First feature")
plt.ylabel("Second feature")
Text(0, 0.5, 'Second feature')

[f:id:white-azalea:20190318232637p:plain]

それぞれのデータの中身を見ていく。
y はデータの種類を表して

y
array([1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0,
       0, 0, 1, 0])

X は、その座標を示してる。
こっちは x, y 座標のペアだ。

X

array([[ 9.96346605, 4.59676542], [11.0329545 , -0.16816717], [11.54155807, 5.21116083], [ 8.69289001, 1.54322016], [ 8.1062269 , 4.28695977], 中略 [11.563957 , 1.3389402 ]])

もっと他にも散布図

wave データセットというらしい。

他の散布図も作画してみる。
単純に x, y の配列だけを指定すると、データ分類のないシンプルな散布図ができる。

X, y = mglearn.datasets.make_wave(n_samples = 40)

plt.plot(X, y, 'o')
plt.ylim(-3, 3)
plt.xlabel('Feature')
plt.ylabel('Target')
Text(0, 0.5, 'Target')

[f:id:white-azalea:20190318232752p:plain]

y
array([-0.44822073,  0.33122576,  0.77932073,  0.03497884, -1.38773632,
       -2.47196233, -1.52730805,  1.49417157,  1.00032374,  0.22956153,
       -1.05979555,  0.7789638 ,  0.75418806, -1.51369739, -1.67303415,
       -0.90496988,  0.08448544, -0.52734666, -0.54114599, -0.3409073 ,
        0.21778193, -1.12469096,  0.37299129,  0.09756349, -0.98618122,
        0.96695428, -1.13455014,  0.69798591,  0.43655826, -0.95652133,
        0.03527881, -2.08581717, -0.47411033,  1.53708251,  0.86893293,
        1.87664889,  0.0945257 , -1.41502356,  0.25438895,  0.09398858])
X
array([[-0.75275929],
       [ 2.70428584],
       [ 1.39196365],
       [ 0.59195091],
       [-2.06388816],
       [-2.06403288],
       [-2.65149833],
       [ 2.19705687],
       [ 0.60669007],
       [ 1.24843547],
       /* 中略 */
       [ 1.10539816],
       [-0.35908504]])

乳癌データセット

恐ろしいなまえだなおい…マジか O'Reily 先生よ

from sklearn.datasets import load_breast_cancer
cancer = load_breast_cancer()
print(f"Cancer keys: {cancer.keys()}")
Cancer keys: dict_keys(['data', 'target', 'target_names', 'DESCR', 'feature_names', 'filename'])
cancer.data.shape
(569, 30)
[f'{n}: {v}' for n, v in zip(cancer.target_names, np.bincount(cancer.target))]
['malignant: 212', 'benign: 357']
cancer.feature_names
array(['mean radius', 'mean texture', 'mean perimeter', 'mean area',
       'mean smoothness', 'mean compactness', 'mean concavity',
       'mean concave points', 'mean symmetry', 'mean fractal dimension',
       'radius error', 'texture error', 'perimeter error', 'area error',
       'smoothness error', 'compactness error', 'concavity error',
       'concave points error', 'symmetry error',
       'fractal dimension error', 'worst radius', 'worst texture',
       'worst perimeter', 'worst area', 'worst smoothness',
       'worst compactness', 'worst concavity', 'worst concave points',
       'worst symmetry', 'worst fractal dimension'], dtype='<U23')

ボストンデータセット

1970 年代のボストン郊外の住宅価格の中央値、犯罪率、チャールズ川からの距離、高速道路への利便性。

from sklearn.datasets import load_boston

boston = load_boston()
boston.data.shape
(506, 13)

さらにこのデータをオライリー先生は拡張し、特徴量を 104 まで増やしたデータセットを作ったという。
13 の 2 組み合わせで、重複ありの 91 種類が追加されてるらしい。

X, y = mglearn.datasets.load_extended_boston()
X.shape
(506, 104)

K-NN アルゴリズム

これは不明なデータ(図では ☆)を、そこから「最も近いデータと多分同じ仲間なのだろう」とか、その捜索範囲で近い点 N 個の平均で、「多分○○の仲間なのだろう」という様な推測をするアルゴリズム
直近1個で決めるとこんな感じ。

尚、星の分類は色で示してる。

mglearn.plots.plot_knn_classification(n_neighbors=1)

f:id:white-azalea:20190318232934p:plain

これを直近3点で考えた時の分類。

mglearn.plots.plot_knn_classification(n_neighbors=3)

f:id:white-azalea:20190318233000p:plain

この様なアルゴリズムを scikit-learn でやってみる。
先ずはデータの読み込みと、学習/試験データへの分離。

from sklearn.model_selection import train_test_split

X, y = mglearn.datasets.make_forge()

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state = 0)

そして、K 近傍法アルゴリズムの設定と学習。

from sklearn.neighbors import KNeighborsClassifier

clf = KNeighborsClassifier(n_neighbors=3)
clf.fit(X_train, y_train)
KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
           metric_params=None, n_jobs=None, n_neighbors=3, p=2,
           weights='uniform')

さて、正答率は?

clf.score(X_test, y_test)
0.8571428571428571
続きを読む

日本のITにもの申す

techplay.jp

youtu.be

Togetter: 「日本のITに物申す・比較できる立場にいる外国人から」まとめ - Togetter

コメントが乱暴なのは、パネリストの言葉が乱暴だったのではなくて、私が乱暴な方がメモが早いからです

パネリストと自己紹介

  • KANI
    WFが主流すぎる…スピードなさすぎだろ。国際社会と戦うならスピードがないとヤられるぞ。
    コミュニケーション力:チーム、コード、知識、発送のコミュニケーションを会社にもプロダクトにも必要だろ
    英語:日本のマーケットだけて戦ってたら防戦一方だ。英語に進めば新しい事が全部できる様になるんだぜ?
    ダイバーシティがなぁ。男性、女性とか年齢とかごちゃ混ぜのダイバースなチームでないといいのができないぞ?
    世界にアピールするならそうでもないとダメじゃないのか?
  • MIKE
    開発古過ぎだろ、WF を使うべき場所はあるけど、なんでもWFし過ぎw
    英語力なさ過ぎだろwww
    新しい方法をほとんど取り入れない。
    どんどん取り入れて、役員の説得がひつようなんだよね。
    シリコンバレーと違って、日本のエンジニアは、自分の仕事に高い意識を持ってない気がする。
    意思決定が遅い。大きい組織ほど、責任を分別して、小さな自己組織化を進めて、意思決定を早くすべきだ。
  • ROOMELELE
    投資がへぼい。レガシー使い過ぎだ。
    人事でみると、ソフト開発者が評価されてない。企業に対して需要なのになんで?
    ソフト開発者の給与が低すぎる。シリコンバレーからみて低すぎる
    最近サンフランシスコ住みにくいw
  • DANIEL
    全然 SaaS とかの活用が進んでない。
    なんか自分たちでどうにかつくりがち。
    保守とかで結局足引っ張られるから、自分で作ってメンテナンスするというのが効率が悪い。
    クラウドが普及してて、サーバ持たなくていいので、どんどんクラウド使って、インフラ維持とか保守やめようぜ。
    職人文化が足引っ張ってないか?最初から一筆書きに完璧を求めすぎだと思う。ちょっとスピード感が厳しい。 日本で一番びっくりするのは開口一番「納豆食べますか』って聞かれる。ちなみに納豆は大好きだw

質問とコメント

  • 失われた20年…この成長のなさの問題。
    なんか高度経済成長期に貯めた貯金で、年金生活になってる感が強い。
    変化できなかった理由はなんだろう?
    • R: 要素が大きいのは労働市場の特別さ。終身雇用のせいで、人を上手に生かされてないきがする。
      転職もしにくいし…同じ企業で転々と移動してて、専門性もつかない。
      専門性が求められてるのに、転々と移動しているとどこ行っても初心者なんだよね。
      人が同じ会社にいて、流動性がないと、成長してる中小が育たないとか、古くて成長しない大企業が人ばっかプールしてたり、日本が弱る。
      Happy でなくてもだらだら会社にしがみつく…体壊してやってるし…
      日本の最大の資源は勤勉さだぞ。そんな貴重な資源が無駄塚おされてる
    • K: 20年前に日本がシリコンバレーになってる事もあり得たんだ。
      日本はハードウェアがうま過ぎて、ソフトが軽視されちゃったんだ。
      起業しにくすぎる。法律として、従業員の作業時間を記録しないとダメ?
      効率化とか考えるなら、働き方自由にしたいのに…。
      もっと働き方というのを法制度も含めて考えないとだめじゃね?
  • 日本がAIで戦うにはどうすればいいだろう?遅れ過ぎてるんだよね
    • D: ダイバーシティとかやり方とか、英語とか、たくさんやることはある。
    • K: 一つ思ったのは、AI ってブームなんだけどさ、逆にどんな問題を解決すべきなのかって方から考えたらいんでない?
      中小企業みると、プロセスが統一化と最適化がすでにされてる。町工場の職人的経験で、最適化されてんじゃん。
      そういう意味ではAIのニーズがなくないかって話。
    • D: バッチファイルでどうこうってのはよくあるんだけど、日本は三人くらいで綺麗に回せちゃってたりする。
      海外だとそれはない。でもこれスケールしない(汗
  • 日本のエンジニアの待遇が悪いのはなんでだろうね?
    • R: 一つは従業員の流動性の問題で、海外だとより良い給料を出せば集まる。こうした人集めの競争によって待遇はよくなる。
      特に優秀なエンジニアだとねぇ。シリコンバレーだと、ビジネスの成功は有能な開発者を確保できるからだ。
      だが、日本はそういう意識がない上に、労働市場もそうではないので、市場原理的にも待遇が上がらない。
      しかも専門性が育たない上に、レガシーシステムのスキルばかり貯めてたらね…。
    • D: 大企業で昔ながらの仕事やってるとこなんだけど、エンジニアがいないと連携できない、SIer にかけると金がかかる。
      で、保守だけのメンバーをアサインしたら、そいつらは楽しそうだった。
      優秀なのはいる。要するに使われ方が悪い。
    • M: シリコンバレーと日本のエンジニアのスキルはそんな変わらん。
      シリコンバレーは、エンジニアのやりたいことってのを突き進められる。
      日本はそれがない。エンジニアから会社の為に提案するという働きもない、環境としてそれも受け入れないから立場もあげにくい。
    • K: そのトーリ
      下請けだらけで、だから3K,5K なんだよね
      シリコンバレーだとエンジニアは貴重なリソースなんだけどね(汗
      Gmail とか Calendar 連携とかもエンジニアが案を出して走ってるんだぜ
      内製すればみんなハッピーになれるんだよ。
  • SIer に丸投げが起きちゃってね…発注する側もそう考えてそうなんだよね。
    発注する側が変わらないとダメなんじゃね疑惑がある、それはどう思う?
    • M: 国内意識が強いよね、賭け事とかしない国だから。強いやつが内製して成功すれば後に続くんじゃないかな(汗
  • 日本とアメリカのいいどこどりできるとしたらどこ?
    • M: シリコンバレーも日本も理想郷ってわけではない。
      これはエンジニア同士が話し合って、コミュニティを作って、情報を共有しながらやってみるしかない。
      それも国際的にコミュニティを持ちたいよね。
  • 日本のこの流動性のなさって、終身雇用や人材プール、総合職問題もそうだけど、高度経済成長期の「人月を増やせば儲かる」のビジネスモデルに法律も含めて過剰な最適化がされすぎた結果だと分析できるんだけど、この流れや法を変えようと思ったら、どういうアプローチをすればいいのだろう?(私の質問)
    • R: 会社に任せちゃうってマインドがよくないよね。
      そういうのをどうにかしないと、法整備しても結果はでない。
    • K: こういう勉強会の場を増やして啓蒙していかないとね。
  • スタートアップでも古臭いと思うことってない?
    • R: ルールとか習慣とかが古臭い。上場準備すると、へんなコンサルとルールがあって、働き方が固定化されちゃうんだよね。
      過剰なお役所体質がだめなんだよね。
    • D: 上場企業が目的になってたりするよね。上場しなくていいんじゃない(笑
      お役所仕事に巻き込まれるよ?WWW
  • WFから変わるにはどうすればいい?
    • R: もちろん方法やプラクティスは必要だけど、マインドセットが重要で、それがないとうまくいかない。
      生産性と8つの習慣、これが重要。検索すればブログ出るので、これは参考になる。
  • 今日は大変な日。日本の確定申告。これレガシーそのもの(笑)。
    累計で 3000 億とかメンテナンス費用かかってるんだよね(汗)。
    レガシーすぎて、アーキテクチャを選んじゃう。今時 JRE6 とかね…。
    なんかこういうのに問題を定義する法律とかってない?
    • M: 米の政府機能も日本と似たり寄ったりでクソですwww
    • K: バックエンドの古いのに対応たラッパー作っちゃう。そのユーザビリティで利用料を取るのが一つのビジネスだよね。
    • M: 最近はよくなってきてるものもある。オバマケアのサイトとか。
  • 今の日本の若い世代、ウキウキワクワクしててほしい。
    こういうアイディアはビジョンがないと生まれない。こういうワクワク感を醸し出すにはどうしたらいい?
    • M: 日本で戦う夢じゃなくて、世界で戦う夢が必要。そういうビジョンがほしいんだと思う。

最後に

  • D: 自分の良さを知る。自分を客観して、世界に挑むべきだ。
  • R: 日本人はみんな弱みは言える、強みは言えない。この強みを意識してくれ。強みを伸ばした方がペイできる。
  • M: 日本はものづくりの歴史がある。それをソフトウェアに向けてくれ。
  • K: 日本がエンジニアリーダーになるには、英語とソフトウェアだ。今やれば来年の今頃にはできるようになってる。まずはやるんだ!

【3/14】アプリからドライバまで現役エンジニアの濃い話#8

sciencepark.connpass.com

このイベント行ってみました。

  • 最初はExcelでいけると思ってたけど途中からしんどくなってきたデータのためのPython Pandas (複数インデックス編):サイエンスパーク株式会社 西村さん
  • WinDbg Previewについて: 日本マイクロソフト株式会社 大橋さん
  • git初心者からgit-flowを使えるレベルになって、リリースとレビューを効率化しよう:サイエンスパーク 須藤さん

公式にある程度資料は乗ってるけど、これら内容のダイジェスト!

最初は Excel でいけると思ってたけど…

西村さん

Excel 使ってたけど、pandas に乗り換えたという話。

四人の頭の位置座標データを認識、線を引くのだけど、リアルタイムだと CSV でもしんどい。
データの種類が増えたとき、二次元表では、横に長く、Excelシートだとシートが増えすぎる。
1シートでマージするとなると、ピボットテーブルするとめんどくせえ(汗

なので pandas 使った。
データの取り回しが楽。そのままバイナリで共有もできるwww

dataFrame.assign でカラムが増やせて、concat で結合していける。
setIndex, sortIndex ソートもできる。いいよね。

WinDbg Preview

大橋さん

WinDbg は新しい Windows 向けデバッガ。
ビジュアライズが非常に強くなった他、速度が早くなった。
Windows StoreからDLできる。

Win10 で搭載された機能でスクリプティングというものがある。

Scripting は、厳密には Store アプリではない。
WindowsApps 配下に exe が置いてある。
コイツの引数でアプリケーションを起動すると、しれっとデバッグコンソールがいじれる。

-c コマンドを突っ込むと、スクリプトとして実行できるようになる。

こいつは、デバッグ実行のインスペクションとインジェクションをスクリプトとして記述しておける。
定型の動作検証が非常にやりやすくなる。

Debug Extension : WinDbg の拡張なのだけど、これまで C/C++ だったものが JavaScript で書ける様になった。
これにより、解析/デバッグスクリプトが、素早く作成/デバッグできる様になった。

現在フィードバックを集めている最中で、日本語でもいいので言えば追加されるかも?

所感

これぞ濃い話!
スクリプト化の何がいいかというと、デバッグに「このスクリプトやってみてー」とか指示できたり、よく詰まる所を自動検証/デバッグできる。

解析がめちゃめちゃ早くなる可能性がある。
ただし、アンドキュメント。

git初心者から...

須藤さん

git は非常に強力な一方で、使い方を決めていかないと、非常に混乱を招く。
このセッションでは、Subversion と比較しながらどういったところが違うのか?どういうメリットがそこにあるのか?などを話されてました。

また、チーム運用の為の、Git-Flow モデル、Hit-HubFlow モデルの運用方法説明も入ってました。

すみません、このブログ書いてる私が構成管理をやる派なので、途中からメモが途切れている…

単なるメモ

qiita.com

長い間 iOS 開発から離れてたけどなかなかええもんできてる。
というか浦島太郎状態。

でもなぁ Ruby Gems なんだよな(汗
OSS あるあるだけど、Gem はバージョン依存地獄をよく味わう印象が…

scikit-lern 練習

ついでに

今回の日記は実は全部 jupitor notebook からのコピペなんだ…すまない。
やばすぎるわこれ(汗

まずは使うライブラリを取り込んでみる

  • numpy : 行列演算ライブラリ
  • scipy : 科学技術計算ライブラリ
  • matplotlib : グラフ作画ライブラリ
  • pandas : データ加工とか表示とか…なんか使った印象でこれ matplot 要るのか?(汗
  • IPython : python シェルの強化拡張ライブラリ
  • mglearn : https://github.com/amueller/mglearn オライリー先生の書籍専属ライブラリ。ヘルパー扱い。
%matplotlib inline

import numpy as np
import matplotlib.pyplot as plt
from scipy import sparse
import pandas as pd
from IPython import display
import mglearn

疎行列を作る

numpy で単位行列を作ってみる

eye = np.eye(4)
print(f"Numpy array\n{eye}")
Numpy array
[[1. 0. 0. 0.]
 [0. 1. 0. 0.]
 [0. 0. 1. 0.]
 [0. 0. 0. 1.]]

Numpy 圧縮行格納形式(CSR)変換

numpy 行列は、sciPy 行列に変換可能

sparse_matrix = sparse.csr_matrix(eye)

print(f"CSR matrix\n {sparse_matrix}")
CSR matrix
   (0, 0)   1.0
  (1, 1)    1.0
  (2, 2)    1.0
  (3, 3)    1.0

行リスト(COO)変換

data = np.ones(4)
row_indicates = np.arange(4)
col_indicates = np.arange(4)
print(col_indicates)
[0 1 2 3]
eye_coo = sparse.coo_matrix((data, (row_indicates, col_indicates)))
print(f"COO \n {eye_coo}")
COO 
   (0, 0)   1.0
  (1, 1)    1.0
  (2, 2)    1.0
  (3, 3)    1.0

Matplot で適当なグラフ作画

x = np.linspace(-10, 10, 100)
y = np.sin(x)

plt.plot(x, y, marker="x")

f:id:white-azalea:20190304231927p:plain

Pandas を使ってみる

data = {
    'Name': ['John', 'Anna', 'Peter', 'Linda'],
    'Location': ['NY', 'Paris', 'Berlin', 'London'],
    'Age': [24, 13, 53, 33]
}
data_pandas = pd.DataFrame(data)

data_pandas
Name Location Age
0 John NY 24
1 Anna Paris 13
2 Peter Berlin 53
3 Linda London 33
data_pandas[data_pandas.Age > 30]
Name Location Age
2 Peter Berlin 53
3 Linda London 33

Iris データを読み込んでみる

from sklearn.datasets import load_iris
iris_dataset = load_iris()

iris_dataset.keys()
dict_keys(['data', 'target', 'target_names', 'DESCR', 'feature_names', 'filename'])

詳細を読み取ってみる。

print(iris_dataset['DESCR'])
.. _iris_dataset:

Iris plants dataset
--------------------

**Data Set Characteristics:**

    :Number of Instances: 150 (50 in each of three classes)
    :Number of Attributes: 4 numeric, predictive attributes and the class
    :Attribute Information:
        - sepal length in cm
        - sepal width in cm
        - petal length in cm
        - petal width in cm
        - class:
                - Iris-Setosa
                - Iris-Versicolour
                - Iris-Virginica

    :Summary Statistics:

    ============== ==== ==== ======= ===== ====================
                    Min  Max   Mean    SD   Class Correlation
    ============== ==== ==== ======= ===== ====================
    sepal length:   4.3  7.9   5.84   0.83    0.7826
    sepal width:    2.0  4.4   3.05   0.43   -0.4194
    petal length:   1.0  6.9   3.76   1.76    0.9490  (high!)
    petal width:    0.1  2.5   1.20   0.76    0.9565  (high!)
    ============== ==== ==== ======= ===== ====================

    :Missing Attribute Values: None
    :Class Distribution: 33.3% for each of 3 classes.
    :Creator: R.A. Fisher
    :Donor: Michael Marshall (MARSHALL%PLU@io.arc.nasa.gov)
    :Date: July, 1988

The famous Iris database, first used by Sir R.A. Fisher. The dataset is taken
from Fisher's paper. Note that it's the same as in R, but not as in the UCI
Machine Learning Repository, which has two wrong data points.

This is perhaps the best known database to be found in the
pattern recognition literature.  Fisher's paper is a classic in the field and
is referenced frequently to this day.  (See Duda & Hart, for example.)  The
data set contains 3 classes of 50 instances each, where each class refers to a
type of iris plant.  One class is linearly separable from the other 2; the
latter are NOT linearly separable from each other.

.. topic:: References

   - Fisher, R.A. "The use of multiple measurements in taxonomic problems"
     Annual Eugenics, 7, Part II, 179-188 (1936); also in "Contributions to
     Mathematical Statistics" (John Wiley, NY, 1950).
   - Duda, R.O., & Hart, P.E. (1973) Pattern Classification and Scene Analysis.
     (Q327.D83) John Wiley & Sons.  ISBN 0-471-22361-1.  See page 218.
   - Dasarathy, B.V. (1980) "Nosing Around the Neighborhood: A New System
     Structure and Classification Rule for Recognition in Partially Exposed
     Environments".  IEEE Transactions on Pattern Analysis and Machine
     Intelligence, Vol. PAMI-2, No. 1, 67-71.
   - Gates, G.W. (1972) "The Reduced Nearest Neighbor Rule".  IEEE Transactions
     on Information Theory, May 1972, 431-433.
   - See also: 1988 MLC Proceedings, 54-64.  Cheeseman et al"s AUTOCLASS II
     conceptual clustering system finds 3 classes in the data.
   - Many, many more ...
print(iris_dataset['target_names'])
['setosa' 'versicolor' 'virginica']
print(iris_dataset['feature_names'])
['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
print(iris_dataset['data'][:5])
[[5.1 3.5 1.4 0.2]
 [4.9 3.  1.4 0.2]
 [4.7 3.2 1.3 0.2]
 [4.6 3.1 1.5 0.2]
 [5.  3.6 1.4 0.2]]
print(type(iris_dataset['target']))
<class 'numpy.ndarray'>
print(iris_dataset['target'].shape)
(150,)
iris_dataset['target']
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])

データを学習用と検証用に分離

train_test_split を利用すると、デフォルトで 75% を学習用、25% をテスト用に分離してくれる。

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(iris_dataset['data'], iris_dataset['target'], random_state=0)

最初にデータを観察

pd.DataFrame から pd.scatter_matrix をしてやると、任意の二組の相関図を出してくれる。
やっべなんだこれ…データ解析捗りすぎんだろ…(汗

iris_dataframe = pd.DataFrame(X_train, columns=iris_dataset.feature_names)
grr = pd.scatter_matrix(iris_dataframe, c=y_train, figsize=(15,15), marker='o', hist_kwds={'bins': 20}, s=60, alpha=0.8, cmap=mglearn.cm3)

f:id:white-azalea:20190304232009p:plain

The機械学習

K-最近傍法で処理してみる…むかしやったなーこんなやつ。

from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=1)
knn.fit(X_train, y_train)
KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
           metric_params=None, n_jobs=None, n_neighbors=1, p=2,
           weights='uniform')

…めっちゃ簡単になっとる…機械学習本見て根性で実装してたのになぁ(汗
まずは適当なデータで特徴量を表示

X_new = np.array([[5, 2.9, 1, 0.2]])
X_new.shape
(1, 4)
prediction = knn.predict(X_new)
prediction
array([0])
print(iris_dataset['target_names'][prediction])
['setosa']

なんかそれっぽい。

早速確認用データを食わせる。

y_pred = knn.predict(X_test)
y_pred
array([2, 1, 0, 2, 0, 2, 0, 1, 1, 1, 2, 1, 1, 1, 1, 0, 1, 1, 0, 0, 2, 1,
       0, 0, 2, 0, 0, 1, 1, 0, 2, 1, 0, 2, 2, 1, 0, 2])

なんか出てきた。 結果を比較

np.mean(y_pred == y_test)
0.9736842105263158

は…(゚o゚;;
これだけでこんな行くんかい…

駄文…というか予想

2019 年の SI 業界予想。

技術は置いておいて、大激変の年になるのは間違いない。

働き方改革」による、プロジェクト運営方法の変更だ。

コレは予測というよりも、やる・やらないの差が、ブラック企業/ホワイト企業をほぼ明確に分ける。
残業規制や有給の強制取得などが盛り込まれており、守らなければブラック企業(公式)扱いになるためだ。
現実問題として、人手不足という現状があり、その上で作業時間を減らす必要が出る以上、仕事の進め方そのものを変え(時間に対しての作業の質をあげるなど)なければ崩壊するか、ブラックに転落するかしかない。

必要なのは組織運営の見直しなのであって、現場に丸投げする様では、社員はきっと逃げるだろう。

この改革は王手のような巨大組織とそこに紐づく下請け SIer がおそらく暫くはブラックに近くだろう。
組織規模が大きいと変化が難しく、でも残業などは回せないから下請けに流す事になる。
下請けは作業量が増えるので、必然的にルールを守りきる事が難しくなる。
なので下請けは選択を余儀なくされるはずだ。

一度ブラックの称号がついてしまうと、中小に限って言えば、こと求人で言えばかなり致命的だろう。
存続も難しくなるはずだ。

blackcorpmap.com

昨今の新卒や転職社もこのサイトは大体知ってるし、考え方はシビアだ。
するとどうなるか?

  • 元請けに対応しきれなくなって下請け事業の撤退、もしくは規模縮小。そこに続く元請け化と内製。
  • 下請けがブラック転落、先細り、元請けも先細る。
  • 元請け共々働き方改革で協力して共に生き残る。

とても個人的な意見(偏見も多分にあるので、あくまで個人的見解)最後のケース望みが薄い…下請けの力関係みたいなものは体育会系の上下関係に等しいものが見える。もちろんそれが全てとは言わないが、体感的にそんなケースが多いように見える。
SIer の体質(というよりは巨大規模の体質)の変わらなさは個人的に見てもやばいレベルな気がする為だ。
加えて言えば出向を行ってる人貸し業も体質変更は死ぬほど難しい。一人一人体質を変えようにも貸し出して手元にいないのだから変えようがない。
(司令だけ渡してアウェーな現場でそんなの守れるわけもなく…度がすぎると退職者を産む)

逆に中小で内製企業は改革は行いやすい。そういう意味では住みやすくなる可能性は非常に高い(変化を受け入れられるならばだ)。
で、ここにきてどうなるかと言えば、だいたい方向性は見えてる。

  • WF/Agile などを適度に使い分けるようになる。

のは大前提だろう。
何か画期的な手法が生まれれば別だが、IT 本家米を見ても Agile 派生が幅をきかせてる位しか見えない。
画期的手法が生まれるというのは望み薄いと思う。
強いて言えば日本人の気質になった Agile にはなるだろうくらい。

WF は不測の事態への対応コストが高すぎて、こう変動期に全部 WF で回すなんて悲惨な未来しか見えない。
規模が小さいからこそ、意思疎通コストの低さを生かして、小さく立ち回れる利点がある。
当たり前だがWFの方が向いてる仕事もある。人命がかかるとか、何を置いても確実性が必要なケースだ。

  • 規模の大きな開発系企業から、IT のアウトソースが減り、内製にシフトし始める。

これも結局同じ流れ。
アウトソースして出来上がったシステムが出てくるのは数ヶ月後、結局うまく最新の局面にマッチしなくなる。
結果として、Agile の様に現在の状況に即した開発に切り替わるが、Agile だとすると要するに開発チームを囲い込む状況に近くなる。
ならば内部で開発チーム置いた方がコストがよくなるという発想だ。

SIer は怖れよ、コレには実例がある。
カイゼン・ジャーニー発刊1周年記念イベント「私たちのジャーニー」 - DevLOVE | Doorkeeper

稼働率100%男が、稼働率100%をやめるジャーニー」というセッションがそうだ。
スライドが見つけれないのが痛いが…

結局こうなるのではなかろうかという予想。

コアな領域では、企業はエンジニアを雇いたがる。そして技術継承も踏まえ、改善しながら持続させる方針をとるはずだ。
一方で、日本は人手不足。小さい開発を行うにしても人手がたらなくなる。
しかしこの小さな開発の為だけに、人員を増やしてしまうと、その後に解雇もしづらく問題になる。

結果として、その隙間を SIer が埋める事になりうる。

今現在 SIer なので、SIer 視点で考えれば

  1. 需要はなくならない、しかし大口の開発は減る。
  2. つまり、大きな規模としての SIer はその規模を縮小せざるを得ず、中小 SIer もその数は減じる。
  3. 中小企業では、ICT 人員を雇う事事態もままならず、これも SIer 頼みになる。

つまり SIer は小さな開発をたくさん受けるような業態に落ち着く。
「売り上げ = こなした数」となるので、人貸しでは稼ぎにならず、社内に仕事を引っ張り込んでパイプラインんぼごとく(リーン)開発するのではなかろうか?