공학 분야 독자 질문 답변
4화: 파이썬과 판다, 세상에!

시스템 엔지니어들은 종종 JMP 사용의 일반적인 범위에서 벗어나는 흥미로운 질문들을 접하게 됩니다. 이러한 질문들은 대개 기발하며, 데이터 활용이 비즈니스 또는 기술적 문제 해결에만 국한되지 않는다는 것을 보여주는 좋은 예입니다. 때로는 예상치 못한 어려운 문제에 직면하기도 합니다. 제가 "예상치 못한 난제"라고 부르는 이러한 문제들은 코딩 문제, 흥미로운 분석, 데이터 시각화 방법 등 다양한 형태로 나타납니다.
한동안 메일함에 답변을 드리지 못했지만, 이번 질문은 정말 꼭 다뤄야 할 것 같았습니다. 제가 이 질문에 답하기 위해 사용한 도구는 생각보다 많이 알려지지 않은 것 같아서, 이번 기회에 뉴욕에 있는 동료를 도와드리고 JMP의 흥미로운 기능 중 하나를 여러분께 소개하고자 합니다.
질문
마이크[JMP],
종종 특정 레이블을 기준으로 그룹화하여 최댓값을 구해야 할 때가 있는데, 파이썬 판다스로 표현하면 다음과 같습니다.
df.groupby(['Something', 'Something Else']).max()
또 다른 예로는 팬더.nlargest 에 groupby를 추가하는 방식이 있을 수 있는데, 이 경우 groupby를 통해 상위 5개 항목을 가져오고 싶습니다.
몇 분 동안 열 수식을 만지작거리다가 결국 포기하고 데이터를 내보낸 다음 나중에 JMP로 다시 가져옵니다. Tabulate도 비슷한 기능을 제공하지만 제가 원하는 방식대로 항상 되는 건 아닙니다. 그래서 "JMP를 Pandas처럼 사용하는 방법"에 대한 문서가 있으면 저에게 정말 유용할 것 같고, Pandas가 널리 사용되고 있는 만큼 JMP에도 도움이 될 것 같습니다.
감사해요,
건강 상태
제 답변입니다
안녕, 닉! [Pandas]에서 할 수 있는 많은 기능을 모방하여 수식을 더욱 유연하게 사용할 수 있는 방법이 있습니다. 바로 JMP에 그룹화할 열을 지정하는 것입니다. 열 이름을 마우스 오른쪽 버튼으로 클릭하고 '새 수식 열' > '그룹화 기준'을 선택하면 됩니다.

이렇게 하면 열 이름을 마우스 오른쪽 버튼으로 클릭하고 [새 수식 열 > ...]을 사용하여 만드는 모든 수식 열이 설정한 그룹화 열을 기준으로 그룹화됩니다.


그 후에는 데이터 필터나 로컬 데이터 필터를 사용하여 필터링하거나 부분집합을 선택하면 됩니다. 도움이 되었으면 좋겠네요!
최상의,
중
판다스: 귀여운 족제비과 동물일까요, 아니면 데이터 분석 도구일까요?
자, 처음 접하는 분들을 위해 설명드리자면, Pandas는 귀엽지만 색깔이 좀 특이한 족제비과 동물이 아닙니다. Pandas(파이썬 스크립트에서는 보통 "pd"로 줄여서 씁니다)는 "...데이터 조작 및 분석을 위한 파이썬 프로그래밍 언어 입니다. 특히, 수치 테이블과 시계열 데이터를 조작하기 위한 데이터 구조와 연산을 제공합니다[ 출처 ]." 기본적으로 JMP의 데이터 구성 및 조작 기능(데이터 테이블, 행/열 메뉴 등)이 파이썬 프로그래밍 환경에서 하는 역할을 합니다. 따라서 파이썬 데이터 분석 워크플로우에서 매우 중요한 역할을 합니다. 만약 JMP 내에서 파이썬을 실행하고 싶다면, 이 글은 적합하지 않습니다. 이 백서를 참고하세요. 명령줄에서 데이터 변환 작업을 하는 방식에서 벗어나고 싶다면 계속 읽어보세요.
데이터프레임과 데이터 테이블
아직 여기 계신가요? 좋습니다. 자, 이 글의 나머지 부분에서는 Pandas와 JMP의 해당 기능에서 공통적으로 나타나는 몇 가지 사항을 살펴보겠습니다. 물론 모든 기능을 다루는 것은 아니지만, 두 환경을 비교할 때 올바른 방향을 제시해 줄 것입니다.
먼저 "DataFrame"에 대해 설명하겠습니다. Pandas에서 모든 데이터는 DataFrame에 저장됩니다. JMP의 데이터 테이블처럼, DataFrame은 이름(열 이름) 등을 가진 데이터 열들의 모음입니다. 열과 행을 대상으로 변환, 요약 등의 작업을 수행하지만, 항상 DataFrame 전체 또는 일부를 대상으로 작업을 진행합니다.
JMP에서 기본 데이터 컨테이너는 데이터 테이블입니다. Pandas DataFrame에서와 마찬가지로 열과 행에 대해 동일한 작업을 수행할 수 있습니다. 두 프레임워크 모두에서 데이터 테이블의 결측값을 처리할 수 있습니다. JMP에서는 결측값을 숫자 데이터의 경우 셀에 "."을, 문자 데이터의 경우 빈 셀로 지정합니다. 데이터를 변환하거나 요약하는 등의 작업도 가능합니다(자세한 내용은 나중에 설명하겠습니다). 두 프레임워크 모두에서 소프트웨어에 데이터에 대한 정보를 많이 제공할수록 직접 처리해야 하는 작업이 줄어듭니다. 이는 다음 내용과 관련이 있습니다.
컬럼 속성 및 데이터 유형
컬럼 속성과 데이터 유형(Pandas에서는 dtypes)에 관해서는 JMP가 압도적으로 우세합니다. Pandas는 데이터 유형에 대한 대부분의 이해를 NumPy라는 다른 Python 패키지에서 물려받았는데, 이는 훌륭한 점입니다. NumPy는 상당히 견고한 코드이지만, 이 부분에서는 한계가 있습니다. NumPy는 약 8가지 유형의 데이터(아래 표 참조[ 소스 ])를 처리하며, 다양한 형식에 대한 지원도 다소 제한적입니다(예를 들어, 별도의 도움 없이는 통화 형식을 제대로 처리하지 못합니다).
| 데이터 종류 |
데이터 유형 |
스칼라 |
정렬 |
문자열 별칭 |
선적 서류 비치 |
| tz-aware 날짜/시간 |
날짜/시간TZD 유형 |
타임스탬프 |
배열.날짜시간 배열 |
'datetime64[ns, ]' |
시간대 처리 |
| 범주형 |
범주형D 유형 |
(없음) |
범주형 |
'범주' |
범주형 데이터 |
| 기간 (시간 범위) |
기간D 유형 |
기간 |
배열.주기 배열 |
'기간[ ]', '기간[ ]' |
시간 범위 표현 |
| 부족한 |
희소D타입 |
(없음) |
배열.희소 배열 |
'희소값', '희소값[정수]', '희소값[부동 소수]' |
희소 데이터 구조 |
| 간격 |
인터벌D타입 |
간격 |
배열.IntervalArray |
'간격', '간격', '간격[ ]', '간격[datetime64[ns, ]]', '간격[timedelta64[ ]]' |
간격 인덱스 |
| nullable 정수 |
Int64D 유형 , … |
(없음) |
배열.정수 배열 |
'Int8', 'Int16', 'Int32', 'Int64', 'UInt8', 'UInt16', 'UInt32', 'UInt64' |
널 허용 정수 데이터 유형 |
JMP의 열 속성은 "JMP 사용법 " 책에서 약 43페이지에 걸쳐 설명되어 있습니다. JMP의 열 속성은 훨씬 더 광범위하며, 가져온 데이터 유형을 정확하게 인식하는 기능이 뛰어납니다. 특히 JMP를 처음 사용하는 사용자에게 흥미로운 점은 열 속성이 Pandas에서 사용하는 데이터 유형을 훨씬 뛰어넘는다는 사실입니다. JMP는 소프트웨어 전반에 걸쳐 다양한 동작을 트리거하는 메타데이터를 처리할 수 있습니다. 물론 Pandas DataFrame에도 속성을 추가할 수 있지만, DataFrame은 단순히 컨테이너일 뿐이므로 속성 지원을 직접 코딩하거나 사용 중인 패키지에 해당 기능이 구현되어 있기를 기대해야 합니다. 하지만 JMP에서는 이 모든 작업이 이미 완료되어 있습니다.
표 형식, 열 수식 및 그룹화
사실 앞의 두 항목은 제가 답하려던 질문의 맥락에서 그다지 중요하지 않습니다. 우리의 목적상 데이터 테이블/데이터프레임은 단순히 데이터를 담는 상자일 뿐입니다. 열 속성/유형은 분석적인 측면에서 도움이 될 수 있지만, 다시 말하지만, 우리가 다루는 질문과는 무관합니다. 우리가 관심을 가져야 할 Pandas 기능은 GroupBy입니다. GroupBy는 다른 분석을 수행하기 위해 데이터를 분류하고 정렬하는 데 사용됩니다. JMP Big Class 데이터 테이블을 사용하여 연령별 남녀 평균 키와 몸무게를 구하는 간단한 예는 다음과 같습니다.
# Import Pandas
import pandas as pd
# Bring in the data
data = pd.read_csv("/Users/mike.anderson@jmp.com/Desktop/Big Class.csv")
# Put the data into a DataFrame
df = pd.DataFrame(data)
# Run the group by, get the means, and show the results
summ_df= df.groupby(['sex','age']).mean()
print(summ_df)
출력 결과는 다음과 같습니다.
height weight
sex age
F 12 58.600000 100.200000
13 59.000000 95.333333
14 62.600000 96.600000
15 63.000000 102.000000
16 62.500000 113.500000
17 62.000000 116.000000
M 12 57.333333 97.000000
13 61.250000 94.250000
14 65.285714 103.857143
15 65.200000 110.800000
16 68.000000 128.000000
17 69.000000 153.000000
일반적으로 JMP 사용자는 이러한 데이터 변환 작업을 위해 요약(Summary) 또는 표(Tabulate) 기능을 주로 사용합니다. 수식 편집기(Formula Editor)를 사용하여 열을 만들기도 합니다. 하지만 데이터 테이블(및 플랫폼 열 목록 )에는 Pandas에서 원하는 거의 모든 작업을 수행할 수 있는 숨겨진 기능이 있습니다. 바로 열 이름을 마우스 오른쪽 버튼으로 클릭하고 "새 수식 열"을 선택하는 기능입니다. 이 기능은 열 목록이 있는 모든 곳에서 작동합니다! 여기에서 열 결합, 행별 누적 합계 계산 등 다양한 변환 작업을 수행할 수 있는 여러 옵션을 사용할 수 있습니다. 그 자체로는 편리하지만 특별히 마법 같은 기능은 아닙니다. 진짜 흥미로운 점은 JMP에서 열에 "그룹화" 플래그를 활성화할 때 나타납니다. 이렇게 하면 생성하는 모든 수식 열이 그룹화 변수의 레벨을 자동으로 인식하게 됩니다. 잠시 생각해 보세요. 소프트웨어 어디에든 그룹화 열을 기준으로 계층화할 수 있는 수식 열을 만들 수 있습니다.
이것이 무엇을 의미하는지 최근에 받은 다른 질문의 예를 통해 살펴보겠습니다.
예시: 한 문제 가격으로 두 문제를 풀어보세요!!
처음 질문을 받았을 무렵, 다른 고객으로부터 대규모 샘플 집합에 대한 수치 적분(곡선 아래 면적 또는 AUC)을 수행하는 방법에 대한 질문을 받았습니다. 더욱이, 그들은 이전에 환경 및 분자 돌연변이 유발 저널에 게재했던 논문을 위해 사용했던 샘플 데이터 세트를 제공해 주겠다고 했습니다.
알고 보니 그들이 원했던 작업은 그룹화 플래그와 함수 열을 사용하면 쉽게 수행할 수 있었습니다. 절차는 다음과 같습니다( JMP 공개 사이트 의 데이터를 사용하여 따라해 볼 수 있습니다 
먼저 데이터를 그래프로 나타내 보겠습니다 . 연구의 세부 사항은 이 논의에서 중요하지 않지만, 읽어보면 흥미롭습니다 . 간단히 설명하자면, 이 연구는 다양한 농도(Conc. (μM))의 화학 물질들과 일련의 유전적 반응을 수집한 것입니다. 이번 실습에서는 각 유전적 반응에 대한 AUC 값을 계산하는 데 관심이 있습니다. 다음은 그래프 빌더에서 열 전환기를 사용하여 그래프를 나타낸 것입니다.
AUC 계산 과정의 첫 번째 단계는 그룹화를 설정하는 것입니다. 화학 물질(Chemical) 열을 마우스 오른쪽 버튼으로 클릭하고 "새 수식 열(New Formula Column)"을 선택한 다음 "그룹화 기준(Group By)"을 선택합니다. 바이오마커(Biomarker) 열에도 동일한 작업을 반복합니다. 여기서 순서가 중요합니다. 먼저 화학 물질별로 그룹화한 다음 , 화학 물질 내에서 바이오마커별로 그룹화합니다. 그 후에는 데이터 테이블에서 "새 수식 열"을 사용하여 계산식을 구성하면 됩니다.

앞으로는 이해를 돕기 위해 각 단계를 개별 열로 나누었습니다. 그리고 혹시 궁금해하실까 봐 말씀드리자면, 여기서는 사다리꼴 공식 리만 합을 사용했습니다.
자, 다시 계산으로 돌아가죠. 먼저 x축의 각 점 사이의 거리(x축의 점별 변화량)가 필요합니다. 'Conc(um)' 열을 선택하고 제목을 마우스 오른쪽 버튼으로 클릭한 다음 '새 수식 열 > 행 > 차이'를 선택합니다. 이제 JMP에서 생성된 새 열의 수식을 엽니다. 다음과 같은 내용이 표시될 겁니다.

참고로 JMP는 행 간 계산을 처리하며 새로운 화학물질이나 새로운 바이오마커 유형을 감지하면 수식이 재설정되도록 조정되었습니다.
다음으로 각 데이터 포인트와 이전 데이터 포인트 사이의 평균값을 구해야 합니다. 열 머리글을 마우스 오른쪽 버튼으로 클릭하고 새 수식 열 > 행 > 지연을 선택합니다. 수식을 열고 이전 행의 값만 반환하는 것이 아니라 행 간의 차이를 계산하도록 약간 수정합니다. 이 스크린샷을 참조하세요.

데이터 테이블에서 dx 와 dy로 이름을 바꾼 두 열을 곱해야 구간의 면적을 구할 수 있습니다. 두 열을 선택하고 그중 하나의 열 이름을 마우스 오른쪽 버튼으로 클릭합니다. [새 수식 열] > [결합] > [곱하기]를 선택합니다. 새 열에는 각 데이터 포인트와 다음 데이터 포인트 사이의 곡선 부분 아래 면적이 대략적으로 표시됩니다. 데이터 테이블에서 이 열의 이름을 아이아우크 (순간 AUC)로 변경했습니다.

마지막 단계는 각 섹션의 값을 합산하는 것입니다. 이를 위해 iAUC 열을 마우스 오른쪽 버튼으로 클릭하고 '새 수식 열' > '행' > '누적 합계'를 선택합니다. 실습 시작 시 '그룹화 기준' 열을 선택했으므로 데이터 세트의 각 샘플에 대한 합계가 초기화됩니다.

여기서 Tabulate 또는 Summary 기능을 사용하여 각 샘플의 최대값(곡선 아래의 대략적인 총 면적)을 표로 만들 수 있습니다. 일반적인 화학 물질에 대한 예는 다음과 같습니다.

마지막으로
자, 이게 전부입니다. JMP에 있는 구조를 이용하면 Pandas에서도 비슷한 동작을 쉽게 구현할 수 있습니다. Group By 변수를 사용하는 것만 잊지 않으면 됩니다. 족제비과 동물이나, 색깔이 특이한 동물 같은 건 전혀 필요 없습니다.
편집자 주:읽어보셨나요?저희 엔지니어링 독자 질문 답변 시리즈의 다른 편들을 확인해 보세요.마이크가 사용 중인 사용자를 어떻게 도와주는지 확인해 보세요.JMP제설 서비스 가입 여부를 결정하고 STEAM 교육 프로그램을 위한 독창적인 시각화 자료를 개발합니다.