データ分析第 5 章放課後トレーニング - Matplotlib、seaborn、pyecharts ライブラリのアプリケーションの視覚的分析 (タスク 3 への回答)

実験名アプリケーション Matplotlib、seaborn、pyecharts ライブラリの視覚的分析

実験時期 2023.5.10

1. 実験の目的

1. pyplot の基本構文をマスターします。
2.円グラフの描き方をマスターする。
3. 箱ひげ図の描画方法をマスターします。
4. 部分グラフの描画方法をマスターします。
5. 縦棒グラフの描き方をマスターする。
6. NumPy ライブラリの関連関数の使い方をマスターします。
7. 分類散布図の描き方をマスターする。
8. 線形回帰フィッティンググラフの描き方をマスターする。
9. ヒートマップの描画方法をマスターする。
10.ファネルダイアグラムの描き方をマスターする。
11.ワードクラウドマップの描画方法をマスターします。

2. 実験装置または材料

ラップトップ、Anaconda ソフトウェア

3. 実験原理

1. 要件の説明
学校は、期末試験終了後、学生の期末試験の結果やその他の特性情報を統計収集し、学生の成績特性関連テーブル (学生の成績.xlsx) として保存します。生徒の成績特性関係表には、性別、昼食、試験対策、数学の成績、読解の成績、筆記の成績、総合成績の 7 つの特性があり、その一部を表 5-40 に示す。試験における生徒の合計点の分布を把握するため、合計点を0150、150200、200の範囲に応じて「不合格」「合格」「良好」「優秀」の4段階に分けています。 ~250、および 250~300 .
ここに画像の説明を挿入

2. 要件の説明
生徒の両親の教育レベル、昼食、試験の準備という 2 つの特性と全体的なパフォーマンスの間に何らかの関係があるかどうかを理解するために、トレーニング 1 のデータに基づいて、対応する値を示します。生徒の合計成績の平均を計算し、折れ線グラフを描いて親の教育レベルと合計成績の関係を確認し、柱状グラフを描いて昼食と受験勉強の関係を確認し、3つの特徴が異なります。合計成績を計算し、結果を分析します。
学生番号、名前、クラス情報。
3. 需要の説明
大気質指数 (大気質指数、AOI) は、大気質を定量的に説明できるデータです。大気質は大気汚染の程度を反映しており、大気中の汚染物質の濃度に基づいて判断されます。大気汚染は複雑な現象であり、大気汚染物質の濃度は多くの要因の影響を受けます。
ある都市の 2020 年 1 月から 9 月までの AQI データの一部を表 5-41 に示します。
ここに画像の説明を挿入

本研修では、表 5-41 に示すデータに基づいて分類散布図および回帰フィッティング図を作成し、PM2.5 濃度と AQI の関係および AQI の分類を分析します。同時に、ヒート マップを描画して、大気質指標と AQI の相関関係を分析します。
4. 要件の説明
ショッピング モールでは、A、B、C、D、E の番号を付けた 5 台の自動販売機が異なる場所に設置され、2017 年 6 月に各自動販売機の売上データが記録されました。各商品の販売状況を把握するため、2段階のカテゴリーに分類し、上位5商品カテゴリーの売上を集計しファネルダイアグラムを描画すると同時にワードクラウド図を描画します。販売数量や商品名により異なります。

4. 実験内容と手順

タスク 1: 学生のテスト得点の特徴の分布と分散を分析します。

1. 実装の考え方と手順
(1) pandas ライブラリを使用して生徒のテストスコアデータを読み込みます。
(2) 生徒のテストの合計点を 4 つの区間に分割し、各区間の生徒数を計算し、生徒のテストの合計点の分布を円グラフで描きます。
(3) 生徒の 3 つの単一科目の得点データを抽出し、生徒のテスト得点の分散の箱線図を描きます。
(4) 生徒のテストの合計得点の分布と 3 つの単一科目の得点の分散を分析します。

タスク 2: 生徒のテストのスコアとさまざまな特性の関係を分析します。

2. 実装の考え方と手順
(1) キャンバスを作成し、サブグラフを追加します。
(2) NumPy ライブラリの means 関数を使用して、生徒の親の教育レベル、昼食、および試験コース情報の 3 つの特徴に基づく生徒の合計成績の平均を求めます。
(3) サブチャート上に対応する折れ線グラフまたは縦棒グラフを描画します。
(4) 3 つの特徴とテストの合計点の関係を分析します。

タスク 3: さまざまな大気質指標間の相関関係を分析します。

3. 実装アイデアと手順
(1) pandas Nanfa Zhongzhanggu 2020 営業日 - 9 月の AOI 統計を使用します。
(2)中国語表示の問題を解決し、フォントを太字に設定し、画像保存時にマイナス記号「-」が四角で表示される問題を解決しました。
(3) 品質等級分類の散布図を描きます。
(4) PM2.5濃度とAOIの直線回帰フィッティンググラフを描く。
(5) 相関係数を計算します。
(6) 空気質特性の相関関係のヒート マップを描画します。

タスク 4: インタラクティブな基本グラフィックスの描画

4. 実装の考え方と手順
(1) 商品販売データを取得します。
(2) 第二カテゴリー別の商品カテゴリー売上高統計。
(3) 商品の販売数量を数えます。
(4) シリーズ構成項目とグローバル構成項目を設定し、売上上位5製品カテゴリーのファネルダイアグラムを描画します。
(5) シリーズ構成項目とグローバル構成項目を設定し、製品販売数量と製品名のワードクラウド図を描画します。

5. 実験結果と解析

タスク 1:

ここに画像の説明を挿入ここに画像の説明を挿入

ここに画像の説明を挿入

この円グラフは、学生のテストの合計スコアの分布を 4 つの区間に分けて示しています。円グラフからわかるように、150-200 部門の生徒数が 34.3% と最も多く、ほとんどの生徒のテストの合計点が優以上であり、総合的なスコアが優れていることがわかります。このクラスは良いです。
箱ひげ図は、一連のデータの分布を示すために使用できる統計グラフィックです。箱ひげ図には次のものが含まれます。

  1. 上端 (Max): 最大値、つまりデータ内の最大値。
  2. 下端 (Min): 最小値、つまりデータ内の最小値。
  3. 中央値: データの中央の値、データをサイズで並べ替えた後の中央の値。
  4. 上位四分位 (Q3): データを 4 つの等しい部分、つまり上位境界部分の最後のデータ ポイントに分割します。
  5. 下位四分位数 (Q1): データを 4 つの等しい部分 (下位境界部分の最初のデータ ポイント) に分割します。
  6. 内側の制限: 「ビン」と呼ばれる、上位四分位数と下位四分位数の間の距離。
  7. 外側の限界: 「ひげ」と呼ばれる上端と下端の間の距離。
    箱ひげ図の役割:
  8. データの極値、中央値、四分位などの統計情報を含むデータの分布を視覚的に表示できるため、データの状況をより直感的に理解できます。
  9. 外れ値はすぐに特定されて対処できるため、場合によってはデータ分析に劇的な影響を与える可能性があります。
  10. さまざまなデータ グループの分布を比較でき、データ分析と意思決定において重要な役割を果たします。

タスク 2:

ここに画像の説明を挿入
ここに画像の説明を挿入

折れ線グラフによると、親の教育レベルが異なると、生徒のテスト合計スコアの平均に差があることがわかります。修士号を取得した親の子供は全体のテストの平均点が 220.8 で最も高く、高校を卒業していない親の子供は全体のテストの平均点が 189.29 で最も低かった。このことは、親の教育レベルが子どもの学力に一定の影響を与えていることを示唆しています。
さらに、学士号や準学士号を取得した親の子供はテストの合計スコアの平均が比較的高いのに対し、大学を卒業していない親の子供はテストの合計スコアの平均が低いことがわかります。これは、学士号や準学士号を持つ親は子どもの教育に対してより高い期待とより良い教育リソースを持っているのに対し、大学の学位を持たない親は適切なサポートやリソースを提供できない可能性があるためと考えられます。
つまり、親の教育レベルは子どもの学力に一定の影響を与えますが、それだけが要因ではなく、個人の才能や学習態度なども学力に影響を及ぼします。

タスク 3:

ここに画像の説明を挿入

大気質指数 (AQI) の値が異なる時点で異なることがわかります。このうち、最高の AQI 値は 203 で深刻な汚染に属し、最低の AQI 値は 22 で良好です。同時に、AQI 値の分布は、ほとんどの値が低く、いくつかの値が高いという傾向を示していることがわかります。つまり、ほとんどの場合、大気の質は良好ですが、一時的に大気の質が悪化するケースもあります。
さらに、AQI 値と空気品質レベルの間には一定の相関関係があることがわかります。AQI 値が 0 ~ 50 の場合、空気品質レベルは良好です。51 ~ 100 の場合、空気品質レベルは良好です。101 ~ 150 の場合、空気品質レベルは軽度に汚染されています。空気の質が 201 ~ 300 の場合、空気の質レベルは中程度に汚染されており、201 ~ 300 の場合、空気の質レベルは重度に汚染されています。したがって、AQI値によってその時の空気の質のレベルを判断することができます。
つまり、大気質指数 (AQI) は大気質を測定する重要な指標であり、その値の変化は大気質の変化を反映しており、人々の健康と生活に重要な影響を与えます。

ここに画像の説明を挿入

AQI値とPM2.5含有量の間には一定の相関関係があることがわかります。PM2.5 とは、大気中の直径 2.5 ミクロン以下の粒子状物質を指し、大気汚染の主成分の 1 つです。データから、AQI 値と PM2.5 含有量の値はほとんどの場合、一貫した変化傾向を示していることがわかります。つまり、AQI 値と PM2.5 含有量の値は両方とも低いか高いです。 。これは、PM2.5 含有量が AQI 値に影響を与える重要な要素の 1 つであることを示しています。
さらに、AQI 値と PM2.5 含有量の両方に大きな変動があり、異なる時点で AQI 値と PM2.5 含有量の間に大きな差があることがわかります。これは、さまざまな大気汚染源、気象条件の変化、その他の要因が原因である可能性があります。
つまり、AQI 値と PM2.5 含有量は大気質を反映する 2 つの重要な指標であり、その変化は大気質の変化を反映しており、人々の健康と生活に重要な影響を与えます。
ここに画像の説明を挿入

大気質特性の相関分析により、さまざまな汚染指標間の関係が得られ、主な汚染源を特定し、特定の環境科学政策を策定するのに役立ちます。ピアソン相関係数を使用すると、-1 から +1 の範囲の変数間の線形関係を測定できます。0 は線形関係がないことを意味し、-1 は完全な負の相関を意味し、+1 は完全な正の相関を意味します。
上図からわかるように、
PM2.5 含有量と PM10 含有量のデータには相関関係があり、相関係数は 0.97 であり、両者には強い正の相関関係があります。
NO2 含有量と PM2.5 含有量、PM10 含有量: 相関係数はそれぞれ 0.79 および 0.78 であり、NO2 含有量は PM2.5 含有量および PM10 含有量と正の相関があります。
O3_8h 含有量と AQI: 相関係数は 0.6 で、AQI は O3_8h 含有量と正の相関があります。
相関係数は変数間の線形関係のみを反映し、非線形関係を表すことはできないため、実際のアプリケーションでは他の要素を総合的に考慮する必要があることに注意してください。

タスク 4:

ここに画像の説明を挿入

乳製品、飲料、ジャーキー、ビスケット、機能性飲料などの販売量が優れていることがわかります。これらの商品は日常生活の必需品であり、店舗はこれらの商品をより多く販売できます。

ここに画像の説明を挿入

上の写真から、セボン精製水が最も売れている商品で、次に豆乳、ホットドッグソーセージ、エビせんべいが続いていることがわかります。
ワードクラウドマップとは、テキストデータを視覚的に表示するグラフであり、テキストデータ内の単語を頻度順に表示し、フォントサイズや色の違いで重要度を区別しています。通常、ワード クラウド マップは大量のテキスト データを処理するために使用されます。これにより、テキスト内の重要な情報やテーマをすばやく理解し、ユーザーがテキスト内の重要なポイントを迅速に理解できるようになります。センチメント分析、世論分析、市場調査、ニュースレポートなどの分野で広く使用されています。

6. 結論と経験

視覚分析のための共通ライブラリとして、matplotlib、seaborn、pyecharts は強力で柔軟で使いやすいツールを提供し、さまざまな種類のグラフの生成をサポートし、データ分析の結果をより深く理解するのに役立ちます。
実際のアプリケーションでは、matplotlib は最も一般的に使用される描画ライブラリの 1 つであり、豊富なデータ視覚化関数が含まれており、複数の種類のグラフィックスとカスタム スタイルの描画をサポートしているため、ほとんどの描画ニーズを満たすことができます。より効率的なプロットと読みやすい視覚化が必要な場合は、seaborn が最初の選択肢です。これは matplotlib の拡張ライブラリであり、多くの高度な機能とプロット ツールを提供し、データ分析と視覚化をより簡単かつエレガントにします。より複雑なデータ視覚化シナリオの場合は、ECharts に基づく Python 視覚化ライブラリである pyecharts の使用を検討できます。これは、動的な対話型グラフの生成をサポートし、データ表示をより鮮明かつ直感的に行うことができます。
一般に、視覚分析ライブラリの選択は、データの種類と視覚化の要件に依存する必要があります。データ分析には、棒グラフ、折れ線グラフ、円グラフ、散布図、ヒート マップなど、さまざまな種類のグラフィックスが使用されます。データを正確に特徴付けて、意味のある結論と推論を引き出すには、正しい視覚化ツールとグラフィックスの種類を選択する必要があります。さらに、美しいビジュアライゼーション効果により、データ分析の結果をより魅力的で説得力のあるものに伝え、共有することができます。したがって、ビジュアル分析ライブラリの使用に習熟することは、アナリストの作業効率とデータ分析の品質を向上させるために不可欠なスキルです。

任务1代码:
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei'  # 设置中文显示
plt.rcParams['axes.unicode_minus'] = False
data = np.load(r'./data/student_grade.npz', encoding='ASCII', 
               allow_pickle=True)  
columns = data['arr_0']
values = data['arr_1']


# 定义成绩变量
sum_score = values[:, -1]
math_grade = values[:, -4]
reading_grade = values[:, -3]
writing_grade = values[:, -2]
all_grade = values[:, -1]
student_id = np.arange(len(values))
p = plt.figure(figsize=(15, 15))  # 设置画布

# 提取学生考试总成绩区间人数
grade_0_150 = 0
grade_150_200 = 0
grade_200_250 = 0
grade_250_300 = 0

for i in range(len(values)):
    if 0 < values[i, -1] <= 150:
        grade_0_150 += 1
    elif 150 < values[i, -1] <= 200:
        grade_150_200 += 1
    elif 200 < values[i, -1] <= 250:
        grade_200_250 += 1
    elif 250 < values[i, -1] <= 300:
        grade_250_300 += 1

all_stu_grade = [grade_0_150, grade_150_200, grade_200_250, grade_250_300] 

饼图:
# 绘制学生考试总成绩的总体分布情况饼图
p = plt.figure(figsize=(9, 9))  # 设置画布
label= ['不及格', '及格', '良好', '优秀']
explode = [0.01,0.01,0.01,0.01]  # 设定各项离心n个半径
plt.pie(all_stu_grade, explode=explode, labels=label, 
        autopct='%1.1f%%', textprops={'fontsize': 15})  # 绘制饼图
plt.title('学生考试总成绩的总体分布情况饼图', fontsize=20)
plt.savefig('./tmp/学生考试总成绩的总体分布情况饼图.png')
plt.show()

#箱线图
# 绘制学生考试总成绩的总体分散情况箱线图
p = plt.figure(figsize=(12, 8))
label= ['总成绩']
gdp = (list(sum_score))
plt.boxplot(gdp,notch=True,labels=label, meanline=True)  # 绘制箱线图
plt.xlabel('学生考试科目')
plt.ylabel('学生考试总分数')
plt.title('学生考试总成绩的总体分散情况箱线图', fontsize=20)
plt.savefig('./tmp/学生考试总成绩的总体分散情况箱线图.png')
plt.show()



# 绘制学生考试总成绩的总体分散情况箱线图
p = plt.figure(figsize=(12, 8))
label= ['数学成绩','阅读成绩','写作成绩']
gdp = (list(math_grade), list(reading_grade), list(writing_grade))
plt.boxplot(gdp,notch=True,labels=label, meanline=True)  # 绘制箱线图
plt.xlabel('学生考试科目')
plt.ylabel('学生考试分数')
plt.title('学生各项考试成绩的总体分散情况箱线图', fontsize=20)
plt.savefig('./tmp/学生各项考试成绩的总体分散情况箱线图.png')
plt.show()

#任务二
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei'  # 设置中文显示
plt.rcParams['axes.unicode_minus'] = False
data = np.load(r'./data/student_grade.npz', encoding='ASCII', allow_pickle=True)  
columns = data['arr_0']
values = data['arr_1']

# 分别提取学生父母教育水平对应的总成绩
master = []
bachelor = []
undergraduate_college = []
associate = []
highschool = []
undergraduate_highschool = []
all_grade = values[:, -1] 
for i in range(len(values)):
    if values[i, 2] == '硕士学位':
        master.append(values[i, -1])
    elif values[i, 2] == '学士学位':
         bachelor.append(values[i, -1])
    elif values[i, 2] == '大学未毕业':
         undergraduate_college.append(values[i, -1])
    elif values[i, 2] == '副学士学位':
         associate.append(values[i, -1])
    elif values[i, 2] == '高中毕业':
         highschool.append(values[i, -1])
    elif values[i, 2] == '高中未毕业':
         undergraduate_highschool.append(values[i, -1])
# 分别计算学生父母教育水平对应的总成绩均值
mean_master = round(np.mean(master), 2)   #round保留两位小数
mean_bachelor = round(np.mean(bachelor), 2)
mean_undergraduate_college = round(np.mean(undergraduate_college), 2)
mean_associate = round(np.mean(associate), 2)
mean_highschool = round(np.mean(highschool), 2)
mean_undergraduate_highschool = round(np.mean(undergraduate_highschool), 2)

#把平均值加到列表里
mean_education_grade = [mean_master, mean_bachelor,
                        mean_undergraduate_college, mean_associate, 
                        mean_highschool, mean_undergraduate_highschool] 



# 分别提取学生午餐情况对应的总成绩
standard = []
reduced = []
all_grade = values[:, -1] 
for i in range(len(values)):
    if values[i,3] == '标准':
        standard.append(values[i, -1])
    else:
        reduced.append(values[i, -1])
# 分别计算学生午餐情况对应的总成绩均值
mean_standard = round(np.mean(standard), 2)
mean_reduced = round(np.mean(reduced), 2)  
mean_lunch_grade = [mean_standard, mean_reduced]
# 分别提取学生考试准备情况对应的总成绩
completed = []
uncompleted = []
all_grade = values[:, -1] 
for i in range(len(values)):
    if values[i, 4] == '完成':
        completed.append(values[i, -1])
    else:
        uncompleted.append(values[i, -1])
# 分别计算学生完成考试准备和未完成考试准备对应的总成绩均值
mean_completed = round(np.mean(completed), 2)
mean_uncompleted = round(np.mean(uncompleted), 2)
mean_prepartion_grade = [mean_completed, mean_uncompleted]
# print(mean_prepartion_grade)


p = plt.figure(figsize=(13, 13)) #设置画布
# 子图1
ax1 = p.add_subplot(2, 1, 1) 
label = ['硕士学位', '学士学位', '大学未毕业', '副学士学位', '高中毕业', '高中未毕业']
plt.plot(range(6), mean_education_grade)  # 绘制折线图
plt.xlabel('父母教育水平')
plt.ylabel('学生平均考试总成绩')
plt.xticks(range(6), label)
plt.title('学生平均考试总成绩与父母教育水平关系直方图')

# 子图2
ax2 = p.add_subplot(2, 2, 3) 
label = ['标准', '免费/简单']
plt.bar(range(2), mean_lunch_grade, width=0.4)  # 绘制直方图
plt.xlabel('午餐情况')
plt.ylabel('学生平均考试总成绩')
plt.xticks(range(2), label)
plt.title('学生平均考试总成绩与午餐情况关系直方图')
# 子图3
ax2 = p.add_subplot(2, 2, 4) 
label = ['已完成', '未完成']
plt.bar(range(2), mean_prepartion_grade, width=0.4)  # 绘制直方图
plt.xlabel('考试课程准备情况')
plt.ylabel('学生平均考试总成绩')
plt.xticks(range(2), label)
plt.title('学生平均考试总成绩与考试课程准备情况关系直方图')

plt.savefig('./tmp/学生考试总成绩与各个特征关系图.png')
plt.show()
  

#任务三
import matplotlib.pyplot as plt
import pandas as pd

# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']  # 解决中文显示问题-设置字体为黑体
plt.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题
# 忽略警告
import warnings
warnings.filterwarnings('ignore')
import seaborn as sns
# 读取数据
data = pd.read_csv('./data/aqi.csv')


# --------------------绘制空气质量等级分类图--------------------
with sns.axes_style('whitegrid'):
    sns.stripplot(x=data['质量等级'])
ax = sns.stripplot(x='质量等级', y='AQI', data=data, jitter=True)
ax.set_title('2020年芜湖市空气质量等级分类图')
plt.show()


# --------------------绘制AQI与PM2.5线性回归拟合图--------------------
ax = sns.regplot(x='PM2.5含量(ppm)', y='AQI', data=data)
ax.set_title('2020年芜湖市空气质量指数PM2.5与AQI回归拟合图')
plt.show()


# 计算相关系数
corr_data = data.corr()
# --------------------绘制特征相关性热力图--------------------
ax = sns.heatmap(corr_data, annot=True)
ax.set_title('2020年芜湖市空气质量特征相关性热力图')
plt.show()


ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/weixin_48676558/article/details/130596890