반응형

 1 - 고객 프로파일링(Customer Profiling) - 1 개요 :데이터 분석



안녕하세요,


주제는 고객 프로파일링 입니다. 특히, 고객 Communication 측면에서의 프로파일일에 대해서 이야기해 보겠습니다.

고객은 두말 할 필요가 없을 것 같고요,
먼저 프로파일링[profiling]의 사전적 의미를 찾아보겠습니다.

많은 시간 정성을 들여서 작성한 만큼 도움이 되면 좋겠습니다.
구독을 하시면 새로운 글을 놓치지않고 보실수 있습니다.

이번 주제와는 별도로 고객성향을 활용한 고객분석에 대해서도 알아보겠습니다.
https://bigdatamaster.tistory.com/m/96

[연재] 고객분석ㅡMBTI

한 사람이 붐비는 인파를 뚫고 할인 매대에서 티셔츠를 집어들다. "예쁘네 이거사야지!" 몆번 훌터보더니 바로 계산대로 가서 계산을 했다. 그런데 저쪽 구석에서 한참동안을 서서 옷들을 뒤척

bigdatamaster.tistory.com

한경 경제용어사전

[ profiling ]  자료수집'이 원 뜻이나 수사용어로는 범죄유형분석법을 말한다. 범죄 현장을 분석해 범인의 습관, 나이, 성격, 직업, 범행 수법을 추론한 뒤 이를 바탕으로 범인을 찾아내는 수사 기법이다.

[네이버 지식백과] 프로파일링 [profiling] (한경 경제용어사전, 한국경제신문/한경닷컴 )네이버 영어 사전에  Profiling은 아래와 같이 나옵니다.

명사

[U] (개요 작성을 위한) 자료[정보] 수집, 프로파일링 참고 racial profiling

customer profiling

고객 관련 정보 수집

offender profiling

범인 프로파일링(여러 가지 데이터를 수집, 분석하여 범인의 성격・유형 등에 대해 추론하는 것)

 

다른 것도 있는데 연관도 적고 일반적이지 않은 내용이라서 패~쓰. ^^

마케팅에서는 고객 세그멘테이션과 유사어로 쓰입니다.

서비스 기획 쪽에서는 페르소나라고 유사하고요.

보통 프로파일이라고하면 범죄 프로파일을 생각하게 되는데요...

결국 프로파일링이란 특정 대상을 구분 짖게하는 특징/특성을 찾는 것이라고 할 수 있을 것 같습니다

래서 고객 프로파일링을 다시 정의하면

 "고객을 구분 짖게하는 특징/특성을 찾는 방법"

이라고 할 수 있을 것 같습니다.

제일 많이 알려지고 이해하기 쉬운 분야가 범죄 프로파일이니 예를 들어서 이야기해 보겠습니다.

 

크리미널 마인드라는 미드를 보면 FBI의 BAU(행동분석팀)라는 조직이 나와서 미궁속에 빠진 사건들을 해결해나가는 내용이 나옵니다.

여기서 범인을 찾기 위한 단서들을 찾아낸뒤에

2차 범죄를 막기위해서 일선 경찰관들에게 협조를 요청할 때

범인에 대한 프로파일을 설명해 줍니다.

예를 들면,

"범인의 키는 180~190센티미터에, 사건 장소/지역에 대한 지식이 많으며 특정 지역에서 경재적 활동이 많은고, 장기간의 치과치료를 받은 경험이 있으며, 히스패닉계 사람들과 관계가 깊은 사람이다."

중/고등학교시절부터 따돌림을 당했을 가능성이 많으며, 거주지는 반경 10킬로미터 이내이다.

이렇게 줄이고 줄이다보면 범인의 후보(용의자)가 줄어들게되고 경찰이나 협조하는 사람들이 쉽게(?) 범인을 잡을 수 있도록 도움을 줍니다.

이처럼 특정인을 지목하기 위해 드라마에서도 많은 데이터를 분석하는 장면이 나옵니다.

핸드폰의 통화이력을 조회한다던가, 카드 사용내역을 조회한다던가, 고등학교 졸업 사진을 찾는다던가, 과거 지역 신문의 기사를 찾는다던가 하는 것입니다.

은 데이터에 대한 빠른 분석이 필요하지요. FBI니까 가능한 일 같습니다.

(그럼에도 불구하고, 범위는 좀 다르겠지만 이러한 활동은 일반 기업에서도 가능하겠지요. 가장 흔한 예가 바로 FDS 라고 말하는 사기/이상 탐지 시스템 : Fraud Detection System 입니다. 특히, 보험사기나 금융사기를 방지하기위해 많이 사용됩니다.)

이러한 추적은 범행장소에 남은 흔적을 기반으로 범인의 행동을 분석하는 데에서 시작합니다.

범인은 어떤 심리 상태, 어떤 위치에서, 어떤 자세로, 언제, 왜 사건을 일으켰을까라는 의문을 여러가지 시나리오와 흔적들을 비교해가면서 가정을 세우고 확인해 나갑니다.

이러한 가정의 확인을 위해 여러가지 데이터를 찾고 분석하며 새로운 단서를 찾기도 하지요.

서두가 길었는데요...^^

결국 고객을 프로파일링 한다는 것도 고객의 흔적에서 시작을 해야합니다.

같은 의미에서 고객이 어떤 심리 상태, 어떤 위치에서, 언제, 왜 사건(구매/환불/불만 등)을 만들었는지 여러가지 시나리오와 흔적들을 가지고 고객을 이해해 나가야 합니다.

 고객을 이해하기 위해서는 흔적이 필요하고 이러한 흔적은 요즘 디지털로 남고 있습니다.

이 디지털 흔적은 기업에 있어서는 고객을 이해하는데 매우 중요한 증거(자산/요인)이기 때문에 매우 소중히 다루어야 합니다. 얘전에는 디지털 흔적이 많이 남지도 않고, 관리 처리하기도 어려웠고, 거기에서 의미를 찾기도 어렵고, 그렇기 때문에 실질적인 비용절감이나 매출 증대로 이어지지 못했습니다.


그러나 상황은 바뀌었지요.

먼저 요즘은 고객의 흔적을 찾기가 얘전보다는 매우 쉬워졋습니다.

바로 디지털 로그 때문이지요. PC는 기본이고 매일, 항상 들고다니는 핸드폰이 바로 디지털 로그를 만드는 기계라고 할 수 있습니다. 뿐만 아니라 인터넷을 떨어져서는 잠깐도 살 수 없는 시대가 되었지요. 말보다 깨톡이 더편하게 느겨질때도 있을 정도니까요. 그래서 우리는 매순간 엄청난 디지털 흔적을 남기면서 살고 있습니다.


흔적만 늘어난게 아니라 이를 관리하고 처리하는 기술도 매우 발전했습니다.

빅데이터라는 기술이 바로 그것이죠. 예전에는 상상도 못하던 많은 데이터를 저장하고 처리하는게 가능해 졌고, 게다가 이를 위한 비용도 생각보다는 적게 들게 되었습니다.

빅데이터의 프로그램은 오픈소스라는 무료 소프트웨어를 기반으로 발전했기 때문에 소프트웨어 비용은 거의 제로라고 할 수 있지요.


마지막으로 의미를 찾기 쉬워 졌습니다.

이것은 여러가지 의미로 해석 될 수 있을 것 같은데요. 먼저 빅데이터로 관리 처리하면서 과거의 통계 분석처럼 샘플링하지 않고 정확한 분석이 가능해 졌다는 점입니다. 그리고 이렇게 많이 발생한 데이터를 분석하기위해 다양한 분석 기법/알고리즘이 발전되었습니다.

잘 아시는 것 처럼 구글의 알파고와 같은 프로그램이 바로 AI 또는 기계학습이라는 기법/알고리즘을 이용한 것입니다. 중요한 것은 이러한 기법/알고리즘을 (정확도와 수준차이는 있지만) 활용하는데 예전보다 훨씬 쉬워졌다는 것입니다. 왜냐하면 이또한 오픈소스로 내용이 무료로 공개되어 있기 때문입니다.

(물론, 공부를 많이 해야 사용할 수 있겠지만요.)

이러한 이유로 고객 프로파일링이 훨씬 쉬워지고, 정확해지고, 사용하기 쉽게 되었습니다. 그래서 많은 기업들이 데이터 분석을 통해 고객을 이해하고 기업경영에 도움을 얻고자 데이터 관련 조직을 확대/강화하고 있는 것입니다.


그럼에도 불구하고 고객 프로파일링은 쉬운 일이 아닙니다.

왜냐하면 일반적으로 FBI와 같이 많은 데이터가 없고 있어도 쉽게 접근할 권한도 없으며 관리도 잘 되지 않기 때문이지요. 그래서 기업에서는 필요로 되는 데이터를 미리 관래해 놓아야 합니다. 당연히 관리하는데에는 많은 노력과 비용이 들어 갈 수 있지요. 따라서 효율적으로 관리하면서 효과적인 가치를 찾아내는 것이 필요하다고 하겟습니다.

앞으로 이러한 고객 프로파일링을 위한 데이터(정보)와 처리/분석 방법에 대해 이야기해 보겠습니다.

 

감사합니다.

반응형
반응형

Enterprise Data Warehouse (EDW) 개념 아키텍처


 

Enterprise Data Architecture는 크게 3가지 레이어로 나누어 집니다.

Data Source, Data Storage, Front-End Tools 가 그것 입니다.

 

Data Source

소스는 말 그대로 원천입니다. 데이터가 만들어지는 것(시스템)을 말합니다.

일반적으로 운용 어플리케이션(응용) 시스템이라고 불리우는 시스템에서 데이터가 생성됩니다.

운영계 시스템이라고도 하며 예를 들면 고객관리 시스템, 자산관리 시스템, 재무관리 시스템, 직원 관리 시스템 등이 되겠습니다.

즉, 경영을 하면서 필요한 오퍼레이션(운영/관리)를 위해 필요한 시스템들을 말합니다. 그래서 운영계라는 말을 사용합니다. 은행업계에서는 계정계라고 합니다.

 

Data Storage

이와 달리 EDW는 분석계에 해당합니다. 운영계 처럼 업무처리니 관리를 위한 시스템이 아니라 말그대로 분석을 위한 시스템입니다. 전에는 주로 통계나 리포트 작성을 위한 데이터 생성이 목적이었습니다. 왜냐하면 운영계에서는 업무/서비스를 위해서 24시간 운영되는 경우도 있는데 이런경우 통계/리포트를 만들기 위해서 데이터 처리를 위한 시스템 구조/용량을 확보할 수 없거나 그렇게 하는 것이 비효율적이었기 때문입니다. 그러다가 Direct Marketing, CRM(customer Relation Marketing) 등의 바람이 불면서 분석계의 인기(중요성)이 부각 되었었지요. 단순히 통계 숫자 뽑고 필요한 리포트 만들어주는 시스템이 아니라 돈버는데 필요한 시스템이 되엇던 것입니다. 그런데 너무 앞서 갔던 걸까요?! 매출신장에 혁신적이라고 생각해서 인프라/시스템적인 투자를 엄청나게(?) 했는데 효과는 기대했던것에 미치지 못했습니다. 이유를 생각해보면 3가지가 될 것 같은데요. 첫째 데이터가 없었습니다. 둘째, 좋은 알고리즘, 그리고 이를 잘 활용할 만한 인력이 없었습니다. 그리고 마지막으로 세번째는 분석계 시스템/인프라 도입에 많은 비용이 들었습니다. (이 세가지 이야기는 할 말이 많으니 나중에 더 하겠습니다.) 하여간 이러한 이유로 투자 대비 효과가 별로라는 평가로 투자와 관리/발전이 소흘해 졌습니다.

그러다가 드디어 짜쨘~ 스티브 잡스께서 스마트폰을 세상에 내놓으셨지요. 갑자기 스티브잡스와 스마트폰이 무슨 말인지 연계가 안되시나요? (아 되시는 분도 계시군요) 바로 첫번째 문제 였던 데이터 부족을 해결하게 됩니다.

- 너무 할말이 많아서 중략 ^^ -

요즘은 빅데이터가 발전하면서 Data Storage에 대한 여러종류의 아키텍처가 발전하고 있습니다. 많이 들어보셨을 하둡( Hadoop), HDFS(하둡 File System) 등이 그것 입니다.

 

Front-End Tools

이렇게 데이터 스토리지에서 열심히 분석해서 만들어놓은 데이터를 활용하는 레이어 입니다. 가장 기본적인 것은 SQL(Structured Query Language: DB의 데이터를 입력/조회/수정/삭제 할 수 있는 명령어 모음), 리포트(쉽게 말하면 엑셀 표/자료), OLAP Tool(On Line Analytical Processing) 입니다. 이쪽의 아키텍처도 실시간과 시각화 관점에서 다양한 아키텍처가 새롭게 나오고 있습니다.

 

하여간 오늘날에는 4차 산업혁명이라는 주제아래 빅데이터, 인공지능/기계학습(AI/ML) 등의 이야기가 나오면서 분석계의 중요성은 나날이 높아지고 있는 상황입니다. 그 기본이 되는 아키텍처가 바로 상기의 EDW개념 아키텍처 입니다.

 

이후부터 차근차근 관련된 아키텍처와 기술, 서비스에 대해서 이야기해보겠습니다.

 

 

 

반응형
반응형

Spark ML을 이용한 CF 분석 및 추천 예제 실습


오늘은 스파크 기계학습 MLlib를 이용한 (CF활용) 추천 예제를 실습한 내용을 올립니다.


생각보다 간단하고 쉬운(?) 개발/조작으로 빅데이터 분석을 할 수 있음에 놀랐습니다.




아래 내용은 기계학습을 이용한 추천 시스템을 만들기위해 Spark ML을 이용을 위한 예제를 가지고 실습해본 내용입니다.

먼저 데이터가 있어야하고 Spark ML소스가 있어야합니다. 기본적인 기계학습, CF에 대한 이해가 있으면 더욱 쉽게 이해하실 것 같습니다.




아래는 스파크 사이트의 예제 소스를 제플린에 입력/수정한 스칼라 코드

=========================================================================================

import org.apache.spark.mllib.recommendation.ALS
import org.apache.spark.mllib.recommendation.MatrixFactorizationModel
import org.apache.spark.mllib.recommendation.Rating

// Load and parse the data
val data = sc.textFile("/tmp/ratings/ratings.csv")
val ratings = data.map(_.split(',') match { case Array(user, item, rate, time) =>
  Rating(user.toInt, item.toInt, rate.toDouble)
})

// Build the recommendation model using ALS
val rank = 10
val numIterations = 10
val model = ALS.train(ratings, rank, numIterations, 0.01)

// Evaluate the model on rating data
val usersProducts = ratings.map { case Rating(user, product, rate) =>
  (user, product)
}
val predictions =
  model.predict(usersProducts).map { case Rating(user, product, rate) =>
    ((user, product), rate)
  }
val ratesAndPreds = ratings.map { case Rating(user, product, rate) =>
  ((user, product), rate)
}.join(predictions)
val MSE = ratesAndPreds.map { case ((user, product), (r1, r2)) =>
  val err = (r1 - r2)
  err * err
}.mean()
println("Mean Squared Error = " + MSE)

// Save and load model
model.save(sc, "target/tmp/myCollaborativeFilter_user1")
val sameModel = MatrixFactorizationModel.load(sc, "target/tmp/myCollaborativeFilter_user1")

=========================================================================================





그리고 제플린에서 실행한 결과 로그 입니다.

=========================================================================================

import org.apache.spark.mllib.recommendation.ALS
import org.apache.spark.mllib.recommendation.MatrixFactorizationModel
import org.apache.spark.mllib.recommendation.Rating
data: org.apache.spark.rdd.RDD[String] = /tmp/ratings/ratings.csv MapPartitionsRDD[459] at textFile at <console>:40
ratings: org.apache.spark.rdd.RDD[org.apache.spark.mllib.recommendation.Rating] = MapPartitionsRDD[460] at map at <console>:42
rank: Int = 10
numIterations: Int = 10
model: org.apache.spark.mllib.recommendation.MatrixFactorizationModel = org.apache.spark.mllib.recommendation.MatrixFactorizationModel@1dd01d39
usersProducts: org.apache.spark.rdd.RDD[(Int, Int)] = MapPartitionsRDD[668] at map at <console>:44
predictions: org.apache.spark.rdd.RDD[((Int, Int), Double)] = MapPartitionsRDD[678] at map at <console>:53
ratesAndPreds: org.apache.spark.rdd.RDD[((Int, Int), (Double, Double))] = MapPartitionsRDD[682] at join at <console>:56
MSE: Double = 0.5161888311659686
Mean Squared Error = 0.5161888311659686
sameModel: org.apache.spark.mllib.recommendation.MatrixFactorizationModel = org.apache.spark.mllib.recommendation.MatrixFactorizationModel@3334459
Took 2 min 31 sec. Last updated by anonymous at December 29 2016, 5:13:24 PM. (outdated)

=========================================================================================

이후 실행을 통해 생성된 model 객체를 아래 URL에 있는 메소드를 이용하여 데이터를 후처리 할 수 있습니다.

=========================================================================================

http://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.mllib.recommendation.MatrixFactorizationModel

Value Members

  1. defpredict(usersProducts: JavaPairRDD[IntegerInteger])JavaRDD[Rating]

    Java-friendly version of MatrixFactorizationModel.predict.

  2. defpredict(usersProducts: RDD[(IntInt)])RDD[Rating]

    Predict the rating of many users for many products.

  3. defpredict(user: Intproduct: Int)Double

    Predict the rating of one user for one product.

  4. valproductFeaturesRDD[(IntArray[Double])]

    RDD of tuples where each tuple represents the productId and the features computed for this product.

  5. valrankInt

    Rank for the features in this model.

  6. defrecommendProducts(user: Intnum: Int)Array[Rating]

    Recommends products to a user.

  7. defrecommendProductsForUsers(num: Int)RDD[(IntArray[Rating])]

    Recommends top products for all users.

  8. defrecommendUsers(product: Intnum: Int)Array[Rating]

    Recommends users to a product.

  9. defrecommendUsersForProducts(num: Int)RDD[(IntArray[Rating])]

    Recommends top users for all products.

  10. defsave(sc: SparkContextpath: String)Unit

    Save this model to the given path.

  11. valuserFeaturesRDD[(IntArray[Double])]

    RDD of tuples where each tuple represents the userId and the features computed for this user.

=========================================================================================







드디어, 실제로 추천된 내용을 찾아보는 순서입니다.

=========================================================================================

model.recommendUsers(1,2)   ==> 이 명령어를 실행해서 아래의 결과를 얻음. 유서 ID 1번에게 2개의 최적 상품을 추천한다면 내용은....

res9: Array[org.apache.spark.mllib.recommendation.Rating] = Array(Rating(26896,1,8.876352553234511), Rating(102611,1,8.303550899210796))

==> 결론은 Array 뒤에있는 내용, 첫번째로 26896번 상품을 추천 점수는 8.876352553234511, 두번째 상품은 102611번으로 .....




​ 


너무 심플해서 놀랍습니다.

물론 상세한 내용으로 들어가자면 모르는 부분이 많지만 말그대로 빅데이터를 쉽게 분석할 수 있다는 생각이 들었습니다.



반응형

+ Recent posts