乙Py先生のプログラミング教室
初学者のためのプログラミング学習サイト

データサイエンス

はいどうもこんばんは乙pyです。

今日はニコニコ動画さんの
有料会員の推移が気になってしまったので
有料会員数の予測をしてみました。

解説動画はこちら


まずニコニコ動画さんの
最近の有料会員数ですが
決算などで発表されているので
そこからデータ化しました。
年(期) 会員数(万人)
2015-09 253
2015-12 254
2016-03 256
2016-06 256
2016-09 256
2016-12 252
2017-03 243
2017-06 236
2017-09 228
2017-12 214
2018-03 207
2018-06 200
2018-09 194
2018-12 188


さてこれをPythonを使って予測していきます。
最初に必要なライブラリの読み込みです。
from fbprophet import Prophet
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline

次の会員数をデータ化します。
データはPandasのデータフレームにします。
df = pd.DataFrame({
    'ds': pd.to_datetime([
        "2015-09-01","2015-12-01","2016-03-01","2016-06-01",
        "2016-09-01","2016-12-01","2017-03-01","2017-06-01",
        "2017-09-01","2017-12-01","2018-03-01","2018-06-01",
        "2018-09-01","2018-12-01"])
    ,'y': [253,254,256,256,256,252,243,236,228,214,207,200,194,188]
} , index=pd.to_datetime([
    "2015-09-01","2015-12-01","2016-03-01","2016-06-01",
    "2016-09-01","2016-12-01","2017-03-01","2017-06-01",
    "2017-09-01","2017-12-01","2018-03-01","2018-06-01",
    "2018-09-01","2018-12-01"
]))
これでデータフレームの完成です。

一旦可視化をして推移を見てみましょう。
plt.figure(figsize=(12, 6))
plt.scatter(df.index, df['y'])
plt.xticks(rotation=70)
plt.show()
nico01

このような会員数の推移ですね。
2015年あたりをピークに
そこからは下降路線をたどっています。

この推移から未来を予測します。

予測にはFacebookの
Propfetというライブラリを用います。

モデルの呼び出しも簡単です。
#モデルの呼び出し
model = Prophet()
学習も1行で終わります。
#学習
model.fit(df)
学習させるにはコツが必要で
時間に該当するものを ts というカラムでTimestampにしておく
数値は y というカラムでデータフレームに定義しておく
必要があります。

ファイルを読み込んでデータフレームを作った際は
カラム名やカラムのデータ型を
Propfet用に合わせる必要があります。

次に予測です。

予測は未来3000日分としました。
このライブラリは日で計算されるようで
引数 periods に日数を入れてあげて
model.make_future_dataframe()という関数を
呼んであげます。

そうすると予測用のデータフレームが作られます。

最後にmodel.predict()で作ったデータフレームで
予測結果のデータフレームを作ります。
#予測
future = model.make_future_dataframe(periods=3000)
forecast = model.predict(future)
たったこれだけで未来予測が終わります。

使える変数は日付と数値だけと
変数が少ないので
簡易な予測にはもってこいのライブラリです。


最後に予測の結果を可視化しましょう。
# 可視化
model.plot(forecast) plt.show()
nico02

日での予測の結果はかなり上下動が激しい感じなので
周期性の方を見てみます。

model.plot_components(forecast)
plt.show()
nico03

はい
これだと綺麗に予測の結果が出ますね。

このままの下降ラインをたどると
2026年には有料会員数が0になるという結果がでました。

下振れが激しければ2024年でも
有料会員数が0になる未来もあり得るという予想結果でした。

あくまでも現状の数値を使っての予測のため
そのままの下降線をたどるということは
少ないかもしれませんが

施策次第では
V字回復もあり得るシナリオではあるので
これからのニコニコ動画さんの
巻き返しに注目したいところです。

頑張れニコ動!!!

はいどうも乙pyです。

先日8年間見ていた
モコズキッチンが終わってしまいました。

今回はそのモコズキッチンに関するデータのお話です。



モコズキッチンとは
2011年4月から8年間放送日本テレビ系列の
朝の情報番組「ZIP!」の料理コーナーで8時手前の3分間放送
この時間帯のF層を独占

俳優速水もこみち氏 通称「もこにき」による
オリーブオイルの多用や調味料の投下打点の高さ
手に入りにくい食材の乱用などで注目された
はちゃめちゃ料理エンターテイメント番組であった


人気若手俳優、速水もこみちさんが料理人として、毎日登場!
アドリブ満載、自然体の料理コーナー、
新感覚のキッチン・バラエティー (ZIP!公式サイトより引用) 


動画はこちら


桝太一アナの話では
全部で1896レシピ有ったそうです。

今回は少し欠けますが
1826レシピ分のデータを取得して
そのなかでのランキングを出しました。

なのでデータを料理する方法を
今回はやっていきたいと思います。

調理工程:
1.まずはデータを集める

日テレの公式サイトやFuluには
過去の動画やレシピがあるそうです
こういったところからデータを集めます。

手で頑張りたい方は
1レシピあたり20 * 1800回ほどのコピペをすることで
データを作ることができるかと思います。

データをプログラムで作りたい方は
クローラーを作成して頂くとちゃちゃっと
データが手に入ります。

Python
BeautifulSoup
requests
Selenium
ここら辺のライブラリがキーになりますので
ググって頑張ってみてください。

2.集めたデータを前処理する

手法としては
PythonとPandasを使ってデータ前処理をします。
1食材ごとに切り分けてカラムを作ります。
その食材があれば1 , なければ 0 として値を入れます。

いくら いちご
0            1
1            0
このような感じですね

これでカラムが食材と料理名になります。



3.前処理したデータで集計する

データフレーム化したデータを使っていきます

Pandasで

df[(df['カラム']==1)]['料理名'].count()

とすればカウント出来ます。

これをカラム分やるには

sum_dict = {}
for name in df.columns:
    sum_dict[name] = df[name].sum()

のように辞書型で集計してあげると良いでしょう。

最後に降順で辞書型の集計結果を表示すれば
どの食材が最も多く使われたのかが
導き出せます。

結果に関しては
ネタバレすると
面白くないと思うので
動画の方をご覧ください。

それでは



 

またまた数字のトリビアです

解説動画はこちら



まず最初のトリビアは
数字のトリビア.016


一人につき50人の知り合いがいるとして
それを6人まで巡ると地球の人口を超えるというものです。

50を人数の数だけ掛け合わせれば答えが出ます。

コードは
p = 50
for i in range(1,7):
    print('{0: 12}'.format(p ** i))
50
2500
125000
6250000
312500000
15625000000

はい見事に150億となり地球の70億人を越えました。
30人の知り合いでも7億となり日本の人口を越えます。

前に
「水曜日のダウンタウン」で
明石家さんまさんの知り合いそうな人に手紙を送り、
それを繰り返すことで何人たどればさんまさんにたどり着けるかを
検証した際は7人くらいだと思いました。

友達の友達は・・・
を6人繰り返せば
世界中の人と繋がる可能性があるわけです。

これを6次元の隔たりと言うとか言わないとか。
あのGREE社の語源ですね。

お次は
数字のトリビア.017

ちょっとロマンティックな関数が有ります。

それをPythonで再現します。

数学の方の関数を描画するのに
Sympyというのを使います。

from sympy.plotting import plot_parametric
from sympy import Symbol , cos ,sin

def draw_heart():
    t = Symbol('t')
    x = 16 * sin(t) ** 3
    y = 13 * cos(t) -5 * cos(2 * t) -2 * cos(3 * t) - cos(4 * t)
    plot_parametric(x,y,autoscale=True , title='heart' , show=False).show()

draw_heart()

結果は:
heart

なかなか綺麗なハートになりますね。
Sympyは数学的な計算を描画させたりできるので
高校生とかにはちょうどいいかもしれません。


お次は
数字のトリビア.018

平方数
その数値を掛け合わした結果と
その数値の個数,1からの奇数を足した結果が同じになります。

コードは
for i in range(1,21):
    print('{0:02} ** 2'.format(i) , i ** 2)
s = [a for a in range(1,1000,2)]
for i in range(1,21):
    print(i,sum(s[0:i]))

どちらとも同じ結果になります。

1 1  1
2 4  1+3
3 9  1+3+5
4 16 1+3+5+7
5 25 1+3+5+7+9

不思議ですね。
こんな法則があるんです。

はい、次は
数字のトリビア.019

なんとも不思議な計算結果ですね

コードは
for i in range(1,11):
    res = 49 ** i
    print('{0:017}'.format(res) , str(res)[len(str(res))-2:])

結果は:
00000000000000049 49
00000000000002401 01
00000000000117649 49
00000000005764801 01
00000000282475249 49
00000013841287201 01
00000678223072849 49
00033232930569601 01
01628413597910449 49
79792266297612001 01

1から10乗までかけてみました。

確かに奇数乗は末尾が49
偶数乗は末尾が01になりますね。

これを発見した人
相当暇人なんだろうなーと思うトリビアですね。

最後のトリビアは
数字のトリビア.020

単に365回101%かけ続けるだけですが
プログラムなら一瞬です。
1.01 ** 365
37.78343433288728

1日1%成長できるとすると
1年後には約38%成長できることになります。
R天のM谷さんが言っていたとか言わないとか。

ライバルは「昨日の自分」
これを常に心がけたいものです。

今回のトリビアはここまでです。

ディープラーニングを活用した
AIの社会実装事業を展開する株式会社ABEJAの主催する
カンファレンスイベント

ABEJA SIX 2019

こいつに行ってきました。

場所は品川駅徒歩五分くらいのところにある
グランドプリンスホテル新高輪の国際館パミール

会場には12:40分くらいに着いたものの
かなりの人で受付もすっごい並ぶ

基調講演はサテライト会場だったのだが
これもほぼ満員

まず最初は
株式会社ABEJA 緒方 貴紀 氏 

ABEJAのこれまでの振り返りと
今後のロードマップや展望について

2012年のディープラーニングの
ブレイクスルー以降
世界中でDL周りの研究開発が進み

今では主要な大会社では
ほぼほぼ実装が済んで
サービス展開されてる感があるが

様々な会社向けにAIの実装を手助けする
プラットフォームという印象のABEJA PLATFORM
を展開してますよ、ということだそうです。

近年のトピックの話

いくつかのワードが紹介された


イメージネットの分散学習による高速なモデルの生成
分散学習の民主化がなされたとのこと


3億枚の画像と512個のGPUで作られた
敵対的生成ネットワークだとか
生成された画像を見ても
区別がつかないな



2018年10月11日にGoogleからArxiv公開された論文で
汎用言語表現モデルだそう。

文中の単語の穴埋め問題などが解けるとか
自然言語処理の
デファクトスタンダードになるそう。

最近はこういうトピックが
ありましたとのことでした。

ここら辺はgithub にコード類も公開されているらしいので
情報はすぐ手に入りそうですね。

ABEJA PLATFORMでは
1.データ取得
2.データ蓄積
3.データ確認
4.教師データ作成
5.モデル設計
6.学習
7.評価
8.デプロイ
9.推論
10.再学習

ここら辺をサポートするよう
システム化したんだそうです。

いろいろ機械学習をする上では
手間のかかるところ多いですね。

学習はあっちゅうまだけど
データの整備と前処理で
死ぬほど時間かかってますから
それが軽減されると仕事は捗るよねーー。

リリースから6年ほど経つみたいで
現在では

600アカウント
データレイク 10TB
データセット170万
トレーニング 1万ジョブ
モデル500モデル 2千万バージョン
4000を超えるエンドポイントが
存在しているのだとか

うーーん、かなりのボリュームです。

スポンサーに
AWS , GCP , NVIDIA
とあるのでここら辺のクラウドやGPUで
達成されているのでしょう。

気になったのは
アノテーションの部分

ABEJA PLATFORM ANNOTATION

恐らくAI開発にとっては
アルゴリズムは民主化され、誰でも
同じアルゴリズムで学習や推論が行えるようになっているため

AIの差別化がはかられる部分としては
学習データの質とボリュームの部分での競争になる。

ゴミデータが大量に有っても
結果ゴミだし
そうなると質の高い学習データを揃えるのには
それなりのコストがかかる。

それをサポートするツールということで
UIも素早くアノテーションでき使い勝手がすごく良さそう。

これはAI関連サービスの中でも
いい所を突いたサービスだと思われる。

これにより、人間の目で補正をすることで
より質の高いデータを素早く生成できると・・・

画像や動画だけでなく
テキストや単語、文章へも対応と
よく出来ています。

ABEJA インサイト for リテール
店舗内行動のダッシュボード化
行動の定量化とデータドリブンな経営の支援をするためのツール

日々10TBトラフィック解析
700店舗のインストール
2億人のビジターを計測ということで
すでに我々もトラッキングされているでしょう。

雑貨、アパレル、商業施設の導入が多い。

顔認証によるリピート推定と
TOFセンサーによる店舗トラッキングの様子が
なかなか印象的だった。
店舗内回遊はこんな風に捕らえられているのね。


今後のロードマップ

データサイエンティストの不足で
初期検証を行えないというニーズに対して
初期検証の支援を行うmlaas
というのを出す?そうです。


あとは
アベコインとかいうものを作って
会場を巡ったりするともらえたりするそう。

深センへのツアーでの
キャッシュレス社会の体験をヒントに
コインを作ったそうで
今後このコインでいろいろ実験するそうです。

ここまでが基調講演



株式会社ディー・エヌ・エー 
AIシステム部 副部長
内田 祐介 氏 


DeNAの事業や組織、AI関連の研究成果の話

DeNAではkaggler制度があり
kaggleの成績が社内にも反映されるそうで
高成績を残せると、労働時間を多くkaggleにさけるそうです。

kaggleのメリットとしては
1 問解くだけで
1案件回した時と同じくらいの学習体験と
様々なお題に対応するために多様な手法、アプロート方法を
学ぶことによるスキルアップの効果が大きいということでした。

まあ、懸賞金付きのやつとかは
リクルーティングにも使われているわけで
kaggleマスターを抱えるているという
ブランディング効果も見込んでいるのだとか。

これはkaggle大好きな皆さんは
DeNA行くしかないですね。

DeNA社内は
データサイエンティスト
MLエンジニア
インフラエンジニア
AIエンジニアがいて
それぞれ作業分担されている組織構造

AIの検証、プロト開発から実装まで
行える体制が整っているのは大分強いですね。

DeNAでは
様々な事業基盤があり
そのなかでもAI開発が進んでいるのが
オートモーティブ事業

交通事故低減に向けた
AI技術活用の取り組みをしているだと。

レーン検出と危険運転察知アルゴリズムの開発
物体検出や消失点の計算
3D地図を用いたパスプランニング

自動運転系の技術は結構奥深いですよね。

次にゲーム事業

「逆転オセロニア」

におけるユーザーの離脱防止策についてのお話

ゲーム初期に離脱してしまう原因として
ゲームのデッキの組み方が分からないとかが有り、
おすすめデッキを導入したら比較的離脱が防げたと。

こういった序盤のサポート機能を追加する部分で
いろいろデータ分析と検証を進めているそうです。

最後が
アニメの生成技術への取り組み

GANを用いて
アニメのコマとコマの間を生成し
ぬるぬる動くように
中間コマを作ったのだとか。

従来のGANでは全身を作るのが難しかったが
パーツごとに少しづつ作ってゆく手法を取り
徐々に小さな画像からつなげるようなアプローチで
画像生成しているそうです。

確かにヌルヌル動きますね。


次の講演は
株式会社サイバーエージェント 
AI Lab Research Scientist
山口 光太 氏 


機械学習による広告クリエイティブの制作支援と生成

まあ同業者なので
同じようなことやってます。

デジタル広告は
マス広告と違って、同じ素材、同じ図柄ではなく
一人一人にカスタマイズした広告であることが求められる。

広告バナーそのものを
どれだけクリックされるのかを
事前予測して作ることができるとか。

手法としては
広告の画像そのものと
広告の配信条件を学習データとして
クリック率を出す単純な回帰のモデルを組む

これにより配信前に
ある程度の品質保証ができ
適切な入稿対象の選択と結果予測が可能になると・・・

まあ
みな考えることは一緒ですね。

面白かったのは配信メディアで
クリックに効く要素が違うということ

FBは画像やテキストの品質
TwitterとLINEは広告の配信設定だったと。

あとは機械学習のモデルも
画像とかを使わないのであればDLを用いずに
デシジョンツリーなどの方が結果が良いとか
逆にDLが効果を発揮するのは
高次元のデータを取り扱う際だとか。

ここら辺も広告業界では
共通認識ですね。

こういう予測を元に
クリエイティブ制作の支援として
ストック素材の画風変換
バナー人物の自動差し替え
レイヤーの配置予測や
キーワードの生成

などを行っているそうで
クリエーターの作業軽減につながっているそうです。

やはり、同じ業界だと
同じデータで同じ手法に収束するのだなーと
改めて感じた1日でした。


明日も開催されますが
行けないかなーー・・

松尾豊先生の講演は聞きたい。

またまた数字のトリビアの検証です

解説動画はこちら




最初のトリビアは
数字のトリビア.007




初めのトリビアは
数字のトリビア.011

きれいに1が並ぶピラミッドのような
かけ算の方法です。

桁が増えるごとに
1
12
123

と数を増やして行き
そこに9をかけて元の数より1大きい数を足します。

すると綺麗に1が並ぶピラミッドが形成されます。

コードは
for i in range(1,10):
    tmp = ''
    for j in range(1,i+1):
        tmp+=str(j)
    print('{0: 11} * 9 + {1:02}'.format(int(tmp),i+1), int(tmp)*9 +i+1)

結果は:

1 * 9 + 02 11
12 * 9 + 03 111
123 * 9 + 04 1111
1234 * 9 + 05 11111
12345 * 9 + 06 111111
123456 * 9 + 07 1111111
1234567 * 9 + 08 11111111
12345678 * 9 + 09 111111111
123456789 * 9 + 10 1111111111

となります。

お次は
数字のトリビア.012

これも似たようなかけ算です。

かける数字は1を桁分用意して、それを二乗するような形になります。

コードは
for i in range(1,10):
    a = int('1' *i)
    print('{0: 10} * {0: 10} = '.format(a) , a*a)


結果は:
1 * 1 = 1
11 * 11 = 121
111 * 111 = 12321
1111 * 1111 = 1234321
11111 * 11111 = 123454321
111111 * 111111 = 12345654321
1111111 * 1111111 = 1234567654321
11111111 * 11111111 = 123456787654321
111111111 * 111111111 = 12345678987654321

先ほどとは真逆で、1の連続を掛け合わせると
どんどん数字が重なって行きます。

次のトリビアは
数字のトリビア.013

宴会や合コンで使えるテクニックです。

まずは365日分の文字を用意します。
nums = []
for m in range(1,13):
    for d in range(1,32):
        if m==2 and d>28:
            continue
        elif m in (4,6,9,11) and d==31:
            continue
        nums.append('{0:02}{1:02}'.format(m,d))
次に
その文字を使って1年分の検証をします。

上記操作をすると
最後に相手に答えてもらった数字から225を引くと
相手の誕生日になるということです。

for day in nums:
    m = int(day[0:2])
    d = int(day[2:4])
    m2 = m * 4
    m3 = m2 + 9
    m4 = m3 * 25
    m5 = m4 + d
    answer = m5 -225
    print(day , answer)
結果は全部同じ日になります。

これでうまいこと
誕生日を知ることができるわけです。

まあ最初は
郵便番号とかしか
聞いてはダメでしょうねwww


次は

数字のトリビア.014

人と人との出会いが
いかに奇跡的なことかというお話です。
res=1
for num ,name in zip([1,60,60,24,365,50],['秒','分','時間','日','年','50年']):
    res*=num
    print('{0}は{1}秒'.format(name , res))
秒は1秒
分は60秒
時間は3600秒
日は86400秒
年は31536000秒
50年は1576800000秒

1秒に1人出会えても
50年で15億人しか出会うことはでき無いのです。

地球の全人類と出会うには
250年は掛かりそうです。

なので人生にの出会いというものは
奇跡なのだよという、ちょっと哲学的なお話です。


さて最後のトリビアは
数字のトリビア.015


組み換えが気持ちいーー
6桁の数字が有ります

それは

142857

これに
1から数字をかけて行くと・・・

for i in range(1,8):
    print('142857 * {0}'.format(i) , 142857 * i)

142857 * 1 142857
142857 * 2 285714
142857 * 3 428571
142857 * 4 571428
142857 * 5 714285
142857 * 6 857142
142857 * 7 999999

はい、結果は同じ数字が入れ替わります。
7までかけたら終了ですね。

いやー気持ちいい



このページのトップヘ