トップページ | ひとつ上のページ | 目次ページ | このサイトについて | ENGLISH

ばらつくデータの作り方

データ分析や シミュレーション の方法を調べたい時に、現実のデータや、ソフトに付属しているサンプルデータを使うと、 そのデータに特有の事情の影響を受けるため、調べたいことがわからなくなる事がよくあります。

一方、自分でデータを作る方法として、「0.1おきに、0から10までのデータを用意する」という事もできますが、 この方法では、現実離れしていて、良くない事があります。

両者の中間として、「正規分布している1000個のデータ」というのがあると、とても便利です。 このページはそのようなデータの作り方になります。

このデータは、 ばらつきモデル の「E」の部分として使うこともできます。

乱数

Excelもそうですが、様々なプログラミング言語には、関数として0から1までの乱数を作る機能があります。 この機能を使うと、0から1までの範囲の値を、等間隔ではなく偏りなく、ほど良くばらばらに得ることができます。

Excelで、
=Rand()
、という式を入力すると、0から1までの乱数が1個作れます。 例えば、100個のセルに、この式を入力すると乱数が100個作れます。

確率を表すデータが欲しい場合は、この機能がそのまま使えます。 0から100までの範囲で適度にばらついているデータが欲しい場合は、
=Rand()*100
として、この関数に100をかけると作ることができます。

一様分布になっているデータ

乱数で作られるデータは、ある範囲の中で一様分布になるデータになります。

確率を表すデータや、一様分布のデータが欲しい場合は、これで良いのですが、 ヒストグラムで分布が山になるデータが欲しい場合は、これは使えません。

正規分布になっているデータの作り方

例えば、Rでは、 Rのサンプルデータ にある方法で、正規分布になっているデータを作る関数があるので、すぐに作れます。

以下は、他の言語やツールで、このような関数がない場合の方法です。

プロビット変換を使う方法

正規分布になっているデータを作りたい場合は、0から1までの乱数を確率のデータとして使い、このデータを プロビット変換 することで得ることができます。

Excelで、
=Norminv(Rand(),0,1)
、という式を入力すると、「平均値が0で、標準偏差が1」という 正規分布に属している値が一個作れます。

例えば、100個のセルに、この式を入力すると、この分布の値が100個作れます。 作った値をヒストグラムにすれば、正規分布になっている様子が分かります。

ちなみに、Rand()という関数で乱数を作っているので、ひとつひとつの値は、作るたびに変わりますが、 属している分布は変わりません。

100個程度のデータを作って、平均値や標準偏差を計算すると、 平均値が0で、標準偏差1にはなりません。 けっこうばらつきます。

筆者の経験の範囲ですが、 平均値や標準偏差などの計算結果が 有効数字 の範囲では、ばらつかないようにするには、10000個はデータを作った方が良いです。 こうしておくと、計算するたびに平均値や標準偏差が大きく変わってしまうことがなくなります。

ロジット変換を使う方法

ロジット変換 を使うと、正確には 正規分布ではないのですが、だいたい正規分布になっているデータを作ることができます。 筆者の経験の範囲ですが、実用上で、この違いで困ることはないです。

Excelで、A1のセルにrand()で乱数を作り、B1のセルに
=LN(A1/(1-A1)))
、という式を入力します。次に、A列とB列の下の行に計算式をコピーします。

すると、「平均値が0で、標準偏差が1.8」になっている分布が作れます。

こちらの変換は、乱数と対数の関数があればできますので、Excel以外のプログラミング環境で、norminvに相当する関数がない時に便利です。

正規分布以外の分布になるデータの作り方

正規分布になるデータの作り方を知っていると、他の分布にも応用できます。

カイ二乗分布になるデータの作り方

正規分布になるデータを2乗すると、カイ二乗分布になるデータになります。

極値分布になるデータの作り方

例えば、「正規分布になるデータを10個作り、最大値を抽出」という作業を100回繰り返すと、得られた100個のデータは、 極値統計 のデータになります。

異常値を含むデータの作り方

正規分布になるデータでも、それなりに外れたデータが時々作られるのですが、 あくまで分布の裾の範囲になります。

極端に外れた値が時々作られるようにして、 外れ値の判定 などの方法の検討に使いたい場合は、例えば、
=IF(RAND()>0.99,NORMINV(RAND(),0,1)*100,NORMINV(RAND(),0,1))
という風にします。 この方法だと、分布の裾の方の値が、極端な値に変換されます。




順路 次は ランダムウォークモデル

Tweet データサイエンス教室