データの重複

まだデータの確認をしてる段階ですが、trainデータに重複を見つけたので共有します。(sampleコードはR)

きっかけ

以下のようにgameIDごとのレコード数を確認した際、gameID: 20202116~20202127のレコード数が600前後と非常に多いことに気付きました。1試合あたりの投球数は平均300程度(ドメイン知識)と考えると、ちょうど2倍の値となってるので重複してるのではと思いました。

train %>% 
  group_by(gameID) %>% 
  summarise(count = n())
     gameID count
      <dbl> <int>
 1 20202116   600
 2 20202117   638
 3 20202118   486
 4 20202119   580
 5 20202121   600
 6 20202122   556
 7 20202123   592
 8 20202124   624
 9 20202125   630
10 20202126   608
11 20202127   614            
12 20202128   270            
13 20202129   304            
14 20202130   374            
15 20202131   270            
16 20202132   313            
17 20202133   295            
18 20202134   301            
19 20202135   254            
20 20202136   290    
(以下略)

重複データの確認

確認のため、gameID == 20202116 & inning == "1回表"のレコードを見てみると、1~16と17~32行目でid以外同じデータとなっていることがわかります。ここでは見やすくするため一部のカラムに絞ってますが、他のカラムも同じ値が入ってました。

train %>% 
  filter(gameID == 20202116 & inning == "1回表") %>% 
  select(id, totalPitchingCount, pitcher, batter, y)
      id totalPitchingCount pitcher   batter        y
   <dbl>              <dbl> <chr>     <chr>     <dbl>
 1 16274                  1 高橋 光成 中川 圭太     0
 2 16275                  2 高橋 光成 中川 圭太     0
 3 16276                  3 高橋 光成 中川 圭太     1
 4 16277                  4 高橋 光成 中川 圭太     3
 5 16278                  1 高橋 光成 安達 了一     0
 6 16279                  2 高橋 光成 安達 了一     1
 7 16280                  3 高橋 光成 安達 了一     3
 8 16281                  1 高橋 光成 吉田 正尚     0
 9 16282                  2 高橋 光成 吉田 正尚     0
10 16283                  3 高橋 光成 吉田 正尚     0
11 16284                  4 高橋 光成 吉田 正尚     1
12 16285                  5 高橋 光成 吉田 正尚     0
13 16286                  1 高橋 光成 ジョーンズ    0
14 16287                  2 高橋 光成 ジョーンズ    1
15 16288                  3 高橋 光成 ジョーンズ    1
16 16289                  4 高橋 光成 ジョーンズ    2
17 19538                  1 高橋 光成 中川 圭太     0
18 19539                  2 高橋 光成 中川 圭太     0
19 19540                  3 高橋 光成 中川 圭太     1
20 19541                  4 高橋 光成 中川 圭太     3
21 19542                  1 高橋 光成 安達 了一     0
22 19543                  2 高橋 光成 安達 了一     1
23 19544                  3 高橋 光成 安達 了一     3
24 19545                  1 高橋 光成 吉田 正尚     0
25 19546                  2 高橋 光成 吉田 正尚     0
26 19547                  3 高橋 光成 吉田 正尚     0
27 19548                  4 高橋 光成 吉田 正尚     1
28 19549                  5 高橋 光成 吉田 正尚     0
29 19550                  1 高橋 光成 ジョーンズ    0
30 19551                  2 高橋 光成 ジョーンズ    1
31 19552                  3 高橋 光成 ジョーンズ    1
32 19553                  4 高橋 光成 ジョーンズ    2
対処法

Rならdplyrのdistinct関数、pythonならpandasのdrop_duplicates関数あたりを使って素直に重複削除するのがいいと思います。id以外をキーにすれば問題なく重複削除できると思います。

Aws4 request&x amz signedheaders=host&x amz signature=7553ea0cc77c2d97cf222201c0601417d5dfad05b2bc75480027c45872019e1d
Quvotha-nndropout100

有用なご指摘をありがとうございます。

私も train_data.csv と test_data.csv を対象にデータの重複について検証してみました。各ファイルについて id 以外の列をキーとみなした場合、データの重複は train_data.csv にのみ存在しているようです。3264行が2回ずつ登場していると思われます。

以下、検証用のスニペットです。前提ですがスニペットの実行前に import pandas as pd し、train_data.csv, test_data.csv を pd.read_csv() で読み込んだ結果を train, test の変数に格納しています。

# collect duplication
rows_duplicated = pd.DataFrame()  # store duplication here
for fold, df in zip(['train', 'test'], [train, test]):
    key_columns = [c for c in df.columns if c != 'id']  # all columns except for `id`
    rows_duplicated_ = df.copy()[df.duplicated(subset=key_columns, keep=False)]
    if rows_duplicated_.shape[0] < 1:
        continue
    else:
        rows_duplicated_['Fold'] = fold  # "train" or "test"
        rows_duplicated = pd.concat([rows_duplicated, rows_duplicated_], axis=0)
display(rows_duplicated.Fold.value_counts())

# count number of duplications
key_columns = [c for c in rows_duplicated.columns if c != 'id']  # all columns except for `id`
rows_duplicated['NRows'] = rows_duplicated.groupby(key_columns).transform('count')  # Number of duplications
display(rows_duplicated['NRows'].describe())

# show samples
rows_duplicated.sort_values(['Fold', 'gameID', 'inning', 'O', 'pitcher', 'batter', 'totalPitchingCount', 'id'], inplace=True)
rows_duplicated[['id', 'totalPitchingCount', 'B', 'S', 'O', 'b1', 'b2', 'b3', 'pitcher', 'batter', 'gameID', 'inning']]

実行すると train_data.csv, test_data.csv それぞれについて、 id を除く全ての列をキーとみなした時に重複していると判定された行が rows_duplicated に格納されるはずです。rows_duplicated の中身を確認した結果は以下の通りでした。

  • 行数は6528でした
  • rows_duplicated.Fold の値は全て "train" でした
  • rows_duplicated['NRows'].describe() で出力した NROWS の要約統計量は次の通りでした。
    count 1096.000
    mean 2.000
    std 0.000
    min 2.000
    25% 2.000
    50% 2.000
    75% 2.000
    max 2.000
Favicon
new user
コメントするには 新規登録 もしくは ログイン が必要です。