Kwon's 데이터분석기
Python .txt 파일 다루기 - RadishSurvey.txt 데이터 다루기 본문
이번에는 DSAC 자격증 취득을 위한 공부를 하던 중 텍스트로만 이루어진 .txt 파일인 RadishSurvey.txt를 가지고 텍스트 데이터를 다루는 것을 할 것이다.
먼저 필요한 모듈과 텍스트 파일을 열고 내용을 확인을 해주도록 한다.
import pandas as pd
import numpy as np
# with open으로 .txt 파일을 radish라는 이름으로 들고와준다.
with open('./data/radishsurvey.txt') as radish:
for line in radish:
print(line, end = '')

텍스트 파일 내용으로는 사람이름과 무 이름으로 이루어진 "사람이름 - 무 이름" 형태로 이루어져 있다는 것을 알 수 있다.
이러한 데이터를 조금 더 쉽게 파악해보도록 이름과 무로 분리해서 이름과 투표한 무를 나눠본다.
# 무 선호도 설문조사 텍스트 파일 열기
with open('./data/radishsurvey.txt') as radish:
# 분리기준을 - 로 설정해서 투표자 이름과 투표한 무 이름 구분
for line in radish:
line = line.strip()
devide = line.split(' - ')
# 투표자 이름을 name에 저장
name = devide[0]
# 투표한 무 이름을 radishvote에 저장
radishvote = devide[1]
print(f"Name of person: {name}")
print(f"Name of Radish: {radishvote}")
print('-'*10)

위의 표시형식보다 조금 더 직관적으로 값이 출력되도록 하였다.
이렇게 무를 투표를 하였는데 과연 설문조사를 한 사람은 어느 무를 선호를 하는지에 대해서 알아보고 싶어진다. 이를 알아보기 위해 각 투표된 무 별로 어느 무가 가장 많이 투표가 되었는지 확인을 해본다.
# countdown 이라는 딕셔너리 생성
countdown = {}
with open('./data/radishsurvey.txt') as radish:
for line in radish:
line = line.strip()
# vote_name 과 vote_radish를 - 기준으로 분리한 값을 넣어준다.
vote_name, vote_radish = line.split(' - ')
# 분리해서 얻은 vote_radish가 countdown이라는 딕셔너리 안에 존재한다면?
if vote_radish in countdown:
# countdown 딕셔너리 안에 vote_radish에 1을 더해라
countdown[vote_radish] += 1
# 그것이 아니라면 countdown 딕셔너리 내부 vote_radish에 1을 넣어라
else:
countdown[vote_radish] = 1
print(countdown)

위 코드를 보면 - 기준으로 값을 분리해서 vote_name과 vote_radish로 투표자 이름과 투표한 무 이름을 뽑아내었고, 그 중 투표한 무 이름을 if문을 사용해 투표한 무 이름이 중복되는 기준으로 숫자 1을 더해 무에 대한 투표 수를 얻을 수 있다.
하지만 결과 창을 보면 맨 앞글자가 대문자가 아니어서 별개로 표시되는 무도 존재하고, 투표자 이름과 무 이름 사이에 띄어쓰기가 두개가 되어 있어 같은 문자라고 인식을 하지 못해 별개로 나온 무도 존재한다.
예를들면 April Cross라는 무는 67투표가 되어있는데 아래를 확인해보면 april cross와 April cross라는 대소문자만 다른 값에도 개별적으로 투표가 5개가 되어있기 때문에 이에 대해서 처리를 수행해야한다.
countdown = {}
with open('./data/radishsurvey.txt') as radish:
for line in radish:
# 문자열에서 양 끝의 공백을 제거하고, 그 후에 첫 글자를 대문자로 만든 결과를 반환
line = line.strip().capitalize()
# - 를 기준으로 값을 분리해 vote_name과 vote_radish에 값을 넣어줌
vote_name, vote_radish = line.split(' - ')
# 중간에 띄어쓰기 두번이 되어있었던 문제가 있어서 replace함수를 통해 띄어쓰기 두번된 것 한번으로 변환
vote_radish = vote_radish.replace(' ', ' ')
# vote_radish 양쪽 끝 공백 제거
vote_radish = vote_radish.strip()
if vote_radish in countdown:
countdown[vote_radish] += 1
else:
countdown[vote_radish] = 1
print(countdown)

위 코드를 통해 같은 무 이름이지만 대소문자의 차이를 통해서 값이 따로 출력되는 것을 없애주었다.
이제 투표자에 대해서 확인해봐야할 것이 존재한다. 먼저 투표자가 두번 투표한 경우가 존재할 수도 있을 것이다. 이러한 투표자를 찾아보도록 한다.
# countdown 딕셔너리 생성
countdown = {}
# 집합 생성
name_of_vote = set()
with open('./data/radishsurvey.txt') as radish:
for line in radish:
line = line.strip().capitalize()
vote_name, vote_radish = line.split(' - ')
vote_radish = vote_radish.replace(' ', ' ')
vote_radish = vote_radish.strip()
vote_name = vote_name.strip().capitalize()
vote_name = vote_name.replace(' ', ' ')
if vote_radish in countdown:
countdown[vote_radish] += 1
else:
countdown[vote_radish] = 1
if vote_name in name_of_vote:
print(vote_name, 'is already voted!')
else:
name_of_vote.add(vote_name)

위 방식을 통해 중복 투표자를 확인을 해 본 결과 Phoebe barwell과 Procopio zito 라는 사람이 중복으로 투표를 한 것을 확인할 수 있었다. 이러한 중복 투표자가 존재한 것을 확인하였으니 투표에서 중복 투표자의 표를 제외하여 투표된 무의 횟수를 다시 확인을 해본다.
countdown = {}
name_of_vote = set()
with open('./data/radishsurvey.txt') as radish:
for line in radish:
line = line.strip().capitalize()
vote_name, vote_radish = line.split(' - ')
vote_radish = vote_radish.replace(' ', ' ')
vote_radish = vote_radish.strip()
vote_name = vote_name.strip().capitalize()
vote_name = vote_name.replace(' ', ' ')
# 중복 투표자는 표를 무시하고 다음 루프로 이동
if vote_name in name_of_vote:
print(vote_name, 'is already voted!')
continue
if vote_radish in countdown:
countdown[vote_radish] += 1
else:
countdown[vote_radish] = 1
name_of_vote.add(vote_name)
print('\nCount of Radish', end = '\n')
for vote_radish in sorted(countdown):
print(vote_radish, ': ', str(countdown[vote_radish]))

중복 투표자의 표를 제거를 해보니 white icicle과 plum purple이 중복으로 투표되었단 것을 알 수 있다. 이제 사람들이 투표한 무에 대한 횟수는 완료되었다. 이제 설문에서 각 무에 대한 비율을 파이차트를 통해서 확인해본다.
import pandas as pd
import matplotlib.pyplot as plt
# countdown 딕셔너리를 데이터프레임 형태로 변환하여 countdown_df에 저장
countdown_df = pd.DataFrame(list(countdown.items()), columns=['Radish', 'Count'])
# 잘 적용되었는지 확인
countdown_df

무사히 countdown 딕셔너리의 값을 countdown_df라는 데이터 프레임 형태로 변환을 시켜 주었다. 이제 데이터 프레임을 가지고 파이차트를 그려 선호하는 무의 비율을 확인해볼 것이다.
# 파이차트
plt.figure(figsize=(8, 8))
plt.pie(countdown_df['Count'], labels=countdown_df['Radish'], autopct='%1.1f%%', startangle=90, colors=plt.cm.Paired.colors)
plt.title('Radish Voting Distribution')
plt.show()

위의 파이차트를 통해 확인해본 결과 champion이 가장 선호하는 무이며 그 다음으로 april cross, bunny tail, french breakfast 라는 무가 선호되는 것을 확인할 수 있다.
마지막으로는 각각의 무를 투표한 사람의 이름이 무엇인지 구분해서 모두 출력하도록 한다.
countdown = {}
name_of_vote = set()
with open('./data/radishsurvey.txt') as radish:
for line in radish:
line = line.strip().capitalize()
vote_name, vote_radish = line.split(' - ')
vote_radish = vote_radish.replace(' ', ' ')
vote_radish = vote_radish.strip()
vote_name = vote_name.strip().capitalize()
vote_name = vote_name.replace(' ', ' ')
if vote_radish in countdown:
countdown[vote_radish].append(vote_name)
else:
countdown[vote_radish] = [vote_name]
for radishname, votersname in countdown.items():
name_of_vote = set()
# 투표자 이름을 name_of_vote의 집합에 넣어주면서, 중복 투표한 사람이면 제거해준다.
for voter in votersname:
if voter in name_of_vote:
votersname.remove(voter)
else:
name_of_vote.add(voter)
# countdown딕셔너리에 저장된 투표 결과를 정렬하여 출력
for radishname, votersname in sorted(countdown.items()):
print("###{} : {}".format(radishname, ', '.join(votersname)), end='.\n\n')
# 출력된 결과 txt파일로 저장
with open('sorting_radishsurvey.txt', 'w') as output_file:
for radish, votersname in sorted(countdown.items()):
output_file.write(f"###{radish.capitalize()} : {', '.join(votersname)}.\n")

각각의 무 별로 투표한 사람의 이름이 출력되도록 만들었으며, 이렇게 출력한 값을 sorting_radishsurvey.txt파일로 만들어 저장을 수행을 했다.
이렇게 텍스트 파일에 있는 텍스트 데이터를 다루는 방법을 수행을 했으며, 텍스트 데이터도 중요한 데이터의 종류이기 때문에 다루는 방법에 익숙해지면 좋을 것이다.
'Python 공부 - 잡다한 것들' 카테고리의 다른 글
| Python시각화 패키지 - Seaborn (0) | 2024.01.10 |
|---|