放送大学全科目感想 014 データの分析と知識発見(’20)

  • 情報コース
  • テレビ講義
  • 秋光淳生先生(放送大学准教授)
  • 難易度 ★★★☆☆
  • おすすめ度 ★★★☆☆

Rを使ってデータ分析を行う。生徒さん3人(本業はみんな声優さん)と秋光先生が講義する形式で進む。印刷教材との使い分けができているという意味ではよいが、生徒さんがRで演習しているところは放送授業の無駄遣いって感じもする。講義内容自体はすばらしい。非常に短時間で簡潔に、Rの基本から仮説検定、主成分分析、因子分析のような統計の基本だけではなくニューラルネットワーク、形態素解析などにも踏み込んだ説明をしてくれる。かなりわかりやすい。

第1回

基本的にRの話らしい。学生役が3人。俳優さんという感じ。柔らかい雰囲気。講義ではR-Studioを使う。各項目を見る限りでは結構分析手法が本格的で大変そう。

Society5.0について。もう5.0なの?4.0とかどんなんだったん?あらゆるものがインターネットにつながっているということらしい。

データの利活用について。客観的根拠に基づきに判断せよとのこと。分析結果の読取りはもちろん、結果は言葉で表現できないといけない。データは何を表しているのか?何が読み取れるのか?ということが大事。

データは収集選択し、処理して変換するもの。分析に適するように変換したものを様々な手法を通して解釈し、検証し知識を発見する。ここら辺はウォーターフォール的ではなく行きつ戻りつする。データマイニングは言葉としてはもう古いらしい。

Rの基本操作について。オープンソースで無料らしい。先生macよりwindowsを先に言ってるからwindows派だな。とおもったらmacの画面出てきた。生徒さんはwindowsだ。生徒さんの操作の過程がでてきてる。自分でも操作した方がいいのかなあ。

1+2と入力すると3が出る。変数にも x1 <- 2 のようにすれば値が代入できる。生徒さん操作に慣れなさすぎで、先生がJISキーボードの解説してる。ライブ感はあるが生徒さんが操作してる時間が長い。印刷教材とギャップがあるのでは。。

第2回

レポート作成。平均や分散を計算したりする。生徒さん服が変わったので毎回別の日に収録してるのね。

メモをどう取るか。私はスマホ派ですがカレンダーに書いたりもします。

代表値。最大・最小・平均・最頻・中央値などのこと。今日はこれらを計算するのかな。中央値とかも一発で計算できるのかな?

平均値の定義。いきなり大変な数式になった。平均はμで表す。分散をn-1で割る場合はこれを不偏分散というらしい。

Rは配列をc(combine)で表す。 y1 <- c(80,91,22,67,88) みたいな感じ。mean(y1) で平均、var(y1)で標準偏差が求められる。配列の範囲は[1:5]みたいに表す。Rは0ベースじゃなくて1ベースなのね。y1[1] <- 40 のようにすれば配列の要素にアクセス・代入できる。

Rスクリプトについて。スクリプトのウインドウを開いて、命令を書きまくっていけばバッチ実行できるってわけか。Rはスクリプトがメインだろうなあ。当然ファイル読み込みもできる。コメントは # 井桁で表す。標準出力はprintを使えばいい。

knitrを使ってレポートを作ること。wordでも作れるらしい。でも文章自体はmarkdown形式なんだなあ。便利だよねmarkdown。

マークアップ言語とWYSIWIGの違い。マークアップはHTMLなど文章と命令がセットになっているもののことを言う。Markdownはマークアップを簡略したもののこと。R MarkdownはR独自のMarkdownなのか。例えば“`で囲むとRの命令をそのまま出力することができる。#は見出し。先生けっこう難しいこと話してるから、生徒さんついてけてるか心配や。

第3回

ファイル操作。

Rのデータ型には整数とかbooleanのほかにファクターってのがあるらしい(あとで学ぶ)。データ形式にはスカラ、ベクトル、行列のほかにリスト、フレーム(?)ってのもある。

行列は A <- matrix(c(1,2,3,4,5,6),ncol=3,nrow=2) みたいに代入する。デフォルトでは列ごとに代入だが。nrow=2のとこをbyrow=Tにすると、行から代入する。

リストはジャグ配列と同じ。sasaki<-list(“英語”,…)みたいに代入。

データフレームは一番よく出てくる。データベースとほぼ同じ。リストで列ごとにデータ型を固定したもの。代入はheightとweightの配列があったとき、 D<-data.frame(height, weight) みたいにすればよい。D と入力すれば表が表示される。

ファイル読み込み。csvかタブ区切りが基本みたい。まあ基本はタブだよね。文字列にカンマ入ってたら終わりだから。タブ区切りファイルはread.table(), csvはread.csv()で読める。

生徒さんの操作確認の所が壮大に無駄だぜ!

共分散、相関関係の計算方法。原理原則は高校の数Iでやったことの復習だ。var()が分散+共分散、cor()が相関係数を算出するコマンド。一発で出るので楽じゃん。Rは統計に特化して、頻発する命令を短くしたものなんだな。言語ってそういうものかも。よく出る語彙は短いよね。

第4回

表の作成(クロス集計)について。秋光先生と生徒さんのやり取りはアドリブかな。秋光先生の反応けっこう変わってる。

尺度について。質的データ(名義尺度、順序尺度)と量的データ(間隔尺度、比例尺度)がある。尺度ってのは単位のことだろうか。名義尺度はそのまんま名前のこと。名前にはあんまり意味がない。区別することだけが目的。順序尺度は順位とかアンケートの度合いとか。間隔がどれも等しいわけではないことが特徴。先生が持ってるデジタル式のレーザーポインターみたいなやつ便利だな。間隔尺度は全部等間隔に並んでるデータのこと。比例尺度は何かを基準にして1.5倍とか7倍とかで集計するやり方のこと。比例尺度は0が決まってないといけない。0がないこともある。例えば温度。摂氏0度には存在しないという意味はない。西暦も同じ。これらは比例尺度は使えない。

クロス集計表。2つの事象が起きた・起きなかったことを○○ ○× ×○ ××の4つに分類して正方形の形で集計すること。1つの事象だけ集計したものを周辺度数、全部合計したものを全体度数という。相対度数は3種類になる。行についての相対度数、列についての相対度数、全体度数に対する相対度数。全体度数が一番見やすいかな。項目を増やせば多重クロス表も作れる。

シンプソンのパラドックスについて。全体でみると勉強した人の方が合格しているのに、40歳以上・未満で集計するとどちらも勉強しなかった人の方が合格している。足し合わせるのと個別で見るのでは別の見た目になることが起きる(なんで??)。

相関の考え方。ファイ係数とユール係数がある。どちらもad-bcを計算している。-1~1の値が出る。相関関係があれば1に近づく。事象2つではなく複数になった場合は、期待度数とかカイ二乗値を考える。期待度数は行や列の合計から各項目の値の予想値を計算したもの。これの実際の値とのずれ具合がカイ二乗値らしい。

実際にRを使っていく。table関数でクロス集計表の作成、addmarginsで合計を計算してくれる。

第5回

グラフの作成。生徒さんみんな家で自学してるらしい。えらい。

散布図はplot() 折れ線はtype=o (plot使うってこと?) 円グラフはpie() (色遣いはどうやって指定するんだろ?)棒グラフはbarplot() ヒストグラムはhist() で書く。

円グラフは全体の割合、棒グラフは0から始まる(とは限らない)ことが大事。

見出しはmain= 軸の名前はxlab= ylab= 凡例はlegend で表す。点とか文字とかを追加したければpoints()とかtext()とかを使う。

実際やってみる。やはり折れ線はplot(type=”o”)でやるらしい。b(プロットにかぶらない線), l(ただの線)も使える。text(h1,rownames(h1)) ならテキストがグラフ上に表示される。plot→textの順で呼べばグラフにテキストが追加される、という流れになる。

関数のグラフ。curve(log(x))でlogxのグラフが書ける。curve(sin(x))でsinxのグラフ。これいいな。tex文章に追加できないかな。

ファクターについて。size <- factor(c(“S”, “M”, “L”)) などのように指定する。数値にラベルを付けることもできる。範囲はcut(sh, breaks(c(min(sh)-1, 10, max(sh)), label=c(“N”, “Y”)) などのように指定する。これで年齢層を3分割できたりする。col=rainbowにすれば虹色の棒グラフができる。

生徒さん意味わからなさ過ぎてつかれている。

第6回

検定の話。生徒さんが宿題出されててそれをちゃんとこなしてるのがすごい。Rってグラフきれいですね。

仮説検定。母集団から標本を取り出したとき、標本の特徴から母集団の特徴を取り出すことができるのか?というのが検定。標本を取り出したら、めったに起きないことが起きたのが第1種の過誤、本当には起きていないのに起きたと間違えるのが第2種の過誤。

確率分布の話。連続分布と離散的分布。離散的分布で代表的なのは二項分布。サイコロの出る目の確率でよく使う。10回投げて10回全部表になるのはめったに起こらない。連続分布だと正規分布が一番有名。形は難しいけどこれってたしか積分したら1になるようにしてるんだよね。

Rではdで始まるやつが密度関数。dbinomとか、dnormとか。確率(積分したところの値)ははp、確率点(?)q、乱数はr。検定は.testでカイ二乗検定ならchisq.test。短い名前でだいたい全部の分布が実装されている。よく使うんだね。例えばpnorm(2.0,1)なら2σ以下になる確率で、0.997…となる。

正規分布の曲線、グラフがたったの8行で書けている。すごいね。

rbinom(10,10,1/6)みたいにすれば、10回サイコロを振って何回1が出ますか、という意味になる。二項分布が正規分布に近づく、ということもR上で確かめられる。

カイ二乗検定の実践。先生私プログラマーですけど、意味わかりません。概念的には、プログラム上で乱数を発生させて、カイ二乗検定をして、集計してヒストグラムに表せるってことなんですね。それ以上のことは不明。

第7回

回帰分析。線形の多項式について、データからこれらの係数を求めることが目的。係数aは最小二乗法で求める。実際どうやって内部で求めてるんだろね。行列?→偏微分 = 0で求めるらしい。

偏微分 = 0 を解くと、全体平均を必ず通ることが分かる。回帰曲線の係数aは、分散、共分散を用いて Sxy – aSxx = 0という関係があるらしい(まじで!!??)数学的な意味は印刷教材でじっくり見てみよう。この関係から、変数がn個の場合でも分散、共分散の行列を考えれば、逆行列を出すとaが出てくる。

先生~数学的に厳密であろうとして生徒さんが置いていかれてます!!逆行列も概念的に説明しようとしてますます意味わからなくなってます!でも数学理解できてたらグラフの意味が分かってくるってのは同意です。数学大事。

予測の精度の話。回帰曲線は分散が0でなければ出せるけど、予測が正しいかどうかはなんともいえない。乱数を足したり引いたりするとわかる。測定値の分散というのは、数学的に計算すると、予測値の分散と残差(予測値の差)の分散の和になっていることが分かる。残差の分散が少なければ少ないほど誤差が少ないといえる。そこで残差が少ないほど1に近づく変数を定義し、決定係数と呼ぶ。決定係数が0.9なら残差少ないね、よかったね、ということになる。

偏相関係数について。見かけの相関を説明する係数のこと(いみわからんかったので印刷教材にパス)

Rでやる方法。h2 <- lm(weight~height, data=h1) って打つだけ。lm? 短いな。で、plot(h1), abline(h2) で終わり。これで回帰曲線が書ける。summary(h1) って打つだけでいろんな検定値、平均やら分散やら全部出てくるので便利。str(h2)ってやるとさらに、回帰分析的なデータがいっぱい出てくる。

第8回

主成分分析について。変数をできるだけ減らすことらしい。データの圧縮のこと。先生スライド分かりやすいっすね。

平均化→平均を0にする。標準化→平均化+標準偏差で割って標準偏差が1になるようにする。

主成分分析の導出。y個のデータをz個に減らす場合、y1~yrまでのデータに係数をかけてzmを定義してやる。そうして変数を減らしていく。というわけで係数の導出がまた問題になってくる。概念的には、立体(変数3つ)を平面(変数2つ)で切って膨らんでいる方向を決定していく過程になるらしい。

元々の情報量を射影して、損失(直交する量)がなるべく小さくなるようにするのが原則。いろいろ掛け合わせて足し合わせると、また分散と共分散が出てくる。標準化すれば結局相関係数を使えば係数が出てくることになる。で、これを最小にするためには、ラグランジュの未定乗数法を使う。これは結局、分散・共分散行列の固有値・固有ベクトルを求めることと同じ。これで求まる。

寄与率。主成分分析の決定係数みたいなやつらしい。どれだけうまく予測できているかの尺度。さっきの式で固有値が出てくるけど、この固有値が大きい順に第1主成分、第2主成分というように決定できる。寄与率は、(自分の固有値 / 全固有値)、で求まる。累積寄与率は、でかい方から寄与率を足していって自分まで足したときの値になる。

Rでやってみる。prcomp() を使えば一発。ここまではprcompで何やってるのかっていう解説なのね。

身長体重で主成分分析をすると、両方√1/2にしたやつが第一主成分になる。これでほぼほぼ表せてしまうらしい。ほとんど比例ですねってときはこうなるのかな。身長体重両方を主成分分析したグラフの軸にすると、ほとんど重なってしまう。

主成分分析は回帰分析と似ているけど、回帰分析が縦方向の値を減らすのに対して主成分分析は(回帰直線の?)垂線方向の値を減らしている。ので、目的が違うという話だった。

第9回

因子分析。観測データの背後に潜む因子を見つけること。独自因子、共通因子の2つがある。共通因子がメインで、それにプラスして独自因子を使うって感じらしい。変数より因子の方が数が多くなる。

Y=CF+DEと表現できる(行列)。Cは係数行列、Fが共通因子、Eが独自因子。共通因子、独自因子は平均0、分散1。共通因子、独立因子は独立で相関なし、共通因子間には相関があることもある。ない場合は直交解、ある場合は斜交解。

分析手順。共通因子の個数を決める。カイザーガットマン基準(相関行列の固有値1以上)、スクリープロット(相関行列の固有値のグラフから決める)を使う。→因子負荷量を求める。最尤法、最小二乗法、主因子法がある。→因子軸の回転を行う→解釈。

最尤法について。5回闘って3回勝つ確率は?二項分布で考えると5C3 * p^3 * (1-p)^2 である。(それで??)

因子の回転について。因子負荷量は一意には決まらない。回転によって特徴が分かりやすいような、解釈しやすいような軸を探す。直交回転(バリマックス法)、斜交回転(プロマックス法)がある。

演習。まずread.tableでテーブル読んで、corで相関係数を計算、plot(eigen())で固有値をプロット。これはスクリープロットにあたる。次にw3<-factanal(w1, 2, rotation = “promax”)で因子分析。プロマックス法を使ってる。で、最後にplot(w3)で結果表示。Rで書くと一瞬だね。

eigen()で固有値が1以上なのが2個、スクリープロットで見ても2個だけ固有値でかいから、2つを採用する。今回の例なら統計学+心理学史、精神分析+神経科学+認知心理学にそれぞれ共通因子があるように見える。これをFactor1, Factor2とする。共通因子行列Fが作れる。後は独自因子をつけていけばいい。例だと共通因子で50%くらい説明できたということらしい。

第10回

多次元尺度法。まず距離の公理について。非負性(負にならない)、非退化性(点が等しければ0)、対称性(順序を逆にしても等しい)、三角不等式(a<b+c)。要するに三角形の頂点間の距離について成り立つことだと思う。

古典的多次元尺度法。距離が分かっている仮定で座標を求める。距離行列Dを考える。各成分は各点間の距離の二乗。

各点を表す行列Xから、ヤングハウスホルダー変換をして距離行列Dに変換する。回転、反転、平行移動をして、距離行列を満たすようなXを求める。感覚としては行列ごと二乗するような感じ。これをまたよくわからん変換をして対角化、固有値を求めると中心を原点に来るような座標に変換してあげられる(ぜんぜんわかりませんでした)。

Rでの演習。cmdscaleを使う。サンプルとして山手線の駅間所要時間の二次元行列を使う。readしてからas.distで距離の形に変換、そのあとcmdscaleで多次元尺度法の計算を行う。あとはplotで表示。textで座標の上に名前を表示してあげる。何ができるかというと山手線ができます。cmdscaleでk=2を指定して二次元に変換したところ、65%くらいの情報が説明できているということになった。

第11回

クラスター分析。

前回の山手線のデータを使って階層的クラスター分析。渋谷、原宿が近いのでグループとしてまとまる。もう少し距離を挙げていくと高田馬場・池袋とか、上野・秋葉原とか。サブグループをまとめていくと山手線の西、東でまとまる。最後に全部が一つにまとまって終わり。こういう束ね方を階層的クラスター分析という。樹形図で表現できる。

作り方。まず距離の近い2つの点をまとめる。二点間距離がわかってればできる。で、点をまとめるんだけど、まとめた点と他の点との距離を計算する方法はどうするか。例えばABとCの距離。AB間の真ん中を取るか、ACとBCの最小値にするか。どちらかを採用して、また計算し直す。再計算法には最短距離法、最長距離法、群平均法(距離の平均を求める)、重心法(真ん中を取る)、ウォード法(クラスターが巨大にならないようにする。グループ間の距離が最小になるようにする)がある。

演習。また山手線のデータを使う。read.csv→as,distまでは前回と同じ。そのあと、hclust()でクラスター分析する。method=””に方法を指定。最短距離法はsingle、最長距離法はcomplete、群平均法はaverage、重心法はcentroid、ウォード法はward.D2を指定。ここではウォード法を使う。で、plotでプロットする。

プロットしてみると5つとも距離が結構違う。singleだと品川がハブられてしまう。バランスが悪い。completeだとグループはいい感じになる。centroidも品川がハブられる。ウォード法もいい感じ。

k平均法。k個のグループに分けること。2個点を選んで、2つのグループの代表者として、近い点の代表点のグループに分ける。次に、グループの重心を代表点とする。次に重心からグループを作る。これを繰り返して、グループが変わらなくなるまで続ける。これだと最初ランダムに適当に2点を選んでも必ずどこかに収束する。ただ、収束する点は一意になるわけではない。

Rで演習。read.table→kmeansで終わり。plotとpointsで表示。

第12回

アソシエーション分析。まず因果関係の話。ビールと紙おむつの相関は。紙おむつを買いに来たお父さんがビールも買って帰る。相関というのは、同じ人が買ったという関係がある、ということ。

アソシエーションルール。100人の学生がA~Eの5科目のいずれかを学習する場合、学生+受講科目の組をトランザクションデータという。例えばAとBという科目に注目。n(A) n(B) n(A, B) などの集合が考えられる。A→Bが言える場合は、AがBの部分集合ということになる。するとBに占めるAの割合なども計算できる。

アソシエーションルールの指標。支持度、期待信頼度:自分/全体。支持度はAかつBの割合で、期待信頼度はBの割合。信頼度は条件付確率みたいなもので、リフト値は信頼度/期待信頼度。期待信頼度は打率、信頼度はチャンスの時にヒットを打つ割合。リフト値はチャンスの時のヒットを打つ割合は通常の打率と比べてどのくらいか。

例。100人いてA25人B40人AかつB20人→支持度は20/100=0.2 期待信頼度40/100=0.4 信頼度20/25=0.8 リフト値0.8/0.4=2

Rで演習。arulesというパッケージを使う。Groceriesを読む→as(g0, “data.frame”)で変換→itemFrequency→apriori()で計算。パラメータはlist(confidence=0.5,support=0.01)に設定。→sort(d=T, by=confidence)→inspectで調べる。supportは支持度、confidenceは信頼度かな。

(confidence=0.5,support=0.01) のところはフィルターのようなもので、数値が大きければルールはいっぱい見つかるし、小さければ絞れるが0個しか見つからないかもしれない。

第13回

決定木。グラフの定義から。頂点(ノード)と枝(エッジ)があるのがグラフ。ループがないグラフを木という。集合は分割して木構造にすることができる。図だとわかりやすいんだけどちょっと言葉では表しにくい。分け方は一意ではないので構造は一通りではなく、分割方法に依存する。

とはいっても一番特徴をよく表している木を作りたい。どうするのか。例えば成績データ。属性と点数を関連付けた気を作りたい。属性を説明変数、点数を目的変数と呼ぶ。目的変数がカテゴリー変数(数種類ある)なら分類木。連続変数なら回帰木にするのがよい。今回は点数を70点以上、70点未満に分けているので、分類木がよい。

40歳以上、未満、男性、女性という属性で分類すると、70点以上/未満の散らばり具合はどうか。年齢か性別のどっちがいいかどうやって判断するか。指標となるのはジニ係数。不純度が低くなるように分割する。不純度が低いというのは、別のものを取り出す割合が小さいということ。ジニ係数の計算方法は1 – pa^2 – pb^2。確率の二乗を引いたもの。分割前は0.5だけど、男女で分けると0.444, 0.375。年齢で分けると0.32, 0.32。年齢の方がいいね、ということがわかる。なので年齢を使って木構造にしよう。

Rで演習。rpartというパッケージを使う。read.csv→rpart(?? + ?? + …, method = “class”)→library(rpart.plot)→rpart.plot(extra=2)で。

第14回

ニューラルネットワーク。なんか突然神経の話になった。神経はパルスを出す。シナプスを出して他の神経細胞に伝えていく。電位が上がったり下がったりするんだけどある程度高くなると突然パルスを出す(らしい)。神経細胞をモデル化すると数式にできる。重みを掛け算して足し算して、ある程度のしきい値を超えるとパルスを出す。uを足し算した値とすると、パルスはy=f(u)。f(u)をシグモイド関数という。パラメータの取り方によっては急激に1に近づくようにもできる。

階層型ネットワーク。ニューロン同士は複雑なネットワークを作れる。これを簡単にするために、左から右に繋がっていくようなネットワークを考える。例えば入力、中間層、出力で構成するネットワークを考えることができる。どれも複数あるので、多入力多出力の関数という。

バックプロパゲーション。入力と出力、あと教師信号を用意する。教師信号と出力と比較して誤差を計算し、また後ろに流す。誤差は二乗で評価。結合荷重wは偏微分で-をつける。(よくわからんかった)

最急降下法。結合荷重が誤差に与える影響を計算し、誤差が減る方向に結合荷重を修正するのだけれど、偏微分を使うので、どこに解を持ってくるかが問題となる。局所解に収束してしまうので、初期値によって結果が変わってくる。

汎化と過学習。教師信号が誤差を含むことがある。学習が不十分でもありすぎてもいけない。粒度が問題になる?

Rで演習。サインカーブを用いる。訓練用データと検証用データを使う。nnetライブラリを使う。nnet(output~input, data=train, size=1, maxit=1000)→predict()でできる。あとはplot, pointでグラフを書いて検証。中間層を大きくしたり、イタレーションを大きくすると時間がかかる。あんまり中間層が大きいと過学習になる。

第15回

テキストマイニング。まず形態素解析から。自然言語処理と同じ話や。文を語に分解するのが形態素解析、これを組み合わせると構文解析になる。「横浜に行った」なら「横浜(名詞)」「に(助詞)」「行っ(動詞)」「た(助動詞)」。ソフトウェアで有名なのはChasen, MeCab, Jumanなど。

演習。青空文庫テキストを使う。RMeCabを使って、docMatrix(“C15, pos=c(“連体詞”,”副詞”))を実行、a1[row.names(a1) != “[[LESS-THAN-1]]”,] で1回以上出てくる集合をゲット、さらにa3[row.names(a1) != “[[TOTAL-TOKENS-1]]”,]で数を数える。さらにt, distで距離を取って、cmdscale, kmeansを使い多次元尺度法にかける。すると指定した副詞、連体詞を含むような文章をグループ分けすることができる。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です