Python データ分析:CSV読み込み~予測モデル構築アプリの作り方【入門】

Pythonでデータ分析アプリを作ろう!CSV読み込み、集計、可視化、予測まで【初心者向け】

こんにちは!今回は、Pythonを使ってCSVファイルを読み込み、簡単なデータ集計、グラフによる可視化、そして基本的な予測モデルの構築までを行う簡単なアプリケーションの作り方を解説します。データ分析の基礎を学びたい方におすすめです。

アプリケーションの概要

このアプリケーションでは、以下の機能を実現します。

  1. CSVファイルの読み込み: ユーザーが指定したCSVファイルを読み込み、データを扱える形式にします。
  2. 簡単なデータ集計: 読み込んだデータに対して、平均値、最大値、最小値などを計算します。
  3. 簡単なデータの可視化: データの分布や関係性を把握するために、グラフ(散布図や棒グラフなど)を表示します。
  4. 簡単な予測モデル: 読み込んだデータに基づいて、簡単な線形回帰モデルを構築し、予測を行います。

開発環境

  • Python 3 がインストールされていること
  • 以下のライブラリがインストールされていること (pipでインストールできます)
  • pandas: データ操作と分析のための強力なライブラリ
  • matplotlib: グラフ描画のためのライブラリ
  • seaborn: より高度なグラフ描画をサポートするライブラリ (オプション)
  • scikit-learn: 機械学習アルゴリズムを提供するライブラリ
  • streamlit: 簡単なWebアプリケーションを構築するためのライブラリ
pip install pandas matplotlib seaborn scikit-learn streamlit

プログラムの作成手順

ここでは、streamlitを使って簡単なWebアプリケーションとして実装する手順を紹介します。

  1. 必要なライブラリをインポート
import streamlit as st
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
  1. CSVファイルのアップロード

streamlitの機能を使って、ユーザーにCSVファイルをアップロードしてもらうUIを作成します。

st.title("簡単データ分析アプリ")

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

if uploaded_file is not None:
    df = pd.read_csv(uploaded_file)
    st.subheader("アップロードされたデータ")
    st.dataframe(df.head())
  1. データ集計

アップロードされたデータに対して、簡単な統計量を計算して表示します。

if uploaded_file is not None:
    st.subheader("データ集計")
    st.write(df.describe())
  1. データの可視化

    ユーザーに可視化したい列を選択してもらい、グラフを表示します。ここでは散布図と棒グラフの例を示します。

if uploaded_file is not None:
    st.subheader("データの可視化")

    # 散布図
    st.subheader("散布図")
    x_column = st.selectbox("X軸の列を選択してください", df.columns)
    y_column = st.selectbox("Y軸の列を選択してください", df.columns)
    if x_column and y_column and x_column != y_column:
        plt.figure(figsize=(8, 6))
        sns.scatterplot(x=x_column, y=y_column, data=df)
        st.pyplot(plt)

    # 棒グラフ
    st.subheader("棒グラフ")
    bar_column = st.selectbox("棒グラフで表示する列を選択してください", df.columns)
    if bar_column:
        value_counts = df[bar_column].value_counts()
        plt.figure(figsize=(8, 6))
        sns.barplot(x=value_counts.index, y=value_counts.values)
        plt.xlabel(bar_column)
        plt.ylabel("頻度")
        st.pyplot(plt)
  1. 簡単な予測モデル (線形回帰)

数値データを持つ列を選択してもらい、簡単な線形回帰モデルを構築して予測を行います。

if uploaded_file is not None:
    st.subheader("簡単な予測モデル (線形回帰)")

    numerical_cols = df.select_dtypes(include=['number']).columns.tolist()
    if len(numerical_cols) >= 2:
        predict_column = st.selectbox("予測したい列を選択してください", numerical_cols)
        feature_columns = st.multiselect("特徴量として使用する列を選択してください", numerical_cols, default=[col for col in numerical_cols if col != predict_column])

        if predict_column and feature_columns:
            X = df[feature_columns]
            y = df[predict_column]
            X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

            model = LinearRegression()
            model.fit(X_train, y_train)
            y_pred = model.predict(X_test)

            st.subheader("予測結果")
            st.write(f"平均二乗誤差: {mean_squared_error(y_test, y_pred):.2f}")

            # 予測値と実際の値をプロット
            plt.figure(figsize=(8, 6))
            plt.scatter(y_test, y_pred)
            plt.xlabel("実際の値")
            plt.ylabel("予測値")
            st.pyplot(plt)
    else:
        st.warning("数値型の列が2つ以上必要です。")
  1. アプリケーションの実行

作成したPythonスクリプトを保存し(例: data_app.py)、ターミナルで以下のコマンドを実行します。

streamlit run data_app.py

すると、Webブラウザが自動的に開き、アプリケーションが表示されます。

発展させてみよう

  • より高度なデータ集計: グループ化やピボットテーブルの表示機能を追加する。
  • 多様なグラフの表示: 折れ線グラフ、ヒストグラム、箱ひげ図などを追加する。
  • 他の予測モデルの導入: ロジスティック回帰や決定木など、他の機械学習モデルを試す。
  • データのフィルタリングやソート機能: ユーザーがデータを操作できる機能を追加する。
  • より洗練されたUIの構築: streamlitのレイアウト機能などを活用して、より使いやすいインターフェースにする。

まとめ

このブログでは、Pythonpandas, matplotlib, seaborn, scikit-learn, そしてstreamlitといった強力なライブラリを使って、CSVファイルの読み込みから簡単なデータ分析、可視化、そして予測までを行うWebアプリケーションの基本的な作り方を解説しました。

やる気があれば天気の予測データと実績データからその日の気温を予測するようなものを作りたいと思っております