美術館の行列とターゲット層について
とある美術展の行列が凄い。そしてそのことに端を発して幾つかコメントが流れてきているうちに、ふと、今のマーケティングにおけるターゲティングの限界を思い出したので、忘れないうちにメモをしておきます。
若冲展の人気が凄い
ツイッターでも行列の写真が回ってきていて本当に凄い人気です。
とあるツイッタラーさんの指摘
美術館というものは、要するに「他人のお墨付きがなければアートかどうか判断できないバカが行く場所」であって、考えても見ろよ、中世~ルネサンス時代の貴族達はその時代を生きる巨匠達に夢中だったのであって、ローマの美術家達に夢中だったわけじゃないだろ。
— 砂鉄 (@satetu4401) 2016年5月14日
これは、”美術館はもっとカジュアルになれないのか?”という若冲とは異なる文脈で語られていたのですが、言い得て妙でもあります。*1
日曜美術館で放送されると美術館が混むという現象に最近拍車がかかっている気がします。
例えば”クラシック音楽”について
この本に詳しいのですが、西洋で「クラシック」というジャンルが成立する経緯に、元々貴族だけが楽しんでいたジャンルの音楽をブルジョワ階級が楽しむようになったので過去の権威として”クラシック”というジャンルを作るようになった、というような指摘がありました。*2
芸術の消費において、誰かのお墨付きを得ることで消費する、というのは今に始まったことではありませんし、文化事業であると同時に興行でもある展覧会は、何も一部の理解者の為だけに閉じたイベントである義理もありません。
ところで、ターゲットのマインドがわかったらターゲティングできるのだろうか?
「他人のお墨付きがなければアートかどうか判断できないバカ」が美術館の客層なのかどうかは一旦、置いておいて、例えば仮に美術館の客層を以下に分類したとします。
1)余暇とお金がある高齢者層でNHKで特集された”間違いのないコンテンツ”を人生経験として見に行く。
⇒ せっかく凄いのが来てるんだから見ないともったいない、と思って見に行く。
2)ちょっと無理して背伸びをしたいスノッブ。
⇒ ちょっとマイナーな作品を見に来て良さがわかる自分がかっこいい。
3)美術の学生で勉強にきた。
⇒ 構図やタッチ 本物を見ないとわからないことがある!
4)美術鑑賞が趣味なので暇さえあれば行く。
⇒ 今日はリフレッシュした!
例えば、
印象派展のようなものであれば、1)のターゲットがメインでドル箱でしょう。国宝系もそうだと思います。
一方で新進気鋭の建築家、などであれば、3)や4)が手堅いターゲットで、後は2)をどれだけ連れてこれるか?にかかってくると思います。
では上記のような消費マインドを元にしたターゲティングをすることはできるのでしょうか?
せいぜいデモグラフィックと興味対象程度でしか絞れない
GoogleAdWordsのターゲティングでは、せいぜい
・デモグラフィックと呼ばれる性別・年齢
・特定のジャンルのサイト = コンテンツターゲット等
・特定のジャンルに興味がある人 = トピックターゲット等
・競合や特定のサイトをよく訪問している人 = カスタムアフィニティ
といった程度でしか区切ることはできません。
ましてや2)のような、ちょっと背伸びしたいスノッブを対象にするのは、とても難しいのです。
「他人のお墨付きがなければアートかどうか判断できないバカ」をターゲットとしても、彼らを狙って広告を打つことはできません。
だから実際のターゲティングは今でもマス
ソーシャルゲームが大量にTVCMを打つのも、結局予算があればそれが一番効率が良いからですし、映画の宣伝でタレントの吹き替えを立ててTV番組で露出をするのも同じです。
映画なんて半分以上の人は滅多に行かないのですから、マスマーケティングである必要はないのですが、その「たまにしか行かない人」を呼んでこないと成立しない、場合は、マス広告に頼らざるを得ないのが現状です。
でもインサイトをついたマーケティングにはしたい
美術館に来る理由が”TVで言ってたから”であろうと、”ノルマ的に行っていることが大事”であろうと、何らか満足して帰って貰えるなら、彼等が何を期待して来訪し、何を得て帰って行くのか? ということは意識して展示内容を考えたり、広告を考えたりするのは、とても重要なことではないかと思います。
そこで新しく美術館に来る理由が増えたら、層も広がります。
できもしないターゲティングで頭を悩ますことは無駄かもしれませんが、ユーザーインサイトを分析することはとても重要だと思います。
-----------------------------------------------------
最近良かった展覧会
因みに最近の自分のヒットはこの展覧会です。
例えばイタリアの風景を描いた風景画には、こんな背景があります。
絵が綺麗とかバランスがいいとか、そういう話以外にも歴史的背景が知れたりする展覧会で、とてもおもしろかったです。
【備忘録】pythonで逆行列を使いながらニュートン法を試してみる
最近sympyライブラリにはまっています。とても便利です。
ただ単に如何にsympyが便利か、ということのために練習の記録をアップしました。
今回のお題
ガーデン家具の製造業者が木枠とアルミ枠のガーデンチェアを製造しています。
木枠は1つ18ドルの製造経費、アルミ枠は10ドル、とし、製造台数を
木枠:x
アルミ枠:y
とする。
また、販売価格が
木枠:10+31*x**-0.5 + 1.3*y**-0.2
アルミ枠:5+15*y**-0.4 + 0.8*x**-0.08
となるとわかっているとき、
1日あたりの利益の最大値を考える
また例の本からです*1
先ず、グラフにしてみる
1日の収入zは以下になります。
(*なんでわざわざこんな複雑なモデルにしたんでしょうか?著者は)
z = x*(10+31*x**-0.5 + 1.3*y**-0.2) -18*x + y*(5+15*y**-0.4 + 0.8*x**-0.08) -10*y
これをsympyを使ってプロットしてみます。
# -*- coding: utf-8 -*-
from sympy import *
z,x,y= symbols("z x y")
z = x*(10+31*x**-0.5 + 1.3*y**-0.2) -18*x + y*(5+15*y**-0.4 + 0.8*x**-0.08) -10*y
from sympy.plotting import plot3d
plot3d(z,(x,0.1,10),(y,0.1,10))
何故か「0」を入れると塁乗ができないよ!と怒られるので、
0.0 cannot be raised to a negative power
プロットの時は、xとyの開始の値を0.1にしておきました。
ランダム探索法を使ってみる
少し狡いですがグラフから少なくともxもyも10以下でしょう、と想定して、10までの中で先ずランダムに初期値を求め zの初期値zminを出します。
ループの中で、更にランダムにx,yを出し、その場合のzの値z1を求めます。
そのz1がzminより大きい間はループを続けるようにし、zminの値も新たにz1で更新します。
1000回ほど繰り返してとめた値をzを最大化するx,yの近似値だと考えます。
zmin,xmin,ymin = symbols("zmin ymin xmin")
import random
#seedは使わなくても問題ないですが何となく
random.seed(1)
#10以下だとふんでいるため0~10の間の乱数を作ります
x1 = random.uniform(0,10)
y1 = random.uniform(0,10)
#そして代入してzの初期値を求めます
zmin = z.subs([(x,x1),(y,y1)])
#以下、繰り返し部分です
for i in range(0,1000):
#新たな乱数でzを求める
x1 = random.uniform(0,6)
y1 = random.uniform(0,6)
z1 = z.subs([(x,x1),(y,y1)])
#新しいzの値z1の方が先ほどの値より大きいうちは繰り返し
if z1 > zmin:
xmin = x1
ymin = y1
#zminの値を更新するのを忘れないようにします
zmin = z1
print('xmin',xmin)
print('ymin',ymin)
print('zmin',zmin)
結果
('xmin', 4.657253897915613)
('ymin', 5.9093752268644355)
('zmin', 52.0719318635198)
木枠は4.6台、アルミ枠は5.9台(およそ5台と6台)で、利益は52ドル。
ということになりそうです
ニュートン法を使ってみる
ランダム探索法では、本当に当てずっぽうなので繰り返し回数を多くしないとなかなか近い値にはなりません。もう少し早く収束するべく、ニュートン方を使います。
先ほどは直接zの値の大小を比べてループさせていましたが、今回ニュートン法では、zの勾配(微分)を0とするようなx,yを求めます。
(*先ほどのグラフで、zの最大値は極値を求めればよい、とわかっているからです)
xn,yn = symbols("yn xn")
xn = random.uniform(0,10)
yn = random.uniform(0,10)
for i in range(0,15):
N = Matrix([[xn],[yn]])
A = Matrix([[dzdx.diff(x),dzdx.diff(y)],
[dzdy.diff(x),dzdy.diff(y)]])
A = A.subs([(x,xn),(y,yn)])
F = Matrix([[dzdx.subs([(x,xn),(y,yn)])],
[dzdy.subs([(x,xn),(y,yn)])]])
#ニュートン法のキモの部分
#手作業で逆行列の要素を計算式にしなくてもsympyは大丈夫です
N = N - A.inv()*F
#xnとynの値を更新します
xn = N[0]
yn = N[1]
#確認で都度、出力してみます
print("N",i,N)
print("z",i,z.subs([(x,xn),(y,yn)]))#最終の値を出力
print("N",N)
print("z",z.subs([(x,N[0]),(y,N[1])]))
先ほど同様に初期値はランダムに求めて、行列Nとしています。
一般的にニュートン法では、偏導関数を成分とする行列をAとすると
F(x(0)) + A(x - x(0) )=0
を解いて
x(1) = x(0) - (Aの逆行列)*F(x(0))
と更新するのでした。
このとき Aの逆行列を求めるのが手計算ではしんどいのですが、sympyでは、A.inv()と記述するだけで済みます。ちょっと感動的ではないでしょうか?
試しに例をここに
from sympy import *
a,b,c,d = symbols("a b c d")
A = Matrix([[a,b],[c,d]])
print(A)
print(simplify(A.inv()))
結果は以下の通り、見慣れた公式の通りです。
Matrix([[a, b], [c, d]])
Matrix([
[ d/(a*d - b*c), -b/(a*d - b*c)],
[-c/(a*d - b*c), a/(a*d - b*c)]])
また、先ほどのコード結果は、
('N', 0, Matrix([[3.11021951910684],[4.39753563309424]]))
('z', 0, 50.4978633181626)
('N', 1, Matrix([[4.26447040602873],[5.59713059033704]]))
('z', 1, 51.9880863435632)
('N', 2, Matrix([[4.66015416182119],[5.84578821398569]]))
('z', 2, 52.0723541378789)
('N', 3, Matrix([[4.68944643469009],[5.85200277371353]]))
('z', 3, 52.0726917916350)
('N', 4, Matrix([[4.68958529813255],[5.85199380485953]]))
('z', 4, 52.0726917987936)
('N', 5, Matrix([[4.68958530121007],[ 5.8519938044504]]))
('z', 5, 52.0726917987936)
('N', 6, Matrix([[4.68958530121007],[ 5.8519938044504]]))
('z', 6, 52.0726917987936)
('N', 7, Matrix([[4.68958530121007],[ 5.8519938044504]]))
('z', 7, 52.0726917987936)
('N', 8, Matrix([[4.68958530121007],[ 5.8519938044504]]))
('z', 8, 52.0726917987936)
('N', 9, Matrix([[4.68958530121007],[ 5.8519938044504]]))
('z', 9, 52.0726917987936)
('N', 10, Matrix([[4.68958530121007],[ 5.8519938044504]]))
('z', 10, 52.0726917987936)
('N', 11, Matrix([[4.68958530121007],[ 5.8519938044504]]))
('z', 11, 52.0726917987936)
('N', 12, Matrix([[4.68958530121007],[ 5.8519938044504]]))
('z', 12, 52.0726917987936)
('N', 13, Matrix([[4.68958530121007],[ 5.8519938044504]]))
('z', 13, 52.0726917987936)
('N', 14, Matrix([[4.68958530121007],[ 5.8519938044504]]))
('z', 14, 52.0726917987936)
('N', Matrix([[4.68958530121007],[ 5.8519938044504]]))
('z', 52.0726917987936)
となります。
15回も繰り返しましたが、既に5回めで収束していますね。値もランダム探索法の結果とほぼ同じです。
---------------------------
sympyの逆行列の求め方について
ニュートン法について
【備忘録】Rを使いながらバナー広告のA/Bテストについて考えてみる
恥ずかしながら普段はバナー広告のA/Bテストをほぼ行っていないのですが、そろそろ真面目に勉強しようと思って色々と調べてみました。
色んな方のブログがありましたが、僕の中では、この方の考えが合点がいったところがあります。
基本的にはこの方の考えに賛同し、比較についてはクリック数を棒グラフにして信頼区間を見ながら考えよう、というスタンスですが、
今回の記事では、そこに加えて、「では実際のデータでやってみようとしたらどういうことが起きうるか?」を考えてみたいと思います。
まず手元にあるデータってこんな形してません?
実際に自分の手元のデータでA/Bテストをしようとしてみると、色々と簡素化されたデータでは省略されていた問題が出てきて、どうしたらいいものか?と思うことはいでしょうか?(私が今そういう状況です)
適当に作ってみたデータ例です。
Creative Campaign Size Device IMP CTs 1 TYPE_A targeting_1 300 x 250 PC_Tab 2200 5 2 TYPE_A targeting_1 300 x 250 SMF 487200 820 3 TYPE_A targeting_1 320 x 100 PC_Tab 100 0 4 TYPE_A targeting_1 320 x 100 SMF 103500 40 5 TYPE_A targeting_1 320 x 50 PC_Tab 2100 10 6 TYPE_A targeting_1 320 x 50 SMF 550600 7500
例えば、GDNでバナーのデザイン別のレポートって、だいたいこんな感じではないでしょうか?
つまり、入稿したサイズ別*1、配信デバイス別、ターゲティングも”リマーケティング”、”アフィニティカテゴリー”、”トピックターゲット”等、「ん?これは一概に扱っていいのかね?」というデータで出てくると思います。
先ずは、データをプロットしてみる
先ほどのブログの通り、クリック率で比較するとして、データからクリック率(CTR)を求め、かつ二項分布と仮定して信頼区間をだします。
インプレッション数がサンプルサイズということになります。
#データの読込
df <- read.csv("test.csv",header=T)
#CTRの計算
df$CTR <- df$CTs/df$IMP*100
#負の二項分布だと仮定して信頼区間を入れてみる
df$lower <- qbinom(0.025,size=df$IMP,prob=df$CTR)/df$IMP
df$upper <- qbinom(0.975,size=df$IMP,prob=df$CTR)/df$IMP
head(df)
残念ながら信頼区間が出せないレベルのIMP数のものがあります。
Creative Campaign Size Device IMP CTs CTR lower upper 1 TYPE_A targeting_1 300 x 250 PC_Tab 2200 5 0.22727273 0.21000000 0.24500000 2 TYPE_A targeting_1 300 x 250 SMF 487200 820 0.16830870 0.16725780 0.16935961 3 TYPE_A targeting_1 320 x 100 PC_Tab 100 0 0.00000000 0.00000000 0.00000000 4 TYPE_A targeting_1 320 x 100 SMF 103500 40 0.03864734 0.03747826 0.03982609 5 TYPE_A targeting_1 320 x 50 PC_Tab 2100 10 0.47619048 0.45476190 0.49761905 6 TYPE_A targeting_1 320 x 50 SMF 550600 7500 1.36215038 NaN NaN
欠損値のあるレコードを除くことにします
df <- na.omit(df)
ggplot2を使ってクリック率を棒グラフにします。
library("ggplot2", lib.loc="C:/R-3.2.3/library")
g <- ggplot(df,aes(x=Creative,y=CTR,fill=Creative))
g <- g + theme_gray(base_family="Japan1GothicBBB")
g <- g + geom_bar(stat="identity",position="dodge")
g <- g + facet_grid(Size~Campaign+Device)
g <- g + geom_errorbar(aes(ymin=lower,ymax=upper,width = 0.3))
g <- g + geom_text(aes(x=Creative,y=0,label=round(CTR,2)),vjust=-1.2,size=8)
g <- g + theme(axis.text.x=element_text(angle=0,size=8,color="black"))
plot(g)
ggsave(file="df.png",plot=g,height=8.27,width=11.69,scale=1)
facet_gridを使って、縦方向をサイズ別、横方向をターゲティング別+デバイス別、としました。
geom_errorbarを使ってエラーバーとして信頼区間を加えています。
しかしここで、「クリック率が高いこの施策の組み合わせが一番いいのだ!!」と早合点してはいけないと思います。
インプレッション数も一緒に考えてみたい*2
先ほどのデータでは、IMPがやたら多いものと少ないものとがあったと思います。
そもそも余り配信されない組み合わせは強化してもインパクトが少ない筈です。
g <- ggplot(df,aes(x=Creative,y=CTR,fill=Creative))
g <- g + theme_gray(base_family="Japan1GothicBBB")
g <- g + geom_bar(stat="identity",position="dodge")
g <- g + facet_grid(Size~Campaign+Device)
g <- g + geom_errorbar(aes(ymin=lower,ymax=upper,width = 0.3))
g <- g + geom_text(aes(x=Creative,y=0,label=round(CTR,2)),vjust=-1.2,size=8)
g <- g + theme(axis.text.x=element_text(angle=0,size=8,color="black"))
g <- g + geom_point(aes(x=Creative,y=0.4,size=sqrt(IMP)),color="blue",alpha=0.5) +
scale_size_continuous(range = c(min(sqrt(df$IMP))/50,max(sqrt(df$IMP)))/50)
g <- g + geom_text(aes(x=Creative,y=0.4,label=IMP),alpha=0.8,size=4)
plot(g)
ggsave(file="df2.png",plot=g,height=8.27,width=11.69,scale=1)
ということで、geom_pointを使ってインプレッション数をバブルチャートで加えてみました。
バブルチャートの場合、面積が大きさとなりますので、サイズ=半径については、平方根(SquareRoot)をとる方がよいのかなと思いました。
この中で、IMP数が多いターゲティングのうち、明らかにクリエイティブ別のクリック率に差があるものがあれば、そこにクリエイティブを併せていく、というのが良いのではないかと思います。
ターゲティング1でスマートフォンでの配信、ターゲティング2でスマートフォンでの配信が配信数が多そうです。その場合タイプAの方がクリック率が高いようですが、積極的にAだけにしよう!とする程の差でもない気がします。*3
ところでデバイスやサイズについての評価は?
A/Bテストといっても、そもそもクリエイティブの影響とターゲティングの影響とデバイス別の影響と、どれが一番影響しているの?クリエイティブを確認することに意味はあるの??
という疑問もあると思います。
そこで、回帰分析をしてみます。
#使わない値を外す
df <- df[,-which (colnames(df) %in% c("IMP","CTs","lower","upper"))]
#カウントデータなので二項分布を使ったロジスティック回帰
df_lm <- glm(CTR ~.,family=binomial,df)
summary(df_lm)
結果
Coefficients: Estimate Std. Error z value Pr(>|z|) (Intercept) -2.1547 1.4890 -1.447 0.148 CreativeTYPE_B -0.1318 1.0718 -0.123 0.902 Campaigntargeting_2 0.2168 1.0730 0.202 0.840 Size320 x 100 -1.9741 2.7654 -0.714 0.475 Size320 x 50 1.3091 1.6717 0.783 0.434 Size468 x 60 1.0124 1.3297 0.761 0.446 DeviceSMF 0.3110 1.2376 0.251 0.802
Estimateが影響の指数になるわけですが、このままではみにくいので、図示してくれる便利なパッケージを使いグラフで見ます。
library("coefplot", lib.loc="C:/R-3.2.3/library")
g <- coefplot(df_lm)
g <- g + theme_gray(base_family="Japan1GothicBBB")
plot(g)
ggsave(file="df_lm.png",plot=g,height=8.27,width=11.69,scale=1)
こんな感じです
ところでサイズって4つありましたよね?
一つ減っているのは、Rの優秀さの現れです。
サイズ、クリエイティブのタイプ、デバイス というのは数値ではなくカテゴリカルなデータです。本来は、0,1のデータに変換しないと回帰分析はできません。
例えば、クリエイティブの列は、クリエイティブAを「1」、クリエイティブBを「0」とする列に変換しないといけません。サイズだと、サイズAかどうか?で1列、サイズBかどうか?で1列、サイズCかどうか?で1列、サイズDかどうか?で1列、と作ります。
ただし、そのままだと情報が各カテゴリーで1つずつ余分になります。例えば、サイズAでもBでもCでもないとわかればDであることは明白ですのでサイズDに関する列は情報として余分です。
どれか一列を基準としてはずさないといけないのですが、Rのlmやglmは、勝手に一つ減らしてくれるのです。
逆に言うと、表やグラフを見るとき、それを思い出しつつ注意してみないといけません。
因みにこのグラフを見ると、クリエイティブタイプやターゲティングより、バナーのサイズの方の影響の方が多そうですね。
結論
残念ながら今回のテストデータでは、クリエイティブをどちらにすべきか?については、余り判断に足る情報は得られませんでした。
今回はテストデータでしたが、実際の施策でも結構そんなものじゃないかと思います。最初からちゃんとターゲティングができていれば無理にPDCAを回す必要なんてないからです。PDCAを回して何か小さな改善をしていくことよりも、事業へのインパクトの有無を判断軸にしておきたいと思います。
----------------------------
その他参考にしたサイト
■カテゴリカルデータの分析について
■バブルチャートについてsutchy.cocolog-nifty.com
■信頼区間について
http://cse.naro.affrc.go.jp/takezawa/r-tips/r/60.html
■エラーバーの出し方について
geom_bar | ggplot2で棒グラフや積み上げ棒グラフを描く方法
■coefプロットについて
【備忘録】Pyhtonで数式計算_常微分方程式
この記事の続きです
このsympyというライブラリの便利さは異常で、微分方程式も解けます。
例題*1
豚の体重wの成長率は豚の体重に比例すると仮定し、
初日(t=0)での豚の体重を200ポンド、
初日(t=0)での豚の体重の成長率は、5ポンド/日
とする
⇒ 成長率(dw(t) dt)が現時点での体重に比例するので、
dwdt = c * w(t) とおける。
w(0) = 200 かつ dwdtが t=0 のとき 5 になるので
dwdt = (5/200)*w(t) = (1/40)*w(t) となる
この微分方程式を解きたい
解きたい式
dwdt = (1/40)*w(t)
コード
# sympyをインポート
from sympy import *
# 変数 t を宣言
t= symbols("t")
# wは式として使うので式(Function)として宣言。
w = symbols("w",cls=Function)
dwdt = w(t).diff(t)
eq1 = Eq ( (dwdt - 1*w(t)/40),0)
# 微分方程式を解く時は、dsolveを使う。
# 変数分離法を使えるので hint="separable"のオプションを加える
ans = dsolve(eq1,w(t),hint="separable")
print("ans",ans)
# 積分定数C1が残るので変数宣言をしておく
C1=symbols("C1")
# 結果を見て改めてwを定義
w = C1*exp(t/40)
# t=0の時 200になる筈なので方程式を作り、C1について解く
eq2 = Eq ( (w.subs(t,0) - 200),0)
C1ans = solve([eq2],[C1])
print("C1",C1ans)
# wが求まったので改めて定める
w = 200*exp(t/40)
#実際に微分してt=0を代入した時に5になるか確認してみる
print(w.diff(t))
print(w.diff(t).subs(t,0))
結果
('ans', w(t) == C1*exp(t/40))
('C1', {C1: 200})
5*exp(t/40)
5
ちょっとかしこすぎないだろうか?sympy
-----------------------------------
微分方程式の解き方について
3.2. Sympy : Python での代数計算 — Scipy lecture notes
積分定数を宣言しちゃえ!ということに気がついたのはこちらの記事から
今回(も)引用した例題については、こちらの本のp57より。
この本、感度の計算についても触れてあって、統計の本の中でもマーケティング寄り。
まだ読書中ですが良書の予感がします。
*1:例によって前回の記事と同じ本からの引用です
機甲創世記モスピーダ_劇伴がよかった
ゴールデン・ウィークだからとここぞとばかりにまとめてアニメを見ているのですが、
機甲創世記モスピーダもまたいい作品でした。
OPがやたらかっこいい
作画マニアではないので無知だったのですが、有名な金田さんのOPでした。
動いていないのにとても動いているように見える動画。
緩急ついた異なるレイヤーの絵の動きがとても気持ちいいですね。
静止画をたくみに利用していることは宮尾先生のまとめで知りました。
劇伴と挿入歌がいい
- アーティスト: TVサントラ,松木みね,アンディ,WHILE ROCK BAND
- 出版社/メーカー: ビクターエンタテインメント
- 発売日: 1994/02/23
- メディア: CD
- クリック: 1回
- この商品を含むブログ (3件) を見る
作曲の担当の1人に久石譲さんがいます。
ナウシカの頃の感じの久石譲さんっぽい曲があるのですが、やはりこの頃の久石譲さんはいいですね。シンセサイザーもピアノもいいです。美しいピアノの音はほんといいですね。
ここぞというシーンで挿入歌が入るのですが、物悲しい曲のシーンがとても泣けます。映像というのは絵の動きと音が重要で言い方は悪いですがストーリーはその次でいいのです。絵と音楽でどれだけ見せるかが勝負ポイントです。それだけでストーリーは勝手に脳内で補完できてしまうので勝手に泣けてくるのです。
チーム愛があっていい
主人公がちょっと不器用な所があるのですが、喧嘩しそうになってもまたちゃんと集まってくるシーンが何回かあるのですが、とても熱いです。
敵なのか味方なのかわからない人も仲間に入れ、ちょっと性格に難ありな人も受け入れ、、昨日見終わったスラングルも敵側に大義名分がある話でしたが、この時代の作品は子供向けであっても敵だけが悪いわけじゃないパターンというのは多かったのですね。
----------------------------------
亜空大作戦スラングル_が衝撃的だった
先日TSUTAYAでたまたま”お?見たことない作品だなこれ”と借りた「亜空大作戦スラングル」
期待以上に面白い作品だったので感じたことを忘れないようにメモをしておきます。
主題歌がカッコイイ&歌詞が凄い
2クールでOPは入れかわるのですが初期のOPがとてもカッコイイ。
真っ赤な背景に図面の線画でロボが登場するというのは、なかなか中学二年生の心をつかんでいると思います。
何より歌詞の頭がおかしい。”ゴリラ!ゴリラ!ゴリラ!”が何の説明もなく登場するし、殆どずっとサビじゃないか!!という感じで”MISSION OUTER SPACE”が繰り返えされる。。。
劇伴がいい
この作品なんと劇伴が山本正之さんである。銀河旋風ブライガーもかなりお洒落な劇伴ですが、こちらも同じくお洒落。全編を通じて堪能できる。
2クール目終盤から急に面白くなりクオリティも上がる
前半のスパイアクションはそこそこ面白いのだけど、ギャグ要素が強いので好みによっては少し飽きてくる人もいる。
ところが第22話の「さらば友よ」を堺に急にストーリーが重くなり演出も急によくなる。
是非借りて見て欲しいのですがこの回はほんとまるまる釘付けになる回でした。
その後、爆発のシーンや戦闘シーンも気合が入るようになり、絵の見所が増えていきつつ、話も展開し”もう最終回か?”というほど激しい戦いと離別が始まる。
話も急展開し重くなる
前半は悪徳企業集合体がジワジワと世界の裏を牛耳っていく、という大人な(?)話なのですが、後半は路線変更し主人公と敵対組織との直接対戦が増えていきます。
そして悲しい別れが増えたり、敵側で下克上があったり、そもそも何故こんな敵対関係が生まれてしまったのか?という悲しい歴史も、、、敵にも同情せざるを得ない複雑な話になっていきます。
第3クールからのEDは悲しい曲で、毎回本編の余韻に浸っていました
色んな人のデビュー作らしい
とても詳しい人が解説しながら実況をしてくれていました
なんと29話の會川昇さんはこれがデビュー作だそうです。
僕は作画のことは詳しくないのですが、恐らくとても豪華な組み合わせが各話であったのではないかと思います。
とても泣ける!とか、とても映像が凄い!という作品ではないのですが、演出・劇伴・脚本のバランスがとてもよくて結果、52話ずっと追いかけたくなる名作でした。
余談。何故か最後に総集編
どうしてこうなったのか、大団円の52話の後に「総集編」が放送されています。DVDにも収録されています。恐らく休止が入ってもいいように用意していた総集編の回が、最後まで必要なかったので1回放送枠が余ってしまったのでしょう。”知ってるよ!”という感じでしたw
------------------
【備忘録】Pyhtonで数式計算
昨日、Rを使って単純な数値計算のやり方をメモしたのですが、
そもそも、Pythonを使ったら普通に数式計算できるんじゃないの??という疑問が湧いて来まして、
確認したらその通りでした、、、
ということでそのメモです。
方法
pythonのsympyパッケージを使うと、数値計算ではなく数式計算をしてくれます。
前回の最適化の問題は、19インチと21インチのTVの販売利益を最大化する為に総利益を最大化するポイントを見つけることでしたので、極値を求める作業となります。
ついては、
x1について微分して"=0"とおく、x2について微分して"=0"とおく、その両方を満たすx1,x2を探す
という作業になります。
今回のコード
#sympyをインポート
from sympy import *
#変数として使用する文字を定義
x1,x2,y = symbols("x1 x2 y")
#数式の作成
y = (339 -x1/100 - 3*x2/1000)*x1 + (399 -4*x1/1000 - x2/100)*x2 - (400000 + 195*x1 + 225*x2)
print(y)
#x1について微分した式を作成
dydx1 = diff(y,x1)
print(dydx1)
#同様にx2について微分した式
dydx2=diff(y,x2)
print(dydx2)
#上記2つの式を方程式として定義
s=symbols("s")
eq1=Eq(dydx1,0)
eq2=Eq(dydx2,0)
#方程式の解を求める
s = solve ( ( eq1,eq2),(x1,x2))
print(s)
#解を最初の式に代入した時の結果の値を計算
ans = y.subs(s)
print(ans)
print(ans.evalf())
結果
x1*(-x1/100 - 3*x2/1000 + 339) - 195*x1 + x2*(-x1/250 - x2/100 + 399) - 225*x2 - 400000
-x1/50 - 7*x2/1000 + 144
-7*x1/1000 - x2/50 + 174
{x1: 554000/117, x2: 824000/117}
21592000/39
553641.025641026
感動的なほどに簡単ですね!!
グラフで確認することも
from sympy.plotting import plot3d
plot3d(y,(x1,0,10000),(x2,0,10000))
sympyには3Dプロットもあります
---------------------------
参考にしたサイト
Plotting Module — SymPy 0.7.7.dev documentation