すのふら

すのふら

日々の備忘録

apache Saprkについて最初の調査

仕事でpySparkを使うことになりそうなので、事前学習中。
まずはそもそものSparkについて勉強するために以下あたりで勉強。

初めてのSpark

初めてのSpark

この本、Sparkバージョンが1.4でめちゃくちゃ古い(本日時点で最新バージョン2.1.2)ので、詳細なところというよりは根本を抑える。
併せて、ここにも目を通す。

mogile.web.fc2.com

英語さっぱりな俺にはホンマ神のようなサイトやで……。

更に更に併せてqiita等先人のお力もお借りする。ありがてえありがてえ

めちゃくそ素人なので、間違っていること書いている可能性かなりあるよって予防線張っとく。
自信ニキ指摘オナシャス

Apache Sparkについて

Apache Hadoopという、大きなミドルウェアの中のひとつのフレームワークという考え方でいいのかな?
SparkのほかにMapReduceがいて、MapReduceよりも処理が速いってことで今主流のフレームワーク

f:id:snofra:20171109165423p:plain

YARNってやつがいるが詳細はまだよくわからないので一旦置いておく。
あの日見たYARNのお仕事を僕達はまだ知らない。


Sparkはどのような特徴があるのか

Sparkのサイト翻訳を見ると

Apache Sparkは高速で汎用的なクラスタコンピュータシステムです。Java, Scale, PythonおよびRの高レベルのAIPを提供し、一般的な実行グラフをサポートする最適化されたエンジンを提供します。SQLおよび構造データのためのSpark SQL機械学習のためのMLlib、グラフ処理のためのGraphX およびSpark Streamingを含む高レベルのツールの充実したセットもサポートします。 概要 - Spark 2.0.0 ドキュメント 日本語訳

要はめちゃ速で汎用的で、いろんな言語に対応しているし、機械学習とかそういうのもできるよってことかな。

なんでめちゃ速なのか?ってSparkのwikipediaにも書いてあるとおり、

フォールトトレラントシステムで管理され、複数マシンのクラスタに分散されたデータ項目の読み取り専用多重集合であるRDD(resilient distributed dataset)と呼ばれるデータ構造を中心とするアプリケーションプログラミングインターフェイスを備えている。
SparkのRDDは、 分散共有メモリの (意図的に)制限された形式で提供する分散プログラムのワーキングセットとして機能する。
Apache Spark - Wikipedia

という2点あるから。


1点目 RDDというデータ構造

と書いておいてアレだが、Sparkのバージョン2.0以降はRDDよりもRDDを基盤としたDataFrameがよく使われるので、RDDベースでの話はやや古すぎるかも。
って前札幌の勉強会で聞いた。

www.slideshare.net

RDDっていう思想はDataFrameになってもあると思うので、詳細よりも考えかたを押さえておく。

RDDはその言葉から障害耐性を持つ並列可能なデータ構造。
「フォールトトレランス *2 で並列処理可能なコレクション」・「コレクションはイミュータブル」とのこと。

RDDのフォールトトレランスは

RDDのいずれかのパーティションが喪失すると、最初にそれを生成した変換を使って自動的に再計算されます。 Spark プログラミング ガイド - Spark 2.0.0 ドキュメント 日本語訳

とあるので、データが壊れたやノードの速度が低下した場合は再実行してデータを再計算するという感じ。

再計算をしても同じ結果が出るようにイミュータブルにしなくてはならない。
前のデータ書き換えることが可能だったら、データがぶっ壊れるので。


2点目 データをキャッシュしておくという考え

MapReduceとの比較になるのが主だけど、それと比べてなぜめちゃ速なのかって、HDFSへのアクセス数を極力抑えるという思考だから。IOのオーバヘッド減らせば速いよね的な。

ここの23p~24pがかなりわかりやすいが、クソ適当な絵で描くと

www.slideshare.net

f:id:snofra:20171109165426p:plain

ジョブが多ければ多いほどHDFSからデータをロードする時間がかかって、その分実行時間がかかってしまう。
その点からSparkはデータをメモリ内に取り込んで(インメモリ内)で処理してしまうので、IOのオーバヘッド時間を減らせるのでより速い。

f:id:snofra:20171109165429p:plain

また、上記Sparkの考え方から何度も使用するRDDは毎度計算すると時間かかるから、RDD自体をメモリに確保しとこうねってことが可能。
これがRDDの永続化ってやつ。

f:id:snofra:20171109165433p:plain


クラスターについて

最初にも書いたけど、Sparkはクラスタコンピューティングフレームワークなので、複数のクラスタで分散する。

Spark公式の概要図 f:id:snofra:20171109170503p:plain


Driver Program

Spark アプリケーションの実行管理や制御を行うもので、main メソッドを含むプロセスとなります。またドライバはSpark アプリケーション毎に1つ存在し、アプリケーションの環境(SparkContext)を作る役割を担っています。 Spark のアーキテクチャ概要

ということなので、マスターノードに該当するところ。こいつから処理が開始する。


実行時にSparkContextってやつで環境の仕込みをする。

そうはいってもこいつがいったい何者なのか、『初めてのSpark』を読んでもよくわからんかったので、sparkのドキュメントを読む。

Main entry point for Spark functionality. A SparkContext represents the connection to a Spark cluster, and can be used to create RDDs, accumulators and broadcast variables on that cluster. SparkContext (Spark 2.0.2 JavaDoc)

google翻訳曰く

Spark機能のメインエントリポイント。SparkContextは、Sparkクラスタへの接続を表し、そのクラスタRDD、アキュムレータ、およびブロードキャスト変数を作成するために使用できます。

とのことなので、多分以下のようなことをやっているんだと思う。
1. マスターノードとスレーブノード間の接続
2. ワーカーノードに、RDDと、アキュムレータ、ブロードキャスト変数を渡す。

ここで、アキュムレータとブロードキャスト変数というものが出てきたので、確認すると

アキュムレータ

CPUで出てくるやつ。Pythonだとitertools.accumulateね。
要は前の値と加算して、その結果を蓄積していくもの。1,2,3,4,5だったら、1,3,6,10,15みたいに前までの計算結果と加算させていく。

Sparkでの使い方は主にデバッグ用で、処理実行時のクラスタのイベント数をカウントしておく。


ブロードキャスト変数

要は定数で、Driver Programで作成した定数を各ワーカーノードに渡す。
ブロードキャスト変数がいい理由は、読み取り専用という点と、大きいサイズの定数の場合オーバヘッドが少ないから。逆に小さいサイズの定数はオーバヘッドが大きい可能性がある。
Spark 共有変数


ContextはSparkContext以外にもContext系はHiveContextとSQLContextがある。 *3

SQLContextは

Spark SQLを利用するためには、SparkContextに加えてSQLContextが必要。SQLContextはDataFrameの作成やテーブルとしてDataFrameを登録、テーブルを超えたSQLの実行、キャッシュテーブル、そしてperquetファイルの読み込みに利用される。 Spark SQLサンプルアプリの実行

とのことなので、DataFrameを使用する今のSparkでは必須で準備しておかなくてはいけないものっぽい。

HiveContextはHiveQLを使用するために必要。とさらっと


Cluster Manager

Spark アプリケーションをクラスタ上で実行するためには、クラスタのリソース(メモリやCPU など)の確保を行ったり、スケジューリング管理を行う必要があります。それを行うのがCluster Manager の主な役目となります Spark のアーキテクチャ概要

Cluster Managerには3つのオプションがあって、そのうちひとつを選択するよう。
ジョブスケジューリング - Spark 2.0.0 ドキュメント 日本語訳


スタンドアロンモード

Sparkに組み込まれている標準モード

YARN

YARN上でSparkを起動する。
YARNはHadoopクラスタのリソース管理や、Hadoop上で動作するアプリケーションのスケジューリングを担当するので、そちらに一任する形?
あの日見たYARNのお仕事を僕達はまだ知らない。

Mesos

Apache Mesosで管理されるハードウェアクラスタ上で実行。
利点は、Sparkと他のフレームワークの間の動的なパーティションと、Sparkの複数のインスタンス間のパーティションのスケール
Mesos上でSparkを実行 - Spark 2.0.0 ドキュメント 日本語訳


Worker Node

クラスター。これら(executer)が分散して作業を行う。
処理の最小単位はtask


セキュリティ

共通鍵暗号方式をサポート。
*4 認証はspark.authenticate 設定パラメータを使って設定。
共通鍵暗号方式なので、Spark側と通信側で同一鍵を持っておく必要がある。
セキュリティ - Spark 2.0.0 ドキュメント 日本語訳


Jobの実行状況を覗かれたくない(Cluster Managerを見られたくない)場合、javax servlet filtersで認証等ができるようになるみたい。 Secure Spark


Sparkはコンポーネント間の通信を暗号化することが可能。プロトコルごとでSSL/TLSにできる。
Secure Spark
認証はSASLをサポート。


うーん、SASL認証って何ぞや?

SASLとはSimple Authentication and Security Layer
インターネットプロトコルにおける認証とデータセキュリティのためのフレームワークである。
Simple Authentication and Security Layer - Wikipedia

また、

SASLとはSimple Authentication and Security Layerの略であり,簡単に言ってしまうと認証のためのフレームワークのようなものです。SASLを使用することにより,開発者は既存のライブラリや仕組みを再利用することができ,利用者にはチャレンジ・レスポンス認証などの安全な認証方式を提供することができます。 第18回 OpenLDAPとSASL:そろそろLDAPにしてみないか?|gihyo.jp … 技術評論社

とあるので、どうやらチャレンジ・レスポンス認証 *5で認証する方式っぽい?


うーんなんとなくわかったけど、全体はよくわからないので触ってみて感じつかむしかないかなー。

*1:そもそもクラスタって何ぞや?っていう場合はここで。
http://wa3.i-3-i.info/word12487.html
複数のコンピュータがひとつのコンピュータっぽくふるまうこと。
ということなので、マスターノード(mainがいるところ。基本1つ)とスレーブノード(分散処理するところ。複数)が1つの処理しているってこと。

*2:フォールトトレランスってなんだって人は以下で。要は障害に対してどう備えるか。身近なパターンだと地震起きたときどうする的な?
http://wa3.i-3-i.info/word14813.html

*3:HiveContextとSQLContextの性能比較
SparkSQL - HiveContext/SQLContextの性能比較

*4:共通鍵暗号方式が分からない場合はここで。
http://wa3.i-3-i.info/word1837.html

*5:チャレンジ・レスポンス認証が分からない場合はここ。
http://wa3.i-3-i.info/word12765.html
要は認証サーバ側から要求される毎度異なる値(チャレンジ)とパスワードを合わせた値(レスポンス)とIDを認証サーバに送って、認証サーバ側はレスポンスからパスワード抽出する認証方法。

アキュムレータについて調べる

Sparkの本読んでいて、アキュムレータというワードが出てきた。
あれ、これってCPUじゃないのと思っていろいろ調べたのでメモしておく。

CPUでアキュムレータっていうと算術論理演算装置(ALU)の演算結果を格納する場所ってイメージがあった。

wikipediaだと

アキュムレータ(英: Accumulator)は、コンピュータにおいて、演算装置による演算結果を累積する、すなわち総和を得るといったような計算に使うレジスタや変数のことである。

アキュムレータ (コンピュータ) - Wikipedia  
CPUだけじゃなくて、プログラムでも扱われるのね。知らんかった。

CPUで総和を得るって何ぞ?と思ったけど、 (計算する命令の場合になるが)アキュムレータに保持している値と、メモリに保持している値を計算して、アキュムレータの値を更新する。
その結果をメモリのどこかの番地に渡して、また計算するみたいな感じだと確かにその通りかなーと。

pythonでアキュムレータを確かめる

pythonでアキュムレータで総和を確かめてみようとすると、itertoolsのライブラリを使うことになる。

10.1. itertools — 効率的なループ実行のためのイテレータ生成関数 — Python 3.6.5 ドキュメント

ドキュメントを読む限り、加算できる型であればよいのでDecimalみたいな小数点や、Fractionみたいな分数の型でもOK
JSON読み込んだときみたいなstr型の場合はキャストしないと駄目なんだなー。

実際に動かす

バージョンはpython 3.5

import itertools
iter_ac = itertools.accumulate([1,2,3,4,5])

for i in iter_ac:
    print(i)

# 内包表記で書くとこれ
# result = [i for i in iter_ac]
# print(result)

結果

1
3
6
10
15

pythonでアキュムレータを確認してみると、前の計算結果と処理対象の値を加算しているというのが分かる。
 
1:1 + 0(前の計算結果がない=0だから)
2:2 + 1
3:3 + 3
4:4 + 6
5:5 + 10

itertools.accumulateの型

for文対応しているし、配列渡しているしListかな?と思ったけど

import itertools
iter_ac = itertools.accumulate([1,2,3,4,5])
print(type(iter_ac))

<class 'itertools.accumulate'>

イテレータってやつですな。思いっきりiterって書いているけどね……。
なので、for文で実行できるみたい。

[Python] 部屋とYシャツとイテレータとジェネレータと私 - くろのて

イテレータなので、ループで回さなくてもnext()で値は取れる。一応。

import itertools
iter_ac = itertools.accumulate([1,2,3,4,5])
print(type(iter_ac))

print(next(iter_ac))
print(next(iter_ac))
print(next(iter_ac))

1
3
6


next()後にループしたときの結果として、next()で出力されていない値がループの対象となる。

import itertools
iter_ac = itertools.accumulate([1,2,3,4,5])
print(type(iter_ac))

print(next(iter_ac))
print(next(iter_ac))
print(next(iter_ac))

print('ここからループ')
for i in iter_ac:
    print(i)

1
3
6
ここからループ
10
15

importした自作のモジュール内のクラスをリロードする

テストクラス作っていた時に、詰まったのでメモする。

python実装していて、自分で作ったモジュール(クラス)が今実装しているpyファイルとは別ディレクトリで、 別ディレクトリのモジュール内のクラスをimportするってことは往々にしてある。

はまったときは、テストクラス作っていた時は構成ファイルを変更してそれを反映する必要があった。

import時に読み込んでるからリロードせねばと思ったんだけど、うまくできず。
というのも、もう1回importしたら再読み込みされるんじゃね?みたいな考えだったからで、できなくて当然っちゃ当然。

何故かって、処理実行時に何度importしてもロードするのは1プロセス1回。
そりゃあ処理実行時にメモリにロードしてるんだから、当たり前なんだけど気づいてなかった。

方法

ディレクトリ構成

dir1
├dir2
│└ file1.py
└ dir3
 └ file2.py

file1.py

class classLogic:
(class内略)

file2.py(リロードするクラス)

import importlib
from dir1.dir2.file1 import classLogic
# リロード
import dir1.dir2.file1
importlib.reload(dir1.dir2.file1)
from dir1.dir2.file1 import classLogic

一旦、モジュールをリロードしてから、クラスをインポートするのがポイントみたい。

ラジカツスターズ!のコーナーの未来を予測する

f:id:snofra:20170415025404p:plain

このタイトルだとあまりにも壮大な感じ。
アイカツスターズ!』のラジオ『ラジカツスターズ!』のコーナー「私達、AIKATSU☆STARS!です!!スターズ!!!」で正解数が50になるのは何回目の放送か予測する。

「私達、AIKATSU☆STARS!です!!スターズ!!!」というコーナーは、ひとつに質問に対して回答を合わせるという趣旨のもの。

正解数は積み上がっていって、目標値まで到達するとご褒美ゲットの仕組み。目標値は非公開なので何問正解したらいいのかは分からない。

ご褒美は1回ゲットしていて、そのときは30問正解だった。
ご褒美はラジオのテーマソング「ラン・ラン・ドゥ・ラン・ラン! ~NEXT LAP~」が制作決定だったので、次はライブとかですかね?

前回30問だったので、次回は大体50問正解くらいなんじゃないかなーと思っているので、50回到達するのに放送何回目になるのかと思ったのが最初。


50回正解するならどのくらいだろと考えてみたとして、このコーナー1回での質問数は大体3~4問くらい

放送1回につきパーソナリティは2名のローテーションなので、3問全部答えられるなら17回目くらい。

ただそんなことはありえないかなーと思うので、バッファで1.5掛けて25回目くらいで50問正解余裕だろ。

というざっくり見積もり。
それが意外にあってるんだが、折角なのでちゃんと分析してみる。


条件

  • 計算対象の回は放送30回目~56回目とする
  • コーナーがお休みの場合は0でカウント
  • 欠損している50回目は0でカウントする(誤差程度しか変わらないので大丈夫。きっと)
  • 放送54回目は1問正解だが、ボーナス3ポイントなので3でカウント

なぜ放送30回目からかというと、放送29回目で30ポイント貯まってご褒美ゲット。
再スタートしているからです。


結果から言うと

50問正解は79回目で迎えられるみたい。

1回放送につき1問正解のペース。遅い。
2017/06/05現在で61回目放送なので、あと18回、あと5ヶ月くらいかかる計算。先長すぎ問題


50問正解時の放送回数を算出

算出するにあたって回帰分析(線形回帰)を使用。分からなくてもスルーでOK。俺も正直細かく知らねえっす。

正解数からグラフを作ってみる。縦が正解数の合計(積み上げた値)で横が放送回数。

f:id:snofra:20170605144908p:plain

このグラフを元に50回目を予測するんだけど、このグラフって中学生の時に見たヤツ。
「y=ax+b」のグラフですわな。

manapedia.jp


縦が正解数の合計(y)で、横が放送回数(x)なので、
aとbが分かれば計算可能だよねってことで計算するんだけど、自力でやるには俺の学が足らなすぎるのでpythonにお願いする。


ここからもうちょっと細かい話になってしまうので結論から言うと、

y = 1.3723076923076918x -42.621538461538449

これがこのグラフの計算式。
正解数50回目だから、50 = 1.3723076923076918x - 42.621538461538449で計算して「79.05651604」。

大体79回目で50問正解するという推測。


全体を通して100問正解するのは

放送1回目~56回目とするとグラフはこんな感じ。
50問正解はしているので、100問正解するのはいつだろっていうのを見てみると

f:id:snofra:20170605145352p:plain

こんな感じ。

でもって、傾きを算出すると

y = 1.1511619958988382x -3.8616883116883187

こんな感じ。

これを使って計算すると90.7304351573なので、大体90回目には100問正解する予定。(達成するとは言っていない)


もうちょっと細かく

回帰分析で算出するにあたってaとb、つまり相関係数を知りたい。
ついでにそもそも、縦が正解数の合計で、横が放送回数って関係してんの?ってのを出す。

pythonに線形回帰のライブラリがあるので、それを使ってさくっと出してみる。

f:id:snofra:20170605145748p:plain


パッと見まったくもって意味わからないところもあるんだけど、coefってのが相関係数で、それをみると「1.3723」と「-42.6215」となってるので、それがaとbなんだなあと。

次にそもそも縦が正解数の合計で、横が放送回数って関係してんの?ってところだけど、決定係数を見ればわかる。
R-squaredって書いているところが「0.981」で1に近いほど正確なので正しいといえる。
まあ回数重ねれば正解数が積み上がるので、当たり前だろ!って話ではある。


算出に使用したデータ

f:id:snofra:20170605150319p:plain

f:id:snofra:20170605150327p:plain


以下pythonコード。

続きを読む

ラジカツスターズ!のコーナーのメンバー別正解数を図で確認する

f:id:snofra:20170415025404p:plain

pythonの勉強も兼ねて、『私達、AIKATSU☆STARS!です!!スターズ!!!』で誰が1回の放送で安定して回答しているのかを見てみる。

『私達、AIKATSU☆STARS!です!!スターズ!!!』というコーナーは、ひとつに質問に対して回答を合わせるという趣旨のもの。


条件

  • 『私達、AIKATSU☆STARS!です!!スターズ!!!』の正解数は、前回の情報を元に抽出。(49回目まで)
  • コーナー自体やっていない場合(初回など)は計算から除外


図にするとよりわかりやすい「るか」と「みほ」

細かいことを言う前に結果。

f:id:snofra:20170604012230p:plain

この図はカーネル密度推定で算出。まあ気にしなくていいっす。
とにかくこの図で各メンバーが1回のコーナーで何回正解できているんだ?ってのを示してる。
このグラフで言うと、一番わかりやすいのが「るか」と「みほ」


圧倒的に答えられない「るか」と、確実に1回は正解する「みほ」

この図から見ても、るかは回答数が0でコーナーが終わるのがかなり多く、このコーナーの正当率を引き下げている要因と言っても仕方ないかと。

まあ、るかの回答は大分アレでしたし
将棋の駒一つ挙げろって言われてキングとか、ピザに乗っているものでピザソースとか、正解数0が多いのも納得ですわ。

逆にみほは回答数0が少なく、確実に1問は正解する傾向が強いけど、2問以上の爆発的な回答はしない傾向にあるよう。
正解数3~4の数が極端に少ない*1

爆発的な回答をするのは「せな」と「ななせ」になるよう。

せなは比較的安定して正解しているのと、ななせは回答数が2問目で落ち込んで、それを超えるとブーストして正解数が上がってくる。

ラジオでも正解数が増えるとどんどんいこうみたいなスタイルになるのが、ななせの特徴のように感じている(勝手に)ので、その結果が表れているのかなあ。


自分の備忘録

ここから細かい話。
統計とかの話なので興味あればレベル。自分の備忘録として。

今回、この図を出すにあたり、カーネル密度推定を使用したんだけど、それって何ぞやってところをメモ。

ウィキペディアにも書いているんだけど、まあ俺のようなアホにはちょっと何言ってんのかよくわからん。
カーネル密度推定 - Wikipedia

ざっくりいうと、ヒストグラムの棒グラフを滑らかにしたもの。

でもって、ヒストグラムについてはここを見てもらうと分かりやすい
ヒストグラムはある程度で区切ってその区切った範囲でどのくらい数があるのかなってこと。

今回で言うと、1回のコーナーで回答数が何回だったの?ってのを示したかった。
正直ヒストグラムでやる必要はないわな。0~4という区切るのにしても少なすぎるし。

カーネル密度推定がヒストグラムの棒グラフを滑らかにしたものなら、そもそもヒストグラムのままでもいいじゃんみたいな感じある。

だけど、ヒストグラムでやると棒が重なるので視覚的に難がある。
f:id:snofra:20170604013528p:plain

箱ひげ図はあまりなじみがないだろうし、このメンバーの感じだとちょっと説明しにくい。
f:id:snofra:20170604013710p:plain
正直この結果で何を書けばいいんだくらいのヤツ。

ということで、カーネル密度推定で表示してみようと思った次第。

ソースコード

さらにメモ用でソースコードを記載。jupyter notebookから書いているので、ほかので流用する場合はもうちょっと何かいる。

# もろもろ宣言
import pandas as pd
from pandas import Series
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
 
#csvファイルの読込。カラムは左からname/on_air/Question/Ans
df = pd.read_csv('C:/Users/xxxxx/yyyy.csv')
 
#取り込んだcsvファイルの中からAns列だけ取ってくる関数
def getdf(name):
   getAns =Series(df[df['name'] == name].Ans, name='Answer')
   return getAns
 
#各メンバーのコーナー1回での回答数を取得
RukaAnsSe=getdf('ruka')
MikiAnsSe=getdf('miki')
KanaAnsSe=getdf('kana')
MihoAnsSe=getdf('miho')
NanaseAnsSe=getdf('nanase')
SenaAnsSe=getdf('sena')
RieAnsSe=getdf('rie')
 
#カーネル密度推定を算出してグラフに書いて保存
plt.figure(figsize=(20, 10), dpi=100, linewidth = 100)
plt.xticks([0,1,2,3,4,5])
plt.tick_params(labelsize=18)
plt.xlabel('Answer', fontsize=18)
sns.distplot(RukaAnsSe,
      rug=True,
      hist=False,
      color = 'skyblue',
      kde_kws={'label':'Ruka'})
sns.distplot(MikiAnsSe,
      rug=True,
      hist=False,
      color = 'green',
      kde_kws={'label':'Miki'})
sns.distplot(MihoAnsSe,
      rug=True,
      hist=False,
      color = 'indigo',
      kde_kws={'label':'Miho'})
sns.distplot(KanaAnsSe,
      rug=True,
      hist=False,
      color = 'orange',
      kde_kws={'label':'Kana'})
sns.distplot(NanaseAnsSe,
      rug=True,
      hist=False,
      color = 'dodgerblue',
      kde_kws={'label':'Nanase'})
sns.distplot(SenaAnsSe,
      rug=True,
      hist=False,
      color = 'hotpink',
      kde_kws={'label':'Sena'})
sns.distplot(RieAnsSe,
      rug=True,
      hist=False,
      color = 'darkblue',
      kde_kws={'label':'Rie'})
plt.legend(fontsize=18)
plt.savefig('rajikatsu1.png')
 
 
#以下説明用
#ヒストグラムを作る
plt.figure(figsize=(20, 10), dpi=100, linewidth = 100)
plt.xticks([0,1,2,3,4,5])
#normedでヒストグラムを1になるように積分する(正規化処理を加える)
plt.hist(RukaAnsSe, bins=4, color='skyblue', normed=True, alpha=0.5, label='ruka')
plt.hist(MikiAnsSe, bins=4, color='green', normed=True, alpha=0.3, label='Miki')
plt.savefig('rajikatsu2.png')
 
#箱ひげ図
plt.figure(figsize=(20, 10), dpi=100, linewidth = 100)
sns.boxplot(data=[RukaAnsSe, MikiAnsSe, MihoAnsSe, KanaAnsSe, NanaseAnsSe, SenaAnsSe, RieAnsSe])
plt.xticks([0,1,2,3,4,5,6],['Ruka','Miki','Miho','Kana','Nanase','Sena','Rie'], fontsize=18)
plt.ylabel('Answer', fontsize=18)
plt.yticks([-1,0,1,2,3,4,5],['-1','0','1','2','3','4','5'], fontsize=18)
plt.savefig('rajikatsu3.png')

参考サイト

https://matplotlib.org/2.0.0/examples/color/named_colors.html
http://seesaawiki.jp/met-python/d/matplotlib#content_2_8
http://qiita.com/supersaiakujin/items/be4a78809e7278c065e6
http://qiita.com/Tatejimaru137/items/4ee6a73114d07d85bfd7

https://matplotlib.org/api/figure_api.html

*1:コーナー1回の総質問数が少ないからかと思ったけどそんなことない

プリキュアでカタカナを勉強したほうが楽しい

ネット見てたらカタカナの練習を子供が好きなものでやればいいのではという旨のまとめがあった。

togetter.com

確かにその通りだと思う。
大人の俺でさえ仕事の技術の定着にアニメを使っているくらいなんだから、当然子供だってそうだろと。

我が家にもちょうどカタカナを学ぶくらいの年齢の子供がおり、風呂場にあいうえお表が置かれているが置かれているだけであまり活用されていない。

なので、子どもの好きなプリキュアで勉強させたら学習意欲わくかなと思いざくっと作ってみた。

各シリーズ別カタカナ練習表

キュアフラワーやキュアエンプレス等、ゲスト扱いのプリキュアは除外
・「キュア」を入れると死ぬほど書いてしまうので除外

f:id:snofra:20170511174109p:plain
f:id:snofra:20170511172723p:plain
f:id:snofra:20170511172725p:plain
f:id:snofra:20170511172728p:plain


カタカナ全部網羅できているのか

プリキュア50人いるが、実は網羅していない文字あるんじゃないか? ということでない文字を調べてみる。


アイウエオ表で確認

f:id:snofra:20170511174601p:plain
※「ァ~ォ」が存在するため、拗音は今回はあまり考えず文字があればOKとしている。

アイウエオの部分だけ見ると40文字は網羅しているが、やはり「ヌ」や「ヘ」、「ヲ」などワードに使用するのが難しいのは残っている。
濁音が軒並み残っているのは、女の子に響く名前に濁音は入りにくいということが推測できる。


プリキュア名頻出文字

どの文字が一番使われているのか、トップ10を確認してみる。
f:id:snofra:20170511180208p:plain

圧倒的に「ー」が使われているおり、どうやらプリキュア50人中半分以上のプリキュアには「ー」が存在している。

トップ5までの文字が使われているのは


キュアムーンライト
f:id:snofra:20170511180708j:plain

6文字中5文字使用されているし、「ム」もトップ10内なので、プリキュアの名前らしい名前と言える。


変身前の名前であいうえお表

備考として変身前のフルネームであいうえお表を作ってみる。
・「ラブ」や「エレン」等カタカナはひらがなとして使用(除外しない)
・拗音は今回はあまり考えず文字があればOKとする
キュアプリンセスは、「ヒメルダ~」じゃなくて「しらゆきひめ」で

f:id:snofra:20170511181355p:plain


やっぱり変身前でも「ぬ」「へ」「を」は使われていない。
当然といえば当然だが半濁音は全く使われていない。そんな名前奇をてらいすぎるしなー。

アイカツ!声優38人はアイマス系列作品・グランブルーファンタジーに出ているのか

f:id:snofra:20160410164330j:plain

少し前に「アイカツ!」シリーズ出演声優は、「アイドルマスター」シリーズ作品に参戦していることが多いみたいな話があって、本当にそうなのかと思ったので確認してみる。
アニメも始まった『グランブルーファンタジー』ではどうなのかも確認してみる*1


分析内容について

Wikipediaの「アイカツ!の登場人物一覧」および「アイカツスターズ!の登場人物」のデータカードダスでのプレイヤーキャラクターを演じている声優が対象

・対象声優のWikipedia内の役から、「アイドルマスター」シリーズ作品及び『グランブルーファンタジー』の出演作品を確認

・諸星 すみれさん、田所 あずささん、大橋 彩香さん、上田 麗奈さんについては、『アイカツ!』を集計対象とする


アイカツ!」シリーズ出演声優のキャラ一覧

f:id:snofra:20170423163113p:plain

ぱっと見「アイドルマスター」シリーズも『グランブルーファンタジー』も共にそんなに出ている人が多いわけではなさそうに見える。

アイカツスターズ!』の声優は新人が多いからか、「アイドルマスター」シリーズおよび『グランブルーファンタジー』共に出ていないよう。


アイドルマスター」シリーズに出ている人の大半はシンデレラガールズに出ている

f:id:snofra:20170423163129p:plain

アイカツ!」シリーズ出演声優の大半は「アイドルマスター」シリーズに出ていないようで、まだまだ50%にも満たしていない状況。
また既にアイドルマスターで声を貰っている人のほとんどが『アイドルマスター シンデレラガールズ』に出ている。

この差はそもそものキャラクター数の違いで、シンデレラガールズが圧倒的にキャラ数が多いのでこの状況になっている。
今回以降もこの比率は変わらないんじゃないかと思う。


グランブルーファンタジー』に出ている人はほとんどプレイヤーキャラクター

f:id:snofra:20170423163140p:plain

グランブルーファンタジー』だけに注目し、出演しているのかいないのかを確認。
やってない間にアイマスコラボイベやら、新キャラやらでキャラクター数も増えたので、出演比率は50%。

プレイアブルキャラクターに昇格したキャラクターも結構いたので、NPCも減っている。
ジオラはプレイアブルは難しいような気もするが、「舞い歌う五花」の続編があればある、のか?


アイドルマスター」シリーズと『グランブルーファンタジー』共に出ている人はほとんどいない

f:id:snofra:20170423163152p:plain

アイドルマスター」シリーズと『グランブルーファンタジー』共に出ている人は8人しかいないので、ほとんどの人がどちらか片方にしか出ていないか両方とも出ていない。

アイカツ!」シリーズ出演声優は「アイドルマスター」シリーズと『グランブルーファンタジー』のどちらかには出ているよう。
アイドルマスター シンデレラガールズ』はまだまだ声のないキャラクターが多いので、そこに入ってくる可能性はかなり大きいと思う。

グラブルでのSoleil

f:id:snofra:20170423165344p:plain

*1:単に俺がグラブルプレイヤーだからなだけです