농경지_면적 _시도_시_군.xlsx
메모리에 로드되지 않습니다
.전치, transpose
, Pivot(차원의 개수 줄이기))을 합니다.
- 단순 행과 열이 바뀌는게 아닌가?
- 차원이 줄어든다는 것을 정확하게 이해하지 못했어요
- 처음~2019(끝)까지 선택하고 2019위에 있는 추가버튼에 Pivot을 눌러보자.
- 진짜 줄어들긴 했다.
- 면적(헥타르)는 원래 문자열이었기 때문에, 정수로 변경했어도 차원에 위치하고 있다. 그러기에 이를 측정값으로 변경해주자.
- 행 선반에 시도를 배치하고, 헥타르를 더블 클릭해서 테이블 형태로 출력하였다.
- 데이터를 빠르게 확인하기 위해서 내림차순 정렬을 수행한다.
- 전체를 보기위해 이렇게 본다면, 가장 중요한 것은 내부 비교를 할 때는 전체합계가 없는 것이 나을 때가 많습니다.
- 다른 데이터와 비교하기에는 알맞지 않은 데이터인 것 같다.- 이상치 판단을 제대로 할 수 없을 수 있다.
- 분포를 확인해야 한다.
- 해당 데이터가 어떤 문제가 있는지는 분포를 확인해서 알 수 있다.
- 전국을 넣으면 데이터 비교가 어려우니 빼자.
- 상황을 보고(탐색, 분석) 데이터 제거를 하자.- 데이터 분석 작업은 나선형, 혹은 애자일 형태로 작업을 수행합니다.
맵
으로 바꾸면 잘 나온다.
- 이름 : p.시도
- 사용 가능한 값을 목록으로 해서 시도 필드를 선택
- 목록하고 다음에서 값 추가 누르면 [시도]필드 나온다.
- 사용 가능한 값을 목록으로 해서 [시도]필드를 선택(대화상자에서 다음에서 값 추가를 누르고 시도를 선택)
- 다 만들고
매개변수 표시
를 하면 우측에 표시된다.
- 매개변수에서 선택한 데이터의 색상을 변경하기 위해서 계산된 필드를 추가합니다.
- 필드 이름은h.시도
로 하겠습니다.
연도 필드를 열 선반에, 면적(헥타르) 필드를 행 선반에 배치하고, 마크는 [영역]으로 설정한 후 툴바에서 전체보기로 맞춤 설정
h.시도를 색상에 배치
- 우측에 있는 계산된 필드에서 참을 거짓 위로 올리기
연도 필드의 머리글이 하단에 있어서, 상단으로 배치하기 위해, [분석][테이블 레이아웃] [고급] 세로 축이... 체크박스 해제
연도가 4자리라 제대로 표시가 안되기에, 연도를 숫자로 우선 변환 하고, 열 선반에 있는 연도의 [추가메뉴][서식][기본값][날짜][사용자 지정] YY
로 설정
연도 라는 필드 레이블을 삭제
- 연도라는 텍스트 위에서 마우스 우클릭 후 [열에 대한 필드 레이블 숨기기] 선택
레이블 마크에 면적(헥타르) 배치 후, 마크 클릭해서 최소/최대 선택하고, 범위를 패널로 변경하고 필드를 연도를 선택하면, 연도의 초소와 최대에 해당하는 값만 출력합니다.
[h.시도] 필드에 대한 참과 거짓을 구분해서 표시하기 위한 계싼된 필드를 생성
- 필드 이름 : h.시도_레이블
- 계산식 : IIF([h.시도],[시도],"기타 지역")
[h.시도_레이블]을 마크-도구 설명에 배치
- 기존에는 해당 지역이 어디인지 몰랐지만, h.시도_레이블을 도구설명에 배치하고 데이터를 확인해볼 때, 해당 지역이 어디인지 설명해준다.
- 얼레벌레 첫 대시보드 만들기
워크시트를 추가하고, 이름을 [시도 별 맵 분할] 로 해두자.
화면 분할 개수를 설정하기 위한 매개변수를 생성
- p.화면분할
- 값은 3에서 6까지
2개의 계산된 필드 생성
- 이름 : X
- 계산식 : (INDEX()-1)%([p.화면분할])
- 이름 : Y
- 계산식 : INT((INDEX()-1)/([p.화면분할]))
- 둘 다 불연속형으로 변환
IIF[연도]={FIXED:MAX(연도)}THEN [면적(헥타르)]END
- 선택한 것만 값이 보이게 하려면
최근 연도 기준 면적 시트
에서c.최근 연도 기준 면적
계산된 필드 계산식을IF([시도 set]==True AND[연도]={FIXED:MAX([연도])})THEN [면적(헥타르)]END
로 설정하면 된다.
그냥 집합값 true인 것만 보여주겠다는 것이다.
pip install numpy
- import
import numpy : numpy 패키지는 numpy라는 이름으로 가져와서 사용 - numpy.array() from numpy import * : numpy의 모든 내용을 현재 패지키로 가져와서 사용 - array() import numpy as np : numpy패키지를 np라는 이름으로 가져와서 사용 - np.array() (권장)
# list 생성 li=range(1,1000000) #현재 시간 저장 s=datetime.datetime.now() #시작 시간 print("시작시간: ",s) #모든 요소에 10을 곱해서 list를 수정 for i in li: i=i*10 # guswo tlrks wjwkd s=datetime.datetime.now() # 종료시간 print("종료시간: ",s)
- 시작시간: 2023-08-07 15:24:12.477583
종료시간: 2023-08-07 15:24:12.544297ar=np.arange(1,1000000) #현재 시간 저장 s=datetime.datetime.now() #시작 시간 print("시작시간: ",s) #모든 요소에 10을 곱해서 list를 수정 ar=ar*10 # guswo tlrks wjwkd s=datetime.datetime.now() # 종료시간 print("종료시간: ",s)
- 시작시간: 2023-08-07 15:26:31.650011
종료시간: 2023-08-07 15:26:31.653016- 일반적으로 list보다 ndarray가 10배정도 빠르다.
ndarray((행의 수 ,))
: 권장하지 않음array(iterator 객체)
asarray
함수는 입력 데이터가 ndarray가 아니면, 복제를 해서 ndarray를 리턴하고, 입력데이터가 ndarray라면 참조만 복사합니다.
- dtype
- 요소의 자료형
- type(전체 자료형)과 혼동 하면 안된다.- ndim
- 배열의 차원- shape
- 각 차원의 크기를 저장한 정수 튜플
- 이미지 크기를 확인할 때나 데이터 구조를 확인할 때 많이 사용- size
- 데이터의 개수- itemsize
- 하나의 항목이 차지한 메모리 크기- nbytes
- 전체 메모리 크기
# 배열 정보 확인 ar=np.array([1,2,3,4]) print(type(ar)) # ar의 자료형 print(ar.dtype) # ar에 저장된 요소의 자료형 print(ar.ndim) print(ar.shape)
- 결과
<class 'numpy.ndarray'> int32 1 (4,)
ar=np.array([[1,2,3],[4,5,6]]) print(ar.ndim)# 2 print(ar.shape) # 2행 3열 # 이미지 데이터를 가져왔을 때, 반드시 ndim과 shape돌리기 하자
arrange([start,]stop,[step,],dtype=None)
linspace(start,stop,num=50,endpoint=True, retstep=False, dtype=None);
ar=np.arange(1,100,2) print(ar) ar=np.linspace(1,100,num=10) print(ar)
[ 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47
49 51 53 55 57 59 61 63 65 67 69 71 73 75 77 79 81 83 85 87 89 91 93 95 97 99]
[ 1. 12. 23. 34. 45. 56. 67. 78. 89. 100.]
eye(N,M=,k=,dtype=)
# eye - 대각선 방향으로 1을 채운 행렬 ar=np.eye(3) print(ar) ar=np.eye(3, k=1) # 3x3 대각행렬 생성후, 기본에서 위로 1 올라감 print(ar) ar=np.eye(3, k=-1) # 얘는 기본에서 1 내려감 print(ar)
ar=np.array([[1,2,3],[4,5,6],[7,8,9]]) print(ar) br=np.diag(ar) # 대각 방향이기에 1,5,9 print(br) cr=np.diag(ar,k=-1) # -1 한칸 내려간 대각이라 4,8만 print(cr)
ar=np.array([[1,2,3],[4,5,6],[7,8,9]]) print(ar) br=np.diag(ar) # 대각 방향이기에 1,5,9 print(br) cr=np.diag(ar,k=-1) # -1 한칸 내려간 대각이라 4,8만 print(cr)
[[1 2 3][4 5 6]
[7 8 9]]
[1 5 9]
[4 8]
ar=np.array([1,2,'3']) #문자열로 배열이 생성됩니다. print(ar) ar=np.array([1,2,'3'], dtype=np.int32) #정수로 자료형을 지정하자 print(ar) ar=np.array([1,2,'3']) #다시 문자열로 저장 print(ar) br=ar.astype(np.int32) #br은 정수형태임 print(br)
['1' '2' '3']
[1 2 3]
['1' '2' '3']
[1 2 3]
# 주의사항 matrix=np.array([[1,2,3],[4,5,6],[7,8,9]]) print(matrix) ar=matrix.reshape(-1) print(ar) # 여기까진 잘 나와 ar[0]=101 print(matrix) # 그런데 ar을 바꿨는데 matrix가 바뀐다. 둘이 동일하다. br=matrix.flatten() print(br) br[0]=201 print(matrix) print(br) #reshape는 접근 방법을 바꾼 것이라 동일한 데이터 #flatten은 복사본에 작업하는 것이라 다른 데이터이다.
- 이 2개는 무조건 외워야 합니다.
- 1차원으로 바꿀때는 flatten을 사용함
[인덱스] [시작위치:종료위치] [시작위치:] [:종료위치] [:]
- 단, 종료위치는 종료위치 앞까지이다.
[행번호][열번호]
-여기하단부분 약간 문제있어요
matrix=np.array([[1,2,3],[4,5,6],[7,8,9]]) print(matrix) #전체 출력 ar=matrix[0] br=matrix[0,] print(ar) print(br) # 둘다 0번행을 인덱싱하였다. ar[0]=100 # 인덱싱 해서 가져온 리스트의 값을 변경 print(ar) print(br) print(matrix) #참조 리턴이라 해당 부분이 싹 바뀐다. cr=matrix[[0]] # list를 이용하는 인덱싱을 팬시 인덱싱이라 한다. dr=matrix[0][:] # 범위를 이용하는 형태를 슬라이싱이라 한다. #복제된 데이터를 수정해도 원본에 영향을 주지 않습니다. print(cr) print(dr) cr[0,0]=486 dr[1]=972 print(cr) print(dr) print(matrix)
arr=np.array([10,2,30,5,22,37]) brr=np.array([1,2,3,4,5,6]) # 길이는 맞춰주자. print(brr[arr>=30])# arr이 30 이상인 인덱스를 가져옴 # 대신 이건 false false true false false true 이러고 true만 가져옴 # 그래서 길이가 동일하다고 가정하고 하는 것임
- 이때, and와 &가 다른 것을 기억하자.
전체 vs 개별
이다.- 즉 저 안에서 and 조건을 주려면 and 쓰면 터진다. (ambiguous)
- | 이걸 써줘야 할 것이다
- 배열과 연산을 할 때, and 나 or는 배열 자체를 true false로 간주하고 연산을 하고, | & ^ ! 는 배열의 데이터가 각각을 가지고 연산을 수행합니다.