2017-03-24 7 views
1

permet de dire que j'ai un dataframe qui ressemble à ceci:R - La pondération par la taille du groupe dans les graphiques à barres

groups <- floor(runif(1000, min=1, max=5)) 
activity <- rep(c("A1", "A2", "A3", "A4"), times= 250) 
endorsement <- floor(runif(1000, min=0, max=2)) 
value1 <- runif(1000, min=1, max=10) 
area <- rep(c("A", "A", "A", "A", "B", "C", "C", "D", "D", "E"), times = 100) 

df <- data.frame(groups, activity, endorsement, value1, area) 

imprimé:

> head(df) 
    groups activity endorsement value1 area 
1  1  A1   0 7.443375 A 
2  1  A2   0 4.342376 A 
3  1  A3   0 4.810690 A 
4  4  A4   0 3.494974 A 
5  3  A1   1 6.442354 B 
6  1  A2   0 9.794138 C 

Je veux calculer des statistiques descriptives et créer une barre graphiques, mais si vous regardez la variable area, A est très bien représenté, tandis que B et E ne sont pas très bien représentés.

La variable area ne m'intéresse pas, mais les statistiques/l'intrigue seront guidées par les zones qui ont une représentation élevée dans l'ensemble de données, donc je dois pondérer les données mais je ne suis pas sûr de la bonne façon de le faire dans les situations suivantes:

moyenne et SD

Je calcul de la moyenne et SD ou value1 comme suit:

df %>% group_by(groups) %>% summarise(mean=mean(value1), sd=sd(value1)) 

Quelle est la cor façon rectiligne pour calculer une moyenne pondérée/sd pour compenser les différences de taille d'échantillon pour chaque zone (c.-à-d. Je veux donner à chaque area poids égal)?

diagramme à barres empilées

ggplot(df, aes(groups)) + 
    geom_bar(aes(fill = activity), position = position_fill(reverse = F)) 

enter image description here

Les barres représentent les proportions pour la fréquence de chaque activity dans chaque group survenus. Encore une fois, cela est principalement dû aux répondants de la région A - y a-t-il un moyen d'équilibrer cela et de calculer les proportions comme si area avait une représentation égale?

Groupé signifie

ggplot(aes(x = activity, y = value1, fill=factor(groups)), data=df) + 
    geom_bar(position="dodge", stat="summary", fun.y="mean")+ 
    guides(fill = guide_legend(reverse=F, title="group")) 

enter image description here

Les barres représentent la moyenne de value1 pour chaque combinaison group et activity. Encore une fois, ces moyennes sont pondérées en faveur de la zone A et la représentation n'est pas égale

proportions de comptage Groupé

summary_df <- df %>% group_by(groups, activity) %>% 
    summarise(n=n(), count=sum(endorsement)) %>% mutate(prop=(count/n)*100) 

ggplot(aes(x = activity, y = prop, fill = factor(groups)), data=summary_df) + 
    geom_bar(width=0.8, position = position_dodge(width=0.8), stat="identity") + 
    guides(fill = guide_legend(reverse=F, title="group")) 

enter image description here

Pour chaque group et activity combinaison, je compte la nombre de personnes qui ont approuvé l'élément (a répondu 1), et en calculant une proportion du nombre total de personnes dans le sous-groupe

Les 4 problèmes proviennent avant tout du même problème et tous doivent être pondérés par area pour créer une représentation égale.Cependant, les visualisations sont toutes créées différemment et montrent des choses différentes (moyennes, barres empilées, moyennes groupées, proportions de comptage) et je ne suis pas sûr de la manière correcte de tenir compte des différences de taille d'échantillon dans chaque cas. Y a-t-il un seul correctif qui se propagera à chacun des exemples de graphique?

Répondre

1

Une stratégie serait de ou aval-échantillonnage votre dataframe de sorte que chaque région a le même nombre d'observations. Nous pouvons utiliser les fonctions de confort downSample() ou upSample() de l'emballage caret qui, selon la documentation.

« L'échantillonnage aléatoire simple est utilisé pour le bas-échantillon pour la classe majoritaire (s) Notez que les données de classe minoritaire sont laissés intacts ... »

à titre d'illustration:

library(dpyr) 
library(caret) 
# Before 
df %>% group_by(area) %>% summarise(n()) 
# area `n()` 
#1  A 400 
#2  B 100 
#3  C 200 
#4  D 200 
#5  E 100 

# After 
set.seed(123) 
test_down <- downSample(df, df$area) 
test_down %>% group_by(area) %>% summarise(n()) 
# area `n()` 
#1  A 100 
#2  B 100 
#3  C 100 
#4  D 100 
#5  E 100 

test_up <- upSample(df, df$area) 
test_up %>% group_by(area) %>% summarise(n()) 
# area `n()` 
#1  A 400 
#2  B 400 
#3  C 400 
#4  D 400 
#5  E 400 

alors votre premier graphique devient:

library(ggplot2) 
ggplot(test_down, aes(groups)) + 
     geom_bar(aes(fill = activity), 
       position = position_fill(reverse = F)) 

enter image description here

Notez que parce que nous utilisons un échantillonnage aléatoire, nous avons aucun contrôle sur les observations lors de l'utilisation s'omises downSample(). Par conséquent, les résultats peuvent sembler légèrement différents à chaque exécution sans set.seed().

+0

merci. Existe-t-il une autre option en plus du sous-échantillonnage? Parce que la distribution de 'area' est très déséquilibrée - certaines régions ont presque 100x plus de données que d'autres, donc le downsampling signifie que nous perdrions beaucoup des zones surreprésentées. – Simon

+0

oui,' upSample() 'est également possible. – mtoto