Scratch × オープンデータ

#Scratchでデータサイエンス
MITメディアラボが開発している教育用のビジュアルプログラミング言語(プログラミング学習環境)であるScratchでオープンデータを扱ってみます．Scratchは「教育向け」や「ゲームを作る」という印象が強い気がしますが，ゲーム以外のことも色々できます．今回は簡易的なデータサイエンス・データ処理っぽいことをしてアプリを作ります！

###つくるもの
国の名前を入力するとその国の人口を教えてくれるアプリを作ります．
　　　　　![Screen Shot 2019-08-21 at 23.20.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76122/f2d8fbee-5bec-fc35-30f8-ea93419ef311.png)

###環境(つかうもの)
・Scratch3.0(ブラウザ版)
・Googleスプレッドシート
・オープンデータ(エクセル形式)

###オープンデータ
今回使うデータは[国連の人口データ](https://population.un.org/wpp/Download/Standard/Population/)にします．
![Screen Shot 2019-08-21 at 23.06.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76122/7f11af27-b9dd-9daf-d6c3-3b3aecdd0fe4.png)
１番上のものを使います．世界人口の男女含まれるものです．クリックするとエクセルのファイルがダウンロードされます．開くとこんな感じ(エクセルがPCに入っていない方はGoogleDriveに上げてから開いてください)．
![Screen Shot 2019-08-21 at 23.14.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76122/cddf370f-d2e8-e00e-2209-9eb46f90748e.png)
どんなデータを使うかで方法は変わりますが，今回はこのファイルのC列の「国名」と
![Screen Shot 2019-08-21 at 23.16.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76122/a1d5495c-f08a-9a69-9de1-335929093f72.png)
BZ列の「2020」年の人口予想のデータを使います．
![Screen Shot 2019-08-21 at 23.24.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76122/c5de0c53-c7d4-5e91-d085-6fe21ab7eec2.png)

###データ処理
Googleスプレッドシートで作業します．
先ほどのC列(国名)とBZ列(2020年の人口)をそのままスプレッドシートに貼り付けます．
　　　　　　　　　　　　![Screen Shot 2019-08-21 at 23.33.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76122/589b01cb-001d-d13f-306b-782df922865a.png)
見づらいしデータが整理されていなくてきたないですね．少し整えます．この辺のブランクや余計な項目を削除します．
　　　　　　　　　　　　![Screen Shot 2019-08-21 at 23.33.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76122/348534c6-a672-4517-94a5-2cccb250ee44.png)
見やすくなりました．
　　　　　　　　　　    ![Screen Shot 2019-08-21 at 23.38.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76122/62019209-3e66-158b-14d2-f66e36304d71.png)
さらにここから黄色くなっている見出し部分や使わない項目(例えば2行-17行はごそっといらない)を削除していきます．
　　　　　　　　　　    ![Screen Shot 2019-08-21 at 23.51.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76122/b90d6e89-35fd-30fc-d313-b8518c5e2f48.png)
見出しと国名以外の項目は1番下の行まで全部消します．ただ，「World」や「Africa」など大きい枠組みでの地域名は面白そうなので残します．この辺りはお好みで．値がずれてしまうと困るので削除するときは必ず行ごと消してください．
　　　　　　　　　　    ![Screen Shot 2019-08-21 at 23.55.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76122/7999fd75-b3fd-b03a-ca1c-65c7537cca2c.png)
不必要な項目を削除して見やすくしました．ただしこのままだと数字の間に空白が入っていて使いづらいです．なので空白は全て削除します．C列の１番上の行に以下の関数を入れます．

```
=SUBSTITUTE(SUBSTITUTE(B1,"　","")," ","")
```
あとは1行目を下にぐいっと引っ張れば他の行にも適用できます．
　　　　　　　　　　    ![Screen Shot 2019-08-22 at 0.04.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76122/37215389-6f64-51fe-9610-a7b963b85516.png)
次に気になるのは数値です．1行目の「World」の人口が少なすぎます．実際は「7794799 **k**」ということですかね．なのでとりあえず全部の値に1000掛けます．
　　　　　　　![Screen Shot 2019-08-22 at 0.09.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76122/fe7fc185-9a42-b9dd-3039-15ba23c9405f.png)
で，全部に適用．それっぽくなりました！
　　　　　　　![Screen Shot 2019-08-22 at 0.11.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76122/70c4e195-bd35-c180-e3dd-f4ff7902cb93.png)
これでデータをうまく整形できました！
最後に，Scratchに取り込めるようにスプレッドシートで作成したデータをCSV形式でエクスポートします．
![Screen Shot 2019-08-22 at 0.15.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76122/02ed8f73-0e95-84be-3ca3-3687773312b4.png)
これでようやくScratchでオープンデータを扱う準備ができました！以上でデータ処理はおわりです！

###Scratchでデータを読み込む
先ほどのCSVファイルを読み込みます．ScratchでCSVを読み込む際にはリストを使うので，リストを作ります．国の名前を入れるとその人口を答えてくれるアプリを作るので，それとわかる名前でリストを作っておきます．
　　　　　　　　　![Screen Shot 2019-08-22 at 0.34.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76122/1d12b957-2676-9cc2-08b5-038c7507770b.png)
ここでは「country_name」と「population」の二つです．
　　　　　　　　　　　　　![Screen Shot 2019-08-22 at 0.33.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76122/3630adf4-2920-46bb-a5e9-3cad12932a8e.png)
空のリストが作成されました．
　　　　　![Screen Shot 2019-08-22 at 0.36.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76122/97d2ee06-1ef5-4921-dfac-df3821d5fce9.png)
次にこのリストを右クリックすると「読み込み」という項目がでるのでそれを選択します．
　　　　　　　　　　　　![Screen Shot 2019-08-22 at 0.37.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76122/168cee94-a7c0-fa41-2a87-b66446738641.png)
何列目を読み込むか聞かれるので該当する列を入力しましょう．上のスプレッドシートの通りであれば「country_name」は「1列目」，「population」は「4列目」のはずです．これでScratchに国名とその人口を取り込むことができました！
　　　　　![Screen Shot 2019-08-22 at 1.00.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76122/71800390-a376-0e0b-dccf-210eeb44db8b.png)
データの整形をしておいたので番号(ID)で国と人口が紐づいています．あとはプログラムを書けば(Scratchなので組み立てれば)簡単にアプリを作ることができます！

###国名を入力すると人口を出力するプログラム
実際に作ったものは[こちら](https://scratch.mit.edu/projects/324939902/)です．プログラム自体は非常にシンプルです．プログラムについては実際のものをみてもらう方がいいと思いますが，現在の実装をざっくり説明すると・・・

step1. 国名を入力
step2. 入力された国名にあたるまでリスト「country_name」の中を上から探索
step3. その際，番号(ID)をカウント
step4. 一致があればストップ
step5. カウントされた番号(ID)に該当する値をでリスト「population」の中から選び出力

というアルゴリズムになっています．関数などを自作しなくてもScratchの組み込みの機能だけでできます．
　　　　　　　　　　![Screen Shot 2019-08-22 at 1.04.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76122/a16ec663-ca9f-2206-9a10-ade9fb61328b.png)
この程度のブロック数でできますが，もっとシンプルに書ける気もします．

実際のアプリは言語の選択ができたり，デザインやBGMも付けているのでもっと別のブロックもあったりします．

また，入力はキーボードから受け取っているので国名を正確に入力(大文字小文字を区別したり)しなくてはならないのでまだまだ改良の余地ありです．
　　　　　![Screen Shot 2019-08-22 at 1.14.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76122/231ea51f-41b4-f673-b01f-c9c0d589745a.png)

###まとめ
Scratchは教育用のイメージがありますが，やろうと思えばいくらでも複雑なことができます．スプレッドシートとScratchを使えば，ちょっとしたデータサイエンスに触れることができます！今回は，

・スプレッドシートを使った簡単なデータの整形
・Scratchでの読み込み
・Scratchのリストでデータを扱う

というのを試しました．
とっても楽しいのでデータを変えていろいろ試してみるのがオススメです！「こういうデータを使ってこんな面白いことできるよ！」というアイディアたくさん募集中です！

###Reference & Acknowledgement
1. Scratch, https://scratch.mit.edu/.
2. United Nations "Population Division", https://www.un.org/en/development/desa/population/index.asp.