In [1]:
# 20만건 이상의 데이터가 담긴 샘플 hflighrs 패키지 설치
# install.packages('hflights')
In [2]:
# 그림 라이브러리
library(ggplot2)
Warning message:
"package 'ggplot2' was built under R version 3.6.3"
In [3]:
library(hflights)
In [4]:
# 구조 확인 - str()
str(hflights)
'data.frame':	227496 obs. of  21 variables:
 $ Year             : int  2011 2011 2011 2011 2011 2011 2011 2011 2011 2011 ...
 $ Month            : int  1 1 1 1 1 1 1 1 1 1 ...
 $ DayofMonth       : int  1 2 3 4 5 6 7 8 9 10 ...
 $ DayOfWeek        : int  6 7 1 2 3 4 5 6 7 1 ...
 $ DepTime          : int  1400 1401 1352 1403 1405 1359 1359 1355 1443 1443 ...
 $ ArrTime          : int  1500 1501 1502 1513 1507 1503 1509 1454 1554 1553 ...
 $ UniqueCarrier    : chr  "AA" "AA" "AA" "AA" ...
 $ FlightNum        : int  428 428 428 428 428 428 428 428 428 428 ...
 $ TailNum          : chr  "N576AA" "N557AA" "N541AA" "N403AA" ...
 $ ActualElapsedTime: int  60 60 70 70 62 64 70 59 71 70 ...
 $ AirTime          : int  40 45 48 39 44 45 43 40 41 45 ...
 $ ArrDelay         : int  -10 -9 -8 3 -3 -7 -1 -16 44 43 ...
 $ DepDelay         : int  0 1 -8 3 5 -1 -1 -5 43 43 ...
 $ Origin           : chr  "IAH" "IAH" "IAH" "IAH" ...
 $ Dest             : chr  "DFW" "DFW" "DFW" "DFW" ...
 $ Distance         : int  224 224 224 224 224 224 224 224 224 224 ...
 $ TaxiIn           : int  7 6 5 9 9 6 12 7 8 6 ...
 $ TaxiOut          : int  13 9 17 22 9 13 15 12 22 19 ...
 $ Cancelled        : int  0 0 0 0 0 0 0 0 0 0 ...
 $ CancellationCode : chr  "" "" "" "" ...
 $ Diverted         : int  0 0 0 0 0 0 0 0 0 0 ...
In [5]:
# 맨 앞 자로 확인(6개) - head()
head(hflights)
YearMonthDayofMonthDayOfWeekDepTimeArrTimeUniqueCarrierFlightNumTailNumActualElapsedTime...ArrDelayDepDelayOriginDestDistanceTaxiInTaxiOutCancelledCancellationCodeDiverted
54242011 1 1 6 1400 1500 AA 428 N576AA60 ... -10 0 IAH DFW 224 7 13 0 0
54252011 1 2 7 1401 1501 AA 428 N557AA60 ... -9 1 IAH DFW 224 6 9 0 0
54262011 1 3 1 1352 1502 AA 428 N541AA70 ... -8 -8 IAH DFW 224 5 17 0 0
54272011 1 4 2 1403 1513 AA 428 N403AA70 ... 3 3 IAH DFW 224 9 22 0 0
54282011 1 5 3 1405 1507 AA 428 N492AA62 ... -3 5 IAH DFW 224 9 9 0 0
54292011 1 6 4 1359 1503 AA 428 N262AA64 ... -7 -1 IAH DFW 224 6 13 0 0
In [6]:
# 특정 변수 확인
dest_table <- table(hflights$Dest)
dest_table
 ABQ  AEX  AGS  AMA  ANC  ASE  ATL  AUS  AVL  BFL  BHM  BKG  BNA  BOS  BPT  BRO 
2812  724    1 1297  125  125 7886 5022  350  504 2736  110 3481 1752    3 1692 
 BTR  BWI  CAE  CHS  CID  CLE  CLT  CMH  COS  CRP  CRW  CVG  DAL  DAY  DCA  DEN 
1762 2551  561 1200  410 2140 4735 1348 1657 4813  357 1535 9820  451 2699 5920 
 DFW  DSM  DTW  ECP  EGE  ELP  EWR  FLL  GJT  GPT  GRK  GRR  GSO  GSP  GUC  HDN 
6653  647 2601  729  110 3036 4314 2462  403 1618   42  677  630 1123   86  110 
 HNL  HOB  HRL  HSV  IAD  ICT  IND  JAN  JAX  JFK  LAS  LAX  LBB  LCH  LEX  LFT 
 402  309 3983  923 1980 1517 1750 2011 2135  695 4082 6064 1333  364  584 2313 
 LGA  LIT  LRD  MAF  MCI  MCO  MDW  MEM  MFE  MIA  MKE  MLU  MOB  MSP  MSY  MTJ 
2730 1579 1188 2306 3174 3687 2094 2399 1128 2463 1588  292 1674 2010 6823  164 
 OAK  OKC  OMA  ONT  ORD  ORF  PBI  PDX  PHL  PHX  PIT  PNS  PSP  RDU  RIC  RNO 
 690 3170 2044  952 5748  717 1253 1235 2367 5096 1664 1539  106 1740  900  243 
 RSW  SAN  SAT  SAV  SDF  SEA  SFO  SHV  SJC  SJU  SLC  SMF  SNA  STL  TPA  TUL 
 948 2936 4893  863 1279 2615 2818  787  885  391 2033 1014 1661 2509 3085 2924 
 TUS  TYS  VPS  XNA 
1565 1210  880 1172 
In [7]:
# 명목형 변수 개수 확인 - lenght()
length(dest_table)

# 범위 확인 - range() : 최소값 최대값
range(dest_table)
116
  1. 1
  2. 9820
In [8]:
# 가장 큰값, 작은값의 이름 찾기
dest_table[dest_table == 1]
dest_table[dest_table == 9820]
AGS: 1
DAL: 9820
In [9]:
# dest가 5000이 넘는 테이블
dest_table_5000 <- dest_table[dest_table > 5000]
dest_table_5000
 ATL  AUS  DAL  DEN  DFW  LAX  MSY  ORD  PHX 
7886 5022 9820 5920 6653 6064 6823 5748 5096 
In [10]:
# 막대그래프 작성
barplot(dest_table_5000)

대장암 환자 자료 분석

어느 연령대가 가장 많은 대장임이 발생하는가?

In [11]:
# 데이터 가져오기
df <- read.csv('r-ggagi-data/example_cancer.csv')
str(df)
'data.frame':	18310 obs. of  8 variables:
 $ age            : int  75 52 67 62 70 76 55 72 64 71 ...
 $ sex            : Factor w/ 2 levels "남","여": 1 2 2 1 1 2 1 1 1 1 ...
 $ height         : Factor w/ 485 levels "100","130","130.2",..: 252 408 182 262 352 352 467 165 172 232 ...
 $ weight         : Factor w/ 638 levels "100","101","101.1",..: 333 446 349 263 343 563 463 243 363 248 ...
 $ dateOfoperation: Factor w/ 351 levels "2011-01-02","2011-01-03",..: 165 134 146 164 154 160 164 147 219 192 ...
 $ cancerStaging  : Factor w/ 5 levels "I","II","III",..: 1 4 3 1 2 3 2 3 1 2 ...
 $ hospitalization: int  48 17 10 11 10 10 12 18 15 35 ...
 $ diseaseCode    : Factor w/ 13 levels "C18","C180","C181",..: 9 9 9 9 4 11 9 4 13 11 ...
In [12]:
# 연령대별 도수 - 연속형 변수, 구간 나누기
age_table <- table(cut(df$age, breaks=(0:11)*10))
age_table
   (0,10]   (10,20]   (20,30]   (30,40]   (40,50]   (50,60]   (60,70]   (70,80] 
        0         3        77       482      1917      4558      5679      4598 
  (80,90]  (90,100] (100,110] 
      962        33         1 
In [13]:
# 변수 이름 변경
rownames(age_table) <- c('1s','10s','20s','30s','40s','50s','60s','70s','80s','90s','100s')
age_table
  1s  10s  20s  30s  40s  50s  60s  70s  80s  90s 100s 
   0    3   77  482 1917 4558 5679 4598  962   33    1 
In [14]:
head(df,3)
agesexheightweightdateOfoperationcancerStaginghospitalizationdiseaseCode
75 161 64 2011-06-22I 48 C187
52 176.6 75.3 2011-05-19IV 17 C187
67 154 65.6 2011-05-31III 10 C187
In [15]:
# 시각화1 : 막대그래프
barplot(age_table)
In [16]:
# 시각화2 : 선
library('ggplot2')
library('ggthemes')
Warning message:
"package 'ggthemes' was built under R version 3.6.3"
In [17]:
ggplot(data=df, aes(x=age)) +
geom_freqpoly(binwidth=10, size=1.4, colour='orange') +
theme_wsj()

전국 커피숍 폐업/영업 상황 살펴보기

공공데이터 포털 https://www.data.go.kr

In [18]:
# 데이터 로드
df  <- read.csv('r-ggagi-data/example_coffee.csv', header = T, stringsAsFactors = T)
In [19]:
# 데이터 구조 확인
str(df)
'data.frame':	46832 obs. of  23 variables:
 $ number              : int  1 2 3 4 5 6 7 8 9 10 ...
 $ companyName         : Factor w/ 36991 levels "-10","#11(Sharp eleven)",..: 2 4 5 6 7 8 9 10 11 12 ...
 $ adress              : Factor w/ 45197 levels "","강원도 강릉시 강동면 안인진리 3-5번지 통일공원 G동 2층 ",..: 32695 45012 14332 25672 35262 44619 44059 16795 4038 16983 ...
 $ adressBystreet      : Factor w/ 38866 levels "","강원도 강릉시 가작로 13, 1층 (교동)",..: 28058 38633 12180 22436 1 38386 37843 14490 3373 14482 ...
 $ dateOflicensing     : int  20080917 20101124 20130902 20121108 20020911 20130822 20140605 20111209 20130315 20110908 ...
 $ stateOfbusiness     : Factor w/ 2 levels "운영중","폐업 등": 1 1 1 1 2 1 1 1 1 1 ...
 $ dateOfclosure       : int  NA NA NA NA 20071105 NA NA NA NA NA ...
 $ startdateOfcessation: logi  NA NA NA NA NA NA ...
 $ duedateOfcessation  : logi  NA NA NA NA NA NA ...
 $ dateOfreOpen        : logi  NA NA NA NA NA NA ...
 $ areaOfsite          : logi  NA NA NA NA NA NA ...
 $ zip                 : logi  NA NA NA NA NA NA ...
 $ waterwork           : Factor w/ 5 levels "","간이상수도",..: 4 4 4 4 4 4 4 4 4 4 ...
 $ numOfmenWorker      : int  NA NA NA NA 0 NA NA NA NA NA ...
 $ yearOfStart         : int  2008 2010 2013 2012 2002 2013 2014 2011 2013 2011 ...
 $ multipleUse         : Factor w/ 3 levels "","N","Y": 2 2 2 2 2 2 2 2 2 2 ...
 $ grade               : Factor w/ 8 levels "","갑","관리",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ sizeOfsite          : num  20.8 212.7 20 64.2 11.4 ...
 $ numOfwomenWorker    : int  NA NA NA NA 0 NA NA NA NA NA ...
 $ vicintyOfsite       : Factor w/ 8 levels "","결혼예식장주변",..: 1 1 4 1 1 1 1 3 1 3 ...
 $ sanitaryName        : Factor w/ 2 levels "","휴게음식점": 2 2 2 2 2 2 2 2 2 2 ...
 $ businessCondition   : Factor w/ 2 levels "","커피숍": 2 2 2 2 2 2 2 2 2 2 ...
 $ totalOfworker       : int  NA NA NA NA 0 NA NA NA NA NA ...
In [20]:
# 불필요 변수 제거
df <- subset(df, 
   select=c(-adress, -adressBystreet, -dateOfclosure, -startdateOfcessation, -duedateOfcessation, -dateOfreOpen, -zip))
str(df)
'data.frame':	46832 obs. of  16 variables:
 $ number           : int  1 2 3 4 5 6 7 8 9 10 ...
 $ companyName      : Factor w/ 36991 levels "-10","#11(Sharp eleven)",..: 2 4 5 6 7 8 9 10 11 12 ...
 $ dateOflicensing  : int  20080917 20101124 20130902 20121108 20020911 20130822 20140605 20111209 20130315 20110908 ...
 $ stateOfbusiness  : Factor w/ 2 levels "운영중","폐업 등": 1 1 1 1 2 1 1 1 1 1 ...
 $ areaOfsite       : logi  NA NA NA NA NA NA ...
 $ waterwork        : Factor w/ 5 levels "","간이상수도",..: 4 4 4 4 4 4 4 4 4 4 ...
 $ numOfmenWorker   : int  NA NA NA NA 0 NA NA NA NA NA ...
 $ yearOfStart      : int  2008 2010 2013 2012 2002 2013 2014 2011 2013 2011 ...
 $ multipleUse      : Factor w/ 3 levels "","N","Y": 2 2 2 2 2 2 2 2 2 2 ...
 $ grade            : Factor w/ 8 levels "","갑","관리",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ sizeOfsite       : num  20.8 212.7 20 64.2 11.4 ...
 $ numOfwomenWorker : int  NA NA NA NA 0 NA NA NA NA NA ...
 $ vicintyOfsite    : Factor w/ 8 levels "","결혼예식장주변",..: 1 1 4 1 1 1 1 3 1 3 ...
 $ sanitaryName     : Factor w/ 2 levels "","휴게음식점": 2 2 2 2 2 2 2 2 2 2 ...
 $ businessCondition: Factor w/ 2 levels "","커피숍": 2 2 2 2 2 2 2 2 2 2 ...
 $ totalOfworker    : int  NA NA NA NA 0 NA NA NA NA NA ...
In [21]:
# 최초 커피숍 찾기
range(df$yearOfStart) # 결과값 x
range(df$yearOfStart, na.rm = T) # 결측치 제거
  1. <NA>
  2. <NA>
  1. 1964
  2. 2015
In [22]:
# 1964년에 오픈한 최초의 커피숍
subset(df, subset = (yearOfStart == 1964))
numbercompanyNamedateOflicensingstateOfbusinessareaOfsitewaterworknumOfmenWorkeryearOfStartmultipleUsegradesizeOfsitenumOfwomenWorkervicintyOfsitesanitaryNamebusinessConditiontotalOfworker
2303523035 엠에스커피19641125 폐업 등 NA 상수도전용0 1964 N 0 0 기타 휴게음식점커피숍 0
4629046290 홀릭 19640929 폐업 등 NA 0 1964 N 기타 0 0 기타 휴게음식점커피숍 0
In [23]:
# 가장 오래된 운영중인 커피숍 찾기
df_filter <- subset(df, subset = (stateOfbusiness == '운영중'))
range(df_filter$yearOfStart, na.rm = T) # 결측치 제거
subset(df_filter, subset = (yearOfStart == 1967))
  1. 1967
  2. 2015
numbercompanyNamedateOflicensingstateOfbusinessareaOfsitewaterworknumOfmenWorkeryearOfStartmultipleUsegradesizeOfsitenumOfwomenWorkervicintyOfsitesanitaryNamebusinessConditiontotalOfworker
2410824108 왕관 커피숍19671013 운영중 NA 상수도전용 0 1967 N 76.02 1 기타 휴게음식점 커피숍 1
4493444934 학커피숍 19670414 운영중 NA 0 1967 N 59.13 0 휴게음식점 커피숍 0
In [24]:
# 해마다 오픈하는 커피숍 개수
table(df$yearOfStart)
1964 1966 1967 1968 1969 1970 1971 1972 1974 1975 1976 1979 1980 1981 1982 1983 
   2    2    3    1    2    4    6    3    1    2    5    4    9    8   12    9 
1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 
  11   18   21   21   26   23   25   28   37   50   48   48   41   54   54   46 
2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 
  89  183  398  799  648  654  863 1233 1579 2489 4172 5942 6315 7270 9905 3650 
In [25]:
# 시각화
qplot(data = df, df$yearOfStart, geom='bar') # geom : 차트의 모양
Warning message:
"Use of `df$yearOfStart` is discouraged. Use `yearOfStart` instead."Warning message:
"Removed 19 rows containing non-finite values (stat_count)."
In [26]:
# 분할표 작성 - 운영중/폐업
stat_table <- table(df$stateOfbusiness, df$yearOfStart)
stat_table
         
          1964 1966 1967 1968 1969 1970 1971 1972 1974 1975 1976 1979 1980 1981
  운영중     0    0    2    0    0    2    4    2    1    1    1    2    3    6
  폐업 등    2    2    1    1    2    2    2    1    0    1    4    2    6    2
         
          1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995
  운영중     2    3    4    5    5    6   11    5    7    7    3   14   14   13
  폐업 등   10    6    7   13   16   15   15   18   18   21   34   36   34   35
         
          1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009
  운영중    14   21   25   23   26   76  105  163  180  204  314  496  729 1229
  폐업 등   27   33   29   23   63  107  293  636  468  450  549  737  850 1260
         
          2010 2011 2012 2013 2014 2015
  운영중  2503 3961 4642 6045 9125 3564
  폐업 등 1669 1981 1673 1225  780   86
In [27]:
# 조건으로 특정 칼럼값 찾기 - wihch()
# 행조건 rownames, 열조건 colnames
which(colnames(stat_table) == 1993) # = 칼럼명이 1993인 위치 찾기
which.max(colnames(stat_table)) # = 최대치 칼럼(마지막)의 위치
26
48
In [28]:
# 위에서 찾은 칼럼 위치(26~48)에 해당하는 테이블 생성
stat_table_col_26_48 <- stat_table[,c(26:48)]
stat_table_col_26_48
         
          1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006
  운영중    14   14   13   14   21   25   23   26   76  105  163  180  204  314
  폐업 등   36   34   35   27   33   29   23   63  107  293  636  468  450  549
         
          2007 2008 2009 2010 2011 2012 2013 2014 2015
  운영중   496  729 1229 2503 3961 4642 6045 9125 3564
  폐업 등  737  850 1260 1669 1981 1673 1225  780   86
In [29]:
# 비율 계산
stat_prop_table <- prop.table(stat_table_col_26_48, margin = 2) # margin = 2 열기준
stat_prop_table
         
                1993       1994       1995       1996       1997       1998
  운영중  0.28000000 0.29166667 0.27083333 0.34146341 0.38888889 0.46296296
  폐업 등 0.72000000 0.70833333 0.72916667 0.65853659 0.61111111 0.53703704
         
                1999       2000       2001       2002       2003       2004
  운영중  0.50000000 0.29213483 0.41530055 0.26381910 0.20400501 0.27777778
  폐업 등 0.50000000 0.70786517 0.58469945 0.73618090 0.79599499 0.72222222
         
                2005       2006       2007       2008       2009       2010
  운영중  0.31192661 0.36384705 0.40227088 0.46168461 0.49377260 0.59995206
  폐업 등 0.68807339 0.63615295 0.59772912 0.53831539 0.50622740 0.40004794
         
                2011       2012       2013       2014       2015
  운영중  0.66661057 0.73507522 0.83149931 0.92125189 0.97643836
  폐업 등 0.33338943 0.26492478 0.16850069 0.07874811 0.02356164
In [30]:
# 데이터프레임 구성
input1 <- stat_table_col_26_48
input2 <- stat_prop_table
df_bind <- data.frame(colnames(input1), input1[1,], input1[2,], input2[1,], input2[2,])
df_bind
colnames.input1.input1.1...input1.2...input2.1...input2.2...
19931993 14 36 0.2800000 0.72000000
19941994 14 34 0.2916667 0.70833333
19951995 13 35 0.2708333 0.72916667
19961996 14 27 0.3414634 0.65853659
19971997 21 33 0.3888889 0.61111111
19981998 25 29 0.4629630 0.53703704
19991999 23 23 0.5000000 0.50000000
20002000 26 63 0.2921348 0.70786517
20012001 76 107 0.4153005 0.58469945
20022002 105 293 0.2638191 0.73618090
20032003 163 636 0.2040050 0.79599499
20042004 180 468 0.2777778 0.72222222
20052005 204 450 0.3119266 0.68807339
20062006 314 549 0.3638470 0.63615295
20072007 496 737 0.4022709 0.59772912
20082008 729 850 0.4616846 0.53831539
20092009 1229 1260 0.4937726 0.50622740
20102010 2503 1669 0.5999521 0.40004794
20112011 3961 1981 0.6666106 0.33338943
20122012 4642 1673 0.7350752 0.26492478
20132013 6045 1225 0.8314993 0.16850069
20142014 9125 780 0.9212519 0.07874811
20152015 3564 86 0.9764384 0.02356164
In [31]:
# 행삭제, 열이름 부여
rownames(df_bind) <- NULL
colnames(df_bind) <- c('Year','Open','Close','POpen','PClose')
df_bind
YearOpenClosePOpenPClose
1993 14 36 0.2800000 0.72000000
1994 14 34 0.2916667 0.70833333
1995 13 35 0.2708333 0.72916667
1996 14 27 0.3414634 0.65853659
1997 21 33 0.3888889 0.61111111
1998 25 29 0.4629630 0.53703704
1999 23 23 0.5000000 0.50000000
2000 26 63 0.2921348 0.70786517
2001 76 107 0.4153005 0.58469945
2002 105 293 0.2638191 0.73618090
2003 163 636 0.2040050 0.79599499
2004 180 468 0.2777778 0.72222222
2005 204 450 0.3119266 0.68807339
2006 314 549 0.3638470 0.63615295
2007 496 737 0.4022709 0.59772912
2008 729 850 0.4616846 0.53831539
2009 1229 1260 0.4937726 0.50622740
2010 2503 1669 0.5999521 0.40004794
2011 3961 1981 0.6666106 0.33338943
2012 4642 1673 0.7350752 0.26492478
2013 6045 1225 0.8314993 0.16850069
2014 9125 780 0.9212519 0.07874811
2015 3564 86 0.9764384 0.02356164
In [32]:
# 시각화 - 선  / aes = 축
ggplot(df_bind, aes(x=Year, y=Close, group=1)) +
    geom_line(colour='steelblue1', size=1) +
    geom_point(colour='steelblue', size=3) + 
    geom_line(aes(y=Open), colour='tomato2', size=1) + # aex를 따로 지정하지 않으면 선행된 Year, Close가 사용 
    geom_point(aes(y=Open), colour='red', size=3) +
    theme_bw() # 배경 색
In [33]:
# 전국 커피숍 규모 파악
df <- read.csv('r-ggagi-data/example_coffee.csv', header = T, stringsAsFactors = T)
size <- df$sizeOfsite
str(size)
summary(size)
 num [1:46832] 20.8 212.7 20 64.2 11.4 ...
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max.     NA's 
    0.00    28.12    50.00    75.53    93.75 24075.00       19 
In [34]:
# 아웃라이어(이상치) 삭제 (평균보다 지나치게 다른 값) 
# 이상치를 NA로 바꾼 뒤 하단에서 모든 NA값 제거
size[size > 10000] <- NA
size[size == 0]  <- NA
In [35]:
# NA값 삭제(결측치 : 없는 값)
size  <-  size[complete.cases(size)]
summary(size)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   0.25   30.00   51.92   77.23   95.30 1406.38 
In [36]:
# 20단위 계급 생성
degree_size <- table(cut(size, breaks = (0:72)*20))
degree_size
             (0,20]             (20,40]             (40,60]             (60,80] 
               6026               11303                8293                5283 
           (80,100]           (100,120]           (120,140]           (140,160] 
               4239                2246                1751                1297 
          (160,180]           (180,200]           (200,220]           (220,240] 
                959                 882                 568                 512 
          (240,260]           (260,280]           (280,300]           (300,320] 
                394                 331                 347                 179 
          (320,340]           (340,360]           (360,380]           (380,400] 
                191                 112                 105                  94 
          (400,420]           (420,440]           (440,460]           (460,480] 
                 81                  60                  42                  34 
          (480,500]           (500,520]           (520,540]           (540,560] 
                 32                  18                  16                  14 
          (560,580]           (580,600]           (600,620]           (620,640] 
                 12                   9                   9                   5 
          (640,660]           (660,680]           (680,700]           (700,720] 
                  4                   4                   0                   1 
          (720,740]           (740,760]           (760,780]           (780,800] 
                  1                   2                   4                   1 
          (800,820]           (820,840]           (840,860]           (860,880] 
                  1                   1                   0                   0 
          (880,900]           (900,920]           (920,940]           (940,960] 
                  0                   2                   1                   0 
          (960,980]         (980,1e+03]    (1e+03,1.02e+03] (1.02e+03,1.04e+03] 
                  0                   1                   0                   0 
(1.04e+03,1.06e+03] (1.06e+03,1.08e+03]  (1.08e+03,1.1e+03]  (1.1e+03,1.12e+03] 
                  2                   0                   0                   0 
(1.12e+03,1.14e+03] (1.14e+03,1.16e+03] (1.16e+03,1.18e+03]  (1.18e+03,1.2e+03] 
                  0                   0                   0                   0 
 (1.2e+03,1.22e+03] (1.22e+03,1.24e+03] (1.24e+03,1.26e+03] (1.26e+03,1.28e+03] 
                  1                   0                   0                   0 
 (1.28e+03,1.3e+03]  (1.3e+03,1.32e+03] (1.32e+03,1.34e+03] (1.34e+03,1.36e+03] 
                  0                   0                   0                   0 
(1.36e+03,1.38e+03]  (1.38e+03,1.4e+03]  (1.4e+03,1.42e+03] (1.42e+03,1.44e+03] 
                  0                   0                   1                   0 
In [37]:
# 시각화
ggplot(data=df, aes(x=sizeOfsite)) +
    geom_freqpoly(binwidth=10, size=1.2, colour='orange') +
    scale_x_continuous(limits = c(0,300), breaks = seq(0,300,20)) +
    theme_wsj()
Warning message:
"Removed 1060 rows containing non-finite values (stat_bin)."Warning message:
"Removed 2 row(s) containing missing values (geom_path)."

전국 인구조사 자료 정리하기

통계청 작성 전국 인구조사 데이터 이용

In [38]:
# 데이터 불러오기
# 인구수에 ","가 있어 문자열로 불러오기 stringAsFactors = F
df  <-  read.csv('r-ggagi-data/example_population.csv', stringsAsFactors = F)
str(df)
'data.frame':	281 obs. of  7 variables:
 $ City      : chr  "서울특별시  (1100000000)" "서울특별시 종로구 (1111000000)" "서울특별시 중구 (1114000000)" "서울특별시 용산구 (1117000000)" ...
 $ Population: chr  "10,078,850" "155,695" "126,817" "235,186" ...
 $ Households: chr  "4,197,478" "72,882" "59,614" "108,138" ...
 $ PersInHou : num  2.4 2.14 2.13 2.17 2.35 2.28 2.26 2.36 2.41 2.36 ...
 $ Male      : chr  "4,962,774" "76,962" "63,292" "114,119" ...
 $ Female    : chr  "5,116,076" "78,733" "63,525" "121,067" ...
 $ SexRatio  : num  0.97 0.98 1 0.94 0.99 0.97 1.01 1 0.96 0.97 ...
In [39]:
# 자료 값 확인
head(df)
CityPopulationHouseholdsPersInHouMaleFemaleSexRatio
서울특별시 (1100000000) 10,078,850 4,197,478 2.40 4,962,774 5,116,076 0.97
서울특별시 종로구 (1111000000)155,695 72,882 2.14 76,962 78,733 0.98
서울특별시 중구 (1114000000) 126,817 59,614 2.13 63,292 63,525 1.00
서울특별시 용산구 (1117000000)235,186 108,138 2.17 114,119 121,067 0.94
서울특별시 성동구 (1120000000)298,145 126,915 2.35 148,265 149,880 0.99
서울특별시 광진구 (1121500000)362,197 158,769 2.28 177,946 184,251 0.97
In [40]:
# 문자열 분리 : stringr 패키지 설치
#install.packages('stringr')
In [41]:
# 라이브러리
library('stringr')
Warning message:
"package 'stringr' was built under R version 3.6.3"
In [42]:
df[,1]
  1. '서울특별시 (1100000000)'
  2. '서울특별시 종로구 (1111000000)'
  3. '서울특별시 중구 (1114000000)'
  4. '서울특별시 용산구 (1117000000)'
  5. '서울특별시 성동구 (1120000000)'
  6. '서울특별시 광진구 (1121500000)'
  7. '서울특별시 동대문구 (1123000000)'
  8. '서울특별시 중랑구 (1126000000)'
  9. '서울특별시 성북구 (1129000000)'
  10. '서울특별시 강북구 (1130500000)'
  11. '서울특별시 도봉구 (1132000000)'
  12. '서울특별시 노원구 (1135000000)'
  13. '서울특별시 은평구 (1138000000)'
  14. '서울특별시 서대문구 (1141000000)'
  15. '서울특별시 마포구 (1144000000)'
  16. '서울특별시 양천구 (1147000000)'
  17. '서울특별시 강서구 (1150000000)'
  18. '서울특별시 구로구 (1153000000)'
  19. '서울특별시 금천구 (1154500000)'
  20. '서울특별시 영등포구 (1156000000)'
  21. '서울특별시 동작구 (1159000000)'
  22. '서울특별시 관악구 (1162000000)'
  23. '서울특별시 서초구 (1165000000)'
  24. '서울특별시 강남구 (1168000000)'
  25. '서울특별시 송파구 (1171000000)'
  26. '서울특별시 강동구 (1174000000)'
  27. '부산광역시 (2600000000)'
  28. '부산광역시 중구 (2611000000)'
  29. '부산광역시 서구 (2614000000)'
  30. '부산광역시 동구 (2617000000)'
  31. '부산광역시 영도구 (2620000000)'
  32. '부산광역시 부산진구 (2623000000)'
  33. '부산광역시 동래구 (2626000000)'
  34. '부산광역시 남구 (2629000000)'
  35. '부산광역시 북구 (2632000000)'
  36. '부산광역시 해운대구 (2635000000)'
  37. '부산광역시 사하구 (2638000000)'
  38. '부산광역시 금정구 (2641000000)'
  39. '부산광역시 강서구 (2644000000)'
  40. '부산광역시 연제구 (2647000000)'
  41. '부산광역시 수영구 (2650000000)'
  42. '부산광역시 사상구 (2653000000)'
  43. '부산광역시 기장군 (2671000000)'
  44. '대구광역시 (2700000000)'
  45. '대구광역시 중구 (2711000000)'
  46. '대구광역시 동구 (2714000000)'
  47. '대구광역시 서구 (2717000000)'
  48. '대구광역시 남구 (2720000000)'
  49. '대구광역시 북구 (2723000000)'
  50. '대구광역시 수성구 (2726000000)'
  51. '대구광역시 달서구 (2729000000)'
  52. '대구광역시 달성군 (2771000000)'
  53. '인천광역시 (2800000000)'
  54. '인천광역시 중구 (2811000000)'
  55. '인천광역시 동구 (2814000000)'
  56. '인천광역시 남구 (2817000000)'
  57. '인천광역시 연수구 (2818500000)'
  58. '인천광역시 남동구 (2820000000)'
  59. '인천광역시 부평구 (2823700000)'
  60. '인천광역시 계양구 (2824500000)'
  61. '인천광역시 서구 (2826000000)'
  62. '인천광역시 강화군 (2871000000)'
  63. '인천광역시 옹진군 (2872000000)'
  64. '광주광역시 (2900000000)'
  65. '광주광역시 동구 (2911000000)'
  66. '광주광역시 서구 (2914000000)'
  67. '광주광역시 남구 (2915500000)'
  68. '광주광역시 북구 (2917000000)'
  69. '광주광역시 광산구 (2920000000)'
  70. '대전광역시 (3000000000)'
  71. '대전광역시 동구 (3011000000)'
  72. '대전광역시 중구 (3014000000)'
  73. '대전광역시 서구 (3017000000)'
  74. '대전광역시 유성구 (3020000000)'
  75. '대전광역시 대덕구 (3023000000)'
  76. '울산광역시 (3100000000)'
  77. '울산광역시 중구 (3111000000)'
  78. '울산광역시 남구 (3114000000)'
  79. '울산광역시 동구 (3117000000)'
  80. '울산광역시 북구 (3120000000)'
  81. '울산광역시 울주군 (3171000000)'
  82. '세종특별자치시 (3600000000)'
  83. '세종특별자치시 (3611000000)'
  84. '경기도 (4100000000)'
  85. '경기도 수원시 (4111000000)'
  86. '경기도 수원시 장안구 (4111100000)'
  87. '경기도 수원시 권선구 (4111300000)'
  88. '경기도 수원시 팔달구 (4111500000)'
  89. '경기도 수원시 영통구 (4111700000)'
  90. '경기도 성남시 (4113000000)'
  91. '경기도 성남시 수정구 (4113100000)'
  92. '경기도 성남시 중원구 (4113300000)'
  93. '경기도 성남시 분당구 (4113500000)'
  94. '경기도 의정부시 (4115000000)'
  95. '경기도 안양시 (4117000000)'
  96. '경기도 안양시 만안구 (4117100000)'
  97. '경기도 안양시 동안구 (4117300000)'
  98. '경기도 부천시 (4119000000)'
  99. '경기도 부천시 원미구 (4119500000)'
  100. '경기도 부천시 소사구 (4119700000)'
  101. '경기도 부천시 오정구 (4119900000)'
  102. '경기도 광명시 (4121000000)'
  103. '경기도 평택시 (4122000000)'
  104. '경기도 동두천시 (4125000000)'
  105. '경기도 안산시 (4127000000)'
  106. '경기도 안산시 상록구 (4127100000)'
  107. '경기도 안산시 단원구 (4127300000)'
  108. '경기도 고양시 (4128000000)'
  109. '경기도 고양시 덕양구 (4128100000)'
  110. '경기도 고양시 일산동구 (4128500000)'
  111. '경기도 고양시 일산서구 (4128700000)'
  112. '경기도 과천시 (4129000000)'
  113. '경기도 구리시 (4131000000)'
  114. '경기도 남양주시 (4136000000)'
  115. '경기도 오산시 (4137000000)'
  116. '경기도 시흥시 (4139000000)'
  117. '경기도 군포시 (4141000000)'
  118. '경기도 의왕시 (4143000000)'
  119. '경기도 하남시 (4145000000)'
  120. '경기도 용인시 (4146000000)'
  121. '경기도 용인시 처인구 (4146100000)'
  122. '경기도 용인시 기흥구 (4146300000)'
  123. '경기도 용인시 수지구 (4146500000)'
  124. '경기도 파주시 (4148000000)'
  125. '경기도 이천시 (4150000000)'
  126. '경기도 안성시 (4155000000)'
  127. '경기도 김포시 (4157000000)'
  128. '경기도 화성시 (4159000000)'
  129. '경기도 광주시 (4161000000)'
  130. '경기도 양주시 (4163000000)'
  131. '경기도 포천시 (4165000000)'
  132. '경기도 여주시 (4167000000)'
  133. '경기도 연천군 (4180000000)'
  134. '경기도 가평군 (4182000000)'
  135. '경기도 양평군 (4183000000)'
  136. '강원도 (4200000000)'
  137. '강원도 춘천시 (4211000000)'
  138. '강원도 원주시 (4213000000)'
  139. '강원도 강릉시 (4215000000)'
  140. '강원도 동해시 (4217000000)'
  141. '강원도 태백시 (4219000000)'
  142. '강원도 속초시 (4221000000)'
  143. '강원도 삼척시 (4223000000)'
  144. '강원도 홍천군 (4272000000)'
  145. '강원도 횡성군 (4273000000)'
  146. '강원도 영월군 (4275000000)'
  147. '강원도 평창군 (4276000000)'
  148. '강원도 정선군 (4277000000)'
  149. '강원도 철원군 (4278000000)'
  150. '강원도 화천군 (4279000000)'
  151. '강원도 양구군 (4280000000)'
  152. '강원도 인제군 (4281000000)'
  153. '강원도 고성군 (4282000000)'
  154. '강원도 양양군 (4283000000)'
  155. '충청북도 (4300000000)'
  156. '충청북도 청주시 (4311000000)'
  157. '충청북도 청주시 상당구 (4311100000)'
  158. '충청북도 청주시 서원구 (4311200000)'
  159. '충청북도 청주시 흥덕구 (4311300000)'
  160. '충청북도 청주시 청원구 (4311400000)'
  161. '충청북도 충주시 (4313000000)'
  162. '충청북도 제천시 (4315000000)'
  163. '충청북도 보은군 (4372000000)'
  164. '충청북도 옥천군 (4373000000)'
  165. '충청북도 영동군 (4374000000)'
  166. '충청북도 증평군 (4374500000)'
  167. '충청북도 진천군 (4375000000)'
  168. '충청북도 괴산군 (4376000000)'
  169. '충청북도 음성군 (4377000000)'
  170. '충청북도 단양군 (4380000000)'
  171. '충청남도 (4400000000)'
  172. '충청남도 천안시 (4413000000)'
  173. '충청남도 천안시 동남구 (4413100000)'
  174. '충청남도 천안시 서북구 (4413300000)'
  175. '충청남도 공주시 (4415000000)'
  176. '충청남도 보령시 (4418000000)'
  177. '충청남도 아산시 (4420000000)'
  178. '충청남도 서산시 (4421000000)'
  179. '충청남도 논산시 (4423000000)'
  180. '충청남도 계룡시 (4425000000)'
  181. '충청남도 당진시 (4427000000)'
  182. '충청남도 금산군 (4471000000)'
  183. '충청남도 부여군 (4476000000)'
  184. '충청남도 서천군 (4477000000)'
  185. '충청남도 청양군 (4479000000)'
  186. '충청남도 홍성군 (4480000000)'
  187. '충청남도 예산군 (4481000000)'
  188. '충청남도 태안군 (4482500000)'
  189. '전라북도 (4500000000)'
  190. '전라북도 전주시 (4511000000)'
  191. '전라북도 전주시 완산구 (4511100000)'
  192. '전라북도 전주시 덕진구 (4511300000)'
  193. '전라북도 군산시 (4513000000)'
  194. '전라북도 익산시 (4514000000)'
  195. '전라북도 정읍시 (4518000000)'
  196. '전라북도 남원시 (4519000000)'
  197. '전라북도 김제시 (4521000000)'
  198. '전라북도 완주군 (4571000000)'
  199. '전라북도 진안군 (4572000000)'
  200. '전라북도 무주군 (4573000000)'
  201. '전라북도 장수군 (4574000000)'
  202. '전라북도 임실군 (4575000000)'
  203. '전라북도 순창군 (4577000000)'
  204. '전라북도 고창군 (4579000000)'
  205. '전라북도 부안군 (4580000000)'
  206. '전라남도 (4600000000)'
  207. '전라남도 목포시 (4611000000)'
  208. '전라남도 여수시 (4613000000)'
  209. '전라남도 순천시 (4615000000)'
  210. '전라남도 나주시 (4617000000)'
  211. '전라남도 광양시 (4623000000)'
  212. '전라남도 담양군 (4671000000)'
  213. '전라남도 곡성군 (4672000000)'
  214. '전라남도 구례군 (4673000000)'
  215. '전라남도 고흥군 (4677000000)'
  216. '전라남도 보성군 (4678000000)'
  217. '전라남도 화순군 (4679000000)'
  218. '전라남도 장흥군 (4680000000)'
  219. '전라남도 강진군 (4681000000)'
  220. '전라남도 해남군 (4682000000)'
  221. '전라남도 영암군 (4683000000)'
  222. '전라남도 무안군 (4684000000)'
  223. '전라남도 함평군 (4686000000)'
  224. '전라남도 영광군 (4687000000)'
  225. '전라남도 장성군 (4688000000)'
  226. '전라남도 완도군 (4689000000)'
  227. '전라남도 진도군 (4690000000)'
  228. '전라남도 신안군 (4691000000)'
  229. '경상북도 (4700000000)'
  230. '경상북도 포항시 (4711000000)'
  231. '경상북도 포항시 남구 (4711100000)'
  232. '경상북도 포항시 북구 (4711300000)'
  233. '경상북도 경주시 (4713000000)'
  234. '경상북도 김천시 (4715000000)'
  235. '경상북도 안동시 (4717000000)'
  236. '경상북도 구미시 (4719000000)'
  237. '경상북도 영주시 (4721000000)'
  238. '경상북도 영천시 (4723000000)'
  239. '경상북도 상주시 (4725000000)'
  240. '경상북도 문경시 (4728000000)'
  241. '경상북도 경산시 (4729000000)'
  242. '경상북도 군위군 (4772000000)'
  243. '경상북도 의성군 (4773000000)'
  244. '경상북도 청송군 (4775000000)'
  245. '경상북도 영양군 (4776000000)'
  246. '경상북도 영덕군 (4777000000)'
  247. '경상북도 청도군 (4782000000)'
  248. '경상북도 고령군 (4783000000)'
  249. '경상북도 성주군 (4784000000)'
  250. '경상북도 칠곡군 (4785000000)'
  251. '경상북도 예천군 (4790000000)'
  252. '경상북도 봉화군 (4792000000)'
  253. '경상북도 울진군 (4793000000)'
  254. '경상북도 울릉군 (4794000000)'
  255. '경상남도 (4800000000)'
  256. '경상남도 창원시 (4812000000)'
  257. '경상남도 창원시 의창구 (4812100000)'
  258. '경상남도 창원시 성산구 (4812300000)'
  259. '경상남도 창원시 마산합포구 (4812500000)'
  260. '경상남도 창원시 마산회원구 (4812700000)'
  261. '경상남도 창원시 진해구 (4812900000)'
  262. '경상남도 진주시 (4817000000)'
  263. '경상남도 통영시 (4822000000)'
  264. '경상남도 사천시 (4824000000)'
  265. '경상남도 김해시 (4825000000)'
  266. '경상남도 밀양시 (4827000000)'
  267. '경상남도 거제시 (4831000000)'
  268. '경상남도 양산시 (4833000000)'
  269. '경상남도 의령군 (4872000000)'
  270. '경상남도 함안군 (4873000000)'
  271. '경상남도 창녕군 (4874000000)'
  272. '경상남도 고성군 (4882000000)'
  273. '경상남도 남해군 (4884000000)'
  274. '경상남도 하동군 (4885000000)'
  275. '경상남도 산청군 (4886000000)'
  276. '경상남도 함양군 (4887000000)'
  277. '경상남도 거창군 (4888000000)'
  278. '경상남도 합천군 (4889000000)'
  279. '제주특별자치도 (5000000000)'
  280. '제주특별자치도 제주시 (5011000000)'
  281. '제주특별자치도 서귀포시 (5013000000)'
In [43]:
# ( 기준으로 지역과 인구 수를 분리
temp <- str_split_fixed(df[,1], '\\(', 2) 
head(temp)
서울특별시 1100000000)
서울특별시 종로구 1111000000)
서울특별시 중구 1114000000)
서울특별시 용산구 1117000000)
서울특별시 성동구 1120000000)
서울특별시 광진구 1121500000)
In [44]:
# 공백 기준으로 시 구 분리 
new_city <- str_split_fixed(temp[,1], ' ',2)
head(new_city)
서울특별시
서울특별시종로구
서울특별시중구
서울특별시용산구
서울특별시성동구
서울특별시광진구
In [45]:
# 변수명 변경
colnames(new_city) <- c('Provinces', 'City')
head(new_city)
ProvincesCity
서울특별시
서울특별시종로구
서울특별시중구
서울특별시용산구
서울특별시성동구
서울특별시광진구
In [46]:
# 데이터프레임 생성
df_new <- data.frame(new_city, df[,c(2:7)])
df_new[df_new$Provinces =='세종특별자치시',]
ProvincesCityPopulationHouseholdsPersInHouMaleFemaleSexRatio
82세종특별자치시 185,212 72,733 2.55 93,058 92,154 1.01
83세종특별자치시 185,212 72,733 2.55 93,058 92,154 1.01
In [47]:
# 시티 공백 제거
df_new[df_new == ' '] <- NA
head(df_new)
df_new[df_new$Provinces =='세종특별자치시',]
ProvincesCityPopulationHouseholdsPersInHouMaleFemaleSexRatio
서울특별시NA 10,078,8504,197,478 2.40 4,962,774 5,116,076 0.97
서울특별시종로구 155,695 72,882 2.14 76,962 78,733 0.98
서울특별시중구 126,817 59,614 2.13 63,292 63,525 1.00
서울특별시용산구 235,186 108,138 2.17 114,119 121,067 0.94
서울특별시성동구 298,145 126,915 2.35 148,265 149,880 0.99
서울특별시광진구 362,197 158,769 2.28 177,946 184,251 0.97
ProvincesCityPopulationHouseholdsPersInHouMaleFemaleSexRatio
82세종특별자치시NA 185,212 72,733 2.55 93,058 92,154 1.01
83세종특별자치시NA 185,212 72,733 2.55 93,058 92,154 1.01
In [48]:
# NA가 존재하는 행 제거
df_new2 <- df_new[complete.cases(df_new),] # ,는 모든 칼럼을 가져옴을 의미
head(df_new2)
df_new2[df_new2$Provinces =='세종특별자치시',]
ProvincesCityPopulationHouseholdsPersInHouMaleFemaleSexRatio
2서울특별시종로구 155,695 72,882 2.14 76,962 78,733 0.98
3서울특별시중구 126,817 59,614 2.13 63,292 63,525 1.00
4서울특별시용산구 235,186 108,138 2.17 114,119 121,067 0.94
5서울특별시성동구 298,145 126,915 2.35 148,265 149,880 0.99
6서울특별시광진구 362,197 158,769 2.28 177,946 184,251 0.97
7서울특별시동대문구 362,604 160,110 2.26 181,825 180,779 1.01
ProvincesCityPopulationHouseholdsPersInHouMaleFemaleSexRatio
In [49]:
head(complete.cases(df_new))
  1. FALSE
  2. TRUE
  3. TRUE
  4. TRUE
  5. TRUE
  6. TRUE
In [50]:
# is.na() NA가 있는 값 TRUE
head(is.na(df_new))
ProvincesCityPopulationHouseholdsPersInHouMaleFemaleSexRatio
FALSE TRUEFALSEFALSEFALSEFALSEFALSEFALSE
FALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSE
FALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSE
FALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSE
FALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSE
FALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSE
In [51]:
# NA가 있는 행 불러오기
df_new3 <- df_new[is.na(df_new$City),]
head(df_new3)
# =
df_new4 <- df_new[!complete.cases(df_new),]
head(df_new4)
ProvincesCityPopulationHouseholdsPersInHouMaleFemaleSexRatio
1서울특별시NA 10,078,8504,197,478 2.40 4,962,774 5,116,076 0.97
27부산광역시NA 3,517,491 1,430,441 2.46 1,737,975 1,779,516 0.98
44대구광역시NA 2,491,137 977,714 2.55 1,239,275 1,251,862 0.99
53인천광역시NA 2,914,271 1,145,232 2.54 1,464,320 1,449,951 1.01
64광주광역시NA 1,476,974 577,941 2.56 731,808 745,166 0.98
70대전광역시NA 1,525,656 595,216 2.56 763,262 762,394 1.00
ProvincesCityPopulationHouseholdsPersInHouMaleFemaleSexRatio
1서울특별시NA 10,078,8504,197,478 2.40 4,962,774 5,116,076 0.97
27부산광역시NA 3,517,491 1,430,441 2.46 1,737,975 1,779,516 0.98
44대구광역시NA 2,491,137 977,714 2.55 1,239,275 1,251,862 0.99
53인천광역시NA 2,914,271 1,145,232 2.54 1,464,320 1,449,951 1.01
64광주광역시NA 1,476,974 577,941 2.56 731,808 745,166 0.98
70대전광역시NA 1,525,656 595,216 2.56 763,262 762,394 1.00
In [52]:
# 인구수 변수 "," 처리하고 수치형으로 반환
str(df_new2)
'data.frame':	263 obs. of  8 variables:
 $ Provinces : Factor w/ 17 levels "강원도","경기도",..: 9 9 9 9 9 9 9 9 9 9 ...
 $ City      : Factor w/ 241 levels " ","가평군 ",..: 188 189 158 105 32 65 190 106 6 63 ...
 $ Population: chr  "155,695" "126,817" "235,186" "298,145" ...
 $ Households: chr  "72,882" "59,614" "108,138" "126,915" ...
 $ PersInHou : num  2.14 2.13 2.17 2.35 2.28 2.26 2.36 2.41 2.36 2.57 ...
 $ Male      : chr  "76,962" "63,292" "114,119" "148,265" ...
 $ Female    : chr  "78,733" "63,525" "121,067" "149,880" ...
 $ SexRatio  : num  0.98 1 0.94 0.99 0.97 1.01 1 0.96 0.97 0.97 ...
In [53]:
for(i in 3:8){
    df_new2[,i] <- sapply(df_new2[,i], function(x) gsub(',','',x)) # ','를 ''으로 변환해서 다시 담기
    df_new2[,i] <- as.numeric(df_new2[,i]) # 수치(문자->숫자)화해서 다시 담기
}
df_fin <- df_new2
head(df_fin)
ProvincesCityPopulationHouseholdsPersInHouMaleFemaleSexRatio
2서울특별시종로구 155695 72882 2.14 76962 78733 0.98
3서울특별시중구 126817 59614 2.13 63292 63525 1.00
4서울특별시용산구 235186 108138 2.17 114119 121067 0.94
5서울특별시성동구 298145 126915 2.35 148265 149880 0.99
6서울특별시광진구 362197 158769 2.28 177946 184251 0.97
7서울특별시동대문구 362604 160110 2.26 181825 180779 1.01
In [54]:
# 그룹별로 동일한 함수 적용 - tapply(적용할 변수, 그룹지을 변수, 적용할 함수)
# ex. tapply(height, sex, mean) : 성별로 키 값 평균
sum_pop <- tapply(df_fin$Population, df_fin$Provinces,sum) # : 지역별로 인구 합계
sum_pop
강원도
1547166
경기도
18723822
경상남도
4428762
경상북도
3215695
광주광역시
1476974
대구광역시
2491137
대전광역시
1525656
부산광역시
3517491
서울특별시
10078850
세종특별자치시
<NA>
울산광역시
1169768
인천광역시
2914271
전라남도
1902638
전라북도
2523806
제주특별자치도
615250
충청남도
2671383
충청북도
2414568
In [55]:
# 레벨 값이 남아있어 세종특별자치시가 나타나는 경우 삭제
df_fin[,1] <- factor(df_fin[,1]) # 값이 없는 level 삭제
sum_pop <- tapply(df_fin$Population, df_fin$Provinces,sum) 
sum_pop
강원도
1547166
경기도
18723822
경상남도
4428762
경상북도
3215695
광주광역시
1476974
대구광역시
2491137
대전광역시
1525656
부산광역시
3517491
서울특별시
10078850
울산광역시
1169768
인천광역시
2914271
전라남도
1902638
전라북도
2523806
제주특별자치도
615250
충청남도
2671383
충청북도
2414568
In [56]:
# 시각화,     aes : 축 생성을 의미
ggplot(df_fin, aes(x=Provinces, y=Population, fill=Provinces)) +
# = ggplot(data=df_fin, aes(x=df_fin$Provinces, y=Population, fill=Provinces)) +
geom_bar(stat='identity') +
theme_wsj()
In [57]:
write.csv(df_fin, 'example_pop_final.csv')