<aside> 💡

파이썬을 통해 고객 데이터 전처리하기

마케터가 되면 다양한 채널을 통해 유입된 고객 데이터를 수집하고 분석하게 된다.

그런데 일부 고객 식별 정보(예 : 가입 코드, 고객 ID)가 한글 숫자와 아리비아 숫자가 혼합된 형식으로 입력되어 있다.

고객 세분화 및 분석 자동화 과정에 오류가 발생할 가능성이 있다.

따라서 고객 정보를 모두 아라비아 숫자로 변환하는 전처리 작업을 해야 하는 상황이다.

한글 숫자와 아라비아 숫자가 혼합된 고객 코드 문자열이 주어졌을 때,

모든 숫자를 아라비아 숫자로 변환하는 코드를 작성해보자.

(예시 : "삼5이사" → "3524")

</aside>

# 고객 코드 목록
customer_ids = [
    "삼5이사",
    "0오6칠",
    "48삼구",
    "이74팔",
    "9일이삼" ]
    
# 한글 숫자 : 아라비아 숫자 딕셔너리
 korean_to_num = {
    "공": "0", "일": "1", "이": "2", "삼": "3", "사": "4",
    "오": "5", "육": "6", "칠": "7", "팔": "8", "구": "9"}

<aside> 1️⃣

첫 번째 시도

for code in customer_ids:
  converted_code = ""
  for i in code:
    for korean, num in korean_to_num.items():
      if i in korean:       # 첫 번째 if에서 i값이 num으로 바뀌기 때문에 두 번째 if문이 무조건 실행된다. 
        i = num 
        converted_code += i 
      if i in num:
        converted_code += i
  print(f"[{code}]에 대한 고객 코드는 [{converted_code}]입니다.")

image.png

</aside>

<aside> 2️⃣

두 번째 시도

첫 번째 if 문이 실행되었다면 두 번째 if 문은 실행되지 않도록 조치가 필요했다.

그 방법으로 **break**를 걸어주는 것을 선택했다.

for code in customer_ids:
  converted_code = ""
  for i in code:
    for korean, num in korean_to_num.items():
      if i in korean:       
        i = num 
        converted_code += i 
        break               #첫 번째 if문 실행 후, 두 번째 if문이 실행되지 않도록 break를 걸어준다.
      if i in num:          #하지만, 전체적으로 더 간결하게 처리하는 것을 고려해보면 좋다. 
        converted_code += i
  print(f"[{code}]에 대한 고객 코드는 [{converted_code}]입니다.")

image.png

<aside> 3️⃣

세 번째 시도

더 간결하게 해결하는 방법은 딕셔너리에서 키값만을 이용하는 것이다.

어떤 값이 딕셔너리의 key에 있는지 확인하는 방법을 사용하면 된다.

[딕셔너리에서 KEY를 검색하는 코드]

my_dict = {"a": 1, "b": 2, "c": 3}

"a" in my_dict       # ✅ True
"z" in my_dict       # ❌ False

딕셔너리에 해당 key 값이 있는지 확인해보는 방법은 in 연산자를 활용하는 것이다.

in연산자는 딕셔너리의 key 에 대해서만 직접 작동한다.

그렇다면 value를 검색할 때는 어떻게 작성해야 할까?

[딕셔너리에서 value를 검색하는 코드]

1 in my_dict.values()      # ✅ True
5 in my_dict.values()      # ❌ False

in 연산자 앞에 찾으려는 value 를 입력하고, .values() 메서드를 사용해야 한다.


딕셔너리에서 key를 검색하는 코드로 작성한다면 코드를 더욱 간결하게 작성할 수 있을 것이다.

for code in customer_ids:
  converted_code = ""
  for i in code:
    if i in korean_to_num:
      converted_code += korean_to_num[i]
    else:
      converted_code += i 

  print(f"[{code}]에 대한 고객 코드는 [{converted_code}]입니다.")

➡️ 딕셔너리의 key 를 찾아 value 값을 사용하는 방법으로 코드를 더 간단히 작성할 수 있었다.

</aside>

<aside> 📘

내가 인지하지 못한 개념 정리 : 딕셔너리의 메서드

dict.items() 딕셔너리의 모든 (key,value) 쌍을 반환
dict.keys() 딕셔너리의 모든 key를 반환
dict.values() 딕셔너리의 모든 value를 반환
my_dict = {"a": 1, "b": 2, "c": 3}

print(my_dict.keys())     # dict_keys(['a', 'b', 'c'])
print(my_dict.values())   # dict_values([1, 2, 3])
print(my_dict.items())    # dict_items([('a', 1), ('b', 2), ('c', 3)])

여기에서 .values()로 나온 값은 단순 리스트는 아니고, dict_values 라는 뷰 객체를 반환하지만 리스트처럼 in, for, list() 등에 사용할 수 있다.

1 in my_dict.values()     # ✅ True
for v in my_dict.values():
    print(v)              # 1, 2, 3

</aside>