def 小児科医():

かけだし小児科医が仕事の合間にプログラミングを勉強するブログです。

統計分布の可視化と分析をやってみる話

私は定期的に本屋さんにいくのだが(医学書買いに)

最近は医学書買わずにプログラミングの本ばかり買っている。

しかし1冊読むのに途方もない時間がかかるので、どんどん積み本が増えていく。

 

というわけで積み本のうち1冊を読み始める。

それがこれ、

「AI・データサイエンスのための 図解でわかる数学プログラミング

である。

 

 

特にこの本を選んだ理由は、、、特にない。目についたから。

統計解析、機械学習系の仕組みは少しわかってきたけど、実際にコードが書けるわけではないので、その辺の覚書をこのブログに書いていく。

 

 

というわけで第1部第1章「統計分布の可視化と分析」

この章ではホテル2年分の宿泊データを使って、感染症流行前後でどのような変化があったか解析する。

 

・pandas(import pandas as pd)

データ解析ライブラリ。

csv読み込み】

csvデータを読み込むことから。

pd.read_csv("csvファイル名")でデータを読み込む。

index_col:インデックスの指定。今回は0列目の"日時"をインデックスに指定している

parse_date:指定列をdatetime型に。

quoting:これは今回は不要だが、全数値の型を変えられる。2はfloat型になる。

【DataFrame操作】

df_info_A = df_info[df_info["カラム"]=="A"]:カラム(列名)を指定して抽出

pd.DataFrame([list名]):リストをDataFrameに

pd.DataFrame().T:行列の転置を行う

df.columns = ["列名"]:列名をつける

df["列名"] = list:列名を作ってリストを入れる

#データ読み込み 0行目をインデックスに
pd.read_csv("データ.csv", index_col=0, parse_dates=[0], quoting=2)#quoting=2で数値を全てfloat型に
#特定データの抽出
df_info_A = df_info[df_info["カラム(列名)"]=="A"]
#インデックスリセット
df_info = df_info.reset_index() #indexをリセットして日時でデータを動かせるようにする。

#リストをDataFrameに
df = pd.DataFrame([list_id])
df = df.T
df.columns = ["顧客ID"]
df["宿泊者名"] = list_name
df["流行前"] = list_date_pre
df["流行後"] = list_date_post
 

 

【代表値】

データ.value_counts()はデータの数をカウント

さらにデータ.value_counts().index[]でデータごとにまとめて表示できる

mean():平均値

median():中央値

min():最小値

max():最大値

#利用頻度の代表値を計算
x_mean = df_info["ID"].value_counts().mean()

x_median = df_info["ID"].value_counts().median()
x_min = df_info["ID"].value_counts().min()
x_max = df_info["ID"].value_counts().max()

データ.resample("M").sum()は月ごとの数値の合計を集計してグラフにする

sum()をcount()にするとデータの数を数える

 

・matplotlib(import matplotlib.pyplot as plt)

グラフ描画ライブラリ

【グラフ化】

plt.plot(グラフ化するデータ)でデータをグラフ化。

plt.bar():棒グラフにする

plt.hist()ヒストグラムを表示

plt.scatter():散布図を表示

plt.xticks(rotation=数値):xラベルの文字を回転させる

plt.show():グラフを表示

#月ごとの金額合計をグラフ化
plt.plot(df_info["金額"].resample("M").sum(), color="k") #期間ごとに集計するresampleの引数をMにすると月ごとに行う
plt.xticks(rotation=60)

plt.show()

#利用頻度のヒストグラム
x = df_info["ID"].value_counts()
x_hist,t_hist,_ = plt.hist(x,21,color="k") #21は最大値を最小値を分ける区間,1つのhistで記載することで縦軸と横軸を分けられる
plt.show()

 

・numpy(import numpy as np)

多次元配列計算ライブラリ。

【行列操作】

np.zeros(A,B):A行のB列の0行列を作成

【フィッティング】

np.polyfit(x, f(x), 次数, w):最小二乗近似法で(次数1の場合)f(x)=ax+bを満たすa,bを算出する

 

※べき曲線のフィッティング

べき曲線と仮定するとp(x)=Ae**ax(a<0)となるはず
両辺logをとって
logp(x) = ax+logA
A=e**bとおくと
logp(x) = ax+b
今回はx_histという関数に対して行うので
logx_hist(t) =at+b を満たすa,bを算出する。

#近似曲線のパラメータを算出
#パラメータ設定
epriron = 1
num =15

#変数設定
weight = x_hist[1:num]#重みの設定。x_histの値が高いほどfittingする。
t = np.zeros(len(t_hist)-1) #横軸の合計(つまり来た回数の合計)-1の数だけ0がある行列
for i in range(len(t)):
t[i] = (t_hist[i]+t_hist[i+1])/2 #2行上の行列に来た回数ii+1の人数÷2をぶち込んでいく
#histの値は端点(1−2とか2−3とか)なので値を足して2で割ることで1.5とか2.5といった1つの値になる。


#最小二乗近似
a, b = np.polyfit(t[1:num], np.log(x_hist[1:num]), 1, w=weight)
#logx_hist(t) =at+bのグラフをかく
xt = np.zeros(len(t))

for i in range(len(t)):
xt[i] = a*t[i]+b #logx_hist(t)の計算をしてるだけ
plt.plot(t, xt, color="r")

#元データを書く(縦軸はlogx_hist(t)なので変える。)
plt.plot(t_hist[1:], np.log(x_hist+epriron), marker=".", color="k")#log0だとバグるので最低でもx_hist1になるようにする・
plt.show()



#近似曲線をかく

t2 = t_hist[1:]

xt = np.zeros(len(t))#いったん0の行列にリセット
for i in range(len(t)):

xt[i] = math.exp(a*t2[i]+b) #p(x)=e**(ax+b)
plt.bar(t_hist[1:], x_hist, width=8, color="k")

plt.plot(t2,xt,color="r")
plt.show()

 

はー覚えること多い。

今回はこんな感じ、次回は解析したデータで機械学習を行う。