裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

センター試験の「平均寿命」データについて

2020年01月25日 | ブログラミング

ある意味,インパクトのあるデータだったのか

> 大阪府西成区(P10の最小値)のヤバさが数字ではっきり出ちゃってますね

> 昨日のセンター試験数学「男の市区町村別平均寿命の箱ひげ図」で最小値が極端に小さいP10は大阪府(大阪市西成区73.5)か

> それはそうと、大阪の異常に平均寿命の短い市町村区はなんなんでしょう...

のようないくつかの反応があるようですが,二番目に衝撃的(?)だった神奈川県については誰も何も言っていないのかな?

神奈川県での平均寿命ワーストは「神奈川県川崎市川崎区 男 78.2」,「神奈川県横浜市中区 男 78.5」ですね。第三位の「神奈川県横浜市南区 男 80」よりも格段に低いです。

ある意味,大阪市西成区と同じような特性を持っているところかもしれません(曖昧に述べておきます)。
かなり前に,簡易宿泊所の火災で多くの人命が犠牲になったというニュースが記憶に残っています。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

データスクレイピング,python だったらもっと簡単?

2020年01月25日 | ブログラミング

xlrd は,セルごとに文字列か数値かを判断して読み込んでくれたり,R では空セルも列のタイプによって NA だったり だったりだが,この関数では空セルは '' になる。
というように,R での読み込み関数より扱いやすい。

# https://www.e-stat.go.jp/stat-search/file-download?statInfId=000031693271&fileKind=0
# 図表データのダウンロード
# ファイル名: ckts-lifetable2015.xlsx
# 生命表1〜生命表7 が該当
# 7 列目が「平均余命」の 1 行前の 2 列目が「都道府県名+市区町村名」
# 3,25 行目先の 7 列目が目的値(男,女)

import pandas as pd
import xlrd

seireisi = ['札幌市', '仙台市', 'さいたま市', '千葉市', '東京都区部',
            '横浜市', '川崎市', '相模原市', '新潟市', '静岡市', '浜松市',
            '名古屋市', '京都市', '大阪市', '堺市', '神戸市', '岡山市',
            '広島市', '北九州市', '福岡市', '熊本市']

input_file = 'ckts-lifetable2015.xlsx'
output_file = 'all-python.csv'

wb = xlrd.open_workbook(input_file)
sheet_names = wb.sheet_names()[1:]
field0 = []
field1 = []
field2 = []
field3 = []
for sheet_name in sheet_names:
    sheet = wb.sheet_by_name(sheet_name)
    n = sheet.nrows
    print(f'処理中:{sheet_name},   {n} 行')
    data = [sheet.row_values(row) for row in range(sheet.nrows)]
    for i in range(2, n, 49):
        if data[i][6] != '平均余命':
            raise Exception('フィールド 6 が "平均余命" ではない')
        name = data[i - 1][1]
        name2 = name.split(' ')
        name2_length = len(name2)
        if name2_length == 1 or\
             (name2_length == 2 and name2[1] in seireisi) or\
             data[i + 3][6] == '…':
            print(f'{name2} は除去')
        else:
            male = data[i + 3][6]
            female = data[i + 25][6]
            field0.append(name2[0])
            field1.append(''.join(name2[1:]))
            field2.append(male)
            field3.append(female)
df = pd.DataFrame({'都道府県': field0, '市区町村': field1, '男': field2, '女': field3})
df.to_csv(output_file, index=False)
print(len(field0))  # 1888 件(福島県の 8 町村を除いた件数)

 

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

素の R で,データスクレイピングとプロット(その4)

2020年01月25日 | ブログラミング

素の R で,データスクレイピングとプロット(その1)」で使用した Excel ファイルは *.xls 形式で,かつ 3 段組みの表になっており処理がちょっと面倒であった。

これとは別の,市区町村別の生命表のエクセルファイルが同じく政府統計ポータルサイトからダウンロードできる。
https://www.e-stat.go.jp/stat-search/file-download?statInfId=000031693271&fileKind=0
ダウンロードしたファイルは,
ckts-lifetable2015.xlsxである。
拡張子が .xlsx なので,openxlsx パッケージで入力できるので,readlx::read_excel よりストレスフリーである。

この Excel ファイルはしっかりとしたひな形にしたがって作成されているので,プログラムで例外処理をさせることなく,簡単に必要なデータを取り出せる。

素の R で,データスクレイピングとプロット(その1)」で示したプログラムより遙かに短くて済む。

# https://www.e-stat.go.jp/stat-search/file-download?statInfId=000031693271&fileKind=0
# 図表データのダウンロード
# ファイル名: ckts-lifetable2015.xlsx
# 生命表1〜生命表7 が該当
# 7 列目が「平均余命」の 1 行前の 2 列目が「都道府県名+市区町村名」
# 3,25 行目先の 7 列目が目的値(男,女)

# install.packages("openxlsx")

library(openxlsx)

# 文字列を数値化。数値以外の場合はメッセージを出力し NA を返す。
get_value = function(txt, str) {
 if (grepl("[^0-9.]", str)) {
  cat("非数値データ:", txt, "\n", str, "を NA に変換\n")
  return(NA)
 }
 return(as.numeric(str))
}

seireisi = c("札幌市", "仙台市", "さいたま市", "千葉市", "東京都区部", 
 "横浜市", "川崎市", "相模原市", "新潟市", "静岡市", "浜松市", 
 "名古屋市", "京都市", "大阪市", "堺市", "神戸市", "岡山市", 
 "広島市", "北九州市", "福岡市", "熊本市")

con = file("all3.csv", "w") # 結果の出力ファイル
count = 0
for (page in 1:7) { # 生命表1〜生命表7
 data = read.xlsx("ckts-lifetable2015.xlsx", sheet = page + 1)
 for (i in 1:nrow(data)) {
  if (!is.na(data[i, 7]) && data[i, 7] == "平均余命") {
   str1 = data[i - 1, 2] # 自治体名
   str2 = data[i + 3, 7] # 男
   str3 = data[i + 25, 7] # 女
   name = unlist(strsplit(str1, " "))
   if (length(name) == 1 || length(name) == 2 && name[2] %in% seireisi) {
    cat("除外:", str1, "\n") # 除外した自治体名を表示
   } else {
    count = count + 1
    cat(c(str1, get_value(str1, str2), get_value(str1, str3), "\n"), 
     file = con, append = TRUE)
   }
  }
 }
}
close(con)
cat(count, "件") # 1896 件

 

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PVアクセスランキング にほんブログ村

PVアクセスランキング にほんブログ村