Python 대 R: 구문 설탕 마술

게시 됨: 2022-07-22

Python과 R에서 발견되는 감미로움을 이해하는 법을 배운 이후로 제 발달의 미각은 확장되었습니다. 데이터 과학은 여러 각도에서 접근할 수 있지만 언어, 라이브러리 및 전문 지식의 신중한 균형이 필요한 예술입니다. Python 및 R의 광범위한 기능은 구문 설탕을 제공합니다. 구문은 작업을 용이하게 하고 짧고 우아한 솔루션으로 복잡한 문제를 해결할 수 있도록 합니다.

이러한 언어는 솔루션 공간을 탐색할 수 있는 고유한 방법을 제공합니다. 각 언어에는 고유한 강점과 약점이 있습니다. 각 도구를 효과적으로 사용하는 비결은 각 도구의 이점이 있는 문제 유형을 인식하고 발견한 내용을 전달하는 방법을 결정하는 것입니다. 각 언어의 구문 설탕을 사용하면 더 효율적으로 작업할 수 있습니다.

R 및 Python은 하위 수준 코드 위에서 대화형 인터페이스로 작동하므로 데이터 과학자가 데이터 탐색, 시각화 및 모델링에 선택한 언어를 사용할 수 있습니다. 이러한 상호 작용 덕분에 작업을 불필요하게 복잡하게 만드는 끊임없는 코드 편집 및 컴파일 루프를 피할 수 있습니다.

이러한 고급 언어를 사용하면 마찰을 최소화하고 더 적은 코드로 더 많은 작업을 수행할 수 있습니다. 각 언어의 구문 설탕을 사용하면 코드를 실시간으로 실행할 수 있는 대화형 인터페이스인 REPL(읽기-평가-인쇄 루프)에서 아이디어를 빠르게 테스트할 수 있습니다. 이 반복적인 접근 방식은 최신 데이터 프로세스 주기의 핵심 구성 요소입니다.

R 대 Python: 표현력과 전문화

R과 Python의 힘은 표현력과 유연성에 있습니다. 각 언어에는 다른 언어보다 더 강력한 특정 사용 사례가 있습니다. 또한 각 언어는 서로 다른 벡터와 매우 다른 유형의 출력을 통해 문제를 해결합니다. 이러한 스타일에는 하나의 언어가 선호되는 다양한 개발자 커뮤니티가 있는 경향이 있습니다. 각 커뮤니티가 유기적으로 성장함에 따라 선호하는 언어와 기능 세트는 문제를 해결하는 데 필요한 코드 볼륨을 줄이는 고유한 구문 설탕 스타일로 바뀌는 추세입니다. 그리고 커뮤니티와 언어가 성숙해짐에 따라 언어의 구문적 설탕은 종종 더 달콤해집니다.

각 언어는 데이터 문제를 해결하기 위한 강력한 도구 집합을 제공하지만 도구의 특정 장점을 활용하는 방식으로 이러한 문제에 접근해야 합니다. R은 통계 컴퓨팅 언어로 태어 났으며 통계 분석을 수행하고 데이터를 설명하는 데 사용할 수있는 광범위한 도구를 가지고 있습니다. Python과 기계 학습 접근 방식은 유사한 문제를 해결하지만 기계 학습 모델에 맞는 문제만 해결합니다. 통계 컴퓨팅과 기계 학습을 데이터 모델링을 위한 두 학교로 생각하십시오. 이러한 학교는 고도로 상호 연결되어 있지만 데이터 모델링의 기원과 패러다임은 다릅니다.

R은 통계를 좋아합니다.

R은 통계 분석, 선형 모델링 및 시각화를 위한 풍부한 패키지 제품으로 발전했습니다. 이러한 패키지는 수십 년 동안 R 생태계의 일부였기 때문에 성숙하고 효율적이며 잘 문서화되어 있습니다. 문제가 통계적 컴퓨팅 접근 방식을 요구할 때 R은 작업에 적합한 도구입니다.

R이 커뮤니티에서 사랑받는 주된 이유는 다음과 같습니다.

  • 이산 데이터 조작, 계산 및 필터링 방법.
  • 이러한 메서드를 연결하는 유연한 연결 연산자.
  • 개발자가 편리한 통계 및 시각화 방법을 사용하여 복잡한 문제를 해결할 수 있도록 하는 간결한 구문 설탕입니다.

R을 사용한 단순 선형 모델

R이 얼마나 간결할 수 있는지 알아보기 위해 다이아몬드 가격을 예측하는 예를 만들어 보겠습니다. 먼저 데이터가 필요합니다. 우리는 R과 함께 설치되고 색상 및 컷과 같은 속성을 포함하는 diamonds 기본 데이터 세트를 사용할 것입니다.

또한 Unix 명령줄 파이프( | ) 연산자와 동일한 R의 파이프 연산자( %>% )를 시연할 것입니다. 이 인기 있는 R의 구문 설탕 기능은 Tidyverse 패키지 제품군에서 사용할 수 있습니다. 이 연산자와 결과 코드 스타일은 R 동사(즉, R 함수)의 연결을 허용하여 광범위한 문제를 나누고 정복할 수 있도록 하기 때문에 R의 게임 체인저입니다.

다음 코드는 필요한 라이브러리를 로드하고 데이터를 처리하며 선형 모델을 생성합니다.

 library(tidyverse) library(ggplot2) mode <- function(data) { freq <- unique(data) freq[which.max(tabulate(match(data, freq)))] } data <- diamonds %>% mutate(across(where(is.numeric), ~ replace_na(., median(., na.rm = TRUE)))) %>% mutate(across(where(is.numeric), scale)) %>% mutate(across(where(negate(is.numeric)), ~ replace_na(.x, mode(.x)))) model <- lm(price~., data=data) model <- step(model) summary(model)
 Call: lm(formula = price ~ carat + cut + color + clarity + depth + table + x + z, data = data) Residuals: Min 1Q Median 3Q Max -5.3588 -0.1485 -0.0460 0.0943 2.6806 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) -0.140019 0.002461 -56.892 < 2e-16 *** carat 1.337607 0.005775 231.630 < 2e-16 *** cut.L 0.146537 0.005634 26.010 < 2e-16 *** cut.Q -0.075753 0.004508 -16.805 < 2e-16 *** cut.C 0.037210 0.003876 9.601 < 2e-16 *** cut^4 -0.005168 0.003101 -1.667 0.09559 . color.L -0.489337 0.004347 -112.572 < 2e-16 *** color.Q -0.168463 0.003955 -42.599 < 2e-16 *** color.C -0.041429 0.003691 -11.224 < 2e-16 *** color^4 0.009574 0.003391 2.824 0.00475 ** color^5 -0.024008 0.003202 -7.497 6.64e-14 *** color^6 -0.012145 0.002911 -4.172 3.02e-05 *** clarity.L 1.027115 0.007584 135.431 < 2e-16 *** clarity.Q -0.482557 0.007075 -68.205 < 2e-16 *** clarity.C 0.246230 0.006054 40.676 < 2e-16 *** clarity^4 -0.091485 0.004834 -18.926 < 2e-16 *** clarity^5 0.058563 0.003948 14.833 < 2e-16 *** clarity^6 0.001722 0.003438 0.501 0.61640 clarity^7 0.022716 0.003034 7.487 7.13e-14 *** depth -0.022984 0.001622 -14.168 < 2e-16 *** table -0.014843 0.001631 -9.103 < 2e-16 *** x -0.281282 0.008097 -34.740 < 2e-16 *** z -0.008478 0.005872 -1.444 0.14880 --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Residual standard error: 0.2833 on 53917 degrees of freedom Multiple R-squared: 0.9198, Adjusted R-squared: 0.9198 F-statistic: 2.81e+04 on 22 and 53917 DF, p-value: < 2.2e-16

R은 이 선형 방정식을 구문 설탕으로 프로그래밍하고 이해하기 쉽게 만듭니다. 이제 Python이 왕인 곳으로 관심을 옮겨 보겠습니다.

Python은 기계 학습에 가장 적합합니다.

Python은 scikit-learn, 불균형 학습 및 Optuna와 같은 인기 있는 라이브러리를 활용하는 기계 학습에 중점을 둔 주요 사용자 커뮤니티 중 하나가 있는 강력한 범용 언어입니다. TensorFlow, PyTorch 및 Jax와 같은 가장 영향력 있는 기계 학습 도구 키트는 주로 Python용으로 작성되었습니다.

Python의 구문 설탕은 간결한 데이터 파이프라인 구문과 scikit-learn의 fit-transform-predict 패턴을 포함하여 기계 학습 전문가가 좋아하는 마법입니다.

  1. 데이터를 변환하여 모델을 준비합니다.
  2. 모델을 구성합니다(암시적 또는 명시적으로).
  3. 모델을 맞추십시오.
  4. 새 데이터를 예측하거나(지도 모델) 데이터를 변환합니다(비지도).
    • 지도 모델의 경우 새 데이터 포인트에 대한 오류 메트릭을 계산합니다.

scikit-learn 라이브러리는 탐색 및 시각화를 위한 프로그래밍을 단순화하면서 이 패턴과 일치하는 기능을 캡슐화합니다. 또한 기계 학습 주기의 각 단계에 해당하는 많은 기능이 있어 교차 검증, 하이퍼파라미터 튜닝 및 파이프라인을 제공합니다.

다이아몬드 머신 러닝 모델

이제 R에서 직접적인 비교가 없는 Python을 사용하는 간단한 기계 학습 예제에 초점을 맞출 것입니다. 동일한 데이터 세트를 사용하고 매우 빡빡한 코드 조각에서 fit-transform-predict 패턴을 강조 표시합니다.

기계 학습 접근 방식에 따라 데이터를 학습 및 테스트 파티션으로 분할합니다. 각 파티션에 동일한 변환을 적용하고 포함된 작업을 파이프라인과 연결합니다. 방법(적합 및 점수)은 scikit-learn에 포함된 강력한 기계 학습 방법의 주요 예입니다.

 import numpy as np import pandas as pd from sklearn.linear_model LinearRegression from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.preprocessing import OneHotEncoder from sklearn.impute import SimpleImputer from sklearn.pipeline import Pipeline from sklearn.compose import ColumnTransformer from pandas.api.types import is_numeric_dtype diamonds = sns.load_dataset('diamonds') diamonds = diamonds.dropna() x_train,x_test,y_train,y_test = train_test_split(diamonds.drop("price", axis=1), diamonds["price"], test_size=0.2, random_state=0) num_idx = x_train.apply(lambda x: is_numeric_dtype(x)).values num_cols = x_train.columns[num_idx].values cat_cols = x_train.columns[~num_idx].values num_pipeline = Pipeline(steps=[("imputer", SimpleImputer(strategy="median")), ("scaler", StandardScaler())]) cat_steps = Pipeline(steps=[("imputer", SimpleImputer(strategy="constant", fill_value="missing")), ("onehot", OneHotEncoder(drop="first", sparse=False))]) # data transformation and model constructor preprocessor = ColumnTransformer(transformers=[("num", num_pipeline, num_cols), ("cat", cat_steps, cat_cols)]) mod = Pipeline(steps=[("preprocessor", preprocessor), ("linear", LinearRegression())]) # .fit() calls .fit_transform() in turn mod.fit(x_train, y_train) # .predict() calls .transform() in turn mod.predict(x_test) print(f"R squared score: {mod.score(x_test, y_test):.3f}")

Python에서 기계 학습 프로세스가 얼마나 간소화되었는지 확인할 수 있습니다. 또한 Python의 sklearn 클래스는 개발자가 구조화된 프로덕션 수준 코드를 생성하는 동시에 모델을 통해 데이터를 전달하는 것과 관련된 누수 및 문제를 방지하는 데 도움이 됩니다.

R과 Python은 또 무엇을 할 수 있습니까?

통계 응용 프로그램을 해결하고 기계 학습 모델을 만드는 것 외에도 R 및 Python은 보고, API, 대화형 대시보드 및 외부 저수준 코드 라이브러리의 간단한 포함에 탁월합니다.

개발자는 R과 Python 모두에서 대화형 보고서를 생성할 수 있지만 R에서 개발하는 것이 훨씬 간단합니다. R은 이러한 보고서를 PDF 및 HTML로 내보내기도 지원합니다.

두 언어 모두 데이터 과학자가 대화형 데이터 응용 프로그램을 만들 수 있도록 합니다. R과 Python은 각각 Shiny 및 Streamlit 라이브러리를 사용하여 이러한 애플리케이션을 만듭니다.

마지막으로 R과 Python은 모두 저수준 코드에 대한 외부 바인딩을 지원합니다. 이것은 일반적으로 고성능 작업을 라이브러리에 주입한 다음 선택한 언어 내에서 해당 기능을 호출하는 데 사용됩니다. R은 Rcpp 패키지를 사용하는 반면 Python은 pybind11 패키지를 사용하여 이를 수행합니다.

Python과 R: 점점 더 달콤해짐

데이터 과학자로 일하면서 R과 Python을 정기적으로 사용합니다. 핵심은 각 언어가 가장 강력한 위치를 이해한 다음 우아하게 코딩된 솔루션에 맞게 문제를 조정하는 것입니다.

데이터 과학자는 고객과 의사 소통할 때 가장 쉽게 이해할 수 있는 언어로 의사 소통을 하기를 원합니다. 따라서 통계 또는 기계 학습 프레젠테이션이 더 효과적인지 여부를 따져보고 가장 적합한 프로그래밍 언어를 사용해야 합니다.

Python과 R은 각각 데이터 과학자로서의 작업을 단순화하고 다른 사람이 쉽게 이해할 수 있도록 계속 증가하는 구문 설탕 컬렉션을 제공합니다. 구문이 더 정교할수록 선호하는 언어를 자동화하고 상호 작용하기가 더 쉽습니다. 나는 내 데이터 과학 언어가 달콤하고 그 결과로 나오는 우아한 솔루션이 훨씬 더 달콤합니다.

Toptal 엔지니어링 블로그에 대한 추가 정보:

  • 기계 학습 이론 및 응용 소개: 예제가 포함된 시각적 자습서
  • Python 디자인 패턴: 세련되고 세련된 코드를 위해
  • R 및 Gephi의 소셜 네트워크 분석: Twitter 자세히 알아보기
  • 지도 머신 러닝 알고리즘 탐색
  • 깨끗한 코드 보장: 매개변수화된 Python 살펴보기