5-2. データ分析・ダッシュボード作成の実務

実際のビジネス現場や個人開発で収集するデータは、そのままでは分析に使えない「散らかった状態(ノイズ、欠損値、表記ゆれ)」であることがほとんどです。また、集計した結果を関係者やユーザーに分かりやすく共有するためには、インタラクティブなWebダッシュボードの構築が不可欠です。

本記事では、Pythonのデータ分析の要である pandas による強力な前処理・時系列処理と、数行のコードで動くWebアプリを作る Streamlit によるダッシュボード高速構築をハンズオン形式で解説します。

1. 散らかったデータのクレンジング・前処理テクニック

リアルなデータには、カンマが含まれた数値、前後の空白、異常値、日付のフォーマット違いなど多くの「ゴミ」が含まれています。pandas を使ってこれらを綺麗に整える実践的なコードを確認しましょう。

Python

import pandas as pd
import numpy as np

# わざと汚染されたサンプルデータを作成
raw_data = {
    "date": ["2026-10-01", "2026-10-02", "2026-10-03", "invalid_date"],
    "sales": ["1,200", "1,500", np.nan, "3,000"],
    "category": [" A ", "B", "A", " b "]
}
df = pd.DataFrame(raw_data)
print("=== 修正前の生データ ===")
print(df)

# --- クレンジング処理の実行 ---

# 1. 不正な日付データをNaT(欠損値)に変換し、欠損行を除外
df["date"] = pd.to_datetime(df["date"], errors="coerce")
df = df.dropna(subset=["date"])

# 2. カンマを削除し、数値型(float)に変換
df["sales"] = df["sales"].str.replace(",", "").astype(float)

# 3. 売上の欠損値を全体の平均値で補填(あるいは 0 で埋める場合は .fillna(0))
mean_sales = df["sales"].mean()
df["sales"] = df["sales"].fillna(mean_sales)

# 4. カテゴリの前後空白を削除し、大文字・小文字を統一(タイトルケース化)
df["category"] = df["category"].str.strip().str.capitalize()

print("\n=== クレンジング後の綺麗になったデータ ===")
print(df)

2. pandas を使ったタイムシリーズ(時系列データ)の処理と集計

売上推移やアクセスログなどの時系列データを扱う際、pandas の DatetimeIndex と Resample 機能を使うことで、日次データを月次や週次に一瞬で集計できます。

Python

# 90日間の売上時系列データを生成
np.random.seed(42)
date_range = pd.date_range(start="2026-01-01", periods=90, freq="D")
ts_df = pd.DataFrame({
    "date": date_range,
    "revenue": np.random.randint(10000, 50000, size=90)
})

# 1. 日付列をインデックスに設定
ts_df.set_index("date", inplace=True)

# 2. 月次(Monthly End: "ME")単位で合計売上を集計
monthly_revenue = ts_df.resample("ME")["revenue"].sum()
print("=== 月次集計結果 ===")
print(monthly_revenue)

# 3. 7日間の移動平均(Moving Average)を算出してトレンドを平滑化
ts_df["rolling_avg_7d"] = ts_df["revenue"].rolling(window=7).mean()

3. Streamlit を使ったデータ可視化Webダッシュボードの高速構築

HTMLやCSS、複雑なJavaScriptを書くことなく、Pythonコードを書くだけでインタラクティブなWebダッシュボードを立ち上げられるのが Streamlit の最大の魅力です。

ダッシュボードアプリの作成 (app.py)

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

Python

import streamlit as st
import pandas as pd
import numpy as np

# ページの設定
st.set_page_config(page_title="売上分析ダッシュボード", layout="wide")

st.title("📊 リアルタイム売上分析ダッシュボード")
st.markdown("PythonとStreamlitで構築したインタラクティブな分析ツールです。")

# 1. サンプルデータの読み込み(キャッシュ機能で高速化)
@st.cache_data
def load_data():
    dates = pd.date_range(start="2026-01-01", periods=100, freq="D")
    df = pd.DataFrame({
        "日付": dates,
        "地域": np.random.choice(["東京", "大阪", "福岡"], size=100),
        "売上額": np.random.randint(20000, 100000, size=100)
    })
    return df

df = load_data()

# 2. サイドバーにフィルター(ユーザーコントロール)を設置
st.sidebar.header("🔍 フィルター条件")
selected_region = st.sidebar.selectbox("地域を選択してください", options=["すべて"] + list(df["地域"].unique()))

# データの絞り込み
if selected_region != "すべて":
    filtered_df = df[df["地域"] == selected_region]
else:
    filtered_df = df

# 3. 主要な指標(KPIメトリック)の表示
total_sales = filtered_df["売上額"].sum()
avg_sales = int(filtered_df["売上額"].mean())

col1, col2 = st.columns(2)
col1.metric("総売上額", f"¥{total_sales:,}")
col2.metric("平均日次売上", f"¥{avg_sales:,}")

# 4. グラフ(チャート)の描画
st.subheader("📈 日次売上推移チャート")
chart_data = filtered_df.groupby("日付")["売上額"].sum()
st.line_chart(chart_data)

# 5. 生データの表示(データフレーム)
st.subheader("📋 抽出データ一覧")
st.dataframe(filtered_df, use_container_width=True)

アプリの起動方法

ターミナルを開き、保存したファイルがあるディレクトリで以下のコマンドを実行します。

Bash

streamlit run app.py

コマンドを実行すると、自動的にブラウザが立ち上がり、インタラクティブに動くダッシュボードを確認できます!

コメント

タイトルとURLをコピーしました