任务目标:探索数据科学从业者的年龄中位数最大的十个国家。
执行方法:创建绘图所需的数据源(按照Country统计Age的中位数,并且根据Age的值进行降序排列)。实现代码具体如下:
> df_country_age <- responses %>% group_by(Country) %>% # 按照Country进行统计 summarise(AgeMedian = median(Age, na.rm = T)) %>% # 统计Age的中位数 arrange(desc(AgeMedian)) # 按照Age进行降序排列 > df_country_age[1:10,] ## # A tibble: 10 x 2 ## Country AgeMedian ## <chr> <dbl> ## 1 New Zealand 39 ## 2 Spain 37 ## 3 Ireland 35 ## 4 Australia 34 ## 5 Canada 34 ## 6 Denmark 34 ## 7 Israel 34 ## 8 Italy 34 ## 9 Netherlands 34 ## 10 Norway 34
在可视化数据之前,对于渴望精简代码的读者而言,以下两行代码使用data.table包配合基础的正则表达式实现了7.2节中的数据读取和数据初步清理的任务。下面两行代码的具体含义可解释如下。
1)读取原始数据。
2)对年龄求中间值。
3)按照年龄的中间值由大到小对国家名称进行排序。
实现代码具体如下:
> df_country_age <- responses[,.(AgeMedian = median(Age, na.rm = TRUE)), by = .(Country)][order(AgeMedian,decreasing = TRUE)]
可视化部分用到的ggplot2内容过于庞大,已经超出了本书讨论的范围,这里将需要用到的函数及其部分参数简要介绍如下。
1)reorder(Country,AgeMedian):按照AgeMedian的升序排列与其对应的Country。
2)head(df_country,10):选取数据源的前10行。
3)x参数中传入图中的x轴所需的数据,y参数与此同理。
4)geom_bar():绘制条形图的子函数。
5)fill=Country:按照Country填充条形图颜色。
6)stat(统计转换)参数设置为“identity”,即对原始数据集不做任何统计变换。
7)geom_text():添加文本注释的子函数。
a)label=AgeMedian:添加AgeMedian中的内容。
b)hjust:控制横向对齐(0表示底部对齐,0.5表示居中,1表示顶部对齐)。
c)colour:控制注释颜色。
8)theme_minimal():表示ggplot的一种主背景主题。
下面的示例代码演示的是各国家受访者年龄中位数的可视化探索,请读者参考上文的内容理解可视化部分函数的含义。第一组代码的原数据集中的观测值皆为英文,因此为了方便理解,笔者将排名靠前的3个国家翻译为中文。这里用到的是mutate配合ifelse来更新数值的方法(详见第3章)。第二组和第三组的代码分别对排名前三名和后三名的国家进行了可视化(如图7-1和图7-2所示),第三组代码中使用了mutate函数配合case_when来替换数值的方法。示例代码具体如下:
> df_country_age <- df_country_age %>% mutate(Country = ifelse(Country == "New Zealand", "新西兰", Country), Country = ifelse(Country == "Spain", "西班牙", ifelse(Country == "Ireland", "爱尔兰", Country))) > df_country_age %>% head(3) %>% ggplot(aes(x = reorder(Country, AgeMedian), y = AgeMedian,fill = Country)) + geom_bar(stat = 'identity') + labs(x = "", y = '年龄中位数') + geom_text(aes(label = AgeMedian), hjust = 1.5, colour = 'white') + coord_flip() + theme_minimal() + theme(legend.position = 'none') # 移除图例。 > df_country_age %>% tail(3) %>% mutate(Country = case_when(Country == "Pakistan" ~ "巴基斯坦", Country == "Indonesia" ~ "印度尼西亚", Country == "Vietnam" ~ "越南")) %>% ggplot(aes(x = reorder(Country, AgeMedian), y = AgeMedian,fill = Country)) + geom_bar(stat = 'identity') + labs(x = "", y = '年龄中位数') + geom_text(aes(label = AgeMedian), hjust = 1.5, colour = 'white') + coord_flip() + theme_minimal() + theme(legend.position = 'none')
代码可视化结果分别如图7-1和图7-2所示。
图7-1 受访者年龄中位数排名前三的国家
对比图7-1和图7-2,我们可以发现以下几点结论。
图7-2 受访者年龄中位数排名后三位的国家
1)新西兰受访者年龄中位数最大,这在一定程度上可以反映新西兰的受访者年龄偏大,如果进行进一步的推断,并以人口学数据佐证的话,可以间接推断出新西兰人口老龄化程度可能偏高。
2)印度尼西亚的受访者年龄中位数最小,这在一定程度上反应出印度尼西亚的受访者年龄偏小。
3)偏激一些的推断结论也可以总结为,发达国家中受访者的年龄中位数普遍高于发展中国家受访者的年龄中位数,但也可能因为其他因素的干扰,比如受访者的人数、接触到Kaggle的难易程度等,导致该结论并不可靠。