LoginSignup
4
1

More than 3 years have passed since last update.

反比例っぽいグラフはどのようにして生まれるのか?

Posted at

前略

こちらの記事の考察はとても面白かったですね。自分も「いいね」をもらうとやる気が出るので、ちょっと参考になりました。コードは書くつもりだけど。

ところで、私も分析をしていると度々記事の中にあった最初のグラフのような図に出会います。反比例っぽいなーと思いつつ、実はこれは反比例ではないのでは?と思ったので、似たようなグラフがどのようにしたら出力されるか、ちょっと試してみました。

反比例のグラフ

当たり前ですが反比例のグラフは下図のようになります。

import numpy.random as rnd
import matplotlib.pyplot as plt
plt.style.use("seaborn")

x = np.linspace(0.1, 10, 100)
y = 1/x

plt.plot(x, y)
plt.show()

スクリーンショット 2020-01-23 1.22.59.png

さて、上のデータは手動で作成したのですが、これを所与のものであったと考えてみます。つまり、下記のようなデータフレームが最初から与えられていたとします。

import pandas as pd

df = pd.DataFrame({"x": x, "y": y})

スクリーンショット 2020-01-23 1.25.35.png

このxとyをプロットして反比例か確認しても良いのですが、より良い確認方法として、グラフが線形になるように変数を変換することが考えられます。つまり、xの逆数をとった次のような列を考えます。

df["1/x"] = 1/df["x"]

df.plot(x="1/x", y="y")
plt.show()

スクリーンショット 2020-01-23 1.29.06.png

こうすると、直線になるので、曲線の目視確認よりもより正確に確認することが出来ます。また、比例係数も読み取ることも出来ます。

反比例っぽいグラフ

反比例っぽいグラフを作るにあたって最初に思いついたのは、xとyがそれぞれ独立に、指数分布のような原点で最大値をとり急激に単調減少する分布に従うというものです。

指数分布の場合

y=xの方向にグラデーションになっています。これは再生性があるためだと考えられます(もう少し考察が必要)。反比例っぽい曲線感はないです。

import numpy.random as rnd
import matplotlib.pyplot as plt
plt.style.use("seaborn")

lam = 0.008
x = rnd.exponential(1./lam, size=10000)
y = rnd.exponential(1./lam, size=10000)

plt.figure(figsize=(5, 5))
plt.plot(x, y, ".", alpha=0.2)
plt.xlim(0, 1600)
plt.ylim(0, 1600)
plt.show()

スクリーンショット 2020-01-23 1.35.49.png

幾何分布の場合

離散分布でも試してみます。こちらも曲線感はないです。

import numpy.random as rnd
import matplotlib.pyplot as plt
plt.style.use("seaborn")

x = rnd.geometric(p=0.01, size=10000)
y = rnd.geometric(p=0.01, size=10000)

plt.figure(figsize=(5, 5))
plt.plot(x, y, ".", alpha=0.2)
plt.xlim(0, 1600)
plt.ylim(0, 1600)
plt.show()

スクリーンショット 2020-01-23 1.38.51.png

カイ二乗分布の場合

ちょっとそれっぽい曲線感があります。

import numpy.random as rnd
import matplotlib.pyplot as plt
plt.style.use("seaborn")

x = 100*rnd.chisquare(1, size=10000)
y = 100*rnd.chisquare(1, size=10000)

plt.figure(figsize=(5, 5))
plt.plot(x, y, ".", alpha=0.2)
plt.xlim(0, 1600)
plt.ylim(0, 1600)
plt.show()

スクリーンショット 2020-01-23 1.42.06.png

xについて逆数をとり、yと一緒にプロットしてみます。

plt.plot(1/x, y, '.')
plt.show()

スクリーンショット 2020-01-23 1.46.20.png

拡大してみます。

plt.plot(1/x, y, '.')
plt.xlim(0, 50)
plt.show()

スクリーンショット 2020-01-23 1.47.09.png

反比例のグラフのような直線にはならないことがわかりました。

草々

カイ二乗分布のグラフは反比例感がちょっとだけあるグラフになりました。ただ、このようなグラフが得られたとき、原点付近にデータが有ることを考えると、反比例ではないと推測するのが妥当だと思います。

今回の検証での重要な点は、xとyに関係があるようなグラフに見えても、実はxとyが独立にサンプリングされた組であるケースがあるということです。

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1