intel Pythonが(一定条件下で)早すぎた


結論から言うとsciktlearnでものすごく早くなりました。

SystemMonitorを見ると、一部の噂によるようなCPUコアをすべて使ってくれているかと言うとそうではなく、コード最適化によりCPUの無駄な処理を省いてくれている感じがする。この辺は技術書を精読しないと不明だが、Vanila Pythonよりは圧倒的に早くなる処理があることがわかった。

Model Name: iMac
      Model Identifier: iMac19,1
      Processor Name: Intel Core i5
      Processor Speed: 3.7 GHz
      Number of Processors: 1
      Total Number of Cores: 6
      L2 Cache (per Core): 256 KB
      L3 Cache: 9 MB
      Memory: 24 GB

intelpythonはAnacondaで入れることが推奨されていますが、個人的にAnacondaは好きではないのでこんな感じで構築しました。
(思わぬ罠があったりしてjupyterになるとidpではなくbaseで走ってしまったりして設定に結構苦労しました)

 pyenv
    └── anaconda3-2019.10
        └── intel_python

双方ともネットワークを遮断し再起動させてから10分後に計測開始させました。
さて結果です。

統計局に非正規雇用の従業員に向けたアンケートで非正規雇用の形態別にまとめられた面白いデータが有ったためヒートマップで率を見てみた。データは2017年のもの。

データ

統計局「男女,教育,現職の雇用形態についている理由,現職の従業上の地位・雇用形態別人口(非正規の職員・従業員)-全国,全国市部,都道府県,都道府県市部,政令指定都市」

ユニークを見ていく

def show_columns(dfl, num=10):
    for i in dfl.columns:
        print('----------------')
        print(i)
        print(dfl[i].nunique(), '個のユニーク')
        print(dfl[i].unique()[:num])
df["value"] = pd.to_numeric(df["value"], errors='coerce')
show_columns(df, 117)
'''

tab_code
1 個のユニーク
['001-2017']
----------------
表章項目
1 個のユニーク
['人口']
----------------
cat01_code
1 個のユニーク
[0]
----------------
男女
1 個のユニーク
['総数']
----------------
cat02_code
9 個のユニーク
[ 0  1 11 12 13 14 15 16 17]
----------------
教育
9 個のユニーク
['総数' '卒業者' '小学・中学(卒業者)' '高校・旧制中(卒業者)' '専門学校(2年未満)(卒業者)'
 '専門学校(2~4年未満)(卒業者)' '専門学校(4年以上)(卒業者)' '短大(卒業者)' '高専(卒業者)']
----------------
cat03_code
15 個のユニーク
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14]
----------------
雇形理由
15 個のユニーク
['総数' '主に自分の都合のよい時間に働きたいから' '主に家計の補助・学費等を得たいから' '主に家事・育児・介護等と両立しやすいから'
 '主に通勤時間が短いから' '主に専門的な技能等を生かせるから' '主に正規の職員・従業員の仕事がないから' '主にその他'
 '自分の都合のよい時間に働きたいから' '家計の補助・学費等を得たいから' '家事・育児・介護等と両立しやすいから' '通勤時間が短いから'
 '専門的な技能等を生かせるから' '正規の職員・従業員の仕事がないから' 'その他']
----------------
cat04_code
7 個のユニーク
[0 1 2 3 4 5 6]
----------------
現職従地位・雇形
7 個のユニーク
['総数' 'パート' 'アルバイト' '労働者派遣事業所の派遣社員' '契約社員' '嘱託' 'その他']
----------------
area_code
117 個のユニーク
[    0     1  1000  1001  1100  2000  2001  3000  3001  4000  4001  4100
  5000  5001  6000  6001  7000  7001  8000  8001  9000  9001 10000 10001
 11000 11001 11100 12000 12001 12100 13000 13001 13100 14000 14001 14100
 14130 14150 15000 15001 15100 16000 16001 17000 17001 18000 18001 19000
 19001 20000 20001 21000 21001 22000 22001 22100 22130 23000 23001 23100
 24000 24001 25000 25001 26000 26001 26100 27000 27001 27100 27140 28000
 28001 28100 29000 29001 30000 30001 31000 31001 32000 32001 33000 33001
 33100 34000 34001 34100 35000 35001 36000 36001 37000 37001 38000 38001
 39000 39001 40000 40001 40100 40130 41000 41001 42000 42001 43000 43001
 43100 44000 44001 45000 45001 46000 46001 47000 47001]
----------------
地域区分
117 個のユニーク
['全国' '全国市部' '北海道' '北海道市部' '札幌市' '青森県' '青森県市部' '岩手県' '岩手県市部' '宮城県' '宮城県市部'
 '仙台市' '秋田県' '秋田県市部' '山形県' '山形県市部' '福島県' '福島県市部' '茨城県' '茨城県市部' '栃木県'
 '栃木県市部' '群馬県' '群馬県市部' '埼玉県' '埼玉県市部' 'さいたま市' '千葉県' '千葉県市部' '千葉市' '東京都'
 '東京都市部' '特別区部' '神奈川県' '神奈川県市部' '横浜市' '川崎市' '相模原市' '新潟県' '新潟県市部' '新潟市'
 '富山県' '富山県市部' '石川県' '石川県市部' '福井県' '福井県市部' '山梨県' '山梨県市部' '長野県' '長野県市部'
 '岐阜県' '岐阜県市部' '静岡県' '静岡県市部' '静岡市' '浜松市' '愛知県' '愛知県市部' '名古屋市' '三重県'
 '三重県市部' '滋賀県' '滋賀県市部' '京都府' '京都府市部' '京都市' '大阪府' '大阪府市部' '大阪市' '堺市' '兵庫県'
 '兵庫県市部' '神戸市' '奈良県' '奈良県市部' '和歌山県' '和歌山県市部' '鳥取県' '鳥取県市部' '島根県' '島根県市部'
 '岡山県' '岡山県市部' '岡山市' '広島県' '広島県市部' '広島市' '山口県' '山口県市部' '徳島県' '徳島県市部' '香川県'
 '香川県市部' '愛媛県' '愛媛県市部' '高知県' '高知県市部' '福岡県' '福岡県市部' '北九州市' '福岡市' '佐賀県'
 '佐賀県市部' '長崎県' '長崎県市部' '熊本県' '熊本県市部' '熊本市' '大分県' '大分県市部' '宮崎県' '宮崎県市部'
 '鹿児島県' '鹿児島県市部' '沖縄県' '沖縄県市部']
----------------
time_code
1 個のユニーク
[2017000000]
----------------
時間軸(年次)
1 個のユニーク
['2017年']
----------------
unit
1 個のユニーク
['人']
----------------
value
2737 個のユニーク
[21325700. 19530900.   892700.   735200.   334200.   182900.   143800.
   189800.   156600.   380400.   320200.   181500.   146500.   133100.
   150500.   121100.   276400.   226300.   488800.   441000.   336700.
   287200.   339300.   286000.  1353100.  1236400.   232200.  1114300.
  1067300.   165600.  2330100.  2319600.  1569400.  1710700.  1642400.
   697600.   266100.   147000.   336200.   325700.   125200.   157200.
   144800.   181200.   160200.   121800.   106500.   144700.   122700.
   339200.   272400.   339000.   288800.   641000.   603900.   120600.
   131400.  1329600.  1257400.   395200.   310400.   272900.   259300.
   245500.   469500.   446000.   267500.  1535900.  1505000.   474000.
   139100.   918600.   876700.   261900.   220100.   175100.   141400.
   111500.    83700.    61400.   103100.    93500.   282100.   265900.
   108900.   459200.   430400.   204500.   213200.   204400.    92400.
    69200.   139900.   117900.   197000.   179500.    98400.    80700.
   869100.   759500.   148300.   288600.   123500.   103600.   207600.
   186600.   264800.   216200.   118900.   169800.   162800.   168400.
   141500.   262400.   233200.   253800.   193400.]
'''

学歴や動機や地域ごとに雇用形態に就いた理由が記載されている。
不要なデータを削いでいく。

df_01 = df[(df['教育'] == '総数')
           & (df['雇形理由'] != '総数')
           & (df['教育'] == '総数')
           & (df['地域区分'] == '全国')
           & (df['現職従地位・雇形'] != '総数')]

xyを指定してヒートマップを出してみる

df_pivot = pd.pivot(data=df_01, columns='現職従地位・雇形', index='雇形理由', values='value')
s = sns.heatmap(df_pivot, annot=True, cmap='Blues',
                fmt="0", linewidths=1, linecolor="white",)

plt.savefig('heat.png')
plt.close('all')

パート・アルバイトは法律上は同じ雇用形態であるはずだが何故か分けられている。
統計局に依るとパートの定義は下記の通りらしい。

16A-Q07 パート及びアルバイトの人数
労働力調査に関するQ&A(回答)

しかし読んでも特にパート・アルバイトを分ける理由が見当たらない。

パート・アルバイトを選んだ理由としてはあいた時間を使いたいから、家計や学費を'補助'したいからという理由が多い。

パート・アルバイトの比率が大きすぎて他のマップが見えてこないので正規化をする。
Pandasには標準で平均や標準偏差が用意されている。
こういうときにPandasはとても楽であるし、何より楽しい。

df_pivot=(df_pivot-df_pivot.mean())/df_pivot.std()

そしてプロット

嘱託契約者は専門的な技能が要求されているため選択されている面が強い
マップからは嘱託・パート・アルバイトは比較的ポジティブな理由で就労しているが、派遣社員・契約社員は正規社員になれなかったからというネガティブな理由が多い傾向がある。
非正規雇用の問題といっても、非正規雇用の中の契約社員・派遣社員が特に不満を抱えていることがよくわかる。逆にパートに限って言えばそれほど不満はないということが見えてくる。