
데이터 사이언스: 정의와 실무 적용
데이터 사이언스는 비교적 최근에 등장했지만 빠르게 성장하고 있는 다학제적 분야로, 다양한 영역에서 활용됩니다. 고급 분석 기법과 예측 모델링 알고리즘을 사용해 데이터에서 의미 있는 통찰을 도출하고 전략적 비즈니스 혹은 과학적 질문에 답하도록 돕습니다. 데이터 사이언스는 기술적 역량(프로그래밍, 선형대수, 통계, 모델링)부터 비기술적 역량(결과의 효과적 표현과 커뮤니케이션)까지 폭넓은 기술을 결합합니다. 또한 데이터 사이언스가 적용되는 산업에 따라, 가용 정보와 도출된 인사이트를 정확히 해석하기 위해서는 탄탄한 도메인 지식이 필요합니다.
데이터 사이언스 알고리즘은 많은 데이터가 수집되거나 수집될 수 있는 다양한 환경에서 성공적으로 적용됩니다. 금융, 상거래, 마케팅, 프로젝트 관리, 보험, 의학, 교육, 제조, HR, 언어학, 사회학 등 거의 모든 산업과 학문이 데이터의 수집, 축적, 분석, 모델링에서 큰 혜택을 얻을 수 있습니다.
데이터 사이언스 활용 사례란?
데이터 사이언스 활용 사례(use case)는 가용 데이터를 사용해 해결해야 하는 구체적인 실제 과제입니다. 특정 회사의 맥락에서는, 자사의 산업 특수성을 고려하여 데이터 사이언스 기법으로 많은 변수를 분석합니다. 데이터 사이언스 활용 사례는 해결해야 할 문제, 검증해야 할 가설, 답해야 할 질문이 될 수 있습니다. 본질적으로, 데이터 사이언스를 한다는 것은 현실 세계의 활용 사례를 해결하는 것입니다.
각 활용 사례의 내용은 서로 매우 다를 수 있지만, 항상 염두에 둘 공통 사항이 있습니다.
- 데이터 사이언스 활용 사례 기획: 명확한 목표와 기대 결과 도출, 작업 범위 이해, 가용 자원 평가, 필요한 데이터 제공, 리스크 평가, 성공의 척도로서 KPI 정의.
- 활용 사례 해결의 일반적 접근법: 예측, 분류, 패턴 및 이상 탐지, 추천, 이미지 인식.
- 여러 분야에서 공통으로 나타나는 전형 과제: 이탈(churn) 예측, 고객 세분화, 사기 탐지, 추천 시스템, 가격 최적화 등은 유사한 접근으로 해결할 수 있습니다.
데이터 사이언스 케이스 스터디는 어떻게 해결하나요?
답은 매우 사례 특화적이며, 회사의 비즈니스 전략과 케이스 스터디의 핵심 내용에 좌우됩니다. 다만 어떤 데이터 사이언스 활용 사례에도 적용할 수 있는 일반적 로드맵은 다음과 같습니다.
- 올바른 질문 정식화. 가장 중요한 첫 단계로, 가용 문헌과 기존 케이스 스터디 검토, 모범사례 점검, 관련 이론과 작업 가설 정립, 도메인 전문성의 잠재적 공백 보완을 포함합니다. 그 결과, 관심 사례에서 답해야 할 명확한 질문을 도출해야 합니다.
- 데이터 수집. 이 단계에서는 데이터 인벤토리와 수집을 진행합니다. 실제로는 비대표성, 불완전성, 결함, 비정형 등 분석 준비가 전혀 안 된 데이터가 흔합니다. 따라서 주제에 유용할 수 있는 모든 데이터 소스를 찾아 식별해야 합니다. 필요한 데이터는 회사 아카이브, 웹 스크래핑, 스폰서 제공 등에서 확보할 수 있습니다.
- 데이터 랭글링. 대부분의 데이터 사이언스 프로젝트에서 시간과 자원을 가장 많이 소모하는 부분입니다. 수집 데이터의 품질과 대표성을 평가하고, 초기 탐색을 수행합니다. 원시 데이터를 정제, 전처리, 변환, 조작, 매핑하여 더 적합한 형식으로 바꿉니다.
- 데이터 분석 및 모델링. 정제된 데이터를 현재 상태 관점에서 분석한 뒤, 선택한 예측 통계 모델에 적합(fit)합니다. 모델 정확도를 평가하고, 만족스럽지 않으면 다른 모델링 접근을 시도합니다. 미래 시나리오를 가장 정확히 예측하는 모델을 얻을 때까지 반복합니다. 따라서 이 과정도 이전 단계들처럼 상당히 반복적일 수 있습니다.
- 결과 커뮤니케이션. 이전 단계들과 달리, 이 단계는 프로그래밍·기술 전문성보다 커뮤니케이션과 소프트 스킬을 더 요구합니다. 주요 발견과 최종 결론을 경영진, 주주, 기타 이해관계자에게 공유합니다. 인사이트는 일반적으로 보고서, 기사, 발표 슬라이드로 제시하며, 향후 진행 방향을 제안합니다.
산업별 데이터 사이언스 활용 사례
데이터 사이언스 활용 사례는 대규모 데이터가 축적되었거나 축적될 수 있는 사실상 모든 산업과 관련됩니다. 이 장에서는 수요가 가장 높은 물류, 헬스케어, 통신 분야의 전형적인 사례를 살펴보겠습니다. 이 중 일부는 학제 간 성격을 띠며 다른 많은 영역에서도 쉽게 마주칠 수 있습니다. 그만큼 보편적이고 적용 가능하므로, 해결을 위한 전반적 접근을 알아두면 좋습니다. 또한 각 산업에 대해 데이터 사이언스로 모델링할 수 있는 다른 주제들도 간략히 소개합니다.
헬스케어 분야의 데이터 사이언스
앞선 세 장에서는 다양한 산업의 기업이 데이터 사이언스 기법으로 매출을 높이는 방법을 논의했습니다. 헬스케어의 경우, 이 부문의 마케터에게 유용할 뿐 아니라, 가용 데이터의 올바른 활용과 해석은 중증 질환의 적시 진단을 돕고 심지어 생명을 구할 수도 있습니다.
의료 및 헬스케어 제공자는 전자의무기록(EHR) 시스템, 웨어러블 장치 데이터, 의학 연구, 청구 문서 등 수많은 소스에서 방대한 데이터를 수집합니다. 혁신적인 데이터 사이언스와 데이터 분석 기법을 도입함으로써 헬스케어 산업 전반이 점진적으로 혁신되고 있으며, 향후 발전을 위한 가장 유망하고 임팩트 있는 해결책을 제시하고 있습니다. 특히 유전학, 생식의학, 종양학, 생명공학, 방사선학, 예측 진단, 제약 등 고도로 특화된 분야에서는 데이터의 잠재력을 최대한 발휘하면서 전혀 다른 차원으로 도약했습니다.
데이터 사이언스가 의학에서 어떤 가치를 지닐 수 있는지 더 잘 이해하기 위해, 가장 고전적인 활용 사례 중 하나에 집중해 보겠습니다.
헬스케어 활용 사례: 유방암 예측
World Cancer Research Fund International에 따르면, 유방암은 여성에게서 가장 흔한 암 유형이며 전체로도 두 번째로 흔한 암입니다. 양성 또는 악성이든 유방 병변을 제때 진단하는 것은 성공적 치료와 생존율을 크게 높이므로 매우 중요합니다. 이 지점에서 데이터 사이언스가 도움을 줍니다.
데이터 마이닝 기법의 발전과 머신러닝 알고리즘의 결합으로 유방암 위험을 예측하고, 초기 단계에서 잠재적 이상을 탐지하며, 그 진행을 추정해 질병에 맞설 최적의 계획을 수립할 수 있게 되었습니다. 본질적으로 전형적인 머신러닝의 분류 문제입니다. 이 종양 유형은 전 세계적으로 비교적 흔하기 때문에, 전 세계에서 많은 정교한 연구가 진행되었고 그 결과 막대한 환자 데이터가 축적되었다는 점은 고무적입니다.
이런 데이터셋을 분류기에 사용할 때의 주요 문제는 심한 불균형일 수 있다는 점입니다. 예를 들어 결과가 암/비암 형태로 표현되는 경우, 병리가 있을 확률(소수 클래스)은 병리가 없을 확률(다수 클래스)보다 훨씬 낮습니다. 그 결과 알고리즘은 새로운 사례를 비병리로 분류하는 경향이 있습니다. 따라서 이런 모델의 정확도를 보다 효율적으로 평가하려면, 정분류보다 거짓 양성(I종 오류)과 거짓 음성(II종 오류)을 함께 고려하는 F1-score를 평가 지표로 사용하는 것이 타당합니다.
미국의 한 주에서 수집된 유방암 실제 데이터셋을 살펴보겠습니다. 자세한 특성 설명은 문서에 있으나, 요약하면 각 여성이 유방 종괴에서 채취한 세포핵 이미지를 디지털화한 속성들의 평균, 표준오차, 최대값입니다. 데이터셋의 각 항목은 악성 또는 양성 종양을 가진 여성(즉, 모두 어떤 형태로든 종양이 있는 여성)에 해당합니다. 속성에는 세포 반경, 텍스처, 매끄러움, 조밀도, 오목성, 대칭성 등이 포함됩니다.
import pandas as pd
cancer_data = pd.read_csv('data.csv')
pd.options.display.max_columns = len(cancer_data)
print(f'Number of entries: {cancer_data.shape[0]:,}\n'
f'Number of features: {cancer_data.shape[1]:,}\n\n'
f'Number of missing values: {cancer_data.isnull().sum().sum()}\n\n'
f'{cancer_data.head(2)}')
Number of entries: 569
Number of features: 33
Number of missing values: 569
id diagnosis radius_mean texture_mean perimeter_mean area_mean \
0 842302 M 17.99 10.38 122.8 1001.0
1 842517 M 20.57 17.77 132.9 1326.0
smoothness_mean compactness_mean concavity_mean concave points_mean \
0 0.11840 0.27760 0.3001 0.14710
1 0.08474 0.07864 0.0869 0.07017
symmetry_mean fractal_dimension_mean radius_se texture_se perimeter_se \
0 0.2419 0.07871 1.0950 0.9053 8.589
1 0.1812 0.05667 0.5435 0.7339 3.398
area_se smoothness_se compactness_se concavity_se concave points_se \
0 153.40 0.006399 0.04904 0.05373 0.01587
1 74.08 0.005225 0.01308 0.01860 0.01340
symmetry_se fractal_dimension_se radius_worst texture_worst \
0 0.03003 0.006193 25.38 17.33
1 0.01389 0.003532 24.99 23.41
perimeter_worst area_worst smoothness_worst compactness_worst \
0 184.6 2019.0 0.1622 0.6656
1 158.8 1956.0 0.1238 0.1866
concavity_worst concave points_worst symmetry_worst \
0 0.7119 0.2654 0.4601
1 0.2416 0.1860 0.2750
fractal_dimension_worst Unnamed: 32
0 0.11890 NaN
1 0.08902 NaN
결측치만 포함된 마지막 열을 삭제하겠습니다.
cancer_data = cancer_data.drop('Unnamed: 32', axis=1)
확진된 암(악성 유방 종양)을 가진 여성은 몇 %일까요?
round(cancer_data['diagnosis'].value_counts()*100/len(cancer_data)).convert_dtypes()
B 63
M 37
Name: diagnosis, dtype: Int64
전체 응답자의 37%가 유방암으로, 데이터셋은 비교적 균형적입니다.
diagnosis 변수의 값은 범주형이므로, 머신러닝에서 사용하려면 수치형으로 인코딩해야 합니다. 그 전에, 예측 변수와 타깃 변수 diagnosis로 데이터를 분리하겠습니다.
X = cancer_data.iloc[:, 2:32].values
y = cancer_data.iloc[:, 1].values
# Encoding categorical data
from sklearn.preprocessing import LabelEncoder
labelencoder_y = LabelEncoder()
y = labelencoder_y.fit_transform(y)
이제 학습/평가 세트를 만들고, 특성을 스케일링하겠습니다.
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1)
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)
모델링에는 기본 하이퍼파라미터를 사용하는 k-최근접 이웃(KNN)과 로지스틱 회귀를 적용합니다.
from sklearn.neighbors import KNeighborsClassifier
from sklearn.linear_model import LogisticRegression
# KNN
knn = KNeighborsClassifier()
knn.fit(X_train, y_train)
knn_predictions = knn.predict(X_test)
# Logistic regression
lr = LogisticRegression()
lr.fit(X_train, y_train)
lr_predictions = lr.predict(X_test)
앞서 본 대로 데이터셋이 꽤 균형적이므로, 정확도(accuracy)로 가장 정확한 모델을 비교합니다.
from sklearn.metrics import accuracy_score
print(f'Accuracy scores:\n'
f'KNN model:\t\t {accuracy_score(y_test, knn_predictions):.3f}\n'
f'Logistic regression model: {accuracy_score(y_test, lr_predictions):.3f}')
Accuracy scores:
KNN model: 0.956
Logistic regression model: 0.974
이 데이터에서는 로지스틱 회귀가 악성/양성 유방 종양 예측에서 가장 우수한 성능을 보였습니다.
향후 방향으로는, 로지스틱 회귀가 조정할 핵심 파라미터가 거의 없으므로 학습/평가 분할 방식을 달리하거나, 다양한 예측 모델링 기법을 시도해볼 수 있습니다.
헬스케어의 기타 일반적 활용 사례:
- 웨어러블의 실시간 데이터 모니터링
- 예측 분석
- 의료 영상 분석
- 신약 개발
- 유전학 연구
- 가상 비서
- 고객 데이터 관리
운송 및 물류 분야의 데이터 사이언스
물류는 제품을 한 지점에서 다른 지점으로 전달하는 과정을 조직하는 일이며, 운송은 고객이나 화물을 실제로 이동시키는 행위를 뜻합니다. 회사의 활동 프로필(예: 도시락 배송, 우편 서비스, 국제 운송, 항공사, 택시·버스 서비스)에 따라 데이터 소스는 일정표, 근무표, 노선 세부정보, 창고 재고 내역, 보고서, 계약서, 합의서, 법률 문서, 고객 피드백 등으로 구성됩니다. 데이터는 정형일 수도 비정형일 수도 있으며, 시간, 여정, 경로, 좌표, 고객 데이터, 상품 상세, 비용과 가격 정보를 포함할 수 있습니다.
공급망과 운송 부문의 비즈니스 효율성은 항상 단순하지 않으며 수많은 요인에 좌우됩니다. 예기치 못한 교통 문제, 노선 품질, 기상 조건, 비상사태, 유가 변동, 창고 재고 부족, 기술적 손상, 보안상 배송 지연, 정부 규제와 제재 등입니다. 게다가 최근 수년간 새로운 기업이 대거 등장하면서 경쟁도 매우 치열해졌습니다. 따라서 경쟁력을 유지하고 운영 생산성을 높이기 위해, 각 물류/운송 기업은 빅데이터를 분석해 의미 있는 인사이트로 전환하는 것이 필수가 되었습니다.
데이터 사이언스는 운송 및 물류에서 구체적으로 어떻게 도움이 될까요? 다음은 그 잠재적 적용의 일부입니다.
- 전 운송 과정을 엔드 투 엔드로 추적
- 모든 활동의 완전 자동화와 투명성 확보
- 정시 배송
- 경로 최적화
- 동적 가격 책정
- 소모품 재고 유지
- 부패성 상품 보호
- 차량 상태 모니터링
- 생산 네트워크 개선
- 고객 서비스 개선
운송·물류 활용 사례: 택시 차량의 최적 배치 식별
Uber Technologies Inc.(우버)는 다양한 물류 및 운송 서비스를 제공하는 미국 회사입니다. 이번 케이스 스터디에서는 우버 라이드 셰어링 GPS 데이터를 클러스터링하여 택시 차량의 최적 배치를 식별합니다. 특히 다음 목적에 유용합니다.
- 새로운 승차 요청을 가장 가까운 클러스터에 할당해, 그 클러스터에서 가장 가까운 차량을 고객 위치로 보냅니다.
- 식별된 클러스터를 시간대나 요일별로 업무량 관점에서 분석해, 수요가 높은 전략적 위치에 차량을 사전 재배치합니다.
- 클러스터별 수요/공급 비율에 따라 요금을 동적으로 조정합니다.
FiveThirtyEight에서 제공하는 2014년 4월 뉴욕 우버 운행 데이터셋을 사용하겠습니다.
import pandas as pd
uber_data = pd.read_csv('uber-raw-data-apr14.csv')
print(f'Number of trips: {uber_data.shape[0]:,}\n\n'
f'{uber_data.head()}')
Number of trips: 564,516
Date/Time Lat Lon Base
0 4/1/2014 0:11:00 40.7690 -73.9549 B02512
1 4/1/2014 0:17:00 40.7267 -74.0345 B02512
2 4/1/2014 0:21:00 40.7316 -73.9873 B02512
3 4/1/2014 0:28:00 40.7588 -73.9776 B02512
4 4/1/2014 0:33:00 40.7594 -73.9722 B02512
경도는 x축, 위도는 y축으로 모든 픽업 지점을 개략적으로 시각화해 보겠습니다.
import matplotlib.pyplot as plt
plt.scatter(uber_data.iloc[:, 2], uber_data.iloc[:, 1])
plt.show()
이 데이터를 클러스터링하기 위해 비지도 머신러닝 알고리즘인 k-평균(k-means) 클러스터링을 사용합니다. 이 방법의 핵심은 모든 샘플을 분산이 유사한 여러 그룹으로 나누는 것입니다. 본질적으로 클러스터 수 n_clusters(기본값 8)를 입력으로 받아 데이터를 해당 수만큼 분리합니다. 최적 클러스터 수를 파악하려면 엘보(Elbow) 방법을 사용합니다. 절차는 다음과 같습니다.
- 클러스터 수를 달리해 여러 모델을 학습하고, 각 모델에 대해 WCSS(Within Cluster Sum of Squares, 각 관측치가 가장 가까운 클러스터 중심까지의 거리 제곱합)를 수집합니다.
- 클러스터 수에 따른 WCSS 값을 그래프로 표시합니다.
- WCSS가 크게 감소하는 지점의 최소 클러스터 수를 선택합니다.
from sklearn.cluster import KMeans
wcss = []
for i in range(1, 11):
kmeans = KMeans(n_clusters=i, random_state=1)
kmeans.fit(uber_data[['Lat', 'Lon']])
wcss.append(kmeans.inertia_)
plt.figure(figsize=(12, 5))
plt.plot(range(1, 11), wcss)
plt.title('Elbow Method', fontsize=25)
plt.xlabel('Number of clusters', fontsize=18)
plt.ylabel('WCSS', fontsize=18)
plt.xticks(ticks=list(range(1, 11)),
labels=['1', '2', '3', '4', '5', '6', '7', '8', '9', '10'])
plt.show()

이번 경우 가장 적절한 클러스터 수는 7로 보입니다. 이 값으로 모델을 적합하고 각 픽업 지점의 클러스터 번호를 예측하겠습니다. 또한 일곱 개 클러스터 중심의 위치를 추가해 다시 그래프로 나타내겠습니다.
kmeans = KMeans(n_clusters=7, random_state=1)
kmeans.fit_predict(df[['Lat', 'Lon']])
plt.scatter(uber_data.iloc[:, 2], uber_data.iloc[:, 1])
plt.scatter(kmeans.cluster_centers_[:, 1], kmeans.cluster_centers_[:, 0], s=100, c='lime')
plt.show()
이제 모든 중심의 정확한 좌표를 추출해, 데이터 없이 별도로 표시해 보겠습니다.
centroids = pd.DataFrame(kmeans.cluster_centers_)
centroids.columns = ['Lat', 'Lon']
print(centroids)
plt.scatter(centroids['Lon'], centroids['Lat'])
plt.show()
Lat Lon
0 40.688588 -73.965694
1 40.765423 -73.973165
2 40.788001 -73.879858
3 40.656997 -73.780035
4 40.731074 -73.998644
5 40.700541 -74.201673
6 40.971229 -73.611288
뉴욕시 지도 위에 이 중심들을 표시하면 더 직관적일 것입니다.
import folium
centroids_values = centroids.values.tolist()
nyc_map = folium.Map(location=[40.79659011772687, -73.87341741832425], zoom_start=50000)
for point in range(0, len(centroids_values)):
folium.Marker(centroids_values[point], popup=centroids_values[point]).add_to(nyc_map)
nyc_map

이 모델을 사용하면 뉴욕 내 임의 위치의 좌표에 대해 가장 가까운 클러스터를 예측할 수 있습니다. 실무적으로는 우버가 가장 가까운 위치의 차량을 보내 더 빠르게 고객을 응대할 수 있음을 뜻합니다.
맨해튼 링컨센터(Lincoln Center for the Performing Arts)에 가장 가까운 클러스터를 찾아보겠습니다.
lincoln_center = [(40.7725, -73.9835)]
kmeans.predict(lincoln_center)
array([1])
퀸즈의 하워드 비치(Howard Beach)는 어떨까요?
howard_beach = [(40.6571, -73.8430)]
kmeans.predict(howard_beach)
array([3])
향후 방향으로는 다른 클러스터링 알고리즘 적용, 시간/요일/월별 데이터 슬라이스 분석, 가장 바쁜/덜 바쁜 클러스터 탐색, 데이터프레임의 Base 변수와 식별된 클러스터 간 관계 파악 등을 고려할 수 있습니다.
운송·물류의 기타 일반적 활용 사례:
- 수요·공급에 맞춘 동적 가격 매칭
- 수요 예측
- 수작업 업무 자동화
- 자율주행 차량
- 공급망 가시성
- 손상 탐지
- 창고 관리
- 고객 감성 분석
- 고객 서비스 챗봇
통신 분야의 데이터 사이언스
지난 수십 년간 통신 기술은 놀라운 속도로 발전하며 새로운 단계에 접어들었습니다. 오늘날 우리는 각종 전자기기에 둘러싸여 있으며, 많은 사람들이 특히 소셜 네트워크와 메신저에 인터넷 의존적이 되었습니다. 때로 이런 기기 의존은 대면 소통을 대체한다는 비판을 받기도 합니다. 그러나 통신 기술이 전 세계 사람들과 순식간에 연결할 수 있게 하여 우리의 삶을 크게 편리하게 만들었다는 사실은 부인하기 어렵습니다.
이는 특히 코로나19 팬데믹 기간 동안 두드러졌습니다. 많은 회사와 학교가 원격 근무·학습 체계를 도입했기 때문입니다. 급변하는 현실에서 디지털 연결의 품질과 매끄러움은 그 어느 때보다 중요해졌습니다. 봉쇄 기간 동안 사람들은 동료, 친지, 친구와 이전보다 훨씬 자주 통화하고 메시지를 보낼 필요가 있었습니다. 이러한 경향은 통신량의 급격한 증가로 이어졌고, 이 산업에서 방대한 데이터가 생성되었습니다.
축적된 데이터를 데이터 사이언스로 처리하면 통신 산업은 다음과 같은 이점을 얻을 수 있습니다.
- 운영 효율화
- 네트워크 최적화
- 스팸 필터링
- 데이터 전송 개선
- 실시간 분석 수행
- 효율적 비즈니스 전략 수립
- 성공적인 마케팅 캠페인 기획
- 매출 증대
이제 원치 않는 메시지를 탐지·차단하는, 통신 분야의 일반적인 데이터 사이언스 과제를 자세히 살펴보겠습니다.
통신 활용 사례: 스팸 필터 구축
스팸 필터링은 현대의 모든 문자 기반 커뮤니케이션 채널에서 필수 기능입니다. 매일 금전 사기를 노리는 이메일 폭탄으로부터 우리를 보호하기 때문입니다. 기술적으로는 또 다른 분류 문제입니다. 과거 데이터를 기반으로, 새 메시지를 정상(ham)으로 라벨링해 수신자에게 바로 전달하거나, 스팸으로 라벨링해 차단하거나 스팸함으로 보냅니다.
이 목적에 널리 쓰이는 지도학습 알고리즘이 나이브 베이즈 분류기입니다. 확률론의 베이즈 정리에 기반하며, "나이브"란 각 메시지의 단어들이 상호 독립이라는 가정을 뜻합니다. 자연스러운 단어 임베딩과 문맥의 존재를 무시하므로 정확히 맞는 가정은 아니지만, 대부분의 소규모 텍스트 분류 과제에서는 잘 작동해 정확한 예측을 제공합니다.
나이브 베이즈 분류기에는 다항, 베르누이, 가우시안, 플렉시블 베이즈 등 여러 변형이 있으며, 각기 적용 사례가 다릅니다. 스팸 탐지에는 다항 나이브 베이즈가 가장 적합합니다. 메시지의 단어 수를 나타내는 범주형 또는 연속 특성의 이산 빈도 카운트에 기반하기 때문입니다.
UCI 머신러닝 리포지토리의 SMS 스팸 컬렉션 데이터셋에 다항 나이브 베이즈 스팸 필터링을 적용해 보겠습니다.
import pandas as pd
sms_data = pd.read_csv('SMSSpamCollection', sep='\t', header=None, names=['Label', 'SMS'])
print(f'Number of messages: {sms_data.shape[0]:,}\n\n'
f'{sms_data.head()}')
Number of messages: 5,572
Label SMS
0 ham Go until jurong point, crazy.. Available only ...
1 ham Ok lar... Joking wif u oni...
2 spam Free entry in 2 a wkly comp to win FA Cup fina...
3 ham U dun say so early hor... U c already then say...
4 ham Nah I don't think he goes to usf, he lives aro...
사람이 분류한 메시지는 5,572건입니다. 이 중 스팸은 몇 %일까요?
round(sms_data['Label'].value_counts()*100/len(sms_data)).convert_dtypes()
ham 87
spam 13
Name: Label, dtype: Int64
SMS의 13%가 수동으로 스팸으로 식별되었습니다.
다항 나이브 베이즈 분류를 위해 다음 단계를 먼저 수행합니다.
- 레이블을 문자열에서 숫자 형식으로 인코딩. 이진 레이블이므로 0/1로 인코딩합니다.
- 예측 변수와 타깃 변수 추출.
- 학습/평가 세트 분할.
- 예측 학습/평가 세트의 SMS 열 문자열을 벡터화해 CSR(Compressed Sparse Row) 행렬 생성.
4단계는 좀 더 설명이 필요합니다. 여기서는 행렬 객체를 생성하고, 어휘 사전(예측 학습 세트 모든 메시지의 고유 단어와 그 빈도)으로 적합한 뒤, 예측 학습/평가 세트를 행렬로 변환합니다. 그 결과 예측 학습/평가 세트 각각에 대해, 열은 예측 학습 세트 모든 메시지의 고유 단어, 행은 각 메시지, 셀의 값은 각 메시지의 단어 빈도를 나타내는 두 개의 행렬을 얻습니다.
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import CountVectorizer
# Encoding labels
sms_data = sms_data.replace('ham', 0).replace('spam', 1)
X = sms_data['SMS'].values
y = sms_data['Label'].values
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1)
# Vectorizing strings from the 'SMS' column
cv = CountVectorizer(max_df=0.95)
cv.fit(X_train)
X_train_csr_matrix = cv.transform(X_train)
X_test_csr_matrix = cv.transform(X_test)
다음으로 기본 하이퍼파라미터의 다항 나이브 베이즈 분류기를 구축하고 정확도를 확인합니다.
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import accuracy_score, f1_score
clf = MultinomialNB()
clf.fit(X_train_csr_matrix, y_train)
predictions = clf.predict(X_test_csr_matrix)
print(f'Model accuracy:\n'
f'Accuracy score: {accuracy_score(y_test, predictions):.3f}\n'
f'F1-score: {f1_score(y_test, predictions):.3f}\n')
Model accuracy:
Accuracy score: 0.990
F1-score: 0.962
그 결과, 매우 정확한 스팸 필터를 얻었습니다.
향후 방향으로는, 다른 학습/평가 분할 방식을 시도하고 벡터화 과정의 다양한 파라미터(예: 스팸/정상 메시지 모두에서 너무 빈번한 단어의 컷오프)를 조정해 개선을 모색할 수 있습니다. 또한 분류기가 잘못 판별한 드문 사례를 점검해 원인을 파악해 볼 수 있습니다. 추가로(사전 정제와 불용어·저정보 단어 제외 후) 워드클라우드 등으로 스팸/정상 메시지의 최빈 단어를 시각화할 수 있습니다. 마지막으로 SVM, 결정나무, 신경망 등 다른 기계학습/딥러닝 알고리즘을 적용해 나이브 베이즈와 결과를 비교할 수 있습니다.
통신의 기타 일반적 활용 사례:
- 고객 세분화
- 제품 개발
- 통화 상세 기록 분석
- 추천 시스템
- 고객 이탈 예측
- 타깃 마케팅
- 사기 탐지
- 네트워크 관리 및 최적화
- 네트워크 보안 강화
- 가격 최적화
- 고객 생애가치 예측
데이터 사이언스 케이스 스터디: 과정
지금까지 다양한 분야에서 데이터 사이언스의 수많은 적용 사례를 자세히 살펴보았습니다. 이제 실제 데이터셋을 기반으로 더 많은 활용 사례를 학습하고, 자신의 분야에서 실무 과제를 해결하는 데 새 지식과 기술을 적용하고자 한다면, 다음의 초급자 친화적인 데이터 사이언스 케이스 스터디 단기 과정이 도움이 될 수 있습니다.
- 케이스 스터디: 파이썬으로 머신러닝을 활용한 학교 예산 편성. DrivenData의 머신러닝 대회를 바탕으로 한 이 과정에서, 교육구 예산 편성과 타 학교와의 지출 비교를 더 쉽고 빠르게 하는 문제를 탐구합니다. 자연어 기법을 일부 적용해 학교 예산을 준비하고, 항목을 자동 분류하는 모델을 구축합니다. 간단한 버전으로 시작해 점차 고급 버전으로 나아갑니다. 또한 대회 우승 솔루션을 보고 분석하고, 다른 참가자 제출작도 확인할 수 있습니다.
- pandas로 마케팅 캠페인 분석. pandas는 파이썬에서 가장 인기 있는 라이브러리로, 그 도구 세트에 익숙해지는 것은 데이터 사이언티스트의 필수 역량입니다. 이 실무 중심 과정에서는 가상의 온라인 구독 비즈니스 마케팅 데이터셋을 사용해 파이썬과 pandas의 기초(새 열 추가, 데이터셋 병합/슬라이싱, 날짜 열 처리, matplotlib 시각화)를 토대로 역량을 다집니다. 전형적인 마케팅 질문을 측정 가능한 값으로 변환하는 연습을 합니다. 예: "이 캠페인의 성과는?", "특정 채널이 부진한 이유는?", "가장 많은 구독자를 유입하는 채널은?" 등.
- 파이썬으로 미국 인구조사 데이터 분석. 이 과정에서는 10년 주기 인구조사와 American Community Survey를 쉽게 탐색하고, 가계 소득, 통근, 인종, 가족 구조 등 다양한 인구·사회경제 데이터를 추출하는 법을 배웁니다. 파이썬으로 인구조사 API에서 지역별 데이터를 요청하고, pandas로 수집 데이터를 조작해 의미 있는 인사이트를 도출합니다. 추가로 geopandas로 매핑도 연습합니다.
- 케이스 스터디: R로 하는 탐색적 데이터 분석. R의 데이터 조작과 시각화 도구에 대해 기본 지식이 있다면 이 단기 과정이 적합합니다. 실제 데이터셋으로 UN 총회의 역사적 표결 데이터를 탐색하며 역량을 실전에서 시험합니다. 특히 국가 간, 시간에 따른, 국제 이슈별 표결 경향을 분석합니다. 이 케이스 스터디를 통해 처음부터 끝까지 탐색적 데이터 분석을 수행하고, dplyr과 ggplot2를 더 연습하며 새로운 기술을 익힙니다.
- 인사 분석: R로 직원 데이터 탐색. R은 통계 분석에 파이썬보다 더 적합한 면이 있는 것으로 알려져 있습니다. 이 과정에서는 R의 장점을 활용해 일련의 HR 분석 케이스 스터디에서 데이터를 조작, 시각화하고 통계 검정을 수행합니다. 데이터 사이언스 기법은 인사 분야에 비교적 최근 도입되었지만, 오늘날 많은 기업이 직원 데이터베이스를 활용해 실행 가능한 인사이트와 권고를 제공하도록 HR 부서에 점점 더 의존하면서 매우 유망한 방향으로 자리 잡았습니다.
- SQL로 데이터 기반 의사결정. 이 과정에서는 SQL을 사용해 의사결정을 지원하고 경영진에 결과를 보고하는 방법을 배웁니다. 온라인 영화 대여 회사의 고객 데이터, 영화 평점, 배우 배경 정보 등이 담긴 데이터베이스를 주제로 합니다. 고객 선호, 참여도, 매출 추이를 SQL 쿼리로 분석하는 과제가 포함됩니다. 복잡한 다차원 데이터에서 핵심 인사이트를 얻는 온라인 분석 처리(OLAP)용 SQL 확장도 학습합니다.
데이터 사이언스의 고급 전문가가 되고 싶든, 자신의 분야에서 데이터 기반 인사이트를 도출하기 위한 실용적 코딩 기술을 습득하려는 것이든, 위의 자료들은 훌륭한 출발점입니다.
결론
요약하면, 이 글에서는 데이터 사이언스가 무엇인지 다각도로 살펴보고, 데이터 분석과의 차이점, 적용 가능한 분야, 데이터 사이언스 활용 사례의 정의와 이를 성공적으로 해결하기 위한 일반 로드맵을 검토했습니다. 또한 수요가 높은 일부 산업에서 데이터 사이언스가 실생활 과제에 어떻게 유용한지 구체적으로 논의했습니다. 기존 및 잠재적 적용을 폭넓게 개관하면서, 각 인기 분야의 가장 흔한 활용 사례에 초점을 맞추고 데이터 사이언스와 데이터 분석 알고리즘으로 이를 해결하는 방법을 시연했습니다. 다른 산업의 활용 사례를 더 알고 싶다면 금융, 마케팅, 세일즈 분야의 활용 사례 글을 확인해 보세요. 마지막으로 다른 데이터 사이언스 케이스 스터디를 더 깊이 파고들 수 있는 유용한 온라인 과정도 몇 가지 소개했습니다.
마지막으로 흥미로운 점 하나: 여기서 다룬 부문 중 어느 것도 완전히 새로운 분야는 아닙니다. 실제로 의학과 세일즈 같은 일부는 수세기 전부터 존재했습니다. 전 지구적 디지털화 시대 이전 내내, 이들 산업의 데이터는 어떤 형태로든 수집되어 책과 문서에 기록되고, 기록보관소와 도서관에 보관되었습니다. 최근 수년간 신기술의 등장이 가져온 극적인 변화는, 모든 데이터에 숨겨진 거대한 잠재력에 대한 근본적 이해와, 이를 적절히 기록·수집·저장하는 것의 절대적 중요성입니다. 이러한 노력과 지속적인 데이터 관리 시스템 개선 덕분에 모든 산업에서 빅데이터를 축적해 추가 분석과 예측을 수행할 수 있게 되었습니다.


