다음을 통해 공유


R 자습서: 데이터 탐색 및 시각화

적용 대상: SQL Server 2016(13.x) 이상 Azure SQL Managed Instance

5부로 구성된 이 자습서 시리즈의 2부에서는 샘플 데이터를 탐색하고 일부 플롯을 생성합니다. 그 다음에는 Python에서 그래픽 개체를 직렬화한 후, 개체를 역직렬화하고 플롯을 만드는 방법을 알아봅니다.

5부로 구성된 이 자습서 시리즈의 2부에서는 샘플 데이터를 검토한 다음, 기본 R에서 제네릭 barplothist 함수를 사용하여 일부 플롯을 생성합니다.

이 문서의 핵심 목표는 저장 프로시저의 Transact-SQL에서 R 함수를 호출하고 결과를 애플리케이션 파일 형식으로 저장하는 방법을 보여 주는 것입니다.

  • barplot을 사용하여 저장 프로시저를 만들어 varbinary 데이터로 R 플롯을 생성합니다. bcp를 사용하여 이진 스트림을 이미지 파일로 내보냅니다.
  • hist를 사용하여 플롯을 생성하고 결과를 JPG 및 PDF 출력으로 저장하는 저장 프로시저를 만듭니다.

참고 항목

시각화는 데이터 셰이프와 분포를 이해하는 강력한 도구이므로 R은 히스토그램, 산점도, 상자 그림 및 기타 데이터 탐색 그래프를 생성하기 위한 다양한 함수 및 패키지를 제공합니다. R은 일반적으로 그래픽 출력용 R 디바이스를 사용하여 이미지를 만들므로 애플리케이션에서 렌더링할 varbinary 데이터 형식으로 캡처 및 저장할 수 있습니다. 이미지를 지원 파일 형식(.JPG, .PDF 등)에 저장할 수도 있습니다.

이 문서에서는 다음을 수행합니다.

  • 샘플 데이터 검토
  • T-SQL에서 R을 사용하여 플롯 만들기
  • 여러 파일 형식의 출력 플롯

1부에서는 필수 구성 요소를 설치하고 샘플 데이터베이스를 복원했습니다.

3부에서는 Transact-SQL 함수를 사용하여 원시 데이터에서 기능을 만드는 방법을 알아봅니다. 그런 다음 저장 프로시저에서 해당 함수를 호출하여 기능 값이 포함된 테이블을 만듭니다.

4부에서는 SQL Server 저장 프로시저를 통해 모듈을 로드하고 필요한 함수를 호출하여 모델을 만들고 학습시킵니다.

5부에서는 4부에서 학습시키고 저장한 모델을 운영하는 방법을 알아봅니다.

데이터 검토

일반적으로 데이터 과학 솔루션 개발에는 데이터 탐색 및 데이터 시각화가 많이 포함됩니다. 따라서 샘플 데이터를 검토하지 않은 경우 먼저 검토합니다.

원래 공개 데이터 세트에서는 택시 식별자와 여정 레코드가 별도의 파일로 제공되었습니다. 그러나 샘플 데이터를 더 쉽게 사용할 수 있도록 두 개의 원래 데이터 집합이 medallion, hack_licensepickup_datetime 열에 조인되었습니다. 레코드도 원래 레코드 수의 1%만 가져오도록 샘플링되었습니다. 결과적으로 다운 샘플링된 데이터 세트에는 1,703,957개의 행과 23개의 열이 있습니다.

택시 식별자

  • medallion 열은 택시의 고유 ID 번호를 나타냅니다.

  • hack_license 열에는 택시 운전 면허증 번호(익명화됨)가 포함됩니다.

여정 및 요금 레코드

  • 각 여정 레코드에는 승차 및 하차 위치와 시간, 여행 거리가 포함됩니다.

  • 각 요금 레코드에는 결제 유형, 총 결제 금액 및 팁 금액과 같은 결제 정보가 포함됩니다.

  • 마지막 세 열은 다양한 기계 학습 작업에 사용할 수 있습니다. tip_amount 열은 연속된 숫자 값을 포함하며 회귀 분석을 위한 레이블 열로 사용할 수 있습니다. 열에는 예/아니요 값만 있으며 이진 분류에 사용됩니다. tip_class 열에는 여러 개의 클래스 레이블이 포함되므로 다중 클래스 분류 작업의 레이블로 사용할 수 있습니다.

    이 연습에서는 이진 분류 작업만 보여 줍니다. 다른 두 기계 학습 작업인 회귀 및 다중 클래스 분류에 대한 모델을 빌드해 볼 수 있습니다.

  • 레이블 열에 사용되는 값은 모두 다음과 같은 비즈니스 규칙을 사용하여 tip_amount 열을 기반으로 합니다.

    파생 열 이름 규칙
    tipped tip_amount > 0인 경우 tipped = 1, 그렇지 않으면 tipped = 0
    tip_class Class 0: tip_amount = $0

    Class 1: tip_amount > $0 and tip_amount <= $5

    Class 2: tip_amount > $5 and tip_amount <= $10

    Class 3: tip_amount > $10 and tip_amount <= $20

    Class 4: tip_amount > $20

T-SQL에서 R을 사용하여 플롯 만들기

Important

SQL Server 2019부터 격리 메커니즘을 사용하려면 플롯 파일이 저장된 디렉터리에 적절한 권한을 부여해야 합니다. 이러한 권한을 설정하는 방법에 대한 자세한 내용은 Windows의 SQL Server 2019: Machine Learning Services에 대한 격리 변경 사항에서 파일 사용 권한 섹션을 참조하세요.

플롯을 만들려면 R 함수 barplot를 사용합니다. 이 단계에서는 Transact-SQL 쿼리의 데이터를 기반으로 하는 히스토그램을 그립니다. 이 함수를 저장 프로시저 RPlotHistogram에 래핑할 수 있습니다.

  1. SQL Server Management Studio의 개체 탐색기에서 NYCTaxi_Sample 데이터베이스를 마우스 오른쪽 단추로 클릭하고 새 쿼리를 선택합니다. 또는 Azure Data Studio의 파일 메뉴에서 새 Notebook을 선택하고 데이터베이스에 연결합니다.

  2. 다음 스크립트를 붙여넣어 히스토그램을 그리는 저장 프로시저를 만듭니다. 이 예의 이름은 RPlotHistogram입니다.

    CREATE PROCEDURE [dbo].[RPlotHistogram]
    AS
    BEGIN
      SET NOCOUNT ON;
      DECLARE @query nvarchar(max) =  
      N'SELECT tipped FROM [dbo].[nyctaxi_sample]'  
      EXECUTE sp_execute_external_script @language = N'R',  
                                         @script = N'  
       image_file = tempfile();  
       jpeg(filename = image_file);  
       #Plot histogram  
       barplot(table(InputDataSet$tipped), main = "Tip Histogram", col="lightgreen", xlab="Tipped or not", ylab = "Counts", space=0)
       dev.off();  
       OutputDataSet <- data.frame(data=readBin(file(image_file, "rb"), what=raw(), n=1e6));  
       ',  
       @input_data_1 = @query  
       WITH RESULT SETS ((plot varbinary(max)));  
    END
    GO
    

이 스크립트에서 이해해야 할 핵심 사항은 다음과 같습니다.

  • @query 변수는 스크립트 입력 변수'SELECT tipped FROM nyctaxi_sample'에 대한 인수로 R 스크립트에 전달되는 쿼리 텍스트( @input_data_1)를 정의합니다. 외부 프로세스로 실행되는 R 스크립트의 경우 스크립트에 대한 입력과 SQL Server에서 R 세션을 시작하는 sp_execute_external_script 시스템 저장 프로시저에 대한 입력 간에 일대일 매핑이 있어야 합니다.

  • R 스크립트 내에 이미지를 저장하는 변수(image_file)가 정의됩니다.

  • barplot 함수는 플롯을 생성하기 위해 호출됩니다.

  • R 장치는 SQL Server에서 이 명령을 외부 스크립트로 실행하기 때문에 꺼짐으로 설정됩니다. 일반적으로 R에서 고수준 그리기 명령을 내리면 R은 장치라고 하는 그래픽 창을 엽니다. 파일에 쓰거나 다른 방법으로 출력을 처리하는 경우 디바이스를 끌 수 있습니다.

  • R 그래픽 개체는 출력을 위해 R data.frame으로 직렬화됩니다.

저장 프로시저를 실행하고 bcp를 사용하여 이진 데이터를 이미지 파일로 내보냅니다.

저장 프로시저는 이미지를 직접 볼 수 없는 varbinary 데이터의 스트림으로 반환합니다. 그러나 bcp 유틸리티를 사용하여 varbinary 데이터를 가져오고 클라이언트 컴퓨터에 이미지 파일로 저장할 수 있습니다.

  1. Management Studio에서 다음 문을 실행합니다.

    EXEC [dbo].[RPlotHistogram]
    

    결과

    plot0xFFD8FFE000104A4649...

  2. PowerShell 명령 프롬프트를 열고 다음 명령을 실행하여 적절한 인스턴스 이름, 데이터베이스 이름, 사용자 이름 및 자격 증명을 인수로 제공합니다. Windows ID를 사용하는 경우 -U-P-T로 바꿀 수 있습니다.

    bcp "exec RPlotHistogram" queryout "plot.jpg" -S <SQL Server instance name> -d  NYCTaxi_Sample  -U <user name> -P <password> -T
    

    참고 항목

    bcp에 대한 명령 스위치는 대/소문자를 구분합니다.

  3. 연결에 성공하면 그래픽 파일 형식에 대한 자세한 정보를 입력하라는 메시지가 표시됩니다.

    다음 변경 내용을 제외하고 기본값을 적용하려면 각 프롬프트에서 Enter 키를 누릅니다.

    • 필드 플롯의 접두사 길이에 0을 입력합니다.

    • 나중에 다시 사용할 수 있도록 출력 매개 변수를 저장하려면 Y를 입력합니다.

    Enter the file storage type of field plot [varbinary(max)]: 
    Enter prefix-length of field plot [8]: 0
    Enter length of field plot [0]:
    Enter field terminator [none]:
    
    Do you want to save this format information in a file? [Y/n]
    Host filename [bcp.fmt]:
    

    결과

    Starting copy...
    1 rows copied.
    Network packet size (bytes): 4096
    Clock Time (ms.) Total     : 3922   Average : (0.25 rows per sec.)
    

    형식 정보를 파일(bcp.fmt)에 저장하면 bcp 유틸리티는 그래픽 파일 형식 옵션을 묻는 메시지를 표시하지 않고 나중에 유사한 명령에 적용할 수 있는 형식 정의를 생성합니다. 서식 파일을 사용하려면 명령줄의 끝, password 인수 뒤에 -f bcp.fmt 를 추가합니다.

  4. 출력 파일은 PowerShell 명령을 실행한 동일한 디렉터리에 만들어집니다. 그림을 보려면 plot.jpg 파일을 열기만 하면 됩니다.

    팁이 있는 택시 여행 및 팁이 없는 택시 여행

hist를 사용하여 저장 프로시저 만들기

일반적으로 데이터 과학자는 여러 관점에서 데이터에 대한 이해를 넓히기 위해 여러 데이터 시각화를 생성합니다. 이 예에서는 JPG 및 PDF 형식으로 히스토그램, 산점도 및 기타 R 그래픽을 작성하는 RPlotHist라는 저장 프로시저를 만듭니다.

이 저장 프로시저는 hist 함수를 사용하여 히스토그램을 만들고 이진 데이터를 .JPG, .PDF 및 .PNG와 같은 널리 사용되는 형식으로 내보냅니다.

  1. SQL Server Management Studio의 개체 탐색기에서 NYCTaxi_Sample 데이터베이스를 마우스 오른쪽 단추로 클릭하고 새 쿼리를 선택합니다.

  2. 다음 스크립트를 붙여넣어 히스토그램을 그리는 저장 프로시저를 만듭니다. 이 예의 이름은 RPlotHist입니다.

    CREATE PROCEDURE [dbo].[RPlotHist]  
    AS  
    BEGIN  
      SET NOCOUNT ON;  
      DECLARE @query nvarchar(max) =  
      N'SELECT cast(tipped as int) as tipped, tip_amount, fare_amount FROM [dbo].[nyctaxi_sample]'  
      EXECUTE sp_execute_external_script @language = N'R',  
      @script = N'  
       # Set output directory for files and check for existing files with same names   
        mainDir <- ''C:\\temp\\plots''  
        dir.create(mainDir, recursive = TRUE, showWarnings = FALSE)  
        setwd(mainDir);  
        print("Creating output plot files:", quote=FALSE)
    
        # Open a jpeg file and output histogram of tipped variable in that file.  
        dest_filename = tempfile(pattern = ''rHistogram_Tipped_'', tmpdir = mainDir)  
        dest_filename = paste(dest_filename, ''.jpg'',sep="")  
        print(dest_filename, quote=FALSE);  
        jpeg(filename=dest_filename);  
        hist(InputDataSet$tipped, col = ''lightgreen'', xlab=''Tipped'',   
            ylab = ''Counts'', main = ''Histogram, Tipped'');  
         dev.off();  
    
        # Open a pdf file and output histograms of tip amount and fare amount.   
        # Outputs two plots in one row  
        dest_filename = tempfile(pattern = ''rHistograms_Tip_and_Fare_Amount_'', tmpdir = mainDir)  
        dest_filename = paste(dest_filename, ''.pdf'',sep="")  
        print(dest_filename, quote=FALSE);  
        pdf(file=dest_filename, height=4, width=7);  
        par(mfrow=c(1,2));  
        hist(InputDataSet$tip_amount, col = ''lightgreen'',   
            xlab=''Tip amount ($)'',   
            ylab = ''Counts'',   
            main = ''Histogram, Tip amount'', xlim = c(0,40), 100);  
        hist(InputDataSet$fare_amount, col = ''lightgreen'',   
            xlab=''Fare amount ($)'',   
            ylab = ''Counts'',   
            main = ''Histogram,   
            Fare amount'',   
            xlim = c(0,100), 100);  
        dev.off();  
    
        # Open a pdf file and output an xyplot of tip amount vs. fare amount using lattice;  
        # Only 10,000 sampled observations are plotted here, otherwise file is large.  
        dest_filename = tempfile(pattern = ''rXYPlots_Tip_vs_Fare_Amount_'', tmpdir = mainDir)  
        dest_filename = paste(dest_filename, ''.pdf'',sep="")  
        print(dest_filename, quote=FALSE);  
        pdf(file=dest_filename, height=4, width=4);  
        plot(tip_amount ~ fare_amount,   
            data = InputDataSet[sample(nrow(InputDataSet), 10000), ],   
            ylim = c(0,50),   
            xlim = c(0,150),   
            cex=.5,   
            pch=19,   
            col=''darkgreen'',    
            main = ''Tip amount by Fare amount'',   
            xlab=''Fare Amount ($)'',   
            ylab = ''Tip Amount ($)'');   
        dev.off();',  
      @input_data_1 = @query  
    END
    

이 스크립트에서 이해해야 할 핵심 사항은 다음과 같습니다.

  • 저장 프로시저 내의 SELECT 쿼리 출력은 기본 R 데이터 프레임인 InputDataSet에 저장됩니다. 그런 다음 다양한 R 그리기 함수를 호출하여 실제 그래픽 파일을 생성할 수 있습니다. 대부분의 포함된 R 스크립트는 plot 또는 hist와 같은 이러한 그래픽 함수의 옵션을 나타냅니다.

  • R 장치는 SQL Server에서 이 명령을 외부 스크립트로 실행하기 때문에 꺼짐으로 설정됩니다. 일반적으로 R에서 고수준 그리기 명령을 내리면 R은 장치라고 하는 그래픽 창을 엽니다. 파일에 쓰거나 다른 방법으로 출력을 처리하는 경우 디바이스를 끌 수 있습니다.

  • 모든 파일은 로컬 폴더 C:\temp\Plots에 저장됩니다. 대상 폴더는 R 스크립트에 저장 프로시저의 일부로 제공되는 인수에 의해 정의됩니다. 파일을 다른 폴더에 출력하려면 저장 프로시저에 포함된 R 스크립트의 mainDir 변수 값을 변경합니다. 다른 형식, 더 많은 파일 등을 출력하도록 스크립트를 수정할 수도 있습니다.

저장 프로시저 실행

다음 명령문을 실행하여 이진 플롯 데이터를 JPEG 및 PDF 파일 형식으로 내보냅니다.

EXEC RPlotHist

결과

STDOUT message(s) from external script:
[1] Creating output plot files:[1] C:\temp\plots\rHistogram_Tipped_18887f6265d4.jpg[1] 

C:\temp\plots\rHistograms_Tip_and_Fare_Amount_1888441e542c.pdf[1]

C:\temp\plots\rXYPlots_Tip_vs_Fare_Amount_18887c9d517b.pdf

파일 이름의 숫자는 기존 파일에 쓰려고 할 때 오류가 발생하지 않도록 임의로 생성됩니다.

출력 보기

플롯을 보려면 대상 폴더를 열고 저장 프로시저에서 R 코드로 만든 파일을 검토합니다.

  1. STDOUT 메시지에 지정된 폴더로 이동합니다(이 예에서는 C:\temp\plots).

  2. rHistogram_Tipped.jpg를 열어 팁이 있는 여행 수와 팁이 없는 여행 수를 표시합니다(이 히스토그램은 이전 단계에서 생성한 히스토그램과 유사함).

  3. rHistograms_Tip_and_Fare_Amount.pdf를 열어 요금 금액에 대해 표시된 팁 금액의 배포를 확인합니다.

    tip_amount 및 fare_amount를 보여주는 히스토그램

  4. rXYPlots_Tip_vs_Fare_Amount.pdf를 열어 x축에 요금 금액이 있고 y축에 팁 금액이 있는 산점도를 봅니다.

    요금 금액에 대해 표시된 팁 금액

다음 단계

이 문서에서는 다음 작업을 수행합니다.

  • 샘플 데이터 검토
  • T-SQL에서 R을 사용하여 플롯 생성함
  • 여러 파일 형식의 출력 플롯