ITの隊長のブログ

ITの隊長のブログです。Rubyを使って仕事しています。最近も色々やっているお(^ω^ = ^ω^)

今週学んだことをちょっとだけ書く

スポンサードリンク

今月入社した会社さんは、いわいるデータサイエンティストを職とした感じで、Python、R、SQLを主に使うとのこと。

その中で「ほほー」と思ったこと(だけ)を書く。

ちなみに、大した内容ではなく自分だけのメモでおいておく。

任意の数値区切り別にグルーピングするSQL

例えば年齢のカラムがあるとして、10, 20, 30と10区切りでグルーピングしてそれぞれ合計を出してしてください。つー課題がありました。

まず、10で区切るということは、どこからどこまでが10で、どこからどこまでが20と数字の用意と分岐を用意しなければいけないと思いました。

最初Case文を書こうとしましたが、それは無理とすぐに気づく。なぜならCaseは記述しないといけないので、例えば、70歳まであるとしたら7つ分岐をかかないといけない。これはスマートじゃない。

「うーん」と悩んでいる内に回答がきたので残念でした。

で、やり方としては「整数除算」というプログラミング言語同じみの機能を使えばできることがわかりました。

Pythonで試してみると15という数字は10区切りだと、「10(代)」に当てはまります。それを求めるには

>>> 15 // 10 * 10

何故かこれで求まります。詳細を説明すると、15 // 10を計算すると1.5になるのかなと思いますが、プログラムの場合は型で判断されるので、除算されます。なので、1となります。それに1 * 10となり、15の区切りの開始数値は10となります。

当時色々勘違いしてしまい、「15を10で割ったら1.5で掛けたら15に戻るじゃん!!?」ってずっと意味不明にタイプしていましたorz プログラマ

ちなみに、Pythonの場合だと15 / 101.5となりますので、//を使っています。

また、「どこから」の数字がわかったので、今度は「どこまで」の数字を求めます。

>>> (15 // 10 + 1) * 10 -1

()の中は、「どこから」の求める式の15 // 10は一緒ですが、そこに+ 1が入っています。15 // 10だと、値は1となりますが、これに+ 1することで10区切り値が繰り上がります。今回は2となり「20(代)」に入る準備ができました。

しかし求めたい値は「どこまで」なので、今回は19です。なので、その2を区切り値で掛けて20とします。そこから1引けば19となるため、求めたい値を取得することができる式ができました。

SQLで書くとこんな感じ。

select
  age / 10 * 10 as from,
  (age / 10 + 1) * 10 - 1 as to,
  count(*) as count
from
  age_tables
group by
  from,
  to

結果は、、、と思ったけど、データ用意するのが面倒なので、PythonのPandasでやります。

>>> import numpy as np
>>> import pandas as pd

# 30個ぐらいnumpyで適当にデータを用意する
# 0 ~ 100のint数値を30個ランダムで作ってくれます
>>> a = np.random.randint(0, 100, 30)
# それをDataFrameにする
>>> _data = pd.DataFrame({'age': a})
>>> _data.head()
   age
0   67
1   31
2   23
3   84
4   40

# 「どこから」の値を作成する
>>> _data['from'] = _data['age'] // 10 * 10
# 「どこまで」の値を作成する
>>> _data['to'] = (_data['age'] // 10 + 1) * 10 - 1
>>> _data.head()
   age  from  to
0   67    60  69
1   31    30  39
2   23    20  29
3   84    80  89
4   40    40  49

# グルーピングする。pandasってほとんどsqlと同じことできるよね。すごい
>>> _group = _data.groupby(['from', 'to'])
# countする
>>> _group.count()
         age
from to
0    9     2
10   19    6
20   29    2
30   39    3
40   49    2
50   59    1
60   69    6
70   79    4
80   89    2
90   99    2

ほえー。すごい。

素数を求める

エラトステネスの篩(ふるい)というのがあるとのことでした。

これを使ったら素数を求められました! 以前、同じことをやろうとして自分で実装しようとしたけど、こんなのあったのね(°ω°

まぁこれは仕事関係なさそうだけど

雑感想

最初の研修は知っていることが多く、1時間もするとすぐだれて、「早く仕事したい」なんて思っていたけど、SQLで死んだ。

SQLの達人の本は持っているが、実家においたままで、今日本屋へいって立ち読みしてみたが、すごく知りたい情報が詰まっている感じだった。サボらなかればよかったとちょっとだけ後悔(´・ω・`)

またオススメされた本を購入してきたので、今日から勉強します。あと統計も。。。これが一番の難題やorz

ビッグデータ分析・活用のためのSQLレシピ

ビッグデータ分析・活用のためのSQLレシピ