2024年4月29日月曜日

サーバ構築との出会い

 現在、学部1年生対象の「オペレーティングシステム」という授業を担当しています。この授業では、クラウド環境(AWS)を活用して、サーバ構築を学んでいく授業です。僕自身、サーバ構築を学んだというより、色々なことを頼まれたり、やったりしながら経験を積んでいきました。

(1) 最初の出会い:Linuxと研究室サーバ

僕が学生だった頃(2000年前後)はLinuxのサーバ利用が広がっていた時代でした。大学にUnixが整備されていましたが、ワークステーション室にあるので、大学にろくに行っていなかった僕にとっては遠い存在でした。その中で、Linuxと出会い、無料で使えるサーバに適したOSということで、少し興味を持っていました。その頃の大学のネットワークは、全部IPアドレスはグローバルアドレスを使うなど、今のネットワーク環境では考えられないものでした。僕は、研究室のネットワークを管理しようと、プリンタサーバ、ファイルサーバ(SAMBA)、DHCPサーバなど研究室内で必要なサーバをLinuxで構築しました。これが僕のサーバ構築の最初の経験となりました。

(2) 自宅でのサーバ構築

大学院から社会に出て働き出した頃、自分でHPを作成してみようと思い、せっかくなのでサーバも立ててみようと思って、固定IPやドメインを契約しました。当時のマウスコンピュータで、サーバとするPCも購入し、自宅でサーバを立てて運用していました。今思えば、この1から本番用のサーバを立てて、身近な場所で運用していたことは、良い経験になりました。ただし、自宅でのサーバ運用は、電気代、騒音など苦労も多かったです。

(3) クラウド・コンピューティングとの出会い

2010年前後からクラウド・コンピューティングが急激に普及して、今までのオンプレミスの環境からクラウド環境への移行が進みました。僕自身、静岡大学情報基盤センターで客員教員として研究に関わることができ、当時のセンター長の井上春樹先生が積極的にクラウド活用を進めていたこともあり、色々な研究に関わらせてもらいました。このクラウド環境の出現で、様々な情報基盤の効率化や最適化が図られたと思います。このクラウド環境では、「いつでも」「どこでも」「すぐに」サーバを構築することができ、AWSのEC2は研究だけでなく、授業でも活用しました。学会のHPも今までオンプレミスだったものを、クラウドに移行したのを覚えています。今では当たり前のクラウド環境ですが、この出会いは僕の研究の幅を大きく広げてくれました。

(4) 情報基盤系センター長としての経験

僕自身、8年間情報系基盤センターの副センター長・センター長を担当し、大学のネットワークやサーバ環境を大規模に構築しました。大学の基幹サーバをデータセンタに移行し、ネットワークもデータ活用面まで考えた設計にしました。この取り組みは学内外で評価して頂き、色々なところでお話させてもらいました。ここで内容を述べると大変長くなってしまうのでやめておきますが、いつか書き残しておきたいと思います。この情報基盤構築を経験したことで、現在やっているデータサイエンスの環境を構築することができています。強固な情報基盤を構築し、日々の運用の中で発生するデータを築することができ、さらにそのデータを活用し、情報基盤にフィードバックすることができる環境はデータサイエンスの基盤となります。

(5) 今後の取り組み

僕自身の経験を考えてみると、自宅で1からサーバを立てて運用した経験がベースになり、クラウド環境の活用を行い、大学の情報基盤構築といった大規模な環境まで繋げることができました。クラウド環境が当たり前の現在では、中々サーバというものが目にすることもなく、身近なものではありませんが、物理的なモノを見ることでイメージも湧きやすいと思います。機会があれば、raspberry piなどのマイコンで十分ですので、手元でのサーバ構築を行い、目にみえる経験を得てください。その上でクラウド環境を使うと、サーバ構築の見え方が違うかもしれません。

サーバ環境も日々技術進歩があります。今の知識・技術に固執することなく、生成AIも取り込みながら、次のサーバ環境を考えていきたいと思います。

2024年2月19日月曜日

ベイジアンネットワークの基本1 : 簡単な例

ベイジアンネットワークの簡単な例を通して、どのような仕組みかを確認していきます。
1. 例題1
藤田一弥. (2015). 見えないものをさぐる―それがベイズ ツールによる実践ベイズ統計. 株式会社 オーム社. P99 4-2 例題2を利用して、例題を見ていきます。以下のネットワークを考えます。W(Weather), R(Rain), S(Sprinkler), G(Ground)となっていて、天気の良し悪しで、地面が濡れているかどうかを、雨またはスプリンクラーの影響を入れてネットワークができています。
この例題を通して実施したいことは、以下の3つです。
(1) ベイジアンネットワークのモデル(構造)を作る(ネットワークの形、尤度)
(2) 前方への確率(条件付き確率)を求める (P(G|W=w))など、グラフの左から右への確率
(3) 後方への確率(事後確率)※これがメインのもの、グラフの右から左への確率

今回は、pgmpyを使ってベイジアンネットワークでの分析をするので、インストールをしてください。
!pip install pgmpy

(1) ベイジアンネットワークのモデル(構造)を作る(ネットワークの形、尤度)
まず、例題で与えられたネットワークを作成していきます。また、推移確率も追加していきます。この推移確率を作成するときが間違えやすく、行がvariable(確率変数)、列がevidence(条件)の組み合わせになっているので、推移確率が今回の例題のように与えられた場合は、注意をしてください。今回の推移確率とWの事前分布はソースコードを確認してください。例えば、[[P(S=0|W=0), P(S=0|W=1)], [P(S=1|W=0), P(S=1|W=1)]]のように与えます。

(2) 前方への確率(条件付き確率)を求める (P(G|W=w))など、グラフの左から右への確率
今回は、「P(G = 1| W = 1)を計算:天気が晴れという条件のもとで、芝が濡れている確率」を求めていきます。つまり天気(W=1)が与えられたときのGの分布を求めていきます。

(3) 後方への確率(事後確率)※これがメインのもの、グラフの右から左への確率
今回は、「確率的推論(事後確率) P(W = 1 | G = 1) 芝が濡れているとき、晴れである確率」を求めていきます。「P(W = 1 | G = 1): 0.42538461538461536」が得られます。

2. 例題2 : 涌井良幸, & 涌井貞美. (2012). 史上最強図解 これならわかる! ベイズ統計学. ナツメ社. P170 例題2を参照
もう一つ例題を見ていきます。
この図のようなネットワークを作成します。

このとき、B(Burglar)、E(EarthQuake)、A(Alert)、P(Police)、S(Security)といったノードになっています。泥棒(B)が入ったとき、アラート(A)がなり、セキュリティ会社(S)に連絡がいくという流れです。
(1) ベイジアンネットワークのモデル(構造)を作る(ネットワークの形、尤度)
これは例題で与えられているので、尤度(推移確率)の構造に注意して作成していきます。

(2)前方への確率(条件付き確率)を求める (P(G|W=w))など、グラフの左から右への確率
これは演習としますので、やってみてください。

(3) 後方への確率(事後確率)※これがメインのもの、グラフの右から左への確率
P(B | S) セキュリティ会社に連絡がいったとき、泥棒が入った確率」を求めてみます。
P(B = 1 | S = 1): 0.042763793338810904が得られます。

2024年1月31日水曜日

Bakery Sales Dataset : (2) 日毎の販売回数をポアソン分布に従うとして、パラメタの事後分布を推定

 今回は、日毎の販売回数がポアソン分布に従うとして事後分布を推定していきます。

(1) 共役自然分布を使ったポアソン分布の事後分布推定の概要

ポアソン分布の尤度関数は次のように与えられる:
$$ p(X|\lambda) = \prod_{i=1}^{n} \frac{e^{-\lambda} \lambda^{x_i}}{x_i!} $$
ここで、$ X=(x_1,\dots,x_n) $ は観測データである。

ガンマ事前分布は次のように与えられる:
$$ p(\lambda|a,b) = \frac{b^a}{\Gamma(a)} \lambda^{a-1} e^{-b\lambda} $$

ベイズの定理により、
$$ p(\lambda|X) = \frac{p(\lambda,X)}{p(X)} = \frac{p(X|\lambda)p(\lambda|a,b)}{p(X)} \propto p(X|\lambda)p(\lambda|a,b) $$
$$ = \prod_{i=1}^{n} \frac{e^{-\lambda} \lambda^{x_i}}{x_i!} \cdot \frac{b^a}{\Gamma(a)} \lambda^{a-1} e^{-b\lambda} $$
$$ \propto \lambda^{\left(\sum_{i=1}^{n} x_i + a - 1\right)} e^{-(n+b)\lambda} $$

以上より、事後分布はガンマ分布となり、そのパラメータは次のようになる:
$$ a_{\text{post}} = \sum_{i=1}^{n} x_i + a $$
$$ b_{\text{post}} = n + b $$

したがって、$ \lambda $ の事後分布は次のようになる:
$$ p(\lambda|X) = \frac{b_{\text{post}}^{a_{\text{post}}}}{\Gamma(a_{\text{post}})} \lambda^{a_{\text{post}}-1} e^{-b_{\text{post}}\lambda} $$

つまり、ポアソン分布のパラメタ$\lambda$の事前分布をガンマ分布とおくと、$\lambda$の事後分布は同じくガンマ分布になる。

(2) 販売回数がポアソン分布に従うときのパラメタ推定
ここでは、1日ごとの販売回数を集計し、そのデータを用いてポアソン分布のパラメータのベイズ推定を行います。その後、事後分布を求めてみましょう。まずは、日付ごとの販売回数を集計します。
ここでは、事前分布としてガンマ分布を使用し、事後分布を計算してみましょう。ガンマ分布は、形状パラメータ($\alpha$)と尺度パラメータ($\beta$)を持ちます。これらのパラメータを適切に選ぶことが重要です。仮に、$\alpha=\beta=1$(一様事前分布に近い)として計算してみます。
ポアソン分布のパラメータ($\lambda$)の事後分布をプロットしました。このグラフは、観測データとガンマ分布を事前分布とした場合の$\lambda$の事後確率密度を示しています。
この事後分布から、平均販売回数の最も確からしい値や、その不確実性を評価することができます。例えば、事後分布のピークは$\lambda$の最も可能性の高い値を示し、分布の幅は不確実性の程度を示します。

(3) 得られた$\lambda$の事後分布からのMAP(Maximum A Posteriori)推定
AP推定は事後分布を最大化する$\lambda$の値を見つけることです。ガンマ分布の場合、$a > 1$ のとき、$\lambda$のMAP推定値は次のようになります: 
$$ \hat{\lambda}_{\text{MAP}} = \arg\max_\lambda (p(X|\lambda) \cdot p(\lambda|a,b)) $$ 
$$ \hat{\lambda}_{\text{MAP}} = \frac{a_{\text{post}} - 1}{b_{\text{post}}} $$ 
ガンマ分布の最大値はそのモード(最頻値)となる性質があります。
実際求めてみます。
ポアソン分布のパラメータ(λ)の最大事後確率(MAP)推定値は約59.16です。これは、観測データをもとに、平均販売回数が一日あたり約59回であると推定されることを意味します。この値は、データと事前分布から導き出された最も確からしい販売回数の推定値です。

今度は、$\alpha=2, \beta=1$でやって、先ほどの結果と比較してみます。新しい事前分布に基づいた$\lambda$の最大事後確率(MAP)推定値は約59.16で同じでした。これは、事前分布を変更しても、観測データの影響が大きいため、MAP推定値に大きな変化が見られないことを示しています。この結果は、データが豊富であればあるほど、事前分布の影響が小さくなるというベイズ推定の特性を反映しています。

(4)事後予測分布

事後予測分布(Posterior Predictive Distribution)は、ベイズ統計学の枠組みで使用される重要な概念の1つで、ベイズ推論を行った結果から未知のデータポイントの分布を予測するための確率分布です。事後予測分布は以下のように表されます: 

$$ P(X_{\text{new}}|X) = \int P(X_{\text{new}}|\lambda)P(\lambda|X)d\lambda $$ 

ここで、ポアソン分布のパラメータ $\lambda$ がガンマ分布に従う場合、事後予測分布は負の二項分布(またはポリヤ分布)になります。 

負の二項分布の確率質量関数(PMF)は以下のように表されます: 

$$ P(x_{\text{new}}|a_{\text{post}}, b_{\text{post}}, X) = \frac{\Gamma(x_{\text{new}} + a_{\text{post}})}{x_{\text{new}}!\Gamma(a_{\text{post}})} \left(\frac{b_{\text{post}}}{b_{\text{post}} + 1}\right)^{a_{\text{post}}} \left(\frac{1}{b_{\text{post}} + 1}\right)^{x_{\text{new}}} $$

これをやろうとすると、先ほど求めたパラメタ$\alpha_post=9466, \beta=160 (\alpha=2, \beta=1)$となってしまい、累乗の計算が困難です。以下のように実施します。

最後にMCMCで事後予測分布を可視化します。

ここまでのソースコード

2024年1月26日金曜日

糖尿病:Diabetes Health Indicators Dataset : 02 主成分分析からクラスタリングまで

 糖尿病:Diabetes Health Indicators Dataset : 基本分析01の続きを行なっていきます。今回は主成分分析と主成分分析の結果を用いたクラスタリングです。

1. 主成分分析の実施

まず主成分分析を行なっていきますが、今回のように要素が多い場合、主成分分析で次元削減を行い、新たな軸で分析することは有効です。今回は累積寄与率80%で分析を行います。主成分分析を行い、各主成分の項目ごとのウエイトをデータフレームにして算出します。今回は目的変数に相当する「Diabetes_binary」は除いた21項目で実施しました。80%の累積寄与率でやると14主成分となっています。

これだとはっきりしないので、ヒートマップで色分けしてみます。
演習:このヒートマップをみて、各主成分(PC0 ~ PC4)に名前をつけましょう。
  • PC0: この主成分は「GenHlth」(一般的な健康状態)や「PhysHlth」(身体的健康)などの特徴量に高い負荷量を持っています。したがって、この主成分は「全体的健康状態」を反映していると考えることができます。
  • PC1: 「Age」(年齢)に高い負荷量を持っており、「Education」(教育)や「Income」(収入)にも影響を与えています。この主成分は「年齢と社会経済的地位」を反映していると言えるでしょう。
  • PC2: 「Fruits」(果物の摂取)や「Veggies」(野菜の摂取)に高い負荷量を持っています。この主成分は「食生活の健康性」を表している可能性があります。
  • PC3: この主成分は「BMI」(体格指数)に高い負荷量を持っており、「CholCheck」(コレステロール検査)や「GenHlth」(一般的な健康状態)にも影響を与えています。この主成分は「身体的健康とライフスタイル」を反映していると考えられます。
  • PC4: 「Smoker」(喫煙)に高い負荷量を持っていることが見られます。また、他の健康関連の特徴量にも影響を与えています。この主成分は「喫煙と関連する健康リスク」を表している可能性があります。
累積寄与率のグラフを書いてみます。
次に主成分0と1を使って、biplotで表示します。まずは「Diabetes_binary」が1のときです。
次に「Diabetes_binary」が0のときです。
PC2も加えて3次元で表示してみます。

演習:biplotの結果からどのようなことが言えるでしょうか?

2. 主成分分析の結果からクラスタリング実施
次にクラスタリングを実施してみます。元データからではなく、主成分分析で求まる射影行列を使ってのクラスタリングを行います。今回はK-means法で5個のクラスタに分類してみます。
この結果をヒートマップで表示してみやすくしてみます。値を整えてから出力します。
演習:それぞれのクラスタの特徴を書き出してみましょう。
  • クラスタ0 (「低リスク・健康志向」): このクラスタは全体的に低い糖尿病率と低い健康リスク指標(BMI、高血圧など)を示しており、身体活動が高いことが特徴です。

  • クラスタ1 (「中高年・リスクあり」): 高い年齢層に属し、高血圧や高コレステロールの割合が高い。中程度の糖尿病率を持つ。

  • クラスタ2 (「高リスク・健康課題」): 最も高い糖尿病率を持ち、BMIや心臓病のリスクも高い。身体活動が低く、健康上の課題が多い。

  • クラスタ3 (「アクセス限定・中リスク」): 一般的な健康状態は中程度で、医療へのアクセスが限られている(NoDocbcCostが高い)ことが特徴。中程度の糖尿病率。

  • クラスタ4 (「若年・喫煙者」): 比較的若い年齢層で喫煙率が高い。糖尿病の割合は比較的低いが、長期的な健康リスクを持つ可能性がある。


このような方法で、基本的な分析からクラスタリングをすることで、データの内容がわかりやすくなったと思います。

2024年1月22日月曜日

糖尿病:Diabetes Health Indicators Dataset : 基本分析01

糖尿病オープンデータを分析していきます。今回の分析は、Diabetes Health Indicators Dataset (https://www.kaggle.com/datasets/alexteboul/diabetes-health-indicators-dataset)を用いていきます。このデータには、22項目があり、
  • Diabetes_012:糖尿病の状態を示す変数です。

    • 0 = 糖尿病なし
    • 1 = 前糖尿病
    • 2 = 糖尿病
  • HighBP:高血圧の状態を示す変数です。

    • 0 = 高血圧なし
    • 1 = 高血圧
  • HighChol:高コレステロールの状態を示す変数です。

    • 0 = 高コレステロールなし
    • 1 = 高コレステロール
  • CholCheck:過去5年間にコレステロール検査を受けたかどうかを示す変数です。

    • 0 = 過去5年間にコレステロール検査なし
    • 1 = 過去5年間にコレステロール検査あり
  • BMI:身体質量指数

  • Smoker:過去に少なくとも100本のたばこを吸ったかどうかを示す変数です。

    • 0 = 吸ったことなし
    • 1 = 吸ったことあり
  • Stroke:脳卒中を経験したかどうかを示す変数です。

    • 0 = 脳卒中なし
    • 1 = 脳卒中あり
  • HeartDiseaseorAttack:冠動脈性心疾患(CHD)または心筋梗塞(MI)の有無を示す変数です。

    • 0 = なし
    • 1 = あり
  • PhysActivity:過去30日間に非職業的な身体活動を行ったかどうかを示す変数です。

    • 0 = していない
    • 1 = している
  • Fruits:果物を1日1回以上摂取するかどうかを示す変数です。

    • 0 = 摂取しない
    • 1 = 摂取する
  • Veggies:野菜を1日1回以上摂取するかどうかを示す変数です。

    • 0 = 摂取しない
    • 1 = 摂取する
  • HvyAlcoholConsump:週に14杯以上のアルコール飲料を摂取する男性または週に7杯以上のアルコール飲料を摂取する女性かどうかを示す変数です。

    • 0 = そうでない
    • 1 = そうである
  • AnyHealthcare:いかなる種類の健康保険または医療保険を持っているかどうかを示す変数です。

    • 0 = 持っていない
    • 1 = 持っている
  • NoDocbcCost:過去12か月間に医師を訪れる必要があったが、費用のために訪れることができなかったかどうかを示す変数です。

    • 0 = 訪れなかった
    • 1 = 訪れることができなかった
  • GenHlth:一般的な健康状態を示す変数です。スケール1-5

    • 1 = 優れている
    • 2 = とても良い
    • 3 = 良い
    • 4 = まあまあ
    • 5 = 悪い
  • MentHlth:精神的な健康状態を示す変数です。過去30日間の精神的な健康に関する日数を表します。スケール1-30

  • PhysHlth:身体的な健康状態を示す変数です。過去30日間の身体的な健康に関する日数を表します。スケール1-30

  • DiffWalk:歩行や階段の昇降に重大な困難があるかどうかを示す変数です。

    • 0 = なし
    • 1 = あり
  • Sex:性別

    • 0 = 女性
    • 1 = 男性
  • Age:年齢カテゴリー

    • 1 = 18-24歳
    • 9 = 60-64歳
    • 13 = 80歳以上
  • Education:教育レベル

    • スケール1-6
    • 1 = 学校に通ったことがないか、幼稚園のみ
    • 2 = 小学校(1年から8年)
    • 3 = 高校に通ったことがあるが、中途で中退(9年から11年)
    • 4 = 高校卒業(12年またはGED)
    • 5 = 大学1年から3年(一部大学または専門学校)
    • 6 = 大学4年以上(大学卒業)
  • Income:収入スケール

    • スケール1-8
    • 1 = 10,0005=35,000未満
    • 8 = $75,000以上
となっています。実際にダウンロードした「diabetes_binary_health_indicators_BRFSS2015.csv」を取り込んでみます。
(1) データの可視化
今回のデータは、カテゴリカルデータ(質的データ)と数値データ(量的データ)に分類されます。2値データ以外「'BMI', 'Age', 'GenHlth', 'MentHlth', 'PhysHlth', 'Education', 'Income'」をヒストグラムで書いてみます。
各項目の分布を見ることができます。2値データもヒストグラムで書いてみます。
これらのデータに対する2項目間の基本的処理は以下になります。
・散布図(Scatter Plot): 両方の項目が数値データの場合に適しています。これにより、2つの変数間の相関関係を視覚的に把握できます。
・箱ひげ図(Box Plot): 一方がカテゴリカルデータ(例:2値データ)で、もう一方が数値データの場合に適しています。これにより、異なるカテゴリにおける数値データの分布の違いを視覚的に比較できます。
・クロス集計(Crosstab)と棒グラフ: 両方の項目がカテゴリカルデータの場合に適しています。これにより、2つのカテゴリカル変数間の関係を表形式とグラフで表示できます。

まず2値データ以外での散布図です。今回の場合は、離散化されているのであまり面白くはないです。
次に2値データと数値データで箱ひげ図を書いてみます。
次に2値データに対して、クロス集計をしていきます。下記は一つの例です。
[演習]
ここまでの分析で何が言えるかをまとめてみましょう。
Boxplotから
PhysHlth(身体的健康) by DiffWalk(歩行困難):

平均値の違い: 約11.15
中央値の違い: 10
この組み合わせは、歩行困難がある人とない人の間で身体的健康状態に大きな違いがあることを示しています。
PhysHlth by Stroke(脳卒中):

平均値の違い: 約6.58
中央値の違い: 4
脳卒中の経験がある人とない人の間で身体的健康状態に顕著な違いが見られます。
PhysHlth by HeartDiseaseorAttack(心臓病または心臓発作):

平均値の違い: 約5.42
中央値の違い: 2
心臓病または心臓発作の経験がある人とない人の間で、身体的健康状態に大きな違いが存在します。

MentHlth(精神的健康) by NoDocbcCost(医療費用のため医者にかからない):

平均値の違い: 約5.13
中央値の違い: 2
医療費用のために医者にかからない人とそうでない人の間で、精神的健康状態に顕著な違いが見られます。
収入(Income):
糖尿病がない人の収入の中央値は糖尿病のある人よりも高い傾向にあります。これは、収入が低い人ほど糖尿病になるリスクが高い可能性を示唆しています。
糖尿病がない人の方が平均的にも中央値でも収入が高いことを示しています。平均収入において約0.98の違いがあり、中央値には1.0の違いがあります。


[演習] クロス集計から言えることをまとめてください。

2024年1月10日水曜日

生成AI時代においてプログラミングを学ぶ意味

 プログラミングはこの生成AI時代においてどのような意味を持つのでしょうか?生成AIを使えば、簡単なプログラムから難易度の高いプログラムまで、すぐに作成してくれます。僕自身、改めて考えてみました。


(1) 言語としての重要性
プログラミングで使うプログラミング言語はPythonやJavaなど色々な種類があります。「プログラミング言語」との言葉の通り、コンピュータと会話をする言語になります。人間が人間同士会話することと同じく、人間がコンピュータと会話をするためにプログラミング言語を使います。人間同士会話をするときは、単語、文法、言い回しなどを駆使して文脈を作り、話をしています。プログラミング言語でも、基本データ型、構造的プログラミングでの順次・選択・繰り返しの基本文法、関数、クラスを使って、コンピュータに実行してもらう処理を理解してもらい、実行してもらいます。人間同士話をするときも、常に同じ内容で話すのではなく、気持ちや感情にも左右され、自由度の高い会話をしています。コンピュータと会話をするとき、自分の処理したいこと、やりたいことを実行するためには、コンピュータのリソースを考え、自由度の高いプログラミングを書く必要があります。生成AIで形式的に書かれたものでは、壁にぶつかったとき、調整が効かず、乗り越えることができないかもしれません。自分自身の意思を持ったプログラミングは、その壁を乗り越えられる可能性があります。

(2) 社会人スキルとしての重要性(論理的思考)
プログラミングスキルは社会人スキルとしても重要なものとなっています。上記のようなコンピュータと柔軟な会話ができるだけでなく、プログラミングを学ぶと、どのように処理すると効果的かといった論理的思考能力が備わります。この論理的思考を抽象化・体系化したものがアルゴリズムですが、この論理的思考はビジネスなどの意思決定において、大事なものになります。

(3) 技術進歩の歴史と知の集約
プログラミングは、現代の技術進歩と共に発展してきました。アセンブラやC言語では、ハードウェアの制約の中で、いかに効率的に速く処理をするか、ソースコードから見ることができます。コンパイラでは、オートマトンを使い、字句解析、構文解析を行うことで、プログラミングをコンピュータがわかる言葉に翻訳しました。データサイエンスでよく使われるRやPythonでは、統計・機械学習のライブラリが充実しており、今まで散見していたコード上での知識の集約がされています。プログラミングを学ぶときに、このような側面を見ることで、より深くプログラミングを学ぶことができます。そして忘れてはいけないのが、このような充実したプログラミング環境が提供されているのは、現在までの技術者の方々の貢献です。ライセンスを見ても、ほとんどのものが無償で使えるものであり、オープンソースとして公開することで、さらなる技術の発展をサポートしてきました。これらの貢献に大きな謝意を忘れず、今後に引き継いでいく必要があると考えます。

生成AIが普及する中で、プログラミングを1から学ぶことの意義を忘れてしまうこともあるかと思います。上記に述べた、(1) 言語としての重要性、(2) 社会人スキルとしての重要性(論理的思考)、(3) 技術進歩の歴史と知の集約、を改めて考えてみると、プログラミングを基礎から体系的に学ぶことで、プログラミングで過去と将来、また人間とコンピュータを繋げることができ、創造的な考えから新しい技術革新を呼び起こす可能性があると思えます。この背景のもとに、プログラミングスキルを身につけることで、今後さらに普及するであろう生成AIと協働する、次の世代の技術者が誕生すると期待しています。

2024年1月8日月曜日

Chicago Divvy Bicycle Sharing Dataの分析2 : データの集計と地図表示

 前回やった内容(https://smizunolab.blogspot.com/2024/01/chicago-divvy-bicycle-sharing-data1.html)の基本分析に加え、主成分分析とクラスタリングを行い、データの特性を明確にしていきます。時系列のデータのままやりたいところですが、分析をしやすくするために一旦集計表を作っておきます。集計表は

(ステーション名、electric_bikeの回数、classic_bikeの回数、利用回数(start)、利用回数(end)、memberの回数、casualの回数、平均緯度、平均経度)で作成してみます。
それぞれの回数はスタート地点、エンド地点の両方でカウントしています。
(1) 散布図の描画と相関係数
まず項目間の関係を見るために、散布図を書いてみます。
全部で15個のグラフが描かれます。線形になっているグラフが多いです。
次に相関係数を求めていきます。
これを見るとどの項目間でも相関が高い項目となっています。このまま主成分分析をやっても、主成分1に項目がまとめられてしまい、意味を成しませんが、他の項目が入ってくれば主成分分析を行うことで相関が高い項目を一つの軸としてまとめられ、多重共線性の問題を軽減することができます。多重共線性(Multicollinearity)は、統計モデリングや回帰分析において、説明変数(独立変数)同士が高い相関を持つ状況を指します。この現象が発生すると、個々の説明変数の影響を正確に推定することが難しくなり、統計モデルの解釈や信頼性に問題が生じる可能性があります。
今回は主成分分析、クラスタリングとは進まずに地図表示で各ステーションがどこにあるかを確認します。

(2) 地図表示
最初に地図表示をするためのライブラリをインストールしておきます。緯度・経度は微妙にずれているので、平均を取ったもので表示します。色々な表示方法がありますが、下記は利用回数が多いステーションを濃い色で表しています。
!pip install folium

(3) ステーション間の推移回数と推移確率
ステーション間の推移回数を求めていきます。
1060 rows × 1086 columns
となっており、行と列の数が違います。つまり、出発地点、または終了地点のどちらかでしか使われていないステーションがあります。出発・終了両方に含まれているステーションだけ抽出します。出発・終了地点の両方に含まれるステーションは1003拠点となりました。さらに行和が0となっているステーションがあったので、取り除くと999拠点となりました。一番右の列は行和になります。
999 rows × 1000 columns
これを1となる推移確率に変換していきます。
この推移確率をヒートマップで表示していきます。
ここから定常分布を求めていきたいところですが、この推移確率はエルゴード性を持たないことが予想されますので、一度にはできません。ここでは、推移確率の算出までに留めておきます。

(3) ステーション間の平均利用時間の取得
推移確率で用いたステーションを使って、各ステーション間での平均利用時間を求めておきます。累積の利用時間、利用回数、平均利用時間を求めておきます。
これを推移確率と同じステーションを使って、平均利用時間行列を作成します。

これでステーション間の移動時間を求めることができました。

2024年1月4日木曜日

Chicago Divvy Bicycle Sharing Dataの分析1 : 基本分析

 Divvy Bikesがシカゴ市で提供されている自転車共有サービスのデータを使い、基本的なデータ分析を行なっていきます。

次のリンクからデータをダウンロードします。

https://divvybikes.com/system-data

「Download Divvy trip history data」よりダウンロードページに移り、執筆時点で最新の「 202311-divvy-tripdata.zip」をダウンロードしていきます。

解凍ファイルを展開すると「202311-divvy-tripdata.csv」が得られますので、これを分析していきます。

今回もGPTから得られたコードを使ってやっていきます。

[データのインポートと基本統計量の算出と可視化]
csvを取り込んでいきます。
このファイルには、362,518行のデータがあり、それぞれ13のカラムを持ちます。
ride_id: 各ライド(乗車)に割り当てられた一意の識別子。
rideable_type: 使用された自転車のタイプ。
started_at: ライドの開始日時。
ended_at: ライドの終了日時。
start_station_name: ライド開始時のステーション名。
start_station_id: ライド開始時のステーションID。
end_station_name: ライド終了時のステーション名。
end_station_id: ライド終了時のステーションID。
start_lat: ライド開始時の緯度。
start_lng: ライド開始時の経度。
end_lat: ライド終了時の緯度。
end_lng: ライド終了時の経度。
member_casual: 利用者がメンバーかカジュアル(非メンバー)かを示す。

緯度・経度のヒストグラムを見て、中心的な場所を確認します。これらのヒストグラムは、大部分のライドが特定の範囲内の地理的な領域で発生していることを示しています。また、開始点と終了点の緯度と経度の平均値が非常に近いことから、多くのライドが同じ地域内で完了していることもわかります。
カテゴリカルデータ(「rideable_type」と「member_casual」)の出現頻度を確認します。
Rideable Type (自転車のタイプ): このグラフは、利用された自転車のタイプの分布を示しています。2種類の自転車タイプがあり、そのうちの一つが他よりも頻繁に利用されていることがわかります。Member vs Casual (メンバー対カジュアル): このグラフは、利用者がメンバーかカジュアル(非メンバー)かの分布を示しています。どちらか一方が他方よりも明らかに多く利用されていることが観察できます。

次に、ステーションについて確認します。件数で並び替えた際に最も多い上位20%の「start_station_name(開始ステーション名)」と「end_station_name(終了ステーション名)」のステーションを示しています。
開始、終了のステーションが同じ名前が多いことから、よく使われるステーションは開始にも終了にも使われることがわかります。
合計乗車回数で大きい方から並べたときの上位20%のステーションを示しています。各ステーションでの「開始」(スカイブルー色)と「終了」(緑色)のライド数が積み上げられています。
合計乗車回数に基づいて大きい方から並べたときの上位ステーションにおける、電動自転車(スカイブルー色)とクラシック自転車(緑色)の利用回数を示しています。
クラシック自転車(緑色)の比重が多い拠点が多く見られます。
次は、合計乗車回数に基づいて大きい方から並べたときの上位ステーションにおける、メンバー(スカイブルー色)とカジュアル(緑色)利用者の利用回数を示しています。

非会員の利用率が高いステーションも見られます。

基本的な可視化まで実施しました。この後は項目間の関係性を確認し、主成分分析、クラスタリングと進めていきます。またこのデータは時系列データですので、時系列データとして扱い、推移確率を求め、マルコフ連鎖を適用しようと思います。