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%のステーションを示しています。各ステーションでの「開始」(スカイブルー色)と「終了」(緑色)のライド数が積み上げられています。
合計乗車回数に基づいて大きい方から並べたときの上位ステーションにおける、電動自転車(スカイブルー色)とクラシック自転車(緑色)の利用回数を示しています。
クラシック自転車(緑色)の比重が多い拠点が多く見られます。
次は、合計乗車回数に基づいて大きい方から並べたときの上位ステーションにおける、メンバー(スカイブルー色)とカジュアル(緑色)利用者の利用回数を示しています。

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

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