Pandas & NumPy Academy · レッスン

売上計算と特徴量エンジニアリング

明細ごとの売上を計算し、月と四半期の列を作成して、しきい値を超える注文に割引フラグを追加します。

レッスン 2/413 ステップ

「売上計算と特徴量エンジニアリング」はCoddyKit上の無料Pandas & NumPy Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPandas & NumPy Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Pandas & NumPy Academyコースには全4レッスンが含まれています。

明細行の売上の計算

売上データセットで最も基本的な計算は、各行の数量と単価を掛け合わせた明細行の売上です。ベクトル化された乗算で列を作成すると、Python のループを使わずに NumPy がすべての行を同時に処理できます。この列は、分析におけるあらゆる集計の基礎になります。

import pandas as pd

df = pd.read_parquet('sales_clean.parquet')

df['revenue'] = df['quantity'] * df['unit_price']
print(df[['quantity', 'unit_price', 'revenue']].head())

月列と四半期列の抽出

暦上の期間でグループ化することは、トレンド分析に不可欠です。datetime 列に対して .dt アクセサーを使い、年、月、四半期を抽出します。これらを整数列として個別に保存すると、groupby 操作が高速になり、文字列を何度も解析せずに期間で簡単にフィルタリングできます。

df['year'] = df['order_date'].dt.year
df['month'] = df['order_date'].dt.month
df['quarter'] = df['order_date'].dt.quarter
df['year_month'] = df['order_date'].dt.to_period('M')

print(df[['order_date', 'year', 'month', 'quarter', 'year_month']].head())

割引フラグの作成

ビジネスルールでは、割引フラグを定義することがよくあります。たとえば、合計金額がしきい値を超えた注文に割引を適用します。np.where またはブール比較を使うと、この二値列を効率的に作成できます。割引フラグがあれば、1 回の groupby 呼び出しで、割引注文と通常価格の注文における売上分布を比較できます。

import numpy as np

DISCOUNT_THRESHOLD = 500

df['is_discounted'] = np.where(df['revenue'] >= DISCOUNT_THRESHOLD, 1, 0)

print(df['is_discounted'].value_counts())
print(df.groupby('is_discounted')['revenue'].mean())

利益率列の計算

データセットに cost_price 列が含まれている場合、利益率を (unit_price - cost_price) / unit_price として計算できます。以降の分析の前に、clip(lower=0) を使って、データエラーによる負の利益率を 0 に制限します。利益率列を使うと、売上だけでなく利益を重視した groupby 集計も行えます。

df['margin'] = ((df['unit_price'] - df['cost_price']) / df['unit_price']).clip(lower=0)

print(df[['unit_price', 'cost_price', 'margin']].describe())

初回注文からの経過日数特徴量

顧客の初回注文から現在の注文までの日数は、有用な顧客継続期間の特徴量です。customer_id でグループ化し、最小の日付をコホート日として求め、各行の日付から差し引いて計算します。Timedelta の演算結果は timedelta64 値の列になるため、.dt.days を使って整数の日数に変換します。

first_order = df.groupby('customer_id')['order_date'].transform('min')
df['days_since_first_order'] = (df['order_date'] - first_order).dt.days

print(df[['customer_id', 'order_date', 'days_since_first_order']].head())

pd.cut による注文サイズの区分化

pd.cut() を使って revenue 列をラベル付きのサイズ区分に分け、セグメンテーション用の順序特徴量を作成します。小・中・大という注文の定義に合うように、bins と labels を明示的に指定してください。結果の列は Pandas の Categorical となり、効率的にグループ化できます。

bins = [0, 100, 500, 2000, float('inf')]
labels = ['Small', 'Medium', 'Large', 'Enterprise']

df['order_size'] = pd.cut(df['revenue'], bins=bins, labels=labels)
print(df['order_size'].value_counts())

時間経過に伴う累積売上

DataFrame を order_date で並べ替え、売上列に対して cumsum() を使うと、年間の累積売上を追跡できます。この累積系列により、売上が直線的に増加しているのか、増加が加速しているのか、横ばいになっているのかを簡単に確認できます。また、ウォーターフォールチャートや累積折れ線グラフの基礎にもなります。

df_sorted = df.sort_values('order_date')
df_sorted['cumulative_revenue'] = df_sorted['revenue'].cumsum()

print(df_sorted[['order_date', 'revenue', 'cumulative_revenue']].tail())

週末と平日の特徴量

dt.day_of_week プロパティは、月曜日の 0 から日曜日の 6 までの値を返します。土曜日(5)と日曜日(6)を週末の注文としてフラグ付けし、週末と平日で購買行動が異なるかを確認します。これは、小売業の EDA や A/B テスト分析でよく使われる特徴量です。

df['is_weekend'] = df['order_date'].dt.day_of_week >= 5

print(df.groupby('is_weekend')['revenue'].agg(['mean', 'count']))

売上による顧客ランキング

groupby().sum() で customer_id ごとの合計売上を計算し、.rank(ascending=False, method='dense') で順位を付けると、上位顧客を特定できます。map() でその順位をメインの DataFrame に追加すれば、1 つのブール条件で上位 N 人の顧客に絞り込めます。

customer_revenue = df.groupby('customer_id')['revenue'].sum()
customer_rank = customer_revenue.rank(ascending=False, method='dense').astype(int)

df['customer_revenue_rank'] = df['customer_id'].map(customer_rank)
print(df[df['customer_revenue_rank'] <= 10][['customer_id', 'customer_revenue_rank']].drop_duplicates())

Z スコアによる売上の正規化

売上列を Z スコアに正規化すると、価格帯が大きく異なる商品カテゴリ間で注文サイズを比較できます。(df['revenue'] - df['revenue'].mean()) / df['revenue'].std() を使います。3 を超える、または -3 を下回る Z スコアは統計的な外れ値であり、モデリング前に調査する価値があります。

mean_rev = df['revenue'].mean()
std_rev = df['revenue'].std()

df['revenue_zscore'] = (df['revenue'] - mean_rev) / std_rev

outliers = df[df['revenue_zscore'].abs() > 3]
print(f'Outlier orders: {len(outliers)}')

特徴量を追加した DataFrame の保存

計算列を追加したら、特徴量を追加した DataFrame を保存し、後続のすべての notebook が同じ一貫した状態から開始できるようにします。to_parquet() を使うと、特に Categorical である order_size 列や datetime である order_date の dtype を保持できます。スクリプトの先頭に短いコメントブロックを置き、新しく追加した列を記録してください。

# New columns added:
# revenue, year, month, quarter, year_month
# is_discounted, order_size, is_weekend
# days_since_first_order, customer_revenue_rank, revenue_zscore

df.to_parquet('sales_features.parquet', index=False)
print('Feature DataFrame saved:', df.shape)

理解度チェック

このレッスンで学んだ Data Analysis の概念について、理解度を確認しましょう。

レッスンのまとめ

このレッスンでは、売上列と利益率列の計算、.dt アクセサーによる時間関連特徴量の抽出、割引フラグ、注文サイズ区分、顧客順位などの特徴量エンジニアリングについて学びました。次は、地域とカテゴリによる groupby 分析について学びます。

無料で開始

AI チューターと学ぶ Python — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
30
レッスン
120

よくある質問

「売上計算と特徴量エンジニアリング」レッスンは無料ですか?

はい。「売上計算と特徴量エンジニアリング」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Pandas & NumPy Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Pandas & NumPy Academyコースには全4レッスンが含まれています。

「売上計算と特徴量エンジニアリング」で何を学びますか?

明細ごとの売上を計算し、月と四半期の列を作成して、しきい値を超える注文に割引フラグを追加します。 ブラウザで直接実行するハンズオンコードでPandas & NumPy Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Pandas & NumPy Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのPandas & NumPy Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「売上計算と特徴量エンジニアリング」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このPandas & NumPy Academyレッスンでコードを書いて実行できますか?

はい。すべてのPandas & NumPy Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 売上データセットの読み込みと監査
  2. 売上計算と特徴量エンジニアリング
  3. 地域とカテゴリ別のGroupBy分析
  4. 月次トレンドの可視化
← Pandas & NumPy Academyに戻る