Excel業務自動化シリーズ第2回:基本的な自動分析に挑戦

前回の記事で、Excel自動化の第一歩として以下の作業を行いました:

  1. サンプルデータの作成方法
  2. 売上データの3分割ファイル生成
  3. クリーニング用の不完全データの作成
  4. 分析用の売上データファイルの準備

そして、以下の基本的な自動化スクリプトまで実装しました:

  • Excelファイルの結合処理
  • データのクリーニング機能
  • 月次レポートの自動作成

今回は、これらの土台の上に、より実用的な分析機能を追加していきます。

目次

必要な準備

分析機能を追加する前に、以下のものを用意しましょう:

  1. 前回作成したPythonスクリプト一式
  2. 生成されたExcelファイル
    • sales_data_original.xlsx(メインの売上データ)
    • messy_data.xlsx(クリーニング用データ)
    • excel_filesフォルダ内の分割ファイル
  3. 追加で必要なPythonパッケージ
pip install scipy

このパッケージの意味は後ほど説明しています。

フォルダ構成

作業フォルダ
├── excel_files/
│ ├── sales_data_1.xlsx
│ ├── sales_data_2.xlsx
│ └── sales_data_3.xlsx
├── sales_data_original.xlsx
└── messy_data.xlsx

新しいパッケージのインストール

前回までの自動化スクリプトでは、基本的なExcelファイルの操作を行ってきました。 今回は、より高度な分析を行うために、新たなツールを追加します。

pip install scipy

このコマンドで何が追加されるのでしょうか?

scipyは「サイパイ」と読み、Scientific Python(科学技術計算のためのPython)の略です。 以下のような機能を提供してくれます:

  1. 統計計算
    • 平均値や中央値といった基本的な計算だけでなく
    • データの異常値を検出したり
    • より複雑な統計分析を行うことができます
  2. データの分析
    • 売上の増減傾向を数値化
    • パターンの発見
    • 予測のための計算

簡単に言えば、Excelでは少し面倒な計算を、簡単に行えるようになります。

例えば:

  • 「先月と比べて、この売上の伸びは異常なのか?」
  • 「この商品の売上パターンは、季節に関係があるのか?」 といった分析が可能になります。

それでは、このツールを使って、具体的にどのような分析ができるのか、次のステップで見ていきましょう。

より賢い分析機能を追加しよう

前回までで、基本的なExcelファイルの結合や整理ができるようになりました。 そして、新しく統計分析用のツール(scipy)もインストールしました。

今回は、この基盤の上に「賢い分析機能」を少しずつ追加していきます。

まずは、売上データの中から重要な情報を自動的に見つけ出す機能を作ってみましょう。 以下のコードを見ていきます:

import pandas as pd
import numpy as np
from scipy import stats

def discover_insights(df):
    """
    売上データから重要なポイントを見つけ出す関数
    """
    insights = []
    
    # 1. 月次の売上集計
    monthly_sales = df.groupby('年月')['売上金額'].sum()
    
    # 2. 最も売上が良かった月を特定
    best_month = monthly_sales.idxmax()
    best_month_sales = monthly_sales.max()
    insights.append(
        f"売上が最も良かった月: {best_month}月 "
        f"(売上: {best_month_sales:,.0f}円)"
    )
    
    return insights

# メインの処理
if __name__ == "__main__":
    # サンプルデータの読み込み
    df = pd.read_excel("sales_data_original.xlsx")
    
    # 分析の実行
    found_insights = discover_insights(df)
    
    # 結果の表示
    print("\n===== 分析結果 =====")
    for insight in found_insights:
        print(f"・{insight}")

このコードをsmart_analysis.pyという名前で保存し、実行してみましょう。 すると、最も売上が良かった月とその金額が自動的に見つかります。

コードの説明

少し細かく見ていきましょう:

  1. groupby('年月')について
    • 売上データを「年月」でグループ化します
    • 例えば、2023年1月の売上を1つにまとめる作業です
  2. ['売上金額'].sum()について
    • グループ化したデータの売上金額を合計します
    • 月ごとの総売上が計算されます
  3. idxmax()max()について
    • idxmax(): 最も大きな値を持つ月を見つけます
    • max(): その月の売上金額を取得します

このコードを実行すると、以下のような結果が得られます:

===== 分析結果 =====
・売上が最も良かった月: 2023-07月 (売上: 12,345,678円)

いかがでしょうか?これが分析機能追加の第一歩です。 次回は、この基本的な分析にさらに機能を追加していきます。

補足:エラーが出た場合

よくあるエラーとその対処法:

  1. ModuleNotFoundError: No module named 'scipy'
    • scipyのインストールが必要です
    • pip install scipyを実行してください
  2. FileNotFoundError: [Errno 2] No such file or directory
    • Excelファイルが見つからない場合のエラーです
    • sales_data_original.xlsxがPythonスクリプトと同じフォルダにあるか確認してください。

実際に上のコードを間違えてエラーになりました。

e c:/excel/smart_analysis.py
Traceback (most recent call last):
File “c:\excel\smart_analysis.py”, line 30, in
found_insights = discover_insights(df)
File “c:\excel\smart_analysis.py”, line 12, in discover_insights
monthly_sales = df.groupby(‘年月’)[‘売上金額’].sum()
File “C:\Users\minok\AppData\Local\Programs\Python\Python310\lib\site-packages\pandas\core\frame.py”, line 8872, in groupby
return DataFrameGroupBy(
File “C:\Users\minok\AppData\Local\Programs\Python\Python310\lib\site-packages\pandas\core\groupby\groupby.py”, line 1273, in init
grouper, exclusions, obj = get_grouper(
File “C:\Users\minok\AppData\Local\Programs\Python\Python310\lib\site-packages\pandas\core\groupby\grouper.py”, line 1009, in get_grouper
raise KeyError(gpr)
KeyError: ‘年月’

Excel分析スクリプトのデバッグ:よくあるエラーとその解決方法

先ほど実行したスクリプトで「KeyError: ‘年月’」というエラーが発生しました。 これは、私が参照しようとしているカラム(列)が見つからないことを意味しています。

エラーの原因を確認

まずは、実際のデータがどうなっているか確認するコードを書いてみましょう:

import pandas as pd
import numpy as np
from scipy import stats

# データの読み込みと内容確認
df = pd.read_excel("sales_data_original.xlsx")

# データフレームの列名を確認
print("=== カラム名の一覧 ===")
print(df.columns.tolist())

# 最初の5行を表示
print("\n=== データの最初の5行 ===")
print(df.head())

このコードを実行すると、実際のデータ構造が確認できます。 カラム名が「年月」ではなく、別の名前になっている可能性があります。

エラーの解決方法

  1. データの確認結果に基づいて、以下のいずれかの対応を行います。こちらが完成版になります。
import pandas as pd
import numpy as np
from scipy import stats

def discover_insights(df):
    """
    売上データから重要なポイントを見つけ出す関数
    """
    insights = []
    
    # 月次の売上集計
    # 英語のカラム名に対応
    monthly_sales = df.groupby('Year-Month')['Sales Amount'].sum()
    
    # 最も売上が良かった月を特定
    best_month = monthly_sales.idxmax()
    best_month_sales = monthly_sales.max()
    insights.append(
        f"売上が最も良かった月: {best_month}月 "
        f"(売上: {best_month_sales:,.0f}円)"
    )
    
    return insights

# メインの処理
if __name__ == "__main__":
    # サンプルデータの読み込み
    print("データを読み込んでいます...")
    df = pd.read_excel("sales_data_original.xlsx")
    
    # カラム名の確認
    print("\n利用可能なカラム:")
    print(df.columns.tolist())
    
    # 分析の実行
    print("\n分析を開始します...")
    found_insights = discover_insights(df)
    
    # 結果の表示
    print("\n===== 分析結果 =====")
    for insight in found_insights:
        print(f"・{insight}")

このように、まずデータの構造を確認してから処理を行うようにしました。

エラーが出た場合は、以下の点を確認してください:

  1. Excelファイルのカラム名が正しいか
  2. データが正しく読み込めているか
  3. 必要なカラムが存在するか

これで「KeyError: ‘年月’」のエラーは解決できるはずです。

これで基本的な分析機能の土台ができました。次回は、この分析をより詳しくしていきます。

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次