数据分析系列
# 数据可视化
# install.packages("highcharter")
# library(highcharter)
# library(dplyr)
#
# series = list(
# list(
# name = "Accumulated Profit",
# color = "#1E90FF",
# data = BorgataXue %>%
# select(accuProfit) %>% .[[1]]
# )
# )
#
#
# highchart() %>%
# hc_add_series_list(series) %>%
# hc_xAxis(categories = BorgataXue %>% select(Date) %>% .[[1]]) %>%
# hc_yAxis(plotlines = list(list(
# value = 0,
# width = 5,
# color = "black"
# )))
Package 载入
library(nycflights13)# to access dataset flights
## Warning: 程辑包'nycflights13'是用R版本4.3.1 来建造的
library(tidyverse) # to use function:glimpse
## Warning: 程辑包'tidyverse'是用R版本4.3.1 来建造的
## Warning: 程辑包'ggplot2'是用R版本4.3.3 来建造的
## Warning: 程辑包'tibble'是用R版本4.3.1 来建造的
## Warning: 程辑包'tidyr'是用R版本4.3.1 来建造的
## Warning: 程辑包'readr'是用R版本4.3.1 来建造的
## Warning: 程辑包'purrr'是用R版本4.3.1 来建造的
## Warning: 程辑包'dplyr'是用R版本4.3.1 来建造的
## Warning: 程辑包'stringr'是用R版本4.3.3 来建造的
## Warning: 程辑包'forcats'是用R版本4.3.1 来建造的
## Warning: 程辑包'lubridate'是用R版本4.3.1 来建造的
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.3 ✔ readr 2.1.4
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ ggplot2 3.5.1 ✔ tibble 3.2.1
## ✔ lubridate 1.9.3 ✔ tidyr 1.3.0
## ✔ purrr 1.0.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
以nycflights13自带数据集为例
flights:nycflights13package里自带的dataset
flights
## # A tibble: 336,776 × 19
## year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
## <int> <int> <int> <int> <int> <dbl> <int> <int>
## 1 2013 1 1 517 515 2 830 819
## 2 2013 1 1 533 529 4 850 830
## 3 2013 1 1 542 540 2 923 850
## 4 2013 1 1 544 545 -1 1004 1022
## 5 2013 1 1 554 600 -6 812 837
## 6 2013 1 1 554 558 -4 740 728
## 7 2013 1 1 555 600 -5 913 854
## 8 2013 1 1 557 600 -3 709 723
## 9 2013 1 1 557 600 -3 838 846
## 10 2013 1 1 558 600 -2 753 745
## # ℹ 336,766 more rows
## # ℹ 11 more variables: arr_delay <dbl>, carrier <chr>, flight <int>,
## # tailnum <chr>, origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>,
## # hour <dbl>, minute <dbl>, time_hour <dttm>
View(flights)
#了解dataset的全貌
glimpse(flights) # dyplr
## Rows: 336,776
## Columns: 19
## $ year <int> 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2…
## $ month <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1…
## $ day <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1…
## $ dep_time <int> 517, 533, 542, 544, 554, 554, 555, 557, 557, 558, 558, …
## $ sched_dep_time <int> 515, 529, 540, 545, 600, 558, 600, 600, 600, 600, 600, …
## $ dep_delay <dbl> 2, 4, 2, -1, -6, -4, -5, -3, -3, -2, -2, -2, -2, -2, -1…
## $ arr_time <int> 830, 850, 923, 1004, 812, 740, 913, 709, 838, 753, 849,…
## $ sched_arr_time <int> 819, 830, 850, 1022, 837, 728, 854, 723, 846, 745, 851,…
## $ arr_delay <dbl> 11, 20, 33, -18, -25, 12, 19, -14, -8, 8, -2, -3, 7, -1…
## $ carrier <chr> "UA", "UA", "AA", "B6", "DL", "UA", "B6", "EV", "B6", "…
## $ flight <int> 1545, 1714, 1141, 725, 461, 1696, 507, 5708, 79, 301, 4…
## $ tailnum <chr> "N14228", "N24211", "N619AA", "N804JB", "N668DN", "N394…
## $ origin <chr> "EWR", "LGA", "JFK", "JFK", "LGA", "EWR", "EWR", "LGA",…
## $ dest <chr> "IAH", "IAH", "MIA", "BQN", "ATL", "ORD", "FLL", "IAD",…
## $ air_time <dbl> 227, 227, 160, 183, 116, 150, 158, 53, 140, 138, 149, 1…
## $ distance <dbl> 1400, 1416, 1089, 1576, 762, 719, 1065, 229, 944, 733, …
## $ hour <dbl> 5, 5, 5, 5, 6, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 6, 6, 6…
## $ minute <dbl> 15, 29, 40, 45, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, 0…
## $ time_hour <dttm> 2013-01-01 05:00:00, 2013-01-01 05:00:00, 2013-01-01 0…
1.数据集是否异常
1.1 确保没有重复/冗余的行
distinct(): finds all unique rows in the
dataset
# 数据集有多少独特/不重复的行(unique/distinct rows)
flights %>% distinct() %>% nrow()
## [1] 336776
# 数据集有多少行
flights %>% nrow()
## [1] 336776
Observation:数据集中没有相同的两行.就这方面无需进一步清洁
1.2 计算每一列/每一个指标,有多少不同的取值
lapply(flights, function(x)length(unique(x)))
## $year
## [1] 1
##
## $month
## [1] 12
##
## $day
## [1] 31
##
## $dep_time
## [1] 1319
##
## $sched_dep_time
## [1] 1021
##
## $dep_delay
## [1] 528
##
## $arr_time
## [1] 1412
##
## $sched_arr_time
## [1] 1163
##
## $arr_delay
## [1] 578
##
## $carrier
## [1] 16
##
## $flight
## [1] 3844
##
## $tailnum
## [1] 4044
##
## $origin
## [1] 3
##
## $dest
## [1] 105
##
## $air_time
## [1] 510
##
## $distance
## [1] 214
##
## $hour
## [1] 20
##
## $minute
## [1] 60
##
## $time_hour
## [1] 6936
Observation:
1. Year,Month,Day all making sense.
2. 16 carriers.3844 different flights.3 origins,105 destinations.
【R与统计】对于EDA,也就是探索数据分析(Explorative Data Analysis) 问出合适且精准的问题,是核心和关键。
【R与统计】作EDA,对D的E和A从来不是自的,只是途径。EDA的最终自的是为了R和G,更好的PS
它是一个迭代的过程。你会: 1. 【核心】对你的数据生成问题。 2. 【过程】通过对数据可视化,变形,建模,搜寻问题的答案。 3. 【关键】就你所得到的信息,refine your questions to generate new questions.也就是修正你的问题,提升你问题的质量和适配性,从而生成新的问题。 然后迭代这3步。
【R与统计】你看,作EDA,了解你的数据从来不是最终的目的。对数据的探索,分析,对D的E和A,最终是为了R 和G更好的P(Refine和GenerateProblems).
【R与统计】问各种问题,挖掘数据,得到洞见(gaininsight),从而refineand generate more question.And iterate.
flights %>%
filter(dep_delay > 30) %>%
summarise(count = n())
## # A tibble: 1 × 1
## count
## <int>
## 1 48291
延误半小时的航班占总航班的多少?
round(48291/nrow(flights)*100,2) #nrow(flights):336776
## [1] 14.34
问题01:有多少航班起飞时延误超过半小时以上,但是至少准点抵达/抵达时并没有晚点呢? 力挽狂澜:重获满意的顾客
flights %>% filter(dep_delay > 30 &arr_delay < 0)
## # A tibble: 397 × 19
## year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
## <int> <int> <int> <int> <int> <dbl> <int> <int>
## 1 2013 1 1 1025 951 34 1258 1302
## 2 2013 1 2 727 645 42 1024 1028
## 3 2013 1 2 2053 2022 31 2331 2356
## 4 2013 1 3 1628 1550 38 1922 1925
## 5 2013 1 3 2152 2120 32 2346 2351
## 6 2013 1 4 1935 1900 35 2255 2301
## 7 2013 1 5 1934 1900 34 2159 2215
## 8 2013 1 7 1002 920 42 1242 1245
## 9 2013 1 7 1924 1850 34 2201 2212
## 10 2013 1 24 1402 1329 33 1644 1647
## # ℹ 387 more rows
## # ℹ 11 more variables: arr_delay <dbl>, carrier <chr>, flight <int>,
## # tailnum <chr>, origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>,
## # hour <dbl>, minute <dbl>, time_hour <dttm>
round(397/48291*100,2)
## [1] 0.82
观察:336776航班中,48291(14.34%)个航班起飞延误超过30分钟。在这些航班中,397(0.82%)个航班力挽了狂澜。
问题02:每个航空公司起飞延误超过一小时的航班次数? 超级延误大师:商业航空公司的嘴脸
看得更清楚
flights %>%
filter(dep_delay > 60) %>%
relocate(carrier,origin,dest,dep_delay,arr_delay) # 只查看感兴趣的信息
## # A tibble: 26,581 × 19
## carrier origin dest dep_delay arr_delay year month day dep_time
## <chr> <chr> <chr> <dbl> <dbl> <int> <int> <int> <int>
## 1 MQ LGA CLT 101 137 2013 1 1 811
## 2 AA JFK MIA 71 51 2013 1 1 826
## 3 MQ JFK BWI 853 851 2013 1 1 848
## 4 UA EWR BOS 144 123 2013 1 1 957
## 5 UA LGA IAH 134 145 2013 1 1 1114
## 6 EV EWR SAV 96 78 2013 1 1 1120
## 7 MQ LGA MSP 71 93 2013 1 1 1301
## 8 B6 JFK LAX 77 78 2013 1 1 1337
## 9 EV LGA MEM 70 103 2013 1 1 1400
## 10 EV EWR RIC 115 127 2013 1 1 1505
## # ℹ 26,571 more rows
## # ℹ 10 more variables: sched_dep_time <int>, arr_time <int>,
## # sched_arr_time <int>, flight <int>, tailnum <chr>, air_time <dbl>,
## # distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
flights %>%
filter(dep_delay > 60) %>%
group_by(carrier) %>% #对航空公司进行分组
summarise(count = n()) %>% #进行统计
arrange(desc(count)) # 从大到小排列
## # A tibble: 16 × 2
## carrier count
## <chr> <int>
## 1 EV 6861
## 2 B6 4571
## 3 UA 3824
## 4 DL 2651
## 5 AA 2003
## 6 MQ 1996
## 7 9E 1966
## 8 WN 1061
## 9 US 766
## 10 VX 363
## 11 FL 314
## 12 YV 79
## 13 F9 73
## 14 AS 39
## 15 HA 10
## 16 OO 4