이 예제에서는 timetable 데이터 컨테이너를 사용하여 자전거 통행량의 패턴을 분석하는 방법을 보여줍니다.
timetable 데이터 컨테이너는 타임스탬프가 지정된 데이터를 구성하고 전처리하는 데 사용됩니다.
데이터는 매사추세츠주 케임브리지에 있는 브로드웨이 스트리트(Broadway Street)의 센서 데이터입니다.
이 예제에서는 누락된 값 제거, 여러 시간 스텝을 가진 타임스탬프 데이터의 동기화 등 다양한 데이터 정리,
먼징(Munging), 전처리 작업을 수행하는 방법을 보여줍니다.
또한 timetable 데이터 컨테이너로 다음 작업을 수행하여 시각화와 그룹형 계산을 비롯한 데이터 탐색을 강조 표시합니다.
* 일일 자전거 통행량 탐색
* 자전거 통행량과 현지 기상 조건 비교
* 다양한 요일과 시간에 대한 자전거 통행량 분석
1) 자전거 통행량 데이터를 타임테이블로 가져오기
쉼표로 구분된 텍스트 파일에서 자전거 통행량 데이터 샘플을 가져옵니다.
readtable 함수는 데이터를 테이블 형식으로 반환합니다. head 함수를 사용하여 처음 8개 행을 표시합니다.
2) 시간값과 데이터에 액세스하기
categorical 함수를 통해 'Day' 변수를 categorical형으로 변환합니다.
categorical형 데이터는 유한한 이산 값 집합(예: 요일 이름)으로 구성된 데이터를 위해 설계되었습니다.
요일 순서대로 범주를 나열합니다. 점 첨자를 사용하여 이름으로 변수에 액세스해 보겠습니다.
타임테이블에서 시간값은 데이터 변수와는 별도로 처리됩니다.
타임테이블의 Properties에 액세스하여 행 시간값이 첫 번째 차원이고 변수가 두 번째 차원이라는 것을 확인합니다.
DimensionNames은 두 개 차원의 이름을 표시하고, VariableNames 속성은 두 번째 차원의 변수 이름들을 표시합니다.
table2timetable이 테이블을 타임테이블로 변환할 때 기본적으로 Timestamp를 첫 번째 차원 이름으로 할당했습니다. Timestamp가 원래 테이블의 변수 이름이기 때문입니다.
Properties를 통해 차원 이름과, 타임테이블의 기타 메타데이터를 변경할 수 있습니다.
차원 이름을 Time과 Data로 변경해 보겠습니다.
타임테이블의 처음 8개 행을 표시합니다.
가장 늦은 행 시간값과 가장 이른 행 시간값 사이의 경과일을 확인합니다.
차례로 변수를 참조할 때 점 표기법을 사용하여 변수에 액세스할 수 있습니다.
일반적인 자전거 수를 검토하려면 총 자전거 수의 평균과 서쪽 방향과 동쪽 방향으로 이동한 횟수를 계산하십시오.
중괄호를 사용하여 bikeData의 내용을 참조하면 숫자형 데이터를 행렬로 반환할 수 있습니다.
처음 8개 행을 표시해 보겠습니다. 표준 테이블 첨자를 사용하여 여러 변수에 액세스합니다.
평균은 숫자형 데이터에만 적합하므로 숫자형 변수 선택을 위해 vartype 함수를 사용합니다.
변수를 선택할 때 수동으로 테이블 또는 타임테이블의 요소를 참조하는 것보다 vartype을 사용하는 것이 더 편리합니다.
평균을 계산하고 NaN 값은 생략해 보겠습니다.
3) 날짜와 시간으로 데이터 선택하기
휴일에 얼마나 많은 사람들이 자전거를 이용하는지 확인하기 위해 7월 4일 공휴일의 데이터를 검토해 보겠습니다.
2015년 7월 4일의 행 시간값을 사용하여 타임테이블의 요소를 참조합니다.
행 시간값에 대해 인덱싱할 때는 시간이 정확히 일치해야 합니다.
시간 인덱스는 datetime 값, duration 값, 또는 날짜와 시간으로 변환할 수 있는 문자형 벡터로 지정할 수 있습니다.
여러 시간을 하나의 배열로 지정할 수 있습니다.
특정 날짜와 시간으로 bikeData의 요소를 참조하여 2015년 7월 4일의 데이터를 추출해 보겠습니다.
날짜만 지정하면 시간은 자정 또는 00:00:00으로 가정됩니다.
이 방법을 사용하여 하루 전체에 대한 데이터를 추출하는 것은 번거로운 일입니다.
특정 시간값에 대해 인덱싱하지 않고 시간 범위를 지정해도 됩니다.
시간 범위 첨자를 헬퍼로 생성하려면 timerange 함수를 사용하십시오.
2015년 7월 4일 하루 동안의 시간 범위를 타임테이블에 첨자로 사용합니다.
시작 시간을 7월 4일 자정으로, 종료 시간을 7월 5일 자정으로 지정합니다.
기본적으로 timerange는 시작 시간부터 종료 시간까지의 모든 시간값을 포함하되, 종료 시간은 포함하지 않습니다.
하루 동안의 자전거 수를 플로팅해 보겠습니다.
플롯에서 하루 동안 자전거 수는 점점 늘어나다가 오후가 되면 안정을 유지합니다.
많은 기업들이 근무를 하지 않기 때문에 플롯에서 출퇴근 시간에 일반적인 통행량이 표시되지 않습니다.
어두워지면 축하 불꽃놀이가 시작되어 늦은 저녁 시간에는 자전거 수가 최대치에 달합니다.
이러한 추세를 더 자세히 검토하려면 이 데이터를 보통날의 데이터와 비교해야 합니다.
7월 4월의 데이터와 나머지 7월 날짜들의 데이터를 비교해 보겠습니다.
4) 타임테이블을 사용하여 시간값과 데이터 전처리하기
보통 타임스탬프가 지정된 데이터 세트는 정리가 되지 않기 때문에 이상과 오류가 있을 수 있습니다.
타임테이블은 이상과 오류를 해결하는 데 매우 적합합니다.
타임테이블은 행 시간값을 특정 순서대로 정렬할 필요가 없습니다.
해당 행 시간값별로 정렬되지 않은 행을 포함할 수 있습니다.
또한 타임테이블에는 같은 행 시간값을 가진 행이 여러 개 포함될 수 있습니다.
물론 행에는 서로 다른 데이터 값이 있을 수도 있습니다.
행 시간값이 고유하고 정렬되어 있는 경우에도 행 시간값 간의 시간 스텝의 크기는 다를 수 있습니다.
타임테이블에는 누락된 행 시간값을 나타내는 NaT 값 또는 NaN 값도 포함될 수 있습니다.
timetable 데이터형은 누락된 시간값, 중복된 시간값 또는 불균일한 시간값을 해결할 수 있는 다양한 방법들을 제공합니다. 또한 데이터를 리샘플링하거나 집계하여 규칙적인 타임테이블을 생성할 수도 있습니다.
타임테이블이 규칙적이면 여기에 포함된 행 시간값은 정렬되어 있고 고유하며 균일한 간격의 시간 스텝을 가집니다.
* 누락된 행 시간값을 찾으려면 ismissing을 사용하십시오.
* 누락된 시간값과 데이터를 제거하려면 rmmissing을 사용하십시오.
* 타임테이블을 행 시간값을 기준으로 정렬하려면 sortrows를 사용하십시오.
* 고유하고 정렬된 행 시간값이 포함된 타임테이블을 만들려면 unique와 retime을 사용하십시오.
* 규칙적인 타임테이블을 만들려면 균일한 간격의 시간 벡터를 지정하고 retime을 사용하십시오.
5) 시간순으로 정렬하기
타임테이블이 정렬되어 있는지 확인합니다. 행 시간값이 오름차순으로 나열되어 있으면 타임테이블이 정렬된 것입니다.
타임테이블을 정렬해 보겠습니다.
sortrows 함수는 행을 해당 행 시간값을 기준으로 가장 이른 시간에서 가장 늦은 시간으로 정렬합니다.
중복된 행 시간값을 가진 행이 있으면 sortrows는 모든 중복 항목을 출력값으로 복사합니다.
6) 누락된 시간값과 데이터를 식별하고 제거하기
타임테이블에서는 변수 또는 행 시간값에 누락된 데이터 지정자를 사용할 수 있습니다.
예를 들어, 누락된 숫자형 값은 NaN으로, 누락된 datetime형 값은 NaT로 표시할 수 있습니다.
standardizeMissing 함수, ismissing 함수, rmmissing 함수, fillmissing 함수를 사용하여
각각 누락된 값을 할당하고 찾고 제거하고 채울 수 있습니다.
타임테이블 변수의 누락된 값을 찾아 개수를 세어 보겠습니다.
이 예제에서 누락된 값은 수집된 데이터가 없는 경우를 나타냅니다.
ismissing의 출력값은 테이블과 크기가 같은 logical 행렬로, 누락된 데이터 값을 true로 식별합니다.
누락된 데이터 지정자가 있는 행을 표시해 보겠습니다.
ismissing(bikeData)는 시간값이 아니라 타임테이블의 변수에서만 누락된 데이터를 찾습니다.
누락된 행 시간값을 찾으려면 행 시간값에 대해 ismissing을 호출하십시오.
이 예제에서 누락된 시간값 또는 데이터 값은 계측 오류를 나타내므로 제외할 수 있습니다.
rmmissing을 사용하여 누락된 데이터 값이나 누락된 행 시간값이 포함된 테이블 행을 제거해 보겠습니다.
7) 중복된 시간값이나 중복된 데이터 제거하기
데이터에 중복된 시간값 및/또는 중복된 행이 있는지 확인합니다.
명확한 중복 항목은 계측 오차로 간주될 수도 있으므로 제외하는 것이 좋습니다.
정렬된 시간값들 사이의 차이가 정확하게 0인 경우를 찾아 중복된 시간값을 식별해 보겠습니다.
반복되는 시간값은 3개이고, 2015년 11월 19일은 두 번 반복됩니다. 반복된 시간값과 관련된 데이터를 검토해 보겠습니다.
첫 번째의 경우 시간값이 중복되지만 데이터는 중복되지 않는 반면,
나머지의 경우는 시간값과 데이터가 완전히 중복됩니다.
타임테이블의 행에 다른 행과 동일한 행 시간값이 포함되어 있고,
데이터 값 또한 동일하게 포함되어 있으면 해당 행은 중복 항목으로 간주됩니다.
unique를 사용하여 타임테이블에서 중복된 행을 제거할 수 있습니다.
또한 unique 함수는 행 시간값을 기준으로 행을 정렬합니다.
시간값이 중복되지만 데이터는 중복되지 않는 행은 확인이 필요합니다.
이러한 시간값에 대한 데이터를 검토해 보겠습니다.
이 경우, 데이터와 그 관련 시간값들이 일관되기 때문에 중복된 시간값은 실수일 수 있습니다.
중복 항목이 01:00:00을 나타내는 것으로 보이지만 원래 몇 시여야 하는지 확실하지는 않습니다.
두 시간 지점의 데이터를 설명하기 위해 데이터를 누적할 수 있습니다.
유일하게 수동으로 수행할 수 있는 작업입니다.
하지만 대부분의 행에서는 retime 함수로 이 계산을 수행할 수 있습니다.
sum 함수를 사용하여 집계함으로써 데이터를 누적하고 고유 시간값으로 만듭니다.
sum은 숫자형 데이터에는 적합하지만 타임테이블의 categorical형 데이터에는 적합하지 않습니다.
vartype을 사용하여 숫자형 변수를 식별해 보겠습니다.
categorical형 데이터의 합을 구할 수는 없지만 하나의 레이블이 하루를 나타내기 때문에
각 시간값의 첫 번째 값을 취하면 됩니다.
동일한 시간 벡터로 다시 retime 연산을 수행하여 타임테이블을 결합할 수 있습니다.
8) 시간 간격의 균등성 검사하기
이 데이터는 균등하게 1시간 간격의 시간 스텝을 가지는 것으로 보입니다.
타임테이블의 모든 행 시간값에 균등한 간격이 적용되었는지 확인하려면 isregular 함수를 사용하십시오.
isregular는 중복되거나 누락된 시간값(NaT 또는 NaN) 없이 균일한 간격으로 정렬된 시간값(단조 증가)에 대해서는
true를 반환합니다.
출력값 0 또는 false는 타임테이블의 시간값에 균일한 간격이 적용되지 않았다는 것을 나타냅니다.
시간 간격을 더 자세히 탐색해 보겠습니다.
타임테이블에 규칙적인 시간 간격을 적용하려면 retime 또는 synchronize를 사용하여 원하는 시간 간격을 지정하십시오.
9) 일일 자전거 수량 확인하기
retime 함수를 사용하여 일일 자전거 수를 확인해 보겠습니다.
sum 메서드를 사용하여 각 날짜의 개수 데이터를 누적할 수 있습니다.
sum은 숫자형 데이터에는 적합하지만 타임테이블의 categorical형 데이터에는 적합하지 않습니다.
데이터형으로 변수를 식별하려면 vartype을 사용하십시오.
또다시, categorical형 데이터를 표시하기 위해 retime 연산을 적합한 메서드와 함께 다시 수행하고
타임테이블을 결합할 수 있습니다.
10) 자전거 수와 기상 데이터 동기화하기
자전거 수와 기상 데이터를 비교하여 날씨가 자전거 이용에 미치는 영향을 검토해 보겠습니다.
폭풍을 비롯해 매사추세츠주 보스턴의 과거 기상 데이터가 포함된 기상 타임테이블을 불러와 보겠습니다.
타임테이블의 시간값과 변수를 요약하려면 summary 함수를 사용하십시오.
synchronize를 사용하여 자전거 데이터와 기상 데이터를 공통된 시간 벡터로 결합합니다.
synchronize 함수 도움말 페이지에 설명된 메서드를 사용하여 타임테이블 데이터를 리샘플링하거나 집계할 수 있습니다.
두 타임테이블의 데이터를 각 일별 시간 벡터의 교집합에서 생성된, 공통된 시간 벡터로 동기화해 보겠습니다.
별도의 y축에서 자전거 통행량과 실외 온도를 비교하여 추세를 검토합니다.
시각화를 위해 데이터에서 주말 부분은 제거해 보겠습니다.
플롯에서 통행량 데이터와 기상 데이터가 유사한 추세를 보이는 것을 알 수 있습니다. 플롯을 확대해 보겠습니다.
추세가 유사한 것으로 보아 날씨가 추울수록 자전거를 이용하는 사람들이 줄어든다는 것을 알 수 있습니다.
11) 요일과 시간 모두를 기준으로 분석하기
요일이나 시간 등 다양한 간격을 기준으로 데이터를 검토합니다.
varfun을 사용하여 변수에 대해 그룹형 계산을 수행하면 일별 총 자전거 수를 확인할 수 있습니다.
sum 함수를 함수 핸들로 지정하고 이름-값 쌍을 사용하여 그룹화 변수와 원하는 출력 유형을 지정해 보겠습니다.
막대 플롯에서 주중에 통행량이 더 많은 것을 알 수 있습니다.
동쪽 방향 통행량과 서쪽 방향 통행량에 차이가 있는 것도 알 수 있습니다.
이는 사람들이 도시로 올 때와 도시에서 나갈 때 다른 경로를 이용한다는 의미인 것 같습니다.
또는 일부 사람들이 특정 날짜에 도시로 온 후 다른 날 돌아간 것일 수도 있습니다.
시간을 확인하고 varfun을 사용하여 그룹형 계산을 수행해 보겠습니다.
일반적인 출퇴근 시간인 오전 9시와 오후 5시 무렵에 통행량이 최고치에 달합니다.
그리고 동쪽 방향 추세와 서쪽 방향 추세가 다릅니다.
일반적으로 서쪽 방향은 케임브리지 근교의 주거 지역과 대학교로 향하는 경로입니다.
동쪽 방향은 보스턴으로 향하는 경로입니다.
늦은 오후에는 동쪽 방향보다 서쪽 방향으로 향하는 통행량이 더 많습니다.
아마 대학교 일정과 해당 지역의 식당가로 향하는 통행량 때문인 것 같습니다.
시간과 요일 모두를 기준으로 하여 추세를 검토해 보겠습니다.
요일을 변수로 취하도록 타임테이블을 정렬하려면 unstack 함수를 사용하십시오.
월요일부터 금요일까지 평일에는 통행량이 러시아워에 최대치를 기록하고
저녁에는 점점 줄어드는 유사한 추세를 보입니다.
금요일의 경우 통행량이 줄어들지만 전반적인 추세는 다른 평일과 유사합니다.
토요일과 일요일은 러시아워에 통행량이 최대치가 아니며 오후로 갈수록 증가하는 서로 유사한 추세를 보입니다.
늦은 저녁의 추세도 월요일부터 금요일까지 유사하지만 금요일에는 통행량이 줄어듭니다.
12) 러시아워의 통행량 분석하기
하루 전체 시간의 추세를 검토하기 위해 러시아워 시간값을 기준으로 데이터를 분할합니다.
discretize 함수에 여러 시간값 또는 시간값 단위를 사용할 수 있습니다.
예를 들어, 데이터를 AM, AMRush, Day, PMRush, PM에 대한 그룹으로 구분합니다.
그런 다음, varfun을 사용하여 그룹별로 평균을 계산합니다.
일반적으로 이 지역의 저녁과 아침 러시아워 시간대의 자전거 통행량은 다른 시간대에 비해 2배 많습니다.
이른 아침에는 통행량이 매우 적지만, 늦은 저녁에는 아침과 저녁 러시아워를 제외한 낮 시간과 견줄 만큼
상당한 통행량이 있습니다.