0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ChatGPTと作る!Streamlitで学ぶLASSO回帰アプリ入門

Posted at

user:

VSCodeを使って次のような動作をするStreamlitアプリを作る初心者用ガイドを書いてください。

  1. アプリを立ち上げると、ユーザにファイル入力を求める。
  2. 入力されたファイルが csv ファイルかエクセルファイルかを自動判定する。
  3. エクセルファイルの場合、どのシートの解析をすればよいかをユーザに尋ねる。
  4. 入力されたファイルの中身を抜粋してユーザに見せて、データ範囲をユーザに尋ねる。
  5. 説明変数の範囲、目的変数の範囲をユーザに尋ねる。
  6. LASSO回帰を実行し、得られた回帰係数のうち非ゼロのものを可視化する。

assistant:

以下は、VSCodeを使ってStreamlitでLASSO回帰アプリを作る初心者向けガイドです。Python未経験者でも進められるよう、ステップバイステップで説明しています。


🎯 目的

このガイドでは、以下の機能をもつStreamlitアプリを作ります:

  1. ファイルアップロード(CSVまたはExcel)
  2. ファイルタイプ自動判定
  3. Excelシート選択(必要な場合)
  4. データの一部表示&範囲指定
  5. 説明変数・目的変数の選択
  6. LASSO回帰の実行と結果の可視化

🔧 事前準備

1. PythonとVSCodeのインストール

  • Python公式サイトからPythonをインストール
  • VSCodeをインストール
  • VSCodeに「Python」「Jupyter」「Pylance」拡張機能をインストール

2. 仮想環境を作る(推奨)

python -m venv .venv
source .venv/bin/activate  # Windowsなら .venv\Scripts\activate

3. 必要なライブラリをインストール

pip install streamlit pandas openpyxl scikit-learn matplotlib

🧱 アプリの構成(app.py

以下のコードを app.py という名前で保存します。

import streamlit as st
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import Lasso
from sklearn.preprocessing import StandardScaler

st.title("📊 LASSO回帰アプリ")

# 1. ファイルアップロード
uploaded_file = st.file_uploader("CSVまたはExcelファイルをアップロードしてください", type=["csv", "xlsx"])

if uploaded_file is not None:
    file_name = uploaded_file.name.lower()
    
    # 2. ファイルタイプの判定と読み込み
    if file_name.endswith(".csv"):
        df = pd.read_csv(uploaded_file)
    elif file_name.endswith(".xlsx"):
        excel_file = pd.ExcelFile(uploaded_file)
        sheet = st.selectbox("シートを選択してください", excel_file.sheet_names)
        df = excel_file.parse(sheet)
    else:
        st.error("対応しているのはCSVまたはExcelファイルです。")
        st.stop()

    st.write("アップロードされたデータのプレビュー:")
    st.dataframe(df.head())

    # 3. 列の範囲選択
    all_columns = df.columns.tolist()
    x_columns = st.multiselect("説明変数(X)の列を選んでください", all_columns)
    y_column = st.selectbox("目的変数(Y)の列を選んでください", all_columns)

    if x_columns and y_column:
        try:
            X = df[x_columns].dropna()
            y = df[y_column].loc[X.index]

            # 標準化
            scaler = StandardScaler()
            X_scaled = scaler.fit_transform(X)

            # 4. LASSO回帰の実行
            lasso = Lasso(alpha=0.1)
            lasso.fit(X_scaled, y)

            # 5. 可視化
            coef = pd.Series(lasso.coef_, index=x_columns)
            nonzero_coef = coef[coef != 0]

            st.subheader("📌 LASSO回帰の結果(非ゼロ係数)")
            st.bar_chart(nonzero_coef)

        except Exception as e:
            st.error(f"エラーが発生しました: {e}")

🚀 アプリの起動

VSCodeのターミナルで以下を実行:

streamlit run app.py

ブラウザが開いてアプリが動作します。


✅ 補足:学習のポイント

  • st.file_uploader:ユーザーからファイルを受け取る
  • pandas:CSVやExcelを読み込み&操作
  • sklearn.linear_model.Lasso:LASSO回帰の実行
  • matplotlib/streamlit:結果の可視化

💡 チップス

  • alpha の値を変えるとLASSOの厳しさが変わります(0.1~1.0あたりで試してみてください)
  • 入力データがカテゴリカルな場合は、pd.get_dummies() で前処理が必要です

このアプリをベースに、機能追加(データ保存、精度の表示、別モデル対応など)も可能です!

必要であればブログ記事用の文体にもアレンジしますので、お気軽にどうぞ。

user:

ありがとうございます。アプリは立ち上がりましたが、ずっと「Running...」のままで、ユーザインタフェイスが出てきません。

assistant:

いいですね、アプリが立ち上がったとのことですが、「Running...」のままでUIが出ないのはよくあるトラブルです。以下のチェックリストで原因を絞り込んでいきましょう。


✅ よくある原因と対処法

1. Streamlitの初期化で止まっている

  • これはよくあるケースで、「ファイルの読み込み処理が長い」「例外処理がうまくできていない」などで止まっていることがあります。

🔍 試してみてください:

  • app.py の最初の方に st.write("ファイルアップロードを待機中") のようなログを入れて、どこで止まっているか特定しましょう。

2. ファイルアップロード待ちの状態でUIが出ない

Streamlitはファイルアップローダが何も入力されていない状態だと、他のUIが何も描画されないことがあります。

✔ 解決策:

if uploaded_file is None:
    st.info("CSV または Excel ファイルをアップロードしてください。")
    st.stop()

このように早めに st.stop() を使うと、それ以降のコードを読み込まなくなるので、安全にUIが描画されます。


3. ファイルサイズや形式が不正

  • たとえば、拡張子が .xlsx でも中身が壊れていたり、巨大なファイルだったりすると読み込みに失敗してUIが止まることがあります。

✔ 試すこと:

  • 軽量なCSVファイルをテスト用にアップロードしてみてください。
  • st.write(uploaded_file) などでファイル情報を表示し、正しく認識されているか確認。

4. コードに例外があるのに表示されていない

Streamlitはエラーを検知して止まることがありますが、そのまま無表示で「Running...」になることも。

✔ 対処法:

コードを以下のようにして、ログを確認しましょう。

try:
    # 処理本体
    ...
except Exception as e:
    st.error(f"エラーが発生しました: {e}")

5. Streamlitのバージョン問題

古いバージョンだと file_uploaderExcelFile 処理でうまく動作しないことがあります。

✔ 対処法:

pip install --upgrade streamlit pandas openpyxl

🧪 簡単なテスト用ファイル

以下のような小さなCSVを使って動作確認すると良いです:

x1,x2,x3,y
1,2,3,10
2,3,4,12
3,4,5,14
4,5,6,16

📞 必要なら

もしまだ解決しなければ、手元のコード全文を貼っていただければ一緒に確認します!

Streamlitはちょっとしたミスで無反応になることも多いですが、コードとロジックを追えばすぐ復活しますよ。

user:

app.py の中身は、ChatGPT先生にご提案いただいたこのコードのままです。最初の「"CSVまたはExcelファイルをアップロードしてください"」すら出てきません。

import streamlit as st
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import Lasso
from sklearn.preprocessing import StandardScaler

st.title("📊 LASSO回帰アプリ")

# 1. ファイルアップロード
uploaded_file = st.file_uploader("CSVまたはExcelファイルをアップロードしてください", type=["csv", "xlsx"])

if uploaded_file is not None:
    file_name = uploaded_file.name.lower()
    
    # 2. ファイルタイプの判定と読み込み
    if file_name.endswith(".csv"):
        df = pd.read_csv(uploaded_file)
    elif file_name.endswith(".xlsx"):
        excel_file = pd.ExcelFile(uploaded_file)
        sheet = st.selectbox("シートを選択してください", excel_file.sheet_names)
        df = excel_file.parse(sheet)
    else:
        st.error("対応しているのはCSVまたはExcelファイルです。")
        st.stop()

    st.write("アップロードされたデータのプレビュー:")
    st.dataframe(df.head())

    # 3. 列の範囲選択
    all_columns = df.columns.tolist()
    x_columns = st.multiselect("説明変数(X)の列を選んでください", all_columns)
    y_column = st.selectbox("目的変数(Y)の列を選んでください", all_columns)

    if x_columns and y_column:
        try:
            X = df[x_columns].dropna()
            y = df[y_column].loc[X.index]

            # 標準化
            scaler = StandardScaler()
            X_scaled = scaler.fit_transform(X)

            # 4. LASSO回帰の実行
            lasso = Lasso(alpha=0.1)
            lasso.fit(X_scaled, y)

            # 5. 可視化
            coef = pd.Series(lasso.coef_, index=x_columns)
            nonzero_coef = coef[coef != 0]

            st.subheader("📌 LASSO回帰の結果(非ゼロ係数)")
            st.bar_chart(nonzero_coef)

        except Exception as e:
            st.error(f"エラーが発生しました: {e}")

assistant:

ありがとうございます、詳細まで教えていただけたので、原因の特定がしやすくなりました。

✨症状:

  • 「ファイルアップロードしてください」というUIすら表示されない。
  • streamlit run app.py で立ち上げても ブラウザ上に何も表示されず、「Running...」のまま

✅ 原因の可能性(かなり高い)

matplotlib.pyplot をインポートした状態で plt を使わずに放置していると、環境によって Streamlit が描画で詰まるケースがあります。

つまり:import matplotlib.pyplot as plt不要で未使用 なのに、あるだけで止まる可能性があります。


🔧 修正方法:未使用の matplotlib を消す

# この1行を削除してみてください
# import matplotlib.pyplot as plt

💡 理由

matplotlib はバックエンド(描画エンジン)と競合する場合があり、特に GUI がない環境(WSLや一部のLinux)や、VSCode + Streamlit の組み合わせだと「描画の初期化」で止まることがあります。

Streamlit のバーンチャートは st.bar_chart() だけで済んでいるので、matplotlib 自体は不要です。


✅ 修正版コード冒頭だけ抜粋(変更点)

import streamlit as st
import pandas as pd
# import matplotlib.pyplot as plt ← 削除!
from sklearn.linear_model import Lasso
from sklearn.preprocessing import StandardScaler

🧪 それでも出ない場合の追加チェック

  1. streamlit run app.py したときに ブラウザが自動で開いていない場合は、以下のURLにアクセスしていますか?

    http://localhost:8501
    
  2. Streamlitのログにエラーが出ていないかをターミナルで確認


🎉 まとめ

  • matplotlib.pyplot を削除すると復活する可能性が高いです!
  • 出てきたら「ChatGPT先生に助けてもらって直った!」ってぜひ書いてくださいね😄

もしうまく動いたら、お知らせいただけたら嬉しいです!それでもダメなら次の手を考えましょう!

user:

おお、できるようになりました。ありがとうございます。これ、説明変数を複数選べるし、選んだその瞬間に計算してくれるんですね。

assistant:

やったー!動いたとのことで安心しました!🎉
「ChatGPT先生に助けてもらって直った」第一号ですね、嬉しいです😄

そうなんです、このアプリのいいところは:


✅ Streamlitのいいところが詰まってます!

  • 説明変数を複数選択できる(multiselect
     → データサイエンスや機械学習でとても便利!

  • 選んだその瞬間に計算が走る(リアクティブUI)
     → streamlit の仕組み上、値が変わるたびにコード全体が再実行されるので、インタラクティブ性が高いです!

  • LASSOの結果がバーンと可視化される
     → 非ゼロ係数だけが表示されるから、重要な特徴量がすぐ見える!


💡 今後のアイデア(ご希望あれば!)

  • α(LASSOの強さ)をスライダーで選べるようにする
  • 回帰モデルを選択式(LASSO・Ridge・線形回帰)にする
  • 係数をCSVでダウンロードできるようにする
  • 予測や評価指標(R²、MSE)を表示する

VSCode×Streamlitの初心者向け教材として、今回の内容すごく良い流れだったので、ブログにするならその構成も一緒に考えますよ!

今の流れを「ChatGPTに助けてもらってStreamlitアプリ完成!」という感じで記事にするのも、読者にウケそうです👍

user:

ありがとうございます。上記コードをベースにして、次の機能を追加したコードに修正してください。

・α(LASSOの強さ)をスライダーで選べるようにする
・係数をCSVでダウンロードできるようにする
・予測や評価指標(R²、MSE)を表示する

assistant:

こちらが、あなたのアプリにご希望の3つの機能を追加した最新版の app.py です👇


✅ 追加された機能一覧

  • ✅ α(LASSOの強さ)をスライダーで選べる
  • ✅ 非ゼロ係数をCSVでダウンロードできる
  • ✅ R²スコア、平均二乗誤差(MSE)を表示

🆕 修正済みの app.py

import streamlit as st
import pandas as pd
from sklearn.linear_model import Lasso
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error, r2_score
import io

st.title("📊 LASSO回帰アプリ")

uploaded_file = st.file_uploader("CSVまたはExcelファイルをアップロードしてください", type=["csv", "xlsx"])

if uploaded_file is None:
    st.info("CSV または Excel ファイルをアップロードしてください。")
    st.stop()

file_name = uploaded_file.name.lower()

# CSVまたはExcelファイルの読み込み
if file_name.endswith(".csv"):
    df = pd.read_csv(uploaded_file)
elif file_name.endswith(".xlsx"):
    excel_file = pd.ExcelFile(uploaded_file)
    sheet = st.selectbox("シートを選択してください", excel_file.sheet_names)
    df = excel_file.parse(sheet)
else:
    st.error("対応しているのはCSVまたはExcelファイルです。")
    st.stop()

st.write("アップロードされたデータのプレビュー:")
st.dataframe(df.head())

all_columns = df.columns.tolist()
x_columns = st.multiselect("説明変数(X)の列を選んでください", all_columns)
y_column = st.selectbox("目的変数(Y)の列を選んでください", all_columns)

if x_columns and y_column:
    try:
        # データ抽出
        X = df[x_columns].dropna()
        y = df[y_column].loc[X.index]

        # 標準化
        scaler = StandardScaler()
        X_scaled = scaler.fit_transform(X)

        # αの選択(ログスケールっぽく)
        alpha = st.slider("LASSOの強さ(α)", min_value=0.001, max_value=1.0, value=0.1, step=0.01)

        # LASSO回帰
        lasso = Lasso(alpha=alpha)
        lasso.fit(X_scaled, y)
        y_pred = lasso.predict(X_scaled)

        # 結果の可視化
        coef = pd.Series(lasso.coef_, index=x_columns)
        nonzero_coef = coef[coef != 0]

        st.subheader("📌 LASSO回帰の結果(非ゼロ係数)")
        st.bar_chart(nonzero_coef)

        # 評価指標の表示
        r2 = r2_score(y, y_pred)
        mse = mean_squared_error(y, y_pred)
        st.markdown(f"**R²スコア:** {r2:.3f}")
        st.markdown(f"**平均二乗誤差 (MSE):** {mse:.3f}")

        # ダウンロードボタン
        csv_buffer = io.StringIO()
        nonzero_coef.to_csv(csv_buffer)
        st.download_button(
            label="📥 非ゼロ係数をCSVでダウンロード",
            data=csv_buffer.getvalue(),
            file_name="lasso_coefficients.csv",
            mime="text/csv"
        )

    except Exception as e:
        st.error(f"エラーが発生しました: {e}")

💡 おまけTips(任意)

もし今後やりたい場合:

  • alphaログスケールのスライダーにしたい場合は、np.logspace を使うのもアリです。
  • モデル比較も追加したいなら、st.selectbox("回帰モデルの選択", ["LASSO", "Ridge", "Linear"]) で分岐可能です。

動作確認ができたら、また感想聞かせてくださいね!記事にするなら、そちら用の文章にも調整できます✍✨

user:

ありがとうございます。csvを入力にする場合は分かりました。エクセルファイルを入力したいのですが、いいファイルはありますか?

assistant:

もちろんです!テストにちょうどいいシンプルなExcelファイルを自作する方法をご紹介します📂
以下の内容をExcelにコピペして .xlsx として保存すれば、アプリで読み込めるようになります。


✅ 例:テスト用Excelファイルの内容

x1 x2 x3 y
1 2 3 10
2 3 4 12
3 4 5 14
4 5 6 16
5 6 7 18

🔧 作り方(手動)

  1. Excelを開く
  2. 上記の表をコピペする
  3. ファイル名:sample_data.xlsx として保存
  4. アプリでアップロードすればOK!

🧙‍♂️ 自動で作りたい派の人向け:Pythonで生成(おまけ)

import pandas as pd

df = pd.DataFrame({
    'x1': [1, 2, 3, 4, 5],
    'x2': [2, 3, 4, 5, 6],
    'x3': [3, 4, 5, 6, 7],
    'y':  [10, 12, 14, 16, 18]
})

df.to_excel("sample_data.xlsx", index=False)

これを一度実行すれば、同じ内容の sample_data.xlsx ができあがります。


🧪 他のアイデア

複数シートを含むExcelをテストしたい場合は、こういう構成にするとさらに実践的:

  • Sheet1:訓練データ
  • Sheet2:別のパターン(列順変えたり欠損値含めたり)

必要でしたら、複数シートのサンプルファイルもすぐ作ってお渡しできますよ!どうします?

user:

はい、複数シートのサンプルファイルもPythonで自動で作れるようお願いします。

assistant:

了解です!こちらが、複数シートを含むExcelファイルをPythonで自動生成するスクリプトです💡
StreamlitアプリでのExcelシート選択や読み込みのテストにぴったりですよ!


✅ 複数シート付き sample_data.xlsx を作成するコード

import pandas as pd

# シート1: 通常のデータ
sheet1 = pd.DataFrame({
    'x1': [1, 2, 3, 4, 5],
    'x2': [2, 3, 4, 5, 6],
    'x3': [3, 4, 5, 6, 7],
    'y':  [10, 12, 14, 16, 18]
})

# シート2: 欠損値を含むデータ
sheet2 = pd.DataFrame({
    'x1': [1, None, 3, 4, 5],
    'x2': [2, 3, None, 5, 6],
    'x3': [3, 4, 5, 6, None],
    'y':  [10, 12, 14, None, 18]
})

# シート3: 列の順序が異なるデータ
sheet3 = pd.DataFrame({
    'y':  [10, 12, 14, 16, 18],
    'x3': [3, 4, 5, 6, 7],
    'x2': [2, 3, 4, 5, 6],
    'x1': [1, 2, 3, 4, 5]
})

# Excelファイルとして保存(複数シート付き)
with pd.ExcelWriter("sample_data.xlsx") as writer:
    sheet1.to_excel(writer, sheet_name='Clean Data', index=False)
    sheet2.to_excel(writer, sheet_name='Missing Values', index=False)
    sheet3.to_excel(writer, sheet_name='Shuffled Columns', index=False)

📝 出力されるファイル:

  • ファイル名:sample_data.xlsx
  • シート一覧:
    • Clean Data(正しいデータ)
    • Missing Values(欠損あり)
    • Shuffled Columns(列順がバラバラ)

このファイルを使えば、StreamlitアプリのExcel読み込みとシート選択機能がちゃんと動作するかどうか、実践的に確認できますよ👍

試してみて、うまくいったら教えてくださいね!他にもテストしたいパターンがあればどんどん出してください🙌

user:

ありがとうございます!ここまでの内容をブログに書こうと思います。タイトル案をいくつか提案してください。

assistant:

うれしいです!ここまでの開発ストーリーは、学びやすくて再現性も高いので、ブログ記事にピッタリです✨
では、以下のようなタイトル案をいくつかご提案しますね:


🔷 Streamlit × LASSO 回帰 × ChatGPT スタイル

  1. ChatGPTと作る!Streamlitで学ぶLASSO回帰アプリ入門
  2. VSCodeとStreamlitでLASSO回帰アプリをゼロから構築してみた
  3. ChatGPTに助けてもらってStreamlitアプリ完成まで!初心者でもできた回帰分析入門
  4. CSVもExcelもOK!StreamlitでインタラクティブなLASSO回帰ツールを作ってみた
  5. Streamlitでデータ分析アプリを爆速開発!ChatGPTと一緒にLASSO回帰に挑戦

🟡 教育・初心者向け視点を強めたもの

  1. Python初心者でもできた!Streamlitで作る回帰分析アプリ開発レポート
  2. ノー理論OK!ChatGPTと一緒にLASSO回帰を動かして理解するアプリ開発体験記
  3. エクセルも読み込める!Streamlitで作る簡単・実践的なLASSO回帰アプリ

🧪 技術や工夫にフォーカスしたもの

  1. αを調整・評価指標も表示!Streamlitで本格的なLASSO回帰アプリを開発する方法
  2. ファイルアップロードから予測・可視化まで!Streamlit×LASSO回帰アプリの全工程

どの方向性(初心者向け?技術っぽく?ChatGPTとの協働強調?)を強めたいかによって、少し言い回しも変えられます。
「これをベースにちょっと変えたい」などあれば、遠慮なくどうぞ〜!

気になるタイトルや軸があれば、そこから本文構成も一緒に考えられますよ📘✍

user:

「ChatGPTと作る!Streamlitで学ぶLASSO回帰アプリ入門」にしようと思います。今回のまとめを書いてくれますか?

assistant:

最高のタイトルですね!📣✨
ChatGPTと作る!Streamlitで学ぶLASSO回帰アプリ入門」にぴったりなまとめを、読者に優しく、でも内容はしっかり伝わるように仕上げました👇


📝 まとめ:ChatGPTと作る!Streamlitで学ぶLASSO回帰アプリ入門

今回は、Python初心者でもVSCodeとStreamlitを使って、LASSO回帰分析アプリをゼロから構築する手順を紹介しました。


✅ 開発したアプリの主な特徴

  • ファイルアップロード機能付き
     → CSVだけでなくExcelファイルにも対応。シート選択も可能!

  • インタラクティブな列選択
     → 説明変数・目的変数をUIで自由に選べる

  • LASSO回帰(αの調整可能)
     → αのスライダーでモデルの強さを調整でき、変数選択の効果も実感できる

  • 非ゼロ係数の可視化&ダウンロード
     → モデルに効いている変数だけを棒グラフで表示し、CSVとして保存もOK

  • 予測評価(R², MSE)も表示
     → モデルの当てはまり具合を一目で確認可能


🤖 ChatGPTと一緒に進めたことで得られたこと

  • 詰まったポイント(UIが出ない、データの扱い方など)も即座に解決できた
  • 書きながら理解が深まる「伴走型開発体験」ができた
  • テスト用データも自動生成し、再現性のある環境で学べた

🎯 こんな人におすすめの内容でした

  • Streamlitでアプリを作ってみたい人
  • LASSOなど機械学習の基本をアプリとして体験したい人
  • Excel派だけどPythonに挑戦したい人
  • ChatGPTを相棒に開発してみたい人

「Streamlitっておもしろい!」「LASSOってこういうふうに使えるんだ!」と思ってもらえたら嬉しいです。
次は、他のモデルへの応用や、もっとリッチなデータ可視化にも挑戦していきたいですね。

💡 本記事で紹介したコードは、そのまま教材としても活用できます!


このまとめ、もし文体や雰囲気を変えたい場合もすぐ調整できますよ✍
「導入や本文にもまとめとリンクさせたい」なんて相談も大歓迎です!

user:

ありがとうございます。今日はこのくらいで満足です。また今度よろしくお願いします!

assistant:

こちらこそ、素敵な開発とブログ企画にご一緒できて楽しかったです!😊✨
「また作りたくなった」「ブログの続きを書きたい」「エラーが出ちゃった」など、どんなことでも気軽に声かけてくださいね。

お疲れさまでした!またお会いできるのを楽しみにしてます🙌🍵

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?