はじめに:この記事の意図

先週、自分で組んだ研修プログラムを投稿させて頂きました。
新米データサイエンティスト、研修プログラムを考える。
この記事では、一週間の進捗やその中で自分が便利だと思ったものをまとめ、現時点での知識の整理や後々の振り返り等に活用していければと思っています。

今週やったこと

現在統計学の時間東大松尾研データサイエンス演習を平行して進めています。
統計学に関しては、既習分野も散在しているので、演習問題だけ取り組んだり、自分の中で定義が曖昧なものは単元も見たりというように取り組んでいます。
データサイエンス演習は、Jupyter notebook形式のコンテンツなので、テキストを読み、コードを写経するという形で進めています。中に練習問題も用意してくださっているので、そちらにも必ず取り組むようにしています。

・統計学の時間

  1~18章まで終了(単元名は割愛させて頂きます)
  現在半分程の位置にいるので、来週には終了し次のコンテンツに行きたいと思っています。

・東大松尾研データサイエンス演習

 ・pythonの基礎
 ・記述統計、確率統計基礎
 ・Numpy, Scipy, pandas, matplotlibの使い方基礎
 来週SQLによるデータ操作、NoSQLに触れ、機械学習へ入っていく予定です。

今週は1週目ということで基礎的な内容が主でした。これから分析を進める上で、統計学的なデータの見、pythonの文法、各ライブラリの使い方など、無くては先に進むことができないものだと思うので、しっかり復習をして身に付けたいと思います。

大事だと思ったもの

ここからは1週間学んだ中で特にこれから先必要になってくると思うもの、そんなことできるんだと驚いたものを備忘録的に書いて行きます。

・統計学

 ・大数の法則:試行回数Nを大きくすると、その平均は期待値に近づいて行く
  下にサイコロの場合の例を示します。サイコロの出る目の期待値は3.5です。

大数の法則.py
#パッケージインポートは省略
N = 10**3

dice_array = np.array([1,2,3,4,5,6])
test_times = np.arange(1, N+1)

for i in range(1, 5):
    cumsum_dice = random.choice(dice_array, N).cumsum()
    plt.plot(test_times, cumsum_dice / test_times)

plt.ylabel("avg_dice")
plt.xlabel('test_times')
plt.grid(True)

スクリーンショット 2018-04-14 19.42.07.png
200回付近まで値がバラついていますが、3.5に収束する様子が分かります。

 ・中心極限定理

「標本を抽出する母集団が平均$μ$、分散$σ^2$の確率分布に従う時、母集団の従う確率分布がどのような分布であっても、抽出するサンプルサイズが大きくなるにつれて標本平均の分布は「平均$μ$、分散$σ^2$」の正規分布 に近づく」
統計学の時間より引用

再び、サイコロの出目の例です。

中心極限定理.py
#パッケージインポートは省略
dice_array = np.array([1,2,3,4,5,6])
plt.figure(figsize=(18, 5))

for N, axis in zip([3, 5, 1000], [1, 2, 3]):
    mean_array = []
    test_times = np.arange(1, N + 1)
    for i in range(1, 1000):
        cumsum_dice = random.choice(dice_array, N).cumsum()
        mean_array = np.append(mean_array, cumsum_dice[N-1] / N)
    plt.subplot(1, 3, axis)
    plt.hist(mean_array)
    plt.title("N = {}".format(N))

スクリーンショット 2018-04-14 20.12.51.png
Nが大きくなるほど、平均値が期待値3.5の周辺に集中する様子が見られます。

・numpy

 ・配列のブロードキャスト

numpy_broadcast.py
sample_array = np.arange(1, 10)
print("sample array : ", sample_array)
print("sample array * 3 : ", sample_array * 3)

スクリーンショット 2018-04-14 20.30.09.png

このように、配列の全ての要素に演算をかけることができます。

・pandas

ここから、赤ワインのデータ
(http://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv)
を用いてサンプルコードを書いて行きます。

winedata_sample.py
file_url = "http://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv"
wine_data = pd.read_csv(file_url, delimiter=';')
wine_data.head()

スクリーンショット 2018-04-14 20.48.00.png
こんな感じのデータです。

 ・info
各カラムにどんなデータ型の値が入っているか、NULLでないと値は何個あるのかなど概要を把握できます。

wine_info.py
wine_data.info()

スクリーンショット 2018-04-14 20.52.20.png
ここから、データは全体で1599行あり、数値型の列しかなく、全ての列に欠損がないことが分かりました。

 ・describe
こちらは、数値型の列の要約統計量を計算してくれるメソッドです。(最大値, 最小値, 平均値など)

wine_describe.py
wine_data.describe()

スクリーンショット 2018-04-14 20.58.35.png
データの範囲、ばらつきなどinfoよりも細かい概要を把握できます。

 ・groupby
赤ワインのデータだとカテゴリー値の列がないので、使いづらいかもしれませんが、

groupby.py
#グループ毎の平均を計算(関数を変えることで他の集計方法でも集計できる)
df.groupby('グループ分けに使用したい列名')['集計したい列名'].mean()

#複数の列でのグループ分けも可能
df.groupby(['列名1', '列名2',...])['集計したい列名'].mean()

のようにすることで、指定した列内のカテゴリー別に集計を行ってくれます。
これはデータを見て行く上で、かなり使用頻度が高いのではないかと思いました。

 ・条件フィルター
ある列の値がN以上のデータのみ抽出したい時に使います。SQLだと、WHEREを書く感じでした。

filter.py
wine_data[wine_data['quality'] >= 8]

スクリーンショット 2018-04-14 20.58.35.png

これで、qualityが8以上のデータのみ抽出できました。
こちらもgroupbyと同じく、使用頻度が高そうだなと思っています。

・matplotlib (少しseaborn)

 ・hist
ヒストグラムを描く関数です。

hist.py
plt.hist(wine_data['pH'])

スクリーンショット 2018-04-14 23.02.05.png
データの分布を確認する機会はかなり多いと思うので、使用頻度が高いと思っています。

 ・subplot
図を分割し、複数のグラフを表示できるようにする関数です。
こちらの記事が分かりやすかったです!

matplotlib の figure(図) と axes(座標軸)-python
http://ailaby.com/matplotlib_fig/

二つのグラフを重ねるのではなく、横や縦に並べて見比べたい機会というのは多いと思うので、これから先かなりお世話になりそうです。

subplot.py
#まず全体の図を定義する
plt.figure(figsize=(8, 3))

#subplot('行数', '列数', '番号')
plt.subplot(1, 2, 1)
plt.hist(wine_data['alcohol'], color='blue')
plt.title('alcohol')

plt.subplot(1, 2, 2)
plt.hist(wine_data['sulphates'], color='green')
plt.title('sulphates')

スクリーンショット 2018-04-14 23.16.27.png

 ・pairplot(seaborn)
最後にseabornのpairplotです。各変数間の関係をざっと見ることができます。
同じ列の所には、ヒストグラムが表示されます。

pairplot.py
import seaborn as sns
sns.pairplot(wine_data[['alcohol', 'sulphates', 'citric acid']])

スクリーンショット 2018-04-14 23.33.31.png

ここから、citic acidとsulphatesの間に弱い相関がなくもないような感じが読み取れます...笑

終わりに

今週1週間は、主にこれからお世話になるであろうライブラリの基礎や、統計学の基礎知識の部分を学習しました。
来週も頑張っていきます!

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.