そもそもデータサイエンスとは?
NumPyについて学習する前に、データサイエンスの概要をご紹介します。NumPyについて知りたい方は読み飛ばしても結構です。
データサイエンスとはデータ収集や、データから利用価値の高い情報を抽出する原理と方法をまとめた用語です。データサイエンスを利用することで、慣習や勘では解決できなかった問題解決の方法を、自動的に発見できます。
次に情報の抽出原理と方法について紹介します。
情報の抽出は、傾向からデータパターンやモデルを作成することが最終的な目標です。
情報の抽出ですが、これまでは統計学やスコアリングの手法が一般的でした。近年では、コンピュータの性能が飛躍的に向上していることから、ディープラーニングや機械学習が注目されています。(むしろ最近のデータ分析方法はこちらの方が中心です)。
特にディープラーニングは人の脳細胞(ニューロン)を模したプログラムが、自動的に収集したデータを学習することで、人間では発見できなかったデータの傾向を見つけられる方法です。
しかし、上記で紹介した事例はあくまで方法です。データを抽出した後は、パターンやモデルの評価と修正が必要です。例えば、テストデータを使用して分析した結果が、作成したパターンと一致するか評価し、一致しない場合はデータの抽出方法を修正する必要があります。
データサイエンスにおけるデータ処理の重要性とは?
データサイエンスを行うためには大量のデータ利用が前提であり、データ処理には“柔軟性”と“高速性”が求められます。
大量のデータ整理にはプログラム処理が必須です。データサイエンスの分野では、機械学習やディープラーニングへの応用しやすさから、pythonがデファクトスタンダードとして使用されています。本記事でもpythonの使用を前提に記述していきます。
柔軟性についてご説明します。
人間が分析するデータではデータフォーマットが統一されていることが多いですが、データサイエンスに用いるデータはフォーマットがバラバラでエラーの原因となり、そのままではプログラムに利用できません。
例えば、テキストデータであるstr形と数値であるint形の加算を行うと TypeErrorエラーとなり、pythonのデータ処理で頻繁に発生します。
また、webからダウンロードしたデータは欠損値が多く、NaN(Not a Number)やNoneが含まれています。データ処理方法によってはNaN値とNoneの扱いが異なったり、0除算の原因となるため事前に前処理を行います。。
上記のようになるのは、Webスクレイピングによってブラウザ上からデータをダウンロードしたり、異なるデータフォーマットに変換してデータを結合することが原因です。柔軟にデータを扱える方法を確立する必要があります。
続いて高速性です。データサイエンスに使用されるデータの項目数は数万〜数百万点に及ぶことが普通で、加減算や逆行列計算を頻繁に行います。そのため、一回の計算に少しでも時間がかかると、データ処理のみに多くの時間がかかってしまい、データサイエンスの本質的な業務である『データ傾向の抽出』を行えません。
pythonはインタプリタ型プログラミング言語であるため、for文や繰り返し処理を利用すると、データ処理速度が格段に遅くなるため、高速にデータ処理を行う工夫が必要です。
上記2点の問題は行列計算を扱うモジュールであるNumPyを用いることで解決できます。具体的には事象で説明していきます。
NumPyとは?
NumPyは大量のデータを高速に処理する必須ライブラリです。主に配列機能を使用でき、数万〜数百万のデータ計算を行うデータサイエンスでは常に扱うでしょう。NumPyの特徴をまとめると下記のようになります。
・高速な多次元配列計算が可能
・ループ計算を使用せずにデータの一括計算が可能
・行列、乱数発生、フーリエ変換が可能
また、NumPyは更なる高速化の手段としてC言語で記載された外部ライブラリと、容易に連携できるように設計されています。データ規模によってはコンパイル型のプログラムで高速に処理したデータを再びNumPyに読み込む使用方法も可能です。次章では具体的なNumPyの機能について紹介していきます。
NumPy動作を一緒に確認
本項目では具体的なNumPyの操作方法をご説明します。プログラムを理解するには実際に手を動かすのが一番であるため、皆さんも開発環境を用意して進めてください。なお、本書で使用しているプログラムコードは参考文献を参照しました。
事前準備
プログラムはPythonとjupyter notebookを使用します。開発環境を整えるならば、Anadondaをダウンロードすればpythonとjupyter notebook、pandasを全てインストールできます。下記サイトを参考に開発環境を構築しましょう。
Anaconda のインストール: Python環境構築ガイド – python.jp
Anaconda | The World’s Most Popular Data Science Platform
NumPyの操作方法
NumPyのインポート
jupyter notebookを開いたら、最初にNumPyをインストールしましょう。多くの書籍では名前を”np”としているため、本書でも習いたいと思います。
“`python
import numpy as np
“`
1次元配列
単純な1次元配列を作成できます。使用するデータ型は配列内で同一となるので、適用可能なデータ型が自動的に選定されます。例えば変数aの例では整数と小数が含まれているため浮動小数点になりますが、変数bのような整数、小数、テキストが含まれている場合は全てのデータ型がテキストとなります。
“`python
a = np.array([3.14, 4, 2, 3])
a
“`
array([3.14, 4. , 2. , 3. ])
“`python
a.dtype
“`
dtype(‘float64’)
“`python
b = np.array([1*-2, “a”, 2, 3.14159])
b
“`
array([‘-2’, ‘a’, ‘2’, ‘3.14159’], dtype='<U32′)
“`python
b.dtype
“`
dtype(‘float64’)
変数aとbは1次元配列ですが、データ形式が異なるため計算できません。
“`python
a + b
“`
—————————————————————————
UFuncTypeError Traceback (most recent call last)
Input In [35], in <cell line: 1>()
—-> 1 a + b
UFuncTypeError: ufunc ‘add’ did not contain a loop with signature matching types (dtype(‘float64’), dtype(‘<U32’)) -> None
多次元配列
多次元配列も扱えます。
“`python
c = np.array([[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]])
c
“`
array([[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12]])
配列値の取得
配列内の要素数も取得できます。
“`python
print(c[0]) #二次元配列では変数が1つのときに、行数を指定したと見なされる。
print(c[0,1]) #c[行数、列数]として値を抽出する。
“`
[1 2 3 4]
2
配列のスライス
配列の一定範囲を切り取る作業をスライスと言います。データサイエンスでは機械学習の学習用データとテストデータの切り分けや、一定期間のデータ抽出に利用します。
“`python
d = np.array([0,1,2,3,4,5,6,7,8,9])
print(d)
#5番目の要素までをスライス
print(d[:5])
“`
[0 1 2 3 4 5 6 7 8 9]
その他、複数の方式でスライスできます。
“`python
#6以降の要素をスライス
print(d[5:])
#1つおきにスライス
print(d[::2])
#3つおきにスライス
print(d[::3])
“`
[5 6 7 8 9]
[0 2 4 6 8]
[0 3 6 9]
配列の要素数は負数を指定することもできます。昇順と降順の入れ替えや、連続するデータで1つ前の要素を抽出するときに便利です。
“`python
#逆方向から1つおきにスライス
print(d[::-2])
#昇順と降順の切り替えに便利です。
print(d[::-1])
#配列番号に負数を指定すると配列番号を一巡して抽出します。
print(d[-1],d[-2])
“`
[9 7 5 3 1]
[9 8 7 6 5 4 3 2 1 0]
9 8
スライスは多次元配列でも使用できます。
“`python
#2次元配列の場合は、デフォルトで行をスライスします。
print(c[:1])
“`
[[1 2 3 4]]
“`python
#列をスライスするには、行と列の両方を指定する。:のみだと全て指定する。
print(c[:,:2])
“`
[[ 1 2]
[ 5 6]
[ 9 10]]
“`python
#多次元配列でも負数を使用できます。
print(c[:,:-1])
“`
[[ 1 2 3]
[ 5 6 7]
[ 9 10 11]]
配列の分割と結合
データサイエンスで使用するデータは複数ソースから収集するため、データの結合と分割は常に使用する操作です。主な操作として次のものがあります。
“`python
#1次元方向に結合する。
x = np.array([1, 2, 3])
y = np.array([3, 2, 1])
np.concatenate([x, y])
“`
array([1, 2, 3, 3, 2, 1])
“`python
#行方向に結合して2次元配列にする。
xy = np.array([x,y])
xy
“`
array([[1, 2, 3],
[3, 2, 1]])
“`python
# 2次元配列ではデフォルトで行方向に結合します。
grid = np.array([[1, 2, 3],
[4, 5, 6]])
print(np.concatenate([grid, grid]))
“`
[[1 2 3]
[4 5 6]
[1 2 3]
[4 5 6]]
“`python
# axisを指定すれば列方向に結合できます。
print(np.concatenate([grid, grid], axis=1))
“`
[[1 2 3 1 2 3]
[4 5 6 4 5 6]]
続いて分割操作となります。
“`python
grid = np.arange(16).reshape((4, 4))
grid
“`
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
“`python
#1つの配列を2つに分割する。vsplit、splitでは行方向に分割する。
upper, lower = np.vsplit(grid, [2])
print(upper)
print(lower)
“`
[[0 1 2 3]
[4 5 6 7]]
[[ 8 9 10 11]
[12 13 14 15]]
“`python
#1つの配列を2つに分割する。hsplitを使用すれば行方向に分割する。
left, right = np.hsplit(grid, [2])
print(left)
print(right)
“`
[[ 0 1]
[ 4 5]
[ 8 9]
[12 13]]
[[ 2 3]
[ 6 7]
[10 11]
[14 15]]
“`python
#変数を1つにすると、1つの変数に2つの行列が格納される。
one = np.vsplit(grid, [2])
print(one)
“`
[array([[0, 1, 2, 3],
[4, 5, 6, 7]]),
array([[ 8, 9, 10, 11],
[12, 13, 14, 15]])]
配列での演算 絶対値、三角関数、指数関数、対数関数
mathモジュールを使用すれば大抵の数値計算を行えますが、大量の計算を行う場合はfor文を使用することになり処理速度が下がります。NumPyでは配列処理と同時に数値計算も行えるため便利です。
“`python
#絶対値の計算。
x = np.array([-30, -20, -10, 0, 10, 20, 30])
abs(x)
“`
array([30, 20, 10, 0, 10, 20, 30])
“`python
#thetaに0°、45°、90°、135°、180°のラジアン換算値を格納する。
theta = np.linspace(0, np.pi, 5)
print(“theta = “, theta)
#0°、45°、90°、135°、180°の正弦値を出力する。
print(“sin(theta) = “, np.sin(theta))
“`
三角関数は数値計算なので微小なずれがあります。例えばsin180°は0ですが、計算結果は0になっていません。ただし、数値上はほぼ0と等しいです。
“`python
x = [1, 2, 3, 4, 5]
print(“x =”, x)
print(“e^x =”, np.exp(x))
print(“10^x =”, np.power(10, x))
“`
x = [1, 2, 3, 4, 5]
e^x = [ 2.71828183 7.3890561 20.08553692 54.59815003 148.4131591 ]
10^x = [ 10 100 1000 10000 100000]
“`python
#対数は自然対数も使用可能。
x = [1, 2, 3, 4, 5]
print(“x =”, x)
print(“ln(x) =”, np.log(x))
print(“log10(x) =”, np.log10(x))
“`
x = [1, 2, 3, 4, 5]
ln(x) = [0. 0.69314718 1.09861229 1.38629436 1.60943791]
log10(x) = [0. 0.30103 0.47712125 0.60205999 0.69897 ]
合計、最大と最小、多次元配列の合計
抽出データの総数や最大点の抽出に使用できます。
“`python
x = np.array([1,2,3,4,5,6,7,8,9])
x
“`
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
合計はPythonの組み込み関数を利用することもできます。
“`python
#Python組み込みのsum関数
print(sum(x))
#NumPyのsum関数。
(np.sum(x))
“`
45
Out[22]:
45
“`python
print(min(x))
print(max(x))
“`
多次元配列になると、配列全部・行ごと・列ごとに合計できます。最大、最小も同様に行列ごとに計算できます。
“`python
y = np.array([[1,2,3],[30,10,20],[200,300,100]])
#多次元配列の場合は、全ての要素を合計します。
print(np.sum(y))
#行列成分ごとに合計することもできます。axis=0とすれば列ごとに加算する。
print(y.sum(axis=0))
#行成分ごとに合計するにはaxis=1とする。
print(y.sum(axis=1))
“`
666
[231 312 123]
[ 6 60 600]
おすすめの参考書や学習方法を紹介
NumPyの機能について簡単にご説明しましたが、さらに学習を進める方に学習方法と参考書をご紹介します。
学習方法
まず自習することを強く勧めます。NumPyを学習するためには実際にプログラムを作成する事に加えて、データサイエンスする対象を見つけて機械学習や分析を進めていくと良いでしょう。
NumPyの機能確認だけでは小中学生の算数を勉強しているのと同義ですので、モチベーションが低下しやすいです。実際にデータサイエンスの分析を行うことで、実際にNumPyの使用がデータ分析に必須であることや重要な機能を理解できるでしょう。
プログラム学習はPCがメインですが、社会人にとっては参考書を使用することをお勧めします。丁寧に記載された参考書を使用すれば、通勤時間や隙間時間にもプログラムの学習が進められます。
参考書
本記事の参考文献の中からお勧めするのは、オライリージャパン『Pythonデータサイエンスハンドブック』です。
データサイエンスを目的に記載されている本ですが、NumPyの基本コマンドが100ページほど紹介されています。最終的には機械学習を行うので、データ処理でNumPyコマンドが大量に使用されていることを確認できます。
オライリー社の本は基本的に洋書の翻訳本ですので、自習用を前提としてプログラムの入力や出力が丁寧に記載してあるため、プログラムを初めて学習する人でも詰まることなく学習できます。
『Tech Teacher』3つの魅力
魅力1. オーダーメイドのカリキュラム
『Tech Teacher』では、決められたカリキュラムがなくオーダーメイドでカリキュラムを組んでいます。「質問だけしたい」「相談相手が欲しい」等のご要望も実現できます。
魅力2. 担当教師によるマンツーマン指導
Tech Teacherでは、完全マンツーマン指導で目標達成までサポートします。
東京大学を始めとする難関大学の理系学生・院生・博士の教師がが1対1で、丁寧に指導しています。
そのため、理解できない箇所は何度も分かるまで説明を受けることができます。
魅力3. 3,960円/30分で必要な分だけ受講
Tech Teacherでは、授業を受けた分だけ後払いの「従量課金制」を採用しているので、必要な分だけ授業を受講することができます。また、初期費用は入会金22,000円のみです。一般的なプログラミングスクールとは異なり、多額な初期費用がかからないため、気軽に学習を始めることができます。
まとめ
・魅力1. 担当教師によるマンツーマン指導
・魅力2. オーダーメイドのカリキュラム
・魅力3. 3,960円/30分で必要な分だけ受講
質問のみのお問い合わせも受け付けております。
まとめ
本記事ではデータサイエンスの概要とデータ処理の重要性と、データ処理に欠かせないライブラリであるNumPyの機能について確認しました。また、NumPyの基本操作についてもコード付きで解説しました。最後に、本記事以降の学習方法や参考書も記載し、記事ではオライリージャパン『Pythonデータサイエンスハンドブック』をお勧めしました。