PythonデータサイエンスプロジェクトにおけるAtomCodeの使用体験:データ分析から可視化まで

目次

    • 毎日の前向きな一言
    • 一、はじめに:データサイエンス時代の新たな開発パラダイム
    • 2. 環境準備:AtomCode内のデータサイエンスワークステーション
      • [2.1 すぐに使えるPython環境](#2.1 すぐに使えるPython環境)
      • [2.2 Jupyter Notebookの起動](#2.2 Jupyter Notebookの起動)
    • 三、データクレンジングと前処理:不純なデータをクリーンにする
      • [3.1 データの読み込みと初期チェック](#3.1 データの読み込みと初期チェック)
      • [3.2 欠損値の処理](#3.2 欠損値の処理)
      • [3.3 異常値の検出と処理](#3.3 異常値の検出と処理)
      • [3.4 データ型の変換と形式の標準化](#3.4 データ型の変換と形式の標準化)
      • [3.5 重複値の処理](#3.5 重複値の処理)
      • [3.6 現代的な連鎖的クリーニングモデル(2026年推奨)](#3.6 現代的な連鎖的クリーニングモデル(2026年推奨))
    • 第4章 探索的データ分析(EDA):データに潜むストーリーの発見
      • [4.1 記述統計](#4.1 記述統計)
      • [4.2 グループ化・集計分析](#4.2 グループ化・集計分析)
      • [4.3 時系列分析](#4.3 時系列分析)
    • 五、データ可視化:データに語らせる
      • [5.1 Matplotlib:基礎的なグラフ作成](#5.1 Matplotlib:基礎的なグラフ作成)
      • [5.2 Seaborn:統計的可視化](#5.2 Seaborn:統計的可視化)
      • [5.3 Plotly:インタラクティブな可視化](#5.3 Plotly:インタラクティブな可視化)
    • 6. 機械学習モデルの学習:データから予測へ
      • [6.1 データ準備と特徴量エンジニアリング](#6.1 データ準備と特徴量エンジニアリング)
      • [6.2 前処理パイプラインの構築](#6.2 前処理パイプラインの構築)
      • [6.3 モデルの学習とチューニング](#6.3 モデルの学習とチューニング)
      • [6.4 モデルの評価](#6.4 モデルの評価)
      • [6.5 モデルの保存と読み込み](#6.5 モデルの保存と読み込み)
    • [7. Jupyter Notebook 統合体験:対話型開発の魅力](#7. Jupyter Notebook 統合体験:対話型開発の魅力)
      • [7.1 効率を高めるマジックコマンド](#7.1 効率を高めるマジックコマンド)
      • [7.2 インライン可視化](#7.2 インライン可視化)
      • [7.3 変数ブラウザ](#7.3 変数ブラウザ)
      • [7.4 AtomCodeとの連携によるメリット](#7.4 AtomCodeとの連携によるメリット)
    • 第8章 データパイプラインの自動化:手動から自動化へ
      • [8.1 Apache Airflowを使用したタスクのオーケストレーション](#8.1 Apache Airflowを使用したタスクのオーケストレーション)
      • [8.2 軽量な代替案:PythonスクリプトとCronの併用](#8.2 軽量な代替案:PythonスクリプトとCronの併用)
    • 九、 実践事例:EC販売データの包括的な分析
      • [9.1 ビジネス課題一覧](#9.1 ビジネス課題一覧)
      • [9.2 分析コード一式](#9.2 分析コード一式)
    • 10. まとめと展望

毎日の前向きな一言

心優しい人は、あなたが恥ずかしい思いをしている時、追い打ちをかけるのではなく、適切なタイミングで励ましや称賛を与えてくれます。

真の善意とは、成功した時にさらに花を添えることではなく、他人が転んだ時に手を差し伸べることです。その機会を利用して貶めたり、冷ややかに傍観したりすることなく、時宜を得た一言で、その人が尊厳を取り戻せるよう手助けすることです。

一、はじめに:データサイエンス時代の新たな開発パラダイム

人工知能とビッグデータが急速に発展している今日、Pythonデータサイエンスは技術分野で最も注目されている分野の一つとなっています。ビジネスインテリジェンス分析から機械学習による予測、金融リスク管理から医療診断に至るまで、 データサイエンスはあらゆる業界の意思決定のあり方を再構築しつつあります。しかし、多くの初心者にとって、データサイエンスプロジェクトへの参入障壁は決して低くありません――複雑なPython環境のセットアップ、数十もの依存ライブラリのインストール、異なるバージョンのデータ処理ツールの管理が必要となるからです。

AtomCodeは、AtomGitが提供するクラウド型IDEとして、データサイエンス開発にまったく新しいソリューションを提供します。完全なPythonデータサイエンスツールチェーン(pandas、numpy、matplotlib、scikit-learnなど)がプリインストールされており、Jupyter Notebookのネイティブ実行をサポートしているため、開発者はブラウザを開くだけでデータ分析を開始できます。本記事では、EC販売データの分析という実践プロジェクトを例に、データクレンジングから可視化、探索的分析から機械学習モデリング、さらには自動化されたデータパイプラインに至るまでの全プロセスを詳細に解説します。すべての操作はAtomCode内で完了します。


二、環境準備:AtomCode内のデータサイエンスワークステーション

2.1 すぐに使えるPython環境

AtomCodeでPythonプロジェクトを作成すると、以下のツールがプリインストールされていることがわかります:

# インストール済みの常用ライブラリを確認
pip list | grep -E 「pandas|numpy|matplotlib|seaborn|scikit-learn|jupyter」

# 出力例:
# pandas 2.2.0
# numpy 1.26.0
# matplotlib 3.8.0
# seaborn 0.13.0
# scikit-learn 1.4.0
# jupyter 1.0.0
# plotly 5.18.0

つまり、インストールコマンドを一切実行することなく、データサイエンスプロジェクトを開始できます。追加のライブラリが必要な場合、AtomCodeは仮想環境による分離機能を提供しています:

# プロジェクト専用の仮想環境を作成
python -m venv venv
source venv/bin/activate

# プロジェクトの依存関係をインストール
pip install -r requirements.txt

2.2 Jupyter Notebookの起動

AtomCodeはJupyter Notebookをネイティブでサポートしています。ターミナルで直接以下を入力してください:

jupyter notebook --ip=0.0.0.0 --port=8888 --no-browser

その後、ブラウザで表示されたURLにアクセスすれば、インタラクティブなNotebookインターフェースが開きます。従来のローカル環境と比較して、AtomCodeのJupyterには以下の利点があります:

  • クラウド上での永続化:Notebookファイルは自動的にクラウドに保存されるため、デバイスを切り替えても作業を継続できます
  • 計算リソースの弾力性:データ量に応じて、異なる構成の計算インスタンスを選択できます
  • 共同作業と共有:ワンクリックでNotebookのリンクを共有でき、チームメンバーはリアルタイムで閲覧・編集が可能です

3. データのクリーニングと前処理:不純なデータをクリーンなデータに変える

「データサイエンティストの時間の80%はデータのクリーニングに費やされる」と言われるように、データのクリーニングはデータ分析の第一歩であり、最も重要なステップです。本記事では、EC販売データを例に、完全なクリーニングプロセスを解説します。

3.1 データの読み込みと初期チェック

import pandas as pd
import numpy as np

# データの読み込み(AtomCodeではCSVファイルをワークスペースに直接アップロード可能)
df = pd.read_csv(『ecommerce_sales.csv』, engine=『pyarrow』)

# データの基本情報を確認
print(f「データの形状: {df.shape}」)
print(f「\\n列名: {df.columns.tolist()}」)
print(f「\\nデータ型:\\n{df.dtypes}」)
print(f「\\n最初の5行:\\n{df.head()}」)

3.2 欠損値の処理

# 欠損値の状況を集計
missing_info = pd.DataFrame({
    『欠損数』: df.isnull().sum(),
    
『欠損率』: (df.isnull().sum() / len(df) * 100).round(2).astype(str) + 『%』
})
print(missing_info[missing_info[『欠損数』] > 0])

# 処理方針:数値型は中央値で補完、カテゴリ型は最頻値で補完
# 数値列
numeric_cols = df.select_dtypes(include=[np.number]).columns
df[numeric_cols] = df[numeric_cols].fillna(df[numeric_cols].median())

# カテゴリ列
cat_cols = df.select_dtypes(include=[『object』]).columns
for col in cat_cols:
    df[col].fillna(df[col].mode()[0], inplace=True)

3.3 外れ値の検出と処理

IQR(四分位範囲)法を用いて外れ値を検出:

def handle_outliers(df, column):
    「」『IQR法を用いて外れ値を処理する』「」
    Q1 = df[column].quantile(0.25)
    
Q3 = df[column].quantile(0.75)
    IQR = Q3 - Q1
    
lower_bound = Q1 - 1.5 * IQR
    upper_bound = Q3 + 1.5 * IQR
    
    # 外れ値を境界値で置き換える(削除ではなく切り捨て)
    df[column] = df[column].clip(lower=lower_bound, upper=upper_bound)
    return df

# 金額関連の列に適用
amount_cols = [『price』, 『quantity』, 『total_amount』]
for col in amount_cols:
    df = handle_outliers(df, col)

3.4 データ型の変換とフォーマットの標準化

# 日付の変換
df[『order_date』] = pd.to_datetime(df[『order_date』], errors=『coerce』)

# カテゴリデータのメモリ最適化
df[『category』] = df[『category』].astype(『category』)

# 文字列の正規化
df[『customer_name』] = df[『customer_name』].str.strip().str.title()
df[『email』] = df[『email』].str.lower().str.strip()

# 価格列から千の位区切りコンマを除去し、数値に変換
df[『price』] = df[『price』].astype(str).str.replace(『,』, 『』).astype(float)

3.5 重複値の処理

# 重複の確認
print(f「重複行数: {df.duplicated().sum()}」)

# 注文番号に基づいて重複を削除(最新のレコードのみ保持)
df = df.drop_duplicates(subset=[『order_id』], keep=『last』)

# 最終データの確認
print(f「クリーニング後のデータの形状: {df.shape}」)
print(f「欠損値の総数: {df.isnull().sum().sum()}」)

3.6 現代的なチェーン式データクリーニング(2026年推奨)

pandas 2.xバージョンでは、より洗練されたチェーン式操作がサポートされています:

df_clean = (
    df
    .assign(price=lambda d: pd.to_numeric(d[『price』], errors=『coerce』))
    
.assign(order_date=lambda d: pd.to_datetime(d[『order_date』]))
    .assign(category=lambda d: d[『category』].str.strip().str.title())
    .drop_duplicates(subset=[『order_id』])
    
.dropna(subset=[『order_id』, 『customer_id』])
    .reset_index(drop=True)
)

この書き方は可読性が高く、再現性も優れており、中間変数による混乱を回避できます。


4. 探索的データ分析(EDA):データに潜むストーリーの発見

クリーニング後のデータについては、EDAを通じてその分布特性、相関関係、および潜在的なパターンを理解する必要があります。

4.1 統計的記述

# 数値列の統計的記述
print(df_clean.describe())

# カテゴリ列の分布
print(df_clean[『category』].value_counts())
print(df_clean[『payment_method』].value_counts(normalize=True)) # 割合

4.2 グループ化集計分析

# 2026年に推奨される新しい集計構文
category_stats = df_clean.groupby(『category』, as_index=False).agg(
    total_sales=(『total_amount』, 『sum』),
    avg_order_value=(『total_amount』, 『mean』),
    order_count=(『order_id』, 『count』),
    
unique_customers=(『customer_id』, 『unique』)
).sort_values(『total_sales』, ascending=False)

print(category_stats)

4.3 時系列分析

# 売上データを月ごとに集計
monthly_sales = df_clean.groupby(
    df_clean[『order_date』].dt.to_period(『M』)
).agg({
    『total_amount』: 『sum』,
    『order_id』: 『count』
}).reset_index()
monthly_sales[『order_date』] = monthly_sales[『order_date』].astype(str)

print(monthly_sales)

五、データ可視化:データに語らせる

Pythonのデータ可視化エコシステムは充実しており、シーンに応じて適切なツールを選択する必要があります:

5.1 Matplotlib:基本的なグラフ作成

import matplotlib.pyplot as plt

# 中国語フォントの設定(AtomCodeでは事前設定済み)
plt.rcParams[『font.sans-serif』] = [『SimHei』]
plt.rcParams[『axes.unicode_minus』] = False

# 月次売上推移グラフ
fig, ax = plt.subplots(figsize=(12, 6))
ax.plot(monthly_sales[『order_date』], monthly_sales[『total_amount』],
        
marker=『o』, linewidth=2, markersize=8, color=『#1976d2』)
ax.fill_between(monthly_sales[『order_date』], monthly_sales[『total_amount』],
                alpha=0.3, color=『#1976d2』)
ax.set_title(『2026年の月別売上推移』, fontsize=16, fontweight=『bold』, pad=20)
ax.set_xlabel(『月』, fontsize=12)
ax.set_ylabel(『売上高 (万元)』, fontsize=12)
ax.grid(True, alpha=0.3)
ax.tick_params(axis=『x』, rotation=45)

# データラベルの追加
for x, y in zip(monthly_sales[『order_date』], monthly_sales[『total_amount』]):
    ax.annotate(f『{y:.0f}』, xy=(x, y), xytext=(0, 10),
                textcoords=『offset points』, ha=『center』, fontsize=9)

plt.tight_layout()
plt.show()

5.2 Seaborn:統計的可視化

import seaborn as sns

# 商品カテゴリ別売上高分布の箱ひげ図
fig, ax = plt.subplots(figsize=(10, 6))
sns.boxplot(data=df_clean, x=『category』, y=『total_amount』, palette=『Set2』, ax=ax)
ax.set_title(『各品目の注文金額の分布』, fontsize=16, fontweight=『bold』)
ax.set_xlabel(『商品カテゴリー』, fontsize=12)
ax.set_ylabel(『注文金額 (元)』, fontsize=12)
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()

# 相関ヒートマップ
numeric_df = df_clean[[『price』, 『quantity』, 『total_amount』, 『customer_age』]]
corr_matrix = numeric_df.corr()

fig, ax = plt.subplots(figsize=(8, 6))
sns.heatmap(corr_matrix, annot=True, cmap=『RdYlBu_r』, center=0,
            square=True, fmt=『.2f』, ax=ax)
ax.set_title(『数値特徴量の相関行列』, fontsize=16, fontweight=『bold』)
plt.tight_layout()
plt.show()

5.3 Plotly:インタラクティブな可視化

import plotly.express as px

# インタラクティブな散布図:客単価 vs 購入頻度
customer_stats = df_clean.groupby(『customer_id』).agg(
    total_spent=(『total_amount』, 『sum』),
    order_count=(『order_id』, 『count』),
    category=(『category』, lambda x: x.mode()[0])
).reset_index ()

fig = px.scatter(customer_stats, x=『order_count』, y=『total_spent』,
                 color=『category』, size=『total_spent』,
                 
hover_data=[『customer_id』],
                 title=『顧客価値分析:購入頻度 vs 総消費額』,
                 labels={『order_count』: 『購入回数』, 『total_spent』: 『総消費額』})
fig.show()

PlotlyはJupyter Notebook内でインタラクティブなグラフを直接描画でき、ズーム、フィルタリング、ホバーによる詳細表示などの操作に対応しており、データ探索に最適です。


6. 機械学習モデルの学習:データから予測へ

データのクリーニングと探索的分析が完了したら、次のステップは予測モデルの構築です。本記事では、売上予測を例に、scikit-learnを用いた完全なモデリングプロセスを解説します。

6.1 データ準備と特徴量エンジニアリング

from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler, LabelEncoder
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline

# 特徴量の構築
df_model = df_clean.copy()
df_model[『month』] = df_model[『order_date』].dt.month
df_model[『day_of_week』] = df_model[『order_date』].dt.dayofweek
df_model[『is_weekend』] = df_model[『day_of_week』].isin([5, 6]).astype(int)

# 特徴量とラベル
features = [『price』, 『quantity』, 『month』, 『day_of_week』, 『is_weekend』, 『category』]
X = df_model[features]
y = df_model[『total_amount』]

# トレーニングセットとテストセットの分割
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)

6.2 前処理パイプラインの構築

# 数値特徴量とカテゴリカル特徴量
numeric_features = [『price』, 『quantity』, 『month』, 『day_of_week』, 『is_weekend』]
categorical_features = [『category』]

# 前処理パイプライン
preprocessor = ColumnTransformer(
    transformers=[
        (『num』, StandardScaler(), numeric_features),
        (『cat』, OneHotEncoder(drop=『first』), categorical_features)
    ])

# 完全なモデリングパイプライン
from sklearn.ensemble import RandomForestRegressor

model_pipeline = Pipeline([
    (『preprocessor』, preprocessor),
    (『regressor』, RandomForestRegressor(n_estimators=100, random_state=42))
])

6.3 モデルの学習とチューニング

from sklearn.model_selection import GridSearchCV

# ハイパーパラメータのグリッド検索
param_grid = {
    『regressor__n_estimators』: [50, 100, 200],
    
『regressor__max_depth』: [10, 20, None],
    『regressor__min_samples_split』: [2, 5, 10]
}

grid_search = GridSearchCV(
    model_pipeline, param_grid,
    cv=5, scoring=『neg_mean_squared_error』,
    n_jobs=-1, verbose=1
)

grid_search.fit(X_train, y_train)

print(f「最適なパラメータ: {grid_search.best_params_}」)
print(f「最適なスコア: {-grid_search.best_score_:.2f}」)

6.4 モデルの評価

from sklearn.metrics import mean_squared_error, r2_score, mean_absolute_error

# 最適なモデルを使用して予測
best_model = grid_search.best_estimator_
y_pred = best_model.predict(X_test)

# 評価指標
mse = mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mse)
mae = mean_absolute_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)

print(f「平均二乗誤差 (MSE): {mse:.2f}」)
print(f「平均二乗根誤差 (RMSE): {rmse:.2f}」)
print(f「平均絶対誤差 (MAE): {mae:.2f}」)
print(f「R² スコア: {r2:.4f}」)

# 予測結果の可視化
fig, ax = plt.subplots(figsize=(10, 6))
ax.scatter(y_test, y_pred, alpha=0.5, color=『#1976d2』)
ax.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()],
        『r--』, lw=2, label=『完全予測線』)
ax.set_xlabel(『実際の売上高』, fontsize=12)
ax.set_ylabel(『予測売上高』, fontsize=12)
ax.set_title(『モデルの予測性能評価』, fontsize=16, fontweight=『bold』)
ax.legend()
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.show ()

6.5 モデルの保存と読み込み

import joblib

# 学習済みのモデルを保存
joblib.dump(best_model, 『sales_prediction_model.pkl』)

# 予測用にモデルを読み込む
loaded_model = joblib.load(『sales_prediction_model.pkl』)
new_prediction = loaded_model.predict(new_data)

scikit-learnの統一API設計(すべてのモデルにfit()predict()score()メソッドが用意されている)により、モデルの切り替えや比較が極めて簡単になり、これがPythonの機械学習において最も選ばれるライブラリとなっている重要な理由の一つです。


7. Jupyter Notebookの統合体験:インタラクティブ開発の魅力

Jupyter Notebookはデータサイエンス分野における「キラーアプリ」であり、コード、ドキュメント、可視化を一体化しています。AtomCodeでJupyter Notebookを使用すれば、その体験はさらに一段と向上します:

7.1 効率を高める魔法のコマンド

# 現在の変数を表示
%who

# コードの実行時間を測定
%timeit df_clean.groupby(『category』).agg({『total_amount』: 『sum』})

# 外部のPythonファイルを読み込む
%load utils.py

# 現在の作業ディレクトリを表示
%pwd

# ファイル一覧を表示
%ls

7.2 インライン可視化

# matplotlibをNotebook内でインライン表示するように設定
%matplotlib inline

# 高解像度出力を設定
%config InlineBackend.figure_format = 『retina』

7.3 変数ブラウザ

AtomCodeのJupyter拡張機能には、変数ブラウザパネルが用意されており、現在のNotebook内のすべての変数の型、形状、値をリアルタイムで確認できるため、デバッグ作業が大幅に効率化されます。

7.4 AtomCodeとの連携によるメリット

機能 従来のローカルJupyter AtomCode内のJupyter
環境設定 すべての依存関係を手動でインストールする必要がある インストール後すぐに利用可能、データサイエンスのフルセットがプリインストール済み
ファイル管理 ローカルファイルシステム クラウドへの永続化、Gitバージョン管理に対応
計算リソース ローカルハードウェアの制約を受ける スケーラブルな計算、大容量データでもスムーズに処理
共同作業・共有 追加設定が必要 ワンクリックで共有リンクを生成
マルチデバイスアクセス 環境の同期が必要 どのデバイスでもブラウザを開けば作業を継続可能

8. データパイプラインの自動化:手動から自動へ

分析プロセスが安定したら、次のステップはその自動化であり、定期的な更新や無人運用が可能なデータパイプラインを実現します。

8.1 Apache Airflowを使用したタスクのオーケストレーション

# airflow/dags/sales_analysis_dag.py
from airflow import DAG
from airflow.operators.python import PythonOperator
from airflow.providers.mysql.hooks.mysql import MySqlHook
from datetime import datetime, timedelta

default_args = {
    『owner』: 『data_team』,
    『depends_on_past』: False,
    『email_on_failure』: True,
    『email』: [『data@company.com』],
    『retries』: 3,
    『retry_delay』: timedelta(minutes=5),
}

def extract_data(**context):
    「」「データベースから昨日のデータを抽出する」『』
    mysql = MySqlHook(mysql_conn_id=『sales_db』)
    sql = 「」"
    SELECT * FROM orders
    WHERE DATE(order_date) = DATE_SUB(CURDATE(), INTERVAL 1 DAY)
    
「」「
    df = mysql.get_pandas_df(sql)
    df.to_csv(『/tmp/daily_sales_raw.csv』, index=False)
    return f」{len(df)}件のレコードを取得しました「

def transform_data(**context):
    」「『データのクリーニングと変換』」"
    
df = pd.read_csv(『/tmp/daily_sales_raw.csv』)
    
    # クリーニングロジックを適用
    df_clean = (
        df
        .assign(order_date=lambda d: pd.to_datetime(d[『order_date』]))
        .drop_duplicates(subset= [『order_id』])
        .dropna(subset=[『order_id』, 『customer_id』])
    )
    
    df_clean.to_csv(『/tmp/daily_sales_clean.csv』, index=False)
    return f「クリーニング後、{len(df_clean)} 件のレコードが残りました」

def load_to_warehouse(**context):
    「」「データウェアハウスへのロード」『』
    df = pd.read_csv(『/tmp/daily_sales_clean.csv』)
    # データウェアハウスへの書き込み...
    return 「データのロードが完了しました」

def generate_report(**context):
    「」「日次レポートを生成」『』
    # 可視化レポートを生成し、メールを送信...
    return 「レポートを送信しました」

# DAGの定義
with DAG(
    『daily_sales_pipeline』,
    default_args=default_args,
    description=『日次売上データ処理パイプライン』,
    
schedule_interval=『0 6 * * *』, # 毎日午前6時に実行
    start_date=datetime(2026, 1, 1),
    catchup=False,
    tags=[『sales』, 『etl』],
) as dag:
    
    extract = PythonOperator(task_id=『extract』, python_callable=extract_data)
    
transform = PythonOperator(task_id=『transform』, python_callable=transform_data)
    load = PythonOperator(task_id=『load』, python_callable=load_to_warehouse)
    report = PythonOperator(task_id=『report』, python_callable=generate_report)
    
    # 依存関係の定義
    extract >> transform >> load >> report

8. 2 軽量な代替案:Pythonスクリプト + Cron

小規模なプロジェクトでは、よりシンプルな方法を使用できます:

# pipeline.py
import schedule
import time

def daily_job():
    print(f「[{datetime.now()}] 毎日のデータ処理を開始します...」)
    # データの抽出、クリーニング、分析、保存を実行
    
print(「処理完了!」)

# 毎日午前2時に実行
schedule.every().day.at(「02:00」).do(daily_job)

while True:
    schedule.run_pending()
    time.sleep(60)

9. 実践事例:EC販売データの包括的な分析

上記のすべての技術を統合し、包括的な分析プロジェクトを作成してみましょう。あなたがEC企業のデータアナリストであると仮定し、以下のビジネス上の課題に答える必要があります:

9.1 ビジネス課題一覧

  1. 販売動向:直近半年間の売上高の推移は?
  2. カテゴリー分析:どのカテゴリーの貢献度が最も高いか?各カテゴリーの利益率はどうか?
  3. 顧客プロファイル:高価値顧客にはどのような特徴があるか?リピート購入率はどうか?
  4. 予測・アラート:来月の売上高はいくらになると予測されるか?在庫を確保する必要があるか?

9.2 完全な分析コード

# 1. データの読み込みと前処理
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import r2_score
import joblib

# データの読み込み
df = pd.read_csv(『ecommerce_sales.csv』, engine=『pyarrow』)

# データの前処理
df[『order_date』] = pd.to_datetime(df [『order_date』])
df[『month』] = df[『order_date』].dt.month
df[『profit』] = df[『total_amount』] - df[『cost』]

# 2. 売上トレンド分析
monthly = df.groupby(df[『order_date』].dt.to_period(『M』)).agg({
    『total_amount』: 『sum』,
    
『order_id』: 『count』,
    『profit』: 『sum』
}).reset_index()
monthly[『order_date』] = monthly[『order_date』].astype(str)

# 3. カテゴリー別分析
category_perf = df.groupby(『category』).agg({
    『total_amount』: 『sum』,
    
『profit』: 『sum』,
    『order_id』: 『count』
}).assign(profit_margin=lambda x: x[『profit』] / x[『total_amount』] * 100)
category_perf = category_perf.sort_values(『total_amount』, ascending=False)

# 4. 顧客価値分析(RFMモデル)
from datetime import datetime
snapshot_date = df[『order_date』].max()

rfm = df.groupby(『customer_id』).agg({
    『order_date』: lambda x: (snapshot_date - x.max())
 .days, # Recency    『order_id』: 『count』, # Frequency    『total_amount』: 『sum』 # Monetary}).rename(columns={    『order_date』: 『Recency』,    『order_id』: 『Frequency』,    『total_amount』: 『Monetary』})# 5. 売上予測モデルfeatures = [『month』, 『price』, 『quantity』, 『category』]X = pd.get_dummies(df[features], columns=[『category』])y = df[『total_amount』]X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)model = RandomForestRegressor(n_estimators=100, random_state=42)model.fit(X_train, y_train)print(f"モデルのR²スコア: {r2_score(y_test, model.predict(X_test)):.4f}")# モデルの保存joblib.dump(model, 『sales_forecast_model.pkl』)# 6. 可視化レポートの生成fig, axes = plt.subplots(2, 2, figsize=(16, 12))# トレンドグラフaxes[0,0].plot(monthly[『order_date』], monthly[『total_amount』], marker=『o』)axes[0,0].set_title(『月次売上トレンド』)axes[0,0].tick_params(axis=『x』, rotation=45)# カテゴリー別売上構成比axes[0,1].pie(category_perf[『total_amount』], labels=category_perf.index, autopct=『%1.1f%%』)axes[0,1].set_title(『カテゴリー別売上構成比』)# RFM散布図axes[1,0].scatter(rfm[『Frequency』], rfm[『Monetary』], c=rfm[『Recency』], cmap=『viridis』)axes[1,0].set_xlabel(『購入頻度』)axes[1,0].set_ylabel(『購入金額』)axes[1,0].set_title(『顧客価値の分布』)# 特徴量の重要度importances = pd.Series(model.feature_importances_, index=X.columns)importances.nlargest(10).plot(kind=『barh』, ax=axes[1,1])axes[1,1].set_title(『予測モデルの特徴量重要度』)plt.tight_layout()plt.savefig(『sales_analysis_report.png』, dpi=300, bbox_inches=『tight』)plt.show()

10. まとめと展望

本記事の実践演習を通じて、Pythonを用いたデータサイエンスプロジェクトを完遂しました:

フェーズ 主な内容 主要ツール
データクレンジング 欠損値/外れ値/重複値の処理 pandas
探索的分析 記述統計、グループ化・集計、相関 pandas + numpy
可視化 静的グラフ、統計グラフ、インタラクティブグラフ matplotlib + seaborn + plotly
機械学習 特徴量エンジニアリング、モデル学習、チューニング・評価 scikit-learn
Notebook インタラクティブな開発、ドキュメントの混在、マジックコマンド Jupyter
自動化 ETLパイプライン、定時タスク、ワークフローオーケストレーション Airflow / schedule

クラウドIDEであるAtomCodeは、データサイエンスのワークフロー全体において顕著な利点を発揮します:環境設定不要、ツールチェーンのプリインストール、クラウド上での共同作業、スケーラブルなコンピューティングにより、データサイエンティストは環境管理ではなく分析そのものに集中できます。

今後さらに探求すべき方向性としては、以下が挙げられます:

  • ビッグデータ処理:PySparkまたはDaskを使用したTB級のデータ処理
  • ディープラーニング:TensorFlow/PyTorchを統合した画像/テキスト分析
  • MLOps:モデルバージョン管理、A/Bテスト、監視・アラートシステムの構築
  • リアルタイム分析:Apache Kafka + Flinkを用いたストリームデータ処理

Pythonデータサイエンスのエコシステムは日増しに充実しており、AtomCodeの効率的な開発体験と相まって、データアナリストや機械学習エンジニアはデータから迅速に価値を見出し、インテリジェントなアプリケーションを構築することができます。本記事が、皆様のデータサイエンスの旅に有益な参考となることを願っています。


「いいね」✍「コメント」⭐「ブックマーク」をお待ちしております。ご指摘も歓迎します