時系列データのfitting (データの前処理#2)

データの前処理#1の続き

Rを用いて表データを列データに変換する
今回は主にpivot_longer関数を使用する

現状:表は縦方向に都道府県名,横方向に年月かつ性別となっているので,横方向にflagが2つ入っている状態

対応:年月+性別をひとつのみなし,最後に分割する

備考:今回はデータを加工できるのかを確かめることが主目的なので,1920-1923年のデータで行う(1945年以降の沖縄のデータが穴抜けなので処理が増えるのを避ける)

1. csvファイルに対して前処理を行う
列名はexcelで = 年&”_”&性別 を使って処理
(上の部分だけ抜粋する)

Prefectures 1920_Male 1920_Female 1920_Sex ratio 1921_Male 1921_Female 1921_Sex ratio
Japan 28,044 27,919 100.4 28,411.70 28,254.20 100.6
Hokkaido 1,244 1,115 111.6 1,255.60 1,130.30 111.1
Aomori-ken 381 375 101.6 386.4 381 101.4


2. データの読み込み

library(tidyr)
library(dplyr)

rm(list=ls())
setwd() #生データと同じフォルダ
df <- read.csv("rowdata_都道府県別人口推移.csv")
df <- df[,1:13] #1920-1923年まで

#カンマの排除###################

k <- 1
l <- 1

for(k in 1:13){
  for(l in 1:48){
  df[l,k] <- sub(",","",df[l,k])
  
  l <- l+1
  }
  k <- k+1
}

summary(df)
#################################

結果

> summary(df)
 Prefectures         X1920_Male        X1920_Female       X1920_Sex.ratio     X1921_Male       
 Length:48          Length:48          Length:48          Length:48          Length:48         
 Class :character   Class :character   Class :character   Class :character   Class :character  
 Mode  :character   Mode  :character   Mode  :character   Mode  :character   Mode  :character  
 X1921_Female       X1921_Sex.ratio     X1922_Male        X1922_Female       X1922_Sex.ratio   
 Length:48          Length:48          Length:48          Length:48          Length:48         
 Class :character   Class :character   Class :character   Class :character   Class :character  
 Mode  :character   Mode  :character   Mode  :character   Mode  :character   Mode  :character  
  X1923_Male        X1923_Female       X1923_Sex.ratio   
 Length:48          Length:48          Length:48         
 Class :character   Class :character   Class :character  
 Mode  :character   Mode  :character   Mode  :character  

3. データの型変換

ver <- df %>% names() %>% print()
ver <- ver[-1] %>% print()

df[,ver] <- lapply(df[,ver],as.numeric)
summary(df)

全て数値型に変換完了

> summary(df)
 Prefectures          X1920_Male     X1920_Female     X1920_Sex.ratio    X1921_Male     
 Length:48          Min.   :  223   Min.   :  232.0   Min.   : 92.60   Min.   :  224.9  
 Class :character   1st Qu.:  355   1st Qu.:  367.5   1st Qu.: 96.17   1st Qu.:  355.4  
 Mode  :character   Median :  518   Median :  533.0   Median : 98.15   Median :  522.0  
                    Mean   : 1168   Mean   : 1163.2   Mean   : 99.15   Mean   : 1183.8  
                    3rd Qu.:  684   3rd Qu.:  700.0   3rd Qu.:100.80   3rd Qu.:  693.9  
                    Max.   :28044   Max.   :27919.0   Max.   :111.80   Max.   :28411.7  
  X1921_Female     X1921_Sex.ratio    X1922_Male       X1922_Female     X1922_Sex.ratio 
 Min.   :  234.5   Min.   : 92.60   Min.   :  226.4   Min.   :  236.4   Min.   : 92.60  
 1st Qu.:  367.4   1st Qu.: 96.38   1st Qu.:  356.3   1st Qu.:  366.6   1st Qu.: 96.47  
 Median :  538.5   Median : 98.20   Median :  525.6   Median :  542.6   Median : 98.55  
 Mean   : 1177.3   Mean   : 99.24   Mean   : 1200.0   Mean   : 1191.3   Mean   : 99.38  
 3rd Qu.:  708.6   3rd Qu.:101.00   3rd Qu.:  701.1   3rd Qu.:  711.5   3rd Qu.:101.12  
 Max.   :28254.2   Max.   :112.00   Max.   :28799.7   Max.   :28590.3   Max.   :112.70  
   X1923_Male       X1923_Female     X1923_Sex.ratio 
 Min.   :  228.2   Min.   :  238.4   Min.   : 92.70  
 1st Qu.:  360.3   1st Qu.:  369.7   1st Qu.: 96.72  
 Median :  536.1   Median :  552.2   Median : 98.65  
 Mean   : 1215.7   Mean   : 1205.9   Mean   : 99.50  
 3rd Qu.:  702.4   3rd Qu.:  723.9   3rd Qu.:101.62  
 Max.   :29176.9   Max.   :28942.3   Max.   :112.70  

4. pivot_longerを用いた表→列データ変換
nameにはまずはyear_sexで入れて,後から,”_”での列の分割を行う
使う関数:pivot_longer(), separate()
備考:cols = データのある列を指定 name_to = flag名 name_prefixed = 先頭についてしまっているXを無視する

df2 <- df %>% pivot_longer(
  cols = -Prefectures,
  names_to = c("year_Sex"),
  names_prefix = "X"
  
)
df2 <- df2 %>% separate(year_Sex,c("year","sex"), sep="_")
df2$year <- as.numeric(df2$year)
head(df2)

結果

> head(df2)
# A tibble: 6 × 4
  Prefectures  year sex        value
  <chr>       <dbl> <chr>      <dbl>
1 Japan        1920 Male      28044 
2 Japan        1920 Female    27919 
3 Japan        1920 Sex.ratio   100.
4 Japan        1921 Male      28412.
5 Japan        1921 Female    28254.
6 Japan        1921 Sex.ratio   101.


左3列のフラグに対する人口を対応させることができた
このデータの状態で散布図にplotする