サイトopendata.permkrai.ruは、地域の生活のさまざまな分野について約1,400の統計指標を公開しました。 このデータで何ができますか? 私の頭に浮かんだ最初の考えは、 スプリアス相関サイトの類似物(偽相関)を作成することでした。
TL; DR:
ソース: github.com/yakov-bakhmatov/odpr
アプリケーション: odpr.bakhmatov.ru
ソースデータ
取得方法とデータ形式は、開発者向けのページで説明されています 。 要するに、Webサービスはメタデータの説明(インジケーターのリスト、「キューブ」のリスト-OKATO、OKVED、世界の国々などのインジケーターの追加パラメーター、インジケーターとキューブのペアのリスト)をxml形式とデータ自体で提供しますxmlおよびcsv形式のインジケーター識別子とキューブのペア。
「目」で初期分析を簡素化するために、csv形式を選択しました。 この形式では、エントリの形式は
カレンダーレベル、日付、メトリック名、高度なキューブオプション、値
カレンダーレベルは1〜5の数値です(1年、2年半、3四半期、4月、5日)。
簡単な分析により、次の問題が明らかになりました。
- 一部のインジケーターでは、データがほとんどありません-1つまたは2つのレコード。 そのようなインジケータは破棄する必要があります。
- ロシアの他の地域に関連するデータがあります。 そのような行は、除外する必要があります。
- 多くの値が年の初めから増加しています。 チャートに表示すると、「のこぎり」が表示されます。 これらの値のそれぞれに、年の初めからの期間ではなく、指定された四半期/月に関連する数値が含まれるように、これらの値を「正規化」することをお勧めします。
- データのギャップがあります-情報は、1年のすべての月/四半期については利用できず、すべての連続した年については利用できません。 私は月/四半期を逃した年を破棄し、年を逃した指標を除外しました。
- メトリックの重複。
これらの問題はすべて何らかの方法で解決されたため、アイデアの実装に進みます。
アプリケーションのアイデア
カレンダーレベルが同じで日付範囲が重複するインジケーターのペアごとに、ピアソン相関係数を計算します。 相関係数係数が0.9より大きいペアを選択します(| r |> 0.9)。 Webアプリケーションページを開く(または更新する)と、1つの座標系で構築されたランダムペアチャートが表示されます。
また、検索またはフィルターを使用可能なすべてのペアのリストも必要です。
ツール
私はハッカソンの時間枠にとどまろうとして、アプリケーションをすばやく作成したかったのです。 私が選んだツールは次のとおりです。
- サーバー側-clojure + http-kit;
- クライアント部分-インジケーターのリストのためのclojurescript、チャートを表示するためのハイチャートライブラリ;
- 最良かつ最も実績のあるnosqlリポジトリは、ネイティブclojure edn形式のシンプルなファイルです。
プロセス
データの読み込み
まず、データをソースからダウンロードする必要があります。 ここで最初のトラブルが待っていました-数十個のデータファイルをダウンロードした後、 opendata.permkrai.ruサイトは500番目のエラーを出し始めました。 この段階をいくつかのアプローチに広げなければなりませんでした。
第二に、私は自分を岡戸の「キューブ」に制限することにしました。
合計で、合計容量が256 MiBの1151個のファイルがダウンロードされました。
データ準備
次に、各ファイルが解析され、行がセットごとにグループ化されました(カレンダーレベル、インジケータ、OKATO)。
Perm Territoryに属さない行は破棄されました。
重複した、逃した期間は削除されました。 インジケータの値は「正規化」されています。
この段階の後、11468個のデータシリーズが残りました。
相関計算
ここで複雑なことはありません。 これらの系列が異なるインジケーターに属し、同じカレンダーレベルを持ち、日付範囲の交点に少なくとも8ポイントがある場合、2つの行間の相関係数を計算します。
129,507ペアで、相関係数が0.9以上(または-0.9未満)でした。
後処理
一般的に、ほぼ13万ペアが多いです。 妥当な時間内に、このような数のグラフを見ることができなくなります。
しかし、実際には、インディケーターの内部では、系列間に非常に小さな差がある場合があります(逆に、相関係数は大きく、1に近い)。 指数Xにn行が含まれ、指数Yにm行が含まれる場合、n * m個の相関ペアがありますが、関係を示すには1ペアで十分です。
修正中です。 セット(カップルの最初のメンバーのインジケーター、カップルの2番目のメンバーのインジケーター、相関係数のサイン)に従ってすべてのペアをグループ化し、各グループから1つの代表を残します。
その後、501インジケーターの11,278行に19,390ペアが残りました。
Webアプリケーション

結果のグラフは2つの方法で表示できます。 ページを更新し、毎回ランダムなスケジュールを取得できます 。 すべてのインジケーターのリストに移動して、興味のあるものを選択できます。
おわりに
このサイトは、割り当てられた数百ルーブルがなくなるまで利用可能になります。 ソースはgithubで利用できます。必要に応じて、誰でも自分でアプリケーションをデプロイし、データを試すことができます。
このアプリケーションは、3晩の楽しみのために作成されました。 別の夜はこの記事を書いて過ごしました。 私はその日に会ったと仮定できます。 ハッカソンは成功しました!