0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

フェミニストの道具と線形代数学

Last updated at Posted at 2025-05-07

フェミニストの道具
・ベクトル空間と線形空間
・固有値問題
・スペクトル分解
・特異値分解
・LU分解とQR分解
・ 次元削減と PCA(主成分分析)
・K-means, 階層クラスタリング
・ NMF(非負値行列分解)
・ランク・評価 PageRank

feminist_linear_algebra_tools.py
# 概要: 社会学・フェミニズム分析に役立つ線形代数・行列分解・次元削減・クラスタリング・評価モデルの統合ツール

import numpy as np
import pandas as pd
from numpy.linalg import eig, svd, qr
from scipy.linalg import lu
from sklearn.decomposition import PCA, NMF
from sklearn.cluster import KMeans, AgglomerativeClustering
from sklearn.preprocessing import normalize
import networkx as nx

# --- 疑似データ生成(5質問×5回答者) ---
np.random.seed(42)
data = np.random.randint(1, 6, size=(5, 5))
df = pd.DataFrame(data, columns=[f"Person_{i+1}" for i in range(5)],
                  index=["GenderEquality", "DomesticWork", "Leadership", "FemaleAdvancement", "PayEquality"])
print("--- 入力データ(質問 × 回答者) ---")
print(df)

# --- ベクトル空間:列ベクトル ---
print("\n--- 列ベクトル(各人の価値観) ---")
print(df.values.T)

# --- 固有値問題(共分散) ---
cov = np.cov(df.values)
eigenvals, eigenvecs = eig(cov)
print("\n--- 固有値と固有ベクトル(質問間の共分散) ---")
print("固有値:", eigenvals)
print("固有ベクトル:")
print(eigenvecs)

# --- スペクトル分解 ---
D = np.diag(eigenvals)
P = eigenvecs
reconstructed = P @ D @ np.linalg.inv(P)
print("\n--- スペクトル分解による再構成 ---")
print(reconstructed.round(2))

# --- 特異値分解(SVD) ---
U, S, VT = svd(df.values)
print("\n--- 特異値分解(SVD) ---")
print("特異値:", S)
print("左特異行列U:")
print(U)
print("右特異行列V^T:")
print(VT)

# --- QR分解 ---
Q, R = qr(df.values)
print("\n--- QR分解 ---")
print("Q行列:")
print(Q)
print("R行列:")
print(R)

# --- LU分解 ---
P_lu, L, U_mat = lu(df.values)
print("\n--- LU分解 ---")
print("L行列:")
print(L)
print("U行列:")
print(U_mat)

# --- PCA(主成分分析) ---
pca = PCA(n_components=2)
pca_result = pca.fit_transform(df.values.T)
print("\n--- PCA(次元削減) ---")
print("主成分スコア:")
print(pca_result)

# --- K-meansクラスタリング ---
kmeans = KMeans(n_clusters=2, random_state=0)
labels_km = kmeans.fit_predict(df.values.T)
print("\n--- K-means クラスタリング ---")
print("クラスタラベル:", labels_km)

# --- 階層クラスタリング ---
hc = AgglomerativeClustering(n_clusters=2)
labels_hc = hc.fit_predict(df.values.T)
print("\n--- 階層クラスタリング ---")
print("クラスタラベル:", labels_hc)

# --- 非負値行列分解(NMF) ---
nmf_model = NMF(n_components=2, init='random', random_state=0)
W = nmf_model.fit_transform(np.abs(df.values))  # NMFは非負値限定
H = nmf_model.components_
print("\n--- 非負値行列分解(NMF) ---")
print("基底行列W:")
print(W)
print("係数行列H:")
print(H)

# --- PageRank:社会構造の評価 ---
# 疑似的に人物間の関係ネットワークを生成してPageRankを算出
g = nx.DiGraph()
g.add_edges_from([("Person_1", "Person_2"), ("Person_2", "Person_3"),
                  ("Person_3", "Person_1"), ("Person_4", "Person_2"),
                  ("Person_5", "Person_3"), ("Person_1", "Person_5")])
pageranks = nx.pagerank(g)
print("\n--- PageRank(人物影響評価) ---")
for k, v in pageranks.items():
    print(f"{k}: {v:.3f}")


0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?