読者です 読者をやめる 読者になる 読者になる

俺、サービス売って家買うんだ

正直このペースで作ってればいつか2-3億で売れるのがポっと出来るんじゃないだろうか

iPhoneゲーム、「荻月のゴマビィ」をリリースしました。

Cocos2d-x サービス
f:id:ie-kau:20170111200551p:plain:w400


あけましておめでとうございます! @hazumu です。

前回 Hayato さんがめっちゃ質の高い記事を書いてたので新年一発目から尻込みしちゃいますね。

さてさてさてさて、一昨年の9月に途中まで作って放置していたゲームを去年の12月に作り込んで12末のAppleの審査がお休みの時期前に申請にだして、この年始に(多分1月2日ぐらい)に、なんとか初回リリースにこぎつけました。

今回はその紹介記事です。

ゲームの名は。

ゲームの名前は「荻月のゴマビィ」と言います。
よくわからんタイトルですが古典的な「コイン落とし + キャラ集めゲーム」です。

最初はキャラクターが黄色くて丸くて仙台名物萩の月に似ていたので「萩の月のゴマビィ」にしていたのですが、流石に商標とかヤバそうでよくわからないから適当に字をもじって意味不明な名前にしました。

ゴマビィというキャラクターは、今回デザインを全部やってくれた @kemkem_ さんが小学校時代にノートの片隅に連載していた、その名も「合体」という漫画の主人公を流用したものです。およそ20年の時を経て色と命を吹き込みました。何を合体させたかはご想像におまかせします!

iOS版ダウンロードはこちら。↓↓

荻月のゴマビィ

荻月のゴマビィ

  • Hazumu Jo
  • Juegos
  • Gratis

何はともあれ概要。

西暦2200年。

エネルギー問題に直面していた人類は月のエネルギーを利用することによりついに永久機関を開発することに成功した。

しかし、月のエネルギーを浴び続けた生物はどうしても他者との異存なしに生きられなくなってしまうという特性を持っていた。そう、融合である。

そして、いよいよその特性を悪用しようとする者が出てくる。 その一人が「ゴマ・パロアルト博士」。彼は、いわばマッドサイエンティストである。

2つの生命体に月のエネルギーを浴びせ、お互いの生物の強依存を利用して2つの生物の融合を促進する機械を開発してしまったのだ。。

最初に創りだされた生物の名前は「ゴマビィ」。 ゴマビィは、「みんなが大好きな仙台銘菓のあのお菓子」と「ゴマフアザラシ」の融合生物(キメラ)である。しかも量産型。

しばらくすると博士の研究所は合成生物で溢れかえっていた。 そんななか偶然生まれた知性をもった一匹の「ゴマビィ」。彼は月にある研究所の頭上に青く光る星を見ながら思った。

「生命として生まれてきたのに、こんな自由のない暮らしをしていて良いのだろうか?僕たちは自由を得るために戦うべきではないのだろうか。」

(後に彼は「民衆を率いる自由のゴマビィ」と呼ばれることになるが、それはもう少し後の話しである。)

そして、あの日、星が降った日。それはまるで、 まるで、夢の景色のように、 美しいながめだった日、知性をもったゴマビィはついに立ち上がった。 数多くのゴマビィやその他の合成生物(キメラ)を率いて博士の研究所内で大暴動を起こしたのだ!

「量産型のゴマビィはどうでもいい!少しでも、少しでもレアな合成生物(キメラ)は捕まえなければ。ワシの資産が!」 合成生物(キメラ)たちのの暴動の中で博士は、UFOに乗り出し逃げ出そうとする合成生物を捕まえる作戦を始めたのだった!!

■追伸 ちなみにこのゲーム内においてあなたの立ち位置は博士であることを述べておこう。

コイン落としです!

説明

ダウンロードしたくなる説明をいざ、転載!!

f:id:ie-kau:20170112191756j:plain

f:id:ie-kau:20170112191809j:plain

f:id:ie-kau:20170112191820j:plain

こだわりポイント

1. 思わず抱きしめたくなる愛くるしいキャラクター

f:id:ie-kau:20170111203459p:plain

f:id:ie-kau:20170111203506p:plain

こんな感じのキャラクターがなんと全32種類!!!

新しいキャラクターを捕まえると、そのキャラクターのなきごえせつめいを見ることができます。 時代にそぐったあんなキャラクターやあんな人のパロディーも出現するかも。

全てコンプリートして、ゴマ博士を目指しましょう。

2. 剽軽な楽曲

無料素材です!
が、、素材が素晴らしいのでどんなに落ち込んだときだってイヤフォンをつけてプレイすれば気持ちも剽軽になります!

クレジット

スタッフ

音楽素材提供

展望

正直言って出すことが目的になってたのでやるかわからないのですが、余力があればこの辺をやってみたいですね。

  • 手ゴマ(体力)回復のインターステシャル広告入れてみたいよね
    • その上でadsを打ってリクープするか見てみたい
  • キャラを増やす
  • キャラクターが弾丸っぽいので弾幕シューティングゲームに作り変える

さてと!

今年も、公私にわたってたくさん作るぞ!!リリースするぞ!!
٩( 'ω' )و オラッオラッ

実店舗の売上データで分析する。(タンタンタイガー)

統計 seaborn Python

あけましておめでとうございます! Hayatoです。
去年の暮に出したかったんですが惜しくも間に合わず、年を越した渾身の記事から今年のblogをスタートです!

友人が店主の担々麺屋でタンタンタイガーってのがあります。2016年8月に開店したので、まだ半年しか経ってないのですが、割りといい感じでお客さんが来てくれてます。今回は、そのお店の実際の売上データを、Pythonで分析していきます。

なかなか実店舗のガチデータを公開することはないので、貴重な機会ではないでしょうか。データ分析を練習中の人はもちろん、これから飲食店をやろうとしている人や、いま売上を伸ばすのに苦戦中な飲食店店主さんにも役に立つとうれしいです。

分析ノート(iPython notebook)はGithubにもあげているので、こちら気になる方は参考にしてください。(重いので携帯では見れないかもです)

github.com

Index

  1. データクリーニングと把握
  2. 分析計画
  3. 実際に分析

それでは早速やっていきましょう!

1. データクリーニングと把握

まずはデータをきれいにすることから始めます。今回は気象データが売上にどれくらい影響しているかを調べたかったので、気象庁のデータをこちらから持ってきて、日付で突き合わせました。データ量が少なかったので、スプレッドシートで処理しています。

実際の処理後のCSVデータはこちらにあるので、分析の練習や、お店のシュミレーションに使ってください!

処理が終わったら、どんなデータなのかを見ていきます。分析前に大まかな概要を掴んでおくのはとても大切です。

データの概要を把握

#必要なライブラリを予めすべてインポート
import pandas as pd
import numpy as np
import pylab as pl
import seaborn as sns
import matplotlib.pyplot as plt
from scipy import stats
%matplotlib inline
sns.set_style('whitegrid')
#CSVデータをDF形式で読み込み。 indexにdateを設定
rowdata = pd.read_csv('./data/tantantigerdata.csv', 
                      parse_dates=['日付'],index_col=['日付'], dayfirst=True)
#データ概要1:どういうカラムでどういうデータが入っているか確認
rowdata.sort_values(by='来客数', ascending=True).head(3) 
#データ概要2:平均値などを確認
rowdata.describe().astype(int)                     

結果: f:id:hayato1986:20170105205127p:plain f:id:hayato1986:20170105205135p:plain

なんとなくですが、

  • 前提:サンプル数は77 / 時系列データ。
  • 平均82人の来客数。単価平均は981円。
  • 52 ~ 112 人が95%の来客数範囲。この範囲を超えると何かあったと見て良いかも

くらいまでわかります。

2. 分析計画

データのクリーニングとその把握ができたら、実際の分析計画を立てていきましょう。 店主の東山さんと話して、以下のように計画を立てました。新規とリピーターの割合、天候と売上の相関に関して焦点を当てています。

1. 時系列における売上の推移はどうなっているか
 - 開店直後からの数値推移
 - 新規とリピーターの割合推移
 - リピーターと曜日の相関
2. 天候による売上の相関関係はどうなっているか
 - 気温と売上の相関
 - 天気と売上の相関

3. 実際に分析

それでは計画をもとに、分析をしていきましょう!
ようやく分析できる!ってところまで来ると、もう80%くらいは作業が終わってたりします笑

時系列における売上の推移はどうなっているか

開店直後からの数値推移 (新規顧客の推移 /リピーターの推移)

まずは単純に時系列の売上推移です。リピーター数と新規数も同時に出しています。
一日ごとのばらつきが結構大きく、全体を掴みづらいので14日の移動平均で算出しています。

rowdata_rolling = rowdata.rolling(window=14, min_periods=14).mean() #14日の移動平均

graph_num = 5
fig, axes = plt.subplots(nrows=graph_num, ncols=1, figsize=(16,12),  squeeze=False) #squeezeはsubplotsのおまじない

for i, col in enumerate(rowdata_rolling):
    rowdata_rolling[col].plot(ax=axes[i,0])
    axes[i,0].set_title(col, fontsize=14, fontweight='bold')
    i+=1
    if i == graph_num:
        break
plt.tight_layout() #スペース調整

結果: f:id:hayato1986:20170105205612p:plain

  • 10月がピークだった?
  • 全体数値は落ちてなさそう
  • 新規は落ちてそう
  • リピーターが増えてそう

くらいはわかりますね。実際にエリアチャートを使って視覚化していきましょう。

新規とリピーターの割合推移

rowdata_rolling.loc[:,['リピート数','新規合計']].plot(
    legend=True, figsize=(16, 8), y=['リピート数','新規合計']
          , kind='area', stacked=True, alpha=0.5
)

結果: f:id:hayato1986:20170105205749p:plain

  • リピーター数は伸びている
  • 新規は10月22日のTVCMで大きく増えたが少し右肩下がり
  • リピーター数が伸びているので新規の落ち込みをカバーしている。全体では減ってない

あたりは明確に言えそうですね。次は曜日ごとの数値の関係性を見ていきましょう。

リピーターと曜日の相関

#Pivot Table で分析 / aggfunc='mean' , columns='リピート数 の SUM'
rowdata.pivot_table(index="曜日",aggfunc='mean').astype(int)

#Group by で分析
week_group = rowdata[['リピート数','新規数']].groupby(rowdata['曜日'])
#week_group.mean()
week_group.mean().plot(legend=True, figsize=(16, 4), kind="bar", stacked=True)

結果: f:id:hayato1986:20170105212915p:plain

  • 日曜は新規客が売上を支えている
  • やや木曜日のお客さんの伸びが悪い
  • リピーターはどの曜日でもかわらない

といったことが言えそうです。タンタンタイガーはBlogで集客していたので、日曜日に遠方からのお客さんがちらほら来ていただけるのが大きいですね。

天候による売上の相関関係はどうなっているか

変数が多いので、関係ありそうなところだけを恣意的にピックして、相関関係を見ていこうと思います。

fig, ax = plt.subplots(figsize=(10,10)) #Sizeを定義する
data = rowdata.drop(['最高気温','最低気温','日照時間', '平均風速', '蒸気圧(hPa)'], axis=1)
sns.heatmap(data.corr() ,annot=True, linewidths=.5, ax=ax)

f:id:hayato1986:20170105210538p:plain

ここで注意しなければならないのは、新規のお客さんは時系列で少しづつ減っていて、リピーターが伸びていることです。相関係数だけを見ると、 来客数と気温に相関がありそうですが、開店直後から現在まででリピーター数が比例し、新規客が反比例するのはある種当たり前なので、一概に比例関係にあるとは言いづらくなっています。

その中でも言えそうなのは

  • リピート数と単価平均に相関が見られそう
  • 雨と来店数はあんまり関係なさそう
  • 風はすべての数値にほとんど関係ない

くらいでしょうか。段々と暖かくなってきたら、ここらへんはまた分析して本当の相関を見ていけると思います。 店長の東山さんが「今日は天気が悪かったからお客さんが少なかった」とよく言うので、おまけで平均気温と来客数の相関を視覚的な面から追っていきましょう。

気温と売上の相関を詳しく見てみる

sns.jointplot('平均気温', '来客数', data=rowdata, kind="scatter")

f:id:hayato1986:20170105211313p:plain 散布図上の見た目では、やはりそこまで相関はなさそうです。念のため、見逃している相関が無いかどうか散布図とカーネルグラフを描画します。

returns_fig = sns.PairGrid(data)
returns_fig.map_upper(plt.scatter, color='purple')
returns_fig.map_lower(sns.kdeplot, cmap='cool_d')
returns_fig.map_diag(plt.hist,bins=10)

f:id:hayato1986:20170105211418p:plain

やはりあんまり特徴的な関係性は見られませんでした。

まとめ

飲食店のデータは分析しがいがありますね笑。本当ならこの分析結果から、TODOを決めてってところまでやるのですが、Blogでは分析までということにさせてください!これからもタンタンタイガーのデータを定期的に分析していこうと思います。

オラッオラオラオラッ(ΦωΦ)

Google Analytics で AMP 対応ページへのアクセスを通常ページへのアクセスとして集約する方法

マーケティング
f:id:ie-kau:20161228154610p:plain:w400

AMPとは

Google社が主導するWEBページのモバイルを高速化するプロジェクトです。
詳しくはここ。

www.ampproject.org

詳細は省きますが実装方法は通常のモバイルページ加えAMP対応したページを用意した上で通常ページのメタタグに

<link rel="amphtml" href="[url]?amp=1" >

上記の様にAMPページへのリンクを記述してクローラに伝ええます。

僕らが使っている「はてなブログ」でもAMP対応は施されているようです。 をパラーメータに?amp=1をつければamp用のページになります。

http://www.ie-kau.net/entry/islands_in_Seto_Inland_Sea?amp=1

Google Analytics で分析する際に発生する問題

クエリパラメータでAMP対応ページを作成た場合にGAでアクセス数を計測する際、集計したい値によっては問題が発生します。
AMP対応ページも、その元となった画面も同一のコンテンツなのにもかかわらず、GAはパラメータを含めたURLを1ページとしてアクセス数を集計するため、同一コンテンツへのアクセスが通常のページとAMP用のパラメータが付いたページで分かれて集計されてしまいます。

こんな感じ。
f:id:ie-kau:20161228153548p:plain

解決方法

Google Analytics ログイン後、「管理」より。 f:id:ie-kau:20161228153638p:plain

ビュー設定」へ。 f:id:ie-kau:20161228153943p:plain

除外するURLクエリパラメータ」にAMPの識別に利用しているパラメータを入力します。 f:id:ie-kau:20161228154148p:plain

まぁ、言ってしまえば他の除外したいパラメータで対応する時と同じなのです。
これだけで、AMPページのアクセスも通常ページ側に集約されます。

デメリット

この方法のデメリットとしてはAMPページにどれだけアクセスがあるのか確認できないことでしょう。
SEO対策の一貫などでAMP対応した場合に、効果測定をする場合は一定期間おいてからの集約を施したほうがいいケースも出ると思います。

【年末企画】広島県呉市の島しょ部のすすめ

f:id:ie-kau:20161228112218p:plain:w500


ハロー @hazumu です。

年末気分だし、今年やろうと思っていた仕事はすべて終わったので気ままにブログを書いてみる。 何を書こうかなってーって思ったんだけど、ここ2,3数ヶ月釣りにも行ってないし。プログラミング系の記事を書いてもあまりおもしろい記事に仕上がる気はしなかったので、適当に島の話をしてみよう。

僕自身、内地生まれで別に島で生まれ育ったわけではないのだけど、何故か母方の墓地が瀬戸内海に浮かぶ下蒲刈島という島にあったり、高校の同級生の中にはフェリーで呉市内まで通ってくる人が多くいたのでわりかし瀬戸内の島嶼部には愛着がある。

実家に帰省した時に釣りに行くのもだいたい、島嶼部方面だったりする。
手持ち無沙汰な時間になんとなくGoogle ストリートビューで島嶼部の県道を進んでいっていたので、お気に入りにスポットを適当に挙げてみたい。

倉橋島

呉の中央地区に住む人間に取っては最も馴染み深い島だと思う。
実際に住んでる人からすると違うのかもしれないけど、一つの島の中で手前を「音戸」、奥を「倉橋」と呼んでいる。

気候も波も穏やかなこともあり、海水浴場が多くあったり、みかんの栽培や漁業が有名なようだ。 島に渡るには、第一音戸大橋、最近できた第二音戸大橋に加え、橋の下を渡船が走っているので自転車や徒歩で本州側へ渡る人は渡船を利用することになる。

見どころ

音戸大橋(第一)のぐるぐる回るところ

音戸大橋へ車で登り降りする際はこのぐるぐる道を通る必要がある。
運転が慣れてないと怖かったりする。

塩の山

工業用の塩を貯めてるところ。所見の人に「氷」って言ったらだいたい騙せる。

早瀬大橋の橋脚

橋を渡るのも面白いんだけど、海峡が狭いので潮の流れがめっちゃ速い。
大潮の日は川みたいになる。

その他

甘い醤油
item.rakuten.co.jp

瀬戸内ベリーファームのボイセンベリー www.setouchiberryfarm.com

ボイセンベリーってここのソースで初めて知った。たまに弟から貰えるので、無糖のヨーグルトにかけて食べている。

ヨーロッパキイチゴRubus idaeus、ブラックベリーRubus fruticosus、ローガンベリーRubus × loganobaccus の交配種

※出典: ボイセンベリー - Wikipedia
とのこと。

鹿島

倉橋島の更に奥にある小さな島。瀬戸内海のど真ん中にある、呉の市街地から車で1時間半ぐらいかかるので、実際に出かけてみると遠くまで来た感覚を味わえる。 とにかく海がキレイと言う言葉に尽きる。

見どころ

海がきれいなので、晴れた日にドライブするだけでほんとに気持ちいい。

とびしま海道

「とびしま街道」とは、呉市から瀬戸内海の島々を結ぶ橋とそれによって結ばれる道の愛称。
ドライブで目的なく行く人も多いが、今だと自転車でも走り抜ける人も多くなってきている。また、今回は取り上げていないけど、岡村島という島まで行けば、フェリーで愛媛県の今治市まで行くこともできたり。あまり知られてないけど、呉〜岡村〜今治〜道後という経路も狙い目だったりする。

www.tobishima-kaido.net

下蒲刈島

本州から、安芸灘大橋で渡れる島。 橋ができるまで行く方法はフェーリしか無かったでアクセスは良くなった。島内には美術館もあったりして、知る人ぞ知る知名度になってきている。(はず) 道の至る所に柑橘類の即売所がある。

見どころ

安芸灘大橋

橋長1,175mらしく。
徒歩20分ぐらいで渡れるので、風が強くない日は是非歩いて渡りたい。

大地蔵のトンネルの外にあるとこ

車でストリートビューに移っている、先端まで行ける。ガードレールが無いので海岸への落下に注意。

上蒲刈島

母方の墓がこの島の山中にあるのでほぼ毎年訪れる。
県民の浜という有名な海水浴場もあったりしてて、県内からの観光客は多そう。

見どころ

戸田地区

ストリートビューは海からの長めだけど、実際は山に登って海を見渡すと眺めはがいい。
周りはみかん畑だらけ。イノシシに注意。

豊島大橋の下

橋脚クラスタにはたまらない。

豊島

西には上蒲刈島と豊島大橋で、東に大崎下島と豊浜大橋でつながっている島。
大人になっても読み方に自身が無かったが島事態の名前は「とよしま」が正しいらしい。これまた勘違いしてたんだけど、「豊町(ゆたかまち)」は次に出てくる大崎下島の町名。「ゆたか」と呼んでいる年配の人をよく見るがそれは「豊町」のことを指しているっぽい。発音は「ゆ↑た↓か↓」じゃなくて「ゆ↑た↑か↓」。

見どころ

実は集落まで降りたことが無いけど、ここからの眺めが好き。
集落の波止場からコブダイが釣れるっぽいのでいつか本気出したい。

大崎下島

理由はわからないけど、大崎下島は呉市で大崎上島は豊田郡。 結構な大きさの島で、重要伝統的建造物群保存地区もあったりして見どころは充実してる。

見どころ

県道355号線のここ

ここの水の色だけ周囲と比べてとても深い青をしている。

御手洗地区

御手洗地区には古い町並みを保存してあって、雰囲気が良いのだけど。
ストリートビューに写っている洋館から、小道を通って海に抜ける瞬間が最高だったりする。

御手洗天満宮

御手洗地区を一回りした後にお参りに行くのが恒例になっている。
夏に行くと、セミがものすごく多く一瞬で夏を満喫することができる。

まとめ

そういえば、瀬戸内の島嶼部って晴れの日が多いんですよね。 天気がいいと前向きになるって話もでてきたし、若者の移住とかテレビでやってたりネットで話題になってたりするご時世、あまり候補に上がらないけど瀬戸内側に移住するのってワンチャンありなんじゃないですかね。

f:id:ie-kau:20161227160725p:plain:w100
そんじゃーね。

関連記事

www.ie-kau.net

www.ie-kau.net

カーネル密度推定とは何か?

統計 Python

こんにちは、Hayatoです。年末ですね。
カーネル密度推定をおさらいしようと何度かググったのですが良い感じの記事が見当たらなかったので、書き落としておきます。

Index

  • カーネル密度推定って?
  • どういうときに使うといいの?
  • カーネル密度の算出方法 (実際にPythonで)
  • 2次元でカーネル密度推定

カーネル密度推定って?

カーネル密度推定は、一言で表すと「なめらかなヒストグラム」です。
なめらかなヒストグラムを利用して、実際のいくつかのデータ(標本)から、全体の分布を推定する事ができます。 左がヒストグラムで、右がそれを元にして作成したカーネル密度分布のグラフです。 f:id:hayato1986:20161226164449p:plain

参照:Kernel density estimation - Wikipedia

どういうときに使うといいの?

ヒストグラムとは違い曲線になっているので、X値に対応するYを取ることが出来ます。あくまで推定ではありますが、おおよそX=0.2635ならY=2.45など、あらゆる値に対応できるようになります。

カーネル密度分布を書くことで、複数の突出(peak)がある場合に異なる複数の母集団から標本が抽出されている可能性がわかったり、複数のカーネル密度分布を足し合わせたときに視覚的な比較優位を取ることが出来ます。

カーネル密度の算出方法 (実際にPythonで)

さて、では実際にカーネル密度推定を順序立ててやっていきましょう。Githubに iPython Notebook を上げておいたのでそちらも参考にしてください。

1. サンプルデータを作成してヒストグラムを描画

正規分布に従うサンプルデータを作成して、ラグを表示しつつヒストグラムを書いてみます。ラグがたくさんあるところがグラフも高くなっていますね。

data = randn(50)
plt.hist(data, alpha=0.5)
sns.rugplot(data)

f:id:hayato1986:20161227112932p:plain

2. カーネル密度関数を重ねてみる

このグラフにカーネル密度関数を重ねてみます。やはりヒストグラムをなぞったような形になっています。

sns.rugplot(data)
sns.distplot(data)

f:id:hayato1986:20161227123707p:plain

こういうときSeabornはめちゃめちゃ便利ですねぇ。diplot(hoge)で一発描画。。

3. バンド幅とカーネル関数を選択する。

カーネル密度関数を調整するに当たり、バンド幅とカーネル関数を選択します。

バンド幅の違いでグラフを表示

バンド幅とは、データ(標本)一つ一つをどれくらい左右に広げるかの設定をします。0.1, 1.0などなど数値で表します。試しにいくつかのバンド幅を書いてみましょう。

sns.rugplot(data)
list =  [0.1, 0.3, 0.5]

for num in list:
    sns.kdeplot(data, bw=num, label=num)

f:id:hayato1986:20161227122014p:plain

選択するカーネル関数の違いでグラフを見比べる

カーネル関数は、データ(標本)一つ一つをどのような形で広げるかの設定です。ガウス分布(正規分布)が基本かと思いますが、三角、一様などなどいろいろ種類があります。詳しくはWikipediaを参考にしてください。 カーネル (統計学) - Wikipedia

[f:id:hayato1986:20161227121905p:plain]sns.rugplot(data)
options = ['biw', 'tri', 'gau']

for option in options:
    sns.kdeplot(data, kernel=option, label=option, bw=0.5)

f:id:hayato1986:20161227121917p:plain

やはりガウス分布安定ですかね。。 こんな感じでPythonを使ってさくっとカーネル密度推定ができちゃいます。便利!

2次元でカーネル密度推定

ちょっと応用して、2次元でのカーネル密度推定もやってみます。相関分析時に、どのようにデータが分布されているかを把握するのに便利。「複数の突出(peak)がある場合に異なる複数の母集団から標本が抽出されている可能性」を見分ける強い味方ですね。

いつものirisデータを引いてきて、plotします。

iris = sns.load_dataset("iris")
sns.kdeplot(iris.sepal_length, iris.petal_width, shade=True)

できた!のですが、Seabornでやったほうが楽だしきれいだし見やすいです。

sns.jointplot(x="sepal_length", y="petal_width", kind="kde", data=iris);

f:id:hayato1986:20161227122501p:plain

まとめ

今年はあんまり分析できず残念。。オラッオラッオラッ(ΦωΦ)

matplotlib, seaborn のラベルを日本語対応する。

Python 統計 seaborn

iPythonでデータ分析するときに、当然matplotlibやseabornでグラフを描画するのですが、日本語対応されてなく文字化けを起こします。
グラフの描画はデータの概要を掴んだりビジュアライズしたりするためなので、文字化けを起こしていると割と致命的です。

今回はその修正方法でちょっとだけハマったので、まとめておきます。

環境:

Mac OS Sierra
Python 3.5.1 :: Anaconda 4.0.0 (x86_64)
iPython (jupyter)

手順

0. フォントがあるかどうか確認。

以下のようにすると使えるフォントが一覧で確認できます。

import matplotlib as mpl
font_paths = mpl.font_manager.findSystemFonts()
font_objects = mpl.font_manager.createFontList(font_paths)
font_names = [f.name for f in font_objects]
print(font_names)

日本語フォントがある場合は、

sns.set(font='AppleMyungjo')#日本語フォント設定

で設定すると対応できますが、ない場合は下記手順でダウンロードしてくる必要があります。

1. TTF形式でIPAフォントをダウンロード

IPAフォントを公式サイトからダウンロードします。
使うのはXXX.ttfの4つのファイルです。 f:id:hayato1986:20161222205107p:plain

2. TTFファイルをmatplotlibフォルダ内にコピー

僕はpyenvを使っているので下記のようなパスでした。

/Users/[user名]/.pyenv/versions/anaconda3-4.0.0/lib/python3.5/site-packages/matplotlib/mpl-data/fonts/ttf/

こちらにダウンロードした*.ttfファイルをコピーします。

$ cp ~/Downloads/IPAfont00303/*.ttf /Users/[user名]/.pyenv/versions/anaconda3-4.0.0/lib/python3.5/site-packages/matplotlib/mpl-data/fonts/ttf/

3. matplotlibの設定ファイルを作成

終わったらフォントファミリーのデフォルトを指定します。seabornはmatplotlibのラッパーぽい雰囲気なので、設定はmatplotlibだけでOKです。

vi ~/.matplotlib/matplotlibrc

でファイルを作成して、以下を追加。

font.family         : IPAmincho

4. 再起動

Pythonを再起動すると日本語が表示されるようになってます。 f:id:hayato1986:20161222210608p:plain

以上で日本語が使えるようになったと思います。 オラッオラオラオラッ(•ө•)♡

webclip から url scheme でパラメータを渡してアプリを起動する

Swift JavaScript iOS
f:id:ie-kau:20161220143209p:plain:w300


ユースケース

  1. エンドユーザーに任意のページを webclip してもらう
  2. エンドユーザーはiOSホーム画面に webclip されているページを Safari の standalone モードで起動する
  3. そのままネイティブアプリにディープリンクでリダイレクト
    • その際に url scheme を利用してパラメータをネイティブアプリに渡す

どういうメリットがあるか?

これにより webclip のURLに仕込んであるパラメータをアプリに渡せ、直接該当アプリの対象画面をパラメータ付きで開くことができます。
既に該当するアプリはユーザーのiOS端末にインストールしてあることが前提ですが、検索結果経由のurl scheme起動ではなく、まるでネイティブのアプリを開くかのように webclip から該当のアプリケーションの対象となる画面を開くことができるようになります。

Web側

<meta name="apple-mobile-web-app-status-bar-style" content="black" />                
<meta name="apple-mobile-web-app-capable" content="yes" />
<link rel="apple-touch-icon" href="[touchアイコンへのパス]">

以前は、下記記述でスプラッシュ画像を表示できたのですがiOS9からはできなくなったようです。

<link rel="apple-touch-startup-image" href="[スプラッシュ画像へのパス]">

standalon モードで起動した場合はwindow.navigator.standaloneがtrueになるので、 webclip からの起動と判断でき、それを条件に該当アプリにリダイレクト。

if (("standalone" in window.navigator) && window.navigator.standalone) {
  location.href = 'test_app://?id=1
}

スプラッシュ画像っぽくwebclipから起動した画面を見せたい場合は、こんな感じにすればいいかと。
※雑です。

  <head> 
-- 省略 --
  <style>
    body {
      width: 100%;
      height: 100%;
    }
    body > div {
      width: 100%;
      height: 100%;
      background-repeat: no-repeat;
      background-size: cover;
    }
  </style>
  </head> 
  <body>
    <div style="background-image:url([スプラッシュ画像代わりの画像のパス])"></div>
  </body>
// ※要 jQuery
  $('body > div').hide();
  $(window).on('load', function() {
    if (('standalone' in window.navigator) && window.navigator.standalone) {
      var img = new Image();
      img.onload = function() {
        $('body > div').fadeIn(300, function() {
          setTimeout(function() {
            location.href = 'test_app://?id=1
          }, 500);
        });
      }
      img.src = '[スプラッシュ画像代わりの画像のパス]';
    }
  });

アプリ側

通常通り url scheme が使えるようにしておきます。
info.plist > URL types

f:id:ie-kau:20161218173028p:plain

参考