「大人の教養・知識・気付き」を伸ばすブログ

一流の大人(ビジネスマン、政治家、リーダー…)として知っておきたい、教養・社会動向を意外なところから取り上げ学ぶことで“気付く力”を伸ばすブログです。データ分析・語学に力点を置いています。 →現在、コンサルタントの雛になるべく、少しずつ勉強中です(※2024年1月21日改訂)。

MENU

Pythonによるデータ分析(その01/X)

 仕事上、早々に\mathrm{Python}を使えるようにしないといけないため、

を基に学んでいく。

1. はじめに

1.1 本書の内容

  • \mathrm{Python}によるデータ操作、処理、クリーニングおよび高速処理の基本を学ぶ。
1.1.1 扱うデータの範囲
  • ここでは構造化された情報をデータと呼ぶ。具体的には、

     ①複数の異なる型の列からなる表形式やスプレッド形式のデータ

     ②複数の次元を持つ配列

     ③キー列で関連付けられた複数の表

     ④(不)均一に配置された時系列

    が当てはまる。

1.2 なぜPythonをデータ分析に使うのか

  • 2000年代に主流となった\mathrm{Python}\mathrm{Ruby}スクリプト言語と呼ばれ人気である。
  • しかし\mathrm{Python}は単なるスクリプトのみならず、科学計算やデータ分析、更には一般的なソフトウェア開発においても重要な言語と言える。
1.2.1 糊としてのPython
  • \mathrm{Python}が科学計算の分野で成功した理由の1つには、\mathrm{C}\mathrm{C}++、\mathrm{Fortran}のコードとの統合がしやすいことにある。
1.2.2 「2つの言語」問題を解決する
  • 一般にドメイン特化型の言語(\mathrm{R}など)を用いてプロトタイプや検証を行い、それらを終えた後に\mathrm{C}#などで製品版のシステムに移行するという手順が取られることが多い。
  • \mathrm{Python}であれば双方に適しているため、こうした動作を1つの言語で出来るというメリットがある。
1.2.3 Pythonを使うべきでない場合
  • \mathrm{Python}インタプリタ型言語であるため、コンパイル型言語(\mathrm{C}など)よりも実行速度が一般に遅い。そのため、待ち時間が短いことが求められるアプリケーションなどではコンパイル型言語の方が望ましい。
  • また高度に並列でマルチスレッドなアプリケーションには難易度が高い。

1.3 必須のPythonライブラリ

  • データ分析関連では、

     ①\mathrm{NumPy}数値計算

     ②\mathrm{pandas}:高度なデータ構造

     ③\mathrm{Matplotlib}:グラフなどの可視化

     ④\mathrm{IPython}および\mathrm{Jupyter}:対話型インタプリタ

     ⑤\mathrm{SciPy}:高度な科学計算

     ⑥\mathrm{scikit}-\mathrm{learn}機械学習

     ⑦\mathrm{statsmodels}:統計分析

    が必須ライブラリである。

2. Python組み込みのデータ構造と関数、ファイルの扱い

2.1 データ構造とシーケンス

2.1.1 タプル
  • タプルは固定長でイミュータブルな\mathrm{Python}オブジェクトの集合である。
### タプルの構成方法
# (1-1) 
tup = 4,5,6
print(tup)

# (1-2)
nested_tup = (4,5,6),(7,8)
print(nested_tup)

# (2)
tuple([4,0,2])
tup = tuple('string')
print(tup)
  • タプルを分解するには以下のような方法がある。変数分解の一般的な用途は、タプルやリストのシーケンスを反復処理することにある。他には、関数から複数の値を戻すことにある。
# タプルの分解
tup = (4,5,6)

a,b,c = tup
print(a)
print(b)
print(c)

tup = 4,5,(6,7)
a,b,(c,d) = tup

print(d)

# 入れ替え
a, b = 1,2

b,a = a,b

print(a)
print(b)

##################
seq = [(1,2,3),(4,5,6),(7,8,9)]

for a,b,c in seq:
    print('a = {0}, b = {1}, c = {2}'.format(a, b, c))
  • タプル内のある値の個数は\mathrm{count}で行う。
a = (1,2,2,2,3,4,2)
a.count(2)
2.1.2 リスト
  • リストは、タプルとは異なり、可変長で内容を差し替えることもできる。
### リストの定義
# (1) []で括る
a_list = [2, 3, 7, None]

# (2) list()を用いる
tup = 'foo', 'bar', 'baz'
b_list = list(tup)

b_list[1] = 'peekaboo'

print(b_list)

gen = range(10)

gen = list(gen)
print(gen)
  • \mathrm{append}メソッドを用いてリストの末尾に要素を追加できる。
### 
tup = 'foo', 'bar', 'baz'
b_list = list(tup)

# 末尾に値を追加
b_list.append('dwarf')
print(b_list)

# 指定した位置に値を追加
b_list.insert(1,'red')
print(b_list)

# 指定した位置の値を削除する
b_list.pop(1)
print(b_list)

# 特定の値のうち、最初にある値を削除する
b_list.append('foo')
b_list.remove('foo')
print(b_list)

# 特定の値があるか否かの論理値を返す
print('foo' in b_list)
print('foo' not in b_list)
  • リストの連結には + 演算子を用いればよい。既存のリストに結合するならば、\mathrm{extend}メソッドを用いればよい。
c_list = [4, None, 'foo'] + [7, 8, (2,3)]
print(c_list)

x = [4, None, 'foo']

x.extend([7,8,(2,3)])
print(x)
  • ソートするには、\mathrm{sort}メソッドを用いる。
a = [7,2,5,1,3]
print(a)
a.sort()
print(a)

b = ['saw','small','He','foxes','six']
print(b)
b.sort(key = len)
print(b)
  • スライシングをするには、インデックス参照の演算子である[]に対して、\mathrm{start}:\mathrm{stop}形式の書き方で抽出したい部分を指定する。
### スライシング
seq = [7,2,3,7,5,6,0,1]
seq[1:5]

#
seq[3:4] = [6,3]
print(seq)

# start, stopを省略することもできる
print(seq[:5])
print(seq[3:])

print(seq[-4]) # -は末尾からの相対的な位置を取る

# stepを指定する
seq[::2]
seq[::-1] # リストやタプルを反転させる
2.1.3 組み込み関数のシーケンス関数
  • \mathrm{enumerate}関数は、シーケンスに対して((\mathrm{i}),\mathrm{value})という形式のタプルをシーケンスにしたものを返す。
###

# enumerate
sequence = ['Jim', 'Jack', 'Thomas']

for i,value in enumerate(sequence):
    print(str(i) + ':' + value)

mapping = {}

for i,v in enumerate(sequence):
    mapping[v] = i
print(mapping) # 重複の無いsequenceのインデックス値のマップを作る

# sorted
print(sorted([7,1,2,6,0,3,2]))


# zip
seq1 = ['foo', 'bar', 'baz']
seq2 = ['one', 'two', 'three']

zipped = zip(seq1, seq2)
print(list(zipped))

for i,(a,b) in enumerate(zip(seq1, seq2)):
    print('{0}:{1},{2}'.format(i,a,b)) # 複数のシーケンスを同時に逐次処理する

# reversed
list(reversed(range(10)))
プライバシーポリシー お問い合わせ