딕셔너리를 활용한 데이터 빈도수 측정

매일 공부(ML)·2022년 2월 19일
0

Intro

이제 딕셔너리를 어떻게 생성하고 접근하는지 알아보았으니 딕셔너리를 어떻게 사용하는지 알아보도록 하겠습니다.

혹시 히스토그램이 무엇인지 기억나시나요? 네, 히스토그램은 데이터의 빈도를 나타내는 그래프입니다.

이번 시간에는 다양한 이름 데이터에 대한 빈도수를 측정하는 방법에 대해 알아보겠습니다.


사람의 방식으로 이름 빈도수 세기

사람이 여러 개의 이름을 보고 그 빈도수를 세는 방식은 보통 다음과 같습니다.

1) 새로운 이름을 보면 목록에 추가한다.
2) 추가된 이름이 1번 나왔다는 표시를 한다.
3) 목록에 있는 이름이면 기존의 숫자에 1을 더해준다.
4) 모든 이름을 살펴본 후 표시의 갯수를 세어 가장 높은 것을 찾는다.

이 과정을 파이썬 코드로 다음과 같이 표현할 수 있습니다.

ccc = dict()
ccc['csev'] = 1
ccc['cwen'] = 1
print(ccc)
# {'csev': 1, 'cwen': 1}
ccc['cwen'] = ccc['cwen'] + 1
print(ccc)
# {'csev': 1, 'cwen': 2}


딕셔너리를 이용해 이름 빈도수 세기

그런데 만약 수백만 개의 이름이 있다면 이런 방식으로 세는 것이 매우 어려워집니다.

이때 딕셔너리를 사용하면 쉽게 해결할 수 있는데, 기본 아이디어는 다음과 같습니다.

1) 이미 저장되어 있는 이름인지 확인한다.
2-1) 만약 이미 저장되어 있는 이름일 경우 : 1을 더한다.
2-2) 만약 저장되지 않은 이름일 경우 : 이름을 저장하고 1을 배정한다.
3) 최종 결과 중 가장 빈도가 많은 이름을 찾는다.

여기서 가장 중요한 부분은 이미 저장되어 있는 이름인지 확인하는 부분입니다.

만약 다음과 같이 딕셔너리에 없는 키를 찾으려고하면 오류가 발생하게 됩니다.

ccc = dict()
print(ccc['csev'])

# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# KeyError: 'csev'

in 연산자

이런 문제를 for, list, 문자열에서 사용했던 in 연산자를 사용해 해결할 수 있습니다.

이와 같이 ccc라는 딕셔너리 안에 'csev'라는 값이 있는지 확인하기 위해 in 연산자를 사용하면 참(True) 또는 거짓(False)이라고 우리에게 알려줍니다.

'csev' in ccc
# False

먼저 빈 딕셔너리를 생성하고, names라는 리스트에 5명의 이름을 입력합니다.

그리고 이름을 하나씩 순회하며 위의 과정을 반복한 후 최종 결과를 확인하면 됩니다.


counts = dict()
names = ['csev', 'cwen', 'csev', 'zqian', 'cwen']
for name in names :
    if name in counts: 
        counts[name] = counts[name] + 1
    else :
        counts[name] = 1
print(counts)

# {'csev': 2, 'zqian': 1, 'cwen': 2}

그리고 이렇게 not 연산자를 사용해서 동일하게 해결할 수도 있습니다.

counts = dict()
names = ['csev', 'cwen', 'csev', 'zqian', 'cwen']
for name in names :
    if name not in counts: 
       counts[name] = 1
    else :
        counts[name] = counts[name] + 1
print(counts)

# {'csev': 2, 'zqian': 1, 'cwen': 2}

get 메소드

이와 같이 딕셔너리에 존재하는 키인지 아닌지 여부에 따라 처리하는 패턴은 get이라는 메소드를 사용해서 간결하게 해결할 수 있고

여기에서 counts.get(name, 0)의 의미는 counts 딕셔너리에 name이라는 키가 존재할 경우 name에 대한 값을 불러옵니다

그렇지 않을 경우에는 counts 딕셔너리에 name이라는 키에 0이라는 값을 갖는 데이터를 추가하라는 의미입니다.

counts = dict()
names = ['csev', 'cwen', 'csev', 'zqian', 'cwen']
for name in names :
    counts[name] = counts.get(name, 0) + 1
print(counts)

# {'csev': 2, 'zqian': 1, 'cwen': 2}
profile
성장을 도울 아카이빙 블로그

0개의 댓글