Rを使って葉っぱを分類してみた①(k近傍法)
今回はk近傍法をRで動かしてみます。
使用するデータセットは以下のサイトから引用します。
https://archive.ics.uci.edu/ml/datasets/Leaf
UCI Machine Learning Repository: Leaf Data Set
40種の葉っぱについて、形状データと手触り(texture)データが記録されています。今回はこのデータセットを用いて、多クラス分類の手法の一つであるk近傍法を利用してみます。
変数1~7の形状データを用いて散布図を描いてみます。
変数8~14の手触り(texture)データは次の通りになります。
変数とクラスが多いため、散布図で一見して評価するのは難しいように思われます。
今回利用するk近傍法は、直近のk点の学習データから多数決を行って最も多いクラスに分類を行う直感的に分かりやすい方法になります。
データセットを区分せず、学習データ=テストデータとすると次のような結果になりました。
k=3の場合の識別率 0.7764706
k=5の場合の識別率 0.7264706
k=10の場合の識別率 0.6588235
多数決に用いるデータ数を増やすと識別率が落ちることが分かりました。
参考に以前取り上げた線形判別分析も行ってみると、次の通りになりました。
線形判別分析の識別率 0.8705882
線形判別分析の方が良い結果を得られてしまいました。結果の評価の仕方は難しいですが、クラス内でのデータの距離が大きいことで、kNNが機能しにくくなっている可能性があります。
次回はSVMやNaiveBayesを取り上げたいと思います。
今回使用したソースコードは以下の通りです。
統計検定準1級に効率的に合格する勉強方法と参考書籍
本記事では自分が統計検定準1級を受験した際の勉強方法についてまとめます。
1.試験の特徴
統計検定は専用の参考書などがまだ少なく、独学を中心に勉強を進める必要があります。その一方で試験範囲は非常に広いものになっており、全範囲を満遍なく学習しておく必要があります。アクチュアリー試験の数学と比較すると、多変量解析や機械学習のトピックが含まれていることが注意点になります。
統計検定準1級の試験問題は、前半の選択問題及び部分記述問題、後半の論述問題に大きく分かれます。それぞれに足切りなどは設定されていないようですが、時間配分が偏らないように配慮するとともに、バランスよく点数をとれるように実力をつける必要があります。自分が受験した際には、前半の計算問題などで確実に得点できるよう問題演習を行うとともに、後半で的外れな記述をしないように過去問の研究を行いました。
また試験時間が120分とかなり短いことから、効率的に問題を解くことも重要になります。過去問を解く際などには実際に時間を計って練習を行いました。普段使用することが少ない関数電卓も迷いなく操作できるようにすることを心がけました。
2.使用した参考書
参考書としては下記の書籍を利用しました。
日本統計学会公式認定 統計検定 1級・準1級 公式問題集[2014〜2015年]
- 作者: 日本統計学会
- 出版社/メーカー: 実務教育出版
- 発売日: 2016/03/15
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
統計検定の公式問題集は解答・解説が充実しており、本番の練習になります。2016年11月現在では収録されている年数が少ないので、2017年の受験を考えている方は2016年度試験分が収録されるまで購入を待った方がいいかもしれません。
機械学習分野の知識を学習するのに最適と思われます。ある程度統計の知識がある方は入門書としてスラスラ読める一冊です。数式がきちんと解説されているのもさることながら、各手法の説明が丁寧になされており、統計検定の論述問題に回答するのに非常に参考になります。章ごとに練習問題があるのも理解につながります。
大学の一般教養レベルの確率・統計の問題が分野別に練習できます。解説が充実しており、基礎から復習できる良書です。アクチュアリー試験の数学の際にも重宝しましたが、統計検定でも役立ちました。高校数学のレベルから導入があるため、初学者の方にも学習しやすい一冊です。
- 作者: 東京大学教養学部統計学教室
- 出版社/メーカー: 東京大学出版会
- 発売日: 1991/07/09
- メディア: 単行本
- 購入: 158人 クリック: 3,604回
- この商品を含むブログ (82件) を見る
統計学の教科書としては最もオススメな本です。統計検定の勉強の際には、忘れてしまった分布の性質などを復習するため、辞典のように参照しました。
3.終わりに
統計検定準1級は1回の試験で出題される問題数が多く、論述や作図問題など、問題の種類も多岐にわたることから、さまざまなタイプの問題を想定しムラなく準備しておく必要があります。試験までの残り時間は少ないですが、今回受験される方は是非追い込みを頑張ってください。
Rで学ぶ損保数理①(クレームモデルとは?)
ネット麻雀「天鳳」を統計的に分析してみた(後編)
今回は主成分分析、因子分析を用いて、プレーヤーを打ち筋の観点から分類することを試みます。
1.主成分分析、因子分析
主成分分析は多くの変数を少ない変数に要約する手法の1つです。因子分析も主成分分析に類似した手法ですが、因子分析は多くの変数の背後に隠れているいくつかの因子を抽出する手法になります。
主成分分析、因子分析を用いる例として、期末テストのデータがあります。
期末テストの全科目の点数データに、主成分分析、因子分析を用いると
「文系科目が得意」⇔「理系科目が得意」
「美術・技術系の科目が得意」⇔「筆記試験系の科目が得意」
といった隠れた評価軸を明らかにすることができます。
今回は麻雀における各種成績指標をより少ない変数に落とし込むことで、麻雀の成績における隠れた評価軸を分析し、プレーヤーたちの打ち筋を抽象的に評価することを試みます。
2.結果
主成分分析の結果は次の通りです。
第一主成分は前回の多重回帰分析に用いた説明変数と成績データによって大きく動く成分であることが分かります。第二主成分は和了率や放銃率、副露率など、勝負に出れば出るほど小さくなる成分といえます。第三主成分はドラや役を使いこなして点数を稼ぐことによって大きくなる成分であると考えられます。
結果を分かりやすくするため、因子分析の結果についても見てみます。(varimax法を使った結果になります)
3.考察
第一因子は優秀⇔平凡の因子であると評価できます。第一因子得点が高いほど平凡なプレーヤーであることを意味します。因子負荷量の結果と重回帰分析の結果が一致していることからも、この評価は適切だと考えられます。
第二因子はリスク愛好派⇔ベタオリ派の因子であると評価できます。第二因子得点が高いほど、巡目が深い和了が多く、放銃率、ラス率も高いです。経験からの“読み“に頼って勝負するタイプであると考えられます。
第三因子は手作り重視⇔手数重視の因子であると評価できます。第三因子得点が高いほどドラや高い役をからめた大きな手を狙う傾向が強いです。逆に第三因子得点が低いほど安手を連発して和了を量産し、相手を牽制する傾向が強いと評価できます。
第三因子までの累積負荷量が0.706となったので、全変数の概ねの情報は要約できていると判断し、第三因子までの因子得点を散布図に描いてみます。
(Factor1が低いほど優秀、Factor2が高いほどリスク愛好派)
(Factor1が低いほど優秀、Factor3が高いほど手作り重視派)
(Factor2が高いほどリスク愛好派、Factor3が高いほど手作り重視派)
散布図のとおり、強者たちにはっきりしたクラスタリングは見られず、一様に散らばっていることが分かります。強者たちを打ち筋によってグループ化することは難しそうです。大体の人が同じような打ち方をしており、一部の人が個性の強い打ち方をしていることが伺えます。(見方を変えれば特徴がない打ち筋の人でも良い成績を出しうるといえるかもしれません)
たとえば、「断幺ドラ3」氏の戦績データに注目すると、因子分析の結果からは成績は標準、リスク愛好派、手作り重視の傾向があると評価できます。実際に氏の戦績データを見ると1位率(28.5%)と4位率(25.6%)が突出して高く、まずまずの成績(安定レート:1984.74)を出されています。またリーチを多用しており(立直率:23.2)、先制立直にこだわらずに勝負に臨んている姿勢が読み取れます。
一方「長村ビッグ」氏は成績は優秀、ベタオリ派、手作り重視のタイプと評価できます。実績データから高い和了率(23.5%)と極端に低い放銃率(11.4%)が見て取れ、因子分析の評価に近いと言えます。
また、データが2件あった「超ヒモロリ」氏は第三主成分で評価が大きく変わっていることにも注目です。2件のデータの観測期間の間で、「手数重視⇔手作り重視」の打ち筋が変化があったとも読めるかもしれません。
4.総論
多重回帰分析の結果から、オンライン麻雀ゲーム「天鳳」における成績は、
の4つによって大部分を説明でき、立直率や平均和了巡目の説明能力は相対的に低いと考えられます。
また、主成分分析、因子分析の結果から、プレーヤーの打ち筋のタイプを見る因子として、
- 優秀⇔平凡
- リスク愛好派⇔ベタオリ派
- 手作り重視派⇔手数重視派
の3つの因子が考えられます。
(関連記事)
ネット麻雀「天鳳」を統計的に分析してみた(前編)
本記事では、オンライン麻雀ゲーム「天鳳」の成績データを分析し、良い戦績をあげているプレーヤーの特徴を明らかにします。
1.天鳳について
天鳳はネット麻雀の中で最も流行っているサービスの一つです。全国の猛者と自動で対戦できる手軽さが人気で、十数万ものプレーヤーがいると言われています。その中で優秀な成績をあげている強者たちの多くは、自分の対局をデジタル形式で記録し、データ分析を行ってさらなる高みを目指しています。
今回は、天鳳強者たちの牌譜解析データを分析し、彼らの成績から1.良い戦績をあげているプレーヤーの特徴を明らかにし、2.強者の打ち筋についてどのようなタイプがあるのかを探ってみます。
2.用いたデータ
http://tenhou7.s350.xrea.com/で公開されている(リンク切れしているようです)データを利用します。csv化したデータは下記の通りです。
・ルールは東風戦のみを分析対象とします。
・対戦回数が500戦以下の戦績データに関しては信頼性が低いと判断し、除外します。
よって今回は、全25プレーヤーのデータ(以下敬称略、有栖、長村ビッグ、おっおっおVIΡ、コハク、さくらこ、芝村矜侍、寂夜霽月、女子更衣室、小鳥遊夜々、断幺ドラ3、超獣GIGA、超ヒモリロ1、超ヒモリロ2、てんぽいんと、長岡大明神、なんぞこれ~、ヒゲロング、メタルクウラ、理想雀士、六分儀ゲンドウ、ロリータな焼肉、bakase、kuboowy、HGST、@馬杉寧香)について分析します。
ただし、超ヒモリロ氏については2件に分かれてデータがあったため、それぞれ別に分析することとします。同じプレーヤーのデータにどのような違いが出るのかに注目です。
各プレーヤーの成績データとして、以下の11種のデータを用います。(平均順位、予想安定レート、ラス率、和了率、和素点、平均和了巡目、和了時ドラ枚数、放銃率、放素点、立直率、副露率)これらのデータは4つに大きく分類できます。
2-1.成績データ
①平均順位、②予想安定レート、③ラス率の3つが成績データです。
①平均順位は1東風戦ごとの最終着順を対戦数で平均したもので、小さいほど実力があることを示します。平均順位は同卓してきた相手の強さを考慮に含められない欠点もあります。(強い人同士がマッチングしやすいため)
②予想安定レートは平均順位と同卓する相手のレートを考慮したデータなので、予想安定レートをもっとも信頼できる成績データとします。予想安定レートは高ければ高いほど実力があることを示します。
③ラス率は全対戦数のうち4位(ビリ)で終わった対戦の割合を示します。4位率の低さは「段位」と呼ばれるレートとは異なる成績指標を上げるのに必須だと言われており、今回はラス率も成績データとして考慮に含めることにしました。ラス率は高ければ高いほど実力がないことを示します。
2-2.和了データ
④和了率、⑤和素点、⑥平均和了巡目、⑦和了時ドラ枚数の4つを和了データとします。
④和了率は全局中でプレーヤーの和了で終了した割合を指します。⑤和素点は供託や積棒を除いた素点で見た、和了時の平均点です。⑥平均和了巡目はプレーヤーが和了したときの巡目の平均値です。⑦和了時ドラ枚数は和了時にドラを平均何枚利用しているかを示します。和素点や立直率(裏ドラ発生のため)と相関が高い数字であることに留意が必要です。
2-3.放銃データ
⑧放銃率、⑨放素点の2つを放銃データとします。
⑧放銃率は全局中、プレーヤーの振込で終了した局の割合を示します。⑨放素点は和素点と同様、供託、積棒を除いた素点での放銃時の平均点です。この二つから守備的な打ち回しをする度合いをみます。
2-4.打ち回しデータ
⑩立直率、⑪副露率の2つを打ち回しデータとする。⑩立直率は全局中でリーチをした局、⑪副露率は全局中で副露した局の割合を示します。リーチを多用するか、副露を多用するかの度合いをみます。
3.重回帰分析
まず、端的にネット麻雀で強くなるにはどの指標を重視したら良いかを探るため、予想安定レートを被説明変数とする重回帰分析を行います。多重共線性を考慮して、予想安定レート以外の成績データは説明変数から除外しました。また和了時ドラ枚数も和素点との相関が高いと予想されるため、前者を説明変数から除外しました。
よって、被説明変数を予想安定レートとし、説明変数を和了率(対数値)、和素点、平均和了巡目、放銃率(対数値)、放素点、立直率(対数値)、副露率(対数値)とする回帰分析を試みます。回帰の結果を見たあとで、説明変数を減らしていく、減少法によって適切なモデルを求めていきます。
自由度調整済み決定係数(補正R2)が0.82とかなり大きな値をとっている一方で、立直率、平均和了巡目、放素点のP値が高いです。これらは説明変数として適切でないとみなし、3つの変数を除外して再度回帰分析を行います。
自由度調整済み決定係数は0.81であり、説明変数のP値は低い値に収まっています。説明変数としてはこれらの4つが適切だと判断します。次にこの場合の回帰の残差を検証し、モデルの妥当性について確認します。
観測値と残差にはあまり偏りがないようですが、2σを超える残差も1点見受けられます。QQプロットもいささかいびつではありますが、モデルが大きく外れていないと判断します。
4.結論
予想安定レートは放銃率、和了率、和了素点、副露率によって大部分を説明できるといえます。オリる技術、和了る技術だけでなく、高い手を作るスキルや効率的に副露するスキルについても、優秀な成績を出すために重要であると分かります。
逆に、成績優秀者の中では、リーチするしない、和了の早い遅いについてはさほど成績に大きな影響を与えていないようです。この点は一般の戦術書で言及されていないので意外に思われました。(無論、プレーヤー総体で比較すると圧倒的に和了へ向かう速度は速いのでしょうが、巡目が深くなっても和了できることによって、強者の平均和了巡目が低くなっていない可能性があります。)
今回導いた予想安定レートの推定式は次の通りです。
予想安定レート推定値 =
1,976 + 762 × ln和了率 + 0.111 × 和了素点 - 348 × ln放銃率 + 186 × ln副露率
次回は主成分分析、因子分析を行い、各プレーヤーの打ち筋にどのようなタイプがあるかを探っていきます。
統計検定準1級に合格しました
先日、統計検定準1級の合格発表がありました。大変うれしいことに評価Sをいただいて合格することができました。引き続き1級の受験も目指して勉強していきたいです。
試験の難易度としては、アクチュアリー基礎科目の数学をやや難しくしたものに、多変量解析などの専門的なトピックや論述問題が加わったイメージです。直近の2016年6月19日試験での合格率自体は22%となっています。
対策としては、公式問題集と公式サイトの例題集を一周しました。
日本統計学会公式認定 統計検定 1級・準1級 公式問題集[2016〜2017年]
- 作者: 日本統計学会
- 出版社/メーカー: 実務教育出版
- 発売日: 2018/03/14
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
アクチュアリー試験とあまり関連性のない機械学習分野については、はじめてのパターン認識を読んで知識を補完しました。
2016年度の試験では、当ブログでとりあげている線形判別分析や、台風の上陸数のモデリングなどが論述問題で出題されたことから、自分にとってはラッキーな出題でした。
試験の開催は年1回6月のようですので、アクチュアリー試験で中だるみを感じている方にはもってこいの試験だと思われます。今年も12月の試験まで150日を切ったようなので、これを皮切りにスパートをかけていきたいと思います。
追記:統計検定準1級の勉強方法についてまとめました。
アクチュアリー試験 損保数理の問題をRで解いてみる①
今回は、アクチュアリー試験の問題をRで解きます。
取り上げるのはH25年度の損保数理の第二問Ⅲ 非斉次ポアソン過程の問題です。
(1)の答えはオペレーショナルタイムの定義通りなので、上記の通りとなります。tが1/3乗されているため、時間が経過するほど事故が発生しにくくなる設定のようですが、シミュレーションを行うとどのような結果になるでしょうか。
逆関数法を用いて非斉次ポアソン過程Ntをシミュレーションした一例は次の通りです。題意のパラメータλは3で仮置きしています。t=100までシミュレーションを行ってみます。
Ntの期待値はt=27で3×27^(1/3)=9回、t=64で3×64^(1/3)=12回なので、シミュレーションは適切にできているようです。
>||
nhp=function(Tmax,lambda){
u=rep(0,10000)
tau=rep(0,10000)
T=rep(0,10000)
u[1]=runif(1)
tau[1]=-log(u[1])
T[1]=(tau[1]/lambda)^3
u[2]=runif(1)
tau[2]=-log(u[2])+tau[1]
T[2]=(tau[2]/lambda)^3
u[3:10000]=runif(9998)
for(i in 3:100){
tau[i]=-log(u[i])+tau[i-1]
T[i]=(tau[i]/lambda)^3
if(T[i]>Tmax){
T[i]=0
break
}
}
Ti=T[T>0]
N=c(0:length(Ti))
Ti=c(0,Ti)
plot(Ti, N,type = "s",xlab="time",ylab="Nt")
}
nhp(100,3)
||<
数値解を求めてみます。
>||
##n件目の事故がある時刻の平均
ETN=function(m,n,lambda){
result=rep(0,m)
for(j in 1:m){
u=rep(0,n)
tau=rep(0,n)
T=rep(0,n)
u[1]=runif(1)
tau[1]=-log(u[1])
T[1]=(tau[1]/lambda)^3
u[2]=runif(1)
tau[2]=-log(u[2])+tau[1]
T[2]=(tau[2]/lambda)^3
u[3:n]=runif(n-2)
for(i in 3:n){
tau[i]=-log(u[i])+tau[i-1]
T[i]=(tau[i]/lambda)^3
}
result[j]=T[n]
}
kekka=mean(result)
return(kekka)
}
ETN(100,5,3)
||<
n=6の場合、5万回シミュレーションした実行結果は次の通りです。
> ETN(50000,6,3)
[1] 12.42624
6*7*8/3^3=12.444…
(I)が正答だと確認できます。