728x90
๋ฐ์ํ
ํ๋ก๊ทธ๋๋ฐ ์ธ๊ณ๋ฅผ ํ๊ตฌํฉ์๋ค.
1ํธ์ ์ด์ ๊ฒ์๊ธ ์ฐธ๊ณ ๋ฐ๋๋๋ค.
2023.12.08 - [IT/Python] - [Python] 1. Daum ๋ค์ ์ํ ์ฌ์ดํธ ๋ฐ์ดํฐ ์์ง ์นํฌ๋กค๋ง
< Daum ๋ค์ ์ํ ์ฌ์ดํธ ๋ฐ์ดํฐ ์์ง ์นํฌ๋กค๋ง (๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ ๋ฐ ์๊ฐํ) >
์์ง๋ฐ์ดํฐ
์ํ์ ๋ชฉ, ํ์ , ๋๊ธ
์์ฑํ ๋ฐ์ดํฐ
๊ธ์ /๋ถ์
URL
๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ์
### ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ์
# - ํ๋ ฌ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
import pandas as pd
< ์ธ๋ถ ํ์ผ ์ฝ์ด๋ค์ด๊ธฐ >
file_path = "./data/movie_reviews.txt"
df_org = pd.read_csv(file_path,
### ๊ตฌ๋ถ์ ์๋ ค์ฃผ๊ธฐ
delimiter="\t",
names=["title", "score", "comment", "label"])
df_org
### ์ ๋ชฉ : "title", ํ์ : "score", ๋ฆฌ๋ทฐ : "comment", ๊ธ์ /๋ถ์ ํํฉ : "label")
๋ฐ์ดํฐ ์ ๋ณด ํ์ธ : ๊ฒฐ์ธก์น ํ์ธ
### ๋ฐ์ดํฐ ์ ๋ณด ํ์ธ : ๊ฒฐ์ธก์น ํ์ธ
df_org.info()
๊ธฐ์ดํต๊ณ ํ์ธ : ๋ฐ์ดํฐ
### ๊ธฐ์ดํต๊ณ ํ์ธ : ๋ฐ์ดํฐ
df_org.describe()
ํ์ (score) ํํฉ ๋ฐ์ดํฐ ํ์ธ
### ํ์ (score) ํํฉ ๋ฐ์ดํฐ ํ์ธ
df_org["score"].value_counts()
๊ธ์ /๋ถ์ ํํฉ ๋ฐ์ดํฐ ํ์ธ
### ๊ธ์ /๋ถ์ ํํฉ ๋ฐ์ดํฐ ํ์ธ
df_org["label"].value_counts()
์ค๋ณต๋ฐ์ดํฐ ํ์ธํ๊ธฐ
### ์ค๋ณต๋ฐ์ดํฐ ํ์ธํ๊ธฐ
# - keep=False : ์ค๋ณต๋ ๋ชจ๋ ํ ์ฒดํฌ(์ค๋ณต์ด ์์ผ๋ฉด True, ์์ผ๋ฉด False)
df_org[df_org.duplicated(keep=False) == True]
์ค๋ณต ์ ๊ฑฐํ๊ธฐ
### ์ค๋ณต ๋ฐ์ดํฐ ์ถ์ถํ๊ธฐ
# - ์ค๋ณต ์ค์ ํ๋๋ ์ ์ธํ๊ณ ๋๋จธ์ง ์ค๋ณต๋ง ์ถ์ถ
df_del = df_org[df_org.duplicated() == True]
len(df_org[df_org.duplicated() == True])
### ์ค๋ณต์ ๊ฑฐํ๊ธฐ
df_new = df_org.drop_duplicates()
len(df_new)
df_new.info()
< ๋ฐ์ดํฐ ํ์ํ๊ธฐ >
์ํ ์ ๋ชฉ๋ง ์ถ์ถํ๊ธฐ
### ์ํ ์ ๋ชฉ๋ง ์ถ์ถํ๊ธฐ
df_new["title"].unique()
์ํ ์ ๋ชฉ๋ณ ๋ฆฌ๋ทฐ ๊ฐฏ์ ํํฉ ํ์ธํ๊ธฐ
### ์ํ ์ ๋ชฉ๋ณ ๋ฆฌ๋ทฐ ๊ฐฏ์ ํํฉ ํ์ธํ๊ธฐ
df_new["title"].value_counts()
๊ฐ ์ํ๋ณ ํ์ ๊ธฐ์ดํต๊ณ ํ์ธํ๊ธฐ
### ๊ฐ ์ํ๋ณ ํ์ ๊ธฐ์ดํต๊ณ ํ์ธํ๊ธฐ
# - ์ํ์ ๋ชฉ๋ณ ํ์ ์ ๋ํ ๊ทธ๋ฃน์ง๊ณํ๊ธฐ
movie_info = df_new.groupby("title")["score"].describe()
### ๊ธฐ์ดํต๊ณ ํ๋จ์ ๋ฐ์ดํฐ ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌํ๊ธฐ
movie_info = movie_info.sort_values(by=["count"], axis=0, ascending=False)
movie_info
< ๋ฐ์ดํฐ ์๊ฐํ >
๋ผ์ด๋ธ๋ฌ๋ฆฌ
### ์๊ฐํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
import matplotlib.pyplot as plt
### ํฐํธ ์ค์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
from matplotlib import font_manager, rc
ํฐํธ ์ค์
### ํ๊ธํฐํธ ์ค์
plt.rc("font", family="Malgun Gothic")
### ๋ง์ด๋์ค ๊ธฐํธ ์ค์
plt.rcParams["axes.unicode_minus"] = False
< ์ํ๋ณ ํ์ ํ๊ท ์๊ฐํ >
์ํ๋ณ ํ์ ํ๊ท ์ด ๊ฐ์ฅ ํฐ ์ํ๋ orange์์ผ๋ก,
๋๋จธ์ง๋ lightgrey ์์ผ๋ก ํํ
### ํ์ ํ๊ท ๊ณ์ฐ์ ์ํด ์ฌ์ฉ
import numpy as np
์ํ์ ๋ชฉ์ ๋ฆฌ์คํธ ํ์ ์ผ๋ก ๋ฐ์์ค๊ธฐ
### ์ํ์ ๋ชฉ์ ๋ฆฌ์คํธ ํ์
์ผ๋ก ๋ฐ์์ค๊ธฐ
"""
- array() : ๋ํ์ด(numpy)์์ ์ฌ์ฉํ๋ ๋ฐฐ์ด(ํ์ด์ฌ์ ๋ฆฌ์คํธ์ ๋์ผ)
: ๋จ, ํ๋์ ํ์
๋ง ์ ์ฅ ๊ฐ๋ฅํฉ๋๋ค.
์ด์ธ ์ฌ์ฉ๋ฒ์ ํ์ด์ฌ์ ๋ฆฌ์คํธ์ ๋์ผ
"""
# - unique() : numpy์ ๋ฐฐ์ด ํ์
์ผ๋ก ๋ฐํํจ
# - tolist() : ํ์ด์ฌ์ ๋ฆฌ์คํธ ํ์
์ผ๋ก ๋ณํํ๋ ํจ์
movie_title = df_new["title"].unique().tolist()
# movie_title
### ์ํ๋ณ ํ์ ํ๊ท ์ถ์ถํ๊ธฐ
# - ํ์ ํ๊ท ๊ฐ์ ์ ์ฅํ ๋์
๋๋ฆฌ ๋ณ์ ์ ์ธ
avg_score = {}
for m_title in movie_title:
### ํ์ ํ๊ท ๊ณ์ฐํ์ฌ ๋์
๋๋ฆฌ์ ๋ฃ๊ธฐ
avg = df_new[df_new["title"] == m_title]["score"].mean()
# print(f"ํ์ ํ๊ท : {avg}")
### ๋์
๋๋ฆฌ์ ๋ด๊ธฐ
# key๋ ์ ๋ชฉ, value๋ ํ์ ํ๊ท ๊ฐ
avg_score[m_title] = avg
print(f"๋์
๋๋ฆฌ ์ต์ข
๊ฐ : {avg_score}")
๋ง๋๊ทธ๋ํ ๊ทธ๋ฆฌ๊ธฐ
### ์ํ๋ณ ํ์ ํ๊ท ์๊ฐํ
# - ๊ทธ๋ํ ๋๋น์ ๋์ด ์ง์
plt.figure(figsize=(20, 20))
# - ๊ทธ๋ํ ์ ๋ชฉ
plt.title("์ํ๋ณ ํ์ ํ๊ท ๋ง๋๊ทธ๋ํ", fontsize=17, fontweight="bold")
### ๊ฐ ์ํ๋ณ ํ์ ํ๊ท ๋ง๋๊ทธ๋ํ ๊ทธ๋ฆฌ๊ธฐ
for k, v in avg_score.items():
### ์ปฌ๋ฌ๊ฐ ์ง์ ํ๊ธฐ
# - array_str() : ๋ฌธ์์ด๋ก ๋ณํํ๋ ํจ์
# - where() : ํ์ด์ฌ์์ if๋ฌธ๊ณผ ๋์ผํ ์กฐ๊ฑด๋ฌธ
# - where(์กฐ๊ฑด, ์ฐธ, ๊ฑฐ์ง) : ์กฐ๊ฑด์ด ์ฐธ์ด๋ฉด ์ฒซ๋ฒ์งธ ๊ฐ, ๊ฑฐ์ง์ด๋ฉด ๋๋ฒ์งธ ๊ฐ ์ฒ๋ฆฌ
color = np.array_str(np.where(v==max(avg_score.values()), "orange", "lightgrey"))
# print(color)
# ๋ง๋ ๊ทธ๋ํ ๊ทธ๋ฆฌ๊ธฐ
plt.bar(k, v, color=color)
### ๋ง๋ ๊ทธ๋ํ ์๋จ์ ํ์ ํ๊ท ํ
์คํธ ํ์ํ๊ธฐ
# - "%.2f"%v : ํ์ํ ๊ฐ (์์ซ์ 2์๋ฆฌ๊น์ง ํํ)
plt.text(k, v, "%.2f"%v, horizontalalignment="center",
verticalalignment="bottom")
### x์ถ๊ณผ y์ถ ์ ๋ชฉ ๋ฃ๊ธฐ
plt.xlabel("์ํ์ ๋ชฉ" , fontweight="bold")
plt.ylabel("ํ์ ํ๊ท " , fontweight="bold")
### x์ถ์ ๊ฐ ๊ฐ๋ ์กฐ์ ํ๊ธฐ
plt.xticks(rotation = 75)
### ๊ทธ๋ํ๋ฅผ ์ด๋ฏธ์ง๋ก ์ ์ฅ์ํค๊ธฐ
# - savefig() ํจ์๋ plt.show() ์ ์ ์ํ๋์ด์ผ ํฉ๋๋ค.
plt.savefig("./img/์ํ๋ณ ํ์ ํ๊ท ๋ง๋๊ทธ๋ํ.png")
plt.show()
์ (๋ถํฌ) ๊ทธ๋ํ ๊ทธ๋ฆฌ๊ธฐ
๊ฐ ์ํ๋ณ ํ์ ๋ถํฌ๋ ๊ทธ๋ฆฌ๊ธฐ
- ํ๋์ ํฐ ๊ทธ๋ํ ์์ 10๊ฐ์ ๊ทธ๋ํ๋ฅผ ๋ฃ์ด์ ํํ
--> ์ด๋ฅผ subplot์ด๋ผ๊ณ ์นญํฉ๋๋ค.
### ๊ฐ ์ํ๋ณ ํ์ ๋ถํฌ๋ ๊ทธ๋ฆฌ๊ธฐ
# - ํ๋์ ํฐ ๊ทธ๋ํ ์์ 10๊ฐ์ ๊ทธ๋ํ๋ฅผ ๋ฃ์ด์ ํํ
# --> ์ด๋ฅผ subplot์ด๋ผ๊ณ ์นญํฉ๋๋ค.
# - 5ํ 2์ด์ subplot ์์ฑํ์ฌ ๊ตฌํํ๊ธฐ
# - subplots(ํ๊ฐฏ์, ์ด๊ฐฏ์, ์ ์ฒด ๊ทธ๋ํ ํฌ๊ธฐ)
# - fig : ํฐ ๊ทธ๋ํ ์ ๋ณด
# - axs : 5ํ 2์ด์ ๋ด๋ถ ๊ทธ๋ํ ๊ณต๊ฐ ์ ๋ณด
fig, axs = plt.subplots(5, 2, figsize=(15, 25))
### ์ฌ๋ฌ๊ฐ์ ๊ทธ๋ํ๋ฅผ for๋ฌธ์ ์ด์ฉํด์ ํํํ๊ณ ์ ํ ๋ ์๋ ๋จผ์ ์ํ
# - flatten() : ํ ์ ๋ ฌํ๊ธฐ -> 5ํ 2์ด์ ํ์ ์ ๋ ฌํ๊ธฐ
axs = axs.flatten()
### ๊ฐ ๊ทธ๋ํ๋ฅผ ํ๋ ฌ ๊ณต๊ฐ์ subplot์ ๋ฃ๊ธฐ
for title, avg, ax in zip(avg_score.keys(), avg_score.values(), axs):
# print(f"{title} / {score} / {ax}")
### x์ถ์๋ ์ํ ๋ฆฌ๋ทฐ ๊ฐฏ์, y์ถ์๋ ํ์ ํ๊ท
### ๋ฆฌ๋ทฐ ๊ฐฏ์ ์ถ์ถํ๊ธฐ
num_reviews = len(df_new[df_new["title"] == title])
# - arange(num) : 0๋ถํฐ num๊น์ง์ ๊ฐ์ ์์ฐจ์ ์ผ๋ก ๋ง๋ค๊ธฐ
x = np.arange(num_reviews)
# print(f"x ------> {x}")
### y์ถ์๋ ํ์ ์ถ๊ฐ
y = df_new[df_new["title"] == title]["score"]
# print(f"y--------- {y}")
### ๊ฐ ๊ทธ๋ํ์ ์ ๋ชฉ ๋ฃ๊ธฐ
subtitle = f"{title} ({num_reviews}๋ช
)"
ax.set_title(subtitle, fontsize=15, fontweight="bold")
### ์ ๊ทธ๋ํ ๊ทธ๋ฆฌ๊ธฐ
# - "o" : ์ ์ผ๋ก ํํํ๋ ๋ง์ปค ๊ธฐํธ
ax.plot(x, y, "o")
### ๊ฐ ์ํ๋ณ ํ์ ํ๊ท ์ ๋นจ๊ฐ์ ์ ์ (line)์ผ๋ก ํ์ํ๊ธฐ
# - axhline() : ๊ฐ subplot ๊ณต๊ฐ์ ์ํ์ ๊ทธ๋ฆฌ๊ธฐ
ax.axhline(avg, color="red", linestyle="--")
plt.savefig("./img/๊ฐ ์ํ๋ณ ํ์ ๋ถํฌ๋.png")
plt.show()
728x90
๋ฐ์ํ