【Python初心者でも分かる】データサイエンティスト協会の100本ノック|データサンプリング

スポンサーリンク
Python
【初心者必見】プログラミング言語Pythonでできること5選
プログラミング言語の一つであるPythonはコードが理解しやすく、いろんな用途に使える汎用性があります。ですので、全くの初心者にもおすすめしているサイトが多いです。 ここで改めて、Pythonを勉強したい人やデータ分析、AI開発をして...
初心者に人気のプログラミング言語Pythonは独学可能か?
Pythonは非常に人気のあるプログラミング言語で、まったくの初心者でも独学が可能と言われています。 Pythonはさまざまな目的に使える、汎用性のあるプログラミング言語です。 プログラミングは「独学が難しい」と言われていま...

データサイエンティスト協会の100本ノックがGitHubに公開しているデータとPythonコードを初心者にでも分かるように解説していきます。

今回は75~78本です。内容は主に、データから新たなデータを作成する「データのサンプリング方法」について解説していきます。

Pythonの環境設定は以下の記事を参考にして下さい。

【2021年最新】M1 mac でanacondaをインストールする方法

【2021年最新】WindowsでAnacondaをインストールする方法

データのサンプリング方法

まずは、以下からダウンロードして下さい。

GitHubからデータをダウンロードする方法

P-075: 顧客データフレーム(df_customer)からランダムに1%のデータを抽出し、先頭から10件データを抽出せよ。

import pandas as pd
df_customer = pd.read_csv("customer.csv")

df_customer.sample(frac=0.01).head(10)

出力:

samplt() 内の引数である、frac= に抽出したい割合を指定することで、一部のデータを抽出できます。ここでは、ランダムにデータが抽出されるため、出力結果のデータは毎回違うデータになりますが、割合は同じです。

P-076: 顧客データフレーム(df_customer)から性別(gender_cd)の割合に基づきランダムに10%のデータを層化抽出データし、性別ごとに件数を集計せよ。

from sklearn.model_selection import train_test_split

_, df_76 = train_test_split(df_customer,                       # 分割するデータを指定
                            test_size=0.1,                     # 分割する割合を指定
                            stratify=df_customer["gender_cd"], # 分割前後でも同じ割合となる変数を指定
                            random_state=1)                    # 再現性があるようにランダムを指定
df_76.groupby("gender_cd").agg({"customer_id":"count"})

出力:

train_test_split は機械学習の分野では必ず使うものです。

ここでは、単純なデータの分割として使用します。

データの数を確認してみましょう。

もとのデータ(df_customer)、もとのデータの10%(df_76)、残りのデータび90%(_)

10%と90%に分割できていることが確認できます。

P-077: レシート明細データフレーム(df_receipt)の売上金額(amount)を顧客単位に合計し、合計した売上金額の外れ値を抽出せよ。ただし、顧客IDが”Z”から始まるのものは非会員を表すため、除外して計算すること。なお、ここでは外れ値を平均から3σ以上離れたものとする。結果は10件表示させれば良い。

from sklearn import preprocessing
df_receipt = pd.read_csv("receipt.csv")

df_77 = df_receipt.query("not customer_id.str.startswith('Z')",engine="python").\
    groupby("customer_id").amount.sum().reset_index()
df_77["amount_ss"] = preprocessing.scale(df_77["amount"])    # "amount"を標準化
df_77.query("abs(amount_ss)>=3").head(10)

出力:

最初の2行は “customer_id” に “Z” が付いている非会員を除去しています。

そして、df_77[“amount”] を標準化(平均値:0、標準偏差:1)します。そのデータの絶対値が3以上(3以上、−3以下)のデータを外れ値と設定して表示させています。

P-078: レシート明細データフレーム(df_receipt)の売上金額(amount)を顧客単位に合計し、合計した売上金額の外れ値を抽出せよ。ただし、顧客IDが”Z”から始まるのものは非会員を表すため、除外して計算すること。なお、ここでは外れ値を第一四分位と第三四分位の差であるIQRを用いて、「第一四分位数-1.5×IQR」よりも下回るもの、または「第三四分位数+1.5×IQR」を超えるものとする。結果は10件表示させれば良い。

import numpy as np

df_78 = df_receipt.query("not customer_id.str.startswith('Z')",engine="python").\
    groupby("customer_id").agg({"amount":"sum"}).reset_index()

pct_25 = np.percentile(df_78["amount"],q=25)  # 第一四分位数(25パーセンタイル)
pct_75 = np.percentile(df_78["amount"],q=75)  # 第三四分位数(75パーセンタイル)
iqr = pct_75 - pct_25           # 四分位範囲(第一四分位数から第三四分位数の範囲)
amount_low = pct_25-(iqr*1.5)
amount_hight = pct_75+(iqr*1.5)
df_78.query("amount < @amount_low or @amount_hight < amount").head(10)

出力:

この問題も外れ値の除去を行いますが、外れ値の設定が全問と違います。

今回の外れ値は、「第一四分位数-1.5×IQR」よりも下回るもの、または「第三四分位数+1.5×IQR」を超えるものですので、まずは、第一四分位数(pct_25)と第三四分位数(pct_75)を設定します。

そのデータから四分位範囲を設定します。(iqr)

さらに、外れ値の基準として最低値(amount_low)と最高値(amount_hight)を指定します。

そして、その値を使って外れ値を表示させています。

では外れ値の基準としている値を確認してみましょう。

print(amount_low,"~",amount_hight)

出力:
-4104.0 ~ 8302.0

つまり、P-078 の出力結果で表示されている “amount” は、−4104.0 から 8302.0 の間の値になっていることになります。

この外れ値の設定は少しややこしいですが、一般的な箱ひげ図では、この基準で外れ値を表していることが多いです。箱ひげ図の描き方

データサイエンティスト協会の100本ノックを解説|ダウンロードから読み込みまで

データサイエンティスト協会の100本ノックを解説|データの抽出

データサイエンティスト協会の100本ノックを解説|変数の一部を使ってデータを抽出する

データサイエンティスト協会の100本ノックを解説|ソート(順序で整列)

データサイエンティスト協会の100本ノックを解説|グループ分け

データサイエンティスト協会の100本ノック|新たなデータフレームの作成

データサイエンティスト協会の100本ノック|日付データ

データサイエンティスト協会の100本ノック|特徴量エンジニアリング

データサイエンティスト協会の100本ノック|変数を整える

データサイエンティスト協会の100本ノック|小数点の処理

データサイエンティスト協会の100本ノック|時系列データの処理

コメント

タイトルとURLをコピーしました