完全なデータ分析プロセス: Python の Panda がビジネス上の問題を解決する方法

オープニング

接着剤のような接着言語として、Python はほぼ全能であり、データ サイエンスの分野におけるその役割はさらにかけがえのないものです。データ分析のハードパワーにおいて、Python は学ぶ価値のあるツールです。

その中で、Pandas はデータ アナリストによって最もよく使用されるモジュールであり、すでに Pandas を使用している場合は、完全なデータ分析プロセスを実行し、Pandas がビジネス上の問題をどのように解決するかを検討することをお勧めします。

データの背景

できるだけ多くの Pandas 機能を使用するために、奇妙な、しかし実際には非常にリアルなデータを設計しました。はっきり言って、多くの不規則なデータがクリーンアップを待っています。

データ ソースはスーパーマーケットの注文から転用されており、ファイル パスは記事の最後に添付されています。

必要なモジュールをインポートする

import pandas as pd
复制代码

データインポート

Pandas は豊富なデータ IO インターフェイスを提供しており、その中で最も一般的に使用されるのはpd.read_excelpd.read_csv関数です。

data = pd.read_excel('文件路径.xlsx',
                    sheet_name='分页名称')
data = pd.read_csv('文件路径.csv')
复制代码

スーパーマーケットのデータセットから複数ページのデータをインポートします。

orders = pd.read_excel('超市数据集.xlsx', 
                       sheet_name= '订单表')
customers = pd.read_excel('超市数据集.xlsx', 
                       sheet_name= '客户表')
products = pd.read_excel('超市数据集.xlsx', 
                       sheet_name= '产品表')
复制代码

データをインポートするだけでなく、このリンクではデータを事前に理解し、存在するフィールドとその定義を明確にする必要もあります。

pd.Series.head()ここでは、各データテーブルのフィールドとサンプルデータを表示するために使用します。

ビジネス上の問題と分析アイデアを明確にする

経営分析の実戦では、分析を始める前に、分析目的を明確にし、分析手法や分析指標を逆引きし、必要なデータを逆引きする必要があります。

これは「終わりを念頭に置いて始める」という根拠のある考え方です。

ビジネス要件は、ユーザーの階層化された操作を通じて差別化されたユーザー操作戦略を形成することであると想定されます。評価後、データ アナリストは、顧客はRFM ユーザー価値モデルに基づいてグループ化でき、さまざまな民族グループのポートレートの特性に基づいて運用戦略を策定できると考えています。ユーザーは価格に敏感な忠実な顧客であり、割引を通じて消費を刺激する必要があります。

そこで、ここでの分析手法は、既存ユーザーをRFMモデルでグループ化し、グループごとのデータの特徴をカウントすることでビジネスへの戦略的な提案を行うというものです。

ビジネスニーズと分析方法が明確になったら、顧客のR、F、M、顧客単価の統計を把握してポートレート分析を行うことができ、次のステップに入ることができます。

特徴量エンジニアリングとデータクリーニング

データサイエンスには「Garbage In, Garbage Out」という格言があります。これは、分析に使用されるデータの品質が低く、エラーが多ければ、どんなに綿密で複雑な分析方法を行っても、花を変更することはできず、結果は同じになります。は利用できません。

データ サイエンティストの仕事の 80% はデータの前処理であると言われています。

特徴エンジニアリングは、主に機械学習アルゴリズムモデルのプロセスで使用され、データの前処理 (Data PrePorcessing)、特徴抽出 (Feature Extraction)、特徴選択 (Feature Selection)、および特徴を含む、モデルの効果を最大限に高めるためのシステムエンジニアリングです。構築(機能構築)およびその他の問題。

簡単に言うと、次の 2 つの部分に分けることができます。

  • データの前処理は、私たちがよくデータ クリーニングと呼ぶものとして理解できます
  • RFMモデルの構築やグループユーザーポートレートなどの特徴構築、R、F、Mなどのタグ、顧客単価などが該当する特徴です。

(もちろん、RFM は機械学習モデルではありません。ここでは理解を容易にするために説明します。)

データクリーニング

データクレンジングとは何ですか? データ クリーニングとは、データ アプリケーション レベルでの結論が実際のビジネスに近づくように、データ内の「外れ値」を見つけて「処理」することを指します。

外れ値:

  • NULL値、重複データ、無駄なフィールドなどの不規則なデータ、注文データ内の社内テスト注文、200歳以上の顧客など、不合理な値が含まれていないか注意する必要があります。
  • データ形式が適切かどうかには特に注意してください。適切でない場合は、テーブルの結合や集計統計などのエラー レポートに影響します。
  • 2019 年から 2021 年のユーザー行動の分析など、ビジネス分析シナリオを満たさないデータ、この期間以外の行動は分析に含めるべきではありません

対処方法:

  • 通常の状況では、外れ値については直接削除できます。
  • ただし、データが比較的少ない場合、または特徴がより重要な場合は、外れ値を平均値に置き換えるなど、より高度な方法で処理できます。

データ クリーニングの意味を理解したら、Pandas を使用してこの部分を練習し始めることができます。

データの種類

最初にデータフィールドが妥当かどうかをチェックするためにpd.dtypes使用されます

注文日と数量はオブジェクト(通常は文字)型であることがわかり、後の計算に使用できません。またはpd.Series.astype()メソッドでpd.Series.apply()文字型を変更する必要があります。

orders['订单日期'] = orders['订单日期'].astype('datetime64')
orders['数量'] = orders['数量'].apply(int)
复制代码

さらに、時間型の処理は次のpd.to_datetime方法でも行うことができます。

orders['订单日期'] = pd.to_datetime(orders['订单日期'])
复制代码

フィールド名を変更する

経験豊富なデータ アナリストは、フィールド名にも問題があることを発見しました。订单 Id後続の参照に不便なスペースが含まれています。次のようにpd.rename()フィールド名を変更する必要があります。

orders = orders.rename(columns={'订单 Id':'订单ID',
                                '客户 Id':'客户ID',
                                '产品 Id':'产品ID'})
customers = customers.rename(columns={'客户 Id':'客户ID'})
复制代码

複数テーブル結合

フィールド名とデータ型を処理した後、それを使用してpd.merge複数のテーブルを接続できます。

テーブル接続には2 つの方法onがあります。1 つは、2 つのテーブルの接続に使用されるフィールド名が同じであるため、それを直接使用することです。on同じでない場合は、left_on, right_onそれを使用する必要があります。

data = orders.merge(customers, on='客户ID', how='left')
data = data.merge(products, how='left', 
                  left_on='产品ID', right_on='物料号')
复制代码

冗長なフィールドを削除する

2 番目のケースでは、結果のテーブルには同じ意味を持つ異なる名前を持つ 2 つのフィールドが含まれるため、pd.drop冗長なフィールドを削除する必要があります。また、「Row Id」はここでは役に立たないフィールドなので、一緒に削除する必要があります。

data.drop(['物料号','行 Id'],axis=1,
                            inplace=True)
复制代码

調整されたテーブル構造:

テキスト処理 - ビジネス シナリオを満たさないデータを削除します

ビジネスの経験によれば、分析の結論に影響を与える内部テスト データが注文テーブルに含まれている可能性があるため、それらを見つけて削除する必要があります。ビジネスまたは運用保守と連絡を取った後、テスト注文の識別は「製品名」列の「テスト」という単語であることがわかります。

テキストコンテンツなので、pd.Series.str.contains検索して削除する必要があります。

data = data[~data['产品名称'].str.contains('测试')]
复制代码

時間処理 - 分析されていない範囲データを削除します

消費者に影響を与える要因には、時間枠が減少するという特徴があり、たとえば、10年前にかわいい帽子を買ったとしても、10年もあれば多くの変化が起こるため、今もかわいい帽子が必要であるというわけではありません。しかし、10 日前にカントリードレスを購入した場合、好みのスタイルは短期的にはあまり変わらないため、今でもカントリー製品が好きであると確信できます。

つまり、ユーザー行動分析では、行動データには一定の適時性があるため、ビジネスシナリオと合わせて時間範囲を明確にし、その時間範囲に近い注文データを絞り込んでRFMモデリング分析pd.Series.between()を行う。

data= data[data['订单日期'].between('2019-01-01','2021-08-13')]
复制代码

特徴構造

このリンクの目的は、分析モデル、つまりグループ化ポートレート分析に必要な RFM モデルと特徴フィールドを構築することです。

データの集約 - 顧客の消費特性

まず、RFM モデルにおける顧客の消費特性は次のとおりです。

  • R: 顧客の最新の購入と分析日 (2021-08-14 に設定) の間の距離。購入ユーザーのアクティブ ステータスを判断するために使用されます。
  • F: 顧客の消費頻度
  • M:顧客消費量

これらは一定期間にわたる消費データの集計であるため、次のようにpd.groupby().agg()実装できます。

consume_df = data.groupby('客户ID').agg(累计消费金额=('销售额',sum), 
                         累计消费件数=('数量',sum),
                         累计消费次数=('订单日期', pd.Series.nunique), 
                         最近消费日期=('订单日期',max)
                        )
复制代码

このうち R 値は特殊で、日付間の距離を計算するには datetime モジュールを借用する必要があります。

from datetime import datetime
consume_df['休眠天数'] = datetime(2021,8,14) - consume_df['最近消费日期']
consume_df['休眠天数'] = consume_df['休眠天数'].map(lambda x:x.days)
复制代码

計算された顧客の累積消費量データ統計表:

ビニング処理 - 顧客単価帯分割

前述の分析アイデアによれば、RFM モデルのユーザー グループ化が完了した後、各民族グループのユーザーの消費ポートフォリオをカウントする必要がありますが、スペースの制限により、各民族グループの顧客単価の分布特性のみを把握する必要があります。がここでカウントされます。

このとき、顧客単価データを算出した後、pd.cut顧客単価を用いてボックス化操作を行い、価格帯を形成する必要がある。

consume_df['客单价'] = consume_df['累计消费金额']/consume_df['累计消费次数']
consume_df['客单价区间']  = pd.cut(consume_df['客单价'],bins=5)
复制代码

次のメソッドを使用してpd.Series.value_counts、顧客単価間隔の分布をカウントします。

pd.cutのbinsパラメータは客単価を分割する間隔の数で、5を入力すると平均5つのbinに分割されます。もちろん、これは同じ文ですが、これは実際のビジネスで明確にするか、ビジネス シナリオと組み合わせて決定する必要があります。

RFMモデリング

データのクリーニングと特徴の構築が完了すると、モデリングと分析のリンクに入ります。

Tukey の検定の外れ値の検出

分析の経験によれば、外れ値は統計指標に大きな影響を与え、大きな誤差を引き起こすため、たとえば馬雲がクラスに配置された場合、クラスの平均資産は数百億と計算されることがあります。ここで、ジャック・マーは外れ値であるため、削除する必要があります。

したがって、RFM しきい値の計算を開始する前に、R、F、M の値に対して外れ値検出を実行する必要があります。

ここでは、トルコの検定法を使用します。これは、分位点間の演算を通じて数値区間を形成し、この区間外のデータを外れ値としてマークするだけです。よくわからない学生は Zhihu で検索してください。ここでは説明しません。

トルコのテスト方法は、Pandas での分位数の計算によるpd.Series.quantile分位数の計算に依存しています。

def turkeys_test(fea):
    Q3 = consume_df[fea].quantile(0.75)
    Q1 = consume_df[fea].quantile(0.25)
    max_ = Q3+1.5*(Q3-Q1)
    min_ = Q1-1.5*(Q3-Q1)
    
    if min_<0:
        min_ =0
    
    return max_, min_
复制代码

上記のコードは Tukey のテスト関数を実装しています。ここで、Q3 は 75 パーセンタイル、Q1 は 25 パーセンタイルです。また、min_ と max_ は妥当な値の範囲を形成し、この範囲外のデータは、高すぎても低すぎても、依然として外れ値となります。

なお、min_は負の数であり、消費量データを負にすることはできないため、0に変換する演算が追加される。

次に、RFM 特徴データ テーブルに「異常かどうか」フィールドを追加します。デフォルト値は 0 です。その後、テューキーのテスト関数を使用して異常なデータを 1 としてマークし、最後に値 0 のデータを保持するだけで済みます。 。

consume_df['是否异常'] = 0

for fea in rfm_features:
    max_, min_= turkeys_test(fea)
    outlet = consume_df[fea].between(min_,max_)  #bool
    consume_df.loc[~outlet,'是否异常']=1
    
consume_df = consume_df[consume_df['是否异常']==0]
复制代码

クラスタリングと 28 の原則 - RFM しきい値の計算

モデリングに使用される特徴が有効であることを確認できるようになったので、RFM モデリングの各指標のしきい値を計算する必要があります。しきい値の計算は通常、クラスタリング アルゴリズムによって実行されますが、ここでは機械学習アルゴリズムは関与しません。基本的に、クラスタリングの結果は通常、第 28 原則に準拠しています。つまり、重要な顧客グループは 20% のみを占める必要があるため、80 パーセンタイルを計算して RFM モデルのしきい値を近似できます。

M_threshold = consume_df['累计消费金额'].quantile(0.8)
F_threshold=consume_df['累计消费次数'].quantile(0.8)
R_threshold = consume_df['休眠天数'].quantile(0.2)
复制代码

RFMモデルの計算

RFMの閾値を取得すると、顧客のRFM特性を計算することができ、閾値を超えていれば1、閾値を下回っていれば0となります。 R値は休眠日数であり、値が大きいほど良好である。

consume_df['R'] = consume_df['休眠天数'].map(lambda x:1 if x<R_threshold else 0)
consume_df['F'] = consume_df['累计消费次数'].map(lambda x:1 if x>F_threshold else 0)
consume_df['M'] = consume_df['累计消费金额'].map(lambda x:1 if x>M_threshold else 0)
复制代码

顧客の RFM 特性を 1 と 0、つまり高値と低値に分割した後、グループ化計算を実行できます。

consume_df['RFM'] = consume_df['R'].apply(str)+'-' + consume_df['F'].apply(str)+'-'+ consume_df['M'].apply(str)

rfm_dict = {
    '1-1-1':'重要价值用户',
    '1-0-1':'重要发展用户',
    '0-1-1':'重要保持用户',
    '0-0-1':'重要挽留用户',
    '1-1-0':'一般价值用户',
    '1-0-0':'一般发展用户',
    '0-1-0':'一般保持用户',
    '0-0-0':'一般挽留用户'
}
consume_df['RFM人群'] = consume_df['RFM'].map(lambda x:rfm_dict[x])
复制代码

ここまでで、RFM モデリングとユーザー グループ化の計算が完了しました。

グループポートレート

モデルのグループ化が完了したら、グループごとの人数と客単価の分布を集計する必要があります。

人の割合

最も単純なプロファイル分析は、pd.Series.value_counts各民族グループの人数を数え、相対比率を分析することです。

rfm_analysis = pd.DataFrame(consume_df['RFM人群'].value_counts()).rename(columns={'RFM人群':'人数'})
rfm_analysis['人群占比'] = (rfm_analysis['人数']/rfm_analysis['人数'].sum()).map(lambda x:'%.2f%%'%(x*100))
复制代码

ピボットテーブル

各民族の客単価分布はPandasのパースペクティブ機能により多次元分析がpd.pivot_table可能

コードでは、pd.Series.nunique値の重複を排除するという意味の集計関数 aggfunc のメソッドを使用していますが、ここでは顧客 ID を重複排除して、価格帯ごとの顧客数をカウントしています。

pd.pivot_table(consume_df.reset_index(),    # DataFrame
        values='客户ID',    # 值
        index='RFM人群',    # 分类汇总依据
        columns='客单价区间',    # 列
        aggfunc=pd.Series.nunique,    # 聚合函数
        fill_value=0,    # 对缺失值的填充
        margins=True,    # 是否启用总计行/列
        dropna=False,    # 删除缺失
        margins_name='All'   # 总计行/列的名称
       ).sort_values(by='All',ascending=False)
复制代码

このようにして、異なる価格セグメントにおける各民族グループの分布を取得することができ、別の次元での肖像画の分析によりマーケティング戦略をさらに策定することができます。

逆ピボットテーブル

最後に、コケティッシュな操作を実行してみましょう。つまり、ピボット テーブルは多次元テーブルですが、ビジュアル分析のために PowerBI などのツールにインポートする場合は、ピボット テーブルを 1 次元テーブルに逆変換する必要がありますpd.melt

pivot_table.melt(id_vars='RFM人群',
                 value_vars=['(124.359, 3871.2]', '(3871.2, 7599.4]',
                             '(7599.4, 11327.6]', '(11327.6, 15055.8]',
                             '(15055.8, 18784.0]']).sort_values(by=['RFM人群','variable'],ascending=False)
复制代码

このように、「群集」、「インジケーター」、および「値」という名前のフィールドを含むテーブルは、情報を 1 行で表示できます。これは 1 次元のテーブルです以前の各民族グループの人口統計では、2 次元の表で行と列ごとに情報を見つける必要がありました。

終わり

これまでに、RFM モデルを確立し、Pandas を介してグループ化されたグループ ポートレート分析を実行し、ビジネス分析の要件を完了しました。

スペースの制限のため、この記事ではデータ分析プロセスで Pandas が頻繁に使用する関数メソッドのみを説明しますが、分析プロセス全体も同様に重要です。一部の機能に慣れていない場合は、学習を補うために Zhihu または検索エンジンを使用するよう生徒に勧めます。同時に、ビスケットブラザーWeChatを追加して議論することを歓迎します。

Pandas 関数の使用方法の詳細については、中国語のドキュメントを確認してください。

この記事はデータ分析プロセスの基本的な記事と言えますが、機械学習プロセスや特徴量エンジニアリングの内容を含む高度な記事をさらに構成し、ビジネス実装の方法でも紹介する予定です

おすすめ

転載: blog.csdn.net/weixin_73136678/article/details/128806368