/**
* jQuery Plugin: Sticky Tabs
*
* @author Aidan Lister
* adapted by Ruben Arslan to activate parent tabs too
* http://www.aidanlister.com/2014/03/persisting-the-tab-state-in-bootstrap/
*/
(function($) {
"use strict";
$.fn.rmarkdownStickyTabs = function() {
var context = this;
// Show the tab corresponding with the hash in the URL, or the first tab
var showStuffFromHash = function() {
var hash = window.location.hash;
var selector = hash ? 'a[href="' + hash + '"]' : 'li.active > a';
var $selector = $(selector, context);
if($selector.data('toggle') === "tab") {
$selector.tab('show');
// walk up the ancestors of this element, show any hidden tabs
$selector.parents('.section.tabset').each(function(i, elm) {
var link = $('a[href="#' + $(elm).attr('id') + '"]');
if(link.data('toggle') === "tab") {
link.tab("show");
}
});
}
};
// Set the correct tab when the page loads
showStuffFromHash(context);
// Set the correct tab when a user uses their back/forward button
$(window).on('hashchange', function() {
showStuffFromHash(context);
});
// Change the URL when tabs are clicked
$('a', context).on('click', function(e) {
history.pushState(null, null, this.href);
showStuffFromHash(context);
});
return this;
};
}(jQuery));
window.buildTabsets = function(tocID) {
// build a tabset from a section div with the .tabset class
function buildTabset(tabset) {
// check for fade and pills options
var fade = tabset.hasClass("tabset-fade");
var pills = tabset.hasClass("tabset-pills");
var navClass = pills ? "nav-pills" : "nav-tabs";
// determine the heading level of the tabset and tabs
var match = tabset.attr('class').match(/level(\d) /);
if (match === null)
return;
var tabsetLevel = Number(match[1]);
var tabLevel = tabsetLevel + 1;
// find all subheadings immediately below
var tabs = tabset.find("div.section.level" + tabLevel);
if (!tabs.length)
return;
// create tablist and tab-content elements
var tabList = $('
');
$(tabs[0]).before(tabList);
var tabContent = $('
');
$(tabs[0]).before(tabContent);
// build the tabset
var activeTab = 0;
tabs.each(function(i) {
// get the tab div
var tab = $(tabs[i]);
// get the id then sanitize it for use with bootstrap tabs
var id = tab.attr('id');
// see if this is marked as the active tab
if (tab.hasClass('active'))
activeTab = i;
// remove any table of contents entries associated with
// this ID (since we'll be removing the heading element)
$("div#" + tocID + " li a[href='#" + id + "']").parent().remove();
// sanitize the id for use with bootstrap tabs
id = id.replace(/[.\/?&!#<>]/g, '').replace(/\s/g, '_');
tab.attr('id', id);
// get the heading element within it, grab it's text, then remove it
var heading = tab.find('h' + tabLevel + ':first');
var headingText = heading.html();
heading.remove();
// build and append the tab list item
var a = $('' + headingText + '');
a.attr('href', '#' + id);
a.attr('aria-controls', id);
var li = $('
');
li.append(a);
tabList.append(li);
// set it's attributes
tab.attr('role', 'tabpanel');
tab.addClass('tab-pane');
tab.addClass('tabbed-pane');
if (fade)
tab.addClass('fade');
// move it into the tab content div
tab.detach().appendTo(tabContent);
});
// set active tab
$(tabList.children('li')[activeTab]).addClass('active');
var active = $(tabContent.children('div.section')[activeTab]);
active.addClass('active');
if (fade)
active.addClass('in');
if (tabset.hasClass("tabset-sticky"))
tabset.rmarkdownStickyTabs();
}
// convert section divs with the .tabset class to tabsets
var tabsets = $("div.section.tabset");
tabsets.each(function(i) {
buildTabset($(tabsets[i]));
});
};
保護犬・保護猫・保護動物のデータ解析その1ーコロナ禍で保護動物は増えたか?ー
アメリカテキサス州Austineに、毎年18,000頭以上を保護している米国最大級の動物保護施設があるそうです。そこで、保護動物の顛末データを開示しています。そのデータを使用して、データ分析(EDA:Explanatory Data Analysis)をしてみたいと思います。どうしたら譲渡につながるのか、譲渡を増やすためのヒントを見つけたいと思います。
データのダウンロードはこちらから(今日時点では、2013年~2020年12月8日のデータ)
アメリカ政府データセンター https://catalog.data.gov/dataset/austin-animal-center-outcomes-version-1-demo
まず、お決まりのライブラリーを読み込みます。
library(tidyverse)
library(reshape2)
まずデータを読み込んでから、データを見てみます。
df <- read.csv("C:\\Users\\shelter\\Austin_Animal_Center_Outcomes.csv")
colnames(df)
## [1] "Animal.ID" "Name" "DateTime" "MonthYear"
## [5] "Date.of.Birth" "Outcome.Type" "Outcome.Subtype" "Animal.Type"
## [9] "Sex.upon.Outcome" "Age.upon.Outcome" "Breed" "Color"
head(df)
## Animal.ID Name DateTime MonthYear
## 1 A794011 Chunk 05/08/2019 06:20:00 PM 05/08/2019 06:20:00 PM
## 2 A776359 Gizmo 07/18/2018 04:02:00 PM 07/18/2018 04:02:00 PM
## 3 A821648 08/16/2020 11:38:00 AM 08/16/2020 11:38:00 AM
## 4 A720371 Moose 02/13/2016 05:59:00 PM 02/13/2016 05:59:00 PM
## 5 A674754 03/18/2014 11:47:00 AM 03/18/2014 11:47:00 AM
## 6 A659412 Princess 10/05/2020 02:37:00 PM 10/05/2020 02:37:00 PM
## Date.of.Birth Outcome.Type Outcome.Subtype Animal.Type Sex.upon.Outcome
## 1 05/02/2017 Rto-Adopt Cat Neutered Male
## 2 07/12/2017 Adoption Dog Neutered Male
## 3 08/16/2019 Euthanasia Other Unknown
## 4 10/08/2015 Adoption Dog Neutered Male
## 5 03/12/2014 Transfer Partner Cat Intact Male
## 6 03/24/2013 Adoption Dog Spayed Female
## Age.upon.Outcome Breed Color
## 1 2 years Domestic Shorthair Mix Brown Tabby/White
## 2 1 year Chihuahua Shorthair Mix White/Brown
## 3 1 year Raccoon Gray
## 4 4 months Anatol Shepherd/Labrador Retriever Buff
## 5 6 days Domestic Shorthair Mix Orange Tabby
## 6 7 years Chihuahua Shorthair Mix Brown
データ解析に使う変数だけを取り出しました。
df <- df %>% select(Age.upon.Outcome,
Animal.Type,
Breed,
Outcome.Type,
Sex.upon.Outcome,
DateTime)
データ型を見てみます。
str(df)
## 'data.frame': 122839 obs. of 6 variables:
## $ Age.upon.Outcome: chr "2 years" "1 year" "1 year" "4 months" ...
## $ Animal.Type : chr "Cat" "Dog" "Other" "Dog" ...
## $ Breed : chr "Domestic Shorthair Mix" "Chihuahua Shorthair Mix" "Raccoon" "Anatol Shepherd/Labrador Retriever" ...
## $ Outcome.Type : chr "Rto-Adopt" "Adoption" "Euthanasia" "Adoption" ...
## $ Sex.upon.Outcome: chr "Neutered Male" "Neutered Male" "Unknown" "Neutered Male" ...
## $ DateTime : chr "05/08/2019 06:20:00 PM" "07/18/2018 04:02:00 PM" "08/16/2020 11:38:00 AM" "02/13/2016 05:59:00 PM" ...
DateTimeがcharactorなので、date型に変換します。その前に、05/08/2019 06:20:00 PMという形を修正します。後ろのほうを取ってしまいます。 substr(対象,1,10)は、string型の1番目と10番目の間を抜粋します。 その後、as.Dateでデータ型と認識させます。
df$DateTime <- substr(df$DateTime,1,10)
df$DateTime <- as.Date(df$DateTime, tryFormats = c("%m/%d/%Y"))
さらに、必要な変数を絞り込みます。 strftimeで、date型から月と年を取り出します。
df_ts <- df %>% select(Animal.Type,DateTime)
df_ts$year <- strftime(df_ts$DateTime,"%Y")
df_ts$month <- strftime(df_ts$DateTime, "%m")
年毎ごと、動物種類ごとに集計します。 table(y軸、x軸)で、yとxの集計が出来ます。それをデータフレーム型にしました。
df_ts_year <- as.data.frame(table(date=df_ts$year,animal=df_ts$Animal.Type))
こんなデータができました。
head(df_ts_year)
## date animal Freq
## 1 2013 Bird 5
## 2 2014 Bird 53
## 3 2015 Bird 47
## 4 2016 Bird 137
## 5 2017 Bird 87
## 6 2018 Bird 111
年ごとに、データ数をグラフ化。
ggplot(df_ts_year)+
geom_line(aes(x=date,y=Freq,group=animal,color=animal),size=1)+
xlab("Year")+
ylab("Number of Animals in the shelter")
2020年は下がっています
データは2020年12月8日が最新だから、12月が完全に抜けているという訳でもないです。コロナ禍の2020年は、保護動物の譲渡が少なくなったということでしょうか。
今度は、月ごとにグラフを作りたいと思います。
df_ts_month <- as.data.frame(table(date=df_ts$month,animal=df_ts$Animal.Type))
ggplot(df_ts_month)+
geom_line(aes(x=date,y=Freq,group=animal,color=animal),size=1)+
xlab("Month")+
ylab("Number of Animals in the shelter")
猫のデータは夏にかけて多くなっています
なんででしょうか。 今度は、2019年と2020年の月ごとに比較したいと思います。
df_ts_2019 <- df_ts %>% filter(year==2019)
df_ts_2020 <- df_ts %>% filter(year==2020)
df_ts_2019_month <- as.data.frame(table(date=df_ts_2019$month,animal=df_ts_2019$Animal.Type))
df_ts_2020_month <- as.data.frame(table(date=df_ts_2020$month,animal=df_ts_2020$Animal.Type))
df_ts_2019_month$year <- 2019
df_ts_2020_month$year <- 2020
df_ts_2019_2020 <- rbind(df_ts_2019_month,df_ts_2020_month)
ggplot(df_ts_2019_2020)+
geom_line(aes(x=date,y=Freq,group=animal,color=animal),size=1.2)+
xlab("Month")+
ylab("Number of Cases")+
facet_grid(year~.)
4月ころからデータ数が減りました。
次に続きます。
// add bootstrap table styles to pandoc tables
function bootstrapStylePandocTables() {
$('tr.odd').parent('tbody').parent('table').addClass('table table-condensed');
}
$(document).ready(function () {
bootstrapStylePandocTables();
});