ERC20トークンの取引データを解析する その3

執筆者:藤田 拓也(HashHubインターン:@peaceandwhisky

前回まで

その1 https://link.medium.com/3s4hK79lHU
その2 https://link.medium.com/DRSM5MXlHU
EthereumのノードからERC20トークンの取引データをノードから取り出し、それをcsvデータに加工するところまでを行いました。今回はトークンのネットワークの分散性を考えるために、そのデータを用いてそれぞれのネットワークがスケールフリー性という特徴を持つのかを見ていきます。

今回の流れ

今回の流れは簡単に以下のようになっています。
1.取引データから次数分布&近似グラフを抽出する
2.次数分布がべき分布モデルと指数分布モデルのどちらに近似しているのかの尤度比検定を行う

次数分布? べき分布モデル? 尤度比検定?って話だと思うので、まずそれぞれを簡単に説明します。

次数分布とは
今回の場合、次数とはあるアドレスが今まで取引をした別のアドレスの数です。人間関係のネットワークでいうその人の友達の数といったところです。友達の数が1人の人が何人いるのか、100人の人が何人いるのかという分布になります。

べき分布とは
「ある観測量Yが別の観測量Xのべき乗に比例する」つまり、y=ax^kで示すことができる分布のことです。世の中の様々な自然現象や社会現象はこのべき分布に従うことが知られています。右に裾野が広いロングテールという特徴を持ちます。

尤度比検定とは
 少し難しいのですが、ある分布に対して二つのモデルの当てはまりがどっちの方が尤もらしいかを検定するものになります。機械学習畑の人は詳しいはずです。ここの理解は学問として重要なのですが今回は割愛します。詳しくは以下を参照してください。比較的わかりやすいです。
https://www.rinotc.com/entry/2016/01/14/%E5%B0%A4%E5%BA%A6%E6%AF%94%E6%A4%9C%E5%AE%9A

以上が用語の説明になります。

今回はそれぞれのトークンネットワークの次数分布がべき分布モデルと指数分布モデルのどちらに近似するかを尤度比検定を行って判断します。
べき分布モデルそのものとの当てはまりを調べ、近似しているかどうかを考慮する方法(コルモゴロフ–スミルノフ検定など)もあるのですが、計算量が膨大になるという問題や、単純なべき分布モデルよりも当てはまりの良い他のモデルがある可能性を考慮して簡単に他のモデルとの比較を行えるようにしておくという意図で、今回は尤度比検定を用います。

では実際に次数分布の抽出、尤度比検定を行っていきましょう。

次数分布の抽出&グラフの出力
kobetsuplot.py
import csv
import powerlaw
import matplotlib.pyplot as plt
import sys
args = sys.argv
tokenpath = args[1] +'.csv'
ad = {} #addressdegree
with open(tokenpath, newline='') as f:
next(f)
dataReader = csv.reader(f)
for row in dataReader:
if (row[2] != row[3]):
if row[2] not in ad.keys():
ad[row[2]] = 0
ad[row[2]] += 1
if row[3] not in ad.keys():
ad[row[3]] = 0
ad[row[3]] += 1
degrees = [v for k, v in ad.items()]
def plot_pdf_dot(self, data=None, ax=None, **kwargs):
if data is None and hasattr(self, 'parent_Fit'):
data = self.parent_Fit.data
from numpy import unique
bins = unique(trim_to_range(data, xmin=self.xmin, xmax=self.xmax))
PDF = self.pdf(bins)
from numpy import nan
PDF[PDF==0] = nan
if not ax:
import matplotlib.pyplot as plt
plt.plot(bins, PDF, **kwargs)
ax = plt.gca()
else:
ax.plot(bins, PDF, **kwargs)
ax.set_xscale("log")
ax.set_yscale("log")
return ax
fit = powerlaw.Fit(degrees)
print(fit.distribution_compare('power_law','exponential',normalized_ratio = True))
fig2 = fit.plot_pdf(color='b', label="distribution")
fit.power_law.plot_pdf(color='r',linestyle='--', ax=fig2, label="powerlaw")
fit.exponential.plot_pdf(color='g',linestyle='--',ax=fig2)
plt.xlabel('degree')
plt.ylabel('density')
plt.title(args[1] + ' degree distribution')
plt.show()

powerlawというpythonモジュールを扱います。前回取得したBATトークンのデータを見たい場合は

python kobetsuplot.py BAT

とすることで、それぞれのトークンの次数分布がべき分布モデルか指数分布モデルかどちらに近似しているかをグラフで見ることができます。tokenpathの指定に注意してください。

このグラフは次数分布とそれに対応するアドレスの数の両対数分布をとったものになります。べき分布モデルは両対数をとったグラフだと直線になるという特徴を持っています。赤線がべき分布、緑線が指数分布のモデルであり、今回は青い点が赤線、べき分布のモデルに近似していると思われます。

尤度比検定を行う

上ではグラフを通して視覚的にどちらに近似しているかを確認しましたが、同じpowerlawモジュールを使うと、どちらのモデルが次数分布に当てはまりがいいかを数値で示してくれます。というか実はさっきのグラフを出力した段階でターミナルに数値が出ているはずです。

(6.433091394715271, 1.2503441564129088e-10)

こんな値が図をプロットした際に一緒に出ていないでしょうか?
この左の値が尤度比検定の検定値で、右がその検定のp値になります。
簡単に言うと、

・左の値が正の数であれば今回出力した次数分布は指数分布よりもべき分布に近似する

・右の値が小さければ小さいほどこの結果が尤もらしい

と言うことを示します。
左の値が大きければ大きいほど、比較的べき分布の特徴を持ち、スケールフリー性を持つ。つまり自然現象や社会現象と同じ一つの特徴を持つと言えます。

まとめ

少し込み入った内容になってしまいました。
今回は誰かの意思によって管理されることなく、自発的、創発的に発生するネットワークは複雑ネットワークになっているという仮説のもと、現在発行されているERC20トークンの取引ネットワークが複雑ネットワークと同様のスケールフリー性を持ちうるのかを見てきました。
きっかけとして、スケールフリー性だけに注目しましたが、他にもスモールワールド性、クラスター性などが複雑ネットワークの特徴としても挙げられます。
この記事を読まれた皆さんも、自分が所有しているトークンの取引ネットワークは分散性を持っているのかどうか、調べてみることで、そのプロトコルが生き残るのか、ちゃんとブロックチェーンの上で行うサービスとしての意義があるのかを考えることができると思います。

参考資料
お知らせ

■ブロックチェーンエンジニア集中講座開講中!
HashHubではブロックチェーンエンジニアを育成するための短期集中講座を開講しています。お申込み、詳細は下記のページをご覧ください。
ブロックチェーンエンジニア集中講座:https://www.blockchain-edu.jp/
■フレセッツ株式会社では仮想通貨の事業者向け BtoB ウォレットの開発をしていただけるエンジニアを募集しています!詳しくはこちら→https://fressets.com/career/
■HashHubでは入居者募集中です!
HashHubは、ブロックチェーン業界で働いている人のためのコワーキングスペースを運営しています。ご利用をご検討の方は、下記のWEBサイトからお問い合わせください。また、最新情報はTwitterで発信中です。
HashHub:https://hashhub.tokyo/
Twitter:https://twitter.com/HashHub_Tokyo