Data分析とAlgorithm ~奥深い数学の世界~
https://gyazo.com/3fde207a4e22bc2d5043026b8071822d https://docs.google.com/presentation/d/1chQDUQFCrbc7bPAXUpZSo-zVeMwzkeR3Wf2No_3NkRs/edit#slide=id.gb83e38e90d_0_504
hr.icon
hr.icon
大前提と知っておくこと
あなたの見ている「分析結果」にはバイアスがすでにかかっている
人は次元が高いと理解ができない(納得ができない)
直感的に理解できるのは二次元まで
わかりやすくするために「データ分析者」の意志によって情報削減されている
⭐基本は数字。四則演算できるから「近い/遠い」「似ている/違う」が判断できる
四則演算はじめとした「数字」のルールがある
分析の本質は比較。
比較して初めて、良し悪し判断ができる
比較対象の選び方が肝
だから、分析をする時は
情報量を少なくする。
まずは情報量を圧縮するために「数字」にする
人が見る場合は
「近い/遠い」「似ている/違う」が判断しやすい「グラフ」にする
データ分析が何か、と問われれば、僕は「人間の脳の限界に合わせて優しく嘘を付く技術」と答えています。「嘘」というのはやや極端な言い方で「情報圧縮」と言うのが適切なのですが、わかりやすく「嘘」という表現を使っています。
データ分析というのは、情報量の観点から述べるのであればとても不可思議な行為です。せっかく1000万人分のデータという豊富な情報が存在しているのに、それを敢えて「平均」や「中央値」といった形でグッっと一気に情報量を減らしてしまいます。
そこで、せっかく大量にあった情報の多くが失われます。その犠牲と引き換えに何を手にしているのか?それは「わかりやすさ」です。
この「わかりやすさ」というのは"Human Friendly"、つまり人間にとってのわかりやすさ、という意味になります。もし仮にAIのような処理能力を持った生物がいた場合に、この「平均を取る」という情報圧縮の処理は不可解にしか感じられないでしょう。何故か1000万人分の豊富で正確なデータが手元にあるのに、それを「平均」という、情報量が損なわれたものに変えてしまっているのですから。
分析とは基本的に「比較」です。
数字がポツンとあっても何も意味がない
絶対に比較対象が必要
基準と比較することで良し悪しを判断する
テストで80点とった。これはすごい?
30点だったら低い?
比較せねばならない
どう比較するか?
⭐よく使うのは「割合」「平均」「偏差値」当たり
100点満点
平均60点
偏差値70
それぞれ印象が違う。
⭐さあこの「平均」「偏差値」は信じていいのか?
全国での調査なのか
進学校での調査なのか
「誰と比較するか」が最重要
比較したいのは得てして、個人じゃない。
⭐「どのGroupと比較するか」を考えていく。
統計の世界では「平均」と「分散」が最重要
この2つで「データ集団の特徴」が大まかにわかる
ただし、簡単に出せない。
手元にあるデータはほんの一部だから。
少量から、大規模データの傾向を推測する必要がある
⭐推測するために「統計学的推論」を行う
https://gyazo.com/7770124d2b4bad1d20630a385f227b85
手法はたくさんあります。
⭐だって「標本データの偏り/量」と「推測したいもの」によって、手法の良し悪しが決まるから
https://gyazo.com/9d3ca350dd94a34deb9505772ab4e66c https://www.statweb.jp/method/sentaku-houhou
「平均」と「分散」を推測することが目的
「検定」は、目的や状況に応じて、適したものを使う必要がある
今までは「1変数」の話をしてきた
テストで言えば数学の点数だけ。
今度は5教科で考えてみる
⭐5教科となると傾向が気になってくる
数学の点が高いと理科の点が高い
国語の点が高くても英語の点が高いとは限らない
....
⭐コンピュータ。実はできることがほんのちょっと
実はできないこと(=工夫して、できるようにする)
3つ以上のものから、一度の操作で、特定のものを選ぶ
Aの中身とBの中身を直接交換する
文字の比較をする
できること
2つの数値を比較する
数値の足し算をする
Aの中身をBにコピーする
同じことを繰り返し行う
条件と照らし合わせて、2つに分岐する
⭐小さな「できること」を組み合わせて「できないこと」をなくしている
これがアルゴリズム。
一つずつ実現方法を考えよう
⭐3つ以上のものから、特定のものを選ぶ
「一度の操作」でなければいける
code:py
result = -1
# listの数字を一つずつチェックしていく
for number in list:
# resultに暫定一位が保存されているので
# listの数字と比較し、
# resultより大きかったら一位を更新する
if number > result:
result = number
print("listの中で最も大きい数字は" + result )
⭐Aの中身とBの中身を交換する
「直接」でなければいける
code:py
a = 25
b = 2
temporary = 0
# まず上書きされて消えないように
# bの値をtemporaryに非難させる
temporary = b
# bにaの値を上書きする
b = a
# 非難させておいたbの値(temporary)を使って
# aにbの値を上書きする
a = temporary
文字の比較をする
文字を「数字」に変えればいける
そもそもComputerは「文字」を扱えない
table:文字コード対応表
区 点 JIS SJIS EUC UTF-8 UTF-16 字
03 33 2341 8260 A3C1 EFBCA1 FF21 A
03 34 2342 8261 A3C2 EFBCA2 FF22 B
03 35 2343 8262 A3C3 EFBCA3 FF23 C
03 65 2361 8281 A3E1 EFBD81 FF41 a
03 66 2362 8282 A3E2 EFBD82 FF42 b
03 67 2363 8283 A3E3 EFBD83 FF43 c
04 01 2421 829F A4A1 E38181 3041 ぁ
04 02 2422 82A0 A4A2 E38182 3042 あ
04 03 2423 82A1 A4A3 E38183 3043 ぃ
04 04 2424 82A2 A4A4 E38184 3044 い
04 05 2425 82A3 A4A5 E38185 3045 ぅ
04 06 2426 82A4 A4A6 E38186 3046 う
例(SJIS)「A = 2341」「B = 2342」 全ての文字はComputer内部で「数字」で管理されるため、比較ができる
code:py
'A' < 'B' # true。正しい
'a' < 'b' # true。正しい
'A' < 'a' # true。正しい
'B' < 'a' # true。正しい
'ぁ' < 'あ' # true。正しい
数字のはずなのに、アルファベットが入る。これは16進法表記だから。
table:対応表
字 UTF-8(16進法) 10進法 8進法 2進法
A EFBCA1 15711393 73736241 111011111011110010100001
B EFBCA2 15711394 73736242 111011111011110010100010
a EFBD81 15711617 73736601 111011111011110110000001
b EFBD82 15711618 73736602 111011111011110110000010
table:2進法と16進法
2進法 16進法 10進法
0000 0000 00 0
0000 0001 01 1
0000 0010 02 2
0000 0011 03 3
0000 0100 04 4
0000 1010 0A 10
0000 1011 0B 11
0000 1111 0F 15
0001 0000 10 16
規則正しく並んでいるので「半角⇔全角」「大文字⇔小文字」の変換が簡単
例:半角⇔全角
A (EFBCA1) 「1110 1111 1011 1100 1010 0001」
a (EFBD81) 「1110 1111 1011 1101 1000 0001」
2bit(=2箇所)の「0⇔1」の変換をすることで半角⇔全角の変換ができる
例:
ア (E382A2) 「111000111000001010100010」
ア (EFBDB1) 「111011111011110110110001」
11bit(=11箇所)の「0⇔1」の変換をすればOK
参考)
実は四則演算も2進法で計算している
足し算(10 + 3 = 13)
10 「1010」
3 「0011」
13 「1101」
筆算として「くりあがり」を計算すればできそうですねsawachin.icon
掛け算(2 x 3 = 6)
「足し算 + シフト演算」で実現できる
引き算( 5 - 2 = 3)
「足し算 + 2の補数」で実現できる
割り算
「引き算 + シフト演算」で実現できる
シフト演算とは
「0,1の配列を一桁左/右に移動させた」もの
例:
2(0010)のシフト演算結果は4(0100)
3(0011)のシフト演算結果は6(0110)
つまり、シフト演算をすると「2倍」になる
「2の補数」とは
「全ての0⇔1を入れ替え」をして「1を足した」もの
例:
2(0010)の補数は14(1110)
5(0101)の補数は11(1011)
引き算の実現に使う
「12 - 3」は
「12 + 3の『2の補数』」で行う
12 「 1100」
3 「 0011」
~3 「 1101」
12 + ~3 「1 1001」
9 「 1001」
置換。最近の言語だと簡単に記述できるようにプログラミング言語が設計されている
code:py
a, b = b, a
code:py
# 組み込み関数を利用せずに置換を行う
temporary = b
b = a
a = temporary
順序交換もそう。専用の関数が用意されている
code:py
code:py
# 組み込み関数を利用せずにソート(並び替え)を行う
def bubble_sort(list):
loop = True
while loop:
loop = False
for i in range(len(list) - 1):
loop = True
return list
基本は「一番早く, specも必要としないアルゴリズム」で実装してくれる
が…実装されないものもある
⭐万能なアルゴリズムはありません
ソートでも最速と言われる「クイックソート」
条件によってはめちゃ遅いです
一般的によく使われるデータ構造の「リスト」と「配列」
似ているようで違います。
リストはwrite/add/deleteが得意な分、readに弱い
配列はreadが得意な分、write/add/deleteに弱い
アルゴリズムと同じように、全ての技術にはメリ/デメがある。
だから、「目的/利用シーンを明確にすること」と「技術の歴史から似たもの同士の差異を把握すること」が大事
コンピュータの根幹は「アルゴリズム」です。
「人が直感で解く問題」を「Computerで解ける問題」にする方法
「Computerで解ける」ということは
規模が大きくなっても解ける(人間だと、認識/記憶できる限界が来る)
対象となる問題を帰納的に解く場合にくり返し出現する小さな問題例について、解を表に記録し表を埋めていく形で計算をすすめ、冗長な計算をはぶくアルゴリズムのこと
最適解を探し出すためのアルゴリズム
データ分析の大きな歴史
データとは基本「数字」
数字にしないと「関係性(≒距離)」を整理できない。
数字だと、機械も扱うことができる。
数字をどう扱ってきたかの歴史
記述統計学(集団の特徴を知る)
データが100個(100人のテスト結果)
「数学で70点」
平均値→→→ 50点
100点 50人
0点 50人
平均値、中央値、標準偏差(偏差値)、分散
推計統計学(部分から全体を推測する)
統計の世界だと「1000件」あると、元の集団の平均値がわかる
推計…つまり推測している。
「平均値」
「分散」
「正規分布」
ベイズ統計学(あらゆるデータ分布に対して、推測する)
多くの統計的手法において、データが正規分布に従うことを仮定します。
応用範囲は広いんだけど、使う人の恣意性が取り込まれてしまうという問題と積分計算が複雑で解析的に解けないことが多いという問題があって長い間日の目を見ることがなかったんだ
データを機械でどう扱ってきたかの歴史
机上の計算
解析的アプローチ
解析学(かいせきがく、英語:analysis, mathematical analysis)とは、極限や収束といった概念を扱う数学の分野
計算機
関数(ポテンシャル面)の傾き(一階微分)のみから、関数の最小値を探索する連続最適化問題の勾配法のアルゴリズムの一つ。
このアルゴリズムの最も一般的な応用は多重積分を数値的に計算することである。
複雑な関数でもマクローリン展開を使うと十分実用に耐えうる数値に直せる
データ量/処理量に対するPCのアプローチ
シンプルに性能を上げる
CPUのクロック数
3.5GHz = 3.5 * 1000^3 回/ 秒
→→コア数が増えていく。
3.5 GHz x 4→14GHz
PCスペック
計算の仕方(アルゴリズム)を変える
ソートアルゴリズム(順序替え)
バブルソート
クイックソート
O(N)→→計算量
分散して、みんなで処理する
データは分散しにくい
MapReduce ( 2004年 by Google)
Apache Hadoop ( ???年 )
CPU
メモリ(上から速い順)
CPU;
キャッシュ1次
キャッシュ2次
キャッシュ3次
RAM:
HDD/SSD:
Apache Spark ( 2014年 )
(↑↑Glue, Athena)
RAMにデータを置いている(=速い)
Glue 1つごとに 4CPU, 16GB memory
データってどう使うの?
意思決定をするために、シンプルにする(情報をそぎ落とす)
基本は「比較」と「分布」
比較・分布のために、「軸」を作る。
比較。そのために割合。
相対評価・絶対評価の話
偏差値の話
間違った比較。
平均と中央値
分布、箱ひげ図
(高等技術)微分。傾きから理解する。
機械学習とは
広く、「データ」「機械学習」の領域を考えてみる
特徴量エンジニアリング
参考資料
データ分析が何か、と問われれば、僕は「人間の脳の限界に合わせて優しく嘘を付く技術」と答えています。「嘘」というのはやや極端な言い方で「情報圧縮」と言うのが適切なのですが、わかりやすく「嘘」という表現を使っています。
データ分析というのは、情報量の観点から述べるのであればとても不可思議な行為です。せっかく1000万人分のデータという豊富な情報が存在しているのに、それを敢えて「平均」や「中央値」といった形でグッっと一気に情報量を減らしてしまいます。
そこで、せっかく大量にあった情報の多くが失われます。その犠牲と引き換えに何を手にしているのか?それは「わかりやすさ」です。
この「わかりやすさ」というのは"Human Friendly"、つまり人間にとってのわかりやすさ、という意味になります。もし仮にAIのような処理能力を持った生物がいた場合に、この「平均を取る」という情報圧縮の処理は不可解にしか感じられないでしょう。何故か1000万人分の豊富で正確なデータが手元にあるのに、それを「平均」という、情報量が損なわれたものに変えてしまっているのですから。
Data分析の歴史
元々は
(机上の)統計解析
信頼できるデータによって、技術者が人力で分析
統計解析とは、大量のデータを収集・探索・分析し、その結果を提示することを通じて、データに含まれるパターンや傾向を明らかにする科学です。
統計学は、経験的に得られたバラツキのあるデータから、応用数学の手法を用いて数値上の性質や規則性あるいは不規則性を見いだす。
統計学は記述統計学(descriptive statistics)と推計統計学(inferential statistics、推測統計学とも)に分類できる 20世紀に入ると、ウィリアム・ゴセット、続いてロナルド・フィッシャーが農学の実験計画法研究をきっかけとして数々の統計学的仮説検定法を編み出し、記述統計学から推計統計学の時代に移る。ここでは母集団から抽出された標本を基に、確率論を利用して逆に母集団を推定するという考え方がとられる。続いてイェジ・ネイマン、エゴン・ピアソンらによって無作為抽出法の採用など現代の数理統計学の理論体系が構築され、これは社会科学、医学、工学、オペレーションズ・リサーチなどの様々な分野へ応用されることとなった。 推計統計学は精緻な数学理論となった反面、応用には必ずしも適していないとの批判が常にあった。
これに呼応して、在来の客観確率を前提に置く統計学に対し、それまでごく少数によって提唱されていたにすぎなかった主観確率を中心に据えたベイズ統計学が1954年にレオナルド・サベージ(英語版)の『統計学の基礎』によって復活した。ベイズの定理に依拠する主観確率の考え方は母集団の前提を必要とせず不完全情報環境下での計算や原因の確率を語るなど、およそ在来統計学とは正反対の立場に立つため、その当時在来統計学派はベイズ統計学派のことを『ベイジアン』と名付けて激しく対立した。しかし主観確率には、新たに取得した情報によって確率を更新する機能が内包され、この点が大きな応用の道を開いた。今や統計学では世界的にベイズ統計学が主流となり、先端的応用分野ではもっぱらベイズ統計学が駆使されている。
PCで統計解析
大規模データ分析したいが…統計学での「前提条件」に合わない。
異常値・欠損値があっても処理できる理論を。
基本的に予測の精度を向上させるには、データの前処理を確実に行うことが重要だと考えています。一般にAIモデルのチューニングや改良という作業は最後の1%の精度を追求するときに行う、というイメージで差し支えないと思います。一見、モデルのチューニングや改良はデータサイエンティストの花形作業と思われがちですが、実はほとんど行わず、データの前処理が大半を占めるのです
1990年代
データマイニング
大規模データの分析
パターン認識、機械学習、統計学を駆使して行う
人間の脳にとっては、幼児・児童の発達段階において知覚・言語能力を獲得していく上でごく自然に行う過程でありながら、コンピュータで人為的に実現するには精度・速度どちらの面についても困難を伴う。
近年、「認識とは、結局どのクラスに分類されるかという識別問題に帰着することができる」という立場の研究が、人工知能や統計の研究と融合して大きな成果をあげている。識別器としては、ニューラルネットワーク、SVM(サポートベクターマシン)、k近傍識別器、ベイズ分類など、機械学習により大量のデータから識別パラメータを構成する非ルールベースの手法が主流である。
パーセプトロン、ニューラルネットワーク、判別分析、SVM、Boosting、部分空間法
機械学習アルゴリズムは、タスクを実行するように明示的にプログラムされることなく予測や決定を行うために、「訓練データ」として知られるサンプルデータに基づいて数学モデルを構築する。
統計的機械学習とは、機械学習のうちデータの確率的な生成規則を学習するものを指す。 2010年代
ビッグデータ
膨大な非構造化データの蓄積
NoSQL, Hadoopによりリアルタイムに操作
Hadoopの起源は、2000年代初頭にWebクローラーを開発した、オープンソース・ソフトウェア( OSS )のパイオニアであるApache Nutchプロジェクトに遡ります。
MapReduce。「並列でできることならば並列処理とそこへの分散指示を分けよう」という発想
PCでの処理(CPU)は基本逐次処理(長く繋がった複雑な処理)に最適化されている <CPUとGPUの処理の特徴>
(1) GPUの画像処理、機械学習計算
・シンプルな演算処理である
・順番を気にせず一度に計算してもよい
(2) CPUの汎用処理 ・複雑な命令の組み合わせ ・命令処理する順番が決まっており順次処理するしかない
CPUはせいぜい3〜5の並列処理が限界でした。一方、最新のGPUでは、512もの並列処理を実現できるようになっています。
CPUとGPUで、並列処理可能な数が大きく異なることがわかります。
ベクトルプロセッサはスーパーコンピュータで使われるような仕組み