[STATA] 특정기관 한정된 정리표 만들기

오늘 작업할 스타타 파일은 위와 같다.

  • 기업명과 직종은 코드화 되어 있으며, 직렬 및 직군은 해당 회사에 한정되어 string으로 입력되어 있다.

결과 미리보기:

이 중 기업코드 2, 3, 4 에만 한정하여 총 인원 및 직종의 개수, 직렬의 개수, 직급의 개수를 알 수 있는 표를 뽑아보자.

반복문을 쓰는 이유…

  • 물론 기업수가 3개 밖에 안되면 궂이 반복문이나 메트릭스를 쓰지 않아도 어렵지 않게 뽑아 낼 수 있지만…
  • 최근 360개의 기관에 관한 개인 데이터를 만질일이 있었는데…
  • 총 인원대비 직종수를 비교해가며… 원자료의 오류를 찾아내는 일을 하고 있다.
  • 그럴땐 이렇게 기업코드를 기준으로 excel로 추출한 뒤 vlookup을 사용하여 비교하는게 “매우 몹시… 혼또니…” 손으로 하는 것보다 빨랐다…

1. Working Directory 지정

cd "W:\SATA"

2. Summary용 메트릭스 생성

mat mccode = (0)
mat mfreq = (0)
mat mj1 = (0)
mat mj2 = (0)
mat mj3 = (0)
  • 0의 값을 하나 가지고 있는 [1, 1] 메트릭스를 5개 생성했다.
  • 각각의 이름은 :
  • mccode – 기업코드를 저장할 메트릭스
  • mfreq – 기업내 총 인원 수를 저장할 메트릭스
  • mj1 – 기업별 총 직종 개수를 저장할 메트릭스
  • mj2 – 기업별 총 직렬 개수를 저장할 메트릭스
  • mj3 – 기업별 총 직군 개수를 저장할 메트릭스

3. 반복문을 사용하여 메트릭스에 차곡차곡 정보 쌓기

foreach num of numlist 2 3 4 {
	display `num'
	tab 기업코드 if 기업코드==`num', nol matcell(freq) matrow(ccode)
	mat mccode = mccode\ccode
	mat mfreq = mfreq\freq
	tab 직종 if 기업코드==`num'
	mat j1 = r(r)
	mat mj1 = mj1\j1
	tab 직렬 if 기업코드==`num'
	mat j2 = r(r)
	mat mj2 = mj2\j2
	tab 직군 if 기업코드==`num'
	mat j3 = r(r)
	mat mj3 = mj3\j3
}

해설

foreach num of numlist 2 3 4 {
  • `num’ 이라는 변수를 2, 3, 4로 바꾸어 가며 반복문 시작
	display `num'
  • 2, 3, 4 가 `num’에 제대로 들어갔는지 확인
	tab 기업코드 if 기업코드==`num', nol matcell(freq) matrow(ccode)
  • 기업코드가 `num’ 인 기업을 조건으로 기업코드에 대해 tabulate 명령 실행
  • nol –> 기업코드로 레이블링이 define 되어 있다면 그냥 숫자로 보여줄 것
  • matcell(freq) –> 테이블의 행 정보, 즉, 기업의 개인정보 관측치 (i.e. 기업내 사원수)를 freq라는 메트릭스로 저장
  • matrow(ccode) –> 테이블의 열 정보, 즉, 기업코드를 ccode라는 메트릭스로 저장
  • 이때 메트릭스 ‘freq’와 ‘ccode’는 한 한가지의 기업에 대하여 if 기업코드==`num’ 에 대하여 검색한 결과이기때문에 [1, 1] 메트릭스로 생성됨
	mat mccode = mccode\ccode
	mat mfreq = mfreq\freq
  • ccode를 미리 만들어둔 mccode 아래 붙힘
  • freq를 미리 만들어둔 mfreq 아래 붙힘
  • 첫번째 루프를 돌릴때 mccode는 [1, 1]메트릭스에서 [2, 1] 메트릭스가 됨
  • 두번째 루프를 돌릴때 mccode는 [2, 1]메트릭스에서 [3, 1] 메트릭스가 됨
  • 모든 루프를 다 돌리면 mccode는 아래와 같이 [4, 1]이 됨
	tab 직종 if 기업코드==`num'
	mat j1 = r(r)
	mat mj1 = mj1\j1
  • 여기서는 직종을 tabulate 한 결과보다
  • 직종을 tabulate한 뒤 스케일러 r(r) 변수에 꼿히는 관측치에 더 관심이 있음
  • 기업코드=2의 직종은 11, 23, 25, 27로 총 4개가 존재함….
  • di r(r)로 4개가 존재하는지 확인가능
  • mat j1 = r(r) –> r(r)의 값(4)을 j1이라고 하는 메트릭스에 넣음 이때 메트릭스 사이즈는 [1, 1]
  • mat mj1 = mj1\j1 –> 메트릭스 j1을 메트릭스 mj1아래 넣기…
  • 위 mccode와 같은 원리로 첫번째 루프때 mj1 메트릭스는 [2, 1]이 되며 최종적으로는 [4, 1] 메트릭스가 됨

4. 최종적으로 만들어진 메트릭스 엑셀로 보내기

putexcel set analysis_table, replace
putexcel A1=mat(mccode) B1=mat(mfreq) C1=mat(mj1) D1=mat(mj2) E1=mat(mj3)
putexcel A1=("기업코드") B1=("총인원") C1=("직종수") D1=("직렬수") E1=("직급수")
putexcel close
  • working directory에 analysis_table.xlsx 파일을 만듬
  • 엑셀 A1 셀에 mccode 메트릭스 [4, 1]를 삽입 –> 이러면 A1 부터 A4까지 메트릭스 안의 숫자가 삽입됨
  • 엑셀 B1 셀에 mfreq 메트릭스 [4, 1]를 삽입
  • 엑셀 C1 셀에 mj1 메트릭스 [4, 1]를 삽입
  • 엑셀 D1 셀에 mj2 메트릭스 [4, 1]를 삽입
  • 엑셀 E1 셀에 mj3 메트릭스 [4, 1]를 삽입
  • 첫번째 row값은 모두 0이 될 것임… (생성을 그렇게 했으니까… 초반에…)
  • 이 0값을 각각 “기업코드” “총인원” “직종수” “직렬수” “직급수”로 대체함

    Leave Your Comment