統計分布の可視化と分析をやってみる話
私は定期的に本屋さんにいくのだが(医学書買いに)
最近は医学書買わずにプログラミングの本ばかり買っている。
しかし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行上の行列に来た回数iとi+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_histが1になるようにする・
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()
はー覚えること多い。
今回はこんな感じ、次回は解析したデータで機械学習を行う。