データ分析学習の進捗【2/2】
前書き
「データ分析100本ノック」と「東京大学データサイエンティスト育成講座」を使って勉強を進めます。
melheaven.hatenadiary.jp
こちらの本の一部の問題・コードを自分なりに改変して載せています。
「全て載せてください!」という方はご購入を。おすすめです。
データ分析100本ノック
1章ではCSVファイルを読み込んだ後、年月情報を抽出し、時系列グラフを作成します。
データの成型
concat(連結)
transaction_detail_1.csvとtransaction_detail_2.csvにはあらかじめIndexが割り当てられています。
縦方向にデータを連結させています。ignore_indexはIndexを振り直すか否かのオプションです。
transaction_detail1 = pd.read_csv('sample/1/transaction_detail_1.csv') transaction_detail2 = pd.read_csv('sample/1/transaction_detail_2.csv') transaction_detail = pd.concat([transaction_detail1, transaction_detail2], ignore_index=True)
merge(結合)
mergeでは複数の表を横方向に列の値に関連させて、結合させています。
複数の表に共通する"キー"をonで指定します。left_onやright_onでキー名が表によって異なっていたとしても、指定できます。
howでは左結合(=left)、右結合(=right)、内部結合(=inner)、外部結合(=outer)も選択できます。
join_data = pd.merge(transaction_detail, transaction[['transaction_id', 'payment_date', 'customer_id']], on='transaction_id', how='left')
欠損値処理
isnull()ではjoin_dataの各列にNull値が含まれるかを、dtypesでは各列の値の型を列挙してくれます。
join_data.isnull().sum() join_data4.dtypes
日付処理
一度pandasに搭載されているdatetime型に変換してみます。
dt.strf()にて日付の処理方法を指定します。Y=Year、m=month、d=dayを示します。
フォーマットが豊富なのでその都度調べた方がいいような気もしますが、to_datetimeへの変換は忘れないように。
join_data['payment_date'] = pd.to_datetime(join_data['payment_date']) join_data['payment_month'] = join_data['payment_date'].dt.strftime('%Y%m')
グループ化
グループ別にデータをソートし、値を出力します。
ここでは「支払い月」「商品」ごとに「金額」「個数」の合計を列挙します。
join_data.groupby(['payment_month', 'item_id']).sum()[['price', 'quantity']]
sumだけでなくcount、mean、sizeなど組み込み関数は様々です。
qiita.com
pivot表の作成
上記の表をさらに視認性を高めるために、
列には商品名、行には支払い月、valueには金額の合計(sum)を配置した表の作成をpivot_tableで作成します。
graph_data = pd.pivot_table(join_data, columns='item_name', index='payment_month', values='price', aggfunc='sum')
データサイエンス育成講座
最初の頃はひたすらPython初級です。
遊んでみる。
for team, city in zip(['嵌張', '辺張', '両面'],['カンチャン', 'ペンチャン', 'リャンメン']): print('漢字: {}| 読み方: {}'.format(team, city)) 漢字: 嵌張| 読み方: カンチャン 漢字: 辺張| 読み方: ペンチャン 漢字: 両面| 読み方: リャンメン
再帰関数を使って合計値の出力をします。
def calcFib(n): if n == 1 or n == 2: return 1 else: return calcFib(n-1) + calcFib(n-2) print('Fina : ', calcFib(10)) Fina : 55
素数判定(出力は後で配列に入れました)
n = int(input()) i = 1 while i < n: i += 1 if len([j for j in range(2, i) if i%j==0]) == 0: print('{}'.format(i)) [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
scipy
線形代数ー行列式計算
import scipy.linalg as linalg from scipy.optimize import minimize_scalar a = np.array([[1,2,3],[1,3,2],[3,1,2]]) print('行列式 : {:.1f}'.format(linalg.det(a))) 行列式 : -12.0
線形代数ー固有値・固有ベクトル計算
eig_value, eig_vector = linalg.eig(a) print('固有値: {}'.format(eig_value)) print('固有ベクトル: {}'.format(eig_vector)) 固有値: [ 6. +0.j -1.414+0.j 1.414+0.j] 固有ベクトル: [[-0.577 -0.722 0.16 ] [-0.577 -0.143 -0.811] [-0.577 0.677 0.563]]
ニュートン法
ニュートン法・・・f(x)=0になるようなxを求めるアルゴリズム
from scipy.optimize import newton def myfunction(x): return x**3+2*x+1 print('ニュートン法による解 : {:.3f}'.format(newton(myfunction, 0))) ニュートン法による解 : -0.453
円周率を求める
長さ1の正方形を用意し、半径1の円を用意する。
これらの情報を用いて、円周率を求めよ。math.hypotで座標距離を求めます。
10000のランダム数を用いて、xy座標をランダムで生成。
実際に面積1の正方形のうち半径1の円に含まれる割合を求める。
import math x = np.random.uniform(0.0, 1.0, 10000) y = np.random.uniform(0.0, 1.0, 10000) _sum = 0 figure, axes = plt.subplots(figsize=(5,5)) draw_circle = plt.Circle((0, 0), radius=1, fill=False) axes.add_artist(draw_circle) plt.xlim(-2,2) plt.ylim(-2,2) plt.title('Circle') for _x, _y in zip(x,y): plt.scatter(x,y) if 1 >= math.hypot(_x,_y): _sum+=1 print(_sum/10000) print('PI: ',_sum/10000*4) 0.7857 PI: 3.1428
統計検定
- 21章 母比率の区間推定
- 確率変数と確率分布の復習