土日祝日や、記録対象イベント 非発生日のデータ行が欠落して、日付の並びが不規則(不連続)な日次ログ・データの加工テクニック

  • 7
    Like
  • 0
    Comment
More than 1 year has passed since last update.

土日祝日や、記録対象イベントの発生しなかった日のデータ行が欠落していて、日付の並びが不規則(不連続)な日次ログ・データの加工テクニック

【処理結果】(行を一括挿入)「日付(YYYY-MM-DD) , 0 , NA, NULL , (SPACE), (TAB)」⇒ 365日切れ目のない年月日データ

(データ用途)

(1) 顧客行動の時系列推移グラフ

(2) 統計処理

・・・・・・等々、日付が不連続なデータだと、グラフの横軸 や 統計演算 にエラー や 誤差 が生じる場合

【データの例】



<データ期間> 1980年1月1日~2013年12月31日
<データ欠落日> 1980年1月4日, 1980年1月7日, 1980年1月8日,1980年1月9日・・・
 ※お正月休みの1/1~1/3の3日間と、土曜日・日曜日の1/4~1/5がログデータから欠落している。
 ※ほか、すべての土日祝日の年月日について、データが欠落している。
<データ形式> (1列目) YYYY-MM-DD , (2列目) 数値 ※カンマ区切り

【欠落行(欠落日のデータ行)を一括挿入する方法】

(1) Rにログデータを読み込む

(2) ダミーのデータ・マトリクスを作成する

(1列目:YYYY-MM-DD ※データ開始日~データ終了日まで、すべての年月日 
  2列目:任意の数字、文字列  ※ 0(ゼロ)、NA(not applicable)、NULLなど何でも良い。
    ⇒ 作業(5)で削除する。

(3) (1)で読み込んだデータと、(2)で作成したマトリクスを完全外部結合でマージする
     (関数:merge())

(4) マージした結果、以下のデータオブジェクトが生成される。
(1列目:YYYY-MM-DD ※データ開始日~データ終了日まで、すべての年月日
 2列目:0(ゼロ) または NA または NULL ※(2)で設定した値
 3列目(1): 元データ((1)で最初に読み込んだデータ)に存在していた日付行 ⇒ 元データの値
 3列目(2): 元データで欠けていた日付行 ⇒ NA (「NA」の2文字が、merge()関数によって、自動挿入される)

(5) 2列目は不要な行なので、削除する

(6) 必要に応じて、3列目のNA文字列を、0(数字のゼロ)や、任意の数値に一括置換する
(※ 時系列折れ線グラフなどのグラフを作成したり、時系列データ解析用の関数を実行する場合、
  NAが含まれているとエラーになる関数が多々あるため) 

【処理の流れ】(使用言語:R)

【処理1】Rにデータを読み込む。 

   (例)【読み込むファイル名】customer.csv / 【R上のデータオブジェクト名】 log_data) 

   log_data <- read.csv(' customer.csv ', header=F)

【処理2】ダミーのデータマトリクスの作成

   ダミーデータの1列目に格納するための日付文字列ベクトルを作成
    (※ データ開始日 ~ データ終了日 まで、途中、欠落日のない日付ベクトル)

   str()関数で、データの開始日と終了日を確認する。
   str(log_data)

   seq()関数で、log_dataの「データ開始日~データ終了日」まで、途中、欠落日のない日付ベクトルを作成する。
        (例) データオブジェクト名:hiduke データ開始日:1980年1月1日 / データ終了日: 2013年12月31日
   hiduke <- seq(as.Date("1980-01-01"), as.Date("2013-12-31"), by="days")

   オブジェクトのデータ型をcharacter型に型変換
   hiduke <- as.character(hiduke)

   ダミー・データマトリクスの行数(=データの全日数)を算出
   rownum <- length(hiduke)

   ダミー・データマトリクスの作成
   dummy <- matrix(nrow=rownum,ncol=2)

   日付データを格納できるように、matrix型からdataframe型にデータ型を変換
   dummy <- as.data.frame(dummy)

   作成したダミー・データマトリクスの1列目に、hidukeベクトルを格納
   dummy[, 1] <- hiduke

   ダミー・データに、適当な列名をつける。
   colnames(dummy) <- c("date", "dummy_value")

   【処理1】で読み込んだ元データにも、適当な列名をつける。 
   ※このとき、日付が格納されている1列目の列名を、ダミーデータの1列目(日付列)と同じ列名にする。
   colnames(log_data) <- c("date","value")

【処理3】元データ を ダミーデータ とデータ結合させる。 
   (例)【結合データのオブジェクト名】log_data_edited

   log_data_edited <- merge(dummy, log_data, by="date",all=T) 

   ※by="date"で、date列での結合を指定 
   ※all=Tで、log_dataとdummyデータのうち、片方にしか存在しないデータ行(日付行)を、結合の結果 作成されるデータオブジェクトに含めることを指定 
     ⇒ ここで、元データに欠落していた日付行が、dummyデータと結合される過程で、挿入される。

【処理4】2列目( dummy_value列 ) は不要な列なので、列全体を削除する

   log_data_edited <- log_data_edited[ ,-2]  
   ※log_data_edited[ , -(マイナス)2]で、log_data_editedから2列目を削除したデータを、log_data_editedに格納している。

【処理5】 必要に応じて、3列目のNA文字列を、0(数字のゼロ)や、任意の数値に一括置換する。

   log_data_edited[is.na(log_data_edited)] <- 0

   ※log_data_edited[is.na(log_data_edited)] で、log_data_editedのなかでNAのデータ箇所が選択される。
   ⇒ それらのデータ箇所に、0(ゼロ)を代入している。

【データ整形 完了!】

完成したデータ

 <データ期間> 1980年1月1日~2013年12月31日
 <データ欠落日> なし
 <データ形式> (1列目) YYYY-MM-DD , (2列目) 数値  ※カンマ区切り