なぜ今、Pythonでデータ分析なのか:データ分析 Python完全ガイド
Pythonによるデータ分析入門:実務で使える基本技術とベストプラクティス
企業の意思決定において、データに基づく判断の重要性が増しています。2024年の調査によると、データドリブンな意思決定を行う企業は、そうでない企業と比較して売上成長率が平均23%高いという結果が出ています。しかし、多くの企業担当者が「どこから始めればよいか分からない」「専門的すぎて理解できない」という課題を抱えています。 Pythonは、プログラミング初心者でも習得しやすく、かつ高度な分析まで対応できる言語として、データ分析の標準ツールとなりました。Stack Overflow Developer Survey 2024では、データサイエンティストの87%がPythonを主要言語として使用していることが明らかになっています。 本記事では、実際の売上データを例に、Pythonを使った実践的なデータ分析手法を解説します。理論的な説明は最小限に留め、すぐに業務で活用できる具体的なコード例と実行結果を中心に構成しています。
Pythonデータ分析の基本ライブラリと環境構築
必須ライブラリの役割分担
データ分析を効率的に進めるためには、適切なライブラリの選択が重要です。以下の5つのライブラリが、実務の90%以上のタスクをカバーします。
ライブラリ | 主な用途 | 実務での使用頻度 |
---|---|---|
pandas | データ加工・集計 | 毎日使用 |
NumPy | 数値計算 | 週3-4回 |
Matplotlib | 基本的な可視化 | 週2-3回 |
seaborn | 統計的可視化 | 週1-2回 |
scikit-learn | 機械学習 | プロジェクト次第 |
実践的な環境構築手順
Anacondaを使用した環境構築が最も簡単で、初心者にも扱いやすい方法です。以下のコマンドで必要な環境を一括で準備できます。
# 仮想環境の作成
conda create -n data_analysis python=3.11
conda activate data_analysis
# 必須ライブラリのインストール
conda install pandas numpy matplotlib seaborn jupyter scikit-learn openpyxl
Jupyter Notebookを起動して、以下のコードで環境が正しく構築されたか確認します。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
print(f"pandas version: {pd.__version__}")
print(f"numpy version: {np.__version__}")
実データを使った分析の具体的ステップ
ECサイトの売上データ分析例
ここでは、架空のECサイトの2024年度売上データを分析する実例を通じて、データ分析の基本的な流れを学びます。
import pandas as pd
import numpy as np
from datetime import datetime, timedelta
# サンプルデータの生成
np.random.seed(42)
dates = pd.date_range(start='2024-01-01', end='2024-12-31', freq='D')
categories = ['電子機器', '書籍', '衣類', '食品', '家具']
regions = ['関東', '関西', '中部', '九州', '北海道']
# 365日分の売上データを生成
data = []
for date in dates:
for _ in range(np.random.randint(50, 200)):
data.append({
'日付': date,
'カテゴリ': np.random.choice(categories),
'地域': np.random.choice(regions),
'売上金額': np.random.randint(1000, 50000),
'数量': np.random.randint(1, 10)
})
df = pd.DataFrame(data)
データの基本統計量と品質チェック
データ分析の第一歩は、データの全体像を把握することです。以下のコードで基本的な統計情報を確認します。
# データの基本情報
print(f"データ件数: {len(df)}")
print(f"期間: {df['日付'].min()} から {df['日付'].max()}")
print("\n--- カラムごとの情報 ---")
print(df.info())
# 基本統計量
print("\n--- 数値データの統計量 ---")
print(df[['売上金額', '数量']].describe())
# 欠損値のチェック
print("\n--- 欠損値の確認 ---")
print(df.isnull().sum())
時系列分析による売上トレンドの把握
月別の売上推移を分析し、季節性やトレンドを把握します。
# 月別集計
df['年月'] = df['日付'].dt.to_period('M')
monthly_sales = df.groupby('年月')['売上金額'].agg(['sum', 'mean', 'count'])
monthly_sales.columns = ['合計売上', '平均売上', '取引件数']
# 可視化
fig, axes = plt.subplots(2, 1, figsize=(12, 8))
# 売上推移
axes[0].plot(monthly_sales.index.astype(str), monthly_sales['合計売上']/1000000, marker='o')
axes[0].set_title('月別売上推移(百万円)')
axes[0].set_ylabel('売上高(百万円)')
axes[0].grid(True, alpha=0.3)
# 取引件数推移
axes[1].bar(monthly_sales.index.astype(str), monthly_sales['取引件数'], color='skyblue')
axes[1].set_title('月別取引件数')
axes[1].set_ylabel('取引件数')
axes[1].set_xlabel('年月')
plt.tight_layout()
plt.show()
カテゴリ別・地域別の詳細分析
ビジネスの意思決定に必要な、セグメント別の分析を行います。
# カテゴリ別売上分析
category_analysis = df.groupby('カテゴリ').agg({
'売上金額': ['sum', 'mean', 'std'],
'数量': 'sum'
}).round(0)
category_analysis.columns = ['売上合計', '平均売上', '売上標準偏差', '販売数量']
category_analysis['売上シェア(%)'] = (category_analysis['売上合計'] / category_analysis['売上合計'].sum() * 100).round(1)
print("=== カテゴリ別売上分析 ===")
print(category_analysis.sort_values('売上合計', ascending=False))
# 地域別×カテゴリ別のクロス集計
pivot_table = pd.pivot_table(
df,
values='売上金額',
index='地域',
columns='カテゴリ',
aggfunc='sum'
)
# ヒートマップで可視化
plt.figure(figsize=(10, 6))
sns.heatmap(pivot_table/1000000, annot=True, fmt='.1f', cmap='YlOrRd')
plt.title('地域×カテゴリ別売上高(百万円)')
plt.tight_layout()
plt.show()
実務でよく使う高度な分析手法
ABC分析による商品の重要度判定
パレートの法則(80:20の法則)に基づき、売上貢献度の高い商品を特定します。
# 商品別売上を集計(カテゴリを商品と見なす)
product_sales = df.groupby('カテゴリ')['売上金額'].sum().sort_values(ascending=False)
# 累積構成比を計算
cumsum_ratio = product_sales.cumsum() / product_sales.sum() * 100
# ABCランク付け
abc_rank = pd.cut(
cumsum_ratio,
bins=[0, 70, 90, 100],
labels=['A', 'B', 'C']
)
abc_analysis = pd.DataFrame({
'売上高': product_sales,
'構成比(%)': (product_sales / product_sales.sum() * 100).round(1),
'累積構成比(%)': cumsum_ratio.round(1),
'ABCランク': abc_rank
})
print("=== ABC分析結果 ===")
print(abc_analysis)
移動平均を使った売上予測
短期的な変動を除去し、トレンドを把握するための移動平均分析を実施します。
# 日別売上を集計
daily_sales = df.groupby('日付')['売上金額'].sum()
# 7日、30日移動平均を計算
ma7 = daily_sales.rolling(window=7).mean()
ma30 = daily_sales.rolling(window=30).mean()
# 可視化
plt.figure(figsize=(14, 6))
plt.plot(daily_sales.index, daily_sales, alpha=0.3, label='日次売上')
plt.plot(ma7.index, ma7, label='7日移動平均', linewidth=2)
plt.plot(ma30.index, ma30, label='30日移動平均', linewidth=2)
plt.title('売上高の推移と移動平均')
plt.xlabel('日付')
plt.ylabel('売上高(円)')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()
コホート分析による顧客行動の理解
顧客の購買パターンを時系列で追跡し、リテンション率を分析します。
# 顧客IDを仮想的に割り当て
df['顧客ID'] = np.random.randint(1, 5000, size=len(df))
# 顧客ごとの初回購入月を特定
first_purchase = df.groupby('顧客ID')['日付'].min().dt.to_period('M')
df['初回購入月'] = df['顧客ID'].map(first_purchase)
# コホート分析用のデータ準備
df['経過月数'] = (df['年月'] - df['初回購入月']).apply(lambda x: x.n)
# コホートテーブルの作成
cohort_data = df.groupby(['初回購入月', '経過月数'])['顧客ID'].nunique().unstack(fill_value=0)
# 最初の6ヶ月分のコホートを表示
cohort_subset = cohort_data.iloc[:6, :6]
print("=== コホート分析(顧客数) ===")
print(cohort_subset)
データ分析でよくある失敗パターンと対策
失敗1:データの前処理を軽視する
多くの初心者が陥る最大の失敗は、データクリーニングを省略することです。実際のデータには必ず異常値や欠損値が含まれています。
# 異常値の検出と処理
Q1 = df['売上金額'].quantile(0.25)
Q3 = df['売上金額'].quantile(0.75)
IQR = Q3 - Q1
# 外れ値の境界値
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
# 外れ値の確認
outliers = df[(df['売上金額'] < lower_bound) | (df['売上金額'] > upper_bound)]
print(f"外れ値の件数: {len(outliers)} ({len(outliers)/len(df)*100:.1f}%)")
# 外れ値の処理(キャッピング)
df['売上金額_cleaned'] = df['売上金額'].clip(lower=lower_bound, upper=upper_bound)
失敗2:相関と因果を混同する
相関関係があるからといって、因果関係があるとは限りません。
# 相関行列の計算
correlation_matrix = df[['売上金額', '数量']].corr()
print("相関係数:")
print(correlation_matrix)
# 注意:相関が高くても因果関係の証明にはならない
# 例:アイスクリームの売上と溺死事故の相関(両方とも夏に増加)
失敗3:サンプルサイズを考慮しない
統計的に有意な結果を得るには、適切なサンプルサイズが必要です。
# サンプルサイズと信頼区間の関係
from scipy import stats
sample_sizes = [10, 50, 100, 500, 1000]
confidence_intervals = []
for n in sample_sizes:
sample = df['売上金額'].sample(n)
mean = sample.mean()
ci = stats.t.interval(0.95, len(sample)-1, loc=mean, scale=stats.sem(sample))
confidence_intervals.append({
'サンプルサイズ': n,
'平均値': mean,
'95%信頼区間下限': ci[0],
'95%信頼区間上限': ci[1],
'区間幅': ci[1] - ci[0]
})
ci_df = pd.DataFrame(confidence_intervals)
print("=== サンプルサイズと信頼区間 ===")
print(ci_df)
分析結果の効果的な可視化とレポーティング
ダッシュボード形式での総合レポート
経営層向けのレポートでは、一目で全体像が把握できるダッシュボード形式が効果的です。
fig = plt.figure(figsize=(16, 10))
# 1. 月別売上推移
ax1 = plt.subplot(2, 3, 1)
monthly_sales['合計売上'].plot(kind='line', marker='o', ax=ax1)
ax1.set_title('月別売上推移')
ax1.set_ylabel('売上高')
# 2. カテゴリ別売上構成
ax2 = plt.subplot(2, 3, 2)
category_sales = df.groupby('カテゴリ')['売上金額'].sum()
ax2.pie(category_sales, labels=category_sales.index, autopct='%1.1f%%')
ax2.set_title('カテゴリ別売上構成')
# 3. 地域別売上
ax3 = plt.subplot(2, 3, 3)
region_sales = df.groupby('地域')['売上金額'].sum().sort_values()
region_sales.plot(kind='barh', ax=ax3)
ax3.set_title('地域別売上高')
ax3.set_xlabel('売上高')
# 4. 売上分布
ax4 = plt.subplot(2, 3, 4)
ax4.hist(df['売上金額'], bins=50, edgecolor='black', alpha=0.7)
ax4.set_title('売上金額の分布')
ax4.set_xlabel('売上金額')
ax4.set_ylabel('頻度')
# 5. 曜日別平均売上
ax5 = plt.subplot(2, 3, 5)
df['曜日'] = df['日付'].dt.day_name()
weekday_order = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
weekday_sales = df.groupby('曜日')['売上金額'].mean().reindex(weekday_order)
weekday_sales.plot(kind='bar', ax=ax5)
ax5.set_title('曜日別平均売上')
ax5.set_xlabel('曜日')
ax5.set_ylabel('平均売上高')
# 6. 累積売上
ax6 = plt.subplot(2, 3, 6)
cumulative_sales = df.groupby('日付')['売上金額'].sum().cumsum()
ax6.plot(cumulative_sales.index, cumulative_sales/1000000)
ax6.set_title('累積売上高の推移')
ax6.set_xlabel('日付')
ax6.set_ylabel('累積売上高(百万円)')
plt.suptitle('2024年度 売上分析ダッシュボード', fontsize=16, y=1.02)
plt.tight_layout()
plt.show()
次のステップ:機械学習への展開
基本的なデータ分析をマスターしたら、次は予測モデルの構築に挑戦しましょう。
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_absolute_error, r2_score
# 特徴量エンジニアリング
df['月'] = df['日付'].dt.month
df['曜日コード'] = df['日付'].dt.dayofweek
# カテゴリ変数のエンコーディング
df_encoded = pd.get_dummies(df[['月', '曜日コード', 'カテゴリ', '地域']])
df_encoded['売上金額'] = df['売上金額']
# 訓練データとテストデータの分割
X = df_encoded.drop('売上金額', axis=1)
y = df_encoded['売上金額']
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)
print("=== 売上予測モデルの性能 ===")
print(f"平均絶対誤差: {mean_absolute_error(y_test, y_pred):,.0f}円")
print(f"決定係数 (R²): {r2_score(y_test, y_pred):.3f}")
まとめと実践への道筋
Pythonを使ったデータ分析は、適切なツールと手法を選択することで、誰でも実践可能です。本記事で紹介した手法を段階的に習得することで、以下のような成果が期待できます。 習得期間の目安: - 基本的な集計・可視化:2-3週間 - 時系列分析・セグメント分析:1-2ヶ月 - 統計的分析・仮説検証:2-3ヶ月 - 機械学習による予測:3-6ヶ月 実務での活用例: 1. 月次売上レポートの自動化により、作業時間をケースによっては8時間程度の短縮も 2. ABC分析による在庫最適化で、在庫コストを15%削減 3. コホート分析によるリテンション改善で、顧客継続率を10%向上 4. 需要予測モデルの導入により、欠品率を5%から1%に改善 データ分析のスキルは、一朝一夕には身につきません。しかし、実際のデータを使って手を動かし続けることで、確実に上達します。まずは自社のExcelデータをPythonに読み込むところから始めて、徐々に分析の幅を広げていくことをお勧めします。 最後に、データ分析は手段であって目的ではないことを忘れないでください。分析結果を実際のビジネス改善につなげることが、真のデータ活用です。技術的なスキルと並行して、ビジネス課題を理解し、適切な問いを立てる力を養うことが、優れたデータアナリストへの道となるでしょう。