Challenge

Die Challenge

Aufgabe: Die Anzahl der Fälle von Dengue Fieber vorhersagen für 2 Städte, San Juan in Puerto Rico und Iquitos in Peru, anhand von Klima- und Vegetationsdaten wie Temperatur, Feuchtigkeit und Vegetationsindex.

mehr info, über dengue fieber



mehr

Beschreibung der Daten, Liste der Features, usw.:
Homepage der Challenge

Verwendete Programme

- R
- R Studio
- Google Maps
- ...



Explorative Analyse

Überblick über die Daten

## 'data.frame':    1456 obs. of  25 variables:
##  $ city                                 : Factor w/ 2 levels "iq","sj": 1 1 1 1 1 1 1 1 1 1 ...
##  $ year                                 : int  2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 ...
##  $ weekofyear                           : int  26 27 28 29 30 31 32 33 34 35 ...
##  $ week_start_date                      : Factor w/ 1049 levels "1990-04-30","1990-05-07",..: 530 531 532 533 534 535 536 537 538 539 ...
##  $ ndvi_ne                              : num  0.193 0.217 0.177 0.228 0.329 ...
##  $ ndvi_nw                              : num  0.132 0.276 0.173 0.145 0.322 ...
##  $ ndvi_se                              : num  0.341 0.289 0.204 0.254 0.254 ...
##  $ ndvi_sw                              : num  0.247 0.242 0.128 0.2 0.361 ...
##  $ precipitation_amt_mm                 : num  25.4 60.6 55.5 5.6 62.8 ...
##  $ reanalysis_air_temp_k                : num  297 297 296 295 296 ...
##  $ reanalysis_avg_temp_k                : num  298 298 297 296 298 ...
##  $ reanalysis_dew_point_temp_k          : num  295 295 296 293 294 ...
##  $ reanalysis_max_air_temp_k            : num  307 307 304 304 307 ...
##  $ reanalysis_min_air_temp_k            : num  293 291 293 289 292 ...
##  $ reanalysis_precip_amt_kg_per_m2      : num  43.2 46 64.8 24 31.8 ...
##  $ reanalysis_relative_humidity_percent : num  92.4 93.6 95.8 87.2 88.2 ...
##  $ reanalysis_sat_precip_amt_mm         : num  25.4 60.6 55.5 5.6 62.8 ...
##  $ reanalysis_specific_humidity_g_per_kg: num  16.7 16.9 17.1 14.4 15.4 ...
##  $ reanalysis_tdtr_k                    : num  8.93 10.31 7.39 9.11 9.5 ...
##  $ station_avg_temp_c                   : num  26.4 26.9 26.8 25.8 26.6 ...
##  $ station_diur_temp_rng_c              : num  10.8 11.6 11.5 10.5 11.5 ...
##  $ station_max_temp_c                   : num  32.5 34 33 31.5 33.3 32 34 33 34 34 ...
##  $ station_min_temp_c                   : num  20.7 20.8 20.7 14.7 19.1 17 19.9 20.5 19 20 ...
##  $ station_precip_mm                    : num  3 55.6 38.1 30 4 11.5 72.9 50.1 89.2 78 ...
##  $ total_cases                          : int  0 0 0 0 0 0 0 0 0 0 ...

Deskriptiva

##  city          year        weekofyear      week_start_date
##  iq:520   Min.   :1990   Min.   : 1.00   2000-07-01:   2  
##  sj:936   1st Qu.:1997   1st Qu.:13.75   2000-07-08:   2  
##           Median :2002   Median :26.50   2000-07-15:   2  
##           Mean   :2001   Mean   :26.50   2000-07-22:   2  
##           3rd Qu.:2005   3rd Qu.:39.25   2000-07-29:   2  
##           Max.   :2010   Max.   :53.00   2000-08-05:   2  
##                                          (Other)   :1444  
##     ndvi_ne            ndvi_nw            ndvi_se        
##  Min.   :-0.40625   Min.   :-0.45610   Min.   :-0.01553  
##  1st Qu.: 0.04495   1st Qu.: 0.04922   1st Qu.: 0.15509  
##  Median : 0.12882   Median : 0.12143   Median : 0.19605  
##  Mean   : 0.14229   Mean   : 0.13055   Mean   : 0.20378  
##  3rd Qu.: 0.24848   3rd Qu.: 0.21660   3rd Qu.: 0.24885  
##  Max.   : 0.50836   Max.   : 0.45443   Max.   : 0.53831  
##  NA's   :194        NA's   :52         NA's   :22        
##     ndvi_sw         precipitation_amt_mm reanalysis_air_temp_k
##  Min.   :-0.06346   Min.   :  0.00       Min.   :294.6        
##  1st Qu.: 0.14421   1st Qu.:  9.80       1st Qu.:297.7        
##  Median : 0.18945   Median : 38.34       Median :298.6        
##  Mean   : 0.20231   Mean   : 45.76       Mean   :298.7        
##  3rd Qu.: 0.24698   3rd Qu.: 70.23       3rd Qu.:299.8        
##  Max.   : 0.54602   Max.   :390.60       Max.   :302.2        
##  NA's   :22         NA's   :13           NA's   :10           
##  reanalysis_avg_temp_k reanalysis_dew_point_temp_k
##  Min.   :294.9         Min.   :289.6              
##  1st Qu.:298.3         1st Qu.:294.1              
##  Median :299.3         Median :295.6              
##  Mean   :299.2         Mean   :295.2              
##  3rd Qu.:300.2         3rd Qu.:296.5              
##  Max.   :302.9         Max.   :298.4              
##  NA's   :10            NA's   :10                 
##  reanalysis_max_air_temp_k reanalysis_min_air_temp_k
##  Min.   :297.8             Min.   :286.9            
##  1st Qu.:301.0             1st Qu.:293.9            
##  Median :302.4             Median :296.2            
##  Mean   :303.4             Mean   :295.7            
##  3rd Qu.:305.5             3rd Qu.:297.9            
##  Max.   :314.0             Max.   :299.9            
##  NA's   :10                NA's   :10               
##  reanalysis_precip_amt_kg_per_m2 reanalysis_relative_humidity_percent
##  Min.   :  0.00                  Min.   :57.79                       
##  1st Qu.: 13.05                  1st Qu.:77.18                       
##  Median : 27.25                  Median :80.30                       
##  Mean   : 40.15                  Mean   :82.16                       
##  3rd Qu.: 52.20                  3rd Qu.:86.36                       
##  Max.   :570.50                  Max.   :98.61                       
##  NA's   :10                      NA's   :10                          
##  reanalysis_sat_precip_amt_mm reanalysis_specific_humidity_g_per_kg
##  Min.   :  0.00               Min.   :11.72                        
##  1st Qu.:  9.80               1st Qu.:15.56                        
##  Median : 38.34               Median :17.09                        
##  Mean   : 45.76               Mean   :16.75                        
##  3rd Qu.: 70.23               3rd Qu.:17.98                        
##  Max.   :390.60               Max.   :20.46                        
##  NA's   :13                   NA's   :10                           
##  reanalysis_tdtr_k station_avg_temp_c station_diur_temp_rng_c
##  Min.   : 1.357    Min.   :21.40      Min.   : 4.529         
##  1st Qu.: 2.329    1st Qu.:26.30      1st Qu.: 6.514         
##  Median : 2.857    Median :27.41      Median : 7.300         
##  Mean   : 4.904    Mean   :27.19      Mean   : 8.059         
##  3rd Qu.: 7.625    3rd Qu.:28.16      3rd Qu.: 9.567         
##  Max.   :16.029    Max.   :30.80      Max.   :15.800         
##  NA's   :10        NA's   :43         NA's   :43             
##  station_max_temp_c station_min_temp_c station_precip_mm  total_cases    
##  Min.   :26.70      Min.   :14.7       Min.   :  0.00    Min.   :  0.00  
##  1st Qu.:31.10      1st Qu.:21.1       1st Qu.:  8.70    1st Qu.:  5.00  
##  Median :32.80      Median :22.2       Median : 23.85    Median : 12.00  
##  Mean   :32.45      Mean   :22.1       Mean   : 39.33    Mean   : 24.68  
##  3rd Qu.:33.90      3rd Qu.:23.3       3rd Qu.: 53.90    3rd Qu.: 28.00  
##  Max.   :42.20      Max.   :25.6       Max.   :543.30    Max.   :461.00  
##  NA's   :20         NA's   :14         NA's   :22

Verteilung der Anzahl Fälle

Anzahl Fälle über die Zeit

Interessante Zusammenhänge

unfertig!

bla bli blub, plots mit plotly und korrelationen, einfache regressionen oder so rein

fir jede oder manche vars jeweils ein paar plots machen: https://www.statmethods.net/advgraphs/layout.html

die “explosionen” genauer angucken: welche werte sind da auch hoch? wird das von nem linearen modell abgebildet? oder exponentiell/ interaktionseffekt?

Minimallösung Code

Unsere grundsätzliche Vorgehensweise und der entsprechende R-Code dazu findet sich hier.
Als Minimallösung wurden keine Features bearbeitet oder neue erzeugt, und ein random forest Modell mit Standardeinstellungen an alle Features angepasst.

Das Modell liefert eine Varianzaufklärung von ~60% bei den Trainingsdaten und erreicht bei Upload einen Score (Mean Absolute Error, MAE) von 25.8966 (Rang 954 von 5633 auf drivendata - Stand 6.3.19).

Dieses Modell benutzen wir als Baseline, die wir versuchen zu übertreffen.


# Importe und Optionen ----------------------------------------------------

rm(list = ls())
cat("\014")

library(randomForest)

options(stringsAsFactors = T, scipen = 20, max.print = 300)
SPEICHERN <- F

datum <- format(Sys.time(), "%m-%d-%H%-%M")

savename <- paste0(datum, "_minimal") # filename zum speichern von Ergebnis und Model


# Ordnerstruktur ----------------------------------------------------------

pf.root  <- "F:/Data Science/4. Semester/Advanced Data Challenge/dengue/"
pf.data  <- paste0(pf.root, "data/")
pf.saves <- paste0(pf.root, "saves/")


# Daten einlesen ----------------------------------------------------------

train.features <- read.csv(paste0(pf.data, "dengue_features_train.csv"))
train.labels   <- read.csv(paste0(pf.data, "dengue_labels_train.csv"))
test.features  <- read.csv(paste0(pf.data, "dengue_features_test.csv"))
sub.form       <- read.csv(paste0(pf.data, "submission_format.csv"))


# Preprocessing -----------------------------------------------------------

# train, test, ergebnis erzeugen
train <- merge(train.features, train.labels)
test <- test.features
test$total_cases <- 0
ergebnis <- sub.form

# Variablen loeschen
train$week_start_date <- NULL
test$week_start_date <- NULL


# Fehlende Werte imputieren -----------------------------------------------

# Median/Mode Imputation (wird spaeter anders gemacht)
train <- randomForest::na.roughfix(train)
test  <- randomForest::na.roughfix(test)


# Feature Engineering -----------------------------------------------------
# kommt spaeter


# Model bilden und trainieren ---------------------------------------------

model <- randomForest::randomForest(total_cases ~ ., data=train)
# model <- readRDS(paste0(pf.saves, "_model.Rds"))

model
## 
## Call:
##  randomForest(formula = total_cases ~ ., data = train) 
##                Type of random forest: regression
##                      Number of trees: 500
## No. of variables tried at each split: 7
## 
##           Mean of squared residuals: 758.2141
##                     % Var explained: 60.08
mae_train <- mean(abs(train$total_cases - model$predicted))
mae_train
## [1] 14.16345
# cross validation, hyperparameter tuning, ... kommt spaeter

# Vorhersage --------------------------------------------------------------

pred <- predict(model, test)

ergebnis$total_cases <- pred


# Nachbearbeitung ---------------------------------------------------------

# falls negativ auf 0 setzen
ergebnis$total_cases <- ifelse(ergebnis$total_cases < 0, 0, ergebnis$total_cases)

# runden, Upload muss ganze Zahlen beinhalten
ergebnis$total_cases <- round(ergebnis$total_cases)


# Ergebnis und Model speichern --------------------------------------------

if(SPEICHERN){
  write.csv(ergebnis, paste0(pf.saves, savename, "_result.csv"), quote = F, row.names = F)
  saveRDS(model,      paste0(pf.saves, savename, "_model.Rds"))
}




Vorhersagen

Notizen

Die Zeit zwischen dem Stich der Aedes-Mücke und dem Auftreten der ersten Symptome (Inkubationszeit) beträgt drei bis 14 Tage. Meistens bricht die Infektion zwischen dem 4. und 7. Tag aus.

Das Dengue-Fieber hat sich in den vergangenen Jahrzehnten stark verbreitet. In den letzten 50 Jahren hat sich die Zahl der infizierten Menschen verdreißigfacht. Experten schätzen, dass weltweit jedes Jahr rund 400 Millionen Menschen am Dengue-Virus erkranken. Damit ist das Dengue-Fieber die am stärksten durch Mücken verbreitete Erkrankung der Welt.



Ideen für die Zukunft

  • Verschiedene Modelle probieren: gradient boosting, Zeitreihenanalyse, neuronale Netze, binomiales GLM, …
  • Verschiedene Modelle (gewichtet) kombinieren
  • Hyperparameter tunen
  • Zusätzliche Features erzeugen
  • Externe Daten suchen und einfügen?