データ分析学習の進捗【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')

note.nkmk.me

欠損値処理

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')

note.nkmk.me

グループ化

グループ別にデータをソートし、値を出力します。
ここでは「支払い月」「商品」ごとに「金額」「個数」の合計を列挙します。

join_data.groupby(['payment_month', 'item_id']).sum()[['price', 'quantity']]

f:id:electric-city:20210204110658p:plain:w400:h400

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')

f:id:electric-city:20210204111213p:plain:w400:h200

データサイエンス育成講座

最初の頃はひたすら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

f:id:electric-city:20210204113008p:plain:w400:h400

統計検定

  • 21章 母比率の区間推定
  • 確率変数と確率分布の復習