Election: 2020米国大統領選の時間経過による州別得票数の変化のデータとグラフ, r ver. 13

Last Updated on November 17, 2020 by shibatau

The New York Timesのページをリンクしました。

VI.得票割合のグラフを追加しました。

I.スクリプトとグラフ

 

時間の経過にしたがったBiden氏とTrump氏の得票数の変化をRでグラフにします。

The New York Timesの選挙結果ページをスクレイプして、Githubに保存するプログラムと保存データが公開されています。

 

nyt-2020-election-scraper

 

Battleground statesのCSVのrawのページ

 

https://raw.githubusercontent.com/alex/nyt-2020-election-scraper/master/battleground-state-changes.csv

 

All statesのCSVのrawのページ

 

https://raw.githubusercontent.com/alex/nyt-2020-election-scraper/master/all-state-changes.csv

 

スクリプト

 

Githubに公開しました。

 

https://github.com/hirogami/Election_Analysis

 

選挙結果ライブ配信のページのスクレイプなので、データには、氏名に優勢列と劣勢列、得票数にも優勢列と劣勢列があり、時間の経緯で交差しますので、Biden氏とTrump氏の別でまとめる必要があります。

素朴に考えたままのスクリプトを示します。後ほど関数にしようと思います。

 

library(tidyverse)
# read the data
df0 <- read_csv("battleground-state-changes.csv")
# select the columns and subset the rows of Pennsylvania
# Arizona (EV: 11), Georgia (EV: 16), North Carolina (EV: 15)
select_state <- "Pennsylvania (EV: 20)"
df0 %>% 
  select(state, timestamp, 
         leading_candidate_name, 
         trailing_candidate_name, 
         leading_candidate_votes, 
         trailing_candidate_votes) %>% 
  filter(state == select_state) -> df0_selected
# get the names and votes irrelevant to whether they are leading or trailing
df0_selected %>%
  select(!trailing_candidate_votes) %>% 
  filter(leading_candidate_name == "Biden") %>% 
  rename(name = leading_candidate_name,
         votes = leading_candidate_votes) -> biden1
df0_selected %>%
  select(!leading_candidate_votes) %>% 
  filter(trailing_candidate_name == "Biden") %>% 
  rename(name = trailing_candidate_name,
         votes = trailing_candidate_votes) -> biden2
df0_selected %>%
  select(!trailing_candidate_votes) %>% 
  filter(leading_candidate_name == "Trump") %>% 
  rename(name = leading_candidate_name,
         votes = leading_candidate_votes) -> trump1
df0_selected %>%
  select(!leading_candidate_votes) %>% 
  filter(trailing_candidate_name == "Trump") %>% 
  rename(name = trailing_candidate_name,
         votes = trailing_candidate_votes)-> trump2
# binde the rows
all <- bind_rows(biden1, biden2, trump1, trump2)
# create a line chart
p <- ggplot(all, aes(x=timestamp, 
                     y=votes, 
                     group = name,
                     color=name)) +
     geom_line()
p + ggtitle(label = select_state,
            subtitle = "2020 Presidential Election Results changed over time")

 

グラフ

 

 

 

II.RStudio

 

読み込んだデータは、CSV(カンマ区切りのデータ)ファイルです。

データをライブラリtidyverseのread_csv(“ファイルのパス”)で読みこんで表示すると、列数、行数、列名などの情報が表示されますが、Excelのシートのような形で全体確認するには、view(データ名)を実行します。

RStudio(RのIDE)なら、View()を書かなくても簡単にシートを表示できます。ちなみに、IDEは、Rを便利に使うためのアプリと考えてください。

RStudioは無料でダウンロードできますが、次のクラウドでRStudioを体験することもできます。ただし、登録が必要(メールアドレルが必要)で、無料では15プロジェクトの制限があります。

 

RStudio cloud

 

次はRStudioの画面です。右上のEnvironmentタブを選ぶと、データ名の一覧が表示されます。

インストールしたデータだけではなく、<-でデータ名をつけたすべてのデータ名のリストです。クリックすると左のEditorペイン(スクリプトを書く部分)にデータのシートが表示されます。

Editorペインの右上のボックスで文字列を検索できるので、State列の州名を簡単に見つけ出すことができます。

 

 

III.ファイルのパス

 

データがコンピュータにあるファイルの場合、それを読み込む必要があります。このスクリプトでは、次の行です。

 

df0 <- read_csv(“battleground-state-changes.csv”)

 

意味は、「ファイル名battleground-state-changes.csvをカンマ区切りのデータとして読み込み、df0と名付ける」です。

ファイルが、ホーム・ディレクトリ内にある場合は、このようにファイル名を書くだけでよいですが、ホーム・以外にある場合は、フル・パス(full path)を書く必要があります。

ファイルのパス(path)は、ファイルを特定する仕組みで、ツリー状の階層をもっています。これについては、次に説明しました。

 

ファイルのfull pathとホーム・ディレクトリの説明

 

IV.パイプ演算子(%>%)

 

統合ライブラリtidyverseをインポートするとパイプ演算子(%>%)を使うことができます。これによりわかりやすいスクリプトを書くことができます。

%>%の基本的な機能は、f(x, …)x %>% f(…) に書き直すことです。つまり、関数f( )の第1アーギュメントを前に取り出します。

このスクリプトでは、例えば、次で使われています。それぞれの行の説明を# の後に書きました。

 

df0 %>% # データdf0の

  select(state, timestamp, … trailing_candidate_votes) %>% # これらの列を取り出し

 filter(state == “Pennsylvania (EV; 20)”) # state列が ” ” 内の文字列の行を取り出す

 

これを%>%なしに書くと次になります。一番内にあるdf0から外へ理解しなければならないので、非常にわかりにくいです。

 

filter(select(df0, state, timestamp, … trailing_candidate_votes), state == “Pennsylvania (EV: 20)”)

 

V.スクリプトの詳しい解説

 

解説のためにHTMLで表示しますので、はじめの空白がなくなりますが、コピーしてRで実行すれば、Iのスクリプトと同様のグラフが描けます。

ただし、Macの場合(Windowsも?)、Rに貼り付ける際に、‘ や ” が全角に変換されることがあります。その場合は、半角に書き直す必要があります。

RはPythonと異なり、行のはじめのスペースは見やすくするためで、スクリプトとしてはなくてもかまいません

 

# ライブラリをインポートします。
library(tidyverse)

# データ・ファイルをCSV(カンマ区切りデータ)として読み込み、df0の名をつけます。ホーム・ディレクトリ内にあるれば、このようにファイル名を書くだけです。そうでなければ、full pathを書きます。
# 引用符は、’ でも ” でもかまいません。
# read.csvとするとベースのふつうのデータ・フレームになります。read_csvとしているのは扱いやすいtibbleの形式で読み込まれます。
df0 <- read_csv(“battleground-state-changes.csv”)

# state列の求める州名を書き、select_stateと名付けます。
select_state <- “Pennsylvania (EV: 20)” 

# 必要な列を取り出します。
# == select_stateは、state列の値が冒頭で指定したselect_stateであるということで、名をつけているのではないので=ではエラーになります。
# 先頭にdf0_selected <- … としても、末尾に -> df0_selectedとしても同じです。
df0 %>% # データdf0の
select(state, timestamp,
leading_candidate_name,
trailing_candidate_name,
leading_candidate_votes,
trailing_candidate_votes) %>%   # 選び出す列名を指定し
filter(state == select_state) -> df0_selected # state列がselect_stateの行を選び、df0_selectedと名付ける

# 優勢と劣勢で分けられた候補者名と得票数を、候補者名列と得票数列にまとめます。
# 優勢者名、劣勢者名、優勢得票数、劣勢得票数の組み合わせで4データを作成します。
# 一つ目のpa_biden1を作成します。
df0_selected %>% # データdf0_selectedの
select(!trailing_candidate_votes) %>% # trailing_candidate_votes列を除いて
filter(leading_candidate_name == “Biden”) %>% # leading…name列の値がBidenを取り出して
rename(name = leading_candidate_name,
votes = leading_candidate_votes) -> biden1 # 列名をnameとvotesに変更してbiden1と名付ける

# 同様に、pa_biden2を作成します。
df0_selected %>%
select(!leading_candidate_votes) %>%
filter(trailing_candidate_name == “Biden”) %>%
rename(name = trailing_candidate_name,
votes = trailing_candidate_votes) -> biden2

# 同様に、pa_trump1を作成します。
df0_selected %>%
select(!trailing_candidate_votes) %>%
filter(leading_candidate_name == “Trump”) %>%
rename(name = leading_candidate_name,
votes = leading_candidate_votes) -> trump1

# 同様に、pa_trump2を作成します。
df0_selected %>%
select(!leading_candidate_votes) %>%
filter(trailing_candidate_name == “Trump”) %>%
rename(name = trailing_candidate_name,
votes = trailing_candidate_votes)-> trump2

# 上の4つを合わせてpa_both
both <- bind_rows(biden1, biden2, trump1, trump2)

# グラフを描きます。
p <- ggplot(all, aes(x=timestamp,
y=votes,
group = name,
color=name)) +
geom_line()
# titleとsubtitleを加えます。
p + ggtitle(label = select_state,
subtitle = “2020 Presidential Election Results changed over time”)

 

VI.得票割合のグラフ

 

The New York Timesにあるグラフに似せたグラフを作成することもできます。The New York Timesのグラフは得票率の推移を横軸にとっていますが、スクレイプしたデータでは時間の推移になります。

 

 

 

スクリプトをGithubに公開しました。

 

https://github.com/hirogami/Election_Analysis

 

 

About shibatau

I was born and grown up in Kyoto. I studied western philosophy at the University and specialized in analytic philosophy, especially Ludwig Wittgenstein at the postgraduate school. I'm interested in new technology, especially machine learning and have been learning R language for two years and began to learn Python last summer. Listening toParamore, Sia, Amazarashi and MIyuki Nakajima. Favorite movies I've recently seen: "FREEHELD". Favorite actors and actresses: Anthony Hopkins, Denzel Washington, Ellen Page, Meryl Streep, Mia Wasikowska and Robert DeNiro. Favorite books: Fyodor Mikhailovich Dostoyevsky, "The Karamazov Brothers", Shinran, "Lamentations of Divergences". Favorite phrase: Salvation by Faith. Twitter: @shibatau

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.