東日本大震災の避難者数の統計を調べる

 件の統計は復興庁の全国の避難者の数(所在都道府県別・所在施設別の数にあるが,このページはトップページから辿ることができず,検索からのみ到達できる.時系列でのデータは必須と思われるが,トップページから辿れるのは最新の情報のみであり,これは国民の利益に反する.

ファイル構造がマシンリーダブルでない

 何度か指摘しているが,テーブル構造になっておらず,第一正規形ですらないデータ構造は害悪である.ざっと見ただけでも,セル内改行,配列構造,データ型の不一致などデータクレンジングを要する不良ファイルである.

 ひどいファイルになると列のズレもあり,パワークエリで一挙に読み込むことができず,ページごとの読み込みを強いられる.政府は早急に修復すべきである.

PDFファイルはもう退役させるべき

 Microsoft EXCEL の Power Query には PDF ファイルを読み込む機能が付いているが,このようなデジタルデータにおける車輪の再発明はもう辞めにして,最初からEXCELのブック形式で置いておけば良いと思う.

統計表における機械判読可能なデータ作成に関する表記方法

 総務省が「統計表における機械判読可能なデータ作成に関する表記方法」でマシンリーダブルなファイルの記述方法を推奨しているので,これに従うべきである.

担当者と不良ファイルとの関係

 ふと,担当者の配置転換と不良ファイルとの関連があるのではないかと仮説を立てた.以下,135件のファイルの判定結果と担当者を列記する.135件中,不良ファイル数は25件であった.

 「不可」とはファイル内にテーブルが存在せず,データを読み込むことができないという意味である.

 「不良」とはファイル内にテーブルは存在し,読み込めるページもあるが,読み込めないページが存在し,データに欠損のある状態のことである.

 「可」とはファイル内にテーブルが存在し,すべてのデータが読み込める状態のことである.

日付 成否 担当者
平成23年7月28日 清水,品田
平成23年8月11日 清水,品田,小室,勝田
平成23年8月25日 清水,品田,小室,勝田
平成23年9月8日 清水,品田,小室,勝田
平成23年9月22日 清水,品田,小室,勝田
平成23年10月6日 清水,品田,小室,勝田
平成23年10月20日 清水,品田,小室,勝田
平成23年11月2日 清水,品田,小室,勝田
平成23年11月17日 清水,品田,小室,勝田
平成23年12月1日 清水,品田,小室,勝田
平成23年12月15日 清水,品田,小室,勝田
平成24年1月12日 清水,小室,品田
平成24年1月26日 清水,小室,品田
平成24年2月9日 清水,小室,品田
平成24年2月23日 清水,小室,品田
平成24年3月8日 不可 清水,小室,品田
平成24年3月22日 清水,小室,品田
平成24年4月5日 小室,河原,品田
平成24年5月10日 小室,河原,品田
平成24年6月7日 小室,河原,品田
平成24年7月5日 小室,河原,品田
平成24年8月2日 小室,河原,品田
平成24年9月6日 森,小室,河原
平成24年10月4日 森,小室,河原
平成24年11月1日 森,小室,河原
平成24年12月6日 森,河原,新免
平成25年1月17日 森,河原,新免
平成25年2月7日 森,河原,新免
平成25年3月7日 森,河原,新免
平成25年4月4日 森,河原,粟津
平成25年5月9日 森,河原,粟津
平成25年6月6日 森,河原,粟津
平成25年7月4日 森,小野山,粟津
平成25年8月12日 森,小野山,粟津
平成25年9月12日 森,小野山,粟津
平成25年10月10日 森,小野山,粟津
平成25年11月14日 森,小野山,粟津
平成25年12月12日 森,小野山,粟津
平成26年1月16日 森,小野山,粟津
平成26年2月13日 森,小野山,粟津
平成26年3月13日 森,小野山,粟津
平成26年4月10日 森,小野山,粟津
平成26年5月15日 森,小野山,粟津
平成26年6月12日 森,小野山,粟津
平成26年7月10日 諏訪,小野山,粟津
平成26年8月14日 不良 諏訪,小野山,粟津
平成26年9月11日 諏訪,小野山,粟津
平成26年10月16日 諏訪,小野山,粟津
平成26年11月13日 諏訪,小野山,粟津
平成26年12月11日 諏訪,小野山,粟津
平成27年1月15日 諏訪,小野山,粟津
平成27年2月12日 不良 諏訪,小野山,粟津
平成27年3月12日 諏訪,小野山,粟津
平成27年4月16日 小野山,北中
平成27年5月14日 小野山,北中
平成27年6月11日 小野山,北中
平成27年7月16日 小野山,北中
平成27年8月13日 小野山,北中
平成27年9月10日 小野山,北中
平成27年10月8日 小野山,北中
平成27年11月12日 小野山,北中
平成27年12月10日 小野山,北中
平成28年1月14日 小野山,北中
平成28年2月12日 小野山,北中
平成28年3月10日 小野山,北中
平成28年4月14日 小野山,沼尾
平成28年5月16日 小野山,沼尾
平成28年6月10日 西山,沼尾
平成28年7月14日 西山,沼尾
平成28年8月12日 西山,沼尾
平成28年9月12日 西山,沼尾
平成28年10月13日 西山,沼尾
平成28年11月10日 西山,沼尾
平成28年12月9日 西山,沼尾
平成29年1月16日 西山,沼尾
平成29年2月13日 不可 西山,沼尾
平成29年3月13日 不可 西山,沼尾
平成29年4月13日 不良 篠原,沼尾
平成29年5月16日 篠原,沼尾
平成29年6月16日 不可 篠原,沼尾
平成29年7月14日 篠原,沼尾
平成29年8月17日 篠原,沼尾
平成29年9月14日 篠原,沼尾
平成29年10月12日 篠原,沼尾
平成29年11月13日 篠原,沼尾
平成29年12月12日 篠原,沼尾
平成30年1月16日 篠原,菅原
平成30年2月13日 篠原,菅原
平成30年3月15日 篠原,沼尾
平成30年4月12日 篠原,菅原
平成30年5月17日 篠原,菅原
平成30年6月14日 篠原
平成30年7月12日 篠原,小町
平成30年8月13日 不可 南,小町
平成30年9月11日 不可 南,小町
平成30年10月12日 不可 南,小町
平成30年11月12日 不可 南,小町
平成30年12月11日 南,小町
平成31年1月10日 南,小町
平成31年2月7日 不可 南,小町
平成31年3月11日 南,小町
平成31年4月9日 南,小町
令和1年5月14日 南,小町
令和1年6月11日 南,小町
令和1年7月10日 南,小町
令和1年8月9日 南,小町
令和1年9月6日 南,小町
令和1年10月9日 南,小町
令和1年11月12日 不可 南,小町
令和1年12月9日 南,小町
令和2年1月14日 南,小町
令和2年2月10日 南,小町
令和2年3月11日 南,小町
令和2年4月9日 不良 栗原,濱田
令和2年7月9日 不良 栗原,濱田
令和2年8月11日 不良 栗原,濱田
令和2年9月9日 不良 栗原,濱田
令和2年10月12日 不良 栗原,濱田
令和2年11月11日 不可 栗原,濱田
令和2年12月8日 不良 栗原,濱田
令和3年1月13日 栗原,濱田
令和3年2月8日 栗原,濱田
令和3年3月10日 栗原,濱田
令和3年4月9日 不可 浮地,濱田
令和3年5月12日 不可 浮地,濱田
令和3年6月9日 不可 浮地,濱田
令和3年7月8日 不可 矢野,濱田
令和3年8月11日 矢野,濱田
令和3年9月9日 不可 矢野,濱田
令和3年10月8日 矢野,濱田
令和3年11月11日 矢野,濱田
令和3年12月9日 矢野,濱田
令和4年1月12日 矢野,濱田
令和4年2月8日 矢野,濱田
令和4年3月9日 矢野,濱田

 担当チームによりファイルの不良率が異なるのが分かる.人事異動により業務の引継ぎが必要なのは理解できるが,引継ぎ後,何度も不良ファイルを公開し続けているのは流石にどうかと思う.

コード

 文句を言っていても仕方がない.今回はかなり泥臭く手動でのデータ入力を要した.データの真実性は保証できないため,コードと結果のみを示すこととする.

Option Explicit

Sub AddCharts()

Dim mySht1          As Worksheet
Dim myCht           As Chart
Dim i               As Long

Dim mySht2          As Worksheet
Dim myPref_M        As ListObject
Dim myPrefCode      As String
Dim myPref          As String

Set mySht2 = Worksheets("都道府県マスタ")
Set myPref_M = mySht2.ListObjects(mySht2.ListObjects.Count)

Dim mySht3          As Worksheet
Dim myTransaction   As ListObject

Set mySht3 = Worksheets("前期")
Set myTransaction = mySht3.ListObjects(mySht3.ListObjects.Count)

Dim myDate()        As Date
Dim myPopulationA() As Long
Dim myPopulationB() As Long
Dim myPopulationC() As Long
Dim myPopulationD() As Long
Dim myPopulationS() As Long
Dim mySeriesA       As Series
Dim mySeriesB       As Series
Dim mySeriesC       As Series
Dim mySeriesD       As Series
Dim mySeriesS       As Series

Dim myRng1          As Range
Dim myRng2          As Range
Dim j               As Long

Dim myAxis          As Axis
Dim myChtGrp        As ChartGroup

Set mySht1 = Worksheets.Add
With mySht1
    .Name = "都道府県チャート前期"
    For i = 1 To 47
        Set myCht = .Shapes.AddChart2(Style:=-1, _
                                XlChartType:=xlColumnStacked, _
                                       Left:=400 * ((i - 1) Mod 6), _
                                        Top:=400 * ((i - 1) \ 6), _
                                      Width:=400, _
                                     Height:=400).Chart
        myPrefCode = i
        myPref = myPref_M.ListRows(i).Range(1)
        'Debug.Print myPref
        
        With myTransaction
            '都道府県名でトランザクションテーブルにフィルターをかける
            .Range.AutoFilter field:=1, Criteria1:=myPref
            
            Set myRng1 = Intersect(.DataBodyRange, .Range.SpecialCells(Type:=xlCellTypeVisible))
            'Debug.Print myRng1.Rows.Count
            
            For j = 0 To myRng1.Rows.Count - 1
                
                'Debug.Print j
                ReDim Preserve myDate(j)
                ReDim Preserve myPopulationA(j)
                ReDim Preserve myPopulationB(j)
                ReDim Preserve myPopulationC(j)
                ReDim Preserve myPopulationD(j)
                ReDim Preserve myPopulationS(j)
                
                myDate(j) = myRng1.Cells(j + 1, 3)
                myPopulationA(j) = myRng1.Cells(j + 1, 4)
                myPopulationB(j) = myRng1.Cells(j + 1, 5)
                myPopulationC(j) = myRng1.Cells(j + 1, 6)
                myPopulationD(j) = myRng1.Cells(j + 1, 7)
                myPopulationS(j) = myRng1.Cells(j + 1, 8)
                
            Next j
            
            Set mySeriesA = myCht.SeriesCollection.NewSeries
            Set mySeriesB = myCht.SeriesCollection.NewSeries
            Set mySeriesC = myCht.SeriesCollection.NewSeries
            Set mySeriesD = myCht.SeriesCollection.NewSeries
            'Set mySeriesS = myCht.SeriesCollection.NewSeries
            
            With mySeriesA
                .Name = myTransaction.HeaderRowRange(4)
                .XValues = myDate
                .Values = myPopulationA
            End With
            With mySeriesB
                .Name = myTransaction.HeaderRowRange(5)
                .XValues = myDate
                .Values = myPopulationB
            End With
            With mySeriesC
                .Name = myTransaction.HeaderRowRange(6)
                .XValues = myDate
                .Values = myPopulationC
            End With
            With mySeriesD
                .Name = myTransaction.HeaderRowRange(7)
                .XValues = myDate
                .Values = myPopulationD
            End With
           'With mySeriesS
           '    .Name = myTransaction.HeaderRowRange(8)
           '    .XValues = myDate
           '    .Values = myPopulationS
           'End With
            
            'ループ内でフィルターを使った後はフィルターを解除する
            .Range.AutoFilter field:=1
        End With
        'ここまではデータ系列の設定
        
        With myCht
            
            .HasTitle = True
            .ChartTitle.Caption = myPref
            .ChartTitle.Left = 0
            
            Set myAxis = .Axes(xlCategory)
            With myAxis
                .Format.Line.Visible = msoFalse
                .MajorGridlines.Format.Line.Visible = msoFalse
                .TickLabels.Orientation = xlUpward
            End With
            Set myAxis = .Axes(xlValue)
            With myAxis
                Select Case .MaximumScale
                Case 0 To 1000
                    .MaximumScale = 1000
                Case 1001 To 1250
                    .MaximumScale = 1250
                Case 1251 To 1500
                    .MaximumScale = 1500
                Case 1501 To 2500
                    .MaximumScale = 2500
                Case 2501 To 5000
                    .MaximumScale = 5000
                Case 5001 To 10000
                    .MaximumScale = 10000
                Case 10001 To 12500
                    .MaximumScale = 12500
                Case 12501 To 15000
                    .MaximumScale = 15000
                Case 15001 To 25000
                    .MaximumScale = 25000
                Case 25001 To 50000
                    .MaximumScale = 50000
                Case 50001 To 100000
                    .MaximumScale = 100000
                Case 100001 To 125000
                    .MaximumScale = 125000
                Case 125001 To 150000
                    .MaximumScale = 150000
                Case Else
                End Select
                .MajorUnit = .MaximumScale / 5
                .MajorGridlines.Format.Line.Visible = msoFalse
            End With
            With .ChartArea
                '.Format.Fill.ForeColor.ObjectThemeColor = msoThemeColorBackground1
                .Format.TextFrame2.TextRange.Font.Name = "TimesNewRoman"
            End With
            .ChartGroups(1).GapWidth = 0    
        End With
    Next i
End With
End Sub

結果

 2014年1月16日を境として前期と後期に分類した.テーブルの定義がここで変わっているため,どうやっても結合できないのである.

前期

東日本大震災避難者数前期
東日本大震災避難者数前期

後期

東日本大震災避難者数後期
東日本大震災避難者数後期

まとめ

 東日本大震災の避難者数の推移を各都道府県ごとにグラフに示した.

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください