数据分析系列

# 数据可视化
# 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.

数据探索(EXPLORATORY DATA ANALYSIS)

【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