So-net無料ブログ作成
データサイエンス、統計モデル ブログトップ
前の30件 | -

SPSS、50周年 [データサイエンス、統計モデル]

50周年記念!分析屋だらけの大ザーユー会
https://spss-ug.connpass.com/event/88346/

抽選で当たるかどうかわかりませんが、申込しておきました。

Home - 50 YEARS SPSS
https://50-years-spss.com

自分がSPSSを使い始めたのは15年くらい前だった気がします。
50年という歴史の中では、まだまだ、若手になるのかもしれません。

nice!(0)  コメント(0) 
共通テーマ:学問

データサイエンスとは何か [データサイエンス、統計モデル]

学生向けのセミナーがあったので行ってきました。
椿先生のセミナーはいつ聞いても、学びがあります。

##### ~ 講演のまとめ ~ #####
・アメリカは、統計家を政府がカウントしており、2017年で36,504人雇用中。
今後10年で33%増加。
一方、日本では、データサイエンス学部がようやく出来たばかりで、人数が圧倒的に不足している。

・データサイエンティストの主要な役割
データを設計する、データを編集する、モデル化する、解釈する、評価するなど

・PDCAサイクルは、1951年に日本から生まれた。
PDCの後に、しっかりと、Aを行い、改善をすることが大切。

・異常値の中には意味のある良い異常値もある
##############################

この前、データ分析のレビューをした際に、グラフに異常値が混じっていました。
分析をした人に「そこの異常値は何ですか?」と質問をしたときに、「誤差ですかね。」という答えが返って来たことがありました。
最近、丁寧に物事を分析できる人の割合が減ってきている気がします。

AIや機械学習というものが流行っていますが、その予測能力に目が行ってしまいがちです。
確かに、最近は、簡単にデータが手に入り、ツールも整備されているため、ある程度の人でもそれなりの答えが出せるようになってきました。

短期的なソリューションとしては、それで良いのかもしれませんが、企業の中で長期的な価値を生み出していく上では、
「現象を解釈し、仮説を考え、どうすればありたい姿になるかの戦略を導くこと」
がとても重要だと思っています。。。

nice!(8)  コメント(0) 
共通テーマ:学問

SONYのNeural Network Console、リンゴとトマトを分類させる [データサイエンス、統計モデル]

SONYのNeural Network Console、チュートリアルを動かす
http://skellington.blog.so-net.ne.jp/2018-03-07

前回の続きです。

チュートリアルではなく、自分で用意した画像で分類させてみました。

まずは、リンゴの画像から。


続いて、トマトの画像です。


正面から見た画像、切った画像、ニンジンと一緒に写っている画像、絵で描かれた画像などなどを用意しました。

学習に使ったデータは、リンゴ10枚、トマト10枚です。
予測に使ったデータは、リンゴ5枚、トマト5枚です。

学習したモデルに対して、予測スコアを当てはめてみると、意外と良い精度でした。



普通の画像だと、はっきりとトマトかリンゴか分類することができます。

自分が間違うかなと思い用意した画像があります。
・リンゴをつかんでいる画像
緑の葉っぱが写っているので、トマトと間違うのでは?
→ 結果は、しっかりとリンゴと区別していました。

・真上から見た画像
→ こちらのスコアは、0.567となっており、トマトともリンゴとも曖昧な結果になっていました。
人間が見ても、ちょっとわかりにくい画像でしたね。。。

ということで、SONYのNeural Network Consoleを使って遊んでみましたが、意外と使えそうな気がしました。

nice!(6)  コメント(0) 
共通テーマ:学問

SONYのNeural Network Console、チュートリアルを動かす [データサイエンス、統計モデル]

~ セットアップ方法 ~
・Setupをクリックして、【ENGINE】タブに移動します。
・CPU、GPUを選択できます。

~ チュートリアル(使い方) ~
セットアップが終わって、プロジェクト一覧から【01_logistic_regression.sdcproj】を選択します。

MNISTのデータをダウンロードする必要があるみたいなので、データセットのダウンロード。

DATASETをクリックすると、サンプルデータを見ることができます。

~ TRAINING 方法 ~
TRAININGタブをクリックして、【Run training(F5)】をクリックします。
すると、自動でモデルが動き出します。



~ EVALUATION 方法 ~
続いて、モデルの評価ですが、EVALUATIONタブをクリックして、【Run evaluation(F6)】をクリックします。
こちらも一瞬で答えがでます。

4に近い予測だと0に近く、9に近い予測だと1に近くなります。

ただ、人間が見ても、4なのか9なのか、あるいは、別の数字に見えるようなあいまいな文字に関しては、出てきたスコアも微妙な値になっていました。



nice!(0)  コメント(0) 
共通テーマ:学問

【SPSS Modeler】ロジスティック回帰とSVMを使った二値分類 その2 [データサイエンス、統計モデル]

【SPSS Modeler】ロジスティック回帰とSVMを使った二値分類 その1
http://skellington.blog.so-net.ne.jp/2018-03-01

前回は、ロジスティック回帰を使いましたが、今回は、SVM(サポートベクターマシーン)を使い二値分類を行います。

データは、前回と同様に、こちらのデータを使います。


SVM(サポートベクターマシーン)は、線形SVMと非線形SVMがあります。
SPSS Modelerでも、エキスパート設定をすえば、線形SVM(線形)と非線形SVM(RBF, 多項式, Sigmoid)が用意されています。



今回のデータでは、明らかに線形SVMで良いのですが、あえて非線形SMVも使ってみることにします。

まずは、線形SMVから。
モデルを作成して、シミュレーションを使い、線形分離する直線をひきます。



直線SVMなので、直線ですね。



念のためにx1, x2の範囲を10倍くらい大きくしても直線のままです。

この様に書くと、非線形SVMは違うのか!?というネタバレになってしまいますが・・・

続いて、非線形SMV。
非線形SMVは、線形分離できないデータに対して、カーネルトリックを使うことで、超平面にデータを写像してから、線形SVMと同じ仕組みでデータを分離します。

線形SVMと同様に3種類の非線形SVM(RBF, 多項式, Sigmoid)を試していきます。

RBFの結果 → おおむね線形


多項式の結果 → やや非線形


Sigmoidの結果 → おおむね線形


だいたい、線形SVMと同じような結果に見えますが、
Sigmoidだけ少し変な線分が見えますよね。

これは何でしょうか?

「バグ? or 異常値?」と思って、目をつぶってしまうとダメで、実務においても、このようなグラフを見て違和感を感じれるか感じられないかが、分析者にとって大切な心構えだと思っています。

そこで、x1, x2の範囲を大きくしてシミュレーションしてみます。

RBFの結果


多項式の結果


Sigmoidの結果


RBFや多項式は、まさしくそれっぽい感じで分離されていました。

今回は、x1, x2の2変数のみでモデルを作成しましたが、最近の流れとしては、膨大な数の特徴量を作成し、モデリングをしている事例を見かけます。

しかも、精度が劣化するという理由で、定期的に自動でモデリングを行う機能をもったソフトウェアも多数出てきました。

近年、機械学習の敷居は下がってきており、ツールが使える人の数は年々増えてきています。
しかし、アルゴリズムの癖をきちんと理解した上で、正しい使い方ができている人はほとんど増えていない印象です。

今回のようなシンプルな事例では、発見できる異常な現象も、膨大な変数やレコードに埋もれてしまい、発見できない場合が多数あります。

もちろん機械学習が得意とする分野もあるので、今回解き明かしたい課題に対してはどのアプローチが適切なのかを考えた上で便利なツールを使っていくことが重要だと思います。

nice!(9)  コメント(0) 
共通テーマ:学問

【SPSS Modeler】ロジスティック回帰とSVMを使った二値分類 その1 [データサイエンス、統計モデル]

買う/買わないといった0,1のデータを分離する方法は色々な方法があります。
その代表的なものといえば、ロジスティック回帰でしょうか。

機械学習的なアプローチでは、決定木やSVM(サポートベクターマシーン)などがあります。

今回は、SPSS Modelerを使って少し変わったやり方で何が起こっているかを理解したいと思います。

まずは、データの可視化から。



0 <= x1 <= 1
0 <= x2 <= 1
となっています

モデリングを使わなくても、判別は自明なのですが、赤丸と青丸をどのように分離するか考えてみます。

どのように分離になるか(なってほしいか)を考えると、
左上から右下に分離する線分をひきたい!と思うかと思います。

まずは、ロジスティック回帰から。

x1, x2を説明変数、yを目的変数に設定し、ロジスティック回帰のモデルを作成します。



この式から分離する線を引きたいのですが、それは、yの値がちょうど0.5となるx1, x2を求めれば良いわけです。
ロジスティック回帰の場合は、その点を四則演算の組み合わせで計算できますが、SVMでは、簡単に求めることができません。

この様な場合は、適当なx1, x2の組み合わせを大量に発生させて、yの値がどうなるかシミュレーションします。

そして、ちょうどyの値が0.5となるx1, x2の組み合わせを持ってくれば、0, 1を分離する線分をひくことができます。

作成したストリームはこんな感じです。


そして、判別結果はこのようになります。



まぁ、仮説通りの納得の結果ですね。

続いて、SVM(サポートベクターマシーン)を使って分離するとどうなるか・・・見てみたいと思います。

※ 今回、作成したストリームが欲しい方は、ご連絡くださいませ。

nice!(6)  コメント(0) 
共通テーマ:学問

R Tips:不偏分散と標本分散 [データサイエンス、統計モデル]

Rで不偏分散ではなく、標本分散を計算しようとしたら、不偏分散の関数しかないようです。
それほど難しくないので、下記のような関数を作れば、標本分散を求めることが出来ます。

基本情報として、サンプルサイズをnとして
nで割るのが、標本分散
n-1で割るのが不偏分散

ということは、不偏分散の値を var(x)とすると

標本分散 = var(x) * (n-1) / n
となります。

# 不偏分散を求める関数 var
# 標本分散を求める関数 varp
varp <- function(x) { var(x) * (length(x)-1) / length(x) }


nice!(7)  コメント(0) 
共通テーマ:学問

R Tips:ヒストグラム [データサイエンス、統計モデル]

Rでヒストグラムの使い方は、色々なサイトに載っていますが、最近知った面白い使い方を紹介。

# サンプルデータを作成
# 標準正規分布に従うデータを1000レコード作成
dat <- rnorm(1000, mean=0, sd=1.0)
 
# ヒストグラムを作成
hist(dat)


ここで、hist(dat)を別の変数 "x" に渡すことが出来るようです。
これを使えば、色々な情報をコマンドで得られますね。

# 変数 "x" にヒストグラムを格納
x <- hist(dat)
 
# ヒストグラムの情報を確認
x
 
# 例えば、ヒストグラムの密度を取り出す場合
x$density
 
# ヒストグラムの密度の最大値の位置
which.max(x$density)
 
# ヒストグラムの密度の最大値の値
x$density[which.max(x$density)]


nice!(9)  コメント(0) 
共通テーマ:学問

IBM Think 2018@ラスベガス [データサイエンス、統計モデル]

毎年、10月の末に開催されているIBMのイベントですが、
今年は、名前も変わり3月に行われるようです。

3月19日~22日@ラスベガス
ちょうど銃の乱射事件があった、あのホテルが会場です。

IBM - Think 2018 - Japan
https://www.ibm.com/ibm/jp/ja/think2018.html

IBM Think 2018 | The first-of-its-kind business and technology event
https://www.ibm.com/events/think/

Train、Barenaked Ladies、The Chainsmokersといった有名なバンドのライブもあるようですが、洋楽はあまりわからないので、どれくらいすごい人たちなのか不明です。。。w

nice!(5)  コメント(0) 
共通テーマ:学問

統計モデルと赤池情報量規準 AIC 2 [データサイエンス、統計モデル]

島谷先生の「統計モデルと赤池情報量規準 AIC 2」に行ってきました。

統計モデルと赤池情報量規準 AIC 2
http://www.ism.ac.jp/lectures/29j.html

初級編ということで、統計数理研究所の公開講座の中では比較的易しめの内容でした。
1日のほとんどをAICの説明に使われて、かなりAICの理解が進んだ気がします。

最後の方に少しBICやりました。

これまでは、AICとBICの違いってよく分からなかったのですが、理論の出生から全く別のものだったんですね。

来年には、渡辺先生の「ベイズ統計の理論・モデリング・評価について」があるみたいです。


ベイズ統計の理論と方法

ベイズ統計の理論と方法

  • 作者: 渡辺 澄夫
  • 出版社/メーカー: コロナ社
  • 発売日: 2012/03/01
  • メディア: 単行本



nice!(1)  コメント(0) 
共通テーマ:学問

SPSS Modeler、NetezzaとOracle Exadataの微妙な違い その3 [データサイエンス、統計モデル]

どうも日付の計算でNetezzaとOracle Exadataで仕様がことなっており、
それが原因のエラーが発生しやすいです。

困るのが、一見、プッシュバックが効いていて上手く動いているように見えても、
データベースの内部で大量にメモリを確保してしまいエラーが起きたり、
出力される結果が想定外のものだったりします。

ユーザ側はちゃんと動いている認識なので、エラーが起こっていることが発見しにくいのが厄介ですね。

Netezzaは、同じIBMの製品なので、細かいバグのチェックなどはやっているのでしょうが、
Oracle Exadataに対しても、丁寧なバグチェックはして欲しいものです。

今回のバグですが、SPSSのストリーム内で条件抽出をしたところ、
そのレコードの抽出が微妙で、処理がすごく遅くなってしまいます。
データベース内のメモリもたくさん使ってしまいます。

そこで、SQLを書く一番最初の入力ノードに条件抽出を書いてしまうのが良いかと思われます。
速度は劇的に速くなりました。

今日から日付差が、7日以内のレコードを抽出したい場合は、このように書きます。

WHERE (TO_DATE(TO_CHAR(SYSDATE, 'YYYYMMDD'), 'YYYY-MM-DD') - TRUNC("フィールド1",'DD')) <= 7
今日の日付を SYSDATE 持ってきて、"フィールド1" との日付差が7日以内という処理になります。 ~その他のTipsはこちら~ SPSS Modeler、NetezzaとOracle Exadataの微妙な違い その1 http://skellington.blog.so-net.ne.jp/2017-11-27 SPSS Modeler、NetezzaとOracle Exadataの微妙な違い その2 http://skellington.blog.so-net.ne.jp/2017-11-28

nice!(2)  コメント(0) 
共通テーマ:日記・雑感

SPSS Modeler、NetezzaとOracle Exadataの微妙な違い その2 [データサイエンス、統計モデル]

Oracle Exadata でフラグ型 NCHAR(1 CHAR)の場合、エラーで読み込めない場合がある。

対処法 1
ODBCの設定で、Enable N-CHAR Support にチェックを入れる

対処法 2
to_charaで変数変換を行ってから読み込みをする
(SPSS Modelerの入力ノードでSQLを書くイメージです)

楽なのは、対処法1ですかね。

ただ、サーバモードでデータを持ってくる際は、サーバ側のODBCの設定も同じにする必要がります。
つまり、サーバ側でもEnable N-CHAR Support にチェックを入れる必要があります。

nice!(5)  コメント(0) 
共通テーマ:学問

SPSS Modeler、NetezzaとOracle Exadataの微妙な違い その1 [データサイエンス、統計モデル]

Netezzaの場合、日付が文字列の場合はエラーが起きますが、
Oracle Exadataの場合、処理が通ってしまいます。
(プッシュバックも通ります。)

しかし、データの型が文字列なので、想定される結果が得られない場合があります。

本来、日付を表すデータは日付型で入っているべきなのですが、
文字列で入っている場合もあり、、、
そのような場合は、いったん日付型に置換してからしないとダメですね。

このようなミスをなくすためにも、本来は、リーダブルな仕様であるべきですが・・・


リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

  • 作者: Dustin Boswell
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2012/06/23
  • メディア: 単行本(ソフトカバー)



nice!(1)  コメント(0) 
共通テーマ:学問

日付差を計算させるSQL [データサイエンス、統計モデル]

データベースが異なると、SQLの書き方も若干変わってきます。
データベースを変更する際、思った以上に移管コストがかかるので、注意が必要ですね。。。(涙

以下、備忘録

■ 日時データを日付データに置換するSQL
## Netezza(PureData)の場合
SELECT
  DATE(日時フィールド) AS "日付フィールド"
FROM データベース名

## Oracle Exadataの場合
SELECT
  TRUNC(日時フィールド, 'DD') AS "日付フィールド"
FROM データベース名

■ 日付差を計算させるSQL
## Netezza(PureData)の場合
SELECT
  DATE_1 - DATE_2 AS "日付差",
FROM データベース名

## Oracle Exadataの場合
SELECT
  TRUNC(DATE_1, 'DD') - TRUNC(DATE_2, 'DD') AS "日付差"
FROM データベース名

nice!(2)  コメント(0) 
共通テーマ:学問

SPSS Datathon 2017 特別講演 [データサイエンス、統計モデル]

SPSS Datathon - 研究奨励賞復活!データサイエンティストへの道
http://spss-datathon.com


12月6日に開催されます。

こちらで講演するのですが、今回は、「時系列分析」について話そうかと思っています。

当日の観覧受付は、上記のサイトから申し込みできるようです。

nice!(6)  コメント(0) 
共通テーマ:学問

SPSS Modelerでファイル出力する際の注意点 [データサイエンス、統計モデル]

最近、はまった初歩的なミスの事例。

ファイル出力する際に、文字コードのエンコードが指定できます。
デフォルトは、【ストリームのデフォルト】となっています。

実際、選べるのは、
1.【ストリームのデフォルト】
2.【システムのデフォルト】
3.【UTF-8】
が選べます。



普段、ローカルでストリームを作成し、本番サーバで実行する際に、
ローカルと本番サーバが同じOSならば、なんの問題もなく動いくのですが、

・出力フィールドに日本語名が入っている
・SPSS Modelerのバージョンが異なる
場合に、【ストリームのデフォルト】を選んでいると、
文字化けを起こしてしまい処理でエラーが発生することがあります。

まとめると、
・ローカルと本番サーバのSPSS Modelerのバージョンをそろえる
SPSS Modelerの新しいバージョンを使いたくなって、ついついローカルだけバージョンを上げてしまいがちですが、開発をする際は、同じバージョンで開発しないとだめですね。。。

・フィールド名に日本語を入れない
日本人なので、日本語のカラム名にしたくなりますが、英語のカラムが安心

・【ストリームのデフォルト】ではなく、【UTF-8】を選択しておく

nice!(1)  コメント(0) 
共通テーマ:学問

統計フォーラム 2017 [データサイエンス、統計モデル]

統計フォーラム 2017
http://adv-analytics.com/statisticsday/

こちらで講演する機会がありました。

機械学習と統計モデルの事例を中心とした発表内容でしたが、
発表内容が多すぎたかなと、反省です。

講演に関して、質問などありましたら、お気軽にご連絡ください。

nice!(2)  コメント(0) 
共通テーマ:学問

実践 IBM SPSS Modeler 顧客価値を引き上げるアナリティクス [データサイエンス、統計モデル]

SPSS Modelerの本が出ます!

実践 IBM SPSS Modeler 顧客価値を引き上げるアナリティクス
https://www.amazon.co.jp/dp/448902276X/


実践 IBM SPSS Modeler~顧客価値を引き上げるアナリティクス

実践 IBM SPSS Modeler~顧客価値を引き上げるアナリティクス

  • 作者: 西牧 洋一郎
  • 出版社/メーカー: 東京図書
  • 発売日: 2017/10/10
  • メディア: 単行本



半ページだけですが、記念にコメントを書かせてもらいました。

nice!(0)  コメント(0) 
共通テーマ:学問

lasso回帰 / リッジ回帰による多重共線性の回避 [データサイエンス、統計モデル]

重回帰で回帰係数の符号が逆転している場合の意味
http://skellington.blog.so-net.ne.jp/2017-05-17

マルチコは悪か?
http://skellington.blog.so-net.ne.jp/2017-09-25

パラメータに非負制約を与えた重回帰分析
http://skellington.blog.so-net.ne.jp/2017-09-26


こちらのパラメータに非負制約を与える回帰分析は、Rのoptimを使う必要があるなど、ちょっとややこしいです。
一方、Rのパッケージを使ってお手軽にする別の方法を紹介しておきます。

多重共線性が起こっているということは、回帰分析で逆行列の計算が難しいという問題あります。
逆行列で0に近い数が分母に来るという問題です。

これを回避するのが、lasso回帰であったり、リッジ回帰であったりするわけですが、
lasso回帰の場合は、変数選択という意味が強く、不要と思われるである変数は落とされます。

リッジ回帰は、同じく「正則化」を行うわけですが、変数選択ということは行われません。

今回のデータ(前回のデータ)は、
 Y <- 1.0 - 0.1 * X1 + 0.5 * X2 + 1.0 * X3 + rand
という形式で発生させた疑似データを使っています。

まずは、lasso回帰を行った結果。
 Y = 1.026 + 0.300 * X2 + 0.922 * X3
という結果になりました。

X1の係数が小さいのlasso回帰を使うと、その係数は落とされてしまいます。



次に、リッジ回帰を行った結果。
 Y = 1.027 + 0.001 * X1 + 0.300 * X2 + 0.882 * X3
という家㏍が得られました。

X1の偏回帰係数は、小さい値ですが、リッジ回帰の場合はちゃんと残っていますね。

どっちの回帰を使うかは、それぞれ何を得たいかによって違ってきますが、
lasso回帰、リッジ回帰とも想定通りの結果が得られました。



nice!(4)  コメント(0) 
共通テーマ:学問

パラメータに非負制約を与えた重回帰分析 [データサイエンス、統計モデル]

重回帰で回帰係数の符号が逆転している場合の意味
http://skellington.blog.so-net.ne.jp/2017-05-17

マルチコは悪か?
http://skellington.blog.so-net.ne.jp/2017-09-25


xとyの相関はプラスなのに、重回帰になると逆のマイナスになる場合の続き。

重回帰の偏回帰係数の意味をきちんと理解していると、
分析者本人は、符号が逆になっても問題ないと理解できるのですが、
上司に説明する際など、そのままでは誤解を生む場合があります。

重回帰の場合、マイナスだからといって、その効果がマイナスということを意味していません。
一方で、マイナスをなんとかプラスの係数にして、しかも、重回帰を行いたい!という気持ちもわかります。

もはや、普通の重回帰ではなく、重回帰の形をした別の分析ということになります。
しかも、出てくるアウトプットが重回帰の形をしているので、これまた、誤解を生みかねないので、あまりお勧めをしませんが、、、
自分ならこうやってプラスにするという方法を書いておきます。

重回帰分析の流れ
1. 最尤法(最小二乗法)を解く
ただし、普通のパッケージにおいては、回帰係数に制約条件を付けれないのでRの最適化関数optimを使って解きます。

2. 通常、パラメータの探索区間は -∞~∞ なので、exp(β)と変数変換することで、非負の制約を与えることができます。

気になる精度ですが、

# 普通の重回帰分析
モデル作成用:1.058
モデル検証用:1.002

# パラメータに非負制約を与えた重回帰分析
モデル作成用:1.090
モデル検証用:1.009

ということで、パラメータに非負制約を与えた重回帰分析の方が精度が落ちてしまいますね。
この辺りは、パラメータに制約与えて最適化を解いているので、自明と言えば自明ですが。。。


~以下、実際のコード~

# 普通の重回帰分析
fr <- function(x)
{
b1 <- x[1]
b2 <- x[2]
b3 <- x[3]
b4 <- x[4]

LL = 0
for(i in 1:hh) {
x_ols <- b1 * dat_b[i, 1] + b2 * dat_b[i, 2] + b3 * dat_b[i, 3] + b4
y_ols <- dat_b[i, 4]
LLL <- (y_ols - x_ols)^2
LL <- LL + LLL
}
return(LL)
}

res1 <- optim(b0, fr, method = "BFGS", hessian = TRUE, control = list(fnscale = 1))

# パラメータに非負制約を与えた重回帰分析
fr <- function(x)
{
b1 <- x[1]
b2 <- x[2]
b3 <- x[3]
b4 <- x[4]

LL = 0
for(i in 1:hh) {
x_ols <- exp(b1) * dat_b[i, 1] + exp(b2) * dat_b[i, 2] + exp(b3) * dat_b[i, 3] + b4
y_ols <- dat_b[i, 4]
LLL <- (y_ols - x_ols)^2
LL <- LL + LLL
}
return(LL)
}

# 対数尤度関数の最大化
res2 <- optim(b0, fr, method = "BFGS", hessian = TRUE, control = list(fnscale = 1))

nice!(7)  コメント(0) 
共通テーマ:学問

マルチコは悪か? [データサイエンス、統計モデル]

xとyの相関はプラスなのに、重回帰になると逆のマイナスになる場合があります。

例えば、広告効果の場合、ある施策を行ったときに、基本はプラスになるはずだけど、
重回帰の偏回帰係数がマイナスになってしまうという例。

重回帰の原理原則を理解していると、「まぁ、そうだよね。」という場合が結構ありますが、マーケティングの立場からすると、その結果だとまずい場合があります。

ただ、本来なら、なぜマイナスになってしまうのかという理由はきちんと説明できるのですが、なかなかその原理を理解しないまま、悩んでしまう人は多そうですね。

昔、書いたブログのエントリー
 
重回帰で回帰係数の符号が逆転している場合の意味
http://skellington.blog.so-net.ne.jp/2017-05-17


話はそれましたが、マルチコ(多重共線性)が起こると何がまずくて、どうすれば良いのか?
逆に、まずくない部分は何か?をまとめました。

多重共線性が起こっている場合の現象
1. 係数の標準誤差が大きくなる
 各係数のt値が小さくなり、係数が優位になりにくくなる
 係数が理論から予想される値と大きくかい離することがある
2. 個別係数のt値が小さいにも関わらず、決定係数が大きくなる
3. データのわずから変動や観測期間の変更で係数が多く変化する

3.の現象は有名だと思いますが、1.と2.は意外と知らない人が多い気がします。

多重共線性の間違った対応
以下は、巷で流れている間違った対応なので、ご注意を!
1. 説明変数を減らす
2. X1, X2ではなく、変数変換でX1 - X2とX2を回帰する
3. 階差を取る
4. データ数を減らす

1.をやっている人が多い気がしますが、
本来必要な説明変数を減らすことは、過小定式化につながり、推定に偏りが生じてしまいます。

多重共線性の対処法
・データ数を増やす
・モデルについての追加的情報を使う
 β1+β2=1など

Y(目的変数)の推定精度
多重共線性が起こっていると、Yの推定値の精度が悪くなる気がするが、悪くなることはない。

nice!(1)  コメント(0) 
共通テーマ:学問

統計フォーラム2017 [データサイエンス、統計モデル]

イベントの紹介です。

統計フォーラム2017
http://adv-analytics.com/statisticsday/

10月18日は、統計の日ということらしい。
大枠は決まっているんだけど、内容はこれから作っていきますw

nice!(8)  コメント(0) 
共通テーマ:学問

KDD 2019 Anch. AK [データサイエンス、統計モデル]

2018年のKDDはロンドンで開催されますが、2019年のKDDはアラスカ(Alaska)のアンカレッジ(Anchorage)で開催されます。

最初、アラスカ?と思いましたが、このビデオを見ると、アラスカでの開催もわかる気がします。


KDD 2019 Anch. AK from MPA on Vimeo.



2019年のKDDが楽しみです。

nice!(0)  コメント(0) 
共通テーマ:学問

KDD 2018 @London, United Kingdom [データサイエンス、統計モデル]

KDD 2018 | London, United Kingdom
http://www.kdd.org/kdd2018/

いつもお盆の時期にKDDが開催されていますが、KDD 2018はお盆から少しズレた日程(2018年8月19日(日)~8月23日(木))でした。

そして、初めてのロンドンでの開催。

紹介動画がありました。
おしゃれーな雰囲気満載です。



nice!(0)  コメント(0) 
共通テーマ:学問

ネスティッドロジットモデル [データサイエンス、統計モデル]

ネスティッドロジットモデル(Nested Logit)をoptimを使って解きました。
階層構造(入れ子)になっている選択を通常のロジットで解くとIIA問題があり、上手く推定できません。

対処方法としては、プロビットモデルで解くか、ネスティッドロジットモデル(Nested Logit)を使って解くかのアプローチになるわけですが、ネスティッドロジットモデルに対応しているパッケージなどが少なく、自分で尤度関数を作成して解くのが一番分かりやすそうです。
Rだとmlogitというパッケージがありますね。

【ポイント 1】
log sum で上がってくる部分のλは0≦λ≦1である必要があるため、
exp(bx) / (1 + exp(bx))
という形式で与えることで、0≦λ≦1を保証しています。

【ポイント 2】
optim 関数はデフォルトで最小化を行うため、control 引数に fnscale = -1 を代入して、最大化を行うようにする

【Nested LogitのRコード】
hh <- nrow(dat_ss) # レコード数
b0 <- c(0, 0, 0, 0, 0) # パラメータの初期化

# ロジットモデルの尤度関数
fr <- function(x)
{
b1 <- x[1] # 階層1の説明変数 1
b2 <- x[2] # 階層1の説明変数 2
b3 <- x[3] # 階層2の説明変数 1
b4 <- x[4] # 階層2の説明変数 2
bx <- x[7] # 0 <= bx <= 1

LL = 0
for(i in 1:hh) {
# 効用の計算
  U_K2 <- b3 * dat_ss[i,3] + b4*dat_ss[i,4]
U_K1 <- b1 * dat_ss[i,1] + b2*dat_ss[i,2] + (exp(bx)/(1+exp(bx)))*log(1+exp(U_K2))

# 選択確率の計算
PP1 <- exp(U_K1)/(exp(U_K1)+1)
PP2 <- exp(U_K2)/(exp(U_K2)+1)

# 対数尤度の計算
LLL <- dat_ss[i,5]*log(PP1)+(1-dat_ss[i,5])*log(1-PP1)+dat_ss[i,5]*(dat_ss[i,6]*log(PP2)+(1-dat_ss[i,6])*log(1-PP2))
LL <- LL + LLL
}
return(LL)
}

# 対数尤度関数の最大化
res_nl <- optim(b0, fr, method = "BFGS", hessian = TRUE, control = list(fnscale = -1))

nice!(44)  コメント(0)  トラックバック(0) 
共通テーマ:学問

Rを使って重回帰分析を色々な方法で解く その2 [データサイエンス、統計モデル]

Rを使って重回帰分析を色々な方法で解く その1
http://skellington.blog.so-net.ne.jp/2017-05-30

こちらの続き。
汎用最適化関数 optim() を使って解く方法。

### optim を使ったパラメータ推定 ###
b0 <- c(0, 0, 0, 0) # 推定するパラメータの初期化
num_row <- nrow(dat) # レコード数

y_ols = dat$Sepal.Length
x_ols = cbind(1, dat$Sepal.Width, dat$Petal.Length, dat$Petal.Width)

ols <- function (y_ols, x_ols) {
min_rss <- function (param) {
sum((y_ols - x_ols %*% param)^2)
}
k <- ncol(x_ols)
return(optim(par = rep(0, k), fn = min_rss, method = "BFGS", hessian = TRUE))
}

result <- ols(y_ols, x_ols)

result
$par
[1] 2.3518922 0.6548347 0.2375590 0.2521268

$value # 対数尤度値
[1] 2.586648

$counts
function gradient
24 8

$convergence # 収束判定
[1] 0

$message
NULL

$hessian
[,1] [,2] [,3] [,4]
[1,] 100.0 342.80 146.20 24.60
[2,] 342.8 1189.20 502.32 85.24
[3,] 146.2 502.32 216.70 36.56
[4,] 24.6 85.24 36.56 7.14

nice!(1)  コメント(0)  トラックバック(0) 
共通テーマ:学問

Rを使って重回帰分析を色々な方法で解く その1 [データサイエンス、統計モデル]

まずは、パッケージ lm() を使って解く方法と行列を使って解く方法から。

# irisのデータを使用
head(iris)

# Species == "setosa" 50レコードを使用
dat <- subset(iris, Species == "setosa", c(Sepal.Length, Sepal.Width, Petal.Length, Petal.Width ))

# 相関行列
round(cor(dat), 3)

Sepal.Length Sepal.Width Petal.Length Petal.Width
Sepal.Length 1.000 0.743 0.267 0.278
Sepal.Width 0.743 1.000 0.178 0.233
Petal.Length 0.267 0.178 1.000 0.332
Petal.Width 0.278 0.233 0.332 1.000


### lm を使った重回帰式 ###
# Length = β1 * Width + β2 * Length + β3 *Width + β0
fit.lm <- lm(Sepal.Length ~ . , data = dat)
summary(fit.lm)

Call:
lm(formula = Sepal.Length ~ ., data = dat)

Residuals:
Min 1Q Median 3Q Max
-0.40662 -0.17721 0.01222 0.13388 0.49693

Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 2.35189 0.39287 5.986 3.03e-07 ***
Sepal.Width 0.65483 0.09245 7.083 6.83e-09 ***
Petal.Length 0.23756 0.20802 1.142 0.259
Petal.Width 0.25213 0.34686 0.727 0.471
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.2371 on 46 degrees of freedom
Multiple R-squared: 0.5751, Adjusted R-squared: 0.5474
F-statistic: 20.76 on 3 and 46 DF, p-value: 1.192e-08


### 行列を使って解く方法 ###
solve(t(x_ols) %*% x_ols) %*% t(x_ols) %*% y_ols
[,1]
[1,] 2.3518898
[2,] 0.6548350
[3,] 0.2375602
[4,] 0.2521257

nice!(42)  コメント(0)  トラックバック(0) 
共通テーマ:学問

コンジョイント分析 [データサイエンス、統計モデル]

8章 コンジョイント分析について


現代マーケティング・リサーチ -- 市場を読み解くデータ分析

現代マーケティング・リサーチ -- 市場を読み解くデータ分析

  • 作者: 照井 伸彦
  • 出版社/メーカー: 有斐閣
  • 発売日: 2013/11/22
  • メディア: 単行本(ソフトカバー)



よくやる間違い
属性水準(説明変数)として
・バッテリ時間
・保証期間
・色
・価格
を考えたときに、「価格」が入っているのは間違い

ダメな理由は、コンジョイント分析は、属性間の独立性を担保する必要があり、
価格は他の属性との相関があるため使えない。

nice!(48)  コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

重回帰で回帰係数の符号が逆転している場合の意味 [データサイエンス、統計モデル]

個々の変数の相関が正(負)なのに、重回帰式において、その係数が負(正)になることがあります。

そんな時に、どう考えるか?

試しにネットに落ちている中古車データを拾ってきました。

20170517_img01.jpg

相関係数を計算すると

20170517_img02.jpg

となります。

走行距離や年数が古くなれば、中古車価格は下落するという事が分かります。

ここで、中古車価格を目的変数に、走行距離と年数を説明変数にすると
 中古車価格 = -10.0 × 走行距離 - 10.7 × 年数 + 252.0
という重回帰式が得られます。

走行距離が1万km増えると、中古車価格は10.0万円下落し、
同様に年数が1年増えると、中古車価格は10.7万円下落することが分かります。

さて、次に、年数を目的変数に、走行距離と中古車価格を説明変数にすると
 年数 = -0.0499 × 価格 - 0.154× 走行距離 + 13.86
という結果になりました。

年数と走行距離の相関係数は、0.562と正の値なのですが、
回帰式のパラメータは、マイナスとなっています。

つまり、「走行距離が1万キロ増えると、年数が0.154年減少する」となっていて感覚と値が違う結果になってしまいます。

これをどう考えるか?です。

重回帰の場合、解釈としては、注意が必要で、「他の変数が同じ値だった場合(他の変数を影響を統制した場合)の効果」をみていることになります。

つまり、「走行距離が同じであったとしたら、走行距離が1万キロ増えた場合、年数はどうなるか?」を表していることになります。

例として、ある車種が、
 【車種 A】走行距離:10万キロ、価格:100万円、年数:10年
だったとした場合、
 【車種 B】走行距離:20万キロ、価格:100万円、年数:???年
車種Bは、20万キロも走っているけど、車種Aと同じです。
つまり、年数が10年ではなく、もっと小さい数字であることが期待されます。

この構造を表しているのが重回帰のパラメータということになります。

一方、一般的には、走行距離が大きくなれば、年数も同時に大きくなる(正の相関がある)という事を表しているのが、相関係数となります。

nice!(38)  コメント(0)  トラックバック(0) 
共通テーマ:学問

KDD2017の申し込みが開始! [データサイエンス、統計モデル]

KDD2017の申し込みが開始!
http://www.kdd.org/kdd2017/registration

今年はカナダのHalifaxです。

6/28までに申込すると、早期割引になりますね。
学割もかなりの額なので、学割で行くべきか悩みます。
(一応、大学院です。。。)

nice!(2)  コメント(0)  トラックバック(0) 
共通テーマ:学問
前の30件 | - データサイエンス、統計モデル ブログトップ